CCM
/MCP
SkillsMCPMarketplacesDigestToolsAdvertise

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by Category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP Servers by Category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by Category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control

Claude Code Marketplaces

Discover Claude Code plugins, extensions, and tools. Automatically updated directory of Anthropic Claude AI marketplaces with development tools, productivity plugins, and integrations.

Resources

  • Browse Skills
  • Browse MCP Servers
  • Browse Marketplaces
  • Plugins Reference

Community

  • About
  • Tools
  • Feedback
  • Privacy Policy
  • Advertise

Built for the Claude Code community with Claude Code by mertbuilds.com

Independent project, not affiliated with Anthropic

GoldenMatch

benseverndev-oss/goldenmatch
10342 toolsSTDIO, HTTPregistry active
Summary

This server wraps the GoldenMatch entity resolution toolkit, which finds duplicate records across messy datasets with a 97.2% F1 score out of the box. You get access to deduplication, clustering, and the broader Golden Suite pipeline (InferMap for schema alignment, GoldenCheck for profiling, GoldenFlow for standardization). The MCP layer exposes 36+ tools including auto_configure for adaptive tuning and controller_telemetry for inspecting clustering decisions. Useful when you need to clean customer lists, merge data sources, or resolve entities across organizations without writing custom fuzzy matching logic. The zero-config defaults work immediately, and a learning memory system stops asking for the same correction twice across runs.

Install to Claude Code

verified
claude mcp add --transport http goldenmatch https://goldenmatch-mcp-production.up.railway.app/mcp/

Run in your terminal. Add --scope user to make it available in every project.

Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.

CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Capacitor - Shared memory for your team’s coding agents.
Capacitor - Shared memory for your team’s coding agents.
Make coding agent sessions - Searchable, Shareable, Vendor-neutral & Scored.
Try For Free →
Give your AI the whole web as clean markdownGive your AI the whole web as clean markdown
Give your AI the whole web as clean markdown
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
inference shell
inference shell
create and run specialised agents in minutes
build now →
MCP-ready Email SendingMCP-ready Email Sending
MCP-ready Email Sending
Plug Mailtrap into your AI workflow and let it handle the email.
Connect Mailtrap MCP →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Capacitor - Shared memory for your team’s coding agents.
Capacitor - Shared memory for your team’s coding agents.
Make coding agent sessions - Searchable, Shareable, Vendor-neutral & Scored.
Try For Free →
Give your AI the whole web as clean markdownGive your AI the whole web as clean markdown
Give your AI the whole web as clean markdown
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
inference shell
inference shell
create and run specialised agents in minutes
build now →
MCP-ready Email SendingMCP-ready Email Sending
MCP-ready Email Sending
Plug Mailtrap into your AI workflow and let it handle the email.
Connect Mailtrap MCP →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →

Tools

Verified live against the running server on Jun 10, 2026.

verified live42 tools
analyze_dataProfile data, detect domain, recommend ER strategy1 params

Profile data, detect domain, recommend ER strategy

Parameters* required
file_path*string
auto_configureRun AutoConfigController on a CSV; return the committed GoldenMatchConfig (incl. negative_evidence / Path Y when chosen) plus telemetry — stop_reason, health, decision trace, indicator column priors. Programmatic equivalent of `goldenmatch autoconfig`.2 params

Run AutoConfigController on a CSV; return the committed GoldenMatchConfig (incl. negative_evidence / Path Y when chosen) plus telemetry — stop_reason, health, decision trace, indicator column priors. Programmatic equivalent of `goldenmatch autoconfig`.

Parameters* required
file_path*string
constraintsobject
controller_telemetryReturn the AutoConfigController telemetry from the most recent `auto_configure` or `agent_deduplicate` call in this MCP session. Same JSON shape as the web /api/v1/controller/telemetry endpoint.

Return the AutoConfigController telemetry from the most recent `auto_configure` or `agent_deduplicate` call in this MCP session. Same JSON shape as the web /api/v1/controller/telemetry endpoint.

No parameters — call it with no arguments.

agent_deduplicateRun full ER pipeline with confidence gating and reasoning2 params

Run full ER pipeline with confidence gating and reasoning

Parameters* required
configobject
file_path*string
agent_match_sourcesMatch two files with intelligent strategy selection3 params

Match two files with intelligent strategy selection

Parameters* required
configobject
file_a*string
file_b*string
agent_explain_pairNatural language explanation for a record pair4 params

Natural language explanation for a record pair

Parameters* required
exactarray
fuzzyobject
record_a*object
record_b*object
agent_explain_clusterExplain why records are in the same cluster1 params

Explain why records are in the same cluster

Parameters* required
cluster_id*integer
agent_review_queueGet borderline pairs awaiting approval1 params

Get borderline pairs awaiting approval

Parameters* required
job_name*string
agent_approve_rejectApprove or reject a review queue pair6 params

Approve or reject a review queue pair

Parameters* required
id_a*integer
id_b*integer
reasonstring
decision*string
job_name*string
decided_by*string
agent_compare_strategiesCompare ER strategies on your data2 params

Compare ER strategies on your data

Parameters* required
file_path*string
ground_truthstring
suggest_pprlCheck if data needs privacy-preserving matching1 params

Check if data needs privacy-preserving matching

Parameters* required
file_path*string
scan_qualityRun GoldenCheck data quality scan on a CSV file. Returns issues found (encoding errors, Unicode problems, format violations) without applying fixes. Requires goldencheck: pip install goldenmatch[quality]2 params

Run GoldenCheck data quality scan on a CSV file. Returns issues found (encoding errors, Unicode problems, format violations) without applying fixes. Requires goldencheck: pip install goldenmatch[quality]

Parameters* required
domainstring
Optional domain hint (healthcare, finance, ecommerce)
file_path*string
Path to the CSV file to scan
fix_qualityRun GoldenCheck scan and apply fixes to a CSV file. Returns the fixed data summary and a manifest of all fixes applied. Requires goldencheck: pip install goldenmatch[quality]4 params

Run GoldenCheck scan and apply fixes to a CSV file. Returns the fixed data summary and a manifest of all fixes applied. Requires goldencheck: pip install goldenmatch[quality]

Parameters* required
domainstring
Optional domain hint (healthcare, finance, ecommerce)
fix_modestring
Fix aggressiveness: safe (conservative) or moderate (balanced). Default: safeone of safe · moderatedefault: safe
file_path*string
Path to the CSV file to fix
output_pathstring
Optional path to save the fixed CSV. If omitted, returns summary only.
run_transformsRun GoldenFlow data transforms on a CSV file. Normalizes phone numbers (E.164), dates (ISO), categorical spelling, and Unicode issues. Returns a manifest of transforms applied. Requires goldenflow: pip install goldenmatch[transform]2 params

Run GoldenFlow data transforms on a CSV file. Normalizes phone numbers (E.164), dates (ISO), categorical spelling, and Unicode issues. Returns a manifest of transforms applied. Requires goldenflow: pip install goldenmatch[transform]

Parameters* required
file_path*string
Path to the CSV file to transform
output_pathstring
Optional path to save the transformed CSV. If omitted, returns summary only.
list_correctionsList stored Learning Memory corrections, optionally filtered by dataset. Returns id_a, id_b, decision, source, trust, reason, matchkey_name, dataset, original_score, created_at.2 params

List stored Learning Memory corrections, optionally filtered by dataset. Returns id_a, id_b, decision, source, trust, reason, matchkey_name, dataset, original_score, created_at.

Parameters* required
pathstring
SQLite memory DB path. Default: .goldenmatch/memory.db
datasetstring
Optional dataset filter (e.g. file path).
add_correctionAdd a pair correction to Learning Memory. Source is set to 'agent' with trust=0.5 (lower than human steward decisions which are 1.0). Pair (id_a, id_b) is canonicalized to (min, max) before storage.7 params

Add a pair correction to Learning Memory. Source is set to 'agent' with trust=0.5 (lower than human steward decisions which are 1.0). Pair (id_a, id_b) is canonicalized to (min, max) before storage.

Parameters* required
id_a*integer
id_b*integer
pathstring
SQLite memory DB path. Default: .goldenmatch/memory.db
reasonstring
dataset*string
Dataset identifier (e.g. file path). Required, non-empty.
decision*string
one of approve · reject
matchkey_namestring
learn_thresholdsForce a MemoryLearner pass over accumulated corrections. Returns the list of LearnedAdjustments produced (matchkey_name, threshold, sample_size, learned_at). Requires >= 10 corrections per matchkey before threshold tuning fires; otherwise returns an empty list.2 params

Force a MemoryLearner pass over accumulated corrections. Returns the list of LearnedAdjustments produced (matchkey_name, threshold, sample_size, learned_at). Requires >= 10 corrections per matchkey before threshold tuning fires; otherwise returns an empty list.

Parameters* required
pathstring
SQLite memory DB path. Default: .goldenmatch/memory.db
matchkey_namestring
Optional: learn only for this matchkey.
memory_statsReturn Learning Memory status: total correction count, last learn time, and current learned adjustments. Cheap; safe for status checks.1 params

Return Learning Memory status: total correction count, last learn time, and current learned adjustments. Cheap; safe for status checks.

Parameters* required
pathstring
SQLite memory DB path. Default: .goldenmatch/memory.db
memory_exportReturn all corrections as a list of dicts (CSV-shaped). Caller is responsible for writing the file. Optionally filter by dataset.2 params

Return all corrections as a list of dicts (CSV-shaped). Caller is responsible for writing the file. Optionally filter by dataset.

Parameters* required
pathstring
SQLite memory DB path. Default: .goldenmatch/memory.db
datasetstring
identity_resolveResolve a record_id to its durable identity. Returns the full identity view (members, evidence edges, recent events) or null when no identity exists for that record.2 params

Resolve a record_id to its durable identity. Returns the full identity view (members, evidence edges, recent events) or null when no identity exists for that record.

Parameters* required
pathstring
Identity DB path
record_id*string
record id in `{source}:{source_pk}` form
identity_listList identities, optionally filtered by dataset/status.5 params

List identities, optionally filtered by dataset/status.

Parameters* required
pathstring
limitinteger
default: 50
offsetinteger
default: 0
statusstring
datasetstring
identity_historyReturn the temporal event log for an identity.3 params

Return the temporal event log for an identity.

Parameters* required
pathstring
limitinteger
default: 100
entity_id*string
identity_conflictsList evidence edges marked `conflicts_with`.2 params

List evidence edges marked `conflicts_with`.

Parameters* required
pathstring
datasetstring
identity_mergeManually merge two identities. All records from `absorb_entity_id` are reassigned to `keep_entity_id`.4 params

Manually merge two identities. All records from `absorb_entity_id` are reassigned to `keep_entity_id`.

Parameters* required
pathstring
reasonstring
keep_entity_id*string
absorb_entity_id*string
identity_splitSplit a subset of records off an identity into a brand-new identity. The original keeps the remaining records.4 params

Split a subset of records off an identity into a brand-new identity. The original keeps the remaining records.

Parameters* required
pathstring
reasonstring
entity_id*string
record_ids*array
get_statsGet dataset statistics: record count, cluster count, match rate, cluster sizes.

Get dataset statistics: record count, cluster count, match rate, cluster sizes.

No parameters — call it with no arguments.

find_duplicatesFind duplicate matches for a record. Provide field values to search against the loaded dataset.2 params

Find duplicate matches for a record. Provide field values to search against the loaded dataset.

Parameters* required
top_kinteger
Max results to return (default 5)default: 5
record*object
Record fields to match (e.g. {"name": "John Smith", "zip": "10001"})
explain_matchExplain why two records match or don't match. Shows per-field score breakdown.2 params

Explain why two records match or don't match. Shows per-field score breakdown.

Parameters* required
record_a*object
First record fields
record_b*object
Second record fields
list_clustersList duplicate clusters found in the dataset. Returns cluster IDs, sizes, and member counts.2 params

List duplicate clusters found in the dataset. Returns cluster IDs, sizes, and member counts.

Parameters* required
limitinteger
Max clusters to return (default 20)default: 20
min_sizeinteger
Minimum cluster size to include (default 2)default: 2
get_clusterGet details of a specific cluster: all member records and their field values.1 params

Get details of a specific cluster: all member records and their field values.

Parameters* required
cluster_id*integer
Cluster ID to look up
get_golden_recordGet the merged golden (canonical) record for a cluster.1 params

Get the merged golden (canonical) record for a cluster.

Parameters* required
cluster_id*integer
Cluster ID
match_recordMatch a single record against the loaded dataset in real-time. Paste a record's fields and instantly see if it matches any existing record. Uses the configured matchkeys, scorers, and thresholds. Example: {"name": "John Smith", "email": "john@test.com", "zip": "10001"}3 params

Match a single record against the loaded dataset in real-time. Paste a record's fields and instantly see if it matches any existing record. Uses the configured matchkeys, scorers, and thresholds. Example: {"name": "John Smith", "email": "john@test.com", "zip": "10001"}

Parameters* required
top_kinteger
Max matches to return (default 5)default: 5
record*object
Record fields to match against the dataset
thresholdnumber
Minimum score to consider a match (default: use config threshold)
unmerge_recordRemove a record from its cluster. The record becomes a singleton. Remaining cluster members are re-clustered using stored pair scores. Use this to fix bad merges.1 params

Remove a record from its cluster. The record becomes a singleton. Remaining cluster members are re-clustered using stored pair scores. Use this to fix bad merges.

Parameters* required
record_id*integer
Row ID of the record to unmerge
shatter_clusterBreak an entire cluster into individual records. All members become singletons. Use when a cluster is completely wrong.1 params

Break an entire cluster into individual records. All members become singletons. Use when a cluster is completely wrong.

Parameters* required
cluster_id*integer
Cluster ID to shatter
suggest_configAnalyze bad merges and suggest config changes. Provide examples of incorrect merges (pairs that should NOT have matched) and GoldenMatch will identify which fields/thresholds to tighten. Example: [{"record_a": {...}, "record_b": {...}, "reason": "different people"}]1 params

Analyze bad merges and suggest config changes. Provide examples of incorrect merges (pairs that should NOT have matched) and GoldenMatch will identify which fields/thresholds to tighten. Example: [{"record_a": {...}, "record_b": {...}, "reason": "different people"}]

Parameters* required
bad_merges*array
List of bad merge examples with record_a, record_b, and optional reason
profile_dataGet data quality profile: column types, null rates, unique counts, sample values.

Get data quality profile: column types, null rates, unique counts, sample values.

No parameters — call it with no arguments.

export_resultsExport matching results to a file (CSV or JSON).2 params

Export matching results to a file (CSV or JSON).

Parameters* required
formatstring
Output format (default csv)one of csv · jsondefault: csv
output_path*string
File path to save results
list_domainsList available domain extraction rulebooks (built-in + user-defined).

List available domain extraction rulebooks (built-in + user-defined).

No parameters — call it with no arguments.

create_domainCreate a custom domain extraction rulebook. Define patterns for a specific data domain (medical devices, automotive parts, real estate, etc.).7 params

Create a custom domain extraction rulebook. Define patterns for a specific data domain (medical devices, automotive parts, real estate, etc.).

Parameters* required
name*string
Domain name (e.g. 'medical_devices', 'automotive_parts')
scopestring
Save locally (.goldenmatch/domains/) or globally (~/.goldenmatch/domains/). Default: local.one of local · globaldefault: local
signals*array
Column name keywords that trigger this domain (e.g. ['ndc', 'fda', 'implant'])
stop_wordsarray
Words to strip during name normalization
brand_patternsarray
Brand/manufacturer names to extract (e.g. ['Medtronic', 'Abbott'])
attribute_patternsobject
Named regex patterns for domain attributes (e.g. {'size': '\\b(\\d+mm)\\b'})
identifier_patternsobject
Named regex patterns for domain identifiers (e.g. {'ndc': '\\b(\\d{5}-\\d{4}-\\d{2})\\b'})
test_domainTest a domain extraction rulebook against sample records. Shows what features would be extracted from the loaded data.2 params

Test a domain extraction rulebook against sample records. Shows what features would be extracted from the loaded data.

Parameters* required
domain_name*string
Name of the domain rulebook to test
sample_sizeinteger
Number of records to test (default 10)default: 10
pprl_auto_configAnalyze the loaded dataset and recommend optimal PPRL (privacy-preserving record linkage) configuration. Returns recommended fields, bloom filter parameters, threshold, and explanation.2 params

Analyze the loaded dataset and recommend optimal PPRL (privacy-preserving record linkage) configuration. Returns recommended fields, bloom filter parameters, threshold, and explanation.

Parameters* required
use_llmboolean
Use LLM for enhanced recommendations (requires API key)default: false
security_levelstring
Security level (default: high)one of standard · high · paranoiddefault: high
pprl_linkRun privacy-preserving record linkage between two parties' data. Computes bloom filters, matches records without sharing raw data. Specify fields, threshold, and security level.5 params

Run privacy-preserving record linkage between two parties' data. Computes bloom filters, matches records without sharing raw data. Specify fields, threshold, and security level.

Parameters* required
fields*array
Field names to match on (e.g. ['first_name', 'last_name', 'zip_code'])
file_a*string
Path to party A's CSV file
file_b*string
Path to party B's CSV file
thresholdnumber
Match threshold (default: auto-detected)
security_levelstring
one of standard · high · paranoiddefault: high

Golden Suite

Splink-beating entity resolution — Arrow-native, Rust-fast, zero-tuning — feeding a durable identity layer, so messy records from every source become stable golden entities with whole-record, Customer-360 provenance.

Zero-config matching that beats expert-tuned Splink head-to-head on messy customer records, in an Arrow-native, Rust-authoritative engine verified from a laptop CSV to a 100M-row dedupe in 9.2 minutes. The identities it produces live in a transaction-native control plane — stable entity_ids, per-field provenance, merge/split, and a tamper-evident audit log — one call away as a Customer 360. It even owns its primitives: byte-identical, faster-than-rapidfuzz / jellyfish / FAISS Rust kernels, not rented dependencies.

Python · TypeScript · SQL, at 4-decimal parity · native in Postgres + DuckDB · edge WASM · 70+ MCP tools · beats hand-tuned Splink · 100M rows in 9.2 min


PyPI — goldenmatch npm — goldenmatch Python Node License: MIT

CI codecov OpenSSF Scorecard Fellegi-Sunter beats hand-rolled Splink 100M rows in 9.2 min

PyPI downloads (suite) npm downloads (suite) crates.io downloads GitHub stars

Docs Wiki Web UI Smithery MCP Last commit

GoldenMatch web workbench — pair drilldown with NL prose

Pair drilldown in the web workbench: cluster members, field-level diff, and a one-line NL explanation per pair. pip install goldenmatch[web] then goldenmatch serve-ui <project>. More screenshots →

v3.5.0 — New date scorer for date fields (#1858). jaro_winkler scores unrelated ISO birthdays 0.80+ (the fixed YYYY-MM-DD shape + shared digit alphabet dominate), so it can't tell a typo from a different person. The date scorer compares dates by Damerau-Levenshtein over the canonical digits — a typo scores 0.90, an unrelated date 0.00 — with a levenshtein fallback for non-ISO input. Cross-surface (Python, native kernel, TypeScript), and a preflight check warns when a name-oriented scorer sits on a date field.

v3.4.0 — Embeddings are first-class on Fellegi-Sunter matchkeys. embedding and record_embedding field scorers now train (EM) and score end-to-end on the probabilistic path via the vectorized matrix — previously they raised Unknown scorer on both training and scoring. They are matrix-only, so a matchkey carrying one always runs vectorized, and the TUI now routes FS through the same native/vectorized selector.

v3.3.0 — 3.3.0 — negative evidence on Fellegi-Sunter matchkeys. negative_evidence now works on type: probabilistic matchkeys as EM-learned __ne__ dimensions (no labels needed; penalty_bits as a fixed override), and the Splink migration upgrade pass gains a fan-out lever — a risk-gated NE suggestion plus cluster-guard tuning from your reference clusters. goldenmatch-native 0.1.15 scores NE in the Rust kernels (FS_SUPPORTS_NE; older wheels keep the pure-Python fallback automatically).


What you get: the golden entity

Most entity-resolution tools hand you clusters and stop. GoldenMatch keeps going: it resolves messy records into a durable golden entity — one per real-world customer — that survives re-runs, carries provenance on every field, and answers "who is this, and where did each value come from?" in a single call.

  • A stable identity, not a throwaway cluster id. Every entity gets a stable entity_id (UUIDv7) that persists across runs as new data arrives — records are absorbed, entities merge or split, but the id an entity earns is the id downstream systems can rely on. Run-local cluster numbers reshuffle on every run; these don't.
  • Whole-record provenance. Every field of the golden record traces back to the source record that won it — which source, when it was last seen, and which survivorship strategy picked it — with the values it didn't pick kept visible, not silently dropped. Provenance is on the whole unified record, not just the match decision.
  • Governed by construction. Conflicting values collapse to one best value by an explicit survivorship policy (most-complete · source-priority · most-recent · majority-vote); every identity change lands in an append-only event timeline; and the log is sealed with a hash-chained, tamper-evident audit that a reviewer (or the other language port) can independently verify.

customer_360(entity_id) composes it into one read — golden record, per-field provenance, every linked source record, the event timeline, and the entity's relationship neighborhood:

// customer_360("018f...c2a1")  — trimmed
{
  "entity_id": "018f2b7e-...-c2a1", "confidence": 0.97, "record_count": 3,
  "sources": ["salesforce", "billing", "support"],
  "golden_record": { "name": "Ada Lovelace", "email": "ada@analytical.io", "phone": "+1-555-0100" },
  "field_provenance": [
    { "field": "email", "value": "ada@analytical.io",
      "winning_source": "billing", "winning_record_id": "billing:8821",
      "conflicting_values": [ { "value": "ada@ada.dev", "source": "salesforce" } ] },
    { "field": "phone", "value": "+1-555-0100", "winning_source": "salesforce" }
  ],
  "timeline": [ { "kind": "created", "actor": "pipeline", "recorded_at": "2026-07-30T..." },
                { "kind": "absorbed_record", "reason": "matched billing:8821" } ],
  "relationships": [ { "other_entity_id": "018f...9d0e", "kind": "shares_address" } ]
}

What ships today vs. what's emerging. The identity spine is production-grade and in main: stable entity_ids, per-field provenance, survivorship, merge/split, the append-only log + audit chain, cross-channel stitching, the relationship overlay, and incremental resolution against a persisted index (a new record resolves without a full re-run). The customer_360() serving view above and the source-registry layer that keeps it fresh from live systems are the newer, actively-landing pieces (the source connectors — Snowflake, BigQuery, Salesforce, HubSpot — ship today; the registry that wires them into the spine is emerging) — see the Customer 360 design + ADR. We label the seam rather than blur it.

The golden entity lives in the control plane; the matching that builds it runs in the compute engine. That split is the next section.


One product, two engines

The golden entity above is produced by two engines that optimize for genuinely different things — and keeping them distinct is the architecture, not an implementation detail (ADR 0047).

flowchart LR
    src([source records])
    e360([golden entities · Customer 360])
    subgraph compute ["Identity Compute Engine — Arrow-native, Rust-authoritative"]
        match[block · score · cluster]
    end
    subgraph control ["Identity Control Plane — transaction-native state machine"]
        spine[stable ids · survivorship · merge/split · provenance · audit]
    end
    src --> compute -->|resolution batch + evidence| control --> e360
    control -.->|persisted index| compute
Identity Compute EngineIdentity Control Plane
ShapeArrow at bulk boundaries, Rust-authoritative kernelsTransaction-native state machine (SQLite default · Postgres)
JobBlock, score, cluster — throughput, vectorized, deterministic per runStable ids, survivorship, merge/split, provenance, append-only audit
StateStateless per call; measurement-driven kernelizationDurable, transactional, replayable, auditable
BackendsDataFusion · Ray · Sail are replaceable execution backends, none synonymous with GoldenMatchStorage backends conform to one externally-observable semantics

Many surfaces, one answer. The same capabilities reach Python, edge-safe TypeScript (with an opt-in WASM backend running the same Rust kernels), SQL inside PostgreSQL and DuckDB, and MCP / REST / A2A — governed by specification + conformance, not copy-paste. There is one authoritative owner per capability; pure-Python / standalone-TS paths are classified, conformance-tested fallbacks. Where a boundary can't cross byte-for-byte, we measure and label it rather than claim parity.

Why a platform engineer should care:

  • The compute layer isn't framework lock-in. It's Arrow-native and backend-replaceable — push the heavy matching to a query engine that plans, spills, and distributes (verified to 100M rows), without the identity state coming along for the ride.
  • The identity layer is a real state machine, not a columnar rebuild-every-time batch — durable ids, transactional merge/split, provenance and audit as first-class operations you can integrate against.
  • Behavior is consistent where it's shared — SQL, Python, and TypeScript track the same answers to a conformance spec, so the surface you build on isn't quietly inventing its own semantics.

Resolution that beats the expert

The identity layer is only as good as the matching underneath it — and the matching starts at zero config. dedupe_df(df) runs with no rules and no training data: it profiles the data, picks a defensible configuration, and returns golden records immediately. The config it chose comes back on result.config — inspectable, diffable, versionable. Never a black box.

  • Beats the expert, out of the box. On messy customer records, the opt-in Fellegi-Sunter engine beats hand-tuned Splink head-to-head — historical_50k pairwise F1 0.827 vs 0.757, cluster B³ 0.862 vs 0.788, one shared evaluator, reproducible bake-off. Fuzzy, exact, probabilistic (Fellegi-Sunter), and LLM scorers, with EM-trained weights and calibrated scores.
  • A healing loop, not a one-shot. Zero-config gets you most of the way; then every run checks a free unsupervised signal and, when there's headroom, attaches ranked, self-verified config tweaks to result.suggestions. Each is kept only if it doesn't worsen a health proxy — so a suggestion never makes results worse. dedupe_df(df, heal=True) applies and re-runs in one call. You close the gap to expert-tuned without being the expert.
  • Privacy-preserving record linkage. Match across organizations without sharing raw data — Bloom-filter PPRL, 92.4% F1 on FEBRL4, with HMAC-salted encodings.
  • Self-verifying. Every step runs preflight + postflight checks and returns an inspectable report instead of failing silently — the "advanced, never black-box" contract that makes an automated identity layer safe to build on.

Runs on unstructured input, too: extract records from PDFs and images, then resolve them like any other source (pip install goldenmatch[documents]).


Runs where your stack is

The engine and the identity layer reach your stack through the surface you already use — the same capabilities, governed by conformance (one product, two engines), not a thin re-implementation per surface.

  • SQL-native, at parity. The same functions run inside PostgreSQL (pgrx extension) and DuckDB: dedupe · match · score · auto-config + telemetry · identity-graph reads · profiling · evaluate · Fellegi-Sunter scoring · GoldenFlow transforms. Resolve without moving data out of the warehouse.
  • Python and edge-safe TypeScript. The full suite ships on npm alongside PyPI. The TS cores are dependency-free and node:*-free (browsers, Cloudflare Workers, Vercel Edge, Deno); an opt-in WebAssembly backend (await enableWasm()) swaps in the same pyo3-free Rust kernels the Python wheels and SQL UDFs use, with pure-TS as the byte-identical default.
  • AI-native by default. Every package ships an MCP server, a REST API, and an A2A agent surface (70+ MCP tools across the suite), all exposing the same JSON telemetry shape across web, TUI, CLI, Postgres, DuckDB, and MCP.
  • Pipeline-native. A dbt package (dedupe/match materializations, quality tests, identity-graph reads), a GitHub Action (fail PRs on data-quality regressions), and 13 drop-in Airflow DAGs (Deploy).
  • Production paths. Postgres sync, daemon mode, lineage tracking, review queues.

Cross-language parity

Surface parity is not the same as handing any pipeline phase from one language to the other byte-for-byte. Each verdict below is measured by a conformance harness, not assumed:

BoundaryVerdict
Identity graph DB✅ byte-safe + cryptographically cross-verifiable (a seal written by one toolkit validates under the other)
score → cluster and the end-to-end split-run✅ byte-safe — reproduces the single-language run
Cluster JSON · config YAML · Learning Memory · record_fingerprint✅ portable
String scoring🟡 4-decimal tolerance — a pair on a threshold can flip (byte-identical only with the shared WASM scorer)
Standardize / dates · embeddings · auto-config controller🟠 divergent — not byte-portable
Distributed / Ray · document (VLM) ingest⛔ Python-only by architecture

Rule of thumb: hand off at the cluster or identity boundary and it's seamless; don't split across standardize/dates, embeddings, or the controller and expect bit-exact reproduction. Full detail + the runnable harness that keeps these verdicts honest: Cross-language parity & phase-handoff limits.


The suite — the pipeline into the spine

GoldenMatch is the headline, but resolution is only as good as what feeds it. Five sibling tools clean, standardize, and map records before they reach the identity layer — each stands alone, but they compose into one pipeline, orchestrated declaratively by GoldenPipe:

flowchart LR
    raw([raw rows])
    golden([golden entities])
    subgraph orchestration ["GoldenPipe orchestrates"]
        direction LR
        infermap[InferMap] --> goldencheck[GoldenCheck] --> goldenflow[GoldenFlow] --> goldenmatch[GoldenMatch]
    end
    raw --> infermap
    goldenmatch --> golden
PackageLangRole in the pipelineInstall
InferMapPython · TSSchema mapping — auto-aligns columns across heterogeneous sourcespip install infermap · npm i infermap
GoldenCheckPython · TSData-quality scanning — encoding, format validation, anomaly detectionpip install goldencheck · npm i goldencheck
GoldenFlowPython · TSTransforms & standardizers — phone, date, address, categoricalpip install goldenflow · npm i goldenflow
GoldenMatchPython · TSZero-config entity resolution → the identity spine. Headline package.pip install goldenmatch · npm i goldenmatch
GoldenAnalysisPython · TSAnalysis & reporting — any stage's artifacts → a unified AnalysisReport + cross-run regression detectionpip install goldenanalysis · npm i goldenanalysis
GoldenPipePython · TSOrchestrator — declarative YAML wiring the stepspip install goldenpipe · npm i goldenpipe
golden-suitePythonOne-line meta-install: the whole suite + native accelerationpip install golden-suite

The deepest docs live in packages/python/goldenmatch/README.md (~1,300 lines: full feature list, CLI, architecture, benchmarks).

Owned libraries (standalone)

The suite owns its string-matching primitives instead of renting them — byte-identical drop-in replacements, published on their own so they're usable outside the suite too.

LibraryReplacesWhat it isInstall
goldenfuzzrapidfuzzFuzzy-string scorers + the full fuzz.* composite family + one-vs-many extract/cdist. Byte-identical (oracle-fuzzed), faster on short strings.pip install goldenfuzz · cargo add goldenfuzz-core
goldenphoneticjellyfishPhonetic encoders — soundex / metaphone / nysiis / match-rating. Byte-identical (6,000-input + 2,500-pair fuzz corpus), pure-Rust zero-dep.pip install goldenphonetic · cargo add goldenphonetic-core
goldenmatch-hnswFAISS IndexHNSWFlatPure-Rust HNSW approximate-nearest-neighbor index (zero C deps) — powers embedding-based blocking across Python, Rust, and TS/WASM.pip install goldenmatch-hnsw

Knowledge graphs

Entity resolution is the stage most GraphRAG pipelines do worst — duplicate surface forms of one entity scatter across documents. Two packages put GoldenMatch's resolution there:

PackageWhat it doesStatus
goldenmatch-kgDrop-in GoldenMatch resolution as the ER stage of existing KG frameworks (neo4j-graphrag, LlamaIndex, Graphiti).in-repo · not published (by design)
goldengraphBuild-your-own-KG from text — text → LLM extraction → GoldenMatch resolution → durable bi-temporal store. Rust engine; ER is the differentiator.in-repo · first PyPI release pending

Measured, not asserted (ER-KG-Bench): resolution scores F1 0.602 on the labelled set, ahead of Neo4j-KGBuilder (0.456), neo4j-graphrag (0.403), and MS-GraphRAG / LightRAG / Cognee / mem0 (0.066). A resolved graph also does two things passage-window RAG structurally can't — exact aggregation (size-invariant where RAG recall collapses 0.99 → 0.64 across cluster-size buckets) and temporal as-of (1.000 vs 0.002 on past-date queries).


Scale & benchmarks

Every headline number maps back to a single committed runner (scripts/run_benchmarks.py); see docs/reproducing-benchmarks.md for per-number commands, dataset URLs, and expected output with tolerance.

  • Accuracy on customer-shaped data — NC Voter 0.9719 F1, Febrl3 0.9443 F1, DQbench composite 91.04; the opt-in Fellegi-Sunter path beats hand-tuned Splink head-to-head on every dataset Splink scores (bake-off). (Bibliographic DBLP-ACM lands 96.4% F1 for the record-linkage crowd, but customer identity is the focus.)
  • Privacy-preserving — PPRL 92.4% F1 on FEBRL4, matching across parties with no shared raw data.
  • Scale envelope (docs/scale-envelope.md) — per-backend ranges (in-memory/bucket to a few M · DuckDB out-of-core to ~50M · Ray distributed ≥ 50M), block-size failure modes, and a decision tree for picking a backend.

Verified at the top end: a full 100M-row dedupe on a 5-node Ray cluster in 9.2 min (554 s), 20,000,000 golden records recovered exactly, driver peak 0.36 GB RSS. The default distributed path is recall-complete — duplicates merge correctly no matter how the input is partitioned (blocking-key shuffle scoring + distributed randomized-contraction WCC), and it stays driver-collect-free end to end. Recipe: configs/distributed-100m.yaml.

Three reproducible real-world pipelines run this on public data at scale:

  • shell-company-network — investigative ER across ICIJ Offshore Leaks + OpenSanctions + GLEIF + UK PSC. −62.5% analyst-hours to triage vs single-source baselines.
  • vuln-attribution — 6,126,895 OSS-vulnerability records → 847,475 canonical vulns across 40 sources in ~5 minutes on one 64GB runner.
  • sanctions-reconciliation — cross-list coverage on 85 public sanctions lists across 50+ jurisdictions.

Install & quick start

Dedupe a CSV in 30 seconds — zero config, writes <timestamp>_golden.csv:

pip install goldenmatch && goldenmatch dedupe customers.csv
import goldenmatch as gm

result = gm.dedupe("customers.csv")               # zero-config
print(result)                                     # DedupeResult(records=5000, clusters=847, match_rate=12.0%)
result.golden.write_csv("deduped.csv")

result = gm.dedupe("customers.csv",               # or be explicit
    exact=["email"], fuzzy={"name": 0.85, "zip": 0.95}, blocking=["zip"], threshold=0.85)
import { dedupe } from "goldenmatch";           // edge-safe: browsers, Vercel Edge, Workers, Deno
const result = dedupe(rows, { fuzzy: { name: 0.85 }, blocking: ["zip"], threshold: 0.85 });

The whole suite, configured for speed — golden-suite pulls in every package plus the native (Rust) kernels, pinned and defaulted to the perf-optimized config. Native wheels are hard dependencies on purpose: a platform without a wheel fails loudly rather than silently running the slow pure-Python path.

pip install golden-suite
golden-suite doctor        # verify every package + native kernel is importable and healthy
golden-suite optimize      # repair / re-enable the perf-optimized config

pip install golden-suite[mcp]     # + aggregator MCP server (every tool, one endpoint)
pip install golden-suite[all]     # everything

Just GoldenMatch — fat optional extras, pay only for what you use (native acceleration is default on common platforms):

pip install goldenmatch                    # core (CSV in, CSV out) + native
pip install goldenmatch[documents]         # + PDF/image ingest (resolve unstructured input)
pip install goldenmatch[embeddings]        # + sentence-transformers, FAISS
pip install goldenmatch[llm]               # + Claude / OpenAI for LLM boost
pip install goldenmatch[ray]               # + Ray distributed backend (50M+ rows)
pip install goldenmatch[postgres]          # + Postgres sync  (also: [snowflake] [bigquery] [databricks] [salesforce])
pip install goldenmatch[mcp]               # + MCP server     (also: [agent] A2A, [web] browser workbench)

Web workbench — pip install 'goldenmatch[web]' then goldenmatch serve-ui my-project (opens http://localhost:5050): edit rules with live validation, preview against a sampled slice, label pairs (mirrored into Learning Memory), compare runs.

More: examples/ — Python (quickstart, full pipeline, customer 360, PPRL, MCP client) · TypeScript (quickstart, Vercel Edge, MCP client) · Airflow.


Deploy

Remote MCP (nothing to install) — hosted on Smithery; connect any MCP client:

{ "mcpServers": { "goldenmatch": { "url": "https://goldenmatch-mcp-production.up.railway.app/mcp/" } } }

Containers — every package ships as a multi-arch image (linux/amd64 + arm64) on GHCR, pull anonymously:

docker run -p 8300:8300 ghcr.io/benseverndev-oss/goldensuite-mcp:latest   # one container, every tool
docker run -p 8200:8200 ghcr.io/benseverndev-oss/goldenmatch-mcp:latest   # per-package (also goldencheck/goldenflow/goldenpipe/infermap)
docker run -e POSTGRES_PASSWORD=secret ghcr.io/benseverndev-oss/goldenmatch-extensions:latest   # Postgres + extension

Airflow — 13 drop-in DAGs at examples/airflow/ (TaskFlow API, Airflow 2.7+ / 3.x; idempotent, marker-protected), grouped by lifecycle stage:

GroupDAGs
Core pipelinedaily_dedupe, incremental_match, warehouse_native (Snowflake), customer_360, identity_graph
Privacypprl_linkage (two-party PPRL)
Onboarding & monitoringschema_align_and_load, schema_drift_alarm, quality_gate
Feedback loopreview_worker, active_learning
Operationalizereverse_etl (Salesforce/HubSpot), backfill

Repository layout

goldenmatch/
├── packages/
│   ├── python/        goldenmatch · goldencheck · goldenflow · goldenpipe · infermap · goldenanalysis
│   │                  goldensuite-mcp (aggregator) · golden-suite (meta) · goldengraph · goldenmatch-kg
│   ├── typescript/    full TS ports (edge-safe cores + WASM) · goldencheck-types
│   ├── rust/extensions/  Postgres pgrx + DuckDB UDFs + native kernels + owned libraries (own Cargo workspace)
│   ├── dbt/goldensuite/  dbt materializations, tests, macros
│   └── actions/goldencheck/  GitHub Action
├── examples/          python · typescript · airflow (drop-in DAGs)
├── context-network/   architecture decisions + design docs (ADRs, the two-engine frame, Customer 360)
├── docs/superpowers/  design specs and implementation plans
└── justfile · pyproject.toml (uv workspace) · pnpm-workspace.yaml (Turborepo) · .github/workflows/ci.yml
  • Cargo — no root workspace. packages/rust/extensions/ is itself a Cargo workspace (the postgres crate is excluded for pgrx); Cargo commands run from inside it.
  • TypeScript — one pnpm workspace. packages/typescript/* form a single pnpm + Turborepo workspace.
just install   # uv sync + per-package npm install + cargo fetch
just test      # all languages   ·   just lint   ·   just build

Contributing

  • Feature work on feature/<name> branches; merge via squash PR. Titles: feat: / fix: / docs:.
  • Tests must pass on all three languages where the change applies; the parity harness in packages/typescript/goldenmatch/tests/parity/ enforces 4-decimal Python ↔ TypeScript scorer parity.
  • Architecture changes conform to (or amend) the one-product-two-engines frame in the same PR. Design rationale lives in context-network/decisions/ and docs/superpowers/specs/.
corepack enable                               # one-time, picks up pnpm@9.15.0
pnpm install
pnpm turbo run build test typecheck           # full pipeline (cached after first run)

Windows: enable Developer Mode so pnpm install can create symlinks; if corepack enable needs admin, npm i -g pnpm@9.15.0 is equivalent.


This repo was formed on 2026-05-01 by folding 8 sibling repos into goldenmatch via git filter-repo (full history preserved). Built by Ben Severn. MIT — see LICENSE.

Featured
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Capacitor - Shared memory for your team’s coding agents.
Capacitor - Shared memory for your team’s coding agents.
Make coding agent sessions - Searchable, Shareable, Vendor-neutral & Scored.
Try For Free →
Give your AI the whole web as clean markdownGive your AI the whole web as clean markdown
Give your AI the whole web as clean markdown
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
belt - the only tool your agent needs
belt - the only tool your agent needs
belt cli automatically finds the best tools and skills for your agent. image, video, music, tts...
one prompt install →
inference shell
inference shell
create and run specialised agents in minutes
build now →
MCP-ready Email SendingMCP-ready Email Sending
MCP-ready Email Sending
Plug Mailtrap into your AI workflow and let it handle the email.
Connect Mailtrap MCP →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
Registryactive
Packagegoldenmatch
TransportSTDIO, HTTP
Prompts5
Tools verifiedJun 10, 2026
UpdatedJun 9, 2026
View on GitHub