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:
POST http://localhost:7420/mcpGET http://localhost:7420/sseFü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.
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. |
Der MCP-Server stellt insgesamt 52 Werkzeuge in zehn Gruppen bereit:
| 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 |
| 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. |
| 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). |
| 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 |
| 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. |
| 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. |
| 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. |
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. |
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.
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 (E1–E64,
A1–A64), alle sys_*-Funktionen
gegliedert nach Gruppen (Timer, KNX, Persistenz, Netzwerk, PID, System …)
sowie ein vollständiges Blink-Beispiel. Kein Parameter erforderlich. |
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.
uni_pro_mcp_proxy.py im gewünschten
Verzeichnis ablegen (z.B. C:\Users\<Benutzer>\)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()
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"
claude starten./mcp eingeben — uni-pro sollte als verbunden erscheinen.
Claude Desktop ist die Desktop-Anwendung von Anthropic. Die Konfigurationsdatei befindet sich unter:
%APPDATA%\Claude\claude_desktop_config.json~/Library/Application Support/Claude/claude_desktop_config.jsonFolgenden 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.
ChatGPT Desktop (Windows/macOS) unterstützt MCP-Server ebenfalls über das stdio-Proxy-Skript.
pythonC:/Users/<Benutzer>/uni_pro_mcp_proxy.pyuni-proHinweis: Die genaue Konfiguration hängt von der installierten ChatGPT-Desktop-Version ab. Aktuelle Informationen finden Sie in der OpenAI-Dokumentation.
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):
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"},...}}
curl -X POST http://localhost:7420/mcp ^
-H "Content-Type: application/json" ^
-d "{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\",\"params\":{}}"
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.
Die folgenden Beispiele zeigen typische Anfragen, die Sie dem KI-Assistenten stellen können. Der Assistent ruft dabei automatisch die passenden MCP-Werkzeuge auf.
„Welche Visualisierungsseiten hat das aktuelle Projekt?“
„Zeige mir alle KNX-Adressen im Projekt.“
„Was ist der Projektname und welche Version wird verwendet?“
„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.“
„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.“
„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’.“
„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.“
„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.“
„Speichere das Projekt.“
„Führe alle Änderungen durch und speichere das Projekt anschließend.“
claude mcp add müssen
Sie nur einmalig ausführen.MCP_URL = "http://localhost:7421/mcp").localhost
(127.0.0.1) — keine Firewall-Regeln nötig.