Übersicht MCP-Server (KI-Schnittstelle)


Das Studio enthält einen integrierten MCP-Server (Model Context Protocol). Damit können KI-Assistenten wie Claude Code, Claude Desktop oder ChatGPT direkt auf ein geöffnetes Projekt zugreifen und es bearbeiten — Seiten anlegen, Widgets platzieren, Funktionsbausteine verbinden, Adressen verwalten und vieles mehr.

Der MCP-Server läuft nur im Studio-Modus (nicht in der App) und lauscht lokal auf einem konfigurierbaren TCP-Port. Er unterstützt zwei HTTP-Transporte:

Für die meisten KI-Clients wird ein mitgeliefertes Python-Proxy-Skript als Brücke verwendet (stdio ↔ HTTP), da nicht alle Clients HTTP-MCP-Server direkt unterstützen.


Einstellungen

Die MCP-Server-Einstellungen finden Sie unter Extras → Einstellungen → Tab „Allgemein“.

Einstellung Beschreibung
MCP-Server Port TCP-Port des Servers. Standardwert: 7420. Wert 0 = MCP-Server deaktiviert. Änderungen werden erst nach einem Neustart des Studios wirksam.
MCP-Server Debug Schaltet die Debug-Protokollierung ein oder aus. Bei Einstellung An werden alle eingehenden Verbindungen, Methoden- und Werkzeugaufrufe mit qInfo() im Anwendungsprotokoll ausgegeben. Die Einstellung ist sofort wirksam — kein Neustart erforderlich.


Verfügbare Werkzeuge

Der MCP-Server stellt insgesamt 52 Werkzeuge in zehn Gruppen bereit:

Gruppe 1: Basisoperationen (15 Werkzeuge)

Werkzeug Beschreibung
get_project_info Projektname, Dateiname, Version und Zeitstempel abrufen
list_widget_pages Alle Visualisierungsseiten auflisten. Mit include_summary=true werden Widget-Typen je Seite aggregiert (spart nachgelagerte get_widget_page-Aufrufe).
get_widget_page Details einer Visualisierungsseite inkl. aller Widgets abrufen
add_widget_page Neue Visualisierungsseite erstellen
delete_widget_page Visualisierungsseite löschen
add_widget Widget auf einer Seite platzieren. Standardgröße wird automatisch typ-spezifisch gesetzt (z. B. 144×144 für Block-Widgets, 152×40 für Text-Widgets). w/h nur angeben um davon abzuweichen.
update_widget Position, Größe und Parameter eines Widgets ändern
delete_widget Widget löschen
list_fb_pages Alle Programmseiten (Funktionsbausteinseiten) auflisten. Mit include_summary=true werden FB-Typen je Seite aggregiert (spart nachgelagerte get_fb_page-Aufrufe).
get_fb_page Details einer Programmseite inkl. aller Funktionsbausteine abrufen
add_fb_page Neue Programmseite erstellen
add_function_block Funktionsbaustein auf einer Programmseite platzieren
delete_function_block Funktionsbaustein löschen
list_addresses Vollständige KNX-Adresshierarchie abrufen
save_project Projekt auf Festplatte speichern

Gruppe 2: Widget-Detail & Adressen (5 Werkzeuge)

Werkzeug Beschreibung
get_widget_detail Vollständige Widget-Daten abrufen: alle Parameter mit Kommentar, Tooltip, Wert und Typ sowie alle IO-Adressen
set_widget_addresses KNX-Adresse für einen Widget-IO-Slot setzen (Index, Hauptgruppe, Mittelgruppe, Untergruppe)
get_widget_type_info Name und Parameterliste eines Widget-Typs abrufen (statische Information)
list_widget_types Vollständige Liste aller bekannten Widget-Typen mit Dezimalwert, Hex-Wert und Bezeichnung ausgeben. Vor jedem add_widget-Aufruf verwenden, um den korrekten Typ-Wert zu ermitteln.
connect_widget_to_fb Verknüpft ein Block-Widget mit einem Funktionsbaustein. Setzt automatisch den FB-GUID-Parameter am richtigen Param-Index (typ-abhängig: P3 für die meisten Widget_Block_*-Typen, P4/P5/P7/P10/P16 für Ausnahmen). Einfacher als manuelles Setzen über update_widget mit params-Array. sync_label=true: Widget-Beschriftung (Param 0) wird automatisch aus dem FB-Kommentar übernommen — spart nachträgliche update_widget-Aufrufe.

Gruppe 3: Funktionsbaustein-Detail & Update (4 Werkzeuge)

Werkzeug Beschreibung
get_fb_detail Vollständige FB-Daten abrufen: GUID, Typ, Typname, Kommentar, Position, Parameter sowie Eingänge und Ausgänge mit Verbindungsstatus und Adressen
update_fb Position, Kommentar und Parameter eines Funktionsbausteins ändern
get_fb_type_info Name eines FB-Typs anhand seines numerischen Typwerts abrufen
list_fb_types Vollständige Liste aller bekannten FB-Typen mit Dezimalwert, Hex-Wert und Bezeichnung ausgeben. Vor jedem add_function_block-Aufruf verwenden, um den korrekten Typ-Wert zu ermitteln (z. B. Modbus Master = 1917 = 0x077d).

Gruppe 4: FB-Verbindungen (3 Werkzeuge)

Werkzeug Beschreibung
connect_fb_io Ausgang eines Funktionsbausteins mit dem Eingang eines anderen verbinden. Interne Verbindungen benötigen keine KNX-Adresse — sie werden über eine gemeinsame interne Kennung verknüpft.
disconnect_fb_io Verbindung an einem FB-Eingang oder -Ausgang trennen
list_fb_connections Alle internen und externen Verbindungen einer Programmseite auflisten

Gruppe 5: Adressverwaltung & IO-Zuweisung (8 Werkzeuge)

Werkzeug Beschreibung
create_address Neue KNX-Adresse in der Adressliste anlegen (Haupt-, Mittel- und Untergruppe, Kommentar, Datentyp). Fehlende übergeordnete Gruppen werden automatisch erstellt.
update_address Kommentar oder Datentyp einer bestehenden Adresse ändern
delete_address Adresse aus der Adressliste entfernen
assign_fb_io_address KNX-Adresse einem FB-Eingang oder -Ausgang zuweisen. Für mehrere Zuweisungen an einem FB: assign_fb_io_addresses_batch verwenden.
assign_fb_io_addresses_batch Mehrere KNX-Adressen in einem einzigen API-Call zuweisen. assignments-Array mit je io_type, io_index, main, middle, sub. Bis zu 10× schneller als Einzelaufrufe bei typischen Konfigurationsaufgaben (z. B. 4 Adressen je FB → 1 statt 4 Calls). Rückgabe: total, succeeded, errors.
ui_navigate Navigiert die Studio-Anzeige zur angegebenen Seite und synchronisiert Sidebar-Navigation und Tab-Anzeige. Behebt den Bug, dass nach MCP-Aufrufen Seitenanzeige und Navigation auseinanderlaufen können. Erkennt automatisch ob FB-Seite oder Widget-Seite. Rückgabe: found, page_type_detected.
import_knx_addresses KNX-Gruppenadressen aus einer ESF- oder XML-Datei (ETS-Export) importieren. Eingabe: file_path (lokaler Pfad) oder file_content (Dateiinhalt als String — kein Dateizugriff nötig, ideal für Sandbox-Umgebungen). Format wird automatisch erkannt. Optionen: keep_type, keep_comment, import_new_only, connected_addresses, uncertain_1byte/2byte/4byte. Rückgabe: imported, updated, skipped, total.
generate_fb_addresses Erzeugt automatisch KNX-Adressen für einen Funktionsbaustein und weist sie dessen Ein-/Ausgängen zu — entspricht dem Button „Variablen generieren“ im Studio. Funktioniert für alle Block-FBs (Licht, Jalousie, Schalter, Szene, RGBW, …) sowie viele Common- und Heizungs-FBs. conflict_mode: "append" (Standard) = nächste freie Mittelgruppe, "overwrite" = bestehende Adressen überschreiben. Rückgabe: has_generate_variable, addresses_created.

Gruppe 6: Modbus Master (6 Werkzeuge)

Werkzeug Beschreibung
get_modbus_master_config Konfiguration und Register eines Modbus-Master-Bausteins lesen. Unterstützt Paginierung: Parameter offset und limit für große Konfigurationen (>50 Register). Jedes Register enthält datatype (lesbarer Enum: INT16/UINT16/INT32/UINT32/FLOAT32) und word_count (Anzahl 16-bit Worte).
set_modbus_master_config Allgemeine Konfigurationsparameter ändern (Node-ID, Protokoll, IP-Adresse, Port, Timeout …). address_offset wird zu jeder Registeradresse addiert. Konvention: Adressen sind 0-basiert (FC3/FC4 Adresse 0 = Geräte-Adresse 40001/30001). Für 1-basierte Geräte: address_offset=-1.
set_modbus_master_registers Komplette Register-Liste ersetzen. Empfehlung: datatype als String-Enum angeben (INT16/UINT16/INT32/UINT32/FLOAT32) – setzt word_count, signed und interne Typen automatisch. factor akzeptiert Dezimalwerte (z. B. 0.01). Rückgabe enthält warnings-Array mit automatischen Korrekturen.
add_modbus_master_register Ein einzelnes Register hinzufügen. write_mode: 0 = ReadOnly, 1 = FC6 WriteSingle, 2 = FC16 WriteMultiple.
update_modbus_master_register Ein bestehendes Register aktualisieren (nur angegebene Felder werden geändert). Unterstützt ebenfalls datatype-Kurzform und write_mode.
delete_modbus_master_register Ein Register aus der Liste entfernen. Die Ausgangs-IOs werden automatisch angepasst.

Gruppe 7: Hilfe-Abruf (2 Werkzeuge)

Werkzeug Beschreibung
list_help_topics Alle verfügbaren Hilfe-Themen auflisten. Gibt Topic-IDs zurück, die mit get_help abgerufen werden können. Themen sind nach Kategorie gegliedert: program/fb_xxx für Funktionsbausteine, visu/widget_xxx für Widgets, common/variable für Datentypen usw. Optionaler Parameter: language (de oder en).
get_help Hilfe-Seite als Klartext abrufen. Entweder eine topic-ID (z. B. program/fb_modbus_master) angeben, oder über fb_guid / widget_guid einen bereits platzierten Baustein referenzieren – dann wird der zugehörige Hilfetext automatisch über onProcesssHelp() bzw. urlHelpBrowser() ermittelt. Optionaler Parameter: language.

Gruppe 8: Block Uhr – Schaltzeiten (5 Werkzeuge)

Die Block-Uhr-Werkzeuge lesen und schreiben die Schaltzeiten eines Block-Uhr-Funktionsbausteins. Voraussetzung: Ein Widget_Block_Clock muss auf einer Visualisierungsseite mit dem Baustein verbunden sein (mParamConnectedFbId = fb_guid). Die Änderungen werden über saveWidgetSettings() an die Runtime übertragen.

Werkzeug Beschreibung
get_block_clock_schedules Alle Schaltzeiteinträge eines Block-Uhr-FB lesen. Gibt schedules (Liste), count, brightness_active und brightness_inactive zurück. Jeder Eintrag enthält: type (week / date / astro), hour, minute, value, days_sun/mon/tue/wed/thu/fri/sat, day, month, single_shot, brightness (always / day / night), astro_type, astro_offset, switch_mode (value / active).
set_block_clock_schedules Gesamte Schaltzeiten-Liste eines Block-Uhr-FB ersetzen. Alle bisherigen Einträge werden gelöscht. Optional: brightness_active und brightness_inactive setzen (Standard 1000 / 100). Maximum: 128 Einträge.
add_block_clock_schedule Einen neuen Schaltzeitseintrag am Ende der Liste hinzufügen. Pflichtfelder: fb_guid, type, hour, minute, value.
update_block_clock_schedule Einen bestehenden Schaltzeitseintrag anhand seines Index (0-basiert) aktualisieren. Nur angegebene Felder werden geändert.
delete_block_clock_schedule Einen Schaltzeitseintrag anhand seines Index (0-basiert) löschen.

Gruppe 9: Laufzeit-Steuerung (2 Werkzeuge)

Diese Werkzeuge senden Werte direkt an die verbundene Runtime (z. B. Licht schalten, Dimmen, Solltemperatur setzen). Voraussetzung: PT2020-Studio ist über die Netzwerkverbindung mit einer laufenden Runtime verbunden. Die Adressen finden sich im Werkzeug list_addresses (Felder main, middle, sub).

Werkzeug Beschreibung
set_address_value Sendet einen Wert an eine KNX-Gruppenadresse der verbundenen Runtime. Parameter: main, middle, sub, value (0/1 für Schalten, 0–100 für Dimmen, Gradzahl für Temperatur). Gibt eine Warnung aus wenn die Runtime nicht verbunden ist; der Wert wird dann lokal gespeichert.
get_address_value Liest den zuletzt empfangenen oder gesetzten Wert einer KNX-Gruppenadresse. Liefert value (numerisch), value_str (lesbar), comment und datatype.

Das Werkzeug list_addresses gibt zusätzlich die Felder value und value_str je Adresse aus, sodass der aktuelle Zustand aller Adressen auf einen Blick sichtbar ist.


Gruppe 10: Lua Script (2 Werkzeuge)

Diese Werkzeuge ermöglichen das Schreiben und Lesen von Lua-Skriptcode für den Lua Interpreter-Funktionsbaustein (Typ 0x0384). Das Werkzeug get_lua_api_reference liefert die vollständige API-Referenz mit Callbacks, IO-Variablen und allen sys_*-Funktionen — so kann der KI-Assistent direkt korrekten Lua-Code erzeugen.

Werkzeug Beschreibung
set_lua_script Schreibt Lua-Quellcode in einen Lua-Interpreter-Baustein. Parameter: fb_guid (GUID des Bausteins), code (Lua-Quelltext), optional inputs (1–64, Anzahl Eingänge), outputs (1–64, Anzahl Ausgänge).
get_lua_api_reference Gibt die vollständige Lua-API-Referenz zurück: Callbacks (onCreate, onInputChanged, onTimer, onEvent), IO-Variablen (E1E64, A1A64), alle sys_*-Funktionen gegliedert nach Gruppen (Timer, KNX, Persistenz, Netzwerk, PID, System …) sowie ein vollständiges Blink-Beispiel. Kein Parameter erforderlich.


Einbindung in Claude Code (empfohlen)

Claude Code ist das KI-Werkzeug von Anthropic für die Kommandozeile (Terminal). Die Einbindung erfolgt über das Python-Proxy-Skript und den Befehl claude mcp add.

Voraussetzungen

Proxy-Skript

Das Skript leitet stdio-Nachrichten an den HTTP-MCP-Server des Studios weiter:

import sys, json, urllib.request, urllib.error MCP_URL = "http://localhost:7420/mcp" def send_error(id_, msg): sys.stdout.write(json.dumps({"jsonrpc":"2.0","id":id_,"error":{"code":-32603,"message":msg}})+"\n") sys.stdout.flush() def main(): for line in sys.stdin: line = line.strip() if not line: continue try: id_ = json.loads(line).get("id") except: id_ = None try: req = urllib.request.Request(MCP_URL, data=line.encode(), headers={"Content-Type":"application/json"}) with urllib.request.urlopen(req, timeout=10) as r: body = r.read().decode().strip() if body and body != "{}": sys.stdout.write(body+"\n"); sys.stdout.flush() except urllib.error.URLError as e: send_error(id_, "Studio nicht erreichbar: "+str(e.reason)) except Exception as e: send_error(id_, str(e)) if __name__ == "__main__": main()

Server registrieren

Einmalig in einem Terminal ausführen (ersetzt die manuelle Konfiguration der settings.json):

claude mcp add --scope user uni-pro python "C:/Users/<Benutzer>/uni_pro_mcp_proxy.py"

Verbindung prüfen

  1. Studio starten und Projekt öffnen.
  2. Neues Terminal öffnen, claude starten.
  3. /mcp eingeben — uni-pro sollte als verbunden erscheinen.


Einbindung in Claude Desktop

Claude Desktop ist die Desktop-Anwendung von Anthropic. Die Konfigurationsdatei befindet sich unter:

Folgenden Abschnitt in die Konfigurationsdatei einfügen:

{ "mcpServers": { "uni-pro": { "command": "python", "args": ["C:/Users/<Benutzer>/uni_pro_mcp_proxy.py"] } } }

Claude Desktop anschließend neu starten. Im Chat-Eingabefeld erscheint ein Werkzeug-Symbol — beim Anklicken werden die verfügbaren MCP-Werkzeuge angezeigt.

Hinweis: Studio muss vor Claude Desktop gestartet werden, damit der Proxy beim ersten Verbindungsversuch den HTTP-Server erreichen kann.


Einbindung in ChatGPT Desktop

ChatGPT Desktop (Windows/macOS) unterstützt MCP-Server ebenfalls über das stdio-Proxy-Skript.

  1. Studio starten.
  2. In ChatGPT Desktop: Einstellungen → Verbundene Apps / MCP-Server aufrufen.
  3. Neuen Server hinzufügen:
  4. ChatGPT Desktop neu starten.

Hinweis: Die genaue Konfiguration hängt von der installierten ChatGPT-Desktop-Version ab. Aktuelle Informationen finden Sie in der OpenAI-Dokumentation.


Testen mit curl

Die Verbindung kann ohne KI-Anwendung direkt mit curl getestet werden. Öffnen Sie eine Eingabeaufforderung und führen Sie folgende Befehle aus (Studio muss laufen):

1. Handshake (Verbindung prüfen)

curl -X POST http://localhost:7420/mcp ^ -H "Content-Type: application/json" ^ -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"test\",\"version\":\"0\"}}}"

Erwartete Antwort (gekürzt):

{"jsonrpc":"2.0","id":1,"result":{"serverInfo":{"name":"PT2020-Studio-MCP","version":"1.0"},...}}

2. Werkzeugliste abrufen

curl -X POST http://localhost:7420/mcp ^ -H "Content-Type: application/json" ^ -d "{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\",\"params\":{}}"

3. Projektinfo abrufen

curl -X POST http://localhost:7420/mcp ^ -H "Content-Type: application/json" ^ -d "{\"jsonrpc\":\"2.0\",\"id\":3,\"method\":\"tools/call\",\"params\":{\"name\":\"get_project_info\",\"arguments\":{}}}"

Tipp: Unter Windows steht curl ab Windows 10 (Build 1803) in der Eingabeaufforderung zur Verfügung.


Praxisbeispiele

Die folgenden Beispiele zeigen typische Anfragen, die Sie dem KI-Assistenten stellen können. Der Assistent ruft dabei automatisch die passenden MCP-Werkzeuge auf.

Projekt überblicken

„Welche Visualisierungsseiten hat das aktuelle Projekt?“

„Zeige mir alle KNX-Adressen im Projekt.“

„Was ist der Projektname und welche Version wird verwendet?“

Visualisierungsseiten erstellen

„Erstelle eine neue Visualisierungsseite mit dem Namen ‘Hauptmenü’ in der Größe 1024×768 Pixel.“

„Lege drei Seiten an: ‘Erdgeschoss’, ‘Obergeschoss’ und ‘Keller’, jeweils 1280×800 Pixel.“

Widgets platzieren und konfigurieren

„Füge auf der Seite ‘Hauptmenü’ oben links einen Button (Typ 100) mit der Beschriftung ‘Licht ein’ hinzu, 200×80 Pixel groß.“

„Platziere auf der Seite ‘Erdgeschoss’ vier Schalter nebeneinander, je 150×60 Pixel, für die Jalousien im Wohnzimmer.“

„Verschiebe den Button mit ID 42 auf der Seite ‘Hauptmenü’ nach rechts unten (Position 800, 600).“

„Zeige mir alle Parameter und Adressen des Widgets mit ID 15 auf der Seite ‘Erdgeschoss’.“

„Weise dem ersten IO-Slot des Widgets 15 die KNX-Adresse 1/2/10 zu.“

Programmlogik aufbauen und verbinden

„Erstelle eine neue Programmseite namens ‘Lichtsteuerung’ und füge einen AND-Funktionsbaustein sowie einen Timer hinzu.“

„Welche Funktionsbausteine sind auf der Seite ‘Heizung’ vorhanden?“

„Zeige mir alle Parameter und Eingänge des Funktionsbausteins mit der GUID ‘abc-123’.“

„Verbinde den Ausgang 0 des AND-Bausteins mit dem Eingang 0 des Timers auf der Seite ‘Lichtsteuerung’.“

„Welche Verbindungen existieren auf der Programmseite ‘Lichtsteuerung’?“

„Trenne die Verbindung am Eingang 0 des Timers.“

„Setze den Kommentar des Funktionsbausteins ‘abc-123’ auf ‘Prüft Anwesenheit und Helligkeit’.“

KNX-Adressen verwalten

„Lege eine neue KNX-Adresse 1/2/50 mit dem Kommentar ‘Licht Wohnzimmer’ an.“

„Aktualisiere den Kommentar der Adresse 1/2/50 auf ‘Licht Wohnzimmer Haupt’.“

„Lösche die Adresse 1/2/99 aus der Adressliste.“

„Weise dem Ausgang 0 des Funktionsbausteins ‘abc-123’ die KNX-Adresse 1/2/50 zu.“

„Sind alle KNX-Adressen im Projekt zugewiesen? Liste nicht verwendete Adressen auf.“

Strukturanalyse und Refactoring

„Analysiere die Struktur aller Visualisierungsseiten und erstelle eine Übersicht der verwendeten Widget-Typen.“

„Prüfe alle Funktionsbausteine auf der Seite ‘Heizung’ auf nicht verbundene Eingänge und Ausgänge.“

„Kopiere die Struktur der Seite ‘Erdgeschoss’ und erstelle daraus eine neue Seite ‘Obergeschoss’ mit denselben Widget-Positionen.“

Projekt speichern

„Speichere das Projekt.“

„Führe alle Änderungen durch und speichere das Projekt anschließend.“


Fehlerbehebung