Workflow-MCP-Server
MCP-Server (Model Context Protocol) des Workflow-Systems. Erlaubt KI-Clients, Workflows zu erstellen, zu bearbeiten, zu starten und mit laufenden Instanzen zu interagieren.
Endpoint & Auth
- URL:
https://workflow.flurneuordnung-sachsen.de/mcp(JSON-RPC 2.0 ueber HTTP POST, „Streamable HTTP") - Auth: HTTP-Header
Authorization: Bearer <token> - Keys: werden im Workflow-Dashboard (
dashboard.php→ Card „MCP-API-Keys") erstellt. Der Klartext-Token ist nur einmal bei der Erstellung sichtbar (Server speichert nur den SHA-256-Hash).
Scopes
Jeder Key traegt eine Auswahl aus drei Scopes; tools/list zeigt nur erlaubte Tools, tools/call prueft den Scope.
| Scope | Tools |
|---|---|
read |
workflow_list, workflow_get, workflow_validate, workflow_lint, workflow_vars, workflow_instances, workflow_status, workflow_log, task_list, task_doc, task_search, workflow_batch* |
author |
workflow_create, workflow_update |
interact |
workflow_start, workflow_interact |
Tools
| Tool | Zweck |
|---|---|
workflow_list |
Alle Definitionen (workflows/*.xml) mit ID/Task-Anzahl. |
workflow_get |
Workflow laden. format=xml (Standard) oder format=struktur — nur der Task-Baum (Typ, id, assign_to, Verzweigung, output_var), rund 70 % weniger Token. |
workflow_lint |
Statische Prüfung: unbekannte Task-Typen, doppelte ids, fehlende Pflichtparameter, interaktive Tasks ohne <assign_to>. |
workflow_vars |
Variablen-Landkarte: was der Workflow erzeugt, was er liest, und was gelesen wird, ohne je gesetzt zu sein (Tippfehler). |
workflow_batch |
Mehrere Werkzeuge in einem Aufruf (z. B. create + lint + start). Jede Operation wird einzeln gegen die Scopes geprüft; Verschachtelung verboten; max. 20 Operationen; bricht standardmäßig beim ersten Fehler ab. |
task_list |
Alle Task-Typen mit Einzeiler; interaktiv=true = braucht <assign_to>. Optional suche. |
task_doc |
Doku zu mehreren Task-Typen in einem Aufruf; format=xml|kurz|md. |
task_search |
Findet den passenden Task zu einer Aufgabenbeschreibung. |
workflow_validate |
Workflow-XML auf Wohlgeformtheit + Grundstruktur pruefen. |
workflow_instances |
Laufende/vergangene Instanzen (filterbar nach status/type/assignee). |
workflow_status |
Detailstatus einer Instanz (Status, Bearbeiter, Kontext, Tokens). |
workflow_log |
Fachliches Audit-Log einer Instanz. |
workflow_create |
Neue Definition anlegen (Fehler, wenn Name existiert). |
workflow_update |
Definition ueberschreiben (mit automatischem Backup). |
workflow_start |
Neue Instanz starten und ersten Schritt ausfuehren. |
workflow_interact |
Laufende Instanz weiterfuehren; optional Kontextvariablen einspielen. |
Beispiel
curl -s -X POST https://workflow.flurneuordnung-sachsen.de/mcp \
-H "Authorization: Bearer wfmcp_..." \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"workflow_list\",\"arguments\":{}}}"
Technik
Code unter 0_workflow/mcp/: index.php (Bootstrap + Auth + JSON-RPC-Transport), McpServer.php (Protokoll + Registry + Scope-Enforcement), WorkflowTools.php (Fachlogik), McpKeys.php (Key-Verwaltung, Tabelle WORKFLOW_MCP_KEY). nginx: exakte location = /mcp noetig (sonst faengt der Scan-Blocker den slash-losen Pfad ab).
Verbinden mit claude.ai (OAuth)
Der claude.ai-Connector nutzt OAuth 2.1 (statische Bearer-Keys funktionieren dort nicht). Der Server bildet OAuth auf die MCP-Keys ab.
- In claude.ai einen Custom Connector anlegen, als URL nur
https://workflow.flurneuordnung-sachsen.de/mcpeintragen — KEIN client_id / kein Key in die Connector-Felder. - Auf Verbinden klicken. Es öffnet sich eine Anmeldeseite des Workflow-MCP.
- Dort den
wfmcp_…-Key (aus dem Dashboard) eingeben → Zugriff erlauben. Das erteilte Token trägt die Scopes dieses Keys.
Discovery/Endpunkte (automatisch genutzt): /.well-known/oauth-protected-resource, /.well-known/oauth-authorization-server, /register (DCR), /authorize, /token.
Fehler „nur die Startseite erscheint" / „invalid_client": Der Connector wurde mit dem Key als client_id angelegt (ohne Discovery). Connector entfernen und neu hinzufügen — dann registriert sich claude.ai selbst.
Token sparen
Der Server ist darauf ausgelegt, mit wenigen und kleinen Antworten auszukommen:
- Erst suchen, dann lesen.
task_searchstatttask_list, wenn nur ein Task gesucht wird. - Kleinste ausreichende Stufe.
task_doc format=xmlliefert nur das Beispiel,kurzzusätzlich Zweck und Parametertabelle,mddie volle Doku. - Struktur statt XML.
workflow_get format=strukturreicht zum Verstehen; die XML erst zum Ändern. - Bündeln.
workflow_batchersetzt mehrere Roundtrips (create+lint+start). - Vor dem Start prüfen.
workflow_lintundworkflow_varsfangen Fehler ab, die sonst erst eine gescheiterte Instanz und einen weiteren Roundtrip kosten.
* workflow_batch selbst hat den Scope read, prüft aber jede enthaltene Operation gegen die
gewährten Scopes — ein read-Key kann darüber kein workflow_create ausführen.