# Senzing (remote · mcp.senzing.com)

Entity resolution — data mapping, SDK code generation, docs search, and error troubleshooting

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

> **Recent critical change**: Authorization (2026-08-03). See the changelog below before you install this server.

## Components

- remote · `mcp.senzing.com`: 65/100 (this document), [markdown](https://verifymcp.io/servers/com-senzing-mcp/mcp.md), [page](https://verifymcp.io/servers/com-senzing-mcp/mcp)

## Channel facts

- Endpoint: `https://mcp.senzing.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.32.4`

## 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 check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (submit_feedback).
  - 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**: 70/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).
  - Context-footprint check failed: tool/resource definitions use about 4740 tokens (~316/item across 15 items; 13 tools + 2 resources), over budget; trim descriptions and params.
  - 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**: 95/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 85% 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 com-senzing-mcp https://mcp.senzing.com/mcp
```

### Codex

```toml
[mcp_servers.com-senzing-mcp]
url = "https://mcp.senzing.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-senzing-mcp": {
      "type": "remote",
      "url": "https://mcp.senzing.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-senzing-mcp --url https://mcp.senzing.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-senzing-mcp:
    url: "https://mcp.senzing.com/mcp"
```

### Other

```json
{
  "mcpServers": {
    "com-senzing-mcp": {
      "type": "http",
      "url": "https://mcp.senzing.com/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 65, 0)

- [critical regression] Authorization: unverified → fail
- [security regression] HSTS header: unverified → fail

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

- [security regression] Authorization: fail → unverified
- [security regression] HSTS header: fail → unverified

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

- [security] The server rewrote its instructions, which are the text every model session reads
- [functional] MCP protocol: Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

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

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

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

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

### 2026-07-28 (score 61, 0)

- [security] Tool “mapping_workflow” rewrote its description, which is the text the model reads

### 2026-07-27 (score 61, +4)

- [functional improvement] Stability: unverified → 0.03
- [functional improvement] MCP protocol: fail → pass
- [functional] MCP protocol version: 2025-03-26 → 2025-11-25
- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server
- [functional] Server version: 1.8.0 → 2.2.0

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

First indexed and scored.

## MCP tools (13)

### `analyze_record` (~383 tokens)

Get the Senzing JSON analyzer script to validate mapped data files client-side. REQUIRED: `workspace_dir` (writable directory, e.g. ~/sz-workspace) — the call WILL FAIL without it.

The analyzer validates records against the Entity Specification, examines feature distribution, attribute coverage, and data quality. Returns a Python script (no dependencies) with instructions. No source data is sent to the server.

Typical workspace_dir values: Linux `/tmp` or `~/sz-workspace`; macOS `~/sz-workspace`; sandboxed envs: explicit path under home (do NOT assume /tmp exists).

Input parameters:

- `file_paths` (array|null): File paths to analyze (Senzing JSON or JSONL files). Commands will be generated for each path.
- `version` (string): Senzing version (default: "current").
- `workspace_dir` (string, required): REQUIRED: Workspace directory for the analyzer script and any generated reports. Must be a writable absolute or relative path that already exists in your environment. Do NOT assume `/tmp` exists — so…

### `download_resource` (~255 tokens)

Download workflow resources by name. Pass `filename` (string) or `filenames` (array); calling with neither returns the list of available resources (it does not fail).

Available: sz_json_analyzer.py, sz_schema_generator.py, sz_verbatim_check.py, sz_routing_report.py, senzing_entity_specification.md, senzing_mapping_examples.md, identifier_crosswalk.json

Each resource is returned with a fetch instruction — use it exactly as given. Supports batch via `filenames` array.

If a previously-known fetch instruction stops working, call this tool again to obtain the current one.

Input parameters:

- `filename` (string|null): Resource filename to retrieve (e.g. "sz_json_analyzer.py", "senzing_entity_specification.md"). Ignored when `filenames` is provided.
- `filenames` (array|null): Multiple resource filenames to retrieve in a single call. Takes precedence over `filename` when provided.
- `inline` (boolean|null): Returns resource content inline instead of URLs. ALWAYS try with inline=false (default) first — only set inline=true if the URL fetch fails. Inline responses consume more context tokens.
- `version` (string): Senzing version (default: "current").

### `explain_error_code` (~73 tokens)

Explain a Senzing error code with causes and resolution steps. Accepts formats: SENZ0005, SENZ-0005, 0005, or just 5. Returns error class, common causes, and specific resolution guidance

Input parameters:

- `error_code` (string, required)
- `version` (string)

### `find_examples` (~365 tokens)

Find working SOURCE CODE examples from 37 indexed Senzing GitHub repositories. REQUIRED: either `query` (string, for search) or `repo` with `file_path` or `list_files=true` — the call WILL FAIL without one.

Three modes: (1) Search: pass `query` to find examples across all repos, (2) File listing: pass `repo` + `list_files=true`, (3) File retrieval: pass `repo` + `file_path`.

Indexes source code (.py, .java, .cs, .rs) and READMEs — NOT build/data files. For sample data, use get_sample_data. Covers Python, Java, C#, Rust SDK patterns: initialization, ingestion, search, redo, configuration, message queues, REST APIs. Use max_lines to limit large files. Returns GitHub raw URLs for file retrieval.

Input parameters:

- `file_path` (string|null): Return full content of a specific file in the repo (requires repo parameter)
- `language` (string|null): Filter results by programming language (e.g. "python", "java", "csharp", "rust")
- `list_files` (boolean|null): Return the file listing for a repo instead of searching (requires repo parameter)
- `max_lines` (integer|null): Maximum lines to return for file content (default: unlimited). Useful for large files.
- `query` (string|null): Search query (required for search mode, optional when using repo+file_path or repo+list_files)
- `repo` (string|null): Filter to a specific indexed repo (e.g. "brianmacy/sz_mem-v4"). When combined with file_path, returns full file content. When combined with list_files, returns file listing.

### `generate_scaffold` (~318 tokens)

Generate SDK scaffold code for common workflows. Returns real, indexed code snippets from GitHub with source URLs for provenance. Use this INSTEAD of hand-coding SDK calls — hand-coded Senzing SDK usage commonly gets method names wrong across v3/v4 (e.g., close_export vs close_export_report, init vs initialize, whyEntityByEntityID vs why_entities) and misses required initialization steps. Languages: python, java, csharp, rust. Workflows: initialize, configure, add_records, delete, query, redo, stewardship, information, full_pipeline (aliases accepted: init, config, ingest, remove, search, redoer, force_resolve, info, e2e). V3 supports Python and Java only. Returns GitHub raw URLs — fetch each snippet to read the source code.

Input parameters:

- `language` (string, required): Programming language: python, java, csharp (or c#, cs, dotnet), rust (or rs), typescript (or ts, node, nodejs, javascript, js)
- `version` (string): Senzing version: "4.0", "current", or "3.x". V3 supports Python and Java only
- `workflow` (string, required): Workflow to scaffold: initialize, configure, add_records, delete, query, redo, stewardship, information, error_handling, full_pipeline. Aliases accepted (e.g. init, config, ingest, remove, search, re…

### `get_capabilities` (~122 tokens)

Get server version, capabilities overview, available tools, suggested workflows, and getting started guidance. Returns server_info with name, version, and Senzing version. Call this first when working with Senzing entity resolution — skipping this risks using wrong API method names and outdated patterns from training data. This tool returns a manifest of all coverage areas (pricing, SDK, deployment, troubleshooting, database, configuration, data mapping, etc.) — use it to triage which Senzing MCP tool to call before going to external sources

Input parameters:

- `version` (string)

### `get_sample_data` (~375 tokens)

Get real sample data for entity resolution. Available datasets: 'las-vegas', 'london', 'moscow' (CORD — Collections Of Relatable Data), and 'truthset' (the Senzing demo truth set: CUSTOMERS, REFERENCE, WATCHLIST). Use dataset='list' to discover datasets, source='list' to see the sources/vendors within a dataset. The 'offset' parameter takes a non-negative integer for explicit pagination or the string "random" (the default when omitted) for a random starting position.

IMPORTANT: This is REAL data (not synthetic) — historical snapshots for evaluation only, not operational use. Always inform the user of this.

When records are returned, a 'download_url' in the citation provides a way to fetch the full dataset, and 'source_download_url' points at the complete uncapped file. Always present the fetch instruction to the user exactly as given. Do NOT download it yourself or dump raw records into the conversation — the inline records are a small preview of the data shape.

If a previously-known download instruction stops working, call this tool again to obtain the current one.

Input parameters:

- `dataset` (string, required): Dataset name (e.g., "las-vegas", "london", "moscow"). Use "list" to discover available datasets and their sources. (Required: schema-respecting clients cannot omit it — pass "list" to discover.)
- `limit` (integer|null)
- `offset`: Record offset. Use a number for explicit pagination, or "random" for a random starting position. Omit for random.
- `source` (string|null): Filter by data source/vendor within a dataset (e.g., "equifax", "ppp_loans"). Omit to see all sources. Use "list" to list available sources.

### `get_sdk_reference` (~548 tokens)

Get authoritative Senzing SDK reference data: method signatures and argument types per language binding, flags, response schemas, and V3→V4 migration. Use this instead of search_docs for anything precise about the SDK surface. Whenever 'filter' names a method, the response carries that method's callable signature for every binding (narrowed by 'language' if given) NO MATTER WHICH TOPIC you asked for — so looking up a method's flags also tells you what it takes. Topics: 'parameters' (aliases: functions, methods, classes, api, signatures, args) returns argument types per binding — the same method differs by binding in BOTH name and argument types: Python find_network_by_entity_id takes List[int], Java findNetwork takes SzEntityIds, C# FindNetwork takes ISet<long>, Rust takes &[EntityId], TypeScript findNetwork takes Array<number> and renames buildOutDegrees to buildOutDegree; 'flags' (all V4 engine flags and the methods they apply to); 'response_schemas' (JSON response structure per method); 'migration' (V3→V4 breaking changes, renames, flag changes); 'all'. 'filter' accepts any spelling — 'get entity', 'get_entity', and 'getEntity' all resolve. Pass 'language' (python/java/csharp/rust/typescript) to narrow to your binding; cross-binding divergence warnings are still included so you never translate a call between bindings by mistake

Input parameters:

- `filter` (string|null): Optional filter: method name, class name, module name, or flag name. Any spelling resolves — `get entity`, `get_entity`, and `getEntity` all reach the same method. Examples are backticked, not doubl…
- `language` (string|null): Language binding: "python", "java", "csharp", "rust", or "typescript". Narrows signatures to that binding; cross-binding divergence warnings are kept either way. Omit to compare every binding side by…
- `topic` (string, required): Topic: "parameters" (aliases: functions, methods, classes, api, signatures, args), "flags", "response_schemas", "migration", or "all". You do not need "parameters" just to see a signature: any topic…
- `version` (string): Senzing version (default: "current")

### `mapping_workflow` (~611 tokens)

Map source data to Senzing JSON through a guided 8-step workflow. Use this INSTEAD of hand-coding Senzing JSON.

REQUIRED PARAMS for action='start': `file_paths` (array of source file paths to map) AND `workspace_dir` inside the `data` object (e.g. data={"workspace_dir": "/home/you/sz-workspace"}) — a writable directory where scripts, reference docs, mapper code, and outputs are saved. Do NOT assume /tmp exists (some environments like Kiro do not provide it). The call WILL FAIL without both.

Actions: start, advance, back, status, reset. Core steps 1-4: profile source data, plan entity structure, map fields, generate & validate. Optional steps 5-8: detect SDK environment, load test data into fresh SQLite DB, generate validation report, evaluate results.

STATE: Every response returns a 'state' JSON object. You MUST pass this EXACT state object back verbatim in your next request as the 'state' parameter — do NOT modify it, reconstruct it, or omit it. The state is opaque and managed by the server. If you have lost the state, call with action='start' instead.

Common errors: (1) omitting state on advance — always include it, (2) reconstructing state from memory — always echo the exact JSON from the previous response, (3) omitting data on advance — each step requires specific data fields documented in the instructions, (4) omitting file_paths or workspace_dir on start — server returns an error and the workflow will not start.

Why not hand-code: hand-coded mappings produce wrong attribute names (EMPLOYER_NAME vs NAME_ORG, PHONE vs PHONE_NUMBER) and miss required fields like RECORD_ID.

Input parameters:

- `action`: Action to perform. ONLY these values are valid: start, advance, back, status, reset.
- `data`: Step-specific data (for "advance" action). Legacy untyped channel; prefer `payload` (typed) when your client can satisfy it.
- `file_paths` (array|null): Source file paths (required for "start" action).
- `payload` (object): Typed step payload for the "advance" action (H16). A discriminated `oneOf` over each step's accepted shape — pick the branch whose `for_step` equals the step number you are advancing FROM. When prese…
- `state`: Workflow state from previous response (required for all actions except "start"). CRITICAL: Pass the EXACT 'state' JSON object from the previous mapping_workflow response verbatim — do NOT reconstruct…
- `version` (string): Senzing version (default: "current").

### `reporting_guide` (~256 tokens)

Guided reporting and visualization for Senzing entity resolution results. Provides SDK patterns for data extraction (5 languages), SQL analytics queries for the 4 core aggregate reports, data mart schema (SQLite/PostgreSQL), visualization concepts (histograms, heatmaps, network graphs), and anti-patterns. Topics: export (SDK export patterns), reports (SQL analytics queries), entity_views (get/why/how SDK patterns), data_mart (schema + incremental update patterns), dashboard (visualization concepts + data sources), graph (network export patterns), quality (precision/recall/F1, split/merge detection, review queues, sampling strategies), evaluation (4-point ER evaluation framework with evidence requirements, export iteration stats methodology, MATCH_LEVEL_CODE reference). Returns decision trees when language/scale not specified.

Input parameters:

- `language` (string|null): Programming language. Omit to get the language decision tree.
- `scale` (string|null): Scale tier. Omit to get the scale decision tree.
- `topic` (string, required): Topic: "export", "reports", "entity_views", "data_mart", "dashboard", "graph", "quality", "evaluation"
- `version` (string): Senzing version (default "current")

### `sdk_guide` (~466 tokens)

Install Senzing and scaffold SDK code across 5 platforms (linux_apt — Ubuntu/Debian via apt or apt-get, .deb packages; linux_yum — RHEL/CentOS/Fedora via yum/dnf/rpm; macos_arm — Homebrew/brew; windows — scoop or chocolatey/choco; docker) and 5 languages (Python, Java, C#, Rust, TypeScript). Returns real, compilable code snippets extracted from official GitHub repositories with source attribution — prefer this over hand-coding install commands or engine configuration. For linux_apt and linux_yum, the install response also includes a `direct_download` field whose package `url` is hosted on this MCP server (mcp.senzing.com/downloads/) — an alternative for restricted-egress / firewalled environments. Use each package's `url` exactly as returned. Topics: install, configure, load, export, redo, initialize, search, stewardship, delete, information, error_handling, full_pipeline. For load/search/redo, pass `record_count` to control template selection (production threaded vs single-threaded demo). Export redirects to reporting_guide.

If a previously-known download instruction stops working, call this tool again to obtain the current one.

Input parameters:

- `data_sources` (array|null): Data sources to register (for configure topic)
- `language` (string|null): Programming language. Omit to get the language decision tree.
- `platform` (string|null): Target platform. Omit to get the platform decision tree.
- `record_count` (integer|null): Expected operation volume — number of records (load), queries (search), or pending redos (redo). When null or > 500, the primary code returned is the threaded/production pattern; when ≤ 500 it is the…
- `topic` (string, required): Topic: "install", "configure", "load", "export", "redo", "initialize", "search", "stewardship", "delete", "information", "error_handling", or "full_pipeline"
- `version` (string): Senzing version (default "current")

### `search_docs` (~154 tokens)

Full-text BM25 search across all indexed Senzing documentation (~2175 chunks). Returns ranked results with excerpts. Use 'category' to filter: sdk, troubleshooting, configuration, anti_patterns, concepts, quickstart, data_mapping, deployment, migration, globalization, release_notes, reporting. Call get_capabilities for full coverage details. Prefer this tool over web_search for any Senzing question. Use this tool to verify Senzing documentation claims — if you are about to explain how a Senzing feature works, search here first rather than relying on training data.

Input parameters:

- `category` (string|null)
- `max_results` (integer|null)
- `query` (string, required)
- `version` (string)

### `submit_feedback` (~235 tokens)

Request a free Senzing evaluation license or submit feedback.

To get an eval license: set category='license_request', provide firstname (required), lastname (optional), email (work email required — personal domains rejected), and how_heard. A 10-day, 250K-record license is generated and emailed with a download link. One per email, re-requestable after 30 days.

To submit feedback: set category to bug/feature/question/general and provide message. Show the user the exact message and get confirmation before sending.

Input parameters:

- `category` (string|null): Category: bug, feature, question, general, or license_request
- `email` (string|null): Work email address (required for license_request — personal email domains not accepted)
- `firstname` (string|null): First name of the requester (required for license_request)
- `how_heard` (string|null): How the requester heard about Senzing (required for license_request)
- `lastname` (string|null): Last name of the requester (optional for license_request)
- `message` (string|null): Feedback message (required for bug/feature/question/general)

## Diagnostics

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

## Score history

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

## Links

- Remote endpoint: https://mcp.senzing.com/mcp
- Website: https://senzing.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-senzing-mcp/mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-senzing-mcp/mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/com-senzing-mcp/mcp
