Entity Enricher ships an embedded Model Context Protocol server at /api/mcp — list your schemas, enrich an entity, inspect the result, and resolve a classification warning all from inside one Claude chat. No workflow editor required.
Different shape, different use case. The n8n and Make connectors wrap the API for workflow automation: triggers, scheduled runs, multi-step pipelines, persistent state. MCP wraps it for interactive chat: ad-hoc questions, exploratory enrichments, follow-up clarifications. Workflows are batch-shaped, chats are conversation-shaped — the surface differs and so does the UX.
The killer feature only MCP unlocks: interactive classification resume. When the pre-flight classifier rejects your entity (e.g. you asked to enrich "Titan" against a Planet schema, but Titan is a moon), n8n/Make have to auto-cancel because they're non-interactive. MCP surfaces the warning to Claude, Claude asks you to confirm, and on "yes" the tool re-runs without the classifier. No mid-pipeline failure, no re-running from scratch.
For claude.ai, Claude Code, Cursor, and any MCP client that supports the standard OAuth flow. No API key to create or paste — the client discovers the authorization server automatically.
https://entityenricher.ai/api/mcp/.For clients configured via a JSON file rather than an interactive sign-in (Claude Desktop, Continue, Zed).
ent_… value — it's only shown once.For Claude Desktop, edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"entityenricher": {
"url": "https://entityenricher.ai/api/mcp/",
"headers": { "X-API-Key": "ent_your_key_here" }
}
}
}Restart Claude Desktop. The same snippet works for Claude Code, Cursor, Continue, and Zed — any MCP-compatible client.
In a new chat: "List my Entity Enricher schemas, then enrich Sanofi against the pharmaceutical company schema using Claude Sonnet." Claude discovers the tools automatically, picks the right one, prompts you to confirm the model and schema choice, and streams the result inline.
29 tools cover the full enrichment and schema-authoring surface. Behaviour is identical to the REST endpoints they wrap (same validation, billing, plan limits) — when the web UI gets a fix, MCP gets it too. Long-running work (batch enrichment, sample generation, benchmark runs) is asynchronous: the start tool returns a job_id, Claude polls get_job_status, and fetches the persisted outputs from your records once the job completes.
| Category | Tool | Description |
|---|---|---|
| Discovery | list_models | List available LLM models + your plan's profile_limits so Claude self-throttles before hitting HTTP 402. |
| Schemas | list_schemas | List saved JSON schemas in your org, pinned first. |
| Schemas | get_schema | Fetch the full content of a schema by UUID. |
| Schemas | generate_sample | Generate a realistic sample entity from an entity-type description — the natural first step before schema generation. With attachments, an interactive planner may pause with clarification questions. |
| Schemas | create_schema_from_sample | Generate a JSON schema from a sample entity dict via LLM, optionally grounded in uploaded source documents (attachment_ids). Result is auto-saved. |
| Schemas | edit_schema | Natural-language modification of an existing schema. Returns new content + 5 follow-up suggestions. |
| Schemas | save_schema | Persist a schema Claude authored directly — no LLM call, no cost, validated server-side. |
| Schemas | update_schema | Rename, replace content, retag, or pin a saved schema without an LLM call. |
| Schemas | delete_schema | Soft-delete a saved schema by UUID. |
| Enrichment | enrich_entity | Multi-model enrichment with optional auto-fusion. Accepts an optional attachment_ids list. Classification mismatches return a non-error response so Claude can ask the user to confirm and retry. |
| Enrichment | start_batch_enrichment | Enrich up to 100 entities asynchronously — full pipeline per entity with automatic fusion. Returns a job_id; results land in your records. |
| Enrichment | fetch_entities | Fetch a JSON array of entities from an external REST API server-side (bearer / api_key / basic auth) — pairs with batch enrichment. |
| Enrichment | retry_expertises | Re-run only the failed expertise domains of a record, merging recovered values back — no re-payment for what already succeeded. |
| Enrichment | merge_records | Merge 2+ existing records into one fused result — rule-based or with an LLM arbitration model. |
| Jobs | get_job_status | Poll any asynchronous job (batch, sample generation, benchmark run): progress counters, terminal summaries, and pending clarification questions. |
| Jobs | cancel_job | Cancel a pending, running, or paused job. |
| Jobs | answer_job_question | Answer a paused job's clarification questions and resume it — the interactive half of generate_sample. |
| Benchmarks | list_benchmark_scenarios | List your saved benchmark scenarios (reusable enrichment tests). |
| Benchmarks | get_benchmark_scenario | One scenario with its per-model scored results (quality / cost / speed). |
| Benchmarks | create_benchmark_scenario | Create a scenario: schema + fixed entity + strategy + scoring judge. Owner role + a plan with benchmarks required. |
| Benchmarks | update_benchmark_scenario | Update a scenario's test definition or scoring config; existing results are flagged stale. |
| Benchmarks | set_benchmark_reference | Save the gold reference output and mark it verified — required before a run. |
| Benchmarks | delete_benchmark_scenario | Delete a scenario and its results. |
| Benchmarks | run_benchmark | Run a scenario on an explicit model list, every active model of selected providers, or all active models — each result auto-scored against the reference. |
| Records | list_records | Page through past records with filters by type, success, model, job, free-text search. |
| Records | get_record | Full structured output + validation errors for one record. |
| Records | get_stats | Aggregated org statistics: totals, success rate, tokens, cost. |
| Attachments | upload_attachment | Upload a base64 file (filename, content_base64, media_type?) and return its attachment ID for use in enrich_entity. |
| Attachments | delete_attachment | Delete an attachment by ID — a handy post-enrichment cleanup step. |
Resources let Claude browse data without burning a tool call — the LLM client treats them like files. Both resource types render as Markdown for cheap inline display.
| URI template | Description |
|---|---|
| enricher://schemas/{schema_id} | A saved schema rendered as Markdown — metadata header + the GeneratedJsonSchema as a fenced JSON block. |
| enricher://records/{record_id} | A past enrichment record rendered as Markdown — metadata + structured output + validation errors. |
When you ask enrich_entity to use a classification model and the entity doesn't match the schema type, the tool returns anon-error response with structured details. Claude reads it, surfaces the reasoning to you, and (on your confirmation) retries with force_after_classification_warning=true — which drops the classifier on the retry.
{
"success": false,
"error_code": "classification_warning",
"message": "Pre-flight classification rejected the entity. ...",
"classification": {
"status": "mismatch",
"reasoning": "Titan is a moon of Saturn, not a planet.",
"confidence": 0.97
},
"job_id": "..."
}n8n and Make auto-cancel on this state because they can't ask the user mid-pipeline. MCP can, and that single difference is why the connector exists.
The same interactivity powers a second flow: when generate_sample runs with source documents, its planner may pause with structural clarification questions. Claude relays them to you and resumes the job with answer_job_question — round after round, until the sample is generated.
Tool errors are projected into structured dicts with an error_code field so Claude can pattern-match instead of parsing free text. The HTTP layer maps cleanly: 402 → quota or credit error, 422 → classification warning, 504 → timeout, 502 → upstream LLM failure.
| error_code | When |
|---|---|
| invalid_request | Malformed UUID, mutually exclusive args (schema_id + target_schema), or request body validation failed. |
| prompt_limit_reached | Daily / weekly / monthly prompt quota exhausted (HTTP 402). Body includes period, limit, used, needed. |
| insufficient_credits | Org has billing enabled but credit balance is too low to start the job (HTTP 402). Body includes balance and a purchase URL. |
| model_limit_exceeded | Asked for more models than the plan allows (HTTP 402). Echoes limit + requested. |
| language_limit_exceeded | Asked for more languages than the plan allows (HTTP 402). |
| concurrent_job_limit_reached | Too many active enrichment jobs for this org. Wait or upgrade plan. |
| classification_warning | ⚡ Non-error: pre-flight classifier rejected the entity. Response carries the classification context so Claude can ask the user to confirm and retry with force_after_classification_warning=true. |
| benchmarks_not_in_plan | Benchmark tools require the owner role and a plan that includes Model Benchmarks (HTTP 403). |
| enrichment_timeout | Job exceeded timeout_seconds. Suggest fewer models or splitting the entity. |
| schema_generation_timeout | Schema generation exceeded timeout_seconds. |
| schema_generation_failed | Upstream LLM error during schema generation (HTTP 502). |
| cancelled | Job was cancelled mid-run (HTTP 499). |
| not_found | Schema or record ID does not exist in your org. |
| http_error | Catch-all for HTTP errors without a structured detail body. |
get_stats covers chat-side summaries; the full dashboards stay in the app.