te1000-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@te1000-mcpshow the current error list"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
te1000-mcp
MCP server for Beckhoff TwinCAT XAE / TE1000 Automation Interface.
This server uses the locally verified TwinCAT XAE Shell COM ProgID and calls it through 32-bit PowerShell, which matches Beckhoff's TE1000 requirements.
What It Can Do
attach to a running XAE Shell instance
open a solution in XAE Shell
list and execute XAE/DTE commands
inspect the active document and selected items
read the current Error List when available
clear the visible Error List
inspect TwinCAT tree items
list tree children
export and import tree item XML with
ProduceXml/ConsumeXmlcreate, import, export, and delete TwinCAT child items
link and unlink TwinCAT variables
get and set the target NetId
trigger PLC rescans and I/O box scans
inspect NC tasks and axes
save the active solution
clean, build, and rebuild the active solution configuration
PLC login, download, and logout through XAE commands
activate configuration
start or restart the TwinCAT runtime
Related MCP server: TwinCAT Validator MCP Server
v2 Tool Surface (2026-06-11)
The MCP surface was consolidated for agent-context efficiency: 36 tools -> 10,
grouped by noun with action enums, compact outputs (raw XML, pruned compact
JSON). The PowerShell bridge is unchanged and still answers the original
fine-grained action names; index.js maps onto them (the original v1 tool
surface is preserved in this repo's git history). Old tool names appearing later in this README map as:
twincat_*_tree_item*/twincat_*_child -> tc_tree, twincat_link/unlink/ resolve_variable* -> tc_link, netid/errors/rescan/scan tools -> tc_system,
nc_* -> nc, xae_solution_build -> xae_build, xae_execute_command ->
xae_command, remaining xae_* -> xae.
xae— status / open_solution / save_all / active_document / selected_items / error_list / clear_error_list / list_commandsxae_build— clean / build / rebuildxae_command— raw DTE command (guarded)tc_tree— get / children / exists / get_xml / set_xml / create / delete / import / export / focustc_link— link / unlink / resolvetc_system— get_netid / set_netid / errors / rescan_plc / scan_io_boxesnc— tasks / axes / axisplc_download— bootproject (default, headless ITcPlcProject deploy) or legacy command routetwincat_activate_configuration,twincat_restart_runtime
plc_login/plc_logout were dropped from the surface (the 64-bit shell's DTE
exposes no window automation, so they never worked here); use xae_command
with OtherContextMenus.PlcProject.Login/.Logout on shells where it does.
progId is no longer a tool parameter — set env TE1000_PROGID to override
the default TcXaeShell.DTE.17.0.
High-impact tools are guarded:
twincat_activate_configurationrequiresconfirm="ALLOW_TWINCAT_ACTIVATE"twincat_restart_runtimerequiresconfirm="ALLOW_TWINCAT_RESTART"xae_commandrequiresconfirm="ALLOW_XAE_COMMAND_EXEC"
Requirements
Windows
Beckhoff TwinCAT XAE Shell / XAE installed
TE1000 Automation Interface available through
TcXaeShell.DTE.15.032-bit Windows PowerShell present at:
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exeNode.js 20+
Install
git clone https://github.com/Edge-JB/tc1000-MCP-TC-4026.git
cd tc1000-MCP-TC-4026
npm installRun
node index.jsThe server speaks MCP over stdio, so it is normally launched by an MCP client
(see below) rather than run by hand. Running it directly just prints
te1000-mcp server running on stdio and waits for a client on stdin.
MCP Client Config Example
Point your MCP client at the absolute path of index.js in your clone:
{
"mcpServers": {
"te1000": {
"command": "node",
"args": [
"C:\\path\\to\\tc1000-MCP-TC-4026\\index.js"
]
}
}
}Tool Notes
twincat_set_tree_item_xml is the main path for IO edits. Typical workflow:
call
twincat_get_tree_item_xmledit the returned XML
call
twincat_set_tree_item_xmlcall
xae_save_alloptionally call
twincat_activate_configuration
Example TwinCAT tree path:
TIID^Device 1 (EtherCAT)^Term 1 (EK1100)The exact path depends on the project tree in the active XAE session.
Useful discovery helpers:
xae_list_commandsxae_get_selected_itemsxae_get_error_listxae_clear_error_listtwincat_test_item_pathtwincat_resolve_variable_pathnc_list_tasksnc_list_axes
PLC Variable Paths
PLC struct variables are not always exposed to ITcSysManager::LinkVariables with IEC dot syntax all the way down. The top-level PLC variable can use dot syntax after the POU name, but child fields under a mapped struct may be XAE tree subitems and require ^.
Example:
TIPC^MyPlc^MyPlc Instance^PlcTask Inputs^MAIN.stSlot02_DI^In00not:
TIPC^MyPlc^MyPlc Instance^PlcTask Inputs^MAIN.stSlot02_DI.In00Use twincat_resolve_variable_path to test a candidate path and see the valid alternatives. twincat_link_variables also resolves these alternatives by default before linking.
Modal-dialog watchdog
A bridge call drives XAE through a synchronous DTE/COM call. If that call makes XAE raise a modal dialog (save-changes, "file changed externally", activate confirm, a license prompt, etc.), the COM call blocks inside XAE's modal message loop until a human clicks the dialog — so the MCP call, and the calling agent, hang indefinitely with no idea why.
powershell/dialog-watch.ps1 closes that gap. It runs as a short-lived process
alongside every bridge call and, each poll, looks for an application-modal
dialog owned by the XAE process (precise signal: a visible/enabled window whose
owner window is disabled — docked tool windows and non-modal popups don't
qualify). On finding one it either:
auto-dismisses it — if the dialog matches a rule in
powershell/dialog-allowlist.json, the watcher clicks that rule's button, releasing the blocked COM call so the operation completes normally; orreports it — for any dialog with no matching rule,
index.jswaits a short grace period (TE1000_DIALOG_GRACE_MS, default 4000 ms), then abandons the bridge call and returns an error containing the dialog's title, body text, and buttons, so the agent knows exactly what is blocking it. The dialog is left open on the machine for a human to clear; the operation result is indeterminate.
Detection is dialog-driven, not a wall-clock timeout, so long legitimate operations (a multi-minute build) are never killed just for taking a while.
Allowlist (powershell/dialog-allowlist.json)
Ships with rules: [] (report-only). Each rule: match (regex on the title,
required), optional textMatch (regex on the body), and button (exact label to
click). First matching rule wins; unmatched dialogs are reported, never clicked.
Live cell. Only add dialogs that are safe to auto-answer unattended. Never allowlist Activate Configuration / Run-mode / restart / download / safety prompts — those must stay human-confirmed. Prefer the non-destructive button.
Env toggles
Var | Default | Effect |
| on |
|
| on |
|
|
| how long a blocking dialog must persist before the call is abandoned |
|
| optional wall-clock backstop for non-dialog hangs |
Run dialog-watch.ps1 -Mode probe at any time to see the current dialog (if any)
as JSON — useful for discovering the exact title/button strings for a new
allowlist rule.
Build Support
Use xae_solution_build with:
action: "clean"action: "build"action: "rebuild"
This runs through the Visual Studio SolutionBuild automation layer, which is the same side Beckhoff points to when PLC compilation is needed through automation.
PLC Session Commands
The server exposes these non-ADS PLC actions through XAE command execution:
plc_loginplc_downloadplc_logout
Current command mappings found in the live XAE shell on this machine:
login:
OtherContextMenus.PlcProject.Logindownload:
PLC.Downloadnonelogout:
OtherContextMenus.PlcProject.Logout
These depend on XAE context. If a command is unavailable because the wrong node/editor is active, pass a different commandName override or change the active selection in XAE.
Tree Manipulation
The server exposes TwinCAT tree operations through ITcSmTreeItem:
twincat_create_childtwincat_delete_childtwincat_import_childtwincat_export_child
These are powerful but parent-type-specific. subType and import compatibility must match what the parent node accepts.
Targeting And Rescan
twincat_get_target_netidtwincat_set_target_netidtwincat_rescan_plc_projecttwincat_scan_io_boxes
twincat_rescan_plc_project defaults to TIPC.
twincat_scan_io_boxes should target a device node such as:
TIID^Device 1 (EtherCAT)NC Helpers
The server includes NC convenience tools:
nc_list_tasksnc_list_axesnc_get_axis_info
A typical NC root pattern is:
TINC^NC-Task 1 SAF^Axes^Axis 1TwinCAT quirk:
some container/root nodes such as
TIIDand major EtherCAT boxes may return descendant collections rather than a single scalar item payload through COMleaf nodes and specific IO terminals are the safer targets for
ProduceXml/ConsumeXmlif a broad path returns too much data, step down one level and target the exact terminal, box, or variable node
xae_focus_tree_itemis best effort only; this environment exposes expand/focus behavior through the backing VS project item, but not a reliable true selection APIxae_get_error_listuses typedEnvDTE80interop loaded from the XAEPublicAssembliesfolder because late-boundToolWindows.ErrorListwas returningnullin this shellxae_clear_error_listclears the visible Visual Studio/XAE Error List throughOtherContextMenus.ErrorList.Clear, which is different fromTwinCAT.ClearErrorList
Safety
This server intentionally does not auto-activate or auto-restart TwinCAT.
If you expose it to an agent, keep the confirmation guards in place unless you are willing to accept live target changes.
The modal-dialog watchdog (above) is held to the same standard: its allowlist ships empty, and you should never add rules for Activate Configuration, Run-mode, restart, download, or safety prompts — those stay human-confirmed.
License
MIT.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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/Edge-JB/tc1000-MCP-TC-4026'
If you have feedback or need assistance with the MCP directory API, please join our Discord server