# GoldenMatch (remote · goldenmatch-mcp-production.up.railway.app)

Find duplicate records in 30 seconds. Zero-config entity resolution, 97.2% F1 out of the box.

- Trust score: 66/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `goldenmatch-mcp-production.up.railway.app`: 66/100 (this document), [markdown](https://verifymcp.io/servers/benseverndev-oss-goldenmatch/goldenmatch-mcp-production.md), [page](https://verifymcp.io/servers/benseverndev-oss-goldenmatch/goldenmatch-mcp-production)
- pypi · `goldenmatch`: 21/100, [markdown](https://verifymcp.io/servers/benseverndev-oss-goldenmatch/goldenmatch.md), [page](https://verifymcp.io/servers/benseverndev-oss-goldenmatch/goldenmatch)

## Channel facts

- Endpoint: `https://goldenmatch-mcp-production.up.railway.app/mcp/`
- Transports: `streamable-http`
- Auth: `none`
- Version: `3.5.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 57/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 77 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 76/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Tool/resource definitions use about 7291 tokens (~94/item across 77 items; 77 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 86/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 59% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http benseverndev-oss-goldenmatch https://goldenmatch-mcp-production.up.railway.app/mcp/
```

### Codex

```toml
[mcp_servers.benseverndev-oss-goldenmatch]
url = "https://goldenmatch-mcp-production.up.railway.app/mcp/"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "benseverndev-oss-goldenmatch": {
      "type": "remote",
      "url": "https://goldenmatch-mcp-production.up.railway.app/mcp/",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add benseverndev-oss-goldenmatch --url https://goldenmatch-mcp-production.up.railway.app/mcp/ --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  benseverndev-oss-goldenmatch:
    url: "https://goldenmatch-mcp-production.up.railway.app/mcp/"
```

### Other

```json
{
  "mcpServers": {
    "benseverndev-oss-goldenmatch": {
      "type": "http",
      "url": "https://goldenmatch-mcp-production.up.railway.app/mcp/"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-03 (score 66, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 65, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 64, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 64, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-28 (score 63, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 62, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 61)

First indexed and scored.

## MCP tools (77)

### `analyze_data` (~80 tokens)

Profile data, detect domain, recommend ER strategy

Input parameters:

- `encoding` (string): Encoding of *_content (default base64)
- `file_content` (string): Alternative to file_path: file bytes (base64 default, or raw with encoding='text')
- `file_path` (string)
- `filename` (string): Original filename when using file_content

### `auto_configure` (~180 tokens)

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

Input parameters:

- `constraints` (object)
- `encoding` (string): Encoding of *_content (default base64)
- `exclude_columns` (array): Column names to skip across GoldenMatch + GoldenFlow + auto-config. Optional. Layered with config.exclude_columns when both are set. force_include (env var) rescues from any opt-out path.
- `file_content` (string): Alternative to file_path: file bytes (base64 default, or raw with encoding='text')
- `file_path` (string)
- `filename` (string): Original filename when using file_content

### `controller_telemetry` (~54 tokens)

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.

### `agent_deduplicate` (~137 tokens)

Run full ER pipeline with confidence gating and reasoning

Input parameters:

- `config` (object)
- `encoding` (string): Encoding of *_content (default base64)
- `exclude_columns` (array): Column names to skip across GoldenMatch + GoldenFlow + auto-config. Optional. Layered with config.exclude_columns when both are set. force_include (env var) rescues from any opt-out path.
- `file_content` (string): Alternative to file_path: file bytes (base64 default, or raw with encoding='text')
- `file_path` (string)
- `filename` (string): Original filename when using file_content

### `agent_match_sources` (~157 tokens)

Match two files with intelligent strategy selection

Input parameters:

- `config` (object)
- `encoding` (string): Encoding of *_content (default base64)
- `exclude_columns` (array): Column names to skip across GoldenMatch + GoldenFlow + auto-config. Optional. Layered with config.exclude_columns when both are set. force_include (env var) rescues from any opt-out path.
- `file_a` (string)
- `file_a_content` (string): Alternative to file_a: base64/text bytes
- `file_a_name` (string)
- `file_b` (string)
- `file_b_content` (string): Alternative to file_b: base64/text bytes
- `file_b_name` (string)

### `agent_explain_pair` (~48 tokens)

Natural language explanation for a record pair

Input parameters:

- `exact` (array)
- `fuzzy` (object)
- `record_a` (object, required)
- `record_b` (object, required)

### `agent_explain_cluster` (~27 tokens)

Explain why records are in the same cluster

Input parameters:

- `cluster_id` (integer, required)

### `agent_review_queue` (~23 tokens)

Get borderline pairs awaiting approval

Input parameters:

- `job_name` (string, required)

### `agent_approve_reject` (~66 tokens)

Approve or reject a review queue pair

Input parameters:

- `decided_by` (string, required)
- `decision` (string, required)
- `id_a` (integer, required)
- `id_b` (integer, required)
- `job_name` (string, required)
- `reason` (string)

### `agent_compare_strategies` (~115 tokens)

Compare ER strategies on your data

Input parameters:

- `encoding` (string): Encoding of *_content (default base64)
- `file_content` (string): Alternative to file_path: file bytes (base64 default, or raw with encoding='text')
- `file_path` (string)
- `filename` (string): Original filename when using file_content
- `ground_truth` (string)
- `ground_truth_content` (string): Alternative to ground_truth: base64/text bytes
- `ground_truth_name` (string)

### `suggest_pprl` (~81 tokens)

Check if data needs privacy-preserving matching

Input parameters:

- `encoding` (string): Encoding of *_content (default base64)
- `file_content` (string): Alternative to file_path: file bytes (base64 default, or raw with encoding='text')
- `file_path` (string)
- `filename` (string): Original filename when using file_content

### `scan_quality` (~133 tokens)

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]

Input parameters:

- `domain` (string): Optional domain hint (healthcare, finance, ecommerce)
- `encoding` (string): Encoding of *_content (default base64)
- `file_content` (string): Alternative to file_path: file bytes (base64 default, or raw with encoding='text')
- `file_path` (string): Path to the CSV file to scan
- `filename` (string): Original filename when using file_content

### `fix_quality` (~177 tokens)

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]

Input parameters:

- `domain` (string): Optional domain hint (healthcare, finance, ecommerce)
- `encoding` (string): Encoding of *_content (default base64)
- `file_content` (string): Alternative to file_path: file bytes (base64 default, or raw with encoding='text')
- `file_path` (string): Path to the CSV file to fix
- `filename` (string): Original filename when using file_content
- `fix_mode` (string): Fix aggressiveness: safe (conservative) or moderate (balanced). Default: safe
- `output_path` (string): Optional path to save the fixed CSV. If omitted, returns summary only.

### `run_transforms` (~148 tokens)

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]

Input parameters:

- `encoding` (string): Encoding of *_content (default base64)
- `file_content` (string): Alternative to file_path: file bytes (base64 default, or raw with encoding='text')
- `file_path` (string): Path to the CSV file to transform
- `filename` (string): Original filename when using file_content
- `output_path` (string): Optional path to save the transformed CSV. If omitted, returns summary only.

### `sensitivity` (~189 tokens)

Parameter-sensitivity analysis: sweep one or more config parameters across a range and report how stable the clustering is at each value (CCMS unchanged %). Use it to find robust thresholds. Auto-configures the file if no config is given.

Input parameters:

- `config` (string): Optional config YAML path
- `encoding` (string): Encoding of *_content (default base64)
- `file_content` (string): Alternative to file_path: file bytes (base64 default, or raw with encoding='text')
- `file_path` (string): CSV/Parquet to analyze
- `filename` (string): Original filename when using file_content
- `sample_size` (integer): Optional: randomly sample N records before sweeping
- `sweep` (array, required): Sweep specs as 'field:start:stop:step', e.g. 'threshold:0.70:0.95:0.05'. One or more.

### `incremental` (~172 tokens)

Match a batch of new records against an existing base dataset (without re-running the whole base). Returns matched (new_row_id, base_row_id, score) pairs plus counts. Auto-configures from the base file if no config is given.

Input parameters:

- `base_file` (string): Existing base dataset path
- `base_file_content` (string): Alternative to base_file: base64/text bytes
- `base_file_name` (string)
- `config` (string): Optional config YAML path
- `encoding` (string): Encoding of *_content (default base64)
- `new_records` (string): New records file to match in
- `new_records_content` (string): Alternative to new_records: base64/text bytes
- `new_records_name` (string)
- `threshold` (number): Optional threshold override

### `certify_recall` (~156 tokens)

Estimate match RECALL without ground truth (unsupervised). Treats each auto-configured matchkey/pass as a decorrelated system and uses capture-recapture over their overlaps to estimate how many true matches were missed. Returns a point estimate (a safe lower bound additionally needs a small labelled audit; see `goldenmatch evaluate --certify --audit-out`). Needs >=3 decorrelated systems.

Input parameters:

- `encoding` (string): Encoding of *_content (default base64)
- `file_content` (string): Alternative to file_path: file bytes (base64 default, or raw with encoding='text')
- `file_path` (string): Dataset to dedupe + certify
- `filename` (string): Original filename when using file_content

### `retrieve_similar` (~286 tokens)

Semantic retrieval (#1089): return the records in a CSV most similar to a free-text query, ranked by cosine similarity. Embeds the chosen column and the query with the zero-config in-house embedder (no cloud/torch by default) and runs ANN search. The read side of the RAG entity-canonicalization epic -- fetch candidate records by query without running a full dedupe.

Input parameters:

- `column` (string, required): Column of the corpus to embed + search
- `encoding` (string): Encoding of *_content (default base64)
- `file_content` (string): Alternative to file_path: file bytes (base64 default, or raw with encoding='text')
- `file_path` (string): CSV/Parquet corpus to search
- `filename` (string): Original filename when using file_content
- `filters` (object): Optional {column: value} equality pre-filter applied before embedding
- `k` (integer): Max records to return (default 20)
- `model` (string): Embedder id (default 'inhouse' -- local, deterministic, no cloud/torch). Also 'all-MiniLM-L6-v2', a Vertex/OpenAI model, etc.
- `query` (string, required): Free-text query to search for
- `threshold` (number): Minimum cosine similarity in [-1, 1] (default 0.0)

### `upload_dataset` (~182 tokens)

Upload a local file's bytes to the server and get back a server-side path to reuse across other tools (analyze_data, auto_configure, agent_deduplicate, ...). No hosting needed. Send base64 (default) or raw text via `encoding`. Uploaded files are ephemeral scratch, reaped after GOLDENMATCH_MCP_UPLOAD_TTL (default 24h); re-upload if you need a path older than that. Max size GOLDENMATCH_MCP_MAX_UPLOAD_BYTES (default 64MB) -- above it, pass a public http(s) URL as file_path instead.

Input parameters:

- `encoding` (string): Encoding of file_content (default base64)
- `file_content` (string, required): File bytes, base64-encoded (or raw text with encoding='text')
- `filename` (string, required): Original filename (extension preserved for format sniffing)

### `list_corrections` (~85 tokens)

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.

Input parameters:

- `dataset` (string): Optional dataset filter (e.g. file path).
- `path` (string): SQLite memory DB path. Default: .goldenmatch/memory.db

### `add_correction` (~276 tokens)

Add a Learning Memory correction. Two shapes:
  \- pair-level: decision='approve' or 'reject', requires id_a + id_b
  \- field-level (v1.18.2+): decision='field_correct', requires cluster_id + field_name + corrected_value
Source is 'agent' with trust=0.5 (lower than human steward 1.0). Pair (id_a, id_b) is canonicalized to (min, max) before storage.

Input parameters:

- `cluster_id` (integer): Field-level: cluster_id the correction targets.
- `corrected_value` (string): Field-level: the value the reviewer changed it to.
- `dataset` (string, required): Dataset identifier (e.g. file path). Required, non-empty.
- `decision` (string, required)
- `field_name` (string): Field-level: the column being corrected.
- `id_a` (integer): Pair-level: first row id. Field-level: ignored.
- `id_b` (integer): Pair-level: second row id. Field-level: ignored.
- `matchkey_name` (string)
- `original_value` (string): Field-level: the value build_golden_record chose.
- `path` (string): SQLite memory DB path. Default: .goldenmatch/memory.db
- `reason` (string)

### `list_plugins` (~83 tokens)

List all registered goldenmatch plugins by category. Includes the 22 v1.18.2 predefined plugins (numeric/format/business/aggregation) plus any user-registered plugins via entry-points or PluginRegistry.register_*(). Each entry includes name, source (builtin or user), category, and the first line of the merge docstring.

Input parameters:

- `category` (string)

### `learn_thresholds` (~97 tokens)

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.

Input parameters:

- `matchkey_name` (string): Optional: learn only for this matchkey.
- `path` (string): SQLite memory DB path. Default: .goldenmatch/memory.db

### `memory_stats` (~54 tokens)

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

Input parameters:

- `path` (string): SQLite memory DB path. Default: .goldenmatch/memory.db

### `memory_export` (~63 tokens)

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

Input parameters:

- `dataset` (string)
- `path` (string): SQLite memory DB path. Default: .goldenmatch/memory.db

### `memory_import` (~82 tokens)

Import corrections from a list of dicts (the exact shape memory_export returns). Upserts into the store: higher trust wins, same trust = latest wins. Returns the count imported.

Input parameters:

- `corrections` (array, required): Correction dicts, as returned by memory_export.
- `path` (string): SQLite memory DB path. Default: .goldenmatch/memory.db

### `identity_resolve` (~70 tokens)

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.

Input parameters:

- `path` (string): Identity DB path
- `record_id` (string, required): record id in `{source}:{source_pk}` form

### `identity_list` (~52 tokens)

List identities, optionally filtered by dataset/status.

Input parameters:

- `dataset` (string)
- `limit` (integer)
- `offset` (integer)
- `path` (string)
- `status` (string)

### `identity_history` (~39 tokens)

Return the temporal event log for an identity.

Input parameters:

- `entity_id` (string, required)
- `limit` (integer)
- `path` (string)

### `identity_conflicts` (~32 tokens)

List evidence edges marked `conflicts_with`.

Input parameters:

- `dataset` (string)
- `path` (string)

### `identity_merge` (~159 tokens)

Manually merge two identities. All records from `absorb_entity_id` are reassigned to `keep_entity_id`. The merge events are stamped with `actor`/`trust` provenance so the audit log records who merged these and on what authority.

Input parameters:

- `absorb_entity_id` (string, required)
- `actor` (string): Principal making the change, e.g. 'agent:claude' or 'steward:alice'. Defaults to 'agent'.
- `keep_entity_id` (string, required)
- `path` (string)
- `reason` (string)
- `trust` (number): Trust of the actor in [0,1]. Defaults by actor prefix (steward 1.0, agent 0.5).

### `identity_split` (~118 tokens)

Split a subset of records off an identity into a brand-new identity. The original keeps the remaining records. The split events carry `actor`/`trust` provenance.

Input parameters:

- `actor` (string): Principal making the change, e.g. 'agent:claude'. Defaults to 'agent'.
- `entity_id` (string, required)
- `path` (string)
- `reason` (string)
- `record_ids` (array, required)
- `trust` (number): Trust of the actor in [0,1]. Default by actor prefix.

### `identity_claim` (~133 tokens)

Claim a record into an identity, moving it out of any prior entity ('this record belongs to that identity'). Emits a provenance-stamped `claimed` event on both the gaining and losing entities.

Input parameters:

- `actor` (string): Principal, e.g. 'agent:claude'. Defaults to 'agent'.
- `entity_id` (string, required): Entity to claim the record into
- `path` (string)
- `reason` (string)
- `record_id` (string, required): record id in `{source}:{source_pk}` form
- `trust` (number): Trust in [0,1]. Default by actor prefix.

### `identity_resolve_conflict` (~186 tokens)

Adjudicate a `conflicts_with` pair: 'same' keeps the entity intact, 'distinct' splits the second record out into a new identity, 'defer' only logs. Records a durable mediation verdict + event with actor/trust provenance, and stops the conflict re-surfacing in the open-conflicts queue.

Input parameters:

- `actor` (string): Principal, e.g. 'steward:alice'. Defaults to 'agent'.
- `apply` (boolean): Act on the verdict (split on 'distinct'); false = log only.
- `dataset` (string)
- `path` (string)
- `reason` (string)
- `record_a_id` (string, required)
- `record_b_id` (string, required)
- `resolution` (string, required)
- `trust` (number): Trust in [0,1]. Default by actor prefix.

### `identity_audit` (~83 tokens)

Export the append-only identity audit log in commit order: every event with actor / trust / timestamp / reason, so a reviewer can reconstruct exactly which actor changed what, when, and why. Optionally filtered by dataset / actor.

Input parameters:

- `actor` (string)
- `dataset` (string)
- `limit` (integer)
- `path` (string)

### `identity_audit_seal` (~133 tokens)

Anchor the append-only audit log with a tamper-evidence seal: a chained sha256 root over every event since the last seal. Cheap and idempotent (a no-op when nothing new has been logged). Run it periodically (or after a batch of stewardship actions) so the history becomes provably untampered. Optionally scoped to a dataset. Publish/mirror the returned root_hash to make tampering detectable by an external party.

Input parameters:

- `actor` (string): Principal sealing the log. Defaults to 'agent'.
- `dataset` (string)
- `path` (string): Identity DB path

### `identity_audit_verify` (~99 tokens)

Verify the append-only audit log against its seal chain. Replays the per-event content hashes and the seal roots to detect content edits, deletion, reordering, and insertion of any sealed event. Returns {ok, events_checked, seals_checked} plus the ids of any content mismatches / broken seals / missing sealed events. Optionally scoped to a dataset.

Input parameters:

- `dataset` (string)
- `path` (string): Identity DB path

### `identity_show` (~69 tokens)

Fetch the full detail of one identity by entity_id: its member records, evidence edges, and recent event log. Returns {found: false} when no such entity exists.

Input parameters:

- `entity_id` (string, required)
- `event_limit` (integer)
- `path` (string): Identity DB path

### `identity_profile` (~74 tokens)

MDM profile of one entity: record count + per-source breakdown, golden record, confidence, conflict count, canonical version (structural-event count), and first/last activity. Returns {found: false} when no such entity exists.

Input parameters:

- `entity_id` (string, required)
- `path` (string): Identity DB path

### `identity_stats` (~63 tokens)

Graph-level summary / health stats: entities by status, total records, records-per-entity distribution, conflict total, source mix, and the largest entities. Optionally scoped to a dataset.

Input parameters:

- `dataset` (string)
- `path` (string): Identity DB path

### `identity_worklist` (~68 tokens)

Prioritized steward worklist: active entities needing attention (open conflicts and/or confidence below weak_confidence), highest conflict count first.

Input parameters:

- `dataset` (string)
- `limit` (integer)
- `path` (string): Identity DB path
- `weak_confidence` (number)

### `plan_routing` (~70 tokens)

Project per-stage distributed routing (scoring/clustering/golden) for a given data shape + cluster. Pure; no controller run.

Input parameters:

- `cluster` (object)
- `driver_mem_gb` (number)
- `estimated_pair_count` (integer, required)
- `n_rows` (integer, required)

### `explain_routing` (~67 tokens)

Human-readable explanation of why each stage is routed the way it is, with the driver-RAM projection that drove it.

Input parameters:

- `cluster` (object)
- `driver_mem_gb` (number)
- `estimated_pair_count` (integer, required)
- `n_rows` (integer, required)

### `lint_routing` (~89 tokens)

Flag config/env overrides that force a slow path (e.g. CLUSTERING_THRESHOLD=0 when the edge set fits driver RAM). ERROR at scale; would_refuse mirrors the runtime guard.

Input parameters:

- `cluster` (object)
- `driver_mem_gb` (number)
- `env` (object)
- `estimated_pair_count` (integer, required)
- `n_rows` (integer, required)

### `get_stats` (~24 tokens)

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

### `find_duplicates` (~69 tokens)

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

Input parameters:

- `record` (object, required): Record fields to match (e.g. {"name": "John Smith", "zip": "10001"})
- `top_k` (integer): Max results to return (default 5)

### `explain_match` (~45 tokens)

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

Input parameters:

- `record_a` (object, required): First record fields
- `record_b` (object, required): Second record fields

### `list_clusters` (~58 tokens)

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

Input parameters:

- `limit` (integer): Max clusters to return (default 20)
- `min_size` (integer): Minimum cluster size to include (default 2)

### `get_cluster` (~36 tokens)

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

Input parameters:

- `cluster_id` (integer, required): Cluster ID to look up

### `get_golden_record` (~32 tokens)

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

Input parameters:

- `cluster_id` (integer, required): Cluster ID

### `match_record` (~120 tokens)

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"}

Input parameters:

- `record` (object, required): Record fields to match against the dataset
- `threshold` (number): Minimum score to consider a match (default: use config threshold)
- `top_k` (integer): Max matches to return (default 5)

### `unmerge_record` (~58 tokens)

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.

Input parameters:

- `record_id` (integer, required): Row ID of the record to unmerge

### `shatter_cluster` (~44 tokens)

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

Input parameters:

- `cluster_id` (integer, required): Cluster ID to shatter

### `suggest_config` (~88 tokens)

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"}]

Input parameters:

- `bad_merges` (array, required): List of bad merge examples with record_a, record_b, and optional reason

### `review_config` (~84 tokens)

Run the config healer over the loaded dataset: analyze the dedupe run and return ranked, self-verified suggestions for improving the matching config (thresholds, scorers, negative evidence, blocking). Each suggestion carries an id, kind, target, rationale, and a machine-applicable patch. Requires the native kernel (pip install goldenmatch[native]); returns an empty list otherwise.

### `profile_data` (~25 tokens)

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

### `export_results` (~44 tokens)

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

Input parameters:

- `format` (string): Output format (default csv)
- `output_path` (string, required): File path to save results

### `list_domains` (~21 tokens)

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

### `create_domain` (~227 tokens)

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

Input parameters:

- `attribute_patterns` (object): Named regex patterns for domain attributes (e.g. {'size': '\\b(\\d+mm)\\b'})
- `brand_patterns` (array): Brand/manufacturer names to extract (e.g. ['Medtronic', 'Abbott'])
- `identifier_patterns` (object): Named regex patterns for domain identifiers (e.g. {'ndc': '\\b(\\d{5}-\\d{4}-\\d{2})\\b'})
- `name` (string, required): Domain name (e.g. 'medical_devices', 'automotive_parts')
- `scope` (string): Save locally (.goldenmatch/domains/) or globally (~/.goldenmatch/domains/). Default: local.
- `signals` (array, required): Column name keywords that trigger this domain (e.g. ['ndc', 'fda', 'implant'])
- `stop_words` (array): Words to strip during name normalization

### `test_domain` (~62 tokens)

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

Input parameters:

- `domain_name` (string, required): Name of the domain rulebook to test
- `sample_size` (integer): Number of records to test (default 10)

### `pprl_auto_config` (~76 tokens)

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

Input parameters:

- `security_level` (string): Security level (default: high)
- `use_llm` (boolean): Use LLM for enhanced recommendations (requires API key)

### `pprl_link` (~191 tokens)

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

Input parameters:

- `encoding` (string): Encoding of *_content (default base64)
- `fields` (array, required): Field names to match on (e.g. ['first_name', 'last_name', 'zip_code'])
- `file_a` (string): Path to party A's CSV file
- `file_a_content` (string): Alternative to file_a: base64/text bytes
- `file_a_name` (string)
- `file_b` (string): Path to party B's CSV file
- `file_b_content` (string): Alternative to file_b: base64/text bytes
- `file_b_name` (string)
- `security_level` (string)
- `threshold` (number): Match threshold (default: auto-detected)

### `evaluate` (~85 tokens)

Score the loaded run against ground-truth pairs. Loads a ground-truth CSV (id_a,id_b columns) and returns precision, recall, and F1 for the current clustering.

Input parameters:

- `col_a` (string)
- `col_b` (string)
- `ground_truth_path` (string, required): CSV of true match pairs (columns id_a,id_b or idA,idB).

### `analyze_blocking` (~79 tokens)

Diagnose blocking on the loaded dataset: returns ranked blocking key candidates with block counts, max block size, total candidate comparisons, and estimated recall. Use it to explain why matching is slow or produces too many candidate pairs.

Input parameters:

- `limit` (integer): Top N suggestions
- `sample_size` (integer)
- `target_block_size` (integer)

### `compare_clusters` (~171 tokens)

Compare two ER clustering outcomes on the same dataset without ground truth (CCMS): classifies each cluster as unchanged / merged / partitioned / overlapping and returns the Talburt-Wang Index. Both inputs are JSON cluster files (as written by export-style output).

Input parameters:

- `clusters_a_content` (string): Alternative to clusters_a_path: base64/text bytes (JSON, use encoding='text')
- `clusters_a_name` (string)
- `clusters_a_path` (string): Baseline clusters JSON
- `clusters_b_content` (string): Alternative to clusters_b_path: base64/text bytes (JSON, use encoding='text')
- `clusters_b_name` (string)
- `clusters_b_path` (string): Comparison clusters JSON
- `encoding` (string): Encoding of *_content (default base64)

### `schema_match` (~142 tokens)

Auto-map columns between two files with different schemas. Returns proposed (col_a, col_b) mappings with a confidence score and method (synonym / name_sim / composite). Useful before matching two sources.

Input parameters:

- `encoding` (string): Encoding of *_content (default base64)
- `file_a` (string)
- `file_a_content` (string): Alternative to file_a: base64/text bytes
- `file_a_name` (string)
- `file_b` (string)
- `file_b_content` (string): Alternative to file_b: base64/text bytes
- `file_b_name` (string)
- `min_score` (number)

### `lineage` (~82 tokens)

Field-level provenance for the loaded run: for each scored pair, the per-field scores that produced the match, plus cluster id. Optionally write a lineage JSON to a directory.

Input parameters:

- `max_pairs` (integer)
- `natural_language` (boolean)
- `output_dir` (string): If set, write lineage JSON here and return the path instead of inline records.

### `list_runs` (~32 tokens)

List previous dedupe/match runs (for rollback) from the run log.

Input parameters:

- `output_dir` (string)

### `rollback` (~66 tokens)

Undo a previous run by DELETING its output files (looked up by run_id in the run log). Destructive: removes the files that run wrote. Use list_runs first to find the run_id.

Input parameters:

- `output_dir` (string)
- `run_id` (string, required)

### `config_weaknesses` (~117 tokens)

Diagnose weaknesses in the loaded run's auto-config: columns admitted that shouldn't be (source/provenance labels, per-row IDs), oversized or shared-value blocks, null sinks, low-signal matchkeys, and over-merging. Returns ranked findings, each with a plain-English explanation + a concrete fix, plus a one-paragraph summary.

Input parameters:

- `max_findings` (integer): Max findings to return, ranked by severity (default 6).
- `phrasing` (string): Wording style for the findings (default plain).

### `dedupe` (~75 tokens)

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

Input parameters:

- `record` (object, required): Record fields to match (e.g. {"name": "John Smith", "zip": "10001"})
- `top_k` (integer): Max results to return (default 5)

### `match` (~125 tokens)

Alias for `match_record`. 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"}

Input parameters:

- `record` (object, required): Record fields to match against the dataset
- `threshold` (number): Minimum score to consider a match (default: use config threshold)
- `top_k` (integer): Max matches to return (default 5)

### `explain_pair` (~52 tokens)

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

Input parameters:

- `record_a` (object, required): First record fields
- `record_b` (object, required): Second record fields

### `profile` (~30 tokens)

Alias for `profile_data`. Get data quality profile: column types, null rates, unique counts, sample values.

### `explain_cluster` (~33 tokens)

Alias for `agent_explain_cluster`. Explain why records are in the same cluster

Input parameters:

- `cluster_id` (integer, required)

### `documents_suggest_schema` (~49 tokens)

Propose a target extraction schema (JSON) from a sample document image/PDF.

Input parameters:

- `backend` (string)
- `model` (string)
- `sample_path` (string, required)

### `documents_ingest` (~94 tokens)

Extract records from documents (PDF/image) against a target schema into rows ready for dedupe_df. Returns records + an ingest report.

Input parameters:

- `backend` (string)
- `drop_empty` (boolean)
- `model` (string)
- `out_path` (string): optional CSV/parquet to also write
- `paths` (array, required)
- `schema` (object, required): schema JSON: {'fields':[...]}

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/benseverndev-oss-goldenmatch/goldenmatch-mcp-production#diagnostics

## Score history

- 2026-08-03: 66
- 2026-08-02: 65
- 2026-08-01: 65
- 2026-07-31: 64
- 2026-07-30: 64
- 2026-07-29: 63
- 2026-07-28: 63
- 2026-07-27: 62
- 2026-07-26: 61

## Links

- Remote endpoint: https://goldenmatch-mcp-production.up.railway.app/mcp/
- Repository: https://github.com/benseverndev-oss/goldenmatch
- Website: https://docs.bensevern.dev/
- Changelog RSS feed: https://verifymcp.io/servers/benseverndev-oss-goldenmatch/goldenmatch-mcp-production/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/benseverndev-oss-goldenmatch/goldenmatch-mcp-production/changelog.json
- HTML version of this page: https://verifymcp.io/servers/benseverndev-oss-goldenmatch/goldenmatch-mcp-production
