Skip to main content
Glama
apexsotjo-blip

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──> UnitySoControl

Was 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/.zef importieren/exportieren

  • Durchsuchen: 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 ist Modbus und 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 über get_master_dtm_dataset / set_master_dtm_dataset bearbeitet wird – eine ManagedModbusRequest-Vorlage mit den Nummerierungsregeln ist in die Tool-Beschreibung eingebaut; eine erstellte Scan-Zeile erzeugt built_ok und wird in der Scannerkonfiguration als ModbusScanLine angezeigt

  • Netzwerke (Premium/Quantum): logische Ethernet-Netzwerke erstellen und deren IP-Dienstkonfiguration festlegen

  • Variablen: globale Variablen auflisten, erstellen, aktualisieren, ändern – inkl. Typ, Kommentar, Adresse (%MW...), Startwert

  • Build: 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 407

  • Online (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_connectread_tios/write_las) – die UE/COM-API hat keinen Zugriff auf Live-Tags, therefore this channel for testing logic against a running controller (%M/%MW tags 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 server Registerserver from Control**4, but any PSBroker.1 should work (the UDE automation server is delivered with Control Expert itself; the separate UDE package is only required for documentation)

  • Python 3.10+ with pywin32

  • The 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_mcp

VS 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

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 je Objekt sowie ein ok-Ergebnis

inspect_remoteconnect_bulk_edit_workbook

Liest native RemoteConnect-.xls-Tabellenblä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 eine gebündelte, gepaarte UnitySoControl-Logikdatei mit dem konfigurierten OEM-Kontext

build_remoteconnect_logic_copy

Hinzufügen von Variablen/ST, vollständiger Neuaufbau und Speichern nur eines sauberen Ergebnisses 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

Speichern / Schließen (Schließen verwirft Änderungen, außer wenn 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

Variablen bearbeiten

read_section

Liest Abschnittslogik als Control Expert-XML

write_st_logic

Schreibt ST-Logik als reinen IEC-Text (kein XML) — erstellt oder ersetzt einen Abschnitt, mit Inline-Variablendeklarationen

get_language_reference

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)

validate_xml

Vorvalidiert Kandidaten-Exchange-XML gegen die installierten SrcXmlSchema-XSDs vor Import/Build — sofortige Strukturfehler mit den gültigen Wertemengen

place_fb_in_ladder

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

use_fb_in_ladder

Klont 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/EDCIL)

create_task

MAST/FAST/AUX/SAFE - Task hinzufügen

import_xml

Der zentrale Schreibpfad — importiert Abschnittslogik, Variablen, DFB/DDT-Typen, Konfiguration oder projectweite Exchange-Dateien (Inline-XML oder Datei)

export_xml

Exportiert Variablen / Programm / Konfiguration / DFB / Abschnitt 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

Fügt Rack-Module hinzu/entfernt sie nach Teil. der Teilenummer + Katalogversion (z. B. BMX DDI 1602 + 02.00)

add_drop / add_rack

Baut Remote-Drops/-Racks auf (z. B. ein X80-EIO-Drop + E-meiner XBP 12.00... ein M580-RIO-Bus)

change_cpu

Selbst, CPU-Referenz austauschen

list_animation_tables / create_animation_table / delete_animation_table

Watch/Animatedierungstabellen (akzeptiert hierarchische Pfade)

list_dtms

DTM-Browser-Topologie mit Namen, Typen, Adressen

add_dtm / delete_dtm

Kommunikations-DTMs oder Slave-Geräte hinzufügen/entfernen (z. B. unter dem M580-CPU-DTM Slave Device)

set_dtm_address

Setzt IP-/Busadresse eines Slaves fest (+ optional Gateway/Subnetz — behebt die Build-Warnung „IP Address and Gateway address are not in the same domain")

configure_cpu_ethernet

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

get_dtm_control_parameters / set_dtm_control_parameters

Konfigurations-XML des Modbus-TCP-I/O-Scanners (CetControlParameter*-Schema): IP, Unit-ID, Zeitüberschreitungen, ModbusTcpRequest-Scanzeilen

get_dtm_dataset / set_dtm_dataset

Eigener Datensatz eines Slave-DTM (Identität + Busadresse)

get_master_dtm_dataset / set_master_dtm_dataset

Der Master/CPU-DTM-Datensatz (über ZEF-Round trip) — <SlaveDevices>/<ManagedModbusRequestList> enthält die Modbus-Scanzeilen; schreibe einen ManagedModbusRequest-Knoten, um eine Anforderung hinzuzufügen

list_networks / add_network / set_network_ip

Logische Netzwerke auf Premium/Quantum

show_ui

Macht das Control Expert-Fenster sichtbar (standardmäßig schreibgeschützt, sodass er mitlaufen/Editoren öffnen kann, während der Schreibzugriff beim Client bleibt)

open_animation_table

Öffnet den Editor einer Animationstabelle im live CE-Fenster, damit ein Mensch die animierten Werte bei einem Test ablesen kann

plc_* (opt-in)

Online: Einrichten/Verbinden/Trennen/Status/Transfer/Laden/Stopp

modbus_connect / modbus_disconnect / modbus_status (opt-in)

Öffnet/schließt eine Modbus TCP-Verbindung zur CPU/bzw. Simulator(127.0.0.1 für die Sim) für Live-Werte

read_tags / write_tags (opt-in)

Liest/schreibt LIVE-Werte adressierter Tags (%M/%MW) anhand Name oder Adresse (%MW86, %MW2:REAL); der einzige Live-Lese-/Schreibpfad (die COM-API hat keinen)

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=1

Das 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), weist plc_transfer mit „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 → SimulationsmodusVerbindenÜbertragen); die geladene Station bleibt erhalten, solange sim.exe lä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.2 Bit). 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/%M abgebildet werden (siehe Prompt test_logic_live).

  • 32-Bit-REAL/DINT verwenden standardmäßig die Schneider-Reihenfolge „Niederwort zuerst"; übergeben Sie word_order="high_first", wenn ein Server abweicht.

  • Der Control-Expert-Simulator stellt auf 127.0.0.1:502 einen 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

commission_simulator

Bauen → Simulator starten → verbinden → übertragen → starten, inkl. des manuellen Seed-Titels „Erst-Übertragung / Family check failed“

test_logic_live

Die Modbus-Testschleife für eine DFB-Instanz, inkl. Abbildung unplatzierter Internals auf %MW und der Wortreihenfolge-Stolperfalle

author_logic

Der Zyklus get_language_reference → Schreiben/Importieren → build_project → Korrigieren anhand der Ausgabe (pro Sprache)

scaffold_project

new_project (exakte CPU+Version) → Rack/Netzteil/IO hinzufügen → bauen → speichern

add_modbus_device

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 nicht bei new_project — die CPU-Teilenummer/-Version muss exakt zum Hardwarekatalog Ihrer Control-Expert-Version passen (Leerzeichen sind relevant: BMX P34 2020; Firmware wie 02.70 ist erforderlich).

  • application object reference is not found in the catalog bei add_io_module — gleiche Regel für Module: die Katalogversion ist zwingend (02.00 für die meisten siehe M340-IO-Module, 01.00 für Racks/Netzteile).

  • new_project schlägt bei einer CPU-Familie mit bloßem Exception occurred fehl — 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_dtm meldet „protocol Id empty/invalid“ / „Impossible to create a new DTM object“ — Slave-DTMs benötigen den FDT-Protokollnamen als protocol_id (Modbus für das generische Modbus-TCP-Gerät; der Server versucht bei leeren Wert automatisch Modbus und EtherNet/IP) und einen exakt passenden device_type_name aus dem DTM-Katalog der üfen. Listen Sie die Katalognamen mit tools/list_stm_catalog.py`.).

  • set_master_dtm_dataset stürzt den Server ab (RPC failed) — fastubliche Folge von als malformed Request-XML; insbesondere muss requestUniqueID eine 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 langsamopen_project/new_project starten 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 file fehl — das XML entspricht nicht dem Austauschschema. Exportieren Sie zuerst ein ähnliches Objekt (read_section, export_xml) und spiegeln Sie its structures, einschließlich fileHeader/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 aus HKCR\Interface netnen IIDs ab (_qi) und wrappt das Ergebnis als IDispatch — der einzige Weg, von clients betreffend aus zu DTMRoot, InternalBuses oder AddChild zu 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 undso ProjectClose blockieren.

  • Project ist eine parametrisierte COM-Eigenschaft — sie wird mit exopleiten DISPATCH_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.tlb gezogen — 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.

Install Server
A
license - permissive license
B
quality
D
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

View all related MCP servers

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…

View all MCP Connectors

Latest Blog Posts

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