Zum Inhalt springen

MCP-Server

Kurzantwort: Der CDMS-Hub stellt unter POST/GET /api/mcp einen Model-Context-Protocol-Server bereit. KI-Clients können damit das Meta-Modell Ihrer CDMS-Systeme lesen und Strukturänderungen über eine kontrollierte, freigabepflichtige Pipeline einbringen – ohne direkten Datenbank- oder REST-Zugriff. Authentifiziert wird über OAuth 2.1/OIDC; die Zugangsdaten für Ihren Client erhalten Sie vom Betreiber des Hubs.


EndpunktPOST/GET {baseUrl}/api/mcp
TransportStreamable HTTP (MCP Java SDK)
Server-Namecodamai-cdms-mcp
Capabilitiestools
AuthOAuth 2.1 / OIDC, Bearer-Token verpflichtend
DiscoveryGET {baseUrl}/.well-known/oauth-protected-resource/api/mcp (RFC 9728)

Der Transport läuft durch dieselbe Filterkette wie die REST-API. Jeder Tool-Aufruf findet im echten Benutzerkontext statt; Mandanten-, Owner- und Rechteprüfungen greifen unverändert. Sie sehen über MCP also genau die Systeme und Elemente, die Ihr Zugang auch sonst sieht.

Der Server ist eine geschützte Ressource nach RFC 9728:

  1. Das Protected-Resource-Metadata-Dokument ist ohne Token abrufbar und nennt den zuständigen Authorization Server.
  2. Ein MCP-Request ohne Token wird mit 401 und WWW-Authenticate: Bearer resource_metadata="…" beantwortet – das löst beim Client den Authorization-Code-Flow mit PKCE aus.
  3. Ein abgelehntes oder abgelaufenes Token führt ebenfalls zu 401, damit sich der Client neu anmeldet, statt hart zu scheitern.

Jeder Entwickler bzw. jedes Team bekommt einen eigenen OAuth-Client. Dynamische Client-Registrierung (RFC 7591) ist abgeschaltet – ein selbstregistrierter Client wäre unkonfiguriert und käme an keine Daten. Sie erhalten stattdessen vom Betreiber:

AngabeBedeutung
Basis-URLwohin der MCP-Client verbindet, z. B. https://<host>/api/mcp
Client-IDIhre Anwendungsidentität, öffentlich und unkritisch
Callback-Portder lokale Port, der als Redirect-URI hinterlegt ist

Es gibt kein Client-Secret: Der Client ist öffentlich, die Absicherung übernimmt PKCE (S256). Ein Desktop- oder CLI-Werkzeug kann ein Secret ohnehin nicht geheim halten.

Ihr Benutzerkonto entscheidet über die Sichtbarkeit — nicht der Client. Ohne Berechtigung auf ein CDMS-System taucht es in cdms_list_targets nicht auf.

Setzen Sie die drei Angaben aus Ihrem Zugang ein:

Terminal-Fenster
claude mcp add --transport http --client-id <ihre-client-id> --callback-port <port> \
codamai-cdms https://<host>/api/mcp
  • --transport http steht vor Name und URL
  • --client-id und --callback-port sind nicht optional – ohne sie versucht der Client eine dynamische Registrierung, die abgelehnt wird
  • kein --client-secret (öffentlicher Client mit PKCE)
  • Anmeldung in der Session über /mcpAuthenticate; der Browser öffnet sich, nach dem Login ist der Server verbunden

Manuelle Variante in .mcp.json:

{
"mcpServers": {
"codamai-cdms": {
"type": "http",
"url": "https://<host>/api/mcp",
"oauth": { "clientId": "<ihre-client-id>", "callbackPort": <port> }
}
}
}

Kein Authorization-Header eintragen – das Token holt sich der Client über den OAuth-Flow. Die clientId ist unkritisch und darf eingecheckt werden.

ToolZweck
cdms_list_targetsalle CDMS-Systeme, auf die der Benutzer zugreifen darf
cdms_get_targetMetadaten eines CDMS (ID oder eindeutiger Name)
cdms_get_capabilitiesunterstützte Feldtypen, Beziehungstypen, Regeln, Rollen, Namensregeln – vor jedem Blueprint zu lesen
cdms_get_structureOrdnerstruktur mit IDs, Eltern-Ordnern, Pfaden
cdms_get_schemavollständiges Ist-Schema
cdms_get_elementeinzelnes Element per ID, inkl. Elementtyp, Besitzer und Blueprint-Schlüssel (/crm/Customer#name)
cdms_create_operation_context / cdms_get_operation_contextOperation Context anlegen/lesen

Dazu Resources unter cdms://targets/{cdmsId}/… (Schema, Ordner, Enums, Modelle, Elemente) sowie cdms://operations/{id} und cdms://change-sets/{id}. Tools und Resources bedient dieselbe Schicht (CdmsReadService), damit beide identisch antworten.

ToolZweck
cdms_validate_blueprintBlueprint serverseitig prüfen, ohne etwas zu ändern
cdms_plan_changesBlueprint gegen den Ist-Zustand diffen → unveränderlicher Change Plan mit planId, CREATE/UPDATE/UNCHANGED, markierten destruktiven Änderungen und blueprintHash
cdms_create_change_setPlan als Change Set einfrieren (PENDING_APPROVAL)
cdms_approve_change_setFreigabe – nur nach ausdrücklicher Bestätigung durch den Benutzer
cdms_apply_change_setgenau einmalige, transaktionale Anwendung
cdms_get_change_set_statusStatus, Freigabe- und Ausführungsergebnis
cdms_rollback_change_setKompensation: löscht nur die selbst erzeugten Elemente in umgekehrter Reihenfolge
flowchart TB
    A[cdms_list_targets] --> B[cdms_get_capabilities]
    B --> C[cdms_get_schema]
    C --> D["cdms_create_operation_context<br/>bindet alles an ein CDMS"]
    D --> E[cdms_validate_blueprint]
    E --> F[cdms_plan_changes]
    F --> G["Plan wird dem Benutzer gezeigt"]
    G --> H[cdms_create_change_set]
    H --> I["Benutzer bestätigt"]
    I --> J[cdms_approve_change_set]
    J --> K["cdms_apply_change_set<br/>einmalig, phasenweise, transaktional"]
    K --> L["nur falls nötig, nach erneuter Bestätigung:<br/>cdms_rollback_change_set"]

Phasenreihenfolge beim Anwenden: Ordner → Enums → abstrakte Modelle → Datenmodelle → Felder → Beziehungen. Danach die Abschlussvalidierung: Der Ist-Zustand wird in derselben Transaktion neu gelesen und geprüft, ob jedes geplante Element genau einmal existiert – schlägt das fehl, wird das komplette Change Set zurückgerollt.

Das Hub verwaltet die Design-Daten mehrerer CDMS-Systeme. Der Client wählt das Ziel deshalb immer explizit – nie implizit, nie geraten. Ein mehrdeutiger Name führt zu CDMS_TARGET_AMBIGUOUS.

Für jede Änderungsabsicht entsteht ein Operation Context, der alle Folgeaufrufe unveränderlich an genau ein CDMS bindet; ein Zielwechsel innerhalb einer Operation ist ausgeschlossen (CDMS_TARGET_MISMATCH).

  • kein direkter Datenbankzugriff – alles über zugriffsgeprüfte System-Layer
  • kein Schreiben ohne Plan und Freigabe
  • Change Sets sind genau einmal anwendbar und werden vor der Ausführung gegen den Ist-Zustand geprüft (SCHEMA_VERSION_CONFLICT)
  • destruktive Änderungen werden markiert und blockiert (DESTRUCTIVE_CHANGE_BLOCKED)
  • Enum-Werte werden nie gelöscht (add-only Diff)
  • Fehler kommen als stabile Codes zurück, Interna nur ins Log

Fehlercodes: CDMS_TARGET_NOT_FOUND, CDMS_TARGET_AMBIGUOUS, CDMS_TARGET_MISMATCH, CDMS_ACCESS_DENIED, CDMS_CAPABILITY_NOT_SUPPORTED, OPERATION_CONTEXT_NOT_FOUND, BLUEPRINT_INVALID, BLUEPRINT_REFERENCE_NOT_FOUND, BLUEPRINT_CYCLE_DETECTED, SCHEMA_VERSION_CONFLICT, CHANGE_SET_NOT_APPROVED, CHANGE_SET_ALREADY_APPLIED, DESTRUCTIVE_CHANGE_BLOCKED, RELATION_INVALID, ROLE_INVALID, EXECUTION_FAILED, ROLLBACK_FAILED.

Die lesenden Tools sind unkritisch und dürfen in die Allowlist. Die schreibende Pipeline bleibt bewusst genehmigungspflichtig – cdms_approve_change_set, cdms_apply_change_set und cdms_rollback_change_set gehören nie in eine Allowlist.

  • fileUploads lassen sich im Blueprint noch nicht beschreiben; ein solcher Blueprint wird mit CDMS_CAPABILITY_NOT_SUPPORTED abgelehnt.
  • Change Sets sind kurzlebig: Ein Plan ist 30 Minuten gültig, ein Change Set zwei Stunden. Danach neu planen.
  • Claude Desktop verlangt dynamische Client-Registrierung und funktioniert deshalb nicht. Für Claude Code und andere Clients mit fester Client-ID gilt die Anleitung oben.