Skip to main content
Glama
Edge-JB
by Edge-JB

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.

CI MCP Node TwinCAT License: MIT

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.

IMPORTANT

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 *_batch form 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 buildertc_ethercat creates 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 editsplc_pou reads, 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 search runs roughly 500× faster than the old per-call spawn model.

  • Speaks both MCP protocol eras — the stateless 2026-07-28 revision (envelope-carrying server/discover probe, per-request _meta envelopes, resultType

    • cache-hint stamping) and the legacy initialize handshake (≤ 2025-11-25), on one stdio endpoint. The opening message pins the era per connection (MCP SDK v2 serveStdio); a claim-less opening — including a bare server/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.js

Two cooperating processes:

  • Node MCP front (index.js) — serves MCP/JSON-RPC over stdio through the SDK v2 serveStdio entry (both the stateless 2026-07-28 era and the legacy initialize handshake), validates input with zod, single-sources every tool's input schema from toolSchemas.js, enforces the confirmation-token guards, and maps each tool action onto 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 + ITcSysManager once 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-search speed-up.

  • Edit watcher (EditWatcher.cs) — an on-demand DTE.Documents/.Saved dirty check plus a FileSystemWatcher over 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 TCatSysManagerLib.dll (ships with TwinCAT)

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 install

Verify 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 targets net472; the produced x64 exe also runs on the net48 runtime.

  • References TCatSysManagerLib.dll (embedded interop) for the handful of vtable-only IUnknown interfaces that late-bound dynamic can't reach (ITcPlcProject, etc.). build.ps1 probes the known TwinCAT install paths; if yours differs, edit the <HintPath> in daemon/Te1000Daemon.csproj and rebuild. Pass -Debug for 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
NOTE

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

TE1000_PROGID

TcXaeShell.DTE.17.0

XAE Shell COM ProgID to attach to (passed through to the daemon as progId).

TE1000_DAEMON_PIPE

te1000-mcp

Named-pipe name. The front and the daemon it spawns share this, so a custom value applies to both.

TE1000_DAEMON_CONNECT_MS

20000

How long the client waits to connect to (and, if needed, spawn) the daemon before failing the request.

TE1000_DAEMON_REQUEST_MS

1900000

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. 0 disables it.

TE1000_DIALOG_WATCH

on

0 disables the daemon's internal modal-dialog watchdog.

TE1000_DIALOG_AUTODISMISS

on

0 = detect + report dialogs only, never auto-click an allowlisted one.

TE1000_DIALOG_GRACE_MS

4000

How long a blocking dialog must persist before the daemon recycles its COM worker.

Read by the daemon:

Variable

Default

Purpose

TE1000_MCP_SOLUTION_PATH

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).

TE1000_DAEMON_DEBUG

unset

1 enables a diagnostic log at %TEMP%\te1000-daemon-<pipe>.log.

TE1000_DAEMON_LOG

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, and TE1000_DIALOG_GRACE_MS are read by the Node front only when it spawns the daemon, and are translated into the daemon's --no-watch / --no-autodismiss / --grace-ms flags. 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

XAE shell & solution control

status, open_solution, save_all, active_document, selected_items, error_list, clear_error_list, list_commands

xae_build

Compile the active configuration

clean, build, rebuild

xae_command

Run a raw DTE command 🔒

any command name (guarded)

System Manager tree, IO & linking

Tool

Purpose

Key actions

tc_tree

Read/write any tree item (identity, XML params, rename, create, delete)

get, children, exists, get_xml, set_xml, rename, create, delete, import, export, focus — each with a *_batch form

tc_ethercat

Build fully-populated EtherCAT boxes from their ESI

racks: [{ parent, modules: [{ type, name?, revision? }] }]

tc_link

Link/unlink variables; verify existing links

link, unlink, resolve, links, link_batch, unlink_batch

tc_system

Target & rescan helpers

get_netid, set_netid, errors, rescan_plc, scan_io_boxes

tc_mapping

Bulk variable mapping

produce, consume, clear

nc

NC motion tree

tasks, axes, axis

PLC project & code

Tool

Purpose

Key actions

plc_project

PLC project lifecycle

create_from_template, open, info, set_boot_flags, generate_boot_project 🔒, online 🔒, plcopen_export, plcopen_import, save_as_library

plc_pou

Author + surgically edit POUs/DUTs/GVLs (offline)

author (create, import_template), read (get_decl, get_impl, outline, get_graphical), surgical (replace, replace_lines, insert, append), discover (tree, find, search), lifecycle (rename, move, delete 🔒)

plc_library

Library refs / placeholders / repos

list, scan, add_library, add_placeholder, set_resolution, freeze, remove_reference, install_library 🔒, …

plc_download

Deploy the active PLC project 🔒

boot-project (default) or legacy command route

plc_session

Online-session control via UI Automation

status, logout 🔒

Realtime, fieldbus & platform

Tool

Purpose

Key actions

tc_task

RT tasks / cores / linked tasks

list, get, create, set_params, add_image_var, get/set_rt_settings, bind_cpu, get/set_linked_task

tc_route

ADS routes

list, broadcast_search, search_host, add_route 🔒, add_project_route 🔒

tc_settings

Engineering settings & archives

get/set_silent_mode, get/set_target_platform, save_solution_archive, save_plc_archive, get/set_independent_file, get/set_disabled

tc_fieldbus

Non-EtherCAT fieldbuses (PROFINET/PROFIBUS/CANopen/DeviceNet/EAP)

create_device, create_gsd_box, add_netvar, set_station_address, import_dbc, get/set_xml

tc_module

TcCOM module objects

list, create, get/set_xml, enable_symbols, set_context 🔒

tc_cpp

TwinCAT C++ projects/modules

create_project, create_module, tmc_codegen, set_props, build, publish 🔒

tc_measurement

Scope + Analytics (TIAN)

scope_create, scope_record 🔒, analytics_create, logger_create, stream_create, …

tc_license

TwinCAT licensing

list, add, activate_response 🔒

tc_variant

Project variant management

get_config, get_current, set_config, select, enable, disable

Runtime (guarded)

Tool

Purpose

twincat_activate_configuration 🔒

Activate the configuration on the target

twincat_restart_runtime 🔒

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

ALLOW_TWINCAT_ACTIVATE

twincat_activate_configuration

ALLOW_TWINCAT_RESTART

twincat_restart_runtime

ALLOW_PLC_DOWNLOAD

plc_download, plc_project boot/online

ALLOW_XAE_COMMAND_EXEC

xae_command

ALLOW_PLC_LOGOUT

plc_session logout

ALLOW_TWINCAT_DELETE

node/object deletes (or use dryRun: true to preview)

ALLOW_PLC_LIBRARY_REPO

machine-wide library repository administration

ALLOW_TWINCAT_ROUTE_WRITE

ADS route writes

ALLOW_TWINCAT_MODULE_CONTEXT

TcCOM context changes

ALLOW_CPP_PUBLISH

C++ driver publish

ALLOW_MEASUREMENT_RECORD

live scope acquisition

ALLOW_LICENSE_ACTIVATE

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 in dialog-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 past TE1000_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; with remember:true it appends an auto-dismiss rule to dialog-allowlist.json and 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 (rememberRefused is reported). Use xae 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_download auto-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> in daemon/Te1000Daemon.csproj to 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=1 to capture %TEMP%\te1000-daemon-<pipe>.log.

  • Wrong XAE instance picked (several open) — set TE1000_MCP_SOLUTION_PATH to 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 via set_xml, authoring a POU, and a safe build → activate → download flow.

Documentation

Document

What's in it

docs/architecture.md

The Node-front + persistent C#/.NET daemon design end to end — pipe protocol, COM session, caching, edit-watching

docs/tools.md

Complete tool & action reference — signatures, batch semantics, return shapes

docs/operations.md

Dialog watchdog, PLC session control, and the safety/guard model in depth

docs/automation-interface.md

Survey of the full TE1000 Automation Interface surface (the menu these tools are carved from)

docs/csharp-daemon-coverage.md

The 164-action port coverage checklist (bridge action → C# handler)

docs/csharp-daemon-validation.md

Build, cut-over, and live-XAE smoke-test guide for the daemon

docs/notes.md

Running engineering notes / backlog discovered on real projects

CHANGELOG.md

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# change

License

MIT © Edge Automation.

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 tools
ncC

NC motion tree: tasks (list under TINC), axes (path = task, default first task), axis (path = full axis path, returns info + children).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo
actionYes

TDQS

C2.8/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
methodNobootproject
confirmNo
treePathNoPLC root node, default first project under TIPC
autostartNo
autoLogoutNo
commandNameNo

TDQS

B3/5.0
Behavior3/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
libNo
distNo
modeNoDTE attach mode; default active
nameNo
repoNo
saveNo
indexNo
actionYes
defLibNo
defVerNo
filterNoscan: case-insensitive substring on library name; omit for the full installed list
folderNo
companyNo
confirmNo
defDistNo
libPathNo
versionNo
overwriteNo
placeholderNo
referencesPathNoReferences node path; default = first PLC under TIPC

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
atNoinsert before this 1-based line (lineCount+1 appends)
endNoreplace_lines: 1-based inclusive last line
findNoreplace: exact literal substring (NOT regex)
grepNoget_decl/get_impl: regex over lines + context each side (default 2); mutually exclusive with range
nameNo
pathNo
saveNo
textNoreplacement / insert / append text
afterNoinsert after this 1-based line
blockNoinsert_in_var_block: VAR-block keyword e.g. VAR_INPUT
depthNotree: max recursion depth (1 = direct children only); default unlimited
itemsNo
pathsNo
rangeNoget_decl/get_impl: 1-based inclusive line slice; mutually exclusive with grep
startNoreplace_lines: 1-based inclusive first line
actionYes
beforeNocreate: sibling name to insert before (string). insert: 1-based line to insert before (int, alias of at)
dryRunNodelete: preview the target without deleting
parentNo
targetNosurgical edit target; default decl (append defaults impl)
confirmNodelete: must equal ALLOW_TWINCAT_DELETE to actually delete
createsNo
detailsNoset_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.
extendsNo
implXmlNo
newNameNorename: new bare object name (not a path)
patternNosearch: regex (.NET syntax) or plain substring, matched per-line against each object's decl/impl text
plcPathNo
refreshNosearch: 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.
subTypeNo
declOnlyNosearch: search only DeclarationText; mutually exclusive with implOnly
declTextNo
implOnlyNosearch: search only ImplementationText (ST-only); mutually exclusive with declOnly
implTextNo
languageNo
validateNosurgical writes: run CheckAllObjects after the edit (default off)
newParentNomove: ^-separated destination parent tree path (TISC refused)
ignoreCaseNosearch: case-insensitive match (default false)
implementsNo
maxResultsNosearch: cap on returned match rows (default 50, max 5000; raise for exhaustive scans); stops the walk and sets truncated:true when hit
occurrenceNoinsert_in_var_block: which matching block (1-based, default 1)
returnTypeNo
typeFilterNotree/find: comma list of normalized type labels to keep/match (case-insensitive), e.g. 'FB,Method,Struct'
documentXmlNo
expectCountNoreplace: required occurrence count (default 1)
replaceWithNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileNo
nameNo
saveNo
actionYes
beforeNoinsert before this sibling PLC project
commandNo
confirmNo
installNo
optionsNo
subTypeNo
templateNo
treePathNo
autostartNo
selectionNo
tmcFileCopyNo
folderStructureNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
confirmNo

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fileNo
nameNo
actionYes
beforeNoinsert before this sibling
configNo
confirmNo
subTypeNo
templateNo
timeoutMsNo
projectNameNo
projectPathNo
waitForFinishNo
saveProjectSourcesNo
bootProjectEncryptionNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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?}]}.

ParametersJSON Schema
NameRequiredDescriptionDefault
saveNo
racksYes

TDQS

A4.2/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xmlNo
modeNoDTE attach mode; default active
nameNo
pathNo
saveNo
indexNo
vInfoNo
actionYes
beforeNoinsert before this sibling
parentNo
addressNo
boxPathNo
createsNo
gsdPathNo
subTypeNo
boxFlagsNo
dataTypeNo
fileNameNo
dapNumberNo
returnXmlNo
claimIndexNo
masterPathNo
controllerPathNo
moduleIdentNumberNo
keepUnchangedMessagesNo
importExtendedMessagesNo
importMultiplexedDataMessagesNo
communicateWithSlavesFromDbcFileNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
rawNo
nameNo
pathNoabsolute path to the OEM license response (.tmc/.reresponse) file
actionYes
deviceNodongle display-name (e.g. "Term 2 (EL6070)") or ObjectID string from list
confirmNo
oemGuidNo

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xmlNo
saveNo
actionYes
confirmNo

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xmlNo
modeNoDTE attach mode; default active
nameNo
pathNo
stateNo
actionYes
beforeNoinsert before this sibling under TIAN
dryRunNo
confirmNo
newNameNo
projectNo
summaryNo
templateNo
returnXmlNo
parentPathNo^-path of names from the scope project root to the parent element
destinationNo
elementTypeNoCreateChild elementType; only 0 is verified

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
byNo
idNo
xmlNo
nameNo
pathNo
actionYes
beforeNoinsert before this sibling under TcCOM Objects
confirmNo
contextIdNo
dataAreasNo
returnXmlNo
parametersNo
taskObjectIdNodecimal ObjectId of the target task (XAE shows it in hex)

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
hostNo
nameNo
netIdNo
actionYes
ipAddrNo
confirmNo
hostNameNo
passwordNo
userNameNo
localNameNo
timeoutMsNo
remoteNameNo
remoteNetIdNo
noEncryptionNo
remoteIpAddrNo
remoteHostNameNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
fileNo
nameNo
pathNo
actionYes
enabledNo
disabledNo
platformNo

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNo
netIdNo
actionYes

TDQS

D1.7/5.0
Behavior2/5

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.

Conciseness2/5

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.

Completeness1/5

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.

Parameters2/5

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.

Purpose2/5

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.

Usage Guidelines1/5

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?).

ParametersJSON Schema
NameRequiredDescriptionDefault
xmlNo
cpusNo
nameNo
pathNo
saveNo
actionYes
beforeNoinsert before this sibling task
maxCPUsNo
summaryNo
varNameNo
affinityNo
dataTypeNo
priorityNo
autoStartNo
returnXmlNo
withImageNo
linkedTaskNo
cycleTimeUsNo
startAddressNo

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
xmlNo
fileNo
nameNo
pathNo
saveNo
itemsNo
pathsNo
actionYes
beforeNoinsert before this sibling
dryRunNo
confirmNo
createsNo
deletesNo
newNameNo
renamesNo
subTypeNo
summaryNo
reconnectNo
returnXmlNo
createInfoNo

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xmlNo
pathNo
saveNo
actionYes
variantNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYes

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYes

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoDTE attach mode; default active (open_solution: activeOrCreate)
limitNo
actionYes
buttonNo
filterNo
rememberNo
solutionPathNo
closeExistingNo
discardChangesNo
severityFilterNoerror_list: filter by severity before the cap (errorLevel values are vsBuildErrorLevelHigh=error / Medium=warning / Low=message); default all

TDQS

B3.4/5.0
Behavior4/5

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.

Conciseness3/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes
timeoutMsNo
waitForFinishNo

TDQS

C2.6/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness2/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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".

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNo
confirmYes
commandNameYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 25 tool updatesv2.4.0
    • Changednc1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedplc_download1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedplc_library1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedplc_pou1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedplc_project1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedplc_session1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_cpp1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_ethercat1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_fieldbus1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_license1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_link1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_mapping1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_measurement1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_module1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_route1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_settings1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_system1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_task1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_tree1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtc_variant1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtwincat_activate_configuration1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedtwincat_restart_runtime1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedxae1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedxae_build1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedxae_command1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 4 tool updatesv2.3.0
    • Changedplc_library1 field changed
      • addedInput schema / properties / filter
        Added value: +{
        +  "description": "scan: case-insensitive substring on library name; omit for the full installed list",
        +  "type": "string"
        +}
    • Changedplc_pou3 fields changed
      • addedInput schema / properties / details
        Added 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"
        +}
      • addedInput schema / properties / maxResults / default
        Added value: +50
      • changedInput schema / properties / maxResults / description
        Previous 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"
    • Changedtc_link2 fields changed
      • addedInput schema / properties / details
        Added value: +{
        +  "description": "link_batch/unlink_batch: include ok:true rows (with resolved paths); default failures-only",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / verbose
        Added value: +{
        +  "description": "link/resolve: return the full resolution detail (producerResolution/consumerResolution or attempts[]); default compact",
        +  "type": "boolean"
        +}
    • Changedxae1 field changed
      • addedInput schema / properties / severityFilter
        Added 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"
        +}
  3. 1 tool updatev2.2.0
    • Changedxae3 fields changed
      • changedInput schema / properties / action / enum
        Previous 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"
        +]
      • addedInput schema / properties / button
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / remember
        Added value: +{
        +  "type": "boolean"
        +}
  4. 19 tool updatesv2.1.1
    • Changedplc_download2 fields changed
      • addedInput schema / properties / autoLogout
        Added value: +{
        +  "default": true,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / confirm
        Added value: +{
        +  "type": "string"
        +}
    • Addedplc_library
    • Addedplc_pou
    • Addedplc_project
    • Addedplc_session
    • Addedtc_cpp
    • Addedtc_ethercat
    • Addedtc_fieldbus
    • Addedtc_license
    • Changedtc_link3 fields changed
      • changedInput schema / properties / action / enum
        Previous value: -[
        -  "link",
        -  "unlink",
        -  "resolve"
        -]New value: +[
        +  "link",
        +  "unlink",
        +  "resolve",
        +  "link_batch",
        +  "unlink_batch",
        +  "links"
        +]
      • addedInput schema / properties / links
        Added value: +{
        +  "items": {
        +    "properties": {
        +      "a": {
        +        "type": "string"
        +      },
        +      "b": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "a"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / save
        Added value: +{
        +  "type": "boolean"
        +}
    • Addedtc_mapping
    • Addedtc_measurement
    • Addedtc_module
    • Addedtc_route
    • Addedtc_settings
    • Addedtc_task
    • Changedtc_tree12 fields changed
      • changedInput schema / properties / action / enum
        Previous 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"
        +]
      • addedInput schema / properties / confirm
        Added value: +{
        +  "type": "string"
        +}
      • addedInput schema / properties / creates
        Added 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"
        +}
      • addedInput schema / properties / deletes
        Added value: +{
        +  "items": {
        +    "properties": {
        +      "name": {
        +        "type": "string"
        +      },
        +      "parent": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "parent",
        +      "name"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / dryRun
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / items
        Added value: +{
        +  "items": {
        +    "properties": {
        +      "path": {
        +        "type": "string"
        +      },
        +      "xml": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "path",
        +      "xml"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / paths
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / renames
        Added value: +{
        +  "items": {
        +    "properties": {
        +      "name": {
        +        "type": "string"
        +      },
        +      "newName": {
        +        "type": "string"
        +      },
        +      "path": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "newName"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / returnXml
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / save
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / summary
        Added value: +{
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "action",
        -  "path"
        -]New value: +[
        +  "action"
        +]
    • Addedtc_variant
    • Changedxae1 field changed
      • addedInput schema / properties / discardChanges
        Added value: +{
        +  "type": "boolean"
        +}
  5. 10 tool updatesv1.0.0
    • First observednc
    • First observedplc_download
    • First observedtc_link
    • First observedtc_system
    • First observedtc_tree
    • First observedtwincat_activate_configuration
    • First observedtwincat_restart_runtime
    • First observedxae
    • First observedxae_build
    • First observedxae_command

TDQS

B3.4/5.0
Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    An 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.
    16
    36
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    MCP 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
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Edge-JB/TwinCAT-XAE-MCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server