MCP-server (claude.ai / Claude Desktop / Code / Cursor) - Entity Enricher-documentatie

MCP Server (Claude Desktop / Code / Cursor)

Entity Enricher levert een ingebouwde Model Context Protocol-server op /api/mcp — toon je schema's, verrijk een entiteit, bekijk het resultaat en los een classificatiewaarschuwing op allemaal vanuit één Claude-chat. Geen workfloweditor nodig.

Waarom MCP, als er al n8n + Make is?

Andere vorm, andere use case. De n8n- en Make-connectors verpakken de API voor workflowautomatisering: triggers, geplande runs, meerstaps-pipelines, persistente status. MCP verpakt het voor interactieve chat: ad-hocvragen, verkennende enrichments, vervolgverduidelijkingen. Workflows hebben een batch-vorm, chats een gespreksvorm — het oppervlak verschilt en de UX dus ook.

De killerfeature die alleen MCP ontgrendelt: interactief hervatten van classificatie. Wanneer de pre-flight-classificatie je entiteit afwijst (je vroeg bijvoorbeeld om "Titan" te verrijken tegen een Planeet-schema, maar Titan is een maan), moeten n8n/Make automatisch annuleren omdat ze niet-interactief zijn. MCP toont de waarschuwing aan Claude, Claude vraagt je om te bevestigen, en bij "ja" draait de tool opnieuw zonder de classificatie. Geen mislukking midden in de pijplijn, geen opnieuw beginnen vanaf nul.

Snel aan de slag

Optie 1 — OAuth (aanbevolen)

Voor claude.ai, Claude Code, Cursor en elke MCP-client die de standaard OAuth-flow ondersteunt. Geen API-sleutel om aan te maken of te plakken — de client ontdekt de autorisatieserver automatisch.

  1. Voeg Entity Enricher toe als connector (in claude.ai: Instellingen → Connectors → Aangepaste connector toevoegen, of kies het uit de directory) met URL https://entityenricher.ai/api/mcp/.
  2. Je browser opent het toestemmingsscherm van Entity Enricher — meld je aan indien nodig en klik op Autoriseren. De verbinding handelt namens jou met je eigen rol.
  3. Beheer of trek de verbinding op elk moment in onder API Keys → Verbonden apps — intrekken beëindigt de toegang onmiddellijk.

Optie 2 — API-sleutel (statische JSON-configuratie)

Voor clients die via een JSON-bestand worden geconfigureerd in plaats van een interactieve aanmelding (Claude Desktop, Continue, Zed).

  1. 1. Maak een API-sleutel aan
    In de Entity Enricher-webinterface: Instellingen → API-sleutels → Nieuwe organisatietoegangssleutel. Kies een rol (operator voor voornamelijk lezen, editor voor het aanmaken/bewerken van schema's, owner voor volledige controle). Kopieer de ent_…-waarde — die wordt maar één keer getoond.
  2. 2. Registreer in je MCP-client

    Bewerk voor Claude Desktop het bestand ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) of %APPDATA%\Claude\claude_desktop_config.json (Windows):

    {
      "mcpServers": {
        "entityenricher": {
          "url": "https://entityenricher.ai/api/mcp/",
          "headers": { "X-API-Key": "ent_your_key_here" }
        }
      }
    }

    Start Claude Desktop opnieuw op. Hetzelfde fragment werkt voor Claude Code, Cursor, Continue en Zed — elke MCP-compatibele client.

Probeer het

In een nieuwe chat: "Toon mijn Entity Enricher-schema's en verrijk Sanofi vervolgens tegen het schema voor farmaceutische bedrijven met Claude Sonnet." Claude ontdekt de tools automatisch, kiest de juiste, vraagt je om het model en de schemakeuze te bevestigen, en streamt het resultaat inline.

Tools

54 tools dekken het volledige vocabulaire van verrijking, schema-opbouw, Database Sync en semantische ID's. Het gedrag is identiek aan de REST-endpoints die ze omhullen (dezelfde validatie, facturering, planlimieten) — krijgt de web-UI een fix, dan krijgt MCP die ook. Langlopend werk (batchverrijking, voorbeelden genereren, benchmarkruns) verloopt asynchroon: de start-tool geeft een job_id terug, Claude pollt get_job_status en haalt de opgeslagen resultaten uit je records zodra de job klaar is.

CategorieToolBeschrijving
Ontdekkinglist_modelsToont modelsleutels, nominale mogelijkheden, automatisch geselecteerde standaardwaarden en de profile_limits van je abonnement. Geef de voorkeur aan automatische selectie: beschikbaarheid garandeert niet elk providerquota of elke gecombineerde media-/toolmodus.
Schema'slist_schemasToon opgeslagen JSON-schema's in je organisatie, vastgezette eerst.
Schema'sget_schemaHaal de volledige inhoud van een schema op via UUID.
Schema'sgenerate_sampleGenereer 1..N bewerkbare voorbeeldcontracten in één taak (de eerste definieert de veldenset; de rest zijn snelle instantievarianten met dezelfde velden) in kennismodus (geen bijlagen, optioneel zoeken op het web) of bronmodus (bijlagen zijn maatgevend en de planner mag vragen stellen). Bespreek ingrijpende bewerkingen met de gebruiker voordat je een schema aanmaakt.
Schema'screate_schema_from_sampleGenereer en sla automatisch een schema op vanuit entity_samples (1..N voorbeelden van één entiteitstype — vereniging van velden, nullable waar ontbrekend, echt waargenomen voorbeelden), een sample_record_id, of bewerkte gegevens plus de aan het record gekoppelde bijlagen. Semantische ID's zijn opt-in; suggesties worden beoordeeld, nooit automatisch toegepast.
Schema'ssave_schemaSla een schema op dat Claude direct heeft geschreven — geen LLM-aanroep, geen kosten, gevalideerd aan serverzijde.
Schema'supdate_schemaHernoem een opgeslagen schema, vervang de inhoud, wijzig de tags, zet het vast of schakel de ambiguïteitscontrole in of uit — zonder LLM-aanroep.
Schema'sget_schema_partLees een deel van een schema zonder het volledige document: de index van benoemde types, een $defs/$enums-definitie, een objectsubtree of één eigenschapkaart met de bijbehorende relaties en flags.
Schema'supdate_schema_propertyBewerk één eigenschap via het pad — hernoemen, type of $ref, beschrijving, voorbeelden, flags — of verwijder hem, met validatie aan serverzijde; geen round-trip van de volledige inhoud.
Schema'sadd_schema_propertyVoeg een scalaire, geneste object- of $ref-eigenschap toe aan de root, een genest object of een $defs-type.
Schema'smove_schema_propertyVerplaats één eigenschap naar een andere container — de root, een genest object of een $defs-type — met behoud van de flags en expertise.
Schema'spublish_schemaPubliceer de werkkopie van een gekoppeld schema als het contract waartegen verrijking en de database syncs draaien. Structurele wijzigingen worden pas hier van kracht — en een net gekoppelde sync levert niets tot de eerste publicatie van het schema. validate_only=true toont een voorbeeld van de migratie-diff.
Schema'sanalyze_sampleAnalyseer sample-JSON op eigenschapsnamen die in de context van hun ouder meer dan één lezing toelaten — of helemaal geen — en op gerelateerde items die entiteitsfeiten mengen met feiten per ouder. Stateless rapport met de concurrerende interpretaties en voorgestelde hernoemingen; er wordt niets gewijzigd.
Schema'sanalyze_schemaVoer de controles op ambiguïteit en identiteitsafbakening uit op een opgeslagen schema en schrijf annotaties per eigenschap — een herschreven beschrijving per dubbelzinnige naam, omdat een actief schema niet hernoemd kan worden. Standaard incrementeel; met force=true wordt alles opnieuw geanalyseerd.
Schema'sdelete_schemaSoft-delete een opgeslagen schema op UUID.
Verrijkingenrich_entityMulti-modelverrijking met optionele auto-fusie. Accepteert een optionele lijst met attachment_ids. Bij classificatieconflicten wordt een respons zonder fout teruggegeven, zodat Claude de gebruiker kan vragen te bevestigen en het opnieuw te proberen.
Verrijkingstart_batch_enrichmentVerrijk een onbeperkt aantal entiteiten asynchroon — geen vaste limiet op batchgrootte, begrensd door het live-gebruiksquotum van je abonnement — volledige pipeline per entiteit met automatische fusie. Geeft een job_id terug; resultaten komen in je records terecht.
Verrijkingfetch_entitiesHaal een JSON-array van entiteiten op van een externe REST API aan serverzijde (bearer / api_key / basic auth) — combineert met batchverrijking.
Verrijkingretry_expertisesVoer alleen de mislukte expertisedomeinen van een record opnieuw uit en voeg herstelde waarden terug samen — geen dubbele betaling voor wat al is geslaagd.
Verrijkingmerge_recordsVoeg 2+ bestaande records samen tot één gefuseerd resultaat — op basis van regels of met een LLM-arbitragemodel.
Jobsget_job_statusPeil asynchrone taken op voortgang, resultaten, fouten en verduidelijkingsvragen. Probeer na een compatibiliteitsfout met een expliciet model één keer opnieuw met automatische selectie in plaats van modellen af te wisselen.
Jobscancel_jobAnnuleer een job die in behandeling is, actief is of gepauzeerd is.
Jobsanswer_job_questionBeantwoord de verduidelijkingsvragen van een gepauzeerde job en hervat hem — de interactieve helft van generate_sample.
Benchmarkslist_benchmark_scenariosToon je opgeslagen benchmarkscenario's (herbruikbare verrijkingstests).
Benchmarksget_benchmark_scenarioEén scenario met de per model gescoorde resultaten (kwaliteit / kosten / snelheid).
Benchmarkscreate_benchmark_scenarioMaak een scenario: schema + vaste entiteit + strategie + beoordelingsjudge. Owner-rol + een plan met benchmarks vereist.
Benchmarksupdate_benchmark_scenarioWerk de testdefinitie of scoreconfiguratie van een scenario bij; bestaande resultaten worden als verouderd gemarkeerd.
Benchmarksset_benchmark_referenceSla de gouden referentie-output op en markeer hem als geverifieerd — vereist vóór een run.
Benchmarksdelete_benchmark_scenarioVerwijder een scenario en de bijbehorende resultaten.
Benchmarksrun_benchmarkVoer een scenario uit op een expliciete modellijst, elk actief model van geselecteerde providers, of alle actieve modellen — elk resultaat wordt automatisch gescoord tegen de referentie.
Recordslist_recordsBlader door records van verrijking, sample-/schemageneratie, schemabewerking, playground, classificatie, arbitrage en ambiguïteitsanalyse, met filters op succes, model, job en zoekterm.
Recordsget_recordVolledige gestructureerde output + validatiefouten voor één record.
Recordsget_statsGeaggregeerde organisatiestatistieken: totalen, slagingspercentage, tokens, kosten.
Bijlagenupload_attachmentUpload een base64-bestand en retourneer de bijlage-ID plus de vereiste modelcapaciteit. Door de ID aan generate_sample door te geven, wordt de bronmodus geactiveerd.
Bijlagendelete_attachmentVerwijder een bijlage op ID — een handige opschoonstap na de verrijking.
Database Synclist_database_syncsToon de database syncs die op een opgeslagen schema zijn geregistreerd, met aantallen openstaande delta's en de opties van elke sync.
Database Synccreate_database_syncVerbind een database met een opgeslagen schema en zet de enrichments ervan om in relationele SQL-delta's voor je eigen PostgreSQL. Het schema wordt ongepubliceerd gekoppeld en het databasemodel wordt op de achtergrond geclassificeerd — controleer het en publish_schema start dan de feed.
Database Syncclassify_database_modelVoer de classificatie van het databasemodel opnieuw uit nadat je een gekoppeld schema hebt bewerkt: een LLM stelt voor elke nieuwe of gewijzigde property de key, het SQL-type, de index en het eigenaarschap voor. De eerste doorloop start vanzelf zodra de database verbonden is.
Database Syncdelete_database_syncVerwijder een database sync en de in de wachtrij staande delta's — de tabellen van je replica worden nooit aangeraakt. Optionele teardown-flags verwijderen ook de entiteitsstatus en het databasemodel van schema's die zonder database achterblijven.
Database Synccreate_database_credentialGeef de sync-client-credential van een database sync (opnieuw) uit — de koppelingsstap van de ee-database-workflow, teruggegeven met de install- en pair-commando's.
Database Syncfetch_database_deltasHaal het volgende FIFO-venster van SQL-delta's op voor een database sync — claim=true least het voor bevestigde levering, claim=false is een herhaalbare read.
Database Syncack_database_deltasBevestig toegepaste delta's tot aan een id: geeft de lease vrij en past de purge-opties van de sync toe.
Database Syncassign_sync_hostWijs de synchost toe (of wis hem) die een database sync in beheerde modus inricht — de host claimt de credential, maakt de fysieke database aan als die ontbreekt en start met synchroniseren, zonder handmatige koppeling.
Database Synclist_entity_statesBlader door de huidige entiteitstatus van een schema — de ontdubbelde rijen volgens last-write-wins die de entiteitlaag bevat en die elke gekoppelde database spiegelt, niet de records per run van list_records.
Database Syncsync_records_to_databaseInjecteer opgeslagen verrijkingsuitvoer in de database sync van een schema — opnieuw gevalideerd tegen het gepubliceerde contract en daarna door de toelatingspoort geleid.
Semantische ID'slist_semantic_conceptsBlader door het conceptvocabulaire van de organisatie met de bijbehorende typefacetten — of, met view="duplicates", door de conceptparen net onder de resolutiedrempel.
Semantische ID'sget_semantic_conceptEén concept volledig: oppervlaktevormen, identiteitsbronsleutels, gekoppelde records en de dichtstbijzijnde buren met gelijkenissen (alleen gedefinieerd binnen de eigen slice van concepttype en embeddingmodel).
Semantische ID'sprobe_semantic_conceptVoer de resolutieladder voor een tekst uit als dry-run — wat een verrijking ermee zou doen — zonder iets aan te maken. Test voordat je toevoegt.
Semantische ID'sadd_semantic_conceptVoeg een concept toe met gebruik 0, of met alias_of een nieuwe oppervlaktevorm van een bestaand concept. Wordt geweigerd, met vermelding van het bestaande concept, wanneer de tekst al binnen de drempel gedekt is.
Semantische ID'supdate_concept_aliasVerwijder een oppervlaktevorm van een concept, of promoveer er een tot canonieke vorm. De laatste oppervlaktevorm wordt geweigerd — het concept verwijderen is de taak van de verwijderflow.
Semantische ID'simport_semantic_conceptsLos tot 1000 identiteitsteksten op via de verrijkingsladder: standaard een rapport per rij, met mint=true worden de missers aangemaakt (eigenaar).
Semantische ID'smerge_semantic_conceptsVoeg het ene concept samen in het andere. impact_only=true (standaard) rapporteert de impactradius; de samenvoeging zelf (eigenaar) verwijst aliassen en entiteiten opnieuw door en laat elke gekoppelde database convergeren.
Semantische ID'sdelete_semantic_conceptsVerwijder concepten op id, hele typen, of alleen ongebruikte. impact_only=true (standaard) rapporteert eerst de aantallen en de betrokken schema's/databases; verwijderen herstelt zichzelf, maar verbreekt de convergentie met opgeslagen id's.
Semantische ID'smigrate_semantic_embeddingsStatus, botsingsvoorbeeld, starten of annuleren van de embeddingmodel-migratie van de organisatie — de enige manier om bestaande concepten tussen embeddingmodellen te verplaatsen.

Modi voor voorbeeldgeneratie

Kennismodus

Laat attachment_ids weg. Het model ontwerpt een herbruikbaar voorbeeld op basis van zijn kennis, en enable_web_search=true kan externe feiten onderbouwen.

Bronmodus

Geef attachment_ids door. De planner behandelt de bestanden als gezaghebbend: hij transcribeert documentwaarden of beschrijft alleen kenmerken die zichtbaar zijn op een foto. Velden en extra instructies kunnen geen ongerelateerde externe feiten toevoegen.

Je aanvullende instructies zijn bindend

Wat je als extra instructies meegeeft, wordt óf opgevolgd, óf teruggemeld als niet-opgevolgd. Waar een deterministische regel iets moest terugdraaien wat je had gevraagd — bijvoorbeeld een vorm die de generator niet kan produceren — bevat de voltooide taak een lijst warnings die dat vermeldt. Geef die door aan de gebruiker: een stilzwijgend genegeerde instructie is precies hoe een voorbeeld ongemerkt fout raakt.

Voor een hybride verzoek zoals het identificeren van een auto op een foto en het onderzoeken van de publieke verschijningen ervan, roep je generate_sample twee keer aan: eerst in bronmodus met webzoeken uit, daarna zonder bijlagen met gebruik van de bevestigde identiteit en webzoeken aan. Combineer de resultaten in het gesprek; Entity Enricher houdt afzonderlijke records bij zodat bronwaarnemingen en onderzochte feiten een aparte herkomst behouden.

Houd model=auto aan tenzij je expliciet een model nodig hebt. Automatische selectie past de vereisten voor de taak, bijlagen en webzoeken toe; een beschikbare modelsleutel kan alsnog te maken krijgen met providerspecifieke quota of beperkingen bij gecombineerde tools.

Keur het voorbeeld goed en beoordeel vervolgens het schema

Het voorbeeld is het contract

Vóór het genereren van het schema beoordeelt de client de reikwijdte van de entiteit, sleutels, typen, kardinaliteit, ontbrekende representatieve velden en geneste relaties. Ingrijpende wijzigingen worden gegroepeerd voor jouw goedkeuring; feitelijke waarden en structuur worden nooit stilzwijgend gewijzigd.

Kies stabiele semantische ID's wanneer dat nuttig is

Voor relationele tabellen, stamgegevens, kennisgrafen of herbruikbare geneste entiteiten vraagt de client of er semantische ID's moeten worden gegenereerd. Deze vereisen een embeddingmodel van de organisatie en brengen embeddingkosten met zich mee, dus ze blijven standaard uitgeschakeld.

Geef entity_data door voor een nieuw of bewerkt voorbeeld, of sample_record_id om opgeslagen JSON en de bijbehorende bijlagen opnieuw te gebruiken. Als je beide doorgeeft, wordt de bewerkte JSON gebruikt terwijl de bijlagen behouden blijven. Expliciete attachment_ids, inclusief een lege lijst, overschrijven de overerving.

Na het genereren controleert de client de conformiteit van het voorbeeld, sleutels, annotaties, expertise, relaties en de dekking van semantische ID's. Structurele suggesties vereisen het bewerken en opnieuw genereren van het voorbeeld; wijzigingen die alleen annotaties betreffen vereisen nog steeds jouw goedkeuring. Niets wordt automatisch toegepast.

Resources

Met resources kan Claude data doorbladeren zonder een tool-aanroep te verbruiken — de LLM-client behandelt ze als bestanden. Beide resourcetypen worden als Markdown weergegeven voor goedkope inline-weergave.

URI-sjabloonBeschrijving
enricher://schemas/{schema_id}Een opgeslagen schema weergegeven als Markdown — metadata-header + de GeneratedJsonSchema als een afgebakend JSON-blok.
enricher://records/{record_id}Een eerder verrijkingsrecord weergegeven als Markdown — metadata + gestructureerde output + validatiefouten.

De killerfeature: interactief hervatten van classificatie

Wanneer je enrich_entity vraagt om een classificatiemodel te gebruiken en de entiteit niet overeenkomt met het schematype, retourneert de tool een niet-fout-respons met gestructureerde details. Claude leest het, toont je de redenering en probeert het (na jouw bevestiging) opnieuw met force_after_classification_warning=true — waardoor de classifier bij de nieuwe poging wordt overgeslagen.

{
  "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 en Make annuleren automatisch bij deze status omdat ze de gebruiker niet halverwege de pipeline iets kunnen vragen. MCP kan dat wel, en dat ene verschil is waarom de connector bestaat.

Dezelfde interactiviteit drijft een tweede flow aan: wanneer generate_sample met brondocumenten draait, kan de planner pauzeren met structurele verduidelijkingsvragen. Claude geeft ze aan je door en hervat de job met answer_job_question — ronde na ronde, totdat de sample is gegenereerd.

Foutcodes

Toolfouten worden geprojecteerd in gestructureerde dicts met een error_code-veld, zodat Claude patronen kan herkennen in plaats van vrije tekst te parsen. De HTTP-laag wordt netjes gemapt: 402 → quota- of creditfout, 422 → classificatiewaarschuwing, 504 → time-out, 502 → upstream LLM-fout.

error_codeWanneer
invalid_requestOngeldige UUID, wederzijds uitsluitende argumenten (schema_id + target_schema), of validatie van de request-body mislukt.
prompt_limit_reachedDagelijks / wekelijks / maandelijks prompt-quotum uitgeput (HTTP 402). De body bevat period, limit, used en needed.
insufficient_creditsOrg heeft facturering ingeschakeld maar het creditsaldo is te laag om de taak te starten (HTTP 402). De body bevat het saldo en een aankoop-URL.
model_limit_exceededMeer modellen aangevraagd dan het plan toestaat (HTTP 402). Geeft limiet + aangevraagd terug.
language_limit_exceededMeer talen aangevraagd dan het plan toestaat (HTTP 402).
concurrent_job_limit_reachedTe veel actieve verrijkingstaken voor deze organisatie. Wacht of upgrade je abonnement.
classification_warning⚡ Geen fout: de pre-flight classifier heeft de entiteit afgewezen. Het antwoord bevat de classificatiecontext zodat Claude de gebruiker kan vragen om te bevestigen en opnieuw te proberen met force_after_classification_warning=true.
benchmarks_not_in_planBenchmarktools vereisen de owner-rol en een plan met Model Benchmarks (HTTP 403).
ambiguity_check_disabledanalyze_schema is aangeroepen op een schema waarvan de ambiguïteitscontrole is uitgeschakeld (HTTP 400). Schakel deze eerst weer in via update_schema met ambiguity_check_enabled=true.
enrichment_timeoutJob overschreed timeout_seconds. Overweeg minder modellen of splits de entity.
schema_generation_timeoutSchemageneratie heeft timeout_seconds overschreden.
schema_generation_failedUpstream-LLM-fout tijdens schema-generatie (HTTP 502).
model_output_invalidHet model gaf uitvoer terug die niet overeenkomt met het schema (HTTP 502). De body bevat de naam van het model, het pad van de problematische eigenschap en retryable: true — roep de tool opnieuw aan of kies een sterker model.
cancelledJob werd tijdens de run geannuleerd (HTTP 499).
not_foundSchema- of record-ID bestaat niet in je organisatie.
http_errorVerzamelpost voor HTTP-fouten zonder gestructureerde detailinhoud.

Bewuste weglatingen

Zie ook