MCP Server (claude.ai / Claude Desktop / Code / Cursor) - Entity Enricher Documentation

MCP Server (Claude Desktop / Code / Cursor)

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.

Why MCP, when there's already n8n + Make?

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.

Quickstart

Option 1 — OAuth (recommended)

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.

  1. Add Entity Enricher as a connector (in claude.ai: Settings → Connectors → Add custom connector, or pick it from the directory) with URL https://entityenricher.ai/api/mcp/.
  2. Your browser opens the Entity Enricher consent screen — sign in if needed and click Authorize. The connection acts on your behalf with your own role.
  3. Manage or revoke the connection anytime under API Keys → Connected Apps — revocation cuts access immediately.

Option 2 — API key (static JSON configuration)

For clients configured via a JSON file rather than an interactive sign-in (Claude Desktop, Continue, Zed).

  1. 1. Create an API key
    In the Entity Enricher web UI: Settings → API Keys → New organization access key. Pick a role (operator for read-mostly, editor for create/edit schemas, owner for full control). Copy the ent_… value — it's only shown once.
  2. 2. Register in your MCP client

    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.

Try it

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.

Tools

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.

CategoryToolDescription
Discoverylist_modelsList available LLM models + your plan's profile_limits so Claude self-throttles before hitting HTTP 402.
Schemaslist_schemasList saved JSON schemas in your org, pinned first.
Schemasget_schemaFetch the full content of a schema by UUID.
Schemasgenerate_sampleGenerate 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.
Schemascreate_schema_from_sampleGenerate a JSON schema from a sample entity dict via LLM, optionally grounded in uploaded source documents (attachment_ids). Result is auto-saved.
Schemasedit_schemaNatural-language modification of an existing schema. Returns new content + 5 follow-up suggestions.
Schemassave_schemaPersist a schema Claude authored directly — no LLM call, no cost, validated server-side.
Schemasupdate_schemaRename, replace content, retag, or pin a saved schema without an LLM call.
Schemasdelete_schemaSoft-delete a saved schema by UUID.
Enrichmentenrich_entityMulti-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.
Enrichmentstart_batch_enrichmentEnrich up to 100 entities asynchronously — full pipeline per entity with automatic fusion. Returns a job_id; results land in your records.
Enrichmentfetch_entitiesFetch a JSON array of entities from an external REST API server-side (bearer / api_key / basic auth) — pairs with batch enrichment.
Enrichmentretry_expertisesRe-run only the failed expertise domains of a record, merging recovered values back — no re-payment for what already succeeded.
Enrichmentmerge_recordsMerge 2+ existing records into one fused result — rule-based or with an LLM arbitration model.
Jobsget_job_statusPoll any asynchronous job (batch, sample generation, benchmark run): progress counters, terminal summaries, and pending clarification questions.
Jobscancel_jobCancel a pending, running, or paused job.
Jobsanswer_job_questionAnswer a paused job's clarification questions and resume it — the interactive half of generate_sample.
Benchmarkslist_benchmark_scenariosList your saved benchmark scenarios (reusable enrichment tests).
Benchmarksget_benchmark_scenarioOne scenario with its per-model scored results (quality / cost / speed).
Benchmarkscreate_benchmark_scenarioCreate a scenario: schema + fixed entity + strategy + scoring judge. Owner role + a plan with benchmarks required.
Benchmarksupdate_benchmark_scenarioUpdate a scenario's test definition or scoring config; existing results are flagged stale.
Benchmarksset_benchmark_referenceSave the gold reference output and mark it verified — required before a run.
Benchmarksdelete_benchmark_scenarioDelete a scenario and its results.
Benchmarksrun_benchmarkRun a scenario on an explicit model list, every active model of selected providers, or all active models — each result auto-scored against the reference.
Recordslist_recordsPage through past records with filters by type, success, model, job, free-text search.
Recordsget_recordFull structured output + validation errors for one record.
Recordsget_statsAggregated org statistics: totals, success rate, tokens, cost.
Attachmentsupload_attachmentUpload a base64 file (filename, content_base64, media_type?) and return its attachment ID for use in enrich_entity.
Attachmentsdelete_attachmentDelete an attachment by ID — a handy post-enrichment cleanup step.

Resources

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

The killer feature: interactive classification resume

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.

Error codes

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_codeWhen
invalid_requestMalformed UUID, mutually exclusive args (schema_id + target_schema), or request body validation failed.
prompt_limit_reachedDaily / weekly / monthly prompt quota exhausted (HTTP 402). Body includes period, limit, used, needed.
insufficient_creditsOrg has billing enabled but credit balance is too low to start the job (HTTP 402). Body includes balance and a purchase URL.
model_limit_exceededAsked for more models than the plan allows (HTTP 402). Echoes limit + requested.
language_limit_exceededAsked for more languages than the plan allows (HTTP 402).
concurrent_job_limit_reachedToo 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_planBenchmark tools require the owner role and a plan that includes Model Benchmarks (HTTP 403).
enrichment_timeoutJob exceeded timeout_seconds. Suggest fewer models or splitting the entity.
schema_generation_timeoutSchema generation exceeded timeout_seconds.
schema_generation_failedUpstream LLM error during schema generation (HTTP 502).
cancelledJob was cancelled mid-run (HTTP 499).
not_foundSchema or record ID does not exist in your org.
http_errorCatch-all for HTTP errors without a structured detail body.

Deliberate omissions

See also