benzsevern avatar

GoldenMatch

benzsevern/goldenmatch

You already know the pain of deduping customer lists or merging datasets from three acquisitions. This server exposes the GoldenMatch entity resolution engine over MCP, giving Claude direct access to fuzzy matching, clustering, and survivorship rules without you writing glue code. It's part of a larger data quality suite (GoldenCheck profiles, GoldenFlow standardizes, GoldenMatch dedupes, GoldenPipe orchestrates), but the MCP layer focuses on the dedupe step. Expect tools for configuring match thresholds, inspecting candidate pairs, and applying Learning Memory so corrections stick across runs. The underlying engine ships 97.2% F1 on DBLP-ACM out of the box and handles 5M records on a single node. Reach for it when you need Claude to reason about record linkage interactively instead of exporting to a notebook.

GitHub stars
62
tools
42
transport
STDIO, HTTP
last updated
May 11, 2026

Install

From registry metadata
$ npx add-mcp https://goldenmatch-mcp-production.up.railway.app/mcp/ --name goldenmatch

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

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

Other ways

Claude Code

$ 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.

Tools

Verified live · 42 tools

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

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
constraintsobject
file_path*string
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
decided_by*string
decision*string
id_a*integer
id_b*integer
job_name*string
reasonstring
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)
file_path*string
Path to the CSV file to fix
fix_modestring
Fix aggressiveness: safe (conservative) or moderate (balanced). Default: safeone of safe · moderatedefault: safe
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
datasetstring
Optional dataset filter (e.g. file path).
pathstring
SQLite memory DB path. Default: .goldenmatch/memory.db
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
dataset*string
Dataset identifier (e.g. file path). Required, non-empty.
decision*string
one of approve · reject
id_a*integer
id_b*integer
matchkey_namestring
pathstring
SQLite memory DB path. Default: .goldenmatch/memory.db
reasonstring
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
matchkey_namestring
Optional: learn only for this matchkey.
pathstring
SQLite memory DB path. Default: .goldenmatch/memory.db
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
datasetstring
pathstring
SQLite memory DB path. Default: .goldenmatch/memory.db
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
datasetstring
limitinteger
default: 50
offsetinteger
default: 0
pathstring
statusstring
identity_historyReturn the temporal event log for an identity.3 params

Return the temporal event log for an identity.

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

List evidence edges marked `conflicts_with`.

Parameters* required
datasetstring
pathstring
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
absorb_entity_id*string
keep_entity_id*string
pathstring
reasonstring
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
entity_id*string
pathstring
reasonstring
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
record*object
Record fields to match (e.g. {"name": "John Smith", "zip": "10001"})
top_kinteger
Max results to return (default 5)default: 5
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
record*object
Record fields to match against the dataset
thresholdnumber
Minimum score to consider a match (default: use config threshold)
top_kinteger
Max matches to return (default 5)default: 5
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
attribute_patternsobject
Named regex patterns for domain attributes (e.g. {'size': '\\b(\\d+mm)\\b'})
brand_patternsarray
Brand/manufacturer names to extract (e.g. ['Medtronic', 'Abbott'])
identifier_patternsobject
Named regex patterns for domain identifiers (e.g. {'ndc': '\\b(\\d{5}-\\d{4}-\\d{2})\\b'})
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
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
security_levelstring
Security level (default: high)one of standard · high · paranoiddefault: high
use_llmboolean
Use LLM for enhanced recommendations (requires API key)default: false
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
security_levelstring
one of standard · high · paranoiddefault: high
thresholdnumber
Match threshold (default: auto-detected)

Sponsors

Readme

GoldenMatch

Find the rows in your data that are the same person, company or product. No rules to write, no labelled pairs, no model to train.

Zero-config entity resolution for Python. Point it at a CSV or a table: it chooses how to match, shows you what it chose, and merges each group of duplicates into one golden record.


PyPI: goldenmatch npm: goldenmatch Python Node License: MIT


View the full README on GitHub

Details

Repository
github.com/benzsevern/goldenmatch
Website
benzsevern.github.io/goldenmatch
Package
goldenmatch
Transport
STDIO, HTTP
Registry
MCP registry, active
Prompts
5
Tools verified
Jun 10, 2026

More from benzsevern