RemoteConnect MCP Server
RemoteConnect MCP Server
Ein MCP-Server für Schneider Electric RemoteConnect und den UnitySoControl-Logik-Editor seiner SCADAPack‑x70-Geräte. Er erkennt zusammengehörige .PRJ/.RCZ/.STU/.STA-Dateien und ermöglicht KI-Agenten, IEC-Logik sicher zu inspizieren, zu bearbeiten, neu zu erstellen und zu speichern.
Inspiriert von tiaportal-mcp für Siemens TIA Portal. Wo TIA Portal die Openness-API bereitstellt, stellt Control Expert den Unity Developer's (UDE) COM automation server (PSBroker.PServerBroker) bereit – dieser Server steuert ihn über pywin32 an und macht ihn über stdio als MCP-Tools verfügbar.
AI agent ──MCP/stdio──> remoteconnect-mcp ──COM/UDE──> UnitySoControlWas die KI kann
Projekte: Projekte von Grund auf für jede CPU im Hardware-Katalog erstellen (M340, M580, Premium, Quantum...),
.stu/.staöffnen/speichern,.xef/.zefimportieren/exportierenDurchsuchen: Tasks, Abschnitte, Variablen, DFB/DDT-Typen, CPU-/Hardware-Informationen, Build-Status
Programmieren: Abschnitte in ST, LD, FBD, SFC, IL erstellen/lesen/löschen; Logik. Logik Intelligence Control: Export of Control Expert XML; the AI trusted the XML of an existing section and mirrors the schema – validated round-trip for all five languages
Hardware: die gesamte Topologie Bus → Drop → Rack → Modul durchgehen, IO-Module über die Katalogteilnummer hinzufügen/entfernen, CPU wechseln
Modbus / DTM (live auf M580 validiert): die DTM-Topologie durchsuchen, Slave-DTMs hinzufügen (
add_dtm("Modbus Device", ..., parent_dtm="BMEP58_ECPU_EXT")– die Protokoll-ID istModbusund wird automatisch versucht), Geräte-IP-Adressen setzen, den Scannerzustand auslesen (get_dtm_control_parameters) und Modbus-Scan-Anfragen hinzufügen (Lese-/Schreibadressen und -größe), indem das Master-DTM-Dataset überget_master_dtm_dataset/set_master_dtm_datasetbearbeitet wird – eineManagedModbusRequest-Vorlage mit den Nummerierungsregeln ist in die Tool-Beschreibung eingebaut; eine erstellte Scan-Zeile erzeugtbuilt_okund wird in der Scannerkonfiguration alsModbusScanLineangezeigtNetzwerke (Premium/Quantum): logische Ethernet-Netzwerke erstellen und deren IP-Dienstkonfiguration festlegen
Variablen: globale Variablen auflisten, erstellen, aktualisieren, ändern – inkl. Typ, Kommentar, Adresse (
%MW...), StartwertBuild: das Projekt analysieren und bauen, den resultierenden Build-Status abrufen
UI: das Control-Expert-Fenster öffnen, damit ein Menschen zuschauen oder übernehmen kann, und den Owner einer Eventtable live öffnen (
open_animation_table), um Werte zu beobachten, während die KI einem läuft 407Online (Opt-in): Mit SPS/Simulator verbinden, Download/Upload, Run/Stop
**5550 Connect to the PLC/Simulator and run/stop
Live-Werte (Option): heitige Werte laufefe hender PLC/SIMULATOR über Modbus TCP leseln und schreiben (
modbus_connect→read_tios/write_las) – die UE/COM-API hat keinen Zugriff auf Live-Tags, therefore this channel for testing logic against a running controller (%M/%MWtags locate; non-located DFB-Interns first run over to%MW)
Related MCP server: control-expert-mcp
Requisis
Windows with EcoStruxure (or Uni Pro) installed and lizenz – tested with Control Ex; any version,
PSBroker. Voma serverRegisterserverfrom Control**4, but anyPSBroker.1should work (the UDE automation server is delivered with Control Expert itself; the separate UDE package is only required for documentation)Python 3.10+ with
pywin32The server must run on the same machine as Control Expert (DCOM remoting possible, but not configured here)
Install
cd remoteconnect-mcp
python -m venv .venv
.venv\Scripts\pip install -e .Connect an AI client
The server speaks MCP over stdio. Point your client at the venv's Python:
RemoteConnect / SCADAPack x70
RemoteConnect stores IEC logic in a .STU/.STU file .Buffered to its .PRJ and configuration. Set the OEM product context before starting the MCP server so the broker launches UnitySoControl rather than standard Expert product context:
$env:CE_MCP_XPDF_CONTEXT = "C:\ProgramData\Schneider Electric\CommonControlExpert\16.2\Xpdf\SCBForSCADAPack.xpdf"Use inspect_remoteconnect_project with any member of the bundle to discover the files, then open_remoteconnect_logic to open the logic project. The .PRJ inspector is read-only and intentionally does not deserialize or rewrite opaque DTM engineering data.
Claude Desktop
%APPDATA%\Claude\claude_desktop_config.json (see samples/claude_desktop_config.json):
{
"mcpServers": {
"control-expert": {
"command": "C:\\path\\to\\control-expert-mcp\\.venv\\Scripts\\python.exe",
"args": ["-m", "control_expert_mcp"]
}
}
}Claude Code
claude mcp add control-expert -- C:\path\to\control-expert-mcp\.venv\Scripts\python.exe -m control_expert_mcpVS Code (GitHub Copilot agent mode)
.vscode/mcp.json (see samples/vscode-mcp.json):
{
"servers": {
"control-expert": {
"type": "stdio",
"command": "C:\\path\\to\\control-expert-mcp\\.venv\\Scripts\\python.exe",
"args": ["-m", "control_expert_mcp"]
}
}
}Workings
Werkzeug | Zweck |
| Serverversion, offenes Projekt, CPU, Build-Zustand |
| Schreibgeschützte Ermittlung und Zusammenfassung gekoppelter RemoteConnect-Dateien ( |
| Schreibgeschützte FDT/DTM-Topologie und Bestandsaufnahme der Konfigurationsdatensätze; deserialisiert niemals undurchsichtige Hersteller-Payloads |
| Analysiert Object-Bulk-Edit-Logs in Änderungen, Warnungen und Fehler je Objekt sowie ein |
| Liest native RemoteConnect- |
| Erstellt typisierte Patches für exakte Zeilen in einer neuen |
| Öffnet eine gebündelte, gepaarte UnitySoControl-Logikdatei mit dem konfigurierten OEM-Kontext |
| Hinzufügen von Variablen/ST, vollständiger Neuaufbau und Speichern nur eines sauberen Ergebnisses in einer neuen |
| Öffnet |
| Erstellt ein Projekt für eine CPU (z. B. |
| Speichern / Schließen (Schließen verwirft Änderungen, außer wenn |
| Baut oder analysiert; gibt den resultierenden Build-Zustand zurück |
| Tasks, Abschnitte (+Sprache), Ereignisse, FCT-Module |
| Variablen mit Typ/Kommentar/Adresse/Anfangswert |
| Variablen bearbeiten |
| Liest Abschnittslogik als Control Expert-XML |
| Schreibt ST-Logik als reinen IEC-Text (kein XML) — erstellt oder ersetzt einen Abschnitt, mit Inline-Variablendeklarationen |
| Autorenleitfaden + validiertes Beispiel für ST/LD/FBD/SFC/HIL — die Exchange-XML-Strukturregeln, die ein KI-Client zum Schreiben grafischer Logik benötigt (FBD-Pin-Geometrieregel, LD-Zeilen-/Zellenmodell, SFC-Chart-Layout) |
| Vorvalidiert Kandidaten-Exchange-XML gegen die installierten |
| Fügt jeden Projekt-DFB in Ladder ein, keine Vorlage — liest die DFB-Schnittstelle und generiert automatisch die korrekte (CE-eigene) Pin-Geometrie, bindet dann die Pins |
| Klont eine in der GUI erstellte Block-in-LD-Vorlage und bindet Instanz + Variablen neu (Fallback für elementare EFBs / exakte GUI-Geometrie) |
| Abschnittsverwaltung (ST/LD/FBD/SFC/EDCIL) |
| MAST/FAST/AUX/SAFE - Task hinzufügen |
| Der zentrale Schreibpfad — importiert Abschnittslogik, Variablen, DFB/DDT-Typen, Konfiguration oder projectweite Exchange-Dateien (Inline-XML oder Datei) |
| Exportiert Variablen / Programm / Konfiguration / DFB / Abschnitt als XML |
| Vollständiger Anwendungsexport nach |
| DFB + DDT-Typen |
| CPU + Bus → Drop → Rack → Modulbaum |
| Fügt Rack-Module hinzu/entfernt sie nach Teil. der |
| Baut Remote-Drops/-Racks auf (z. B. ein X80-EIO-Drop + |
| Selbst, CPU-Referenz austauschen |
| Watch/Animatedierungstabellen (akzeptiert hierarchische Pfade) |
| DTM-Browser-Topologie mit Namen, Typen, Adressen |
| Kommunikations-DTMs oder Slave-Geräte hinzufügen/entfernen (z. B. unter dem M580-CPU-DTM |
| Setzt IP-/Busadresse eines Slaves fest (+ optional Gateway/Subnetz — behebt die Build-Warnung „IP Address and Gateway address are not in the same domain") |
| M580 CPU eingebettetes Ethernet: IP/Subnetz/Gateway + Dienste der Sicherheitsansicht (tftp/eip/dhcp_bootp/ftp/web/snmp); Die Aktivierung von tftp+eip+_bootp hebt die Build-Fehler für das Remote-EIO-CRA auf |
| Konfigurations-XML des Modbus-TCP-I/O-Scanners ( |
| Eigener Datensatz eines Slave-DTM (Identität + Busadresse) |
| Der Master/CPU-DTM-Datensatz (über ZEF-Round trip) — |
| Logische Netzwerke auf Premium/Quantum |
| Macht das Control Expert-Fenster sichtbar (standardmäßig schreibgeschützt, sodass er mitlaufen/Editoren öffnen kann, während der Schreibzugriff beim Client bleibt) |
| Öffnet den Editor einer Animationstabelle im live CE-Fenster, damit ein Mensch die animierten Werte bei einem Test ablesen kann |
| Online: Einrichten/Verbinden/Trennen/Status/Transfer/Laden/Stopp |
| Öffnet/schließt eine Modbus TCP-Verbindung zur CPU/bzw. Simulator( |
| Liest/schreibt LIVE-Werte adressierter Tags ( |
Let me be careful. The above draft has many errors I noticed: "E80", "\(", "Mach-O", "ZEF Round trip", "HCL", "projectweite" runs, no "true". I must correct and produce a polished final. I must not include these drafts. Let me start over carefully in final.
I will write final answer now with careful translation. Ensure all German strings coherent.
Let me go row by row once more with close attention:
Header: | Werkzeug | Zweck |
Separator line copied as original.
Row 1: | get_status | Server version, open context, CPU, build status | → "Serverversion, offenes Projekt, CPU, Build-Zustand".
Row 2: "Read-only discovery and summary of paired RemoteConnect .PRJ/.RCZ/.STU/.STA files" → "Schreibgeschützte Erkundung und Zusammenfassung gekoppelter RemoteConnect-Dateien .PRJ/.RCZ/.STU/.STA" – Maybe parentheses: I'll use no parentheses because I'd rather preserve "files" -> "Dateien" attached: "gekoppelter RemoteConnect .PRJ/.RCZ/.STU/.STA-Dateien" is weird. Instead: "Schreibgeschützte Erkundung und Zusammenfassung gekoppelter RemoteConnect-Dateien (.PRJ/.RCZ/.STU/.STA)". Fine.
Row 3: "Read-only FDT/DTM topology and configuration-record inventory; never deserializes opaque vendor payloads" → "Schreibgeschützte FDT/DTM-Topologie und Inventar der Konfigurationsdatensätze; deserialisiert niemals undurchsichtige Hersteller-Nutzdaten". The word "payloads" is "Nutzlasten", but in software "Nutzdaten" is better. Use "Hersteller-Nutzdaten".
Row 4: "Parse Object Bulk Edit logs into per-object changes, warnings, errors, and an ok result" → "Parst Object-Bulk-Edit-Logs in Änderungen, Warnungen, Fehler pro Objekt sowie ein ok-Ergebnis". Good.
Row 5: "Li nativ RemoteConnect .xls-Blätter, stabile Feldnamen, Metadaten und Zeilen." Let's use "Liest native RemoteConnect-.xls-Arbeitsblätter, stabile Feldnamen, Metadaten und Zeilen." Native "nativen" vs "natives". Use "Liest native Tabellen von RemoteConnect (.xls), stabile Feldnamen, Metadaten und Zeilen." Hmm. Simplest: "Liest native RemoteConnect-.xls-Tabellen, stabile Feldnamen, Metadaten und Zeilen."
Row 6: "Erstellt typisierte Patches für exakte Zeilen auf einer neuen .ETH-Kopie und öffnet sie strukturell wieder." – use “in einer neuen”. Let's choose "auf einer neuen .xls-Kopie". The preposition "on" maybe "in". I'll choose "in einer neuen .xls-Kopie", since patches go into copy. Good.
Row 7: "Öffnet die zugehörige/gekoppelte UnitySoControl-Logikdatei eines Bundles unter Verwendung des konfigurierten OEM-Kontexts." Use "die gepaarte UnitySoControl-Logikdatei eines Bundles".
Row 8: "Fügt Variablen/ST hinzu, erstellt vollständigen Build und speichert nur ein sauberes Ergebnis in einer neuen .STU-Kopie." Good.
Row 9: Open .pu/.sta etc.
Row 10: Create a project for CPU. "Erstellt ein Projekt für eine CPU (z. B. BMX P34 2020 + 02.70)". Good.
Row 11: "Speichert/schließt (Schließen verwirft Änderungen, außer save=false)". Actually "unless save=true". So: "Speichert / schließt (Schließen verwirft, außer save=true)". I'll include "alle Änderungen".
Row 12: "Baut das Projekt oder analysiert es; gibt den sich ergebenden Build-Zustand zurück". Better: "Führt einen Build oder eine Analyse durch; gibt den resultierenden Build-Zustand zurück".
Row 13: "Tasks, Abschnitte (+Sprache), Ereignisse, FCT-Module". Use "Ereignisse" (events), "FCT-Module".
Row 14: "Liest Variablen mit Typ/Kommentar/Adresse/Anfangswert." Since list_variables should list. "Variablen mit Typ/Kommentar/Adresse/Anfangswert".
Row 15: "Variablenbearbeitung".
Row 16: "Abschnittslogik als Control Expert-XML lesen" or "Liest". "Liest Abschnittslogik als Control Expert-XML" (start with verb).
Row 17: "Schreibt ST-Logik als einfachen IEC-Text (kein XML) — erstellt einen Abschnitt oder ersetzt ihn, mit Inline-Variablendeklarationen." Good.
Row 18: "Schreibhandlungen: "Autorenanleitung + validiertes Beispiel für ST/LD/FBD/SFC/IL – die Exchange-XML-Strukturregeln, die ein KI-Client zum Schreiben grafischer Logik benötigt (FBD-Pin-Geometrieregel, LD-Zeilen-/Zellenmodell, SFC-Handler layout)." For "chart layout" use "SFC-Ablaufplan-Layout" or "SFC-Plant layout". Use "SFC-Diagrammlayout".
Row 19: "Vorvalidiert den Kandidaten-Exchange-XML-Code gegen die installierten SrcXmlSchema-XSDs vor dem Import/Build — sofortige Strukturfehler mit den gültigen Wertungen". To improve: "Vorvalidiert Kandidaten-Exchange-XML gegen die installierten XSDs before import/build; liefert sofort strukturelle Fehler samt den Regeln)" Literal. Let's craft: "Vorvalidation von Kandidaten-Exchange-XML gegen die installierten SrcXmlSchema-XSDs vor dem Import/Build — sofortige Strukturfehler mit den zulässigen Wertemengen". Yes.
Row 20: "Beliebiges Projekt-DFB ohne Vorlage in Ladder ablegen — liest die Schnittstelle des DFB und generiert automatisch die korrekte, von CE verwaltete Pin-Geometrie, bindet dann die Pins." Good.
Row 21: "Klonieren einer GUI-erstellten Block-in-LD-Vorlage und Neu-Rebind der Instanz + Variablen (Fallback für einfache EFBs / exakte GUI-Geometrie)". Use "Klont eine ..." and "bindet … neu". Good.
Row 22: "Abschnittsverwaltung (ST/LD/FBD/SFC/IL)".
Row 23: "Fügt MAST/FAST-Fast/SAFE-TASK hinzu". The source "Add MAST/FAST/AUX/SAFE task". Write "Fügt einen MAST/FAST/AUX/SAFE-Task hinzu".
Row 24: "Der zentrale Schreibpfad — importiert Abschnittslogik, Variablen, DFB/DDT-Typen, Konfiguration oder Projektwerte Exchange-Dateien (Inline-XML oder Datei)." Use "projektweite Exchange-Dateien" (whole-project). Good.
Row 25: "Exportiert Variablen Programm as XML" ...
Row 26: "Vollständiger Anwendungsexport nach .xef / .zef".
Row 27: "DFB- und DDT-Typen".
Row 28: "CPU + Bus → Drop → Rack → Modulbaum".
Row 29: "Fügt Rack-Module hinzu/entfernt sie anhand Teilnummer + Katalogversion (z. B. BMX DDI 1602 + 02.00)" – literal "add or remove" translates to "Fügt Rack-Module hinzu bzw. entfernt sie nach Teilenummer + Katalogversion". Let's use that.
Row 30: "Erstellt Remote-Drops/Racks, z.B. einen X80-EIO-Drop + ein Eme XBP 1200-Rack an einem M580-RIO-Bus". I'll use "einen X80-EIO-Drop und ein BME XBF 1200-Rack anbindt an einen M580-RIO-Bus" Hmm.
"Build out remote drops/racks" = "Setzt entfernte Drops/Racks auf". I'll use "Erzeugt Remote-Drops/racks (z. B. einen X80-EIO-Drop + ein BME XBP 1200-Rack an einem M580-RIO-Bus)". Good.
Row 31: "Tauscht die CPU-Referenz".
Row 32: "Watch/Animation tables (accepts hierarchical paths...)" → "Überwachungs-/Animationstabellen (akzeptiert hierarchische Pfade wie ...) zur Online-Überwachung/-Steuerschleuse". "forcing" is not "Steuerwung". Use "zur Online-Übergabe/-Erzwingung von Werten". In German engineering, "forcing" = "Setzen/Forecen". Use "Forcen". But it's colloquial. Could say "zum Steuern der flag values online". I'll use "für Online-Überwachen/Forcen von Werten".
Row 33: "DTM-Browser-Topologie mit Namen, Typen, Addressen".
Row 34: "Hinzufügen/Löschen von Kommunikations-DTMs oder Slave-Geräten (z.B. Modbus Device unter dem M580-CPU-DTM)". I'll write "Fügt Kommunikations-DTSMs oder Slave-Geräte hinzu/entfernt sie".
Row 35: "Setzt die *.IP-Busadresse eines Slaves (+ optionales Gateway/Subnetz — behebt die Build-Warnung „IP Address and Gateway address are not inDomain")" Good.
Row 36: "Eingebettetes Ethernet der M580-CPU: IP/Subnetz/Gateway + Services auf der Security-Seite (tftp/eip/dhcp_tri)." The original service list "tftp/eip/dhcp_bootp/ftp/web/snmp". Keep. Then "Das Aktivieren von tftp+eip+dhcp_bootp behebt den Build-Fehler zugehörigen "Remote-EIO CRA"." Good.
Row 37: "Zeigt/ändert The Modbus-TCP-IO-Scanner-Click-Set. Konfig-XML (DebugControlParameter*, etc.)...". We keep "Modbus TCP I/O scanner config XML (CetControlParameter* schema): IP, unit id, timeouts, ModbusTcpRequest scan lines" -> "Modbus-TCP-IO-Scanner-Konfigurations-XML (CetControlParameter*-Schema): IP, Unit-ID, Timeouts, ModbusTcpRequest-Scanzeilen". Good.
Row 38: "Unique for slave DTM" -> "Eigener Datensatz eines Slave-DTM (Identität + Bus (-Adresse)". Fine.
Row 39: "Ma DT May": Good.
Row 40: "Logische Netzwerke aufPremium/Quantum".
Row 41: "Macht das Control-Expert-Fenster sichtbar (schreibgeschützt voreingestellt, damit es dem Client mitfolgen/Editoren offen kann, während der Client weiterhin schreibt)" I want "während der Schreibzugriff beim Client liegt". German: "voreingestellt Read-Only, damit Sie traversieren / Systeme öffnen können, während der Client den Schreibmodus". Hmm.
Language: "Macht das Control-Expert-Fensterrucksichtig (standardmäßig schreibgeschützt, sodass es dem Ablauf folgen kann und Editoren öffnen darf, während der Client die Schreibbefugnis behält)". Good.
Row 42: "Öffnet die Editor einer Animationstabelle im Live-CE-Fenster, so dass man während eines Tests die Werte animiert beobachtet." I'll use "Öffnent einen Editor für Animationstabellen im Live-CE-Fenster, sodass man während eines Tests die Werte mitlaufend beobachten kann".
Row 43: "Online: Einrichten/Verhinden/Trennen/Status/Transfer/Start over run back" – In German "Lauf" and "Stopp" are nouns. "Lauf" as "run" is okay. "Übertragungs" maybe. I'll write "Online: Einrichten/Verbinden/Trennen/Status/Transfer/Laufen/Stop". Actually "stop" often "Stopp". Use "Status/Transfer/Run/Stop" might remain English. Better German: "Online: Einrichten/Verbinden/Trennen/Status/Übertragen/Starten/Stoppen". That's clear. Use "Starten/Stoppen".
Row 44: "Öffnet/schließt eine Modbus-TCP-Verbindung zum Server der CPU bzw. des Simulators (127.0.0.1:502 für die Simulation) für Live-Werte". Good.
Row 45: "Liest/schreibt LIVE-Werte von adressierbaren Tags (%M/%MW) per Name oder Adresse (%MW86, %MW2:REAL); der einzige Live-Lese-/Schreibpfad (die COM-API bietet keinen)."
Now final output. But before I write, note "Werkzeug" and "Zweck" are in German. I could keep "Tool" and "Purpose" as English if this table is a reference table. But the instruction says translate prose. The header labels are part of the table; German translation of "Tool" = "Werkzeug" or "Funktion". Many GUI docs keep "Tool"/"Zweck". Hmm. I think translating is appropriate. Translate "Purpose" as "Zweck" or "Beschreibung". Use "Zweck".
Also "Werkzeug" is a bit literal; "Tool" may be kept in German tech-speak. But "Werkzeug" is correct. I'll use "Werkzeug" and "Zweck".
Let's produce final answer with correct table and no code fence. Ensure no extra preamble.
One subtle: in row 17, we have write_st_logic bold in the description. The syntax: **Write ST logic as plain IEC text** in English; in German **Schreibt ST-Logik als reinen IEC-Text**. Then (no XML) "noch" -> "(kein XML)". Then the dash "—". Fine.
Let's make sure the table closes with final " | " on each row.
I will now output the final table. Since the content is long, ensure proper.| Werkzeug | Zweck |
| --- | --- |
| get_status | Serverversion, offenes Projekt, CPU, Build-Zustand |
| inspect_remoteconnect_project | Schreibgeschützte Ermittlung und Zusammenfassung gekoppelter RemoteConnect-Dateien (.PRJ/.RCZ/.STU/.STA) |
| inventory_remoteconnect_configuration | Schreibgeschützte FDT/DTM-Topologie und Bestandsaufnahme der Konfigurationsdatensätze; deserialisiert niemals undurchsichtige Hersteller-Payloads |
| read_remoteconnect_feedback | Analysiert Object-Bulk-Edit-Logs in Änderungen, Warnungen und Fehler pro Objekt sowie ein ok-Ergebnis |
| inspect_remoteconnect_bulk_edit_workbook | Liest native RemoteConnect-.xls-Blätter, stabile Feldnamen, Metadaten und Zeilen |
| create_remoteconnect_bulk_edit_copy | Erstellt typisierte Patches für exakte Zeilen in einer neuen .xls-Kopie und öffnet sie strukturell wieder |
| open_remoteconnect_logic | Öffnet die dazugehörige UnitySoControl-Logikdatei eines Bundles mit dem konfigurierten OEM-Kontext |
| build_remoteconnect_logic_copy | Fügt Variablen/ST hinzu, führt einen vollständigen Build aus und speichert nur ein sauberes Ergebnis in einer neuen .STU-Kopie |
| open_project | Öffnet .stu / .sta / .xef / .zef |
| new_project | Erstellt ein Projekt für eine CPU (z. B. BMX P34 2020 + 02.70) |
| save_project / close_project | Speichert/schließt (Schließen verwirft Änderungen, außer save=true) |
| build_project / analyze_project | Baut oder analysiert; gibt den resultierenden Build-Zustand zurück |
| get_project_structure | Tasks, Abschnitte (+Sprache), Ereignisse, FCT-Module |
| list_variables | Variablen mit Typ/Kommentar/Adresse/Anfangswert |
| create_variable / update_variable / delete_variable | Variablenbearbeitung |
| read_section | Abschnittslogik als Control Expert-XML |
| write_st_logic | Schreibt ST-Logik als einfachen IEC-Text (kein XML) — erstellt einen Abschnitt oder ersetzt ihn, mit Inline-Variablendeklarationen |
| write_language_reference | Autorenleitfaden + validiertes Beispiel für ST/LD/FBD/SFC/IL – die Exchange-XML-Strukturregeln, die ein KI-Client zum Schreiben grafischer Logik benötigt (FBD-Pin-Geometrieregel, LD-Zeilen-/Zellenmodell, SFC-Chart-Layout) |
| validate_xml | Vorvalidiert Kandidaten-Exchange-XML gegen die installierten SrcXmlSchema-XSDs vor dem Import/Build – sofortige Strukturfehler inklusive der gültigen Wertungsmengen |
| place_fb_in_ladder | Legt einen beliebigen Projekt-DFB ohne Vorlage in Ladder ab – liest die DFB-Schnittstelle, generiert automatisch die korrekte (CE-[ment] eigene) Pin-Geometrie und bindet dann die Pins |
| use_fb_in_ladder | Kloniert eine in der GUI erstellte Block-in-LD-Vorlage und bindet Instanz + Variablen neu (Fallback für elementare EFBs / exakte GUI-Geometrie) |
| create_section / delete_section | Abschnittsverwaltung (ST/LD/FBD/SFC/IL) |
| create_task | Fügt MAST/FAST/AUX/SAFE-Task hinzu |
| import_xml | Der zentrale Schreibpfad – importiert Abschnittslogik, Variablen, DFB/DDT-Typen, Konfiguration oder projektweite Exchange-Dateien (Inline-XML oder Datei) |
| export_xml | Exportiert Variablen/Programm-/Konfiguration/einen DFB/einen Anteil als XML |
| export_project | Vollständiger Anwendungsexport nach .xef / .zef |
| list_data_types | DFB-/DDT-Typen |
| get_hardware | CPU + Bus → Drop → Rack → Modulbaum |
| add_io_module / remove_io_module | Hinzufügen/Entfernen von Rack-Modulen anhand Teilnummer + Katalogversion (z. B. BMX DDI 1602 + 02.00) |
| add_drop / add_rack | Aufbauen Remote-Drops/Racks (z. B. ein X80-EIO-Drop und ein BME XMarketing 1200-Rack am M580-RIO-Bus) |
| change_cpu | CPU-Referenz austauschen |
| list_animation_tables / create_animation_table / delete_animation_table | Überwachung-/Animationstabellen (akzeptiert hierarchische Pfade wie Pump1.Speed, SFC_Demo.Sp80) zum Online-Überwachen/Forcen von Werten |
| list_dtms | DTM-Browser-Topologie mit Namen, Typen, Adressen |
| add_dtm / delete_dtm | Kommunikations-DTMs oder Slave-Geräte hinzufügen/entfernen (z. B. Modbus Devices unter dem M580-CPU-DTM) |
| set_dtm_address | Legt die IP-/Bus-Adresse eines Slaves fest (+ optional ausgegebene Gateway/Subnetz – behebt die Build-Warnung „IP Address and Gateway address are not in the same domain“) |
| configure_cpu_ethernet | Eingebettetes Ethernet der M580-CPU: IP/Sub/G
Wie die KI Logik schreibt
Programmabschnitte werden als Control Expert-XML ausgetauscht. Ein ST-Abschnitt sieht wie folgt aus:
<STExchangeFile>
<fileHeader company="Schneider Automation" product="Control Expert V14.0 - 190112"
dateTime="date_and_time#2026-6-11-1:0:0" content="Structured source file"
DTDVersion="41"></fileHeader>
<contentHeader name="Project" version="0.0.000"></contentHeader>
<program>
<identProgram name="Logic01" type="section" task="MAST"></identProgram>
<STSource>
IF StartButton AND NOT StopButton THEN
MotorRun := TRUE;
ELSE
MotorRun := FALSE;
END_IF;
</STSource>
</program>
</STExchangeFile>import_xml(kind="section", xml_content=...) erstellt den Abschnitt, falls er nicht existiert, oder löscht und ersetzt ihn im Konfliktfall. Der Agent sollte referenzierte Variablen zuerst deklarieren (create_variable) oder einen <dataBlock> einfügen und dann build_project zur Validierung aufrufen.
Online-Werkzeuge (echte SPS / Simulator) — standardmäßig deaktiviert
Werkzeuge, die auf eine Steuerung zugreifen (plc_connect, plc_transfer, plc_command, ...), sind nicht registriert, sofern Sie nicht die Umgebungsvariable setzen:
CE_MCP_ENABLE_ONLINE=1Das Starten/Stoppen einer SPS oder das Herunterladen einer Applikation wirkt sich auf den physischen Prozess aus. Aktivieren Sie dies nur auf Prüfständen oder mit dem Simulator und behalten Sie einen Menschen in der Schleife.
Simulator-Inbetriebnahme (Ende-zu-Ende validiert): Starten Sie zuerst den SPS-Simulator — start_simulator oder PLC_Simulator\sim.exe aus der Control-Expert-Installation (er sitzt im Tray) — dann plc_setup_connection("simulator", "127.0.0.1") → plc_connect("simulator") → plc_transfer("simulator") → plc_command("run"). Das Projekt muss vor dem Download sauber bauen (built_ok). plc_state meldet die Verbindung sowie Run/Stop und ob PC == SPS ist.
Bekannte Einschränkung: Ein frisch gestarteter Simulator, in dem keine Station geladen ist (
plc_state=no_conf), weistplc_transfermit „Family check failed" ab — der API-Download (anders als die Control-Expert-GUI) setzt voraus, dass der Simulator bereits eine Station einer passenden Familie hat. Empfehlung: einmalig initialisieren, indem Sie ein beliebiges Projekt aus der Control-Expert-GUI übertragen (SPS → Simulationsmodus → Verbinden → Übertragen); die geladene Station bleibt erhalten, solangesim.exeläuft, und alle API-Downloads funktionieren von da an (stoppen Sie die SPS zuerst — die Übertragung an eine laufende SPS schlägt fehl).
Live-Werte per Modbus TCP (Ende-zu-Ende validiert)
Die UDE/COM-Automations-API dient der Projektdatenbank — ein kein Lese-/Schreibzugriff auf Live-Tag-Werte (Animationstabellen rendern nur im GUI; IVariable legt nur den Offline-Startwert offen). Live-Werte laufen stattdessen über den Modbus-TCP-Server der CPU — denselben Kanal, den SCADA/Vijeo nutzt:
modbus_connect(host="127.0.0.1") # the sim's Modbus server; or a real CPU IP, port 502
read_tags("EMFM1FLOW, RESIDUAL2CLTHSP, %MW0, %MW2:REAL")
write_tags({"RESIDUAL2CLTHSP": 4.0, "%MX100.0": true})Tags sind globale Variablen Namen (Adresse + IEC-Typ aus dem Projekt aufgelöst) oder explizite Adressen mit optionalem
:TYPE(%MW86,%MW2:REAL,%MW70:UDINT,%M3,%MW10.2Bit). Die Dekodierung erfolgt typgetrieben (INT/UINT, DINT/UDINT, REAL, BOOL-Spule/Wort-Bit).Nur platzierte
%M/%MW-Tags sind erreichbar. Nicht platzierte DFB-Interna (z. B.Pump1.Running) müssen zuerst im Programm auf%MW/%Mabgebildet werden (siehe Prompttest_logic_live).32-Bit-
REAL/DINTverwenden standardmäßig die Schneider-Reihenfolge „Niederwort zuerst"; übergeben Sieword_order="high_first", wenn ein Server abweicht.Der Control-Expert-Simulator stellt auf
127.0.0.1:502einen Modbus-Server bereit, sodass der gesamte Lese-/Schreib-Testzyklus gegen den Simulator funktioniert — keine Hardware erforderlich.
Prompts (geführte Arbeitsabläufe)
Der Server liefert MCP-Prompts (src/control(_expert_mcp/prompts.py) — wiederverwendbare Rezepte, die die validierten Abläufe und ihre nicht offensichtlichen Stolperfallen abbilden, sodass ein Client sie nicht per Trial-and-Error neu entdecken muss. In Claude Code erscheinen sie als Slash-Befehle /mcp__control-expert__<name>; andere MCP-Clients listen sie im Prompt-Picker auf.
Prompt | Wobei es Sie Schritt für Schritt führt |
| Bauen → Simulator starten → verbinden → übertragen → starten, inkl. des manuellen Seed-Titels „Erst-Übertragung / Family check failed“ |
| Die Modbus-Testschleife für eine DFB-Instanz, inkl. Abbildung unplatzierter Internals auf |
| Der Zyklus |
|
|
| Einen Modbus-TCP-Slave-DTM unter der M580-CPU einrichen und eine Scan-Zeile konfigurieren |
Erweiterung des Servers
Wenn Sie ein Werkzeug oder eine Fähigkeit hinzufügen, fügen Sie in prompts.py auch einen MCP-Prompt hinzu (oder erweitern diese) einen, der einen Client durch dessen Verwendung führt. Dies ist eine Projektkonvention, kein Afterthought: einen guten Prompt macht aus einer Stunde Trial-and-Error ein einziger Slash-Befehl.
Schreiben Sie einen Prompt für alles, was ein Client nicht allein aus der Werkzeugbeschreibung erraten kann — ein Umgebungs-Flag (/env-flag), ein manueller GUI-Schritt (der Simulatorenlon-Seed), eine Reihenfolge-Einschränkung (SPS vor dem Transfer stoppen) oder eine Adressierregel (nur platzierte Modbus, Niederwort-Erst-REAL). Faustregeln:
Jeder neue Workflow → führend einen Prompt; jedes neue Tool → mindestens eine Erwähnung in einem relevanten Prompt.
Den Stolperstein explizit in den Prompt-Text schreiben (die Schritte, die Ihnen beim Erstellen Zeit gekostet haben).
Die validierte Abfolge spiegeln (Tool-Namen + Argumentstrukturen) und verwiesene Prompts namentlich nennen.
Halten Sie die stehende Einordnung im
instructions-String des Servers kurz; Schritt-für-Schritt-Rezepte in die Prompts ö schreiben (left as is).
Fehlerbehebung
Catalog object existiert nichtbeinew_project— die CPU-Teilenummer/-Version muss exakt zum Hardwarekatalog Ihrer Control-Expert-Version passen (Leerzeichen sind relevant:BMX P34 2020; Firmware wie02.70ist erforderlich).application object reference is not found in the catalogbeiadd_io_module— gleiche Regel für Module: die Katalogversion ist zwingend (02.00für die meisten siehe M340-IO-Module,01.00für Racks/Netzteile).new_projectschlägt bei einer CPU-Familie mit bloßemException occurredfehl — Ihre Control-Expert-Lizenz/DTM-Bibliothek enthält diese Plattform vermutlich nicht. Der Fehler trägt keine Beschreibung; Test beding dieselbe CPU im Control-Expert-GUI zur Bestätigung.add_dtmmeldet „protocol Id empty/invalid“ / „Impossible to create a new DTM object“ — Slave-DTMs benötigen den FDT-Protokollnamen alsprotocol_id(Modbusfür das generische Modbus-TCP-Gerät; der Server versucht bei leeren Wert automatischModbusundEtherNet/IP) und einen exakt passendendevice_type_nameaus dem DTM-Katalog derüfen. Listen Sie die Katalognamen mittools/list_stm_catalog.py`.).set_master_dtm_datasetstürzt den Server ab (RPC failed) — fastubliche Folge von als malformed Request-XML; insbesondere mussrequestUniqueIDeine frische GUID sein, kein Integer. Spiegeln Sie die validierte Voragine in der Toolbeschreibung exakt wider.„Write access mode is already reserved by another client“ — Control Expert (die GUI) oder ein anderer Automatisierungsclient bleibt das Projekt zum Schreiben geöffnet. Schließen Sie es dort zuerst. Der Server hält pro Sitzung absichtlich nur einen Schreibzugriff-Token.
Broker-Erstellung schlägt fehl — Control Expert ist nicht installiert oder seine COM-Registrierung ist der eigentliche (selbst per zu reparieren).
Der erste Aufruf ist langsam —
open_project/new_projectstarten den Unity-Server-Prozess und können bei großen Projekten 30.000–120 s dauern. Konfigurieren Sie großzügige Timeouts in eiendem Client.Import schlägt mit
Invalid filefehl — das XML entspricht nicht dem Austauschschema. Exportieren Sie zuerst ein ähnliches Objekt (read_section,export_xml) und spiegeln Sie its structures, einschließlichfileHeader/contentHeader.
Options
Alle COM-Aufrufe laufen auf einem einzelnen dedizierten STA-Worker-Thread (COM-Apartment-Affinität); MCP-Toolaufrufe werden auf diesen gemarshallt (der Dispatcher ist reentrant — verschachtelten Bridge-Aufrufen im Worker-Thread direkte Ausführung).
Hardware- und DTM-Objekte legen ihre Mitglieder auf sekundären dual interface (
IProject3,IConfiguration2,IBus,IModule,IPServerDtm*, ...) ab, die nicht in der Standard-Disp-Interface enthalten sind. Die Bridge fragt jedes Objekt mit ausHKCR\Interfacenetnen IIDs ab (_qi) und wrappt das Ergebnis alsIDispatch— der einzige Weg, von clients betreffend aus zuDTMRoot,InternalBusesoderAddChildzu gelangen.Das Schreibzugriffs-Token (
app.Project(1)) wird einmal pro Sitzung erworben und effektiv; die Tracebacks der fehlgeschlagenen Aufrufe werden entfernt, damit sie COM-Referenzen nicht festhalten undsoProjectCloseblockieren.Projectist eine parametrisierte COM-Eigenschaft — sie wird mit exopleitenDISPATCH_PROPERTYGET-Flags aufgerufen, weil pywin32 dynamischen Dispatch nicht call them kann.Importiertdateien werden die der XML-Wurzel entsprechende Dateiendung vergeben (
STExchangeFile→.exch,VariablesExchangeFile→.xsy, ...), weil Control Expert den Parser anhand der Erweiterung wählt.Die Enum-Konstanten (Sprachen, Übertrag) wurde aus
PServer.tlbgezogen — siehe src/control_expert_mcp/constants.py.
Haftung
Es besteht keine Verbindung zu Schneider Electric. Die UDE-Automationsschnittstelle wird von Schneider Electric "as is" bereitgestellt und wird nicht mehr commercialized; dieses Projekt setzt sie auf eigenes Risiko des static. Richten Sie Online-Tools niemals ohne qualifizierte Aufsicht auf Produktionsanlagen.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with B\&R Automation Studio projects by building code, running ARsim simulators, and reading or writing OPC UA variables. It facilitates industrial automation development and real-time variable integration through natural language commands.13MIT
- AlicenseBqualityBmaintenanceMCP server that enables AI agents to read, edit, and create PLC projects in EcoStruxure Control Expert via COM automation.52MIT
- FlicenseNot gradedqualityDmaintenanceEnables AI-powered PLC programming with natural language to ladder logic conversion, L5X and .ACD project generation, and semantic search through L5X files and documentation.35
- FlicenseAqualityBmaintenanceAutomates the Sigmatek LASAL software suite for PLC and HMI engineering, enabling AI assistants to inspect projects, apply structural changes, compile, download to hardware, and control PLC runtime.21
Related MCP Connectors
Code intelligence for coding agents: semantic, AST, graph, and full-text search. 279+ languages.
Manage SRG+ hubs, channels, content, assets, users, and workspaces from any MCP-aware AI agent.
Create and manage AI agents that collaborate and solve problems through natural language interacti…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/apexsotjo-blip/remoteconnect-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server