{"serverId":"mcp-registry/io.github.benseverndev-oss/goldenmatch","tools":[{"name":"add_correction","fixed":{"name":"add_correction","description":"Add a Learning Memory correction. Two shapes:\n  - pair-level: decision='approve' or 'reject', requires id_a + id_b\n  - field-level (v1.18.2+): decision='field_correct', requires cluster_id + field_name + corrected_value\nSource is 'agent' with trust=0.5 (lower than human steward 1.0). Pair (id_a, id_b) is canonicalized to (min, max) before storage.","inputSchema":{"type":"object","required":["decision","dataset"],"properties":{"id_a":{"type":"integer","description":"Pair-level: first row id. Field-level: ignored."},"id_b":{"type":"integer","description":"Pair-level: second row id. Field-level: ignored."},"path":{"type":"string","description":"SQLite memory DB path. Default: .goldenmatch/memory.db"},"reason":{"type":"string"},"dataset":{"type":"string","description":"Dataset identifier (e.g. file path). Required, non-empty."},"decision":{"enum":["approve","reject","field_correct"],"type":"string"},"cluster_id":{"type":"integer","description":"Field-level: cluster_id the correction targets."},"field_name":{"type":"string","description":"Field-level: the column being corrected."},"matchkey_name":{"type":"string"},"original_value":{"type":"string","description":"Field-level: the value build_golden_record chose."},"corrected_value":{"type":"string","description":"Field-level: the value the reviewer changed it to."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":383,"tokensAfter":383},{"name":"agent_approve_reject","fixed":{"name":"agent_approve_reject","description":"Approve or reject a review queue pair","inputSchema":{"type":"object","required":["job_name","id_a","id_b","decision","decided_by"],"properties":{"id_a":{"type":"integer"},"id_b":{"type":"integer"},"reason":{"type":"string"},"decision":{"type":"string"},"job_name":{"type":"string"},"decided_by":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":101,"tokensAfter":101},{"name":"agent_compare_strategies","fixed":{"name":"agent_compare_strategies","description":"Compare ER strategies on your data","inputSchema":{"type":"object","required":[],"properties":{"encoding":{"enum":["base64","text"],"type":"string","description":"Encoding of *_content (default base64)"},"filename":{"type":"string","description":"Original filename when using file_content"},"file_path":{"type":"string"},"file_content":{"type":"string","description":"Alternative to file_path: file bytes (base64 default, or raw with encoding='text')"},"ground_truth":{"type":"string"},"ground_truth_name":{"type":"string"},"ground_truth_content":{"type":"string","description":"Alternative to ground_truth: base64/text bytes"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":189,"tokensAfter":189},{"name":"agent_explain_cluster","fixed":{"name":"agent_explain_cluster","description":"Explain why records are in the same cluster","inputSchema":{"type":"object","required":["cluster_id"],"properties":{"cluster_id":{"type":"integer"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":55,"tokensAfter":55},{"name":"agent_explain_pair","fixed":{"name":"agent_explain_pair","description":"Natural language explanation for a record pair","inputSchema":{"type":"object","required":["record_a","record_b"],"properties":{"exact":{"type":"array"},"fuzzy":{"type":"object"},"record_a":{"type":"object"},"record_b":{"type":"object"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":79,"tokensAfter":79},{"name":"analyze_blocking","fixed":{"name":"analyze_blocking","description":"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.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":10,"description":"Top N suggestions"},"sample_size":{"type":"integer","default":1000},"target_block_size":{"type":"integer","default":5000}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":142,"tokensAfter":142},{"name":"analyze_data","fixed":{"name":"analyze_data","description":"Profile data, detect domain, recommend ER strategy","inputSchema":{"type":"object","required":[],"properties":{"encoding":{"enum":["base64","text"],"type":"string","description":"Encoding of *_content (default base64)"},"filename":{"type":"string","description":"Original filename when using file_content"},"file_path":{"type":"string"},"file_content":{"type":"string","description":"Alternative to file_path: file bytes (base64 default, or raw with encoding='text')"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":142,"tokensAfter":142},{"name":"compare_clusters","fixed":{"name":"compare_clusters","description":"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).","inputSchema":{"type":"object","required":[],"properties":{"encoding":{"enum":["base64","text"],"type":"string","description":"Encoding of *_content (default base64)"},"clusters_a_name":{"type":"string"},"clusters_a_path":{"type":"string","description":"Baseline clusters JSON"},"clusters_b_name":{"type":"string"},"clusters_b_path":{"type":"string","description":"Comparison clusters JSON"},"clusters_a_content":{"type":"string","description":"Alternative to clusters_a_path: base64/text bytes (JSON, use encoding='text')"},"clusters_b_content":{"type":"string","description":"Alternative to clusters_b_path: base64/text bytes (JSON, use encoding='text')"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":270,"tokensAfter":270},{"name":"create_domain","fixed":{"name":"create_domain","description":"Create a custom domain extraction rulebook. Define patterns for a specific data domain (medical devices, automotive parts, real estate, etc.).","inputSchema":{"type":"object","required":["name","signals"],"properties":{"name":{"type":"string","description":"Domain name (e.g. 'medical_devices', 'automotive_parts')"},"scope":{"enum":["local","global"],"type":"string","default":"local","description":"Save locally (.goldenmatch/domains/) or globally (~/.goldenmatch/domains/). Default: local."},"signals":{"type":"array","items":{"type":"string"},"description":"Column name keywords that trigger this domain (e.g. ['ndc', 'fda', 'implant'])"},"stop_words":{"type":"array","items":{"type":"string"},"description":"Words to strip during name normalization"},"brand_patterns":{"type":"array","items":{"type":"string"},"description":"Brand/manufacturer names to extract (e.g. ['Medtronic', 'Abbott'])"},"attribute_patterns":{"type":"object","description":"Named regex patterns for domain attributes (e.g. {'size': '\\\\b(\\\\d+mm)\\\\b'})"},"identifier_patterns":{"type":"object","description":"Named regex patterns for domain identifiers (e.g. {'ndc': '\\\\b(\\\\d{5}-\\\\d{4}-\\\\d{2})\\\\b'})"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":344,"tokensAfter":344},{"name":"explain_cluster","fixed":{"name":"explain_cluster","description":"Alias for `agent_explain_cluster`. Explain why records are in the same cluster","inputSchema":{"type":"object","required":["cluster_id"],"properties":{"cluster_id":{"type":"integer"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":63,"tokensAfter":63},{"name":"explain_match","fixed":{"name":"explain_match","description":"Explain why two records match or don't match. Shows per-field score breakdown.","inputSchema":{"type":"object","required":["record_a","record_b"],"properties":{"record_a":{"type":"object","description":"First record fields"},"record_b":{"type":"object","description":"Second record fields"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":93,"tokensAfter":93},{"name":"explain_pair","fixed":{"name":"explain_pair","description":"Alias for `explain_match`. Explain why two records match or don't match. Shows per-field score breakdown.","inputSchema":{"type":"object","required":["record_a","record_b"],"properties":{"record_a":{"type":"object","description":"First record fields"},"record_b":{"type":"object","description":"Second record fields"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":100,"tokensAfter":100},{"name":"explain_routing","fixed":{"name":"explain_routing","description":"Human-readable explanation of why each stage is routed the way it is, with the driver-RAM projection that drove it.","inputSchema":{"type":"object","required":["n_rows","estimated_pair_count"],"properties":{"n_rows":{"type":"integer"},"cluster":{"type":"object","properties":{"num_nodes":{"type":"integer"},"total_cpus":{"type":"integer"},"driver_mem_gb":{"type":"number"},"cluster_mem_gb":{"type":"number"}}},"driver_mem_gb":{"type":"number"},"estimated_pair_count":{"type":"integer"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":147,"tokensAfter":147},{"name":"export_results","fixed":{"name":"export_results","description":"Export matching results to a file (CSV or JSON).","inputSchema":{"type":"object","required":["output_path"],"properties":{"format":{"enum":["csv","json"],"type":"string","default":"csv","description":"Output format (default csv)"},"output_path":{"type":"string","description":"File path to save results"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":97,"tokensAfter":97},{"name":"find_duplicates","fixed":{"name":"find_duplicates","description":"Find duplicate matches for a record. Provide field values to search against the loaded dataset.","inputSchema":{"type":"object","required":["record"],"properties":{"top_k":{"type":"integer","default":5,"description":"Max results to return (default 5)"},"record":{"type":"object","description":"Record fields to match (e.g. {\"name\": \"John Smith\", \"zip\": \"10001\"})"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":116,"tokensAfter":116},{"name":"get_cluster","fixed":{"name":"get_cluster","description":"Get details of a specific cluster: all member records and their field values.","inputSchema":{"type":"object","required":["cluster_id"],"properties":{"cluster_id":{"type":"integer","description":"Cluster ID to look up"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":72,"tokensAfter":72},{"name":"get_golden_record","fixed":{"name":"get_golden_record","description":"Get the merged golden (canonical) record for a cluster.","inputSchema":{"type":"object","required":["cluster_id"],"properties":{"cluster_id":{"type":"integer","description":"Cluster ID"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":65,"tokensAfter":65},{"name":"get_stats","fixed":{"name":"get_stats","description":"Get dataset statistics: record count, cluster count, match rate, cluster sizes.","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":46,"tokensAfter":46},{"name":"identity_list","fixed":{"name":"identity_list","description":"List identities, optionally filtered by dataset/status.","inputSchema":{"type":"object","properties":{"path":{"type":"string"},"limit":{"type":"integer","default":50},"offset":{"type":"integer","default":0},"status":{"type":"string"},"dataset":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":85,"tokensAfter":85},{"name":"identity_merge","fixed":{"name":"identity_merge","description":"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.","inputSchema":{"type":"object","required":["keep_entity_id","absorb_entity_id"],"properties":{"path":{"type":"string"},"actor":{"type":"string","description":"Principal making the change, e.g. 'agent:claude' or 'steward:alice'. Defaults to 'agent'."},"trust":{"type":"number","description":"Trust of the actor in [0,1]. Defaults by actor prefix (steward 1.0, agent 0.5)."},"reason":{"type":"string"},"keep_entity_id":{"type":"string"},"absorb_entity_id":{"type":"string"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":207,"tokensAfter":207},{"name":"identity_resolve","fixed":{"name":"identity_resolve","description":"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.","inputSchema":{"type":"object","required":["record_id"],"properties":{"path":{"type":"string","description":"Identity DB path"},"record_id":{"type":"string","description":"record id in `{source}:{source_pk}` form"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":119,"tokensAfter":119},{"name":"identity_resolve_conflict","fixed":{"name":"identity_resolve_conflict","description":"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.","inputSchema":{"type":"object","required":["record_a_id","record_b_id","resolution"],"properties":{"path":{"type":"string"},"actor":{"type":"string","description":"Principal, e.g. 'steward:alice'. Defaults to 'agent'."},"apply":{"type":"boolean","default":true,"description":"Act on the verdict (split on 'distinct'); false = log only."},"trust":{"type":"number","description":"Trust in [0,1]. Default by actor prefix."},"reason":{"type":"string"},"dataset":{"type":"string"},"resolution":{"enum":["same","distinct","defer"],"type":"string"},"record_a_id":{"type":"string"},"record_b_id":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":263,"tokensAfter":263},{"name":"identity_show","fixed":{"name":"identity_show","description":"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.","inputSchema":{"type":"object","required":["entity_id"],"properties":{"path":{"type":"string","description":"Identity DB path"},"entity_id":{"type":"string"},"event_limit":{"type":"integer","default":100}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":114,"tokensAfter":114},{"name":"identity_stats","fixed":{"name":"identity_stats","description":"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.","inputSchema":{"type":"object","properties":{"path":{"type":"string","description":"Identity DB path"},"dataset":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":102,"tokensAfter":102},{"name":"lint_routing","fixed":{"name":"lint_routing","description":"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.","inputSchema":{"type":"object","required":["n_rows","estimated_pair_count"],"properties":{"env":{"type":"object"},"n_rows":{"type":"integer"},"cluster":{"type":"object","properties":{"num_nodes":{"type":"integer"},"total_cpus":{"type":"integer"},"driver_mem_gb":{"type":"number"},"cluster_mem_gb":{"type":"number"}}},"driver_mem_gb":{"type":"number"},"estimated_pair_count":{"type":"integer"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":168,"tokensAfter":168},{"name":"list_clusters","fixed":{"name":"list_clusters","description":"List duplicate clusters found in the dataset. Returns cluster IDs, sizes, and member counts.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":20,"description":"Max clusters to return (default 20)"},"min_size":{"type":"integer","default":2,"description":"Minimum cluster size to include (default 2)"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":104,"tokensAfter":104},{"name":"list_corrections","fixed":{"name":"list_corrections","description":"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.","inputSchema":{"type":"object","properties":{"path":{"type":"string","description":"SQLite memory DB path. Default: .goldenmatch/memory.db"},"dataset":{"type":"string","description":"Optional dataset filter (e.g. file path)."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":125,"tokensAfter":125},{"name":"list_domains","fixed":{"name":"list_domains","description":"List available domain extraction rulebooks (built-in + user-defined).","inputSchema":{"type":"object","properties":{}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":44,"tokensAfter":44},{"name":"list_plugins","fixed":{"name":"list_plugins","description":"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.","inputSchema":{"type":"object","properties":{"category":{"enum":["all","golden_strategy","scorer","transform","connector"],"type":"string","default":"all"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":144,"tokensAfter":144},{"name":"list_runs","fixed":{"name":"list_runs","description":"List previous dedupe/match runs (for rollback) from the run log.","inputSchema":{"type":"object","properties":{"output_dir":{"type":"string","default":"."}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":54,"tokensAfter":54},{"name":"memory_export","fixed":{"name":"memory_export","description":"Return all corrections as a list of dicts (CSV-shaped). Caller is responsible for writing the file. Optionally filter by dataset.","inputSchema":{"type":"object","properties":{"path":{"type":"string","description":"SQLite memory DB path. Default: .goldenmatch/memory.db"},"dataset":{"type":"string"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":95,"tokensAfter":95},{"name":"memory_import","fixed":{"name":"memory_import","description":"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.","inputSchema":{"type":"object","required":["corrections"],"properties":{"path":{"type":"string","description":"SQLite memory DB path. Default: .goldenmatch/memory.db"},"corrections":{"type":"array","items":{"type":"object"},"description":"Correction dicts, as returned by memory_export."}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":142,"tokensAfter":142},{"name":"memory_stats","fixed":{"name":"memory_stats","description":"Return Learning Memory status: total correction count, last learn time, and current learned adjustments. Cheap; safe for status checks.","inputSchema":{"type":"object","properties":{"path":{"type":"string","description":"SQLite memory DB path. Default: .goldenmatch/memory.db"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":89,"tokensAfter":89},{"name":"retrieve_similar","fixed":{"name":"retrieve_similar","description":"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.","inputSchema":{"type":"object","required":["query","column"],"properties":{"k":{"type":"integer","description":"Max records to return (default 20)"},"model":{"type":"string","description":"Embedder id (default 'inhouse' -- local, deterministic, no cloud/torch). Also 'all-MiniLM-L6-v2', a Vertex/OpenAI model, etc."},"query":{"type":"string","description":"Free-text query to search for"},"column":{"type":"string","description":"Column of the corpus to embed + search"},"filters":{"type":"object","description":"Optional {column: value} equality pre-filter applied before embedding"},"encoding":{"enum":["base64","text"],"type":"string","description":"Encoding of *_content (default base64)"},"filename":{"type":"string","description":"Original filename when using file_content"},"file_path":{"type":"string","description":"CSV/Parquet corpus to search"},"threshold":{"type":"number","description":"Minimum cosine similarity in [-1, 1] (default 0.0)"},"file_content":{"type":"string","description":"Alternative to file_path: file bytes (base64 default, or raw with encoding='text')"}}},"annotations":{"readOnlyHint":true}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":417,"tokensAfter":417},{"name":"run_transforms","fixed":{"name":"run_transforms","description":"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]","inputSchema":{"type":"object","required":[],"properties":{"encoding":{"enum":["base64","text"],"type":"string","description":"Encoding of *_content (default base64)"},"filename":{"type":"string","description":"Original filename when using file_content"},"file_path":{"type":"string","description":"Path to the CSV file to transform"},"output_path":{"type":"string","description":"Optional path to save the transformed CSV. If omitted, returns summary only."},"file_content":{"type":"string","description":"Alternative to file_path: file bytes (base64 default, or raw with encoding='text')"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":242,"tokensAfter":242},{"name":"upload_dataset","fixed":{"name":"upload_dataset","description":"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.","inputSchema":{"type":"object","required":["file_content","filename"],"properties":{"encoding":{"enum":["base64","text"],"type":"string","description":"Encoding of file_content (default base64)"},"filename":{"type":"string","description":"Original filename (extension preserved for format sniffing)"},"file_content":{"type":"string","description":"File bytes, base64-encoded (or raw text with encoding='text')"}}},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false}},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":261,"tokensAfter":261}],"toolsChanged":36,"tokensSaved":0,"todo":[{"tool":"add_correction","params":["reason","decision","matchkey_name"]},{"tool":"agent_approve_reject","params":["id_a","id_b","reason","decision","job_name","decided_by"]},{"tool":"agent_compare_strategies","params":["file_path","ground_truth","ground_truth_name"]},{"tool":"agent_deduplicate","params":["config","file_path"]},{"tool":"agent_explain_cluster","params":["cluster_id"]},{"tool":"agent_explain_pair","params":["exact","fuzzy","record_a","record_b"]},{"tool":"agent_match_sources","params":["config","file_a","file_b","file_a_name","file_b_name"]},{"tool":"agent_review_queue","params":["job_name"]},{"tool":"analyze_blocking","params":["sample_size","target_block_size"]},{"tool":"analyze_data","params":["file_path"]},{"tool":"auto_configure","params":["file_path","constraints"]},{"tool":"compare_clusters","params":["clusters_a_name","clusters_b_name"]},{"tool":"documents_ingest","params":["model","paths","backend","drop_empty"]},{"tool":"documents_suggest_schema","params":["model","backend","sample_path"]},{"tool":"evaluate","params":["col_a","col_b"]},{"tool":"explain_cluster","params":["cluster_id"]},{"tool":"explain_routing","params":["n_rows","cluster","driver_mem_gb","estimated_pair_count"]},{"tool":"identity_audit","params":["path","actor","limit","dataset"]},{"tool":"identity_audit_seal","params":["dataset"]},{"tool":"identity_audit_verify","params":["dataset"]},{"tool":"identity_claim","params":["path","reason"]},{"tool":"identity_conflicts","params":["path","dataset"]},{"tool":"identity_history","params":["path","limit","entity_id"]},{"tool":"identity_list","params":["path","limit","offset","status","dataset"]},{"tool":"identity_merge","params":["path","reason","keep_entity_id","absorb_entity_id"]},{"tool":"identity_profile","params":["entity_id"]},{"tool":"identity_resolve_conflict","params":["path","reason","dataset","resolution","record_a_id","record_b_id"]},{"tool":"identity_show","params":["entity_id","event_limit"]},{"tool":"identity_split","params":["path","reason","entity_id","record_ids"]},{"tool":"identity_stats","params":["dataset"]},{"tool":"identity_worklist","params":["limit","dataset","weak_confidence"]},{"tool":"incremental","params":["base_file_name","new_records_name"]},{"tool":"lineage","params":["max_pairs","natural_language"]},{"tool":"lint_routing","params":["env","n_rows","cluster","driver_mem_gb","estimated_pair_count"]},{"tool":"list_plugins","params":["category"]},{"tool":"list_runs","params":["output_dir"]},{"tool":"memory_export","params":["dataset"]},{"tool":"plan_routing","params":["n_rows","cluster","driver_mem_gb","estimated_pair_count"]},{"tool":"pprl_link","params":["file_a_name","file_b_name","security_level"]},{"tool":"rollback","params":["run_id","output_dir"]},{"tool":"schema_match","params":["file_a","file_b","min_score","file_a_name","file_b_name"]},{"tool":"suggest_pprl","params":["file_path"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}