19. MCP-Server (AI-Assistenten-Anbindung)
Der MCP(Model Context Protocol)-Server ist die Schnittstelle, die es AI-Assistenten wie Claude ermöglicht, Vor-Ort-Daten der Platform in natürlicher Sprache abzufragen und zu diagnostizieren. Der Assistent kann Tag-Werte lesen, Alarm-Kontexte sammeln, Asset-Hierarchien durchsuchen und bis hin zur Bestätigung (Ack) von Alarmen durchführen.
Dies ist kein Ersatz für die REST API — dieselbe V5-Service-Schicht wird innerhalb derselben JVM aufgerufen, und Authentifizierung, Audit sowie Rate-Limiting nutzen exakt die Mechanismen aus /api/v5/*.
| Element | Wert |
|---|---|
| Endpunkt | POST https://<server>/api/v5/mcp |
| Übertragung | Streamable HTTP, stateless — sicher bei Neustarts, da keine Sitzungen erstellt werden |
| Spezifikation | MCP 2025-11-25 Stable |
| Bereitstellung | 32 Tools · 7 Ressourcen · 3 Prompts · Autovervollständigung · Fortschrittsanzeige · Elicitation |
Anbindung
Schritt 1 — api_key ausstellen
MCP verfügt über kein eigenes Authentifizierungssystem und verwendet direkt den V5 API-Schlüssel. Dieser wird gegen den vom Administrator ausgestellten api_token ausgetauscht.
curl -s -X POST "https://<server>/api/v5/auth" \
-H "Content-Type: application/json; charset=UTF-8" \
-d '{"token":"<api_token>"}'
# 200: { "data": { "api_key": "..." }, "meta": { "status": "OK" }, "errors": null }
Ein Erfolg liegt nur vor, wenn meta.status den Wert OK hat und data.api_key nicht leer ist. Zudem bedeutet 503 nicht, dass die Anmeldedaten falsch sind — es bedeutet, dass der Token-Speicher nicht erreicht wurde und somit keine Entscheidung getroffen werden konnte. Eine Tabelle zur Fehlerbehebung je nach Antwort findet sich unter Erste Schritte §1.8.
MCP sendet alle Anfragen, einschließlich Lesezugriffe, als POST. Der V5-Filter erlaubt POST, PUT, DELETE und PATCH nur für Rollen mit ADMIN/API, weshalb bei einer USER-Rolle selbst Lese-Tools mit 403 abgelehnt werden. Auch wenn die Nutzung als schreibgeschützt geplant ist, stellen Sie den Token als ADMIN/API aus.
Schritt 2 — Im Client registrieren
# Claude Code
claude mcp add --transport http plantpulse "https://<server>/api/v5/mcp" \
--header "X-API-Key: <api_key>"
// Claude Desktop — .mcp.json
{
"mcpServers": {
"plantpulse": {
"type": "http",
"url": "https://<server>/api/v5/mcp",
"headers": { "X-API-Key": "<api_key>" }
}
}
}
Anstelle von X-API-Key kann auch Authorization: Bearer <api_key> verwendet werden. Bei einem Authentifizierungsfehler erfolgt die Antwort mit 401 und dem Header WWW-Authenticate: Bearer.
Um DNS-Rebinding zu verhindern, wird der Origin-Header gegen eine Whitelist geprüft. Native Clients wie Claude Desktop oder Claude Code, die keinen Origin senden, sind immer zulässig. Browser-basierte Clients müssen jedoch in AI_MCP_ALLOWED_ORIGINS registriert werden. Da der Standardwert leer ist, werden alle nicht registrierten Clients mit 403 abgelehnt.
32 Tools
Es gibt 31 Lese-Tools und 1 Schreib-Tool(acknowledge_alarm). Tools zum Löschen, Steuern oder Ändern von Einstellungen sind aus Designgründen nicht vorhanden.
| Tool | Funktion | Pflichtargumente |
|---|---|---|
search_entities | Suche nach Domänenobjekten via Name, ID oder Beschreibung (Name → ID). Wird zuerst aufgerufen, wenn die ID fehlt | query |
list_latest_tag_values | Aktueller Tag-Wert | tag_ids |
get_tag_history | Zeitreihen-Historie eines Tags | tag_id, from |
get_asset_snapshot | Snapshot aller Tags einer Anlage | asset_id |
list_alarms | Alarm-Liste | — |
acknowledge_alarm | Alarm bestätigen — Grund(comment) ist Pflicht und wird im Audit protokolliert | alarm_seq, comment |
get_alarm_context | Alarmursache-Diagnosepaket | alarm_seq |
list_alarm_suppressions | Verborgene Alarme (verborgen, unterdrückt, ausgenommen) | — |
get_alarm_performance | Alarm-Systemleistung — gleiche Werte wie GET /alarm/performance | scope_type, scope_id |
get_edge_status | Status eines einzelnen Edge-Gateways | edge_id |
list_edge_status | Liste der Edge-Gateways | — |
get_edge_connection_history | Edge-Health-Historie (Tagesintervalle) | edge_id, date |
list_opc_connections | Liste der OPC-Erfassungsverbindungen | — |
get_asset_tree | Baum der Anlagenhierarchie | asset_id |
get_asset_by_external | Suche nach Hierarchieknoten via MES/EAM-Nummer | external_system, external_id |
get_site_overview | Site-Ontologie Überblick | site_id |
trace_asset_relations | Beziehungsverfolgung — Upstream/Downstream-Auswirkungen | entity_id |
query_knowledge_graph | Ontologie SPARQL-Abfrage | sparql |
list_asset_documents | Anlagenzugehörige Dokumente | asset_id |
get_asset_timeline | Timeline von Anlagenereignissen | asset_id |
list_work_orders | Liste der Workorder | — |
get_work_order_kpi | Workorder Details + KPI | order_id |
get_work_order_by_external | Workorder-Suche via MES/ERP-Nummer | external_system, external_id |
get_asset_kpi | Zusammenfassung der Anlagen-KPIs über Zeitraum (Status, Alarm, OEE) | asset_id, from |
get_asset_schedule | Anlagen-/Site-Kalender (Schicht, Stillstand, Feiertag) | asset_id |
list_maintenance_orders | Instandhaltungsauftrag (Ruf, Reparatur, Teil, ISO-Code) | scope_id |
get_maintenance_summary | Instandhaltungszusammenfassung (Baugruppe, Fehlermodus, Warte-/Reparaturzeit, Wiederholung) | scope_id |
get_maintenance_order_by_external | Instandhaltungsauftrag-Suche via CMMS-Nummer | external_system, external_id |
get_connection_health | Health-Rollup der Anlagenhierarchie | — |
get_current_time | Aktuelle Serverzeit | — |
get_eql_reference | EQL-Referenz für Konsoleneingabe (Syntax, Event-Typen, Funktionen, Beispiele) | surface |
validate_eql | EQL-Kompilierungsprüfung (ohne Deployment) | surface, eql |
Die Schlüssel für Instandhaltungszeilen entsprechen den V5 Instandhaltungsaufträgen — maintenance_order_id(String), maintenance_kind_code, status_code, failure_record_seq, maintenance_plan_id(String), failure_mode_code, maintainable_item_code. Da maintenance_order_id entweder MAINTENANCE_ORDER_000001 oder eine numerische Zeichenfolge alter Zeilen("12") ist, behandeln Sie diese nicht als Zahl.
ERROR, WARN, INFODie in den Bildschirmbezeichnungen von get_connection_health sichtbaren Werte critical/major/minor sind Anzeige-Buckets. Für Filter in list_alarms(severity=) müssen die Kanonischen Werte verwendet werden.
7 Ressourcen
Dies sind schreibgeschützte Kanäle, über die der Assistent «prüfen kann, was vorhanden ist», bevor er Tools aufruft.
pp://sites, pp://ontology/{site_id}, pp://assets/{site_id}/tree, pp://uns/{site_id}, pp://catalog/{store}/tables, pp://catalog/{store}/{table}/schema, pp://domain-graph
{store} erlaubt nur metastore, eventstore und analytics.
3 Prompts
| Name | Verfahren |
|---|---|
diagnose-asset | Asset-Störungsdiagnose — Alarm → Kontext → Tag-Historie → Verbindung → Downstream-Auswirkung → Ursachenkandidaten |
shift-briefing | Schicht-Briefing — Health → Alarm → Order/KPI → Übergabezusammenfassung |
alarm-triage | Alarm-Klassifizierung — Liste → Priorität → Empfehlung → (bei Genehmigung) Bestätigung |
Konfiguration — AI_MCP_* von pp.mm_config
Die maßgebliche Quelle ist die PostgreSQL-Tabelle pp.mm_config. plantpulse-ai.properties wurde entfernt und der Lesezugriff darauf aufgehoben — siehe Property Reference.
| Schlüssel | Standardwert | Bedeutung |
|---|---|---|
AI_MCP_ENABLED | true | Wenn false, gibt /api/v5/mcp einen 404 aus |
AI_MCP_ALLOWED_ORIGINS | (leer) | Origin-Whitelist für Browser-Clients (kommagetrennt) |
AI_MCP_TREE_MAX_NODES | 2000 | Obergrenze der Antwortknoten im Baum |
AI_MCP_TREE_DEFAULT_DEPTH | 2 | Standardtiefe für get_asset_tree |
AI_MCP_TREE_MAX_NODE_TAGS | 100 | Anzahl der Tags pro Knoten |
AI_MCP_TREE_ONTOLOGY_MAX_CHARS | 200000 | Zeichenobergrenze für Ontologie-Antworten |
AI_MCP_TREE_ONTOLOGY_DEFAULT_DEPTH | 3 | Standardtiefe für trace_asset_relations |
AI_MCP_TREE_ONTOLOGY_MAX_TAGS | 500 | Budget für Tag-Zeilen in der gesamten Ontologie-Antwort |
Es gibt nur einen Weg, die Werte zu ändern — über den Konfigurationsbildschirm(/config/index) oder durch Bearbeiten von pp.mm_config. Da MCP den Cache bei jeder Anfrage liest, ist kein Neustart erforderlich.
PP_AI_MCP_* bewirkt nichtsDies gilt unabhängig davon, ob es der erste Bootvorgang ist oder nicht. Der Seeder, der Umgebungsvariablen in Tabellen übertrug, sowie die ${PP_AI_*}-Substitutionsschicht wurden am 18.09.2026 entfernt. Eingaben werden nun stillschweigend ignoriert, ohne einen Fehler zu melden. Dies führt oft zu dem schwer diagnostizierbaren Problem, dass Einstellungen trotz Konfiguration nicht greifen. Fehlende Schlüssel werden mit den Standardwerten der obigen Tabelle belegt.
Audit und Sicherheit
- Authentifizierung, Rate-Limiting und Audit erfolgen über die bestehende
/api/v5/*-Filterkette. acknowledge_alarmhinterlässt ein eigenes Audit (AkteurMCP). Wenn eine Begründung fehlt, wird der Assistent aufgefordert, diese nachzuliefern; bei Clients ohne diese Funktion wird «Begründung erforderlich» ausgegeben.- Ausschluss von allgemeinen Änderungs-Audit-Hooks: Da alle Aufrufe, einschließlich Lesezugriffe, als
POSTerfolgen, würden Hooks jeden Aufruf fälschlicherweise als Änderung protokollieren. - Kein Token-Weiterleitungspfad: Da die Service-Schicht derselben JVM direkt aufgerufen wird, gibt es keinen Weg, empfangene Anmeldedaten an andere Systeme weiterzuleiten.
Weiterführende Links
Erste Schritte · Gesamte Liste der Endpunkte · Asset Service