te1000-mcp
This server provides an MCP interface for automating Beckhoff TwinCAT 3 XAE engineering via the TE1000 Automation Interface, enabling an AI agent to configure, build, and deploy industrial automation projects.
XAE Shell & Build
Check XAE status, open/save solutions, inspect errors, clean/build/rebuild solutions, run raw DTE commands (guarded), and resolve modal dialogs blocking XAE.
System Manager Tree & IO
Read/write any tree item (identity, children, XML parameters, rename, create, delete, import/export).
Build fully-populated EtherCAT boxes from ESI data; link/unlink variables between PLC and IO (with batch support).
Get/set AMS NetID, rescan PLC, scan IO boxes, and manage bulk variable mappings project-wide.
PLC Project & Code Authoring
Create PLC projects from templates, import existing projects, set boot flags, export/import PLCopen XML.
Author and edit POUs, DUTs, GVLs, interfaces, actions, methods, and properties; manage folders.
Surgical code edits (replace substrings/line ranges, insert, append) in declaration and implementation sections.
Read PLC source with line range or regex slicing, outline structure, and inspect graphical bodies (LD/FBD/SFC/CFC).
Project-wide code search (regex/substring) across all PLC objects.
Run CheckAllObjects offline; deploy PLC boot projects (guarded); control PLC online session (guarded).
Library Management
List, scan, add, remove library references and placeholders; set placeholder resolutions; freeze versions.
Manage machine-wide library repositories: install/uninstall, add/remove/move repos (guarded).
Realtime, Tasks & Routing
Manage RT tasks (list, create, set cycle time/priority/autostart, bind CPU affinity, link to PLC projects).
Configure RT core settings (max CPUs, affinity masks, base time, latency warnings).
ADS route management: list, broadcast-search LAN, add static/project routes (writes guarded).
Fieldbus & Platform
Configure non-EtherCAT fieldbuses: PROFINET, PROFIBUS, CANopen, DeviceNet, EAP — create masters/slaves/boxes, import GSD/GSDML, import DBC files.
NC motion tree: list NC tasks, axes, and axis details.
TcCOM module objects: list, create, configure, enable symbols, assign execution context (guarded).
TwinCAT C++ projects: create, open, generate TMC code, build, publish (publish guarded).
Project variant management: get/set variant config, select active variant, enable/disable tree items per variant.
Engineering settings: silent mode, target platform, solution/PLC archives, independent files.
Measurement & Licensing
Create TwinCAT Scope View/Analytics projects, manage scope elements, record live data (guarded).
Manage TIAN data loggers and stream helpers.
TwinCAT licensing: list license devices, add license nodes, activate OEM response files (guarded).
Runtime Deployment (Confirmation-Gated)
Activate TwinCAT configuration and restart the runtime — both require explicit confirmation tokens.
Safety & Reliability
All destructive/runtime-affecting actions are confirmation-gated and off by default.
The TwinSAFE safety project (
TISC-rooted paths) is never written to by policy.A dialog watchdog detects and optionally auto-dismisses XAE modal dialogs to prevent hangs.
A persistent native C# daemon caches the project tree and PLC source for fast repeated operations.
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
A Model Context Protocol server for Beckhoff TwinCAT 3 engineering automation — drive the TE1000 / XAE Automation Interface from an AI agent or any MCP client.
te1000-mcp exposes the TwinCAT XAE engineering surface — the System Manager tree,
PLC project authoring, IO/EtherCAT configuration, variable linking, builds, and
runtime deployment — as a compact set of MCP tools. It talks to a running XAE Shell
through the TE1000 Automation Interface (COM/DTE), so an agent can configure and build
a TwinCAT project the same way an engineer would in the GUI.
A Node MCP front (index.js) owns the MCP protocol, tool schemas, and confirmation
guards; the COM/DTE work runs in a persistent native C#/.NET daemon
(Te1000Daemon.exe) that the front talks to over a Windows named pipe. The daemon is
the sole backend. See How it works.
This server drives areal engineering tool and can activate or download to a TwinCAT runtime. Every action that touches the target runtime (activate, restart, download, deletes, licensing) is confirmation-gated and off by default. See Safety & guards.
Contents
Related MCP server: TwinCAT Validator MCP Server
Highlights
25 noun-grouped tools covering the automatable TE1000 surface — tree, IO/EtherCAT, linking, PLC project & POU authoring, libraries, tasks, mapping, routes, fieldbuses, TcCOM, C++, measurement/scope, licensing, and variants.
Batch-first — every multi-item operation has a
*_batchform that runs N operations in one DTE attach and returns a compact continue-on-error roll-up, instead of paying a process spawn + attach per call.Native EtherCAT builder —
tc_ethercatcreates fully-populated EtherCAT boxes (correct identity, SyncManagers, FMMUs, PDOs) for any device class by the GUI's own "Add Box" route, driven from the device's ESI.Surgical PLC code edits —
plc_poureads, greps, and patches declaration/implementation text in place and returns only the changed region, keeping agent context small.Safe by default — destructive and runtime-affecting actions are confirmation-gated; the safety project is never written to, by policy.
Resilient to GUI modals — a dialog watchdog detects and (optionally) auto-dismisses modal dialogs that would otherwise hang a synchronous COM call forever.
Persistent native daemon — a long-lived C#/.NET daemon holds the COM session and caches the project tree and POU source text, so warm
plc_pou searchruns roughly 500× faster than the old per-call spawn model.Speaks both MCP protocol eras — the stateless 2026-07-28 revision (envelope-carrying
server/discoverprobe, per-request_metaenvelopes,resultTypecache-hint stamping) and the legacy
initializehandshake (≤ 2025-11-25), on one stdio endpoint. The opening message pins the era per connection (MCP SDK v2serveStdio); a claim-less opening — including a bareserver/discover— is served as legacy traffic per the stdio binding's rules.
How it works
MCP client (agent)
│ stdio (JSON-RPC, MCP)
▼
index.js ───────────────► Te1000Daemon.exe ──COM/DTE──► XAE Shell (TE1000)
(Node 20) named pipe (persistent, x64, running TwinCAT project
daemonClient.js net472, STA COM session)
toolSchemas.jsTwo cooperating processes:
Node MCP front (
index.js) — serves MCP/JSON-RPC over stdio through the SDK v2serveStdioentry (both the stateless 2026-07-28 era and the legacyinitializehandshake), validates input with zod, single-sources every tool's input schema fromtoolSchemas.js, enforces the confirmation-token guards, and maps each toolactiononto a fine-grained bridge action name. It routes those actions to the daemon over a named pipe (daemonClient.js).Native daemon (
daemon/Te1000Daemon.exe) — a persistent net472/x64 process that acquires the DTE +ITcSysManageronce and keeps them, runs the dialog watchdog on an internal thread, caches the System Manager tree and POU source text, and serves the front over the pipe. It implements the same 164 bridge actions and returns the same JSON, so the tool surface is unchanged.
Pipe protocol
The front and daemon exchange newline-delimited JSON over \\.\pipe\te1000-mcp
(name overridable via TE1000_DAEMON_PIPE):
request: {"id": "<n>", "action": "<bridge_action>", "payload": { … }}
response: {"id": "<n>", "ok": true, "result": { … }}
| {"id": "<n>", "ok": false, "error": "…", "errorKind": "com_error|dialog_blocked|timeout", "dialog": { … }}Responses are correlated by id. The daemon serializes every COM call through a single
STA worker thread, so concurrent pipe clients are safe (XAE serializes anyway). The
daemon also answers two COM-free meta actions used for health checks: ping and
list_actions.
Why a daemon — the performance win
An earlier model spawned a fresh 32-bit powershell.exe bridge (plus a second watcher
process) on every call. Each spawn re-acquired the DTE/ITcSysManager COM handles
(a Running-Object-Table walk + Marshal.GetActiveObject), JIT-compiled the inline
Add-Type Win32 helpers, and — for plc_pou.find/search — re-walked the entire
project tree from the root (O(tree-size), ~2,900 COM round-trips on a full project),
so latency grew with project size.
The persistent daemon removes all of that from the hot path:
Persistent COM session (
ComSession.cs) — the DTE + sysmanager are acquired once, health-checked with a cheap property read, and transparently reconnected if stale.Two-layer tree cache (
TreeCache.cs) — per-object decl/impl source text and a flat enumeration of the project's code objects are memoized, so a warm full-project search does zero COM tree-walk. This is the ~500× warm-searchspeed-up.Edit watcher (
EditWatcher.cs) — an on-demandDTE.Documents/.Saveddirty check plus aFileSystemWatcherover the project directory invalidate the cache so it never serves stale source for an object you are editing in the IDE (or that changed on disk).Internal dialog watcher (
DialogWatcher.cs) — runs on its own thread, so there is no per-call watcher process. See Reliability.
Build the daemon with daemon/build.ps1 (in-box .NET Framework MSBuild — no SDK/NuGet).
The daemon requires the 64-bit TcXaeShell (DTE.17.0).
See docs/architecture.md for the end-to-end design and
docs/csharp-daemon-validation.md for the
build/cut-over/validation guide.
Requirements
OS | Windows |
TwinCAT | TwinCAT 3 XAE Shell / XAE installed, with the TE1000 Automation Interface |
Node.js | 20 or newer (the MCP front; the daemon does not remove the Node dependency) |
A running XAE Shell | the server attaches to an already-open instance (it does not launch XAE) |
Daemon (required backend) | the 64-bit TcXaeShell, a .NET Framework 4.x install (for the in-box MSBuild + net472 runtime), and |
The XAE ProgID defaults to TcXaeShell.DTE.17.0. Override it with the TE1000_PROGID
environment variable if your installation differs.
The daemon is not auto-built — build it once with daemon/build.ps1 (see
Build the daemon); thereafter the MCP front auto-spawns the prebuilt
Te1000Daemon.exe on first use. If the exe is absent, build it before the front can serve
calls.
Install
git clone https://github.com/Edge-JB/TwinCAT-XAE-MCP.git
cd TwinCAT-XAE-MCP
npm installVerify the server starts:
node index.js
# -> te1000-mcp server running on stdio (native daemon mode; MCP 2026-07-28 stateless + legacy initialize) (Ctrl-C to exit)The server communicates over stdio and is normally launched by an MCP client, not by hand. Running it directly just waits for a client on stdin.
Build the daemon
The native daemon is the backend, which you build once:
powershell -ExecutionPolicy Bypass -File daemon\build.ps1
# -> daemon\bin\Release\Te1000Daemon.exe (Release, x64, net472)Uses the in-box .NET Framework MSBuild (
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe) — no .NET SDK, no NuGet, no internet. The csproj is old-style (non-SDK) and targetsnet472; the produced x64 exe also runs on the net48 runtime.References
TCatSysManagerLib.dll(embedded interop) for the handful of vtable-onlyIUnknowninterfaces that late-bounddynamiccan't reach (ITcPlcProject, etc.).build.ps1probes the known TwinCAT install paths; if yours differs, edit the<HintPath>indaemon/Te1000Daemon.csprojand rebuild. Pass-Debugfor a Debug build.After building, the MCP front auto-spawns the exe (detached,
windowsHide) on the first call and connects to its pipe. The daemon is single-instance per pipe name (named mutex), so duplicate spawns are harmless, and it is detached so it survives an MCP-front restart. Verify it independently with no XAE attached:node daemon\test-ping.js # spawns the daemon on a test pipe, round-trips ping
The running daemonlocks Te1000Daemon.exe. To rebuild after a code change, stop any
running instance first: Get-Process Te1000Daemon | Stop-Process.
Configure your MCP client
Point your client at the absolute path of index.js in your clone. Example
(Claude Desktop / Claude Code / any MCP client that reads this shape):
{
"mcpServers": {
"te1000": {
"command": "node",
"args": ["C:\\path\\to\\TwinCAT-XAE-MCP\\index.js"]
}
}
}A ready-to-edit copy lives at examples/mcp-config.json.
Environment variables
All optional. The first group is read by the Node front (index.js / daemonClient.js);
the second by the native daemon process. Defaults are from the source.
Read by the Node front:
Variable | Default | Purpose |
|
| XAE Shell COM ProgID to attach to (passed through to the daemon as |
|
| Named-pipe name. The front and the daemon it spawns share this, so a custom value applies to both. |
|
| How long the client waits to connect to (and, if needed, spawn) the daemon before failing the request. |
|
| Node-side per-request ceiling: if no matching response arrives, the request is failed. Set comfortably above the daemon's own ~180 s ceiling so it never pre-empts a legitimately long call. |
| on |
|
| on |
|
|
| How long a blocking dialog must persist before the daemon recycles its COM worker. |
Read by the daemon:
Variable | Default | Purpose |
| unset | When multiple XAE instances are running, prefer the one whose open solution's full path matches this (otherwise the daemon prefers any instance with an open solution). |
| unset |
|
| unset | Explicit path for the daemon diagnostic log (implies logging on, overrides the default location). |
The daemon also accepts CLI flags (
--pipe,--no-watch,--no-autodismiss,--grace-ms,--allowlist). The front sets these from the dialog-watch env vars above when it spawns the daemon — you normally don't pass them by hand.Caveat — spawn-time only.
TE1000_DIALOG_WATCH,TE1000_DIALOG_AUTODISMISS, andTE1000_DIALOG_GRACE_MSare read by the Node front only when it spawns the daemon, and are translated into the daemon's--no-watch/--no-autodismiss/--grace-msflags. The daemon is single-instance per pipe, so changing one of these has no effect on an already-running daemon — kill that daemon process and let the front re-spawn it before the new value takes effect.
Quickstart
With XAE Shell open on your solution, an agent can drive a full configure → build loop. A typical session (tool name + arguments shown):
# 1. Confirm the server is attached and a solution is open
xae action: "status"
# 2. Inspect the IO tree
tc_tree action: "children" path: "TIID^Device 2 (EtherCAT)"
# 3. Add a populated EtherCAT rack from its ESI (digital in/out + analog)
tc_ethercat racks: [{
parent: "TIID^Device 2 (EtherCAT)^R01.Main.N01 (EK1200)",
modules: [{ type: "EL1008" }, { type: "EL2008" }, { type: "EL3064" }]
}]
save: true
# 4. Link a PLC input to a terminal channel
tc_link action: "link"
a: "TIPC^MyPlc^MyPlc Instance^PlcTask Inputs^MAIN.bStart"
b: "TIID^Device 2 (EtherCAT)^Term 1^Channel 1^Input"
# 5. Build the solution
xae_build action: "build"
# 6. (Optional, guarded) download to the target runtime
plc_download confirm: "ALLOW_PLC_DOWNLOAD"More end-to-end recipes — bulk linking, parameter edits via set_xml, POU authoring —
are in examples/.
Tool reference
Paths into the System Manager tree use ^ separators, e.g.
TIID^Device 2 (EtherCAT)^Box 1^Term 5^Channel 1. The leading token is the tree root
(TIPC = PLC, TIID = IO, TINC = NC, TIRC = realtime/license, …).
Engineering & build
Tool | Purpose | Key actions |
| XAE shell & solution control |
|
| Compile the active configuration |
|
| Run a raw DTE command 🔒 | any command name (guarded) |
System Manager tree, IO & linking
Tool | Purpose | Key actions |
| Read/write any tree item (identity, XML params, rename, create, delete) |
|
| Build fully-populated EtherCAT boxes from their ESI |
|
| Link/unlink variables; verify existing links |
|
| Target & rescan helpers |
|
| Bulk variable mapping |
|
| NC motion tree |
|
PLC project & code
Tool | Purpose | Key actions |
| PLC project lifecycle |
|
| Author + surgically edit POUs/DUTs/GVLs (offline) | author ( |
| Library refs / placeholders / repos |
|
| Deploy the active PLC project 🔒 | boot-project (default) or legacy command route |
| Online-session control via UI Automation |
|
Realtime, fieldbus & platform
Tool | Purpose | Key actions |
| RT tasks / cores / linked tasks |
|
| ADS routes |
|
| Engineering settings & archives |
|
| Non-EtherCAT fieldbuses (PROFINET/PROFIBUS/CANopen/DeviceNet/EAP) |
|
| TcCOM module objects |
|
| TwinCAT C++ projects/modules |
|
| Scope + Analytics (TIAN) |
|
| TwinCAT licensing |
|
| Project variant management |
|
Runtime (guarded)
Tool | Purpose |
| Activate the configuration on the target |
| Start/restart the TwinCAT runtime |
🔒 = confirmation-gated. See Safety & guards. Full action signatures, batch semantics, and return shapes are documented in docs/tools.md.
Safety & guards
The server never auto-activates, auto-restarts, or auto-deploys. Any action that
changes the target runtime, deletes a node, or alters licensing is blocked unless you pass
the matching confirm token:
Confirm token | Unlocks |
|
|
|
|
|
|
|
|
|
|
| node/object deletes (or use |
| machine-wide library repository administration |
| ADS route writes |
| TcCOM context changes |
| C++ driver publish |
| live scope acquisition |
| license activation |
Safety project policy. Nothing in this toolchain writes toward the TwinSAFE safety
project. Every authoring tool refuses safety-rooted (TISC) paths via an internal guard.
Safety remains read-only/diagnostic.
Reliability: dialog watchdog & PLC session control
A synchronous DTE/COM call blocks inside XAE's modal message loop if XAE raises a modal dialog (save-changes, "file changed externally", activate confirm, license prompt) — which would hang the MCP call and the calling agent indefinitely.
Dialog watchdog. This runs as an internal thread of the daemon (
DialogWatcher.cs) that polls (~750 ms) for an application-modal dialog owned by the XAE process. It detects application-modal dialogs owned by XAE and either auto-dismisses them (if they match a rule indialog-allowlist.json) or reports the dialog's title, body, and buttons back to the agent and abandons the call. If a non-allowlisted modal persists pastTE1000_DIALOG_GRACE_MS, the daemon recycles its COM worker thread (re-acquiring the session on a fresh STA thread) without killing the daemon, so subsequent calls recover once the dialog is cleared. Detection is dialog-driven, not a wall-clock timeout, so long legitimate builds are never killed. The allowlist ships empty (report-only by default) and must never auto-answer Activate / Run-mode / restart / download / safety prompts.Interactive resolution. When a dialog is not in the allowlist, the reported error tells the agent to ask the user which button to press (and whether to remember it), then call
xae dialog_resolve {button, remember?}. That action clicks the chosen button on the live dialog; withremember:trueit appends an auto-dismiss rule todialog-allowlist.jsonand hot-applies it to the running watcher (no restart). Destructive prompts (activate / run-mode / restart / download / boot project / TwinSAFE / safety) are refused for auto-remember — the one-time chosen click still happens, but no rule is persisted (rememberRefusedis reported). Usexae dialog_probe(read-only) to inspect the current dialog first.PLC session control (
powershell/plc-session.ps1) uses UI Automation to read and toggle the Login/Logout state (the DTE Login/Logout commands are unreachable on the 64-bit shell).plc_downloadauto-logs-out first (by default) so deferred source edits compile before the boot project is generated. It never logs back in.
Full details: docs/operations.md.
Troubleshooting
Te1000Daemon.exe not found— build it:daemon\build.ps1. The front cannot serve calls until the daemon is built.Build fails on
TCatSysManagerLib— the DLL wasn't found at the probed TwinCAT paths. Edit the<HintPath>indaemon/Te1000Daemon.csprojto your install and rebuild.Rebuild fails with the exe locked — a daemon is still running. Stop it first:
Get-Process Te1000Daemon | Stop-Process, then rebuild.Daemon won't start / stale behavior — kill it (above) and let the front re-spawn a fresh one on the next call. Enable
TE1000_DAEMON_DEBUG=1to capture%TEMP%\te1000-daemon-<pipe>.log.Wrong XAE instance picked (several open) — set
TE1000_MCP_SOLUTION_PATHto the solution's full path to pin the daemon to that instance.A modal dialog is blocking calls — clear it on the machine, or add a rule to
dialog-allowlist.json(never for Activate / restart / download / safety prompts). The daemon picks up the allowlist on start.
Examples
The examples/ directory contains:
mcp-config.json— a drop-in client configuration.README.md— copy-pasteable recipes: building an EtherCAT rack, bulk-linking IO, editing terminal parameters viaset_xml, authoring a POU, and a safe build → activate → download flow.
Documentation
Document | What's in it |
The Node-front + persistent C#/.NET daemon design end to end — pipe protocol, COM session, caching, edit-watching | |
Complete tool & action reference — signatures, batch semantics, return shapes | |
Dialog watchdog, PLC session control, and the safety/guard model in depth | |
Survey of the full TE1000 Automation Interface surface (the menu these tools are carved from) | |
The 164-action port coverage checklist (bridge action → C# handler) | |
Build, cut-over, and live-XAE smoke-test guide for the daemon | |
Running engineering notes / backlog discovered on real projects | |
Version history |
Contributing
Contributions are welcome — see CONTRIBUTING.md for the architecture, the daemon build/dev loop, the action-handler contract, and the safety rules every change must respect. In short:
npm run check # node --check index.js — syntax-validate the front
node daemon\test-ping.js # daemon process + pipe + JSON round-trip (no XAE)
powershell -ExecutionPolicy Bypass -File daemon\build.ps1 # rebuild the daemon after a C# changeLicense
MIT © Edge Automation.
Legal & trademarks
This is an independent, third-party project. It is not affiliated with, endorsed by, sponsored by, or supported by Beckhoff Automation GmbH & Co. KG.
All product names, logos, and brands are the property of their respective owners:
Beckhoff®, TwinCAT®, TE1000, and XAE Shell are trademarks or registered trademarks of Beckhoff Automation GmbH & Co. KG.
EtherCAT® is a registered trademark and patented technology, licensed by Beckhoff Automation GmbH, Germany.
These names are used for identification and descriptive purposes only; their use does not imply any affiliation with or endorsement by the trademark holders.
This project does not include, bundle, or redistribute any Beckhoff software. It automates a separately installed and licensed TwinCAT 3 / TE1000 environment that you must obtain from Beckhoff yourself. You are responsible for complying with all applicable Beckhoff license terms and for any action this tool performs against your engineering or runtime systems.
The software is provided "AS IS", without warranty of any kind, under the MIT License. See NOTICE for the full attributions.
Available Tools
25 toolsncC
NC motion tree: tasks (list under TINC), axes (path = task, default first task), axis (path = full axis path, returns info + children).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It indicates 'returns info + children' for axis, but does not confirm read-only behavior, mention side effects, error conditions, or required permissions. The terse style leaves significant ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (one line) but uses cryptic phrasing and no structural elements like bullet points or separate sections. This sacrifices immediate clarity for brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and limited parameter descriptions, the description does not adequately cover behavior, return values, or error handling. For a tool with only 2 parameters and a single enum, it still leaves key details unspecified (e.g., default behavior for path in 'tasks').
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Description adds meaning to the action enum (tasks, axes, axis) and hints at path usage (e.g., 'path = task' for axes, 'path = full axis path' for axis). However, 0% schema coverage means it must fully compensate; the path parameter usage remains underspecified (e.g., optional vs required per action, format).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as querying the 'NC motion tree' and lists three distinct actions (tasks, axes, axis) with brief explanations of each. This differentiates it from sibling tools that focus on PLC, EtherCAT, or system configuration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., tc_mapping, tc_task). The description only enumerates actions without stating prerequisites, limitations, or recommended scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plc_downloadB
Deploy the active PLC project. Guarded: confirm="ALLOW_PLC_DOWNLOAD" (deploys a boot project to the live target). method "bootproject" (default): headless via ITcPlcProject — writes the boot project to the target boot dir; twincat_restart_runtime loads and runs it. method "command": legacy DTE command route (needs a shell with window automation). autoLogout (default true): if the IDE is logged into the PLC, log out first via UI Automation so any source edits deferred by the online lock are applied before deploy. Never logs back in.
| Name | Required | Description | Default |
|---|---|---|---|
| method | No | bootproject | |
| confirm | No | ||
| treePath | No | PLC root node, default first project under TIPC | |
| autostart | No | ||
| autoLogout | No | ||
| commandName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It discloses the autoLogout behavior (logs out via UI Automation if needed and never logs back in) and method differences. However, it does not mention failure scenarios, overwrite behavior, or whether the runtime is restarted after deployment.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single block of text that front-loads the main purpose. It contains useful details without excessive verbosity, but lacks structure (e.g., bullet points for parameters) and could be more scannable for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, no output schema, and sibling tools like twincat_restart_runtime, the description should cover deployment nuances. It addresses methods and logout but omits autostart default behavior, commandName usage, treePath selection, and return value expectations. This leaves significant gaps for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 17% (only treePath described). The description adds meaning for method, confirm, and autoLogout but ignores autostart, commandName, and treePath details. Even confirm is only implied as required. This is insufficient for a 6-parameter tool with low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool deploys the active PLC project, using specific verbs like 'deploy' and 'writes to target boot dir'. It distinguishes the two methods (bootproject and command) but does not explicitly differentiate from sibling tools like xae_build or twincat_restart_runtime.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides guidance on when to use each method (headless vs. needing window automation) and the required confirmation token (confirm=
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plc_libraryA
PLC library references / placeholders / repositories via ITcPlcLibraryManager on the References node (TIPC^^ Project^References). referencesPath defaults to the first PLC under TIPC. READ (no side effects): list (References → name/kind library|placeholder/displayName/distributor/version), scan (ScanLibraries → installed libs name/version/distributor/displayName; pass filter to avoid the full catalogue dump), repos (Repositories → name/folder). WRITE — OFFLINE .plcproj edits, NO runtime impact (not confirm-gated): add_library (name, version?, company?), add_placeholder (name, defLib?/defVer?/defDist? — omit defLib for the name-only form), set_resolution (placeholder, lib, version?, dist?), freeze (name? — omit to freeze ALL), remove_reference (name = library or placeholder). Each accepts save:true to File.SaveAll after the edit. LANDMINE: a .plcproj library-reference edit (add/remove/repin a library or placeholder, set resolution) requires a full solution close+reopen in XAE before it takes effect; adding source files alone does not — the response surfaces this note. REPO ADMIN — GUARDED, mutates the machine-wide TwinCAT library store (no runtime change, but shared-machine state): install_library (repo, libPath, overwrite?), uninstall_library (repo, lib, version?, dist?), insert_repository (name, folder, index?), remove_repository (name), move_repository (name, index). These require confirm="ALLOW_PLC_LIBRARY_REPO". Nothing here targets the safety system (References live only under TIPC).
| Name | Required | Description | Default |
|---|---|---|---|
| lib | No | ||
| dist | No | ||
| mode | No | DTE attach mode; default active | |
| name | No | ||
| repo | No | ||
| save | No | ||
| index | No | ||
| action | Yes | ||
| defLib | No | ||
| defVer | No | ||
| filter | No | scan: case-insensitive substring on library name; omit for the full installed list | |
| folder | No | ||
| company | No | ||
| confirm | No | ||
| defDist | No | ||
| libPath | No | ||
| version | No | ||
| overwrite | No | ||
| placeholder | No | ||
| referencesPath | No | References node path; default = first PLC under TIPC |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that READ has no side effects, WRITE involves offline .plcproj edits with no runtime impact, and REPO ADMIN mutates machine-wide state. It also notes the LANDMINE about solution close/reopen and that repo admin is guarded with confirm. It does not cover error handling or concurrency, but the coverage is substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with clear sections (READ, WRITE, LANDMINE, REPO ADMIN). It is front-loaded with the core purpose. Every sentence adds useful information, though it is dense and could be slightly trimmed without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (20 parameters, many actions) and no output schema, the description covers the main actions, their effects, and key caveats. It provides partial output structure for READ actions (e.g., 'list → name/kind/displayName/...') but lacks details for WRITE and REPO ADMIN return values. Overall, it is fairly complete for an agent to understand usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 15%, so the description must compensate. It explains the action enum values in detail, and for each action it lists relevant parameters (e.g., add_library takes name, version?, company?). However, several parameters (lib, dist, mode, index, confirm, etc.) are not explained or only partially covered. The description adds value but is not comprehensive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages PLC library references, placeholders, and repositories via ITcPlcLibraryManager. It lists specific actions (list, scan, repos, add_library, etc.) and their effects. It distinguishes itself from sibling tools by focusing on library management, not build, download, or other TwinCAT operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use each action, including READ vs WRITE distinctions, and the LANDMINE about needing solution close/reopen for certain edits. It also mentions the confirm parameter requirement for repo admin. However, it does not explicitly state when NOT to use this tool or compare to alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plc_pouA
PLC object authoring + code edit on the open solution (OFFLINE engineering only — edits land in-memory and reach a runtime only via a later guarded plc_download + twincat_restart_runtime). Tree paths use ^ separators; safety (TISC-rooted) paths are rejected by policy. CREATE — create / create_batch (parent, name, subType, language?, returnType?, extends?, implements?, declText?, before?): CreateChild sub-types 602 Program, 603 Function (returnType required), 604 FunctionBlock, 605 Enum, 606 Struct, 607 Union, 608 Action, 609 Method, 611 Property (returnType required), 615 GVL, 616 Transition, 618 Interface, 619 Visualization, 623 Alias, 629 ParameterList, 631 UML. language IECLANGUAGETYPES 0 NONE/1 ST/2 IL/3 SFC/4 FBD/5 CFC/6 LD (default 1). extends/implements for FB 604 / Program 602 derivation (618 uses extends as its base); declText seeds DUT/GVL decl. For code POUs prefer set_decl after create. FOLDERS — create_folder (parent, name, before?) creates a PLC folder (sub-type 601) under parent (a PLC subtree node, POUs/DUTs/GVLs container, or another folder); returns the same shape as create. create_folder_batch (creates:[{parent,name,before?}], save?) loops continue-on-error, returns {count,succeeded,failed,results} KEEPING success rows (each carries the created child identity) — list a parent-folder entry before its child (array order). create / create_batch already author INTO a folder when parent is the folder's path — no separate action needed. TEMPLATE — import_template (parent, paths[]) imports POU template file(s) (CreateChild sub-type 58). READ (cheap-first: outline for structure; get_decl/get_impl with grep{} or range{} to slice; full text only when the whole body is needed — a large full read returns a hint nudging the next call to slice) — get_decl / get_impl / get_document / get_graphical (path). get_decl/get_impl take an optional range {start,end} (1-based inclusive line slice, clamped) OR grep {pattern, context?} (regex over lines + context each side); mutually exclusive; default full text. Both report lineCount; get_impl also returns language (textual 1 ST/2 IL; graphical 3 SFC/4 FBD/5 CFC/6 LD -> lineCount:0 + {graphical:true, hint}). get_graphical (path) READ-ONLY inspects a graphical (LD/FBD/SFC/CFC) body: returns {language,languageName,itemType,source,readOnly,xml} where xml is the object's network XML (NWL 'BoxTree' for LD/FBD/IL, or the SFC/CFC archive), pulled live from the POU document (for an Action/Method/Transition it reads the PARENT POU's document, since get_document/GetDocumentXml only work on a top-level POU). Diagnostic only — graphical bodies are NOT text-editable; change them in the XAE GUI. Refuses textual languages (use get_impl). outline (path) returns structure WITHOUT full text: header + varBlocks + child code items. WRITE — set_decl / set_decl_batch (path, declText); set_impl / set_impl_batch (path, exactly one of implText|implXml — implXml is TwinCAT object XML, round-trip only, for graphical languages); set_document (path, documentXml). SURGICAL TEXT EDIT (read-modify-write, returns ONLY the changed region +/-2 ctx; target decl|impl, CRLF/LF preserved; refuses graphical impl): replace (find literal substring, replaceWith, expectCount? default 1 — fails without writing on 0 or count mismatch); replace_lines (start, end, text — 1-based inclusive span, OOB throws); insert (exactly one of at|after|before, text); insert_in_var_block (block e.g. VAR_INPUT, text, occurrence? — inserts before that block's END_VAR); append (text — default target impl). All surgical writes accept validate:true to run CheckAllObjects after (default off). DISCOVER (cheap-first: find for path-by-name; search only for content patterns) — tree (plcPath?, path? subtree root, depth?, typeFilter?) does a read-only recursive Child() walk of the IEC project and returns {plcPath,projectPath,rootPath,count,tree:[{path,name,type,itemType,subType?,childCount,children?,truncated?}]} (type is a normalized label: Program/FB/Function/FunctionBlock/Struct/Enum/Union/Alias/GVL/Interface/Method/Property/Action/Transition/Visualization/ParameterList/UML/Folder/Project/Task/Unknown; depth 1 = direct children only; typeFilter is a comma list of type labels to KEEP, ancestors retained as scaffolding). find (plcPath?, path?, name? substring or /regex/, typeFilter?; at least one of name/typeFilter) returns a FLAT {plcPath,projectPath,count,matches:[{path,name,type,itemType,subType?,childCount}]} so a caller can resolve a ^ path from a name without the whole nested blob. GREP — search (pattern [regex/.NET or substring], ignoreCase?, declOnly?|implOnly? [mutually exclusive], plcPath?, path? subtree root, maxResults? default 50/max 5000 — raise for exhaustive scans; truncated:true signals the cap was hit) is a project-wide find-in-code: walks every code object under the IEC project, greps DeclarationText + (ST-only) ImplementationText line-by-line, returns {pattern,plcPath,scanned,searched,count,truncated,matches:[{path,section:'decl'|'impl',line,text}]}; graphical bodies are scanned-but-not-searched. Read-only/offline. Decl/impl text is CACHED (warm repeat sub-100ms vs ~16s cold); the cache self-invalidates on edits through this tool, dirty-checks open IDE editors, and is backstopped by a file-save watcher — pass refresh:true to force a full live re-pull. DELETE — delete (path OR parent+name) GUARDED offline delete of one PLC object via parent.DeleteChild; dryRun:true previews {wouldDelete,target}, confirm="ALLOW_TWINCAT_DELETE" to actually delete; verifies the child exists first, refuses TISC. LIFECYCLE (OFFLINE, unguarded, refuses TISC) — rename (path, newName = bare name) renames in place, returns {path,newName,newPath}. move (path, newParent, before?) reparents one object preserving decl/impl/document/sub-objects via export-import-delete in ONE attach (no native reparent exists); refuses no-op/into-self/into-own-descendant moves; returns {path,newParent,newPath,name,via}. BUILD-CHECK — check_objects (plcPath?, default first PLC under TIPC) runs CheckAllObjects on the nested IEC project (no download). Mutating batch verbs (create_batch, set_decl_batch, set_impl_batch) accept save:true to save once after the batch.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | insert before this 1-based line (lineCount+1 appends) | |
| end | No | replace_lines: 1-based inclusive last line | |
| find | No | replace: exact literal substring (NOT regex) | |
| grep | No | get_decl/get_impl: regex over lines + context each side (default 2); mutually exclusive with range | |
| name | No | ||
| path | No | ||
| save | No | ||
| text | No | replacement / insert / append text | |
| after | No | insert after this 1-based line | |
| block | No | insert_in_var_block: VAR-block keyword e.g. VAR_INPUT | |
| depth | No | tree: max recursion depth (1 = direct children only); default unlimited | |
| items | No | ||
| paths | No | ||
| range | No | get_decl/get_impl: 1-based inclusive line slice; mutually exclusive with grep | |
| start | No | replace_lines: 1-based inclusive first line | |
| action | Yes | ||
| before | No | create: sibling name to insert before (string). insert: 1-based line to insert before (int, alias of at) | |
| dryRun | No | delete: preview the target without deleting | |
| parent | No | ||
| target | No | surgical edit target; default decl (append defaults impl) | |
| confirm | No | delete: must equal ALLOW_TWINCAT_DELETE to actually delete | |
| creates | No | ||
| details | No | set_decl_batch/set_impl_batch: include ok:true rows; default failures-only ({count,succeeded,failed} always reported). create_batch/create_folder_batch always keep success rows (they carry child identity), so details is a no-op there. | |
| extends | No | ||
| implXml | No | ||
| newName | No | rename: new bare object name (not a path) | |
| pattern | No | search: regex (.NET syntax) or plain substring, matched per-line against each object's decl/impl text | |
| plcPath | No | ||
| refresh | No | search: force a full live re-pull, bypassing the decl/impl text cache for the searched scope (default false). Open editors are always dirty-checked automatically; use this only as an escape hatch after structural ops or for paranoia. | |
| subType | No | ||
| declOnly | No | search: search only DeclarationText; mutually exclusive with implOnly | |
| declText | No | ||
| implOnly | No | search: search only ImplementationText (ST-only); mutually exclusive with declOnly | |
| implText | No | ||
| language | No | ||
| validate | No | surgical writes: run CheckAllObjects after the edit (default off) | |
| newParent | No | move: ^-separated destination parent tree path (TISC refused) | |
| ignoreCase | No | search: case-insensitive match (default false) | |
| implements | No | ||
| maxResults | No | search: cap on returned match rows (default 50, max 5000; raise for exhaustive scans); stops the walk and sets truncated:true when hit | |
| occurrence | No | insert_in_var_block: which matching block (1-based, default 1) | |
| returnType | No | ||
| typeFilter | No | tree/find: comma list of normalized type labels to keep/match (case-insensitive), e.g. 'FB,Method,Struct' | |
| documentXml | No | ||
| expectCount | No | replace: required occurrence count (default 1) | |
| replaceWith | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure and does so comprehensively. It describes the offline-only nature, in-memory edits with delayed runtime effect, guarded delete requiring explicit confirmation, refusal of TISC-rooted paths, caching behavior with self-invalidation, dirty-checking and file-save watcher for search, and the fact that graphical bodies are not text-editable (diagnostic only via get_graphical). It also notes that batch operations continue on error and return structured results with success rows. All critical behavioral traits are transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very long and dense, packing a huge amount of information into a single block of text. It is structured by action category (CREATE, READ, WRITE, SURGICAL TEXT EDIT, DISCOVER, DELETE, LIFECYCLE, BUILD-CHECK) which helps navigation, but the lack of line breaks, bullet points, or headings makes it hard to scan quickly. Every sentence earns its place, but the overall conciseness suffers from the sheer volume. A little restructuring would improve readability without losing content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's high complexity (46 parameters, up to 28 enum actions, nested objects, no output schema), the description is remarkably complete. It covers all major action categories, parameter semantics, behavioral traits, ordering dependencies (e.g., list a parent folder entry before its child in create_folder_batch), and error handling (e.g., replace fails on count mismatch). The absence of an output schema is mitigated by describing return shapes in the text. However, some edge cases (e.g., what happens when move fails mid-operation) are not mentioned, and the caching details could be more precise about when refresh is truly needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 59%, meaning many parameters lack descriptions in the schema. The description compensates by explaining parameters in context for each action (e.g., subType values and their meanings, language enum values, range and grep usage for get_decl/get_impl, expectCount for replace, validate for surgical writes). However, some parameters like 'details', 'at', 'before' dual-type, and 'occurrence' are still only partially explained relative to the rich action set. Overall, the description adds significant meaning beyond the schema, but the schema itself still has gaps that are not fully covered.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins by clearly stating 'PLC object authoring + code edit on the open solution,' which specifies the verb (author and code edit) and the resource (PLC objects). It thoroughly differentiates from siblings by emphasizing OFFLINE engineering only, tree path separators, and safety policy for TISC paths. This makes the tool's purpose unmistakable and distinct from building, downloading, or runtime tools like xae_build, plc_download, or twincat_restart_runtime.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('OFFLINE engineering only') and when not to ('refuses TISC'). It provides detailed alternatives for specific operations (e.g., 'For code POUs prefer set_decl after create', 'read-modify-write cycle for surgical edits', 'cheap-first: outline for structure; get_decl/get_impl with grep or range'). It distinguishes between discovery, reading, writing, and lifecycle operations, and guides the agent on cost-saving strategies like using outline before full text, or search for content patterns vs find for path-by-name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plc_projectA
PLC (IEC) project lifecycle on the open solution. Tree paths use ^ separators; the PLC ROOT node is TIPC^, the nested project INSTANCE node is TIPC^^ Project. NODE MATTERS: ITcPlcProject (boot flags / generate_boot) is on the ROOT; ITcPlcIECProject* (plcopen_export/import / save_as_library) is on the INSTANCE node. Actions: create_from_template (name, template, before?, save?) — new PLC project from a stock template; open (name, file=.plcproj/.tpzip, subType 0 copy/1 move/2 use-in-place, before?, save?) — import an existing project; info (treePath? default first under TIPC) — read identity (nestedProjectName/instanceName/childCount); set_boot_flags (treePath? = ROOT, autostart?, tmcFileCopy?) — config-only boot flags; plcopen_export (file, treePath? = INSTANCE, selection?) — write PLCopen XML; plcopen_import (file, treePath? = INSTANCE, options 0 NONE/1 RENAME/2 REPLACE/3 SKIP, selection?, folderStructure? default true, save?) — import PLCopen XML; save_as_library (file, treePath? = INSTANCE, install? default false — install:true mutates the local library repository) — save project as .library. GUARDED (live runtime/target writes), require confirm="ALLOW_PLC_DOWNLOAD" and default to no-op: generate_boot_project (treePath? = ROOT, autostart? default true) — generates the boot project to the target boot dir (restart runtime to load); online (command login/logout/start/stop/reset_cold/reset_origin, treePath? — changes live online/runtime state; the ConsumeXml envelope is UNVERIFIED on this build and surfaces GetLastXmlError verbatim, reset_* need a prior login, build>=4010). Safety projects are deliberately out of scope.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | ||
| name | No | ||
| save | No | ||
| action | Yes | ||
| before | No | insert before this sibling PLC project | |
| command | No | ||
| confirm | No | ||
| install | No | ||
| options | No | ||
| subType | No | ||
| template | No | ||
| treePath | No | ||
| autostart | No | ||
| selection | No | ||
| tmcFileCopy | No | ||
| folderStructure | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses many behaviors: guarded actions require confirm, default to no-op for generate_boot_project, online command envelope is UNVERIFIED, reset_* need prior login, install:true mutates local repository, subType 0 copy/1 move/2 use-in-place. However, it doesn't explicitly state whether these operations have side effects on runtime or persistence.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with context: tree path syntax and node significance first, then action list. Each action is compactly described with parameters in parentheses. However, the paragraph is long (over 20 lines) and could benefit from line breaks or bullet points for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (16 parameters, 9 actions, no output schema), the description is remarkably complete. It covers all actions, parameter defaults, node distinctions, guarded behavior, online command specifics, and scope exclusions. No major gaps identified for project lifecycle tasks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 6%, so description must compensate. It defines parameter semantics for all 9 actions inline, e.g., 'create_from_template (name, template, before?, save?)' with plain-English explanation. It explains special defaults like 'treePath? = ROOT' and 'treePath? = INSTANCE' for different actions. However, some parameters like 'before', 'save', 'selection' lack detailed specs on their effects.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly specifies verb+resource: 'PLC (IEC) project lifecycle on the open solution.' It lists all 9 actions with specific purposes, distinguishing each (e.g., create vs open vs info vs online). The description differentiates from siblings like plc_download and plc_pou by focusing on project-level lifecycle actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: 'Actions:' enumerate all operations. Provides critical context like node matters (ROOT vs INSTANCE), guarded actions requiring confirm='ALLOW_PLC_DOWNLOAD', and defaults (e.g., default no-op for generate_boot_project, default treePath for info and set_boot_flags). The description also states out-of-scope: 'Safety projects are deliberately out of scope.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plc_sessionA
PLC online-session control via UI Automation (the DTE Login/Logout commands are unavailable on the 64-bit shell). action "status" (read-only): reports { loggedIn }. action "logout": logs the IDE out of the PLC — this also applies any source edits the online lock deferred ("loaded after logout"). Never logs back in. Guarded: logout needs confirm="ALLOW_PLC_LOGOUT".
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry full transparency weight. It discloses read-only nature for 'status', logs the IDE out (destructive hint), applies deferred edits, and specifies that logout is guarded with a confirmation parameter. The only minor gap is not explicitly stating whether a successful login check or other prerequisites are needed before logout.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences, each earning its place: first sentence sets context, second explains 'status', third explains 'logout' with side effects, fourth adds guard constraint. Front-loaded with the core mechanism. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 2 parameters, no output schema, and no annotations, the description covers the essential details (actions, side effects, guard). It is complete enough for an agent to use the tool safely. Minor gap: does not describe the return format for 'status' (e.g., exact structure of { loggedIn }).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate entirely. It explains the 'action' enum values and their semantics, and documents the 'confirm' parameter purpose (guard for logout). Without the description, the agent would only see an enum and a string field. The description adds significant meaning, though it could hint at expected values for 'confirm' beyond the example given.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states specific actions ('status' for read-only login status, 'logout' for logging out), clearly identifies the resource (PLC session) and mechanism (UI Automation), and distinguishes from sibling tools by noting DTE commands are unavailable on 64-bit shell. This provides a specific verb+resource pairing with clear differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use 'status' (read-only) vs 'logout', warns about side effects (applies source edits, never logs back in), and states a required guard ('confirm' field needed for logout). This gives clear context for tool selection and safe usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_cppA
TwinCAT C++ projects/modules under TIXC (paths use ^ separators). C++ ONLY — TISC (safety) untouched; runtime needs a later activate/download. VS-hosted-safe: create/open go purely through ITcSmTreeItem.CreateChild on TIXC (no New/Open/SaveConfiguration). Actions: create_project (name, template, before?) — CreateChild a new C++ project node under TIXC from a wizard; template = "TwinCAT C++ Project Wizard" | "TcVersionedDriverWizard" | "TcModuleCyclicCallerWizard" (or a full template .vcxproj/.tczip path — if a wizard NAME is rejected, fall back to the file path). create_module (projectPath = TIXC^, name, template? default "TwinCAT Class Wizard", before?) — CreateChild a module/class on an existing C++ project. open (file = existing .vcxproj/.tczip, subType? 0 copy into solution dir (default) /1 move/2 use-in-place, before?) — import an existing C++ project; the project is NOT renamed (CreateChild name is empty). tmc_codegen (projectPath) — offline StartTmcCodeGenerator (regenerates C++ from the .tmc; no runtime impact). set_props (projectPath, bootProjectEncryption? None|Target, saveProjectSources?) — offline config edit via ConsumeXml (at least one prop required). build (projectName = the .vcxproj DTE project Name/UniqueName, config? default "Release|TwinCAT RT (x64)", waitForFinish? default true, timeoutMs? default 1800000) — compile a single C++ project via SolutionBuild2.BuildProject; compiles only, does NOT deploy. publish (projectPath, confirm) — GUARDED, requires confirm="ALLOW_CPP_PUBLISH" and defaults to no-op: builds the module for ALL platforms and exports the deployable/shippable driver artifacts (long-running); does NOT itself activate/restart the runtime. CAVEAT: the ConsumeXml wrapper element for C++ project params is from a doc summary (Set-TreeItemXml surfaces GetLastXmlError, so a wrong element fails loudly); ProduceXml the project node once to confirm element names before relying on tmc_codegen/set_props/publish.
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | ||
| name | No | ||
| action | Yes | ||
| before | No | insert before this sibling | |
| config | No | ||
| confirm | No | ||
| subType | No | ||
| template | No | ||
| timeoutMs | No | ||
| projectName | No | ||
| projectPath | No | ||
| waitForFinish | No | ||
| saveProjectSources | No | ||
| bootProjectEncryption | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavior: build does not deploy, publish does not activate/restart runtime, ConsumeXml wrapper element details, and fallback logic. The caveat about ProduceXml to confirm element names adds important nuance. A slightly more organized summary would improve clarity, but transparency is strong.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense at over 500 words, covering seven actions and many details. While every sentence adds value, the structure is a single paragraph block with inline action descriptions and a trailing caveat. Better formatting (e.g., bullet lists or subheadings) would improve scannability for an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (14 parameters, 7 actions, no output schema, no annotations, many siblings), the description covers most aspects: each action's purpose, parameter usage, fallbacks, and limitations. It addresses potential pitfalls (e.g., ConsumeXml element names). Missing explicit return value or error handling information, but the overall completeness is high.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 7% (only 'before' has a brief description). The description compensates thoroughly: it explains each action's parameters in context (e.g., template enum values and fallback, subType meanings, confirm guard for publish, default config and timeoutMs). This adds significant meaning beyond the sparse schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool is for TwinCAT C++ projects/modules under TIXC, explicitly listing seven distinct actions. It distinguishes from siblings by stating 'C++ ONLY — TISC (safety) untouched' and noting runtime needs a later activate/download, which sets it apart from activation tools like twincat_activate_configuration.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit context: 'C++ ONLY — TISC (safety) untouched' tells when not to use for safety projects. It details action-specific usage (e.g., template fallback, subType options, guarded publish). However, it does not explicitly list alternative tools for specific scenarios, relying on the sibling list for comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_ethercatA
Create EtherCAT IO boxes (terminals/couplers) NATIVELY. Each module is added via the GUI's own "Add Box" route — ITcSmTreeItem.CreateChild(name, 9099, before, "") — so TwinCAT expands the box FROM ITS OWN ESI: a fully populated, non-hollow box (correct identity, SyncManagers, FMMUs, full 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. ONE unified shape — a single box and a whole multi-coupler design are the SAME operation: racks:[{ parent:"<EtherCAT coupler/master tree path>", modules:[{ type:"EL1008", name?:"Term 7 (EL1008)", revision?, before?:"" }] }]. A single box is just racks:[{parent, modules:[{type}]}]. Modules are created in array order (left-to-right terminal order); before inserts ahead of a named sibling; name omitted defaults to type. Revision pinning: pass revision as the full Beckhoff product string suffix "-" (decimal), e.g. type:"EL1008" revision:"0000-0017" → RevisionNo #x00110000; you may also pass the whole pinned string in revision (e.g. "EL1008-0000-0017"). Bare type = latest revision. NO fallback — if CreateChild produces a ghost/unknown type, that ONE module is a clean ok:false (any stray child is cleaned up) and the rest continue. Optional save:true saves the solution once after everything. Returns a flat roll-up {count, succeeded, failed, results:[{parent, type, name, ok, error?}]}.
| Name | Required | Description | Default |
|---|---|---|---|
| save | No | ||
| racks | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: the native creation method, expansion from ESI, handling of ghost/unknown types (cleanup and ok:false), optional save, and the flat return format. It also explains the ordering and insertion behavior, leaving no ambiguity about side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that packs extensive technical detail. While front-loaded with the main purpose, it lacks breaks or sections to aid scanning. Every sentence is substantive, but the length makes it less concise than ideal for quick agent comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (nested parameters, no output schema, no annotations), the description covers all necessary aspects: purpose, input structure, behavior on failure, revision pinning, ordering, and the complete return format. No critical gaps remain for an agent to invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must explain all parameters. It does so thoroughly: the racks array structure, parent, modules with type, name, before, and revision. It explains the meaning of 'type' as a plain product string, the 'before' insertion semantics, and the complex revision pinning format with examples. This goes far beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with 'Create EtherCAT IO boxes (terminals/couplers) NATIVELY,' clearly stating the specific verb and resource. It distinguishes from sibling tools like tc_fieldbus or tc_module by focusing exclusively on EtherCAT terminal creation with a unique native method, which is not mentioned elsewhere.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides detailed usage instructions for the tool itself (e.g., parameter format, revision pinning, error handling) but does not advise when to use this tool over alternatives like tc_fieldbus or tc_module. No explicit 'when-not-to-use' or comparison to siblings is included.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_fieldbusA
Create + configure NON-EtherCAT fieldbus masters/slaves/boxes (PROFINET / PROFIBUS / CANopen / DeviceNet / EAP net-vars) via ITcSmTreeItem CreateChild + ClaimResources + ConsumeXml. OFFLINE CONFIG ONLY — no confirm token needed; runtime needs a later activate/restart; TISC (safety) paths refused. For EtherCAT terminals/boxes use tc_ethercat instead. BATCH-FIRST: for more than one device use create_batch (N ops in ONE DTE attach, continue-on-error roll-up {count,succeeded,failed,results:[{parent,name,ok,child?,claimed?,error?}]}). SubType cheat-sheet — PROFINET ctrl 113/119/126/140, dev 115/118/142/143; PROFIBUS master 86 slave 97; CANopen master 87 slave 98; DeviceNet master 41/73/88 slave 62/74/99 monitor 59 box 5203; EAP device 112 publisher 9051 subscriber 9052. Actions: create_device (parent? default TIID / EAP device path, name, subType, before?, vInfo?, claimIndex?, save?) — CreateChild a master/slave/box; claimIndex immediately ClaimResources to bind underlying hardware; a wrong subType/vInfo ghost is cleaned up and reported as failure; create_batch (creates:[{parent?,name,subType,before?,vInfo?,claimIndex?}], save?); list_resources (path) — read-only; probes ITcSmTreeItem5.ResourcesCount then ResourceCount (Beckhoff pages disagree on the name) and reports which answered; claim_resources (path, index [1-based per Beckhoff examples], save?) — bind the node to underlying FC/EL hardware (offline config edit, NOT a runtime write); create_gsd_box (controllerPath, name, gsdPath, moduleIdentNumber, subType [REQUIRED — PN device subType, depends on controller variant], boxFlags? [GENERATE_NAME_FROM_PAB 0x0004 / GET_STATIONNAME 0x0400 / SET_NOT_IP_TO_OS 0x4000], dapNumber?, before?, save?) — PROFINET GSD/GSDML box; vInfo = gsdPath#moduleIdentNumber#boxFlags#dapNumber. CAVEAT: GSD box subType + vInfo format from a doc summary, confirm against infosys 1041677067 before relying on it; add_netvar (boxPath = EAP publisher/subscriber box, name, dataType [IEC type as vInfo, e.g. BOOL/INT], before?, save?) — EAP pub/sub variable (SubType 0; resulting ItemType 35 publisher / 36 subscriber); set_station_address (path = PROFIBUS slave/box, address, save?) — discovers the address element via ProduceXml then ConsumeXml a minimal envelope (the bare-number form is unverified and NOT shipped); if discovery fails, use get_xml + set_xml; import_dbc (masterPath = CANopen master, fileName [.dbc], importExtendedMessages?, importMultiplexedDataMessages?, keepUnchangedMessages?, communicateWithSlavesFromDbcFile?, save?) — CanOpenMaster/ImportDbcFile config import (requires TC3.1 build >= 4018); get_xml (path) — raw ProduceXml passthrough for discovering real param elements; set_xml (path, xml = partial XML, returnXml?, save?) — generic ConsumeXml escape hatch for any fieldbus param not covered above.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | No | ||
| mode | No | DTE attach mode; default active | |
| name | No | ||
| path | No | ||
| save | No | ||
| index | No | ||
| vInfo | No | ||
| action | Yes | ||
| before | No | insert before this sibling | |
| parent | No | ||
| address | No | ||
| boxPath | No | ||
| creates | No | ||
| gsdPath | No | ||
| subType | No | ||
| boxFlags | No | ||
| dataType | No | ||
| fileName | No | ||
| dapNumber | No | ||
| returnXml | No | ||
| claimIndex | No | ||
| masterPath | No | ||
| controllerPath | No | ||
| moduleIdentNumber | No | ||
| keepUnchangedMessages | No | ||
| importExtendedMessages | No | ||
| importMultiplexedDataMessages | No | ||
| communicateWithSlavesFromDbcFile | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given no annotations exist, the description carries full burden and meets it thoroughly. It discloses offline-only behavior, no confirm token needed, runtime activation requirement, safety path restrictions, batch behavior with roll-up error structure, and cleanup of ghosts on wrong subType/vInfo. It also notes unverified caveats like 'bare-number form is unverified and NOT shipped' and GSD box subType format needing confirmation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded with the core purpose, but its length (over 1000 words) is justified by the tool's complexity (10 actions, 28 parameters, multiple fieldbus types). Every sentence adds value, but the sheer volume could overwhelm an AI agent. A structured bullet format might improve scannability, but the current prose is functional.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's high complexity (10 actions, multiple protocols, no output schema), the description provides all essential context: offline-only constraint, sibling differentiation, batch optimization, detailed subType mappings, caveats on unverified features, and parameter semantics for each action. There are no obvious gaps for the described functionality.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With only 7% schema description coverage and 28 parameters, the description compensates extensively. It documents each action's parameter usage inline (e.g., 'vInfo = gsdPath#moduleIdentNumber#boxFlags#dapNumber'), provides subType cheat-sheet for all fieldbus types, and explains purpose of action-specific parameters like claimIndex and importExtendedMessages. The description adds immense meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool creates and configures NON-EtherCAT fieldbus masters/slaves/boxes, listing specific protocols (PROFINET, PROFIBUS, CANopen, DeviceNet, EAP). It clearly distinguishes itself from sibling tc_ethercat by stating 'For EtherCAT terminals/boxes use tc_ethercat instead.' The verb+resource combination is highly specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance. It states 'OFFLINE CONFIG ONLY — no confirm token needed; runtime needs a later activate/restart; TISC (safety) paths refused.' It directs toward create_batch for multiple devices and tc_ethercat for EtherCAT. This is comprehensive usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_licenseA
TwinCAT licensing on the TIRC^License node (requires TC3.1 >= 4022.4; older targets have no AvailableLicenseDevices/ActivateResponseFile support and ProduceXml/ConsumeXml return empty or error — the HRESULT is surfaced, not masked). Nothing here touches the safety system (TIRC^License is real-time/licensing config). Actions: list (read-only) — discover available dongle license devices via ProduceXml; returns {treePath, devices:[{name,pathName,typeName,objectId}]} (pass raw:true to also include the full License-node ProduceXml blob). add (name, device) — OFFLINE config edit: CreateChild a license-device child under License bound to a dongle that MUST already exist in the I/O tree (device = its display-name e.g. "Term 2 (EL6070)" OR its ObjectID e.g. "50462722" from list). This only links the License node to existing hardware; it does NOT create the dongle terminal — add the EL6070 (etc.) first via tc_ethercat/tc_tree. Not confirm-gated (config-only). activate_response (confirm, path, oemGuid?) — GUARDED, requires confirm="ALLOW_LICENSE_ACTIVATE" and defaults to no-op: ConsumeXml the ActivateResponseFile command to activate an OEM license response file (path = absolute path to the .tmc/.reresponse file). oemGuid is "only required in special cases" and accepts any value; defaults to 0 when omitted. This is a license-activation state change.
| Name | Required | Description | Default |
|---|---|---|---|
| raw | No | ||
| name | No | ||
| path | No | absolute path to the OEM license response (.tmc/.reresponse) file | |
| action | Yes | ||
| device | No | dongle display-name (e.g. "Term 2 (EL6070)") or ObjectID string from list | |
| confirm | No | ||
| oemGuid | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses version-dependent behavior (older targets lack support, HRESULT surfaced), offline nature of 'add', guarded nature of 'activate_response' with confirm requirement, and the fact that 'add' only links to existing hardware. It also explains the raw parameter's effect and defaults for oemGuid. This is comprehensive behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but packed with essential information; no sentence is wasted. However, it could be more structured using bullet points or separate sections for each action to improve readability. The version and safety notes are front-loaded, which is good.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity (7 params, 3 actions, version dependencies, no output schema), the description covers most aspects: return format for 'list', prerequisites for 'add' and 'activate_response', and behavioral details. However, it does not explicitly state what the 'add' or 'activate_response' actions return, though the 'config-only' and 'state change' labels imply no return value. Minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has only 29% description coverage (2 of 7 parameters described). The description adds meaning for all parameters: raw (pass true for full blob), name (for add), device (dongle display-name or ObjectID), path (absolute path to response file), confirm (requires specific value), oemGuid (optional, defaults to 0). It also explains the action enum values. This fully compensates for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool handles TwinCAT licensing on the TIRC^License node and enumerates three specific actions (list, add, activate_response). It distinguishes from unrelated domains by explicitly noting it does not touch the safety system, and the sibling tool list includes many TwinCAT tools but the licensing focus sets it apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear prerequisites: version requirements (TC3.1 >= 4022.4), for the 'add' action it directs to create the dongle terminal first via tc_ethercat/tc_tree, and for 'activate_response' it specifies the required confirm value and no-op default. It also implies not to use for safety. However, it does not explicitly compare to sibling tools or provide when-not-to-use scenarios beyond the safety exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_linkA
Variable links (producer↔consumer); dot-form PLC subfields auto-resolve to XAE ^ subitem form. BATCH-FIRST: for more than one link use link_batch/unlink_batch — N ops in ONE DTE attach, failures-only roll-up by default ({count,succeeded,failed}; details:true for every row incl. resolved paths), instead of an attach per link. Actions, grouped single / batch: LINK — link (a=source, b=destination) / link_batch (links:[{a,b}]); UNLINK — unlink (a, optional b; a alone removes all its links) / unlink_batch (links:[{a,b?}]); resolve (report valid path forms for a — compact {originalPath,resolvedPath,resolved} on success; verbose:true for the attempts[] permutation list); links (a=item path; reports that item's current variable links — closes the discover→act→verify loop). link/resolve drop resolution detail by default — verbose:true restores it. Mutating batch verbs accept save:true to save once after the batch.
| Name | Required | Description | Default |
|---|---|---|---|
| a | Yes | ||
| b | No | ||
| save | No | ||
| links | No | ||
| action | Yes | ||
| details | No | link_batch/unlink_batch: include ok:true rows (with resolved paths); default failures-only | |
| verbose | No | link/resolve: return the full resolution detail (producerResolution/consumerResolution or attempts[]); default compact | |
| autoResolve | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must fully disclose behavior. It covers some aspects: mutation with save:true, read-only 'resolve' and 'links' actions, default roll-up for batches, and compact output. However, it omits permission requirements, idempotency, side effects, and error handling details. The transparency is adequate but incomplete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that contains all necessary information but lacks bullet points, section headers, or clear organization. Front-loading is present first sentence states purpose but the text becomes overwhelming with technical specifics, making it less efficient for an AI agent to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters and no output schema, the description covers the main use cases, parameter interactions, and optimization advice (batch-first). It explains resolve return format and links action behavior. However, it does not specify return values for link/unlink actions and leaves the autoResolve parameter unexplained. The description is mostly complete for basic operations.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25%, but the description compensates by attributing meanings to most parameters: a=source, b=destination, links=[{a,b}], action enum, details for full rows, verbose for resolution detail. The autoResolve parameter is not explicitly described, and some parameter behavior (optional b for unlink) is only implicitly stated. Overall, the description adds significant value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states that the tool manages variable links (producer↔consumer) and provides a clear list of actions (link, unlink, resolve, links, and batch variants). It distinguishes the batch versions as BATCH-FIRST for multiple links, making the core purpose unambiguous despite technical jargon.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance on when to use batch verbs ('for more than one link use link_batch/unlink_batch') and explains default behaviors (failures-only roll-up, compact vs verbose output). It also clarifies optional flags (details, verbose, save) across actions, providing context for selecting the right approach.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_mappingA
Bulk variable-mapping (ALL links) ops on the loaded TwinCAT project via ITcSysManager2/3, whole-project (no tree path): produce (read-only) — ProduceMappingInfo serializes every current variable link/mapping to ONE XML blob (the IDE's "Export Mapping Information"); the blob is returned as raw XML. consume (xml) — ConsumeMappingInfo re-applies/merges a previously produced blob, ADDING links; MUTATES the offline config only (no runtime impact until a later twincat_activate_configuration); optional save:true saves the solution after. clear — ClearMappingInfo deletes ALL variable links project-wide; destructive, GUARDED: requires confirm="ALLOW_TWINCAT_DELETE" (reuses the existing delete token); optional save:true. These are PROJECT-WIDE config-tree ops, NOT runtime writes. SAFETY: the mapping blob spans the whole project and CAN include TwinSAFE I/O image links — produce/consume/clear may touch safety-related links; by policy nothing should write toward safety, so run produce FIRST as a backup and treat the blob as opaque (export -> store -> consume round-trip). The exact XML schema is undocumented; test-import hand-edited blobs in the IDE before relying on them.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | No | ||
| save | No | ||
| action | Yes | ||
| confirm | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden and excels: discloses read-only nature of produce, mutation scope of consume, destructive guarded nature of clear, that operations affect offline config only, and safety implications for TwinSAFE links. It also notes the XML schema is undocumented, setting proper expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but not overly verbose; it front-loads the purpose and method, then explains each action, safety, and notes. Some redundancy exists (repeating 'PROJECT-WIDE', 'NOT runtime writes'), but overall each sentence adds value given the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters, no output schema, and no annotations, the description covers all essential aspects: operation semantics, parameter roles, safety precautions, scope, and even advises on handling the unknown XML schema. The return value of produce is explicitly stated. No gaps remain for an agent to operate correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so description must explain parameters. It does so by associating 'xml' with produce output and consume input, 'save' as optional for consume/clear, 'action' enum fully explained, and 'confirm' required for clear. While not a structured parameter list, it effectively conveys usage context. Minor improvement would be explicit mapping of each parameter to its operation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it handles bulk variable-mapping operations (produce, consume, clear) on the entire TwinCAT project, not individual links. It mentions being whole-project and not tree-path specific. However, it does not explicitly differentiate from sibling tool 'tc_link', which likely handles individual link operations, leaving some ambiguity for the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides detailed context for each operation: produce is read-only, consume mutates offline config, clear is destructive with a required confirmation token. It advises running produce first as a backup and warns about TwinSAFE involvement. However, it lacks explicit guidance on when to use this tool versus sibling tools like tc_link for individual mappings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_measurementA
Measurement (TE130X Scope View) projects + TwinCAT Analytics (TIAN) logger/stream config. Scope/Analytics PROJECTS are separate EnvDTE.Project nodes (AddFromTemplate), NOT System Manager tree nodes; TIAN logger/stream nodes ARE System Manager children (CreateChild/DeleteChild under TIAN). Requires the respective products installed (scope + analytics templates) — if absent the action fails with a clear 'tooling not installed' message rather than a raw COM HRESULT. Actions: scope_create (name, template? = full .tcmproj path [default: first installed under TE130X-Scope-View\Templates\Projects], destination? = folder [default: solution dir]) — AddFromTemplate a new Scope project; scope_add_child (project, parentPath? = ^-path of names from scope root, name?, elementType? default 0) — CreateChild(out item,name,elementType); only elementType 0 is VERIFIED, non-zero values are EXPERIMENTAL; deep parentPath resolves by enumerating existing children by name; scope_rename (project, path, newName) — ChangeName on the element at path; scope_record (project, state 'start'|'stop') — StartRecord/StopRecord; GUARDED: state='start' performs LIVE data acquisition and requires confirm="ALLOW_MEASUREMENT_RECORD" (state='stop' needs no confirm); analytics_create (name, template? = full Analytics project template path [must resolve or pass explicitly], destination? = folder) — AddFromTemplate a new Analytics project (project creation ONLY; network/function wiring is UNVERIFIED and not implemented); logger_create (name, before?) — CreateChild a DataLogger (subType 1) under TIAN (config edit, no confirm); logger_delete (name, dryRun?, confirm) — DeleteChild under TIAN, GUARDED confirm="ALLOW_TWINCAT_DELETE" (dryRun:true previews existence without deleting); stream_create (name, before?) — CreateChild a StreamHelper (subType 0) under TIAN (config edit, no confirm); stream_delete (name, dryRun?, confirm) — DeleteChild under TIAN, GUARDED confirm="ALLOW_TWINCAT_DELETE"; the actual node name is '_Obj1 (StreamHelper)' (the suffix is appended for you). For raw ProduceXml/ConsumeXml on a TIAN logger/stream node (e.g. 'TIAN^') use tc_tree get_xml/set_xml. OMITTED as UNVERIFIED: Scope data-export (SaveSVD/ExportCSV/ExportTDMS/ExportBinary/ExportDAT), Scope-Server (ShowControl/CloseControl/Disconnect), LookUpChild, and all Scope/Analytics enums. Nothing here targets the safety system.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | No | ||
| mode | No | DTE attach mode; default active | |
| name | No | ||
| path | No | ||
| state | No | ||
| action | Yes | ||
| before | No | insert before this sibling under TIAN | |
| dryRun | No | ||
| confirm | No | ||
| newName | No | ||
| project | No | ||
| summary | No | ||
| template | No | ||
| returnXml | No | ||
| parentPath | No | ^-path of names from the scope project root to the parent element | |
| destination | No | ||
| elementType | No | CreateChild elementType; only 0 is verified |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full responsibility for behavioral disclosure. It reveals guarded operations (scope_record, logger_delete, stream_delete require confirm), experimental status of non-zero elementType, automatic suffix appending for stream nodes, and failure behavior ('clear message' if templates missing). No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive but lengthy (over 500 words). It is well-structured with action groups (scope_, analytics_, logger_, stream_) and uses colons to separate parameter details. However, it could be more concise by breaking into bullet points or separate sections without losing clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (17 parameters, 9 actions, no output schema, no annotations), the description is remarkably complete. It covers all actions, their parameter usage, guarded states, verification status, defaults, and explicitly lists omitted features. No critical gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 24%, but the description adds rich parameter semantics for each action: default values for template and destination, explanation of parentPath resolution, meaning of 'before' (insert before sibling), and dryRun usage. This significantly compensates for the sparse schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: managing TwinCAT measurement projects (Scope and Analytics) and TIAN logger/stream configuration. It distinguishes between project-level actions (AddFromTemplate) and tree node operations (CreateChild/DeleteChild), and explicitly differentiates from sibling tool tc_tree for raw XML operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool vs. alternatives, e.g., 'For raw ProduceXml/ConsumeXml on a TIAN logger/stream node ... use tc_tree get_xml/set_xml.' It also explains guarded actions requiring confirm, and mentions that analytics_create only creates the project, not network wiring, setting clear expectations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_moduleA
TcCOM module objects under TIRC^TcCOM Objects (paths use ^ separators). CONFIG-TIME ONLY — no INIT/PREOP/SAFEOP/OP transitions (not an Automation Interface feature); nothing here activates config, downloads, or touches the runtime/safety system. Actions: list (read-only) — enumerate module instances via ITcModuleManager3, returns {count,modules:[{moduleTypeName,moduleInstanceName,classId,oid,objectId,parentOid}]} (oids are DECIMAL; XAE shows hex). create (name, by="classid"|"name", id, before?) — CreateChild under TcCOM Objects: by=classid -> subType 0, id = module GUID/ClassID e.g. {8f5fdcff-...}; by=name -> subType 1, id = registered module type name e.g. "NewModule"; a malformed/ghost child is cleaned up and reported as an error. get_xml (path) — ProduceXml of the instance (Parameters / DataAreas / Symbols, with current CreateSymbol/CreateSymbols flags). set_xml (path, xml, returnXml?) — ConsumeXml escape hatch for parameters not exposed as typed properties. enable_symbols (path, parameters?, dataAreas?, returnXml?) — convenience toggle: sets CreateSymbol=true on Parameter nodes and/or CreateSymbols=true on DataArea AreaNo nodes via ProduceXml/ConsumeXml. CAVEAT: the XPath/attribute names are from a how-to summary, NOT verified against a literal ProduceXml dump — call get_xml on a real module first and fall back to set_xml if the toggle reports changed:false. To wire module DataArea symbols to PLC/IO/other-module variables (symbols must already exist via enable_symbols), use tc_link link/unlink. set_context (path, taskObjectId, contextId?) — assign the instance to a task's execution context; taskObjectId/contextId are DECIMAL oids (XAE shows hex). GUARDED: changes the activated mapping/runtime context, requires confirm="ALLOW_TWINCAT_MODULE_CONTEXT" and defaults to no-op.
| Name | Required | Description | Default |
|---|---|---|---|
| by | No | ||
| id | No | ||
| xml | No | ||
| name | No | ||
| path | No | ||
| action | Yes | ||
| before | No | insert before this sibling under TcCOM Objects | |
| confirm | No | ||
| contextId | No | ||
| dataAreas | No | ||
| returnXml | No | ||
| parameters | No | ||
| taskObjectId | No | decimal ObjectId of the target task (XAE shows it in hex) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and delivers detailed behavioral traits: lists return structure, explains create error handling (ghost child cleanup), warns that XPath names for enable_symbols are unverified, and describes the guarded nature of set_context. All mutation effects are clearly stated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured: general scope first, then each action with its own details, followed by a caveat and cross-reference. While some redundancy exists (e.g., repeating the no-runtime-transition warning), the length is justified by the tool's multi-action nature. Slightly verbose for a single tool definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high parameter count (13), low schema coverage, and no output schema, the description provides extensive context: return shape for list, error behavior for create, usage order for enable_symbols, and the guarded guard for set_context. However, return structures for get_xml, set_xml, enable_symbols, and set_context are only implied, leaving minor ambiguity for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 15%, meaning the JSON schema provides almost no parameter context. The description compensates fully: explains the 'by' and 'id' semantics for create, describes 'path', 'xml', 'before', 'confirm', 'taskObjectId', 'contextId', and the boolean flags for enable_symbols. Much more detail than the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the target resource ('TcCOM module objects under TIRC^TcCOM Objects') and enumerates specific actions (list, create, get_xml, etc.), all of which are distinct from sibling tools. It distinguishes itself from tc_link by directing DataArea wiring to that sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states config-time-only usage and what the tool does NOT do ('no INIT/PREOP/SAFEOP/OP transitions', 'nothing here activates config, downloads, or touches the runtime/safety system'). Provides alternative for DataArea symbol wiring via tc_link, and warns about set_context requiring a confirm flag.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_routeA
ADS routes via the System Manager TIRR (Routes) node, ConsumeXml/ProduceXml. READ (unguarded — a transient search trigger, never persists a route): list — existing static routes under RemoteConnections (best-effort name/netId/address); broadcast_search — LAN-wide UDP discovery (timeoutMs settle wait, default ~4000ms) → targets [{name,netId,ipAddr}]; search_host — direct by host (hostname or IP; needs TwinCAT 3.1 build>=4020.10, older builds return found:false) → {found, target:{name,netId,ipAddr,version,os}}. WRITE (GUARDED, require confirm="ALLOW_TWINCAT_ROUTE_WRITE", default NO-OP): add_route — credentialed route to a remote target (remoteName, remoteNetId, one of remoteIpAddr|remoteHostName; optional userName/password/noEncryption/localName); add_project_route — lighter project-local entry (name, netId, one of ipAddr|hostName). NOTE: route changes via TIRR ConsumeXml take effect in the engineering project; whether they propagate to the live target depends on the current target connection — this does NOT auto-activate. Nothing here targets the safety system (config/engineering-side only).
| Name | Required | Description | Default |
|---|---|---|---|
| host | No | ||
| name | No | ||
| netId | No | ||
| action | Yes | ||
| ipAddr | No | ||
| confirm | No | ||
| hostName | No | ||
| password | No | ||
| userName | No | ||
| localName | No | ||
| timeoutMs | No | ||
| remoteName | No | ||
| remoteNetId | No | ||
| noEncryption | No | ||
| remoteIpAddr | No | ||
| remoteHostName | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It clearly marks read actions as 'unguarded — a transient search trigger, never persists a route' and write actions as 'GUARDED, require confirm, default NO-OP'. It explains side effects (route changes take effect in engineering project), build dependencies, and default timeout behavior. No contradictions or omissions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and well-organized into READ vs WRITE sections with bullet-like formatting. Every sentence adds value. It is slightly longer than necessary due to inline parameter lists, but this is justified by the need to compensate for the lack of schema descriptions. The front-loading with the overall purpose is effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (16 parameters, no output schema, no annotations, 24 siblings), the description covers critical contextual completeness: it explains the effect of operations, guard mechanism, build dependencies, action-parameter mapping, and scope limitation (config/engineering-side only). Return values are described inline for read actions. An agent has sufficient information to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does so by parameterizing each action in natural language (e.g., for add_route: 'remoteName, remoteNetId, one of remoteIpAddr|remoteHostName; optional userName/password/noEncryption/localName'). It explains the role of timeoutMs for broadcast_search and confirm for writes. A few parameters like host, name, netId are mentioned but not fully syntax-described for all actions; however, enough meaning is added to guide the agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the tool 'ADS routes via the System Manager TIRR (Routes) node' and distinguishes between READ and WRITE operations with specific actions (list, broadcast_search, search_host, add_route, add_project_route). It is a specific verb+resource combination that clearly differentiates from sibling tools which cover other TwinCAT domains.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance for each action, including guard requirements for writes (confirm='ALLOW_TWINCAT_ROUTE_WRITE'), build prerequisites for search_host, and a clear note that route changes affect the project but not auto-activation. It also states what the tool does NOT do ('Nothing here targets the safety system'). This leaves no ambiguity for the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_settingsA
XAE engineering settings & packaging. OFFLINE/engineering-only: NONE of these write toward a runtime or change runtime state (their runtime effect, if any, lands only on a SEPARATE later activate/download), so none are confirm-gated. Tree paths use ^ separators; safety (TISC-rooted) paths are rejected by policy in set_disabled/set_independent_file/save_plc_archive. Actions: get_silent_mode / set_silent_mode (enabled) — TcAutomationSettings.SilentMode; suppresses AI message-box dialogs (TC3.1>=4020.0; older builds throw). A good companion to the dialog watchdog. get_target_platform / set_target_platform (platform = "TwinCAT RT (x86)" | "TwinCAT RT (x64)") — ITcSysManager7.ConfigurationManager.ActiveTargetPlatform; switching platform invalidates prior build output, so rebuild (xae_build) before activate/download. save_solution_archive (file = absolute .tszip) — ITcSysManager9.SaveAsArchive, whole solution; parent dir must exist (not created). save_plc_archive (file = absolute .tpzip, name? = PLC child under TIPC, default first child) — ExportChild of the PLC project. get_independent_file / set_independent_file (path, enabled) — ITcSmTreeItem6.SaveInOwnFile (store node settings in its own file vs inline in .tsproj). get_disabled (path) — reads ITcSmTreeItem.Disabled, returns {disabled:0|1|2, state:SMDS_NOT_DISABLED|SMDS_DISABLED|SMDS_PARENT_DISABLED}; SMDS_PARENT_DISABLED(2) is a derived read-only state. set_disabled (path, disabled) — sets 0/1 only (2 is never settable).
| Name | Required | Description | Default |
|---|---|---|---|
| file | No | ||
| name | No | ||
| path | No | ||
| action | Yes | ||
| enabled | No | ||
| disabled | No | ||
| platform | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden and delivers extensively. It discloses that all actions are offline-only with no runtime effect, that set_silent_mode has version dependency (TC3.1>=4020.0), that set_target_platform invalidates prior build output, that set_disabled only accepts 0/1 (not the derived read-only state 2), and that safety-rooted paths are rejected for certain actions. This level of detail goes well beyond basic expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that packs substantial information without redundancy. Every sentence adds distinct value. However, it could be more scannable by using bullet points or action-based groupings, especially given the high number of actions. It is not overly verbose but slightly compromises readability for an AI agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (10 actions, 7 parameters, no output schema, no annotations), the description covers purpose, usage, behavioral traits, and parameter semantics well. It explicitly describes the return format for get_disabled but does not mention return values for other get actions (e.g., get_silent_mode, get_target_platform, get_independent_file). This is a moderate gap; describing return types would make it fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It adds meaning by explaining parameters in context of each action (e.g., 'file = absolute .tszip' for save_solution_archive, 'platform = "TwinCAT RT (x86)" | "TwinCAT RT (x64)"' for set_target_platform, 'path, enabled' for independent_file). It also clarifies that the 'disabled' parameter uses 0/1 values despite the boolean type, and explains 'name?' default behavior for save_plc_archive. However, it does not provide a systematic list of all parameters and their defaults, leaving some parameters (like 'enabled' for set_silent_mode) partially inferred.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'XAE engineering settings & packaging' and emphasizes it is OFFLINE/engineering-only with no runtime state changes. It lists all 10 actions explicitly, distinguishing the tool from runtime-impacting tools like tc_system. The purpose is specific and unambiguous, leaving no doubt about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool (offline-only engineering settings) and includes key constraints (e.g., 'none are confirm-gated', 'parent dir must exist' for save_solution_archive). It also explains relationships between actions and other steps (e.g., switching platform invalidates build output, so rebuild before download). However, it does not explicitly name alternative tools for similar tasks, leaving some comparison implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_systemD
System Manager: get_netid, set_netid (netId), errors (latest messages), rescan_plc (path, default TIPC), scan_io_boxes (path = IO device node).
| Name | Required | Description | Default |
|---|---|---|---|
| path | No | ||
| netId | No | ||
| action | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must fully disclose behavioral traits. It fails to indicate anything about side effects (e.g., set_netid is a write, rescan_plc may disrupt bus), permissions needed, error behavior, or synchronous vs asynchronous execution. The description is insufficient for safe invocation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single line that crams multiple actions with parenthetical notes without clear structure. It is underspecified and cryptic, wasting the opportunity to inform. Conciseness should serve clarity, not replace it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 3 parameters, 0% schema description coverage, no output schema, and no annotations, the description is severely incomplete. It does not explain return values, error handling, or which parameters are required per action. It fails to meet even minimal completeness for a multi-action system tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It mentions 'path' and 'netId' but does not explain their types, formats, or which actions require them. The action enum values are listed inline, but 'errors' and 'scan_io_boxes' are described in a confusing way (e.g., 'IO device node' is unclear). The description adds minimal clarity beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description attempts to list multiple actions but does so in a fragmented, ambiguous way. It reads as a mix of subcommands and notes (e.g., 'netId', 'errors (latest messages)') without a clear overall statement that this tool dispatches system management operations based on the 'action' parameter. The purpose is unclear and requires inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool vs siblings like 'tc_ethercat' or 'tc_link'. There is no explanation of prerequisites, context, or what each action is typically used for. The agent is left to guess usage cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_taskA
RT tasks under TIRT (+ RT-core settings under TIRS, + a PLC project's LinkedTask under TIPC). CONFIG-ONLY — no confirm token needed; runtime needs a later activate/restart; TISC (safety) untouched. Tree paths use ^ separators (e.g. TIRT^PlcTask). Actions: list (tasks under TIRT); get (path; summary:true -> identity + parsed TaskDef tags instead of full XML); create (name; withImage default true = SubType 0 / false = SubType 1 no image; before?; cycleTimeUs?/priority? applied after create via ConsumeXml; save?); set_params (path; cycleTimeUs [us, converted to 100ns ticks = us*10] / priority [0-255] / autoStart; OR xml = raw .. escape hatch [mutually exclusive with the typed fields]; returnXml?; save?). CAVEAT: the TaskDef tag names for cycle/priority/autostart are UNCONFIRMED against the AI docs — prefer the xml escape hatch and verify with get(summary) before trusting the typed fields; add_image_var (path = a with-image task's Inputs/Outputs node; varName; dataType e.g. BOOL/INT/DINT; startAddress? default -1 = append; save?); get_rt_settings (TIRS; summary:true -> parsed MaxCPUs/Affinity/per-CPU LoadLimit/BaseTime/LatencyWarning); set_rt_settings (maxCPUs / affinity [TwinCAT hex token e.g. #x0000000000000007] / cpus [{id,loadLimit?,baseTimeNs?,latencyWarningUs?}]; OR xml escape hatch; returnXml?; save?); bind_cpu (path; affinity = a name [CPU1..CPU8, MaskSingle/Dual/Quad/Hexa/Oct/All, None] OR a raw #x.. token; returnXml?; save?); get_linked_task (path? = PLC root under TIPC, default first child of TIPC); set_linked_task (path? = PLC root; linkedTask = XAE tree path of the RT task, e.g. TIRT^PlcTask; save?).
| Name | Required | Description | Default |
|---|---|---|---|
| xml | No | ||
| cpus | No | ||
| name | No | ||
| path | No | ||
| save | No | ||
| action | Yes | ||
| before | No | insert before this sibling task | |
| maxCPUs | No | ||
| summary | No | ||
| varName | No | ||
| affinity | No | ||
| dataType | No | ||
| priority | No | ||
| autoStart | No | ||
| returnXml | No | ||
| withImage | No | ||
| linkedTask | No | ||
| cycleTimeUs | No | ||
| startAddress | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses key behavioral traits: config-only, no confirm token needed, runtime activation needed later, TISC untouched, caveat about unconfirmed tag names, unit conversions (cycleTimeUs to 100ns ticks), and mutual exclusion of typed fields vs xml escape hatch. However, it does not cover authorization needs or error handling, which prevents a perfect score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that front-loads the main purpose and then lists actions with their parameter details. Every sentence provides essential information, but it could be better structured (e.g., bullet points or sections) to improve readability without losing content. Still, it is appropriately concise for the complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 19 parameters, 10 actions, no output schema, and no annotations, the description is remarkably complete. It covers all actions, parameter semantics, special behaviors (e.g., ConsumeXml, unit conversions, caveats), and structural context (tree paths with ^ separators). The only minor gap is lack of error handling or return value description, but the absence of an output schema makes this acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is only 5%, but the description compensates nearly fully. It explains the meaning and constraints of many parameters: withImage default true, cycleTimeUs conversion (us to 100ns ticks), priority range 0-255, affinity as TwinCAT hex token or named CPU masks, and the xml escape hatch being mutually exclusive with typed fields. This adds substantial value beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages RT tasks under TIRT, RT-core settings under TIRS, and linked tasks under TIPC. It lists specific actions and distinguishes itself from siblings by referencing specific subsystems (TIRT, TIRS, TIPC) and noting it is config-only with no confirm token needed, which is unique among sibling tools like tc_system or tc_tree.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through its detailed action list but does not explicitly state when to use this tool versus alternatives (e.g., tc_tree or tc_system). It mentions that runtime needs a later activate/restart and that TISC (safety) is untouched, but no direct comparison or when-not guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_treeA
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).
| Name | Required | Description | Default |
|---|---|---|---|
| xml | No | ||
| file | No | ||
| name | No | ||
| path | No | ||
| save | No | ||
| items | No | ||
| paths | No | ||
| action | Yes | ||
| before | No | insert before this sibling | |
| dryRun | No | ||
| confirm | No | ||
| creates | No | ||
| deletes | No | ||
| newName | No | ||
| renames | No | ||
| subType | No | ||
| summary | No | ||
| reconnect | No | ||
| returnXml | No | ||
| createInfo | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations were provided, so the description carries the full burden. It fully discloses critical behavioral traits: the guard on delete (dryRun:true and confirm=
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is comprehensive but somewhat dense and could be more efficiently structured. It front-loads the path separator convention and batch-first principle, which is good. However, after that the actions are presented in a long running sentence that mixes group headers with individual actions. Breaking the actions into a bulleted list or clearer paragraph structure would improve readability. As is, it earns its sentences but is slightly harder to parse than necessary for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's high complexity (20 parameters, 17 actions, no nested objects, no output schema, no annotations), the description is remarkably complete. It covers all actions, explains each batch form, warns about pitfalls (ghost entries for create without createInfo), and directs to the right sibling tool where appropriate. For a tool of this scope, the description leaves very few gaps—agents can reliably select the right action and understand the expected behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 5%, so the description must compensate. It adds significant meaning beyond the raw schema by explaining the purpose of key parameters: it describes the ^ path separator format (TIPC^MyPlc), the batch structures for each action (paths:[...], items:[{path,xml}], creates:[{parent,name,subType,before?,createInfo?}], etc.), what summary means for get_xml (compact identity + slot-module list), and what returnXml does for set_xml. However, not every parameter is covered in detail—some like 'reconnect' or 'subType' for single actions are not explained, preventing a perfect score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages TwinCAT System Manager tree items, with a specific verb+resource structure. It lists all 17 actions (READ, WRITE, RENAME, CREATE, DELETE, etc.) and distinguishes the tool from siblings like tc_ethercat by explicitly stating that adding EtherCAT terminals should use the dedicated tool. The description provides a comprehensive overview that fully differentiates this tool from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use and when-not-to-use guidance: it recommends using the *_batch actions for more than one item, and for adding EtherCAT terminals/boxes it directs users to the 'dedicated tc_ethercat tool'. It also explains the batch roll-up behavior and the dryRun/confirm guardrails for delete operations. This makes it very clear when to choose which form of the tool and when to use an alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tc_variantA
Project VARIANT management on the open solution (needs TCatSysManagerLib >= 3.3.0.0; older installs get_* return empty and set_*/disable surface a clear COM error). OFFLINE CONFIG ONLY — no confirm token needed; runtime needs a later activate/download; per-item disable/enable refuses TISC (safety) paths. Optional save:true does File.SaveAll once after a write. Actions: get_config (read-only) — returns the raw XML (round-trip this FIRST to capture the live shape before editing). get_current (read-only) — active variant name; empty string => no variant active / not configured. set_config (xml, save?) — replaces the WHOLE variant definition: a document with ..VariantName.. and/or standalone .. children (raw XML verbatim, schema not validated). select (variant, save?) — sets the active variant by name (e.g. "Variant3") or a group in bracket form (e.g. "[Group1]"); must already exist in the config. disable / enable (path, save?) — sets disabled state on a tree item FOR THE ACTIVE VARIANT; path uses ^ separators (e.g. TIID^Device 2 (EtherCAT)^Box 1, TIPC^MyPlc) and MUST NOT be under TISC. The readback disabled int may report SMDS_PARENT_DISABLED=2 (read-only state: disabled because an ancestor is) — never written, only echoed.
| Name | Required | Description | Default |
|---|---|---|---|
| xml | No | ||
| path | No | ||
| save | No | ||
| action | Yes | ||
| variant | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully carries the burden of behavioral disclosure. It reveals that set_config replaces the whole variant definition, save:true triggers File.SaveAll, disable/enable affects the active variant, and that the readback disabled int may report SMDS_PARENT_DISABLED=2 (a read-only state never written). This is comprehensive behavioral context beyond what annotations would typically cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose and prerequisites. It uses clear section breaks for actions. A slight deduction because the first sentence is dense and could be split: 'Project VARIANT management on the open solution (needs TCatSysManagerLib >= 3.3.0.0; older installs get_* return empty and set_*/disable surface a clear COM error).' This packs version, error behavior, and scope into one sentence, but remains readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high complexity (5 parameters, 6 actions, no output schema, no annotations), the description covers prerequisites, offline-only nature, action semantics, parameter formats, error conditions, and readback quirks. It does not need to explain return values since there is no output schema, and it provides enough detail for an agent to invoke any action correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% (only parameter names and types are in the schema, no descriptions). The description compensates fully by detailing each parameter: xml expects a raw <ProjectVariants> XML document with specific child elements, path uses ^ separators and must avoid TISC, variant can be a name or bracket-group, save is optional, and action is an enum explained per sub-action. This adds critical meaning to every parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool manages project variants on a Beckhoff TwinCAT open solution. It lists six specific actions (get_config, get_current, set_config, select, disable, enable) and details each action's verb, resource, and behavior, distinguishing this tool from siblings like xae_build or tc_system.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says this is for OFFLINE CONFIG ONLY, warns that older installs return empty/errors, and clarifies when a confirm token is not needed but runtime activation is required later. It also notes that per-item disable/enable refuses safety (TISC) paths, providing clear when-to and when-not-to guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
twincat_activate_configurationB
Activate the TwinCAT configuration on the target. Guarded: confirm="ALLOW_TWINCAT_ACTIVATE".
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavioral traits. The description only mentions that confirmation is required but does not reveal side effects (e.g., whether activation restarts the runtime, disrupts existing tasks, or requires specific permissions). Activating a configuration is typically a disruptive operation, and the lack of such disclosure makes the description inadequate for safe tool selection.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise at two sentences with no wasted words. It front-loads the purpose ('Activate the TwinCAT configuration on the target') and immediately follows with the essential guard condition. Every sentence earns its place, and no redundant information is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that this tool has a single parameter, no output schema, and no annotations, the description is insufficient for a complete understanding. It does not explain what happens after activation (e.g., return values, errors, or confirmation messages), nor does it clarify whether activation is reversible or requires a restart. For a potentially disruptive operation, more context is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the schema provides no descriptive text for the single parameter 'confirm'. However, the tool description explicitly explains that the parameter value must be 'ALLOW_TWINCAT_ACTIVATE', adding significant semantic meaning beyond the raw schema (which only defines type 'string'). This compensates for the schema's lack of documentation, earning a baseline 3. It does not reach 4 because the description does not explain what happens if the wrong string is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Activate'), the resource ('TwinCAT configuration'), and the target ('on the target'), making the purpose unambiguous. It also mentions a guard mechanism ('confirm=ALLOW_TWINCAT_ACTIVATE'), which adds important context. However, it does not explicitly distinguish this tool from siblings like 'twincat_restart_runtime' or 'plc_download', leaving some ambiguity for agents deciding between activation and related operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidelines by stating that the tool is 'Guarded' and requires a specific confirmation string ('ALLOW_TWINCAT_ACTIVATE') as the parameter. This tells the agent when and how to use it (only with proper confirmation). However, it does not mention when not to use this tool (e.g., preferring 'plc_download' for code changes) or provide alternatives among the 25 sibling tools, so it falls short of excellence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
twincat_restart_runtimeA
Start/restart the TwinCAT runtime on the target. Guarded: confirm="ALLOW_TWINCAT_RESTART".
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full transparency burden. It reveals the guarded nature ('confirm=ALLOW_TWINCAT_RESTART'), indicating a safety-conscious operation. However, it does not disclose side effects like stopping PLC programs, network interruptions, or state changes to the runtime system, leaving gaps in understanding the full impact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise—two sentences covering purpose and guard condition. No redundant information; every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple restart tool, the description covers purpose and guard but lacks details about prerequisites (e.g., runtime must be active), post-restart behavior, or return values. Since there is no output schema, the description could usefully indicate that the tool returns success/failure or triggers a reboot, but it does not. Still, the core functionality is adequately conveyed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema only defines 'confirm' as a string with no description. The description adds critical meaning by specifying the exact required value 'ALLOW_TWINCAT_RESTART', which is essential for correct invocation. This compensates for the 0% schema description coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'start/restart' and the resource 'TwinCAT runtime on the target', making the tool's purpose unambiguous. It also implicitly distinguishes from sibling tools like 'xae_build' or 'plc_download' which handle different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs. alternatives like 'twincat_activate_configuration' or 'tc_system'. The description does not mention prerequisites, context of use, or scenarios where this tool is appropriate versus other runtime management tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
xaeB
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).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | DTE attach mode; default active (open_solution: activeOrCreate) | |
| limit | No | ||
| action | Yes | ||
| button | No | ||
| filter | No | ||
| remember | No | ||
| solutionPath | No | ||
| closeExisting | No | ||
| discardChanges | No | ||
| severityFilter | No | error_list: filter by severity before the cap (errorLevel values are vsBuildErrorLevelHigh=error / Medium=warning / Low=message); default all |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses important behavior: open_solution's closeExisting/discardChanges semantics, error_list's default limit and filter-before-cap behavior, dialog_probe being read-only, and dialog_resolve's auto-remember refusal for destructive prompts. However, it remains silent on side effects for actions like save_all, clear_error_list, and list_commands.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense paragraph that packs a lot of vital behavioral detail, but the lack of structure (e.g., bulleted actions) makes it hard to scan. Every clause earns its place, yet formatting could dramatically improve readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, multi-action tool with no output schema, the description thoroughly documents open_solution, error_list, dialog_probe, and dialog_resolve, but omits expected return values or side effects for status, save_all, active_document, selected_items, clear_error_list, and list_commands. This leaves significant gaps for the agent to infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers only 20% of parameters with descriptions; the text compensates by explaining solutionPath, closeExisting, discardChanges, limit, severityFilter, filter, button, and remember within the context of their actions. This embedded documentation adds practical meaning (e.g., severityFilter 'errors'|'warnings' with true total count) beyond the bare schema enum.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as an 'XAE shell' command dispatcher, enumerating the distinct operations it supports (status, open_solution, error_list, dialog_probe, etc.). It differentiates from sibling tools by listing these shell-specific actions, though it lacks a single declarative sentence stating the tool's core purpose (e.g., 'Execute XAE shell commands').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides use-case context for individual sub-actions (e.g., dialog_probe checks for a blocking modal, dialog_resolve clicks the chosen button), but it does not explain when to use this tool over specialized siblings like xae_build, tc_system, or plc_download. There is no explicit guidance on when not to use it or which alternative to pick for a given scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
xae_buildC
Clean/Build/Rebuild the active solution configuration; waits for completion by default.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| timeoutMs | No | ||
| waitForFinish | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must disclose behavioral traits. It only mentions that the tool waits for completion by default. It does not explain what happens on build failure, whether the tool is destructive, what output is returned, or any side effects like project file modification. Critical information is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, which is concise but lacks structure. It front-loads the main action but omits any secondary details. While not verbose, it is too terse to be considered well-structured for a tool with three parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has three parameters, no output schema, and no annotations, the description is incomplete. It does not explain the build process, error handling, or how this tool fits into the broader TwinCAT ecosystem. The sibling tools suggest a rich context, but the description fails to leverage or clarify it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description should compensate. It only hints at the waitForFinish parameter (default wait). The action enum values are self-explanatory, but the timeoutMs parameter is entirely unexplained. The description adds minimal meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool performs clean/build/rebuild actions on the active solution configuration, which is a specific verb-resource combination. However, it does not explicitly differentiate from sibling tools like xae or xae_command, and the phrase 'active solution configuration' may assume domain knowledge.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not specify prerequisites, when to choose clean vs build vs rebuild, or any conditions that would make this tool inappropriate. This is a significant gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
xae_commandB
Execute a raw XAE/DTE command by name (e.g. View.SolutionExplorer). Guarded: confirm="ALLOW_XAE_COMMAND_EXEC".
| Name | Required | Description | Default |
|---|---|---|---|
| args | No | ||
| confirm | Yes | ||
| commandName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the full burden falls on the description. It discloses one behavioral aspect: the guarded execution requiring a specific confirmation string. This hints at potential destructive or sensitive operations. However, it does not mention whether the command modifies state, has side effects, or what errors may occur. Partial disclosure but insufficient for full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very concise: two sentences with no filler. It front-loads the action and quickly gives context (guard). However, it could be slightly restructured for readability, e.g., separating the guard condition more clearly. Overall, it is appropriately sized for a short description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has 3 parameters, 0% schema coverage, and no output schema, the description is minimally complete: it covers the main action and a critical constraint (guard). However, it omits details about parameter syntax (e.g., format of args), return behavior, and error cases, which are important for safe invocation. The complexity is moderate but the coverage gap means more description is needed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, meaning the schema provides no descriptions for the three parameters. The description only mentions "commandName" implicitly via the example "View.SolutionExplorer" and the guard "confirm" as the required string. No semantics for "args" parameter are given. Since the description must compensate for the lack of schema documentation but only partially does, the score is low.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: "Execute a raw XAE/DTE command by name", giving a specific verb (Execute) and resource (XAE/DTE command). It also provides a concrete example (View.SolutionExplorer), which helps distinguish it from sibling tools like tc_system or plc_download. However, it slightly lacks a fuller scope statement (e.g., what commands are valid or what environment it targets).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description mentions a guard condition ("confirm=\"ALLOW_XAE_COMMAND_EXEC\""), which is a critical prerequisite for use. However, it does not explain when to use this tool versus alternatives (e.g., when to use tc_system instead) or what types of commands are appropriate. No explicit when-not-to-use guidance is provided, leaving ambiguity for an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
25 tool updates
v2.4.0- Changed
nc1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
plc_download1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
plc_library1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
plc_pou1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
plc_project1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
plc_session1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_cpp1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_ethercat1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_fieldbus1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_license1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_link1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_mapping1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_measurement1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_module1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_route1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_settings1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_system1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_task1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_tree1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
tc_variant1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
twincat_activate_configuration1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
twincat_restart_runtime1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
xae1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
xae_build1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
xae_command1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
4 tool updates
v2.3.0- Changed
plc_library1 field changed- added
Input schema / properties / filterAdded value: +{ + "description": "scan: case-insensitive substring on library name; omit for the full installed list", + "type": "string" +}
- Changed
plc_pou3 fields changed- added
Input schema / properties / detailsAdded value: +{ + "description": "set_decl_batch/set_impl_batch: include ok:true rows; default failures-only ({count,succeeded,failed} always reported). create_batch/create_folder_batch always keep success rows (they carry child identity), so details is a no-op there.", + "type": "boolean" +} - added
Input schema / properties / maxResults / defaultAdded value: +50 - changed
Input schema / properties / maxResults / descriptionPrevious value: -"search: cap on returned match rows (default 500, max 5000); stops the walk and sets truncated when hit"New value: +"search: cap on returned match rows (default 50, max 5000; raise for exhaustive scans); stops the walk and sets truncated:true when hit"
- Changed
tc_link2 fields changed- added
Input schema / properties / detailsAdded value: +{ + "description": "link_batch/unlink_batch: include ok:true rows (with resolved paths); default failures-only", + "type": "boolean" +} - added
Input schema / properties / verboseAdded value: +{ + "description": "link/resolve: return the full resolution detail (producerResolution/consumerResolution or attempts[]); default compact", + "type": "boolean" +}
- Changed
xae1 field changed- added
Input schema / properties / severityFilterAdded value: +{ + "description": "error_list: filter by severity before the cap (errorLevel values are vsBuildErrorLevelHigh=error / Medium=warning / Low=message); default all", + "enum": [ + "all", + "errors", + "warnings" + ], + "type": "string" +}
1 tool update
v2.2.0- Changed
xae3 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "status", - "open_solution", - "save_all", - "active_document", - "selected_items", - "error_list", - "clear_error_list", - "list_commands" -]New value: +[ + "status", + "open_solution", + "save_all", + "active_document", + "selected_items", + "error_list", + "clear_error_list", + "list_commands", + "dialog_probe", + "dialog_resolve" +] - added
Input schema / properties / buttonAdded value: +{ + "type": "string" +} - added
Input schema / properties / rememberAdded value: +{ + "type": "boolean" +}
19 tool updates
v2.1.1- Changed
plc_download2 fields changed- added
Input schema / properties / autoLogoutAdded value: +{ + "default": true, + "type": "boolean" +} - added
Input schema / properties / confirmAdded value: +{ + "type": "string" +}
- Added
plc_library - Added
plc_pou - Added
plc_project - Added
plc_session - Added
tc_cpp - Added
tc_ethercat - Added
tc_fieldbus - Added
tc_license - Changed
tc_link3 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "link", - "unlink", - "resolve" -]New value: +[ + "link", + "unlink", + "resolve", + "link_batch", + "unlink_batch", + "links" +] - added
Input schema / properties / linksAdded value: +{ + "items": { + "properties": { + "a": { + "type": "string" + }, + "b": { + "type": "string" + } + }, + "required": [ + "a" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / saveAdded value: +{ + "type": "boolean" +}
- Added
tc_mapping - Added
tc_measurement - Added
tc_module - Added
tc_route - Added
tc_settings - Added
tc_task - Changed
tc_tree12 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "get", - "children", - "exists", - "get_xml", - "set_xml", - "create", - "delete", - "import", - "export", - "focus" -]New value: +[ + "get", + "children", + "exists", + "exists_batch", + "get_batch", + "get_xml", + "set_xml", + "set_xml_batch", + "rename", + "rename_batch", + "create", + "create_batch", + "delete", + "delete_batch", + "import", + "export", + "focus" +] - added
Input schema / properties / confirmAdded value: +{ + "type": "string" +} - added
Input schema / properties / createsAdded value: +{ + "items": { + "properties": { + "before": { + "type": "string" + }, + "createInfo": { + "type": "string" + }, + "name": { + "type": "string" + }, + "parent": { + "type": "string" + }, + "subType": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "parent", + "name", + "subType" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / deletesAdded value: +{ + "items": { + "properties": { + "name": { + "type": "string" + }, + "parent": { + "type": "string" + } + }, + "required": [ + "parent", + "name" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / dryRunAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / itemsAdded value: +{ + "items": { + "properties": { + "path": { + "type": "string" + }, + "xml": { + "type": "string" + } + }, + "required": [ + "path", + "xml" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / pathsAdded value: +{ + "items": { + "type": "string" + }, + "type": "array" +} - added
Input schema / properties / renamesAdded value: +{ + "items": { + "properties": { + "name": { + "type": "string" + }, + "newName": { + "type": "string" + }, + "path": { + "type": "string" + } + }, + "required": [ + "newName" + ], + "type": "object" + }, + "type": "array" +} - added
Input schema / properties / returnXmlAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / saveAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / summaryAdded value: +{ + "type": "boolean" +} - changed
Input schema / requiredPrevious value: -[ - "action", - "path" -]New value: +[ + "action" +]
- Added
tc_variant - Changed
xae1 field changed- added
Input schema / properties / discardChangesAdded value: +{ + "type": "boolean" +}
10 tool updates
v1.0.0- First observed
nc - First observed
plc_download - First observed
tc_link - First observed
tc_system - First observed
tc_tree - First observed
twincat_activate_configuration - First observed
twincat_restart_runtime - First observed
xae - First observed
xae_build - First observed
xae_command
TDQS
Most tools serve distinct purposes (build, system, PLC code, project lifecycle, fieldbus, etc.). Minor overlap exists between tc_tree and tc_system, and between plc_pou and plc_project, but descriptions clearly differentiate them. Overall, an agent can reliably select the correct tool.
Names follow a consistent prefix_domain_verb_noun pattern (e.g., tc_ethercat, plc_download, xae_build). A few exceptions like 'twincat_activate_configuration' or 'nc' break the pattern slightly, but the convention is clear and predictable across the majority.
25 tools is on the high side but appropriate for the broad TwinCAT automation domain. Each tool covers a distinct subsystem (PLC, I/O, motion, tasks, licensing, etc.) and none feel redundant. The count is justified by the scope.
The tool set covers core TwinCAT engineering workflows: building, downloading, PLC code editing, hardware configuration, linking, mapping, license management, and variants. Safety aspects are intentionally excluded, and niche features like Analytics are partially implemented. Overall, the surface is comprehensive with only minor gaps.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Twinfield AI Connect: hosted MCP server for Twinfield.
An MCP server that provides access to Testiny projects, test cases and test runs
MCP server for generating rough-draft project plans from natural-language prompts.
Related MCP Servers
- AlicenseNot gradedqualityFmaintenanceA Model Context Protocol server that enables seamless interaction between MCP clients (like Claude Desktop) and CODESYS V3 programming environments, allowing automation of project management, POU creation, code editing, and compilation tasks.89120MIT
- AlicenseBqualityDmaintenanceAn MCP server for validating, auto-fixing, and scaffolding TwinCAT 3 XML files using deterministic code quality tools and IEC 61131-3 OOP checks. It enables AI assistants to perform structural validation, apply safe fixes, and generate canonical code skeletons for industrial automation projects.1636MIT
- FlicenseNot gradedqualityAmaintenanceMCP server that connects AI assistants to Siemens TIA Portal via the Openness API. AI-assisted PLC programming, project management, hardware configuration, cross-reference analysis, and deployment. 16 tools, 166 actions.33-
- AlicenseBqualityBmaintenanceMCP server that enables AI agents to read, edit, and create PLC projects in EcoStruxure Control Expert via COM automation.52MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/TwinCAT-XAE-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server