MCP server for Beckhoff TwinCAT TE1000 / XAE Shell automation
Server has 21 tools with explicit schemas and descriptions. Naming is generally verb-first and clear (xae, xae_build, tc_tree, plc_download). Descriptions are present and detailed (avg ~150 chars), exceeding the 10-char minimum. However, parameter descriptions are inconsistent: many lack detail on constraints, formats, or when to use them. Output schemas are not documented, LLMs cannot predict response structure. Error handling guidance is minimal. Confirmation tokens are well-designed for destructive ops, but recovery paths are not described. Batch operations (tc_tree, tc_ethercat) show good composition thinking, but parameter interdependencies (e.g., 'createInfo' format for EtherCAT) lack clarity. Overall: solid foundation, but falls short of production-grade LLM-optimized tooling.
Publish C++ project. Guarded: confirm="ALLOW_CPP_PUBLISH".
Record measurement data. Guarded: confirm="ALLOW_MEASUREMENT_RECORD".
Download PLC project to target. Guarded: confirm="ALLOW_PLC_DOWNLOAD".
Manage PLC library repository: list, add, remove, update. Guarded: confirm="ALLOW_PLC_LIBRARY_REPO".
PLC online session control: get status (loggedIn, etc.) or logout via UI Automation.
Save solution or PLC archive.
Create EtherCAT IO boxes (terminals/couplers) NATIVELY. Each module is added via the GUI's own "Add Box" route — ITcSmTreeItem.CreateChild(name, 9099, before, "<productString>") — so TwinCAT expands the box FROM ITS OWN ESI: a fully populated, non-hollow box (correct identity, SyncManagers, FMMUs, full <EtherCAT> mailbox/CoE/FoE element, complete PDOs+entries) for ANY class — digital, analog (in AND out), IO-Link, mailbox, DC, couplers. createInfo is the PLAIN PRODUCT STRING (the bare type = latest revision, or a revision-pinned form), NOT identity XML/numbers.
Output schemas not documented. LLMs cannot predict response structure, forcing them to guess what fields are returned and how to chain tools. Every tool should document its return type.
Parameter descriptions lack format/constraint details. E.g., 'createInfo' for tc_ethercat says 'plain product string' but does not explain format, length, or examples. 'xml' params lack schema hints. LLMs cannot validate inputs without explicit constraints.
Error handling and recovery guidance missing. Tools like plc_download and twincat_activate are destructive but do not describe what errors are retryable, what user actions are needed, or how to undo failures.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
Non-EtherCAT fieldbus operations: create device/devices (PROFINET/PROFIBUS/CANopen/DeviceNet/EAP), list resources, claim resources, create GSD box, add netvar, set station address, import DBC, get/set XML.
License operations: list devices, add device, activate response (apply license activation file).
IO link (variable mapping) operations: produce (read-only XML), consume (apply XML), clear (remove all), resolve (find/create missing targets), list (parse produced XML), add (create single link), delete (remove single link).
Mapping info produce/consume/clear operations: produce (read-only XML), consume (apply mapping XML), clear (remove all mappings).
ADS route list/search/add operations: list (parse TIRR ProduceXml), broadcast_search (trigger search via ConsumeXml), search_host (search specific host), add (create route), add_project_route (create project route).
Get/set silent mode (suppress dialogs during automation).
Get/set target platform (TC2/TC3/TC3.1).
TwinCAT System Manager tree items; paths use ^ separators (e.g. TIPC^MyPlc, TIID^Device 2 (EtherCAT)^Box 1). BATCH-FIRST: for more than one item use the matching *_batch action — N ops in ONE DTE attach, continue-on-error roll-up {count,succeeded,failed,results:[{...,ok,error?}]}, instead of an attach per call. Actions, grouped single / batch: READ identity — get / get_batch (paths:[...]); TEST existence — exists / exists_batch (paths:[...]); READ xml — get_xml (ProduceXml raw XML; summary:true for a compact identity + slot-module list); WRITE params — set_xml / set_xml_batch (items:[{path,xml}]) (ConsumeXml; compact unless returnXml:true); RENAME — rename / rename_batch (renames:[{name|path,newName}]) (keeps IO links intact); CREATE — create / create_batch (creates:[{parent,name,subType,before?,createInfo?}]); create VALIDATES the child and errors clearly on a malformed/ghost result instead of silently succeeding — adding an EtherCAT box needs a proper ESI-based createInfo (bare subType 9099 with no createInfo produces a blank-named ghost), recorded per-entry as ok:false; to ADD EtherCAT terminals/boxes from the ESI prefer the dedicated tc_ethercat tool; DELETE — delete / delete_batch (deletes:[{parent,name}], GUARDED: dryRun:true previews which children exist, confirm="ALLOW_TWINCAT_DELETE" to actually delete). Mutating *_batch verbs accept save:true to save once after the batch. No batch form: children (lists child items, incl. CPX-AP/Festo sub-modules), import (.xti under path), export (name to file), focus (Solution Explorer).
Project variant operations: get/set variant config, get/set current variant, set item variant disable flag.
Activate TwinCAT runtime. Guarded: confirm="ALLOW_TWINCAT_ACTIVATE".
Restart TwinCAT runtime. Guarded: confirm="ALLOW_TWINCAT_RESTART".
XAE shell: status, open_solution (solutionPath; closeExisting:true reopens, discardChanges:true closes the current solution WITHOUT saving before reopening), save_all, active_document, selected_items, error_list (default 50, in Error List order; pass limit to widen, severityFilter:'errors'|'warnings' to filter before the cap — count still reports the true matching total), clear_error_list, list_commands (filter regex, limit), dialog_probe (read-only: is a modal dialog blocking XAE right now? returns its title/text/buttons; never clicks anything), dialog_resolve (button, remember) — click a chosen button on the live modal dialog and optionally remember it in the allowlist; pair with dialog_probe. Destructive prompts (activate/restart/download/safety) are refused for auto-remember (the click still happens once).
Clean/Build/Rebuild the active solution configuration; waits for completion by default.
Execute a raw XAE/DTE command by name (e.g. View.SolutionExplorer). Guarded: confirm="ALLOW_XAE_COMMAND_EXEC".
Parameter interdependencies undocumented. tc_tree's 'createInfo' is required for some subtypes but not others; tc_ethercat's 'modules' array structure is not defined. LLMs cannot compose valid payloads without explicit dependency docs.
Batch operation semantics unclear. tc_tree and tc_ethercat support batch variants but do not document continue-on-error behavior, partial success handling, or result structure (e.g., per-item ok/error fields).