Skip to main content
Glama
KphungFROMM

motionworks-iec-mcp-server

by KphungFROMM

motionworks-iec-mcp-server

MCP server for Yaskawa MotionWorks IEC 3 — parse project exports and give AI agents structured access to POUs, variables, data types, tasks, I/O and motion configuration.

License: MIT Python 3.10+ MCP

MotionWorks IEC has no AI tooling. Every other IEC 61131-3 environment has at least an export story an agent can read; MotionWorks stores its code in a proprietary compound binary (src.st1) and leaves you to read it in the IDE. This server closes that gap by parsing the formats MotionWorks does export — and, because no export defines the firmware motion library, by extracting that library's own reference documentation from the MotionWorks installation.

What This Does

Connects AI agents (Claude, GPT, local LLMs) to a MotionWorks IEC project via the MCP Protocol. It reads three export forms and merges them:

Source

What it is

Best for

PLCopen XML export (<Project>.xml)

Standard IEC 61131-10 / TC6 export

Everything — all POUs, all languages, tasks, enumerated types

Extended IEC 61131-2 export (<Project>/)

Plain-text projection, one file per POU

Structured Text, AT % addresses, task names, I/O configuration

Native project (<Project>.mwt + folders)

What the IDE itself works with

The authoritative POU/task/dependency map, and .DIT function-block interfaces

Firmware library reference

The vendor's own help, installed with MotionWorks

What the motion blocks are — see below

Plus the reference documentation for the firmware library, which is the difference between code that compiles and code that only looks plausible.

The three exports are complementary, not redundant, and each is incomplete in a different way. Rather than pretend otherwise, the server merges them and reports every disagreement via get_sources, so you can see when an export is stale or partial. Concretely, in the sample projects shipped with this repo:

  • TopCutter.xml omits TopCutterCutControl, TopCutterCamSetup and TopCutterFFCamSetup, which the Extended export has.

  • StraightCut appears only in the XML.

  • TopCutter.xml ships an empty <ST> body for StraightCut, CamGen and Initialize; the Extended export has their real source.

  • The native project declares 10 programs and 5 function blocks the exports do not all mention.

  • For MC_Direction the export lists five values and the vendor help documents four — Both is accepted by the firmware but undocumented in that help version.

The firmware library reference

No MotionWorks export defines MC_Power. The XML references it by name and never says what it takes. So the agent cannot know that it has ten parameters, which three of them do nothing on this firmware, or what BufferMode accepts.

The reference exists on disk. MotionWorks installs each library's documentation as compiled help, and Windows can decompile it:

C:\ProgramData\Yaskawa\MotionWorks IEC 3 Pro\<version>\plc\FW_LIB\<lib>\*.chm
hh.exe -decompile <dir> <chm>          # driven via PowerShell Start-Process

The server does this lazily, once, into a local cache, and parses the pages into a structured catalog. Against the installed 3.7.5.1 reference that is 110 function blocks, 41 data types and 45 enumerated values — parameter names, scopes, data types, defaults, per-parameter descriptions, unimplemented-pin flags, block purpose, notes, related blocks and usage examples.

Nothing of Yaskawa's is copied into this repository: the extraction goes to %LOCALAPPDATA%\motionworks-iec-mcp\fwlib\ and the vendor content stays where Yaskawa installed it. Cold extraction plus parse takes about 1.4 s; afterwards it is ~10 ms from a cached catalog.

Smart Chunking

A ladder or FBD body in the XML export is thousands of lines of coordinate geometry. This server collapses each network to one line naming every block, instance and formal parameter — the equivalent of NeutralText for Studio 5000:

MC_Power(MC_TopCutter_ServoOn) Enable=EIP_FromCLX_Axis_SVON_Cmd Axis=TopCutter
MC_Reset(MC_TopCutter_Reset) Execute=EIP_FromCLX_Axis_FaultReset Axis=TopCutter
MC_ReadStatus(MC_TopCutter_ReadStatus) Enable=Always_True Axis=TopCutter

Structured Text is returned as the original source, tab alignment and inline comments intact.

Related MCP server: Studio5000 AI-Powered PLC Programming Assistant MCP Server

Installation

Install straight from the repository — no clone needed:

python -m venv .venv
.venv/Scripts/python -m pip install "git+https://github.com/KphungFROMM/motionworks-iec-mcp-server.git"

Or clone first, if you intend to modify it:

git clone https://github.com/KphungFROMM/motionworks-iec-mcp-server.git
cd motionworks-iec-mcp-server
python -m venv .venv
.venv/Scripts/python -m pip install -e .

pip install -e ".[dev]" additionally installs pytest, for running the suite.

Requires Python 3.10+. The firmware library reference additionally needs Windows with hh.exe and PowerShell; without them everything else still works and library signatures fall back to what the project itself reveals.

It has to run locally. MCP over stdio works by the client spawning a process, so the client needs a program on disk — a git URL changes how that program gets installed, not whether it is local. And it is moot here anyway: the server reads your MotionWorks exports and the firmware reference from the machine it runs on, so it belongs on the PC with MotionWorks installed. See WORKFLOW.md §1 for the reasoning, and for running it from a URL with uvx.

Quick Start

stdio (local — Claude Desktop, Claude Code, DSH, kiro-cli)

motionworks-iec-mcp-server

SSE (remote)

motionworks-iec-mcp-server --transport sse --host 127.0.0.1 --port 8080

Configuration

Claude Desktop / generic MCP client

{
  "mcpServers": {
    "motionworks": {
      "command": "C:/path/to/motionworks-iec-mcp-server/.venv/Scripts/motionworks-iec-mcp-server.exe",
      "args": []
    }
  }
}

Agent harnesses: use the launcher

If your client is an agent harness that may set PYTHONHOME for its own bundled Python, point it at the launcher instead — a venv python.exe inheriting an invalid PYTHONHOME dies during interpreter startup, before any of this code runs, and the client just reports a server that will not connect:

{
  "mcpServers": {
    "motionworks": {
      "command": "C:/path/to/motionworks-iec-mcp-server/scripts/motionworks-iec-mcp-server.cmd",
      "args": []
    }
  }
}

The launcher clears PYTHONHOME, PYTHONPATH and PYTHONSTARTUP and then runs the same server. Measured under a hostile PYTHONHOME: the bare .exe returns no response, the launcher returns 28 tools. WORKFLOW.md has the field-by-field version for GUI clients that ask for command/arguments/environment separately.

Environment variables

Variable

Purpose

MOTIONWORKS_FWLIB

The FW_LIB folder, or a folder of already-extracted .htm pages (the escape hatch for hosts without hh.exe). Set but missing is treated as an error rather than silently ignored.

MOTIONWORKS_FWLIB_CACHE

Where extraction and the parsed catalog are cached.

MOTIONWORKS_SAMPLES

Only used by the test suite, to point at real exports.

Installing into a project-local venv

python -m venv .venv
.venv/Scripts/python -m pip install -e .

Then point the client at .venv/Scripts/motionworks-iec-mcp-server.exe.

Available Tools

ping

Health check. Returns "pong".

open_project(path)

Start here. Detects the source form, merges every export present, and returns the project summary including a divergences list. path may be a PLCopen XML file, an Extended export directory, or a native project directory.

load_project(plcopen_xml_path)

Parse a PLCopen XML export specifically. Kept for parity with the studio5000 connector; open_project supersedes it.

get_sources(path)

Which export forms exist, what each supplied (POUs with code, languages), what the counts are, and exactly where the sources disagree. Use this whenever a tool returns less than you expected.

Every variable in the project — global variables with their AT % addresses and comments, plus each POU's declared interface.

get_tags(path, data_type="AXIS_REF")
get_tags(path, address="%MX1.7")        # what lives at this bit?
get_tags(path, search="PLCMODE")

get_tag(path, tag_name)

One variable: its declaration(s), its type's members, and every place it is used across POUs, networks and lines.

get_types(path, search?, kind?, limit?)

Data types, structs, enums and function blocks. This is the vocabulary code must be written against — including the Yaskawa motion library (AXIS_REF, Y_ENGAGE_DATA, MC_*, Y_*, AxisControl) that only the PLCopen XML export carries.

A type definition with its members, types and comments.

get_udts(path) / get_udt(path, udt_name?)

Project-defined types only, excluding the vendor library.

get_fb_signature(path, fb_name)

A function block's interface, combining two authorities because each knows something the other does not:

  • the project knows the exact pin list its firmware build compiled against (from .DIT metadata) or what the code actually passes;

  • the firmware reference knows data types, defaults, per-pin meaning, which pins this firmware leaves unimplemented, the block's purpose and an example.

Pins the project never mentioned are still listed, so a block can be called with parameters it has never been called with here. unsupportedPins names parameters that exist but do nothing. A disagreement about a pin's type keeps both, as type and projectType.

get_fb_signature(path, "MC_MoveAbsolute")
→ 15 pins, e.g.
    inOut  Axis       AXIS_REF        ("Logical axis reference…")
    input  Position   LREAL           default LREAL#0.0
    input  Direction  MC_Direction    default MC_Direction#1
    input  BufferMode MC_BufferMode
    output Done       BOOL

list_library_blocks(search?, library?, limit?)

Every function block the firmware provides — device documentation, not project state, so it works without opening a project and includes blocks the project never uses. Use it to find out what is available before writing code.

search_library(query, limit?)

Search the reference by block name, formal parameter, type name, description, notes or example code. Answers "which block do I use for X?".

search_library("torque")   → MC_TorqueControl, MC_ReadActualTorque, Y_ControlMode…
search_library("cam")      → Y_CamIn, Y_CamOut, Y_CamScale, Y_CamShift…

get_library_reference_status()

Whether the reference is available, which libraries it found, what the cache holds, and — when it is not available — exactly how to enable it.

get_code_conventions(path)

Call this before generating code. Conventions are written down nowhere; they are visible only in the existing symbols, and code that compiles but breaks them reads as foreign in review. Each rule carries its evidence and a confidence, so a weak signal is not mistaken for a house standard.

get_code_conventions(path)
→ "x" names boolean variables (BOOL)            [strong, 120 uses]
  "i" names integer variables (INT)             [strong, 44 uses]
  "r" names real variables (LREAL)              [strong, 31 uses]
  function-block instances are prefixed with the block family and purpose
  "EIP_ToCLX_*" is an established signal family (89 variables)
  tasks run in priority order FastTsk(T#4ms), MedTsk(T#20ms)…
  body languages in use: ST×4, LD×3
  namingSummary: {boolean: x, integer: i, real: r}

Programs and function blocks with language, assigned task and size.

get_pou(path, pou_name, offset?, include_interface?, include_outputs?)

The workhorse. One POU's interface, its body, and every network it contains. Structured Text comes back verbatim; LD/FBD comes back as one text line per network plus a structured nets array. Long bodies page via offset and report truncated/nextOffset.

{
  "name": "ServoTaskSlow", "language": "LD", "task": "SlowTsk",
  "interface": { "VAR_EXTERNAL": [{"name": "TopCutter", "type": "AXIS_REF",
                                   "comment": "SGD7S - 1 (Do Not Modify!!)"}] },
  "body": { "networkCount": 5, "code": "MC_Power(MC_TopCutter_ServoOn) ...",
            "nets": [{"number": 0, "nodes": [{"kind":"block","type":"MC_Power",
                      "instance":"MC_TopCutter_ServoOn",
                      "params":{"Enable":"EIP_FromCLX_Axis_SVON_Cmd","Axis":"TopCutter"}}]}] }
}

get_routines(path, program?) / get_routine(path, program, routine_name?)

Aliases for get_pous / get_pou so the studio5000 calling convention works.

get_tasks(path)

Controller tasks with type, interval, priority, watchdog and the programs each runs. Task assignment decides execution order — check it before assuming two POUs run in sequence.

get_io_config(path)

Named I/O groups with address ranges, drivers and data types, which is how the AT %I/%Q variables get their physical meaning.

get_motion_config(path)

The motion picture: every axis reference, the <axis>.AxisNum := N; bindings found in startup code, the servo/network groups from the I/O configuration, and the motion types available. Answers "which servo is axis 1?".

search_logic(path, pattern, limit?)

Where is this symbol used / which routines call this block? Matches the symbol table (declarations, block types, instances, pins) first, then raw ST lines. Regex supported — note the pattern is a plain regex, so MC_ matches every MC_* block reference.

search_logic(path, "TopCutter_Homed")
search_logic(path, "MC_")             # every MC_* block reference
search_logic(path, "Y_Cam(In|Out)")   # either cam block

validate_pou(path, code, declared_vars?, pou_name?)

Validate generated code against the project's real symbols. Catches the mistakes an LLM actually makes, before the user sees them:

  • undeclared_tag — a symbol the project does not declare anywhere

  • unknown_type — a declaration using a type the project does not have

  • unknown_pin — a formal parameter the target FB does not define

  • duplicate_declaration — the same variable declared twice in one scope

Identifier comparison is case-insensitive, because IEC 61131-3 identifiers are — the RK_DemoOnMP3300iec sample declares Products and compiles products. A case-sensitive check would report that legal code as undeclared. A casing difference from the declaration is surfaced as an identifier_case style warning instead, and caseVariants lists them.

Pin names are checked against the project's own block definitions where it has them, and against the firmware reference otherwise — which matters because an Extended-only project carries no type definitions at all, so without it the pin check would silently do nothing for exactly the projects that need it.

A native project looks like the real thing and is the most natural path to point at, but its code is a compound binary. So when a source is missing, open_project and get_sources return an exportGuidance block rather than a hollow result: what is missing, what it costs, the verified export steps, and — if exports exist elsewhere on disk — the path to the one matching this project. An agent handed a bare .mwt can therefore tell you what to do instead of guessing at code it cannot see.

Situation

issue

Consequence

native project only

no_export_found

nothing readable — no source, variables or types

Extended export only

plcopen_xml_missing

no type definitions, so no block interfaces; 16 % graphical pin recovery

PLCopen XML only

extended_iec_missing

no I/O configuration, task names or AT % addresses

render_pou_source(name, pou_type?, language?, declaration?, code?, description?)

Emit a POU in the shape MotionWorks' Extended IEC 61131-2 export uses — the (*@PROPERTIES_EX@ ... *) header, the PROGRAM/FUNCTION_BLOCK line, declaration blocks and the (*@KEY@: WORKSHEET ... *) body region.

This output parses back through this server, so its structure matches the export format. Whether the IDE imports that shape is not verified — that format is undocumented in the installed help, whose documented import path is PLCopen XML (File → Import). So either create a POU in the IDE and paste the code, or wrap the result in PLCopen XML for the documented route. See WORKFLOW.md §5.

render_type_source(name, members?, comment?)

Emit a TYPE ... END_STRUCT END_TYPE definition in the same shape, with the same caveat about import.

list_languages()

Which IEC body languages are rendered, from which source, and how completely.

Workflow

WORKFLOW.md is the end-to-end guide: install, the exact IDE export steps (quoted from MotionWorks' own help), which artifacts to point at, example prompts, and how generated code gets back into the project.

The short version:

  1. Install the server and add it to your MCP client.

  2. Export from MotionWorks — File → Export → "Export PLCopen xml file", saved as V1.01. The XML export deliberately excludes I/O configuration (the vendor help says so), so also produce the Extended IEC 61131-2 export.

  3. Point the agent at one project's artifacts. It merges them and reports where they disagree — read that list, it is often the most important thing about a project.

  4. Work in the loop: ask → the agent looks up real symbols, conventions and block signatures → generates → validates against the project → emits a file.

  5. Get it back in by pasting into a new POU, or via File → Import → "Import PLCopen xml file" (the documented path).

flowchart LR
  A[MotionWorks project] -->|File - Export| B[PLCopen XML]
  A -->|Extended IEC 61131-2| C[ST / GVB / EIO / EXP]
  A -.->|optional| D[native folder<br/>POU index + .DIT]
  B --> E[open_project<br/>merge + divergences]
  C --> E
  D --> E
  E --> F[get_tags / get_pou / search_logic]
  E --> G[get_fb_signature / search_library]
  E --> H[get_code_conventions]
  F --> I[generate]
  G --> I
  H --> I
  I --> J[validate_pou]
  J -->|errors| I
  J -->|ok| K[render_pou_source]
  K --> L[File - Import, or paste into a new POU]

Example conversation

You: Open the TopCutter project and tell me what it does.

Agent calls: open_project("C:/projects/PLCOpen XML Export/TopCutter.xml")
             open_project("C:/projects/Extended IEC 61131-2 Export/TopCutter")

Agent: Both merged — 10 POUs, 281 variables, 7 tasks, processor MP2600iec.
Divergence warnings: the XML export omits TopCutterCutControl, TopCutterCamSetup
and TopCutterFFCamSetup, while it is the only source for StraightCut, CamGen and
Initialize — and it ships an empty body for two POUs the Extended export has real
source for, which is what I used. Named tasks are FastTsk (T#4ms, priority 0),
MedTsk (T#20ms, 3), SlowTsk (T#100ms, 7), plus BG and Start with no interval.
CamGen and Initialize run in tasks the named export does not describe — priority 10
/ 1 s and priority 0 / WarmStart — so those are reported by schedule instead of name.

You: What drives TopCutter_Homed and who reads it?

Agent calls: get_tag(project, "TopCutter_Homed")

Agent: A global BOOL, "Top Cutter Axis is Homed". Written in ServoHoming (LD) and
read in four places: TopCutterCutControl (ST), EIP_ToCLX (LD, feeding
EIP_ToCLX_Axis_Homed) and ServoTaskSlow. Gated on PLCMODE_RUN.

You: Add a POU that reads the top cutter position and scales it.

Agent calls: get_code_conventions(project)
             get_fb_signature(project, "MC_ReadActualPosition")
             validate_pou(project, "<generated code>")

Agent: This project uses x/i/r prefixes and MC_<Thing>_<Action> instance names, so
I named things accordingly. MC_ReadActualPosition takes Axis (AXIS_REF),
Enable (BOOL), Valid/Busy/Error (BOOL), ErrorID (UINT), Position (LREAL).
Validated against the project: 0 errors. Here's TopCutterPosition.ST.

Every claim there comes from a tool result rather than the agent's recollection, which is the point. See WORKFLOW.md for the full worked example.

Design Constraints Worth Knowing

  • Graphical logic is authoritative in the PLCopen XML export. The same logic recovered from an Extended export's .GE file is partial by design: the format is undocumented, and the ordinal/pin mapping that would recover it fully does not round-trip reliably. So the .GE decoder reports block structure, pins and parameter names exactly (verified against the XML for the same programs) and recovers pin values only where it is provably safe — currently 100 % precise, 16 % recall on the sample set, with the unmatched count reported rather than guessed. list_languages states this at runtime.

  • Merged projects pick the body per language, not per file. Structured Text comes from the plain-text Extended export (original tab alignment); LD/FBD comes from the PLCopen XML (real connections, complete pin values). Which export a body came from is reported as body.source, separately from the POU's own source which names the record that supplied its metadata.

  • Task merging is exact, and refuses to guess. The PLCopen XML export carries no task names, so its tasks arrive as task@<priority>@<interval> and are matched to named tasks by priority and normalised interval — the two exports write intervals differently (00:00:00.20 and T#20ms are both 20 ms, and the first is not a decimal fraction of a second). Matching on any overlap of program lists was tried and removed: when two exports describe different generations of a project, a partial overlap silently welds programs onto the wrong task. A program-list disagreement is reported as task_program_conflict and the named export wins; a task that cannot be matched keeps its provisional @ name, because a known schedule with an unknown name is more useful than a guess.

  • The native project cannot supply code. src.st1, TREE.XML and .IOC are compound binary. What it does provide is the authoritative POU/task/dependency map from eCLRPouDependencies.dat, plus the .DIT function-block interfaces described above.

  • No live controller connection. MotionWorks IEC exposes no documented programmatic interface, so this server is export-based, like the studio5000 connector. Re-export from the IDE to refresh.

  • Read and generate, not write-back. Generated code is emitted to a file for import. This server will not write into a .mwt project: the format is undocumented binary, and a bad write could corrupt a live machine project.

Known Gaps

Stated plainly, because the difference between "plausible code" and "code that compiles" lives here.

  1. Graphical wiring recovered from a .GE-only project is partial. If the PLCopen XML export is unavailable, the .GE decoder reports block structure, pin names and parameter names exactly but recovers only 16 % of pin values (100 % precise — it never reports a wrong one). Re-export as PLCopen XML when you can.

  2. The reference documents one firmware version. The catalog is keyed to the installed MotionWorks version. Values and support flags differ between versions, so a project built against a different firmware release may see pins marked supported here that are not, or vice versa. get_library_reference_status reports which version was read.

  3. Project-generated .DIT interfaces can disagree with the reference about a pin's underlying type (the export records INT where the block declares MC_BufferMode). Both are reported rather than one being discarded, but the reference is preferred for the declared type.

  4. No write-back into the IDE, and the import path for generated text is unverified. render_pou_source emits the shape the Extended IEC 61131-2 export uses, which this server parses back — but whether the IDE imports that shape is not documented in the installed help, whose documented import path is PLCopen XML. Until a PLCopen XML emitter exists, use File → Import → "Import PLCopen xml file" with your own wrapper, or create a POU in the IDE and paste the code (always works). Writing into a .mwt is deliberately not attempted: it is undocumented binary and a bad write could corrupt a live machine project.

  5. No live controller connection. MotionWorks IEC exposes no documented programmatic interface, so this server is export-based, like the studio5000 connector. Re-export from the IDE to refresh.

Project Structure

src/motionworks_iec_mcp_server/
├── __main__.py            # CLI entry point (stdio / SSE)
├── server.py              # FastMCP app — 28 tool definitions
├── project.py             # source detection, merge, divergence reporting
├── model.py               # the normalized project model
├── fwlib.py               # firmware library reference: extract, parse, cache, merge
├── cache.py               # mtime-keyed parse cache
├── util.py                # tolerant file reading, IEC text handling
├── codegen/
│   ├── validate.py        # code validation + MotionWorks file emission
│   └── conventions.py     # observed house conventions
└── parsers/
    ├── plcopen_xml.py     # authoritative: POUs, types, tasks, all languages
    ├── extended_iec.py    # text POUs, global vars, I/O config, task names
    ├── native.py          # NODES.LST, POU index, .DIT + TYLLIST interfaces
    ├── graphical.py       # .GE decoder + PLCopen LD/FBD renderer
    ├── st.py              # declaration blocks, POU headers, ST splitting
    └── xref.py            # symbol → usage index

tests/                     # pytest suite (283 tests)
WORKFLOW.md                # install → export → work → import, end to end
FORMATS.md                 # the formats, documented from real files

Development

python -m venv .venv
.venv/Scripts/python -m pip install -e ".[dev]"
.venv/Scripts/python -m pytest tests/ -v

Tests are hermetic by default. Integration tests additionally run against real exports when MOTIONWORKS_SAMPLES points at a folder containing them, and tests for the shipped reference pages run against a synthetic tree shaped like the real one — with a further set that runs against the actual installation when present:

MOTIONWORKS_SAMPLES="C:/Users/me/Desktop/MotionWorks IEC MCP" \
  .venv/Scripts/python -m pytest tests/ -v

Dependencies

fastmcp is the only runtime dependency; every parser uses the standard library (xml.etree.ElementTree, re, json, dataclasses). That is deliberate — this runs next to industrial machinery, and fewer moving parts is better. The claim is enforced by tests/test_dependencies.py, which walks the AST of every module under src/ and fails if a third-party import appears that pyproject.toml does not declare.

Roadmap

v0.1 — Parsing and comprehension ✅

  • PLCopen XML parser: POUs, all languages, tasks, globals, enumerated types

  • Extended IEC parser: ST/GE/IEC, GVB with addresses, EIO, EXP task config

  • Native parser: project tree, POU/task dependency index, .DIT interfaces

  • Source detection, merge and divergence reporting

  • LD/FBD rendering to per-network text (XML full, .GE partial by design)

  • Cross-reference index and search

  • Code validation against project symbols

  • MotionWorks file emission for import (POU and TYPE)

v0.2 — Complete library knowledge ✅

  • Firmware library reference: locate, decompile, parse, cache

  • 110 function blocks with pin scope, type, default, description and support flags

  • 41 data types and 45 enumerated values from the vendor's own help

  • Merge reference with project .DIT and observed call sites

  • list_library_blocks, search_library, get_library_reference_status

  • Observed-convention analysis (get_code_conventions)

v0.3 — Close the round trip

  • PLCopen XML emitter for generated POUs and data types, so output uses the import path the vendor actually documents (File → Import → "Import PLCopen xml file") rather than the Extended text shape, which is unverified for import

v0.4 — Deeper graphical fidelity

  • Complete .GE pin-value recovery (needs a documented ordinal contract)

  • SFC bodies, if any export ever emits them

  • Alarm and cam-table extraction from the reference

v0.5 — Project write-back

  • Write POUs into an Extended export layout

  • Optional .mwt write-back once the container format is understood

License

MIT — see LICENSE.

Available Tools

28 tools
get_code_conventionsA

Report the coding conventions this project already follows.

Call this before generating code. Conventions are written down nowhere — they are visible only in the existing symbols — and code that compiles but breaks them reads as foreign in review. Each rule carries the evidence behind it and a confidence, so a weak signal is not mistaken for a house standard.

Covers: variable name prefixes by type (x→BOOL, r→LREAL, udi→UDINT), function-block instance naming, established signal families, documentation habits, task structure and the languages in use.

Args: path: Project file or directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it delivers useful behavior details: conventions are inferred from existing symbols rather than documentation, and each rule includes evidence and confidence. This sets correct expectations about the output's nature and quality without contradicting any structured metadata.

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 well structured and front-loaded: it states the action, gives the critical usage instruction, explains why the tool exists, lists the covered conventions, and documents the argument. Every sentence adds value, and the formatting makes it easy to scan.

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 simple one-parameter tool with an output schema present, the description is complete. It covers what the tool does, when to call it, what kind of results to expect (evidence + confidence), which areas it covers, and what the path argument means. Nothing needed for invocation is missing.

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 has 0% description coverage, but the description compensates by explaining the sole parameter: 'path: Project file or directory.' This adds meaning that a bare 'path' string would not convey. It could go further with path type details, but for one parameter it is adequate.

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 opens with a specific verb and resource: 'Report the coding conventions this project already follows.' It then enumerates concrete covered topics (variable prefixes, instance naming, documentation habits) that clearly distinguish it from sibling tools like get_fb_signature, get_tasks, or get_types.

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 gives explicit when-to-use guidance: 'Call this before generating code.' It also explains why it is necessary, that conventions are only visible in existing symbols and not written down. It does not explicitly state when not to use it or name an alternative, but the intended context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_fb_signatureA

Get a function block's interface — for calling or instancing it correctly.

Combines two authorities, because each knows something the other does not:

  • the project knows the exact pin list its firmware build compiled against (from .DIT metadata) or what the code actually passes;

  • the firmware library reference knows data types, defaults, per-pin meaning, which pins this firmware leaves unimplemented, the block's purpose, and a usage example.

Pins the project does not mention are still listed, so a block can be called with parameters it has never been called with here. unsupportedPins names parameters that exist on the block but do nothing on this firmware.

Args: path: Project file or directory. fb_name: Function block name, e.g. "MC_Power", "Y_CamIn", "AxisControl".

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
fb_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full responsibility, and it delivers substantial behavioral detail. It explains that the project and firmware library reference are combined, that pins absent from the project are still listed, and that 'unsupportedPins' identifies parameters that exist but do nothing on this firmware. This gives an agent important expectations beyond the schema.

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 longer than necessary but well organized with a front-loaded purpose, bulleted explanation of the two authorities, and a clear Args section. The detail about unsupportedPins earns its place, and the structure makes the extra length digestible.

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 output schema exists and the tool has only two parameters, the description covers what an agent needs: purpose, parameter meanings, the two information sources, and special behavior around unsupported pins. There are no annotations to fill gaps, but the description is thorough enough on its own.

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 declares two string parameters with 0% description coverage, so the description must compensate. It adds meaningful semantics: path is a project file or directory, and fb_name is a function block name with concrete examples like 'MC_Power' and 'Y_CamIn'. This is sufficient for the two simple parameters, though slightly more format guidance could push it higher.

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 starts with a specific verb and resource: 'Get a function block's interface — for calling or instancing it correctly.' This clearly distinguishes it from sibling tools that retrieve source code, types, or project structure, and it explains the practical reason the interface is needed.

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 gives clear context: use this tool when you need the exact interface of a function block to call or instance it, combining project metadata with firmware library knowledge. It does not explicitly name sibling alternatives or state when not to use them, but the stated use case is strong enough to guide selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_io_configA

List the controller and network I/O configuration.

Each entry is a named I/O group mapped to an address range and a driver, which is how the AT %I/%Q variables in the global variable table get their physical meaning.

Args: path: Project file or directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It does state the operation is 'List' and explains the conceptual mapping to AT %I/%Q variables, which is useful context. However, it does not disclose whether the project must already be loaded, whether the path can be a directory with a specific structure, or any error/edge-case behavior.

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 compact and front-loaded. The first sentence states the core action, the second adds valuable domain context, and the Args line documents the only parameter. Every sentence earns its place with no redundancy.

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 has a single parameter and an output schema, the description is largely sufficient. It explains what the tool returns conceptually and documents the path argument. The main gaps are the lack of usage guidance versus sibling tools and implicit prerequisites, but these are minor for a simple listing operation.

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 coverage is 0%, so the description must compensate. It does add meaning by defining 'path' as 'Project file or directory,' which goes beyond the bare string type in the schema. However, it does not explain expected file extensions, directory layout, or whether the path is resolved relative to the current workspace.

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 opens with a specific verb and resource: 'List the controller and network I/O configuration.' It clearly distinguishes this from sibling tools like get_tasks or get_motion_config by naming the exact subject matter, and the added explanation about I/O groups, address ranges, and drivers makes the purpose concrete.

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 is given about when to use this tool versus alternatives such as get_motion_config or get_tags. The description implies a read-only listing operation, but it never states prerequisites, exclusions, or how to choose between this and related configuration tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_library_reference_statusA

Report whether the firmware library reference is available, and how to enable it.

The reference is the vendor's own help, installed with MotionWorks and decompiled locally. It is what makes the motion library's parameters, types and semantics knowable. If this reports it is unavailable, that is the reason library signatures fall back to observed usage.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It explains what the tool reports (availability and how to enable) and the implication of unavailability (fallback to observed usage). It does not mention side effects, but as a status report, it is likely read-only. The description adds value beyond a simple status check by explaining the dependency chain.

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 concise and well-structured. It opens with a direct statement of purpose, then provides essential context in a second paragraph. Every sentence contributes meaning, with no redundancy or filler.

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 zero-parameter tool with an output schema present, the description is complete. It explains what the tool reports and why the status matters, giving an agent sufficient context to decide when to call it. No missing information is evident for correct invocation.

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 tool has zero parameters, and the schema is empty with 100% coverage (since there are no properties). The description does not need to elaborate on parameters. Per the baseline for zero parameters, a score of 4 is appropriate.

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 function: 'Report whether the firmware library reference is available, and how to enable it.' It identifies a specific resource (firmware library reference) and the action (report availability and enablement). This distinguishes it from sibling tools like get_type or get_fb_signature, which retrieve specific data objects.

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 context on why this tool matters: it explains that the reference is vendor help installed with MotionWorks and that unavailability causes library signatures to fall back to observed usage. This implies the tool is useful for diagnosing signature quality, though it does not explicitly name alternatives or state when not to use it. It gives clear situational guidance without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_motion_configA

Summarise the motion setup: axes, their amplifier bindings and network nodes.

MotionWorks binds an axis to hardware through <var>.AxisNum assignments in startup code (e.g. TopCutter.AxisNum := UINT#1;) and the servo groups in the I/O configuration (SGD7S Network #1 Node #1). This tool joins those two so "which servo is axis 1?" is answerable.

Args: path: Project file or directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden. It explains the internal behavior—joining AxisNum assignments in startup code with servo groups in the I/O configuration—rather than merely restating the tool name. The 'summarise' wording also implies a read-only operation, though it does not explicitly state side-effect status.

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 front-loads the purpose, gives a focused domain explanation with a concrete example, and ends with the argument. No sentences are wasted, and the code example earns its place by clarifying how AxisNum bindings work.

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?

For a one-required-parameter tool with an output schema, the description covers input semantics, purpose, and the question it answers. It does not mention prerequisites like a loaded project, but the path argument and output schema make the tool callable without much additional context.

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 says path is a string with no description, so the description's 'Project file or directory' adds essential meaning. This adequately clarifies what the agent should pass for the single required 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 opens with a specific verb and resource: 'Summarise the motion setup' and names the exact content covered (axes, amplifier bindings, network nodes). It also distinguishes itself by explaining that it joins AxisNum assignments with servo groups, setting it apart from generic I/O config tools.

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 gives a concrete use case: answering 'which servo is axis 1?', which makes the intended invocation clear. It does not explicitly list alternative tools or exclusion cases, but it provides enough context to select this tool over simpler retrieval tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_pouA

Get one POU: its interface, its body, and every network it contains.

This is the workhorse tool. Structured Text is returned as the original source, tab alignment and inline comments intact. Ladder and FBD bodies are returned as one compact text line per network plus a structured nets array naming each block, its instance and each formal parameter's source — the equivalent of NeutralText for Studio 5000, and far smaller than the raw XML.

Long bodies are paged: check body.truncated and pass offset to continue.

Args: path: Project file or directory. pou_name: POU name exactly as reported by get_pous. offset: Line offset into the body, for paging long POUs. include_interface: Include the declared variables for each scope. include_outputs: For graphical bodies, include each block's output pins.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
offsetNo
pou_nameYes
include_outputsNo
include_interfaceNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it delivers: it discloses exact return behavior for Structured Text (original source, tab alignment, inline comments), the compact text-plus-nets representation for Ladder/FBD, paging via body.truncated and offset, and output-size tradeoffs relative to raw XML. This is far richer than a generic 'Get one POU.'

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 front-loaded with the primary purpose, then adds high-value behavioral details, then lists parameters in an Args block. Every sentence contributes: source fidelity, network representation, paging, and param semantics. It is long but dense and well-organized, not padded.

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, an output schema exists, and the description covers behavior, paging, param meanings, and the relationship to get_pous, the definition is complete for an agent to select and invoke the tool correctly. No critical operational detail appears to be missing.

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, and it does: path as project file or directory, pou_name as exact name from get_pous, offset as line paging, include_interface as per-scope variables, and include_outputs as graphical block output pins. This adds real meaning beyond the bare schema types.

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 opens with a specific verb and resource: 'Get one POU: its interface, its body, and every network it contains.' It clearly distinguishes this from the plural sibling get_pous by emphasizing a single POU, and it names concrete content areas rather than merely restating the tool name.

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 phrase 'This is the workhorse tool' implies broad/default usage, and the instruction that pou_name must be 'exactly as reported by get_pous' hints at a prior step. However, there is no explicit guidance about when to prefer this tool over get_routine, render_pou_source, or validate_pou, nor any when-not-to-use conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_pousA

List programs and function blocks with language, task and size.

Args: path: Project file or directory. language: Filter by body language: "ST", "LD", "FBD". task: Filter by the task the program runs under, e.g. "FastTsk". search: Case-insensitive substring filter on the POU name.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
taskNo
searchNo
languageNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/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 states 'List' which implies a read-only operation, but does not mention whether it requires an open project, works directly on files, or has any side effects. It also does not describe what happens if the path is invalid or if search yields no results. The description does not contradict anything, but it is insufficiently transparent.

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: one line stating purpose, then a clean Arg list with each parameter explained. No unnecessary words; the purpose is front-loaded and the argument details are structured and scannable. This is an ideal format for agent consumption.

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?

All four parameters are explained and an output schema exists, so return values are covered. However, the description lacks some operational details: it does not state whether it scans subdirectories, handles relative vs absolute paths, or what the size field represents. Given the read-only nature and clear purpose, it is mostly complete, but a few behavioral nuances are missing.

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 coverage is 0%, so the description must fully explain parameters. It does so effectively: path is explained as project file or directory, language lists allowed values ('ST', 'LD', 'FBD'), task gives an example ('FastTsk'), and search specifies case-insensitive substring on POU name. This adds substantial meaning beyond the schema's type/default info.

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 lists programs and function blocks, with specific output fields (language, task, size). It distinguishes from siblings like get_pou (singular) and get_udts by specifying the resource and scope, so an agent can select it appropriately.

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 gives no guidance on when to use this tool versus alternatives. It does not mention that get_pou fetches a single POU or that get_routines handles routines, nor does it state any exclusions or conditions. The usage context must be inferred solely from the name and purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_routineA

Get a POU's body (alias for get_pou, for familiarity with studio5000).

Args: path: Project file or directory. program: POU name. routine_name: Ignored; present so the studio5000 calling convention works.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
programYes
routine_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses that routine_name is ignored, which is a behavioral trait. It also implies identical behavior to get_pou. However, it does not specify output format, side effects, or permissions. The alias reference partially compensates, but the lack of detail on what 'body' means or any error conditions leaves a moderate gap.

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 a compact docstring with a one-line purpose and an Args list. It front-loads the primary purpose and then provides parameter details without any fluff. Every sentence adds value, and the structure is easy to parse.

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 simplicity of the tool (an alias with 3 parameters) and the presence of an output schema (not shown but indicated), the description is sufficient. It explains the alias, the ignored parameter, and all parameter semantics. The only missing piece is a description of the return value, but the output schema likely covers that, so it is not a critical gap.

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 explain all parameters. It does: path is the project file or directory, program is the POU name, and routine_name is explicitly ignored. This fully compensates for the schema's lack of descriptions and is clear and precise for an 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 states a specific verb ('Get'), resource ('POU's body'), and clarifies it is an alias for get_pou. It distinguishes from siblings by naming the canonical tool and explaining the studio5000 familiarity rationale. This is unambiguous and leaves 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 explicitly says it is an alias for get_pou and explains the routine_name parameter is ignored to support the studio5000 calling convention. This gives clear guidance on when to use this tool (when familiar with studio5000 naming) and implicitly that get_pou is the canonical alternative. It does not provide explicit exclusions, but the alias relationship itself is strong guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_routinesC

List POUs (alias for get_pous, for familiarity with studio5000).

Args: path: Project file or directory. program: Filter by POU name.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
programNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It says 'List', implying a read-only operation, but does not disclose any other behaviors such as output format, pagination, error conditions, or performance characteristics. It is too minimal to inform the agent of important behavioral traits.

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 short and front-loaded with the primary action. It efficiently states the purpose and then lists arguments without fluff. It is well-structured for a simple tool.

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 listing tool with an output schema, the description covers the essential action and parameters. However, it omits any context about return value structure, usage scenarios, or constraints beyond the basic filter. It is adequate but not thorough.

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 coverage is 0%, so the description must compensate. It provides brief meanings for both parameters: 'path' as project file or directory, and 'program' as filter by POU name. This adds value beyond the schema's bare types, but lacks detail on expected formats or edge cases.

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 'List POUs', specifying the action and resource. It also explicitly mentions it's an alias for get_pous, which clarifies its relationship to a sibling, even though it doesn't differentiate from that sibling. The purpose is unambiguous.

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 explicit guidance on when to use this tool versus alternatives. It only states it's an alias for get_pous, which implies interchangeability but doesn't provide conditions for selection or mention when not to use it. Sibling tools like get_pou or get_routine are not addressed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_sourcesA

Report which export forms exist for a project and what each contributes.

Use this when a tool returns less than you expected: it says which sources are readable, what each one supplied, and exactly where they disagree. When a source is missing — including the common case of a native project with no export beside it — the response carries an exportGuidance block with the steps to produce it, taken from MotionWorks' own help.

Args: path: File or directory to inspect.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 the full burden for behavioral disclosure. It reveals a non-obvious behavior: missing sources trigger an 'exportGuidance' block with steps from MotionWorks' help. It also describes the tool's diagnostic output (readability, contributions, disagreements). It does not explicitly label the operation as read-only, but 'Report' and 'inspect' imply it; the description still adds meaningful behavioral context beyond the schema.

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 compact and well-structured: a one-sentence purpose, a usage guideline, an edge-case behavior note, and an Args line. Every sentence earns its place, and the most important information (purpose and when to use) is front-loaded before technical details.

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 only one parameter and an existing output schema (so return values need not be described), the description covers all necessary context: what it reports, when to use it, and how it handles missing sources. The common native-project-without-export case is explicitly addressed, making the tool fully self-explanatory.

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 fully explain the parameter, and it does: 'path: File or directory to inspect.' This adds semantic meaning about both the type and expected usage, going beyond the bare schema property name. For a single-parameter tool, this is sufficient.

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 opens with a specific verb and resource: 'Report which export forms exist for a project and what each contributes.' This clearly distinguishes it from sibling getters (get_udt, get_routine, get_tags, etc.), which target different entities. The agent can immediately understand the tool's unique function without inspecting schemas.

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 an explicit trigger: 'Use this when a tool returns less than you expected.' It also explains what the tool returns in that context (readable sources, contributions, disagreements). However, it does not explicitly state when not to use it or name alternative tools, so it stops short of full exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tagA

Get one variable's full detail plus every place it is used.

Use this to answer "what is this signal and what drives it?" — it returns the declaration (with address and comment) alongside every POU, net and line that references it.

Args: path: Project file or directory. tag_name: Variable name. A qualified name such as "Products.Sensor.Bit" also works.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
tag_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and does disclose the core behavior: it returns the declaration and all reference locations. The verb 'Get' and 'returns' imply read-only operation, though it does not explicitly state that it makes no modifications or mention error behavior. This is fairly transparent for a simple lookup tool.

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 compact and front-loaded: the first sentence states the tool's purpose, the second gives a use case and output details, and then an args list adds parameter semantics. Every sentence contributes value with no filler.

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 simple two-parameter schema and an output schema that covers return shape, the description is largely complete. It explains the tool's purpose, when to use it, and both arguments. It does not mention prerequisites like project loading or error cases when a tag is not found, which are minor gaps.

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 the description must compensate. It adds meaning to both parameters: path is described as a project file or directory, and tag_name is described as a variable name with a qualified-name example. This gives the agent practical guidance beyond the bare schema types.

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 gets a single variable's full detail plus all its usages, naming the concrete output: declaration with address and comment, and every POU, net and line referencing it. This distinguishes it from sibling tools like get_tags and get_type by emphasizing the per-variable detail and usage traversal.

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 gives an explicit use case: 'Use this to answer "what is this signal and what drives it?"' and describes what it returns, giving the agent clear when-to-use guidance. It does not explicitly mention when-not-to-use or name alternative sibling tools, so it stops short of full differentiation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tagsA

List project variables (the MotionWorks equivalent of tags).

Combines global variables (which carry AT % addresses) with every POU's declared interface variables, so this is the full symbol surface of the project.

Args: path: Project file or directory. scope: Filter by scope, e.g. "VAR_GLOBAL", "VAR_EXTERNAL", "VAR", "VAR_INPUT". data_type: Filter by data type, e.g. "BOOL", "LREAL", "AXIS_REF". address: Substring filter on the AT address, e.g. "%MX1.7" . search: Case-insensitive substring filter on the variable name.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
scopeNo
searchNo
addressNo
data_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/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. It explains that the tool combines global and POU variables and that global variables carry AT addresses, which is useful. However, it does not explicitly state read-only behavior, potential side effects, or any prerequisites (e.g., project must be loaded), though 'List' implies a read operation.

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 concise and well-structured: a one-sentence purpose followed by a clear args list. It front-loads the core purpose and then details parameters without redundant fluff. A minor improvement would be to mention output format, but that is covered by the output schema.

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 has an output schema and 5 parameters all described with examples, the description is fairly complete. It explains what data is returned (full symbol surface) and how to filter. It does not cover edge cases like empty results, but those are typically not required in the description. Overall, adequate for an agent to call it 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 compensate. It does so excellently by explaining each parameter with concrete examples: 'path: Project file or directory', 'scope: Filter by scope, e.g. VAR_GLOBAL...', etc. This adds meaning well beyond the bare schema and gives the agent exactly what it needs to construct valid calls.

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 'List project variables' and elaborates on the specific scope (global variables with AT addresses plus POU interface variables), making the tool's purpose unambiguous. It also distinguishes itself from siblings like get_tag (singular) and other type/UDT tools, so an agent can select it appropriately.

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 when to use the tool (when you need the full symbol surface of the project) but does not explicitly mention when not to use it or suggest alternatives (e.g., get_tag for a single variable). The context is clear but lacks direct comparison or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tasksA

List controller tasks with timing and the programs each one runs.

Task assignment decides execution order and jitter, so check this before assuming code in two POUs runs in a particular sequence.

Args: path: Project file or directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/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. It describes the operation as a listing, which implies read-only behavior, but does not explicitly state side-effect-freeness, permissions, or any constraints such as requiring an open project. This is adequate for a read operation but lacks explicit safety confirmation.

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 compact and well-structured. The first sentence delivers the core purpose, the second adds valuable execution-order context, and the Args section cleanly documents the parameter. No fluff or redundant phrasing.

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?

The tool is simple (one parameter) and an output schema exists, so return-value details are not needed. The description covers purpose, parameter meaning, and a practical usage warning. Minor gaps: it doesn't state prerequisites (e.g., whether a project must be loaded) or any path format restrictions, but these are unlikely to impede correct invocation.

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: the 'Args' section explicitly defines 'path' as 'Project file or directory,' which adds meaning beyond the bare schema type. This is concise and informative, though it could have specified whether a file or directory is preferred in different scenarios.

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 a specific verb ('List') and resource ('controller tasks'), and adds the attributes of timing and programs each task runs. This clearly distinguishes it from sibling tools like get_pous or get_routines, which deal with code blocks rather than task scheduling.

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 a clear use case: to check task assignment before assuming execution order, and explicitly mentions jitter. While it doesn't name alternative tools or say when not to use it, the guidance is actionable and contextually relevant, giving the agent a reason to invoke this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_typeA

Get a type definition with its members.

Use get_fb_signature instead when you want a function block's pin table in a form oriented around calling it.

Args: path: Project file or directory. type_name: Exact type name. Empty returns every type that matches search, or all types when search is empty too. search: Case-insensitive substring filter, used when type_name is empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
searchNo
type_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It explains that type_name is exact, that empty type_name returns types matching search, and that search is case-insensitive. It does not explicitly state read-only semantics, but 'Get' strongly implies it, and the conditional behavior is well documented.

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 compact, front-loaded with the core purpose, and uses a clearly structured Args block. Every sentence adds useful information; there is no filler or repetition of schema field names without added meaning.

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 simple read-style lookup with three parameters and an output schema present, the description covers all necessary calling semantics. It explains parameter defaults, behavior when type_name is empty, and routes to the relevant sibling tool when appropriate.

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 fully compensate. It does: path is defined as 'Project file or directory,' type_name is 'Exact type name' with empty behavior, and search is a 'Case-insensitive substring filter' used only when type_name is empty.

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 opens with a specific verb and resource: 'Get a type definition with its members.' It also explicitly differentiates from the sibling get_fb_signature by stating when that tool should be chosen instead, making the purpose immediately recognizable.

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?

It explicitly names get_fb_signature as the alternative for function-block pin tables in a calling-oriented form, giving the agent clear routing guidance. It also explains the interaction between path, type_name, and search, which defines the tool's calling conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_typesA

List data types, structs and function blocks available in the project.

This is the vocabulary an agent must code against — including the Yaskawa motion library (AXIS_REF, Y_ENGAGE_DATA, MC_*, Y_*, AxisControl) when the PLCopen XML export is present, which it is the only source that carries.

Args: path: Project file or directory. search: Case-insensitive substring filter on the type name. kind: Filter by kind: "struct", "enum", "array", "alias" or "fb". limit: Maximum number of types to return.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNo
pathYes
limitNo
searchNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden; it adds a meaningful source constraint by stating that Yaskawa motion-library types are only present 'when the PLCopen XML export is present, which it is the only source that carries.' The word 'List' implies read-only behavior, and filter semantics are disclosed, though it does not address failure/edge cases.

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 front-loaded with the purpose, then one contextual sentence, then a tight Args list. It is efficient and well structured, though the Yaskawa type-name examples add a little length that could be trimmed without losing the core message.

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?

For a 4-parameter listing tool with an output schema, the description covers project scope, source availability, and all filter mechanics. It is complete enough for an agent to call it correctly, but it leaves the relationship to sibling type/library tools implicit.

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%, but the Args block defines every parameter beyond the schema: path as project file/directory, search as case-insensitive substring, kind with its allowed values, and limit as the maximum return count. This fully compensates for the schema's bare properties/defaults.

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 opening 'List data types, structs and function blocks available in the project' names a specific verb, resource, and scope. It clearly covers a plural, project-scoped inventory, which separates it from singular get_type/get_udt, though it does not explicitly name these siblings.

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 phrase 'This is the vocabulary an agent must code against' gives a clear reason to use the tool when selecting type names, and the filters in Args show how to narrow results. There is no explicit when-not guidance or comparison to overlapping siblings such as get_udts, list_library_blocks, or list_fb_catalog.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_udtA

Get a user-defined type definition with its members.

Args: path: Project file or directory. udt_name: Type name. Empty returns all project-defined types.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
udt_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose the key behavior: it returns a UDT with its members, or all project-defined types when udt_name is empty. However, it does not mention failure modes, path resolution, or whether the operation is read-only in explicit terms.

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 short, front-loaded with the action and resource, and each sentence in the args section adds necessary semantic value. No filler or repetition.

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?

For a simple two-parameter lookup tool with an output schema present, the description covers invocation semantics well. The main gap is routing guidance among sibling lookup tools, but the core call behavior is adequately specified.

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 add meaning to both parameters: path is a project file or directory, and udt_name is a type name whose empty value changes the result. This is sufficient but terse.

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 resource ('user-defined type definition') and includes 'with its members' plus the empty-name behavior. It is specific enough to distinguish from plural list-style siblings, though it does not explicitly contrast with get_udts or get_type.

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?

There is no guidance about when to choose this tool over get_udts, get_type, or get_types. The empty-string behavior is a parameter detail, not a selection guideline.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_udtsA

List user-defined types only (project-defined, excluding the vendor library).

Args: path: Project file or directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior2/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 of behavioral disclosure. It states the scoping behavior (project-defined only) but does not describe any side effects, required permissions, error behavior, or return format. For a listing tool, the absence of behavioral details beyond the basic scope is a notable gap.

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, consisting of one main sentence plus a one-line parameter explanation. It front-loads the core purpose and scope with no filler or redundant information, making it easy to parse quickly.

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?

The tool is simple (lists UDTs) and has an output schema (though not shown), so the description does not need to explain return values. However, given no annotations and minimal parameter detail, the description could provide more context on path semantics or usage examples. It is minimally sufficient but leaves room for ambiguity about acceptable path inputs.

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%, so the description must compensate for the path parameter. The description says 'Project file or directory', which adds basic meaning but is vague about file formats or expected path structure. It does not clarify whether the path must be a specific project file type or how directories are handled, providing only minimal semantic value.

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 a specific verb ('List') and resource ('user-defined types only'), and explicitly scopes to project-defined UDTs while excluding the vendor library. This clearly differentiates from sibling tools like get_types that likely list all types, so an agent can distinguish it without opening other definitions.

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 when to use it by stating 'only' and 'excluding the vendor library', but it does not explicitly mention alternative tools or conditions for when not to use it. Sibling tools like get_types exist, but no direct comparison or exclusion is provided, leaving the agent to infer usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_fb_catalogA

List every function block the project uses, with the parameters it passes.

This is the practical coding vocabulary: the blocks that are actually available in this machine and the formal parameter names they are actually called with. The vendor library is not exported as type definitions, so this is the only complete view of it for a given project.

Args: path: Project file or directory. search: Case-insensitive substring filter on the block name.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
searchNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It reveals that the tool is a read-only listing operation and highlights a unique completeness caveat, but it does not mention prerequisites (e.g., whether a project must be open), performance implications, or possible errors. It adds some behavioral context but stops short of a full 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 front-loaded with the core action and keeps the purpose statement immediate. The explanatory note about the vendor library is valuable context and earns its place. The Args section is clearly separated, making the structure scannable, though the middle paragraph is slightly verbose for an 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?

With an output schema present and only two simple parameters, the description covers the main usage context well. It explains why this tool is the right choice for project-level block listing and contrasts it with the vendor library. It could be more complete by explicitly contrasting with siblings like get_fb_signature or list_library_blocks, but the given note is sufficient for correct selection.

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, and it does. It defines 'path' as 'Project file or directory' and 'search' as a 'Case-insensitive substring filter on the block name,' adding practical meaning beyond the bare string types in the schema. Format details are left to the output schema, but the essential semantics are provided.

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 opens with a specific verb and resource: 'List every function block the project uses, with the parameters it passes.' It further distinguishes itself from sibling tools like list_library_blocks by framing this as the project's actual 'practical coding vocabulary' and stating the vendor library is not exported, making this the only complete view for a project.

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 gives clear context: use it to see the blocks actually available in a project and their formal parameter names, because the vendor library is not exported as type definitions. However, it does not explicitly name alternative tools like list_library_blocks or search_library, nor does it state when not to use this tool, so the guidance is strong but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_languagesA

Report which IEC body languages this server can render, and how well.

Useful context for interpreting results: graphical bodies from the PLCopen XML export are complete, whereas the same logic recovered from an Extended export's .GE file is partial by design (see the server README).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden of behavioral disclosure. It adds meaningful context beyond the schema by explaining that results may be complete or partial depending on the export source, which directly affects how an agent should interpret the output. It does not explicitly state read-only behavior, but 'Report' strongly implies it.

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?

Two sentences with no filler. The primary purpose is front-loaded, and the second sentence adds valuable interpretive context without redundancy. Every sentence earns its place.

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 zero-parameter reporting tool with an output schema, the description is complete. It states what is reported, the quality dimension, and the key caveat about partial results. It also points to the README for deeper context, which is appropriate.

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 tool has zero parameters and schema description coverage is 100%, so there is nothing for the description to add about parameter meanings. The baseline of 4 applies because no parameter documentation is needed.

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 uses a specific verb ('Report') and names the exact resource ('which IEC body languages this server can render') plus the added dimension of quality ('and how well'). This clearly distinguishes it from sibling tools like list_library_blocks or get_pous, which address different resources.

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 useful interpretive context but does not explicitly state when to use this tool versus alternatives or when not to use it. The intended use is implied by the unique purpose, but there is no direct guidance about choosing it over sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_library_blocksA

List the function blocks the MotionWorks firmware library provides.

This is device documentation, not project state: it works without opening a project, and it includes blocks this project never uses. Use it to find out what is available before writing code.

Args: search: Case-insensitive substring filter on the block name. library: Filter by library, e.g. "YMotion" or "PLCopen". limit: Maximum number of blocks to return.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
searchNo
libraryNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/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 the behavioral trait of being device documentation independent of project state, but does not mention performance implications or that it might be a large list. It also doesn't discuss return details beyond the output schema, but gives context that it lists all blocks. This is adequate context beyond the basic 'list' action, but not exhaustive.

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 efficient with a clear verb and resource, and the paragraph about device documentation is front-loaded. The Args section is well-structured with each parameter on its own line, but the entire description is somewhat wordy; the purpose and usage could be tightened. Still, each sentence earns its place, so a 4 is appropriate.

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 is a simple read-only listing with an output schema, the description covers purpose, usage guidance, and parameter semantics. The output schema exists, so return details don't need explanation. However, it doesn't explicitly mention that the tool executes quickly or that it is safe, but that is implied by 'device documentation'. Minor gap: doesn't differentiate from list_fb_catalog clearly, but it mentions 'firmware library' which helps. Overall complete for its complexity.

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?

The schema has no descriptions for the three optional parameters (0% coverage), so the description compensates by explaining each: search as case-insensitive substring on block name, library as filter by library, limit as maximum count. This adds meaning but is largely straightforward from the parameter names. It does not describe the default behavior when parameters are empty, but the schema provides defaults. Baseline 3 is appropriate.

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 lists function blocks provided by the MotionWorks firmware library, distinguishing it from project state tools. It explicitly notes it is device documentation, which differentiates it from siblings like list_fb_catalog or search_library, and includes usage context about what it does not include.

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: to find out what is available before writing code, and that it works without opening a project. It contrasts with project state tools and mentions it includes blocks this project never uses, which is critical guidance for the agent to choose this over alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

load_projectA

Parse a PLCopen XML export and return a project summary.

Kept for parity with the studio5000 connector. open_project is preferred because it also finds the Extended and native sources.

Args: plcopen_xml_path: Path to a PLCopen XML file exported from MotionWorks IEC.

ParametersJSON Schema
NameRequiredDescriptionDefault
plcopen_xml_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are present, so the description carries the full burden. It discloses that this tool is limited to PLCopen XML only (implied by open_project finding 'Extended and native sources') and that it is kept for parity with a legacy connector. It doesn't mention mutation, but 'Parse and return summary' implies a read-only operation; the limitation and parity context add value beyond a simple one-liner.

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 efficient: a one-sentence purpose, a rationale for parity, and a clear parameter explanation. It front-loads the primary action and avoids fluff. Every sentence earns its place without redundancy.

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 there is an output schema (true), return values are presumably covered there, so the description need not repeat them. It covers the tool's function, limitation, and parameter semantics. A minor gap is that it doesn't describe what a 'project summary' includes, but that is likely in the output schema, keeping completeness 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?

Schema description coverage is 0%, but the description compensates fully by explicitly documenting the parameter in the 'Args:' section: 'plcopen_xml_path: Path to a PLCopen XML file exported from MotionWorks IEC.' This adds specific meaning (file path, export source) far beyond the bare schema type 'string'.

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?

States a specific verb ('Parse'), resource (PLCopen XML export), and output ('project summary'). Clearly differentiates from sibling 'open_project' by noting it is 'Kept for parity with the studio5000 connector' and that open_project is preferred, so an agent can distinguish them.

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 names the alternative (open_project) and gives the condition for preference: 'open_project is preferred because it also finds the Extended and native sources.' This tells the agent when to avoid this tool and why, leaving no ambiguity about usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_projectA

Open a MotionWorks IEC project, merging every export form present.

This is the entry point for every other tool. path may be a PLCopen XML file, an Extended IEC 61131-2 export directory, or a native project directory — the source is detected, not declared.

Returns the project summary plus a divergences list. Read that list: the exports are incomplete in different ways (an XML export can omit POUs that the Extended export has, or ship them with an empty body), so a divergence is often the most important thing about a project.

If you passed a native project (.mwt) with no export beside it, the response also carries an exportGuidance block. Its code lives in a compound binary, so no source, variables, types or I/O can be read. The block says exactly what is missing, what that costs you, the verbatim steps to produce each export, and — if exports exist elsewhere on disk — the path to the one matching this project. Relay those steps to the user rather than guessing at the code.

Args: path: File or directory to open.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description fully discloses behavioral traits. It explains that exports are merged and divergences are returned, highlighting that divergences are often the most important aspect. For native projects, it states that code lives in a compound binary, so no source, variables, types, or I/O can be read, and it provides exportGuidance with detailed instructions. This is exemplary transparency.

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 well-structured with the main purpose front-loaded, followed by essential behavioral details and special-case handling. While longer than some, every paragraph adds critical information for correct invocation and interpretation. It is appropriately sized for a complex entry-point 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?

The description covers what the tool does, what it returns (summary and divergences), how to interpret the divergences, and the special native-project scenario with exportGuidance. Given the complexity and the presence of an output schema, this is complete enough for an agent to use it correctly without further information.

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?

Despite schema description coverage being 0%, the description thoroughly explains the 'path' parameter by enumerating the three accepted formats (PLCopen XML, Extended IEC export directory, native project directory) and noting that the source is auto-detected. This adds significant meaning beyond the schema's bare string type.

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 opens a MotionWorks IEC project and merges all export forms. It identifies itself as the entry point for every other tool, distinguishing it from siblings like load_project. The verb, resource, and scope are explicit, and the path type detection is described.

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 it is the entry point for every other tool, giving strong guidance on when to use it. It also explains the accepted path types and the special case for native projects with no export, including how to handle exportGuidance. This is clear, actionable usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pingA

Health check — verify the server is running.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. 'Health check — verify the server is running' communicates that this is a non-mutating status probe. It doesn't detail response contents, but the output schema covers that.

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 exceptionally lean—five words of substance—and every word adds meaning. The 'Health check' label is front-loaded and the explanatory clause follows directly.

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 parameterless status probe with an output schema, this description is complete. It states the tool's purpose and implied read-only nature; nothing else is required to call it 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?

The tool has zero parameters, so parameter documentation is not needed. The baseline of 4 applies because there is no semantic gap for the description to fill.

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 uses a specific verb, 'verify,' and a clear resource, 'the server is running.' It also establishes the tool as a health check, which sets it apart from sibling tools like correlate_projects and trace_tag.

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 clearly implies when to call it: any time the agent needs to confirm the server is up. It doesn't contrast against alternatives, but none of the sibling tools are plausible substitutes for a health check, so no exclusion is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_pou_sourceA

Emit a POU in the shape MotionWorks' Extended IEC 61131-2 export uses.

Produces the (*@PROPERTIES_EX@ ... *) header, the PROGRAM/FUNCTION_BLOCK line, the declaration blocks and the (*@KEY@: WORKSHEET ... *) body region — the same structure the IDE writes when exporting a POU as text.

Whether the IDE imports this shape is not verified: that format is undocumented in the installed help, whose documented import path is PLCopen XML (File → Import → "Import PLCopen xml file"). So either create a POU in the IDE and paste the code, or wrap the result in PLCopen XML for the documented route.

Args: name: POU name. pou_type: "program", "function_block" or "function". language: Body language — "ST", "LD" or "FBD". declaration: The VAR blocks, without the closing END_* keyword. code: The Structured Text body. description: Free text stored in the POU's DESCRIPTION region.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNo
nameYes
languageNoST
pou_typeNoprogram
declarationNo
descriptionNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the output shape and the uncertainty about IDE import support, which is key behavioral context. It does not mention side effects (e.g., project modifications) or prerequisites (e.g., open project), but for a rendering tool these are likely minor. The limitation is clearly stated, showing 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 moderately long but each sentence adds value: purpose, structure details, caveat with alternatives, and parameter list. It is front-loaded with the primary purpose and flows logically. Slight improvement could be made with bullet points for parameters, but it remains concise relative to 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 6 parameters and an output schema, the description covers the output format, import caveat, and all parameter semantics. It provides enough for an agent to call it correctly, including how to handle the uncertain import path. The output schema itself presumably documents return values, so no omission is significant.

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 compensate. It lists all six parameters with precise meanings: name, pou_type (with enumerated values), language (with enumerated values), declaration (with clarification about missing END_*), code (body language), and description. This adds substantial meaning beyond the raw 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 states a specific verb ('Emit') and resource ('a POU') with a clear format ('MotionWorks' Extended IEC 61131-2 export'). It also details the output structure (header, declaration blocks, body region), which distinguishes it from render_type_source (for types) and other tools. The purpose is unambiguous.

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?

It provides context on when the output is appropriate: it matches the IDE's text export, and it explicitly warns that the IDE may not import this format, offering alternatives (paste or wrap in PLCopen XML). However, it does not explicitly state when to use this tool over siblings like render_type_source or list_languages, leaving some inference to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

render_type_sourceA

Emit a TYPE ... END_TYPE struct definition in MotionWorks' text shape.

Same caveat as render_pou_source: the structure matches what the IDE exports, but the documented import path is PLCopen XML.

Args: name: Type name. members: List of objects like {"name": "PartLength", "type": "LREAL", "comment": "mm"}. comment: Optional description stored in the DESCRIPTION region.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
commentNo
membersNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It usefully warns that the output matches IDE exports but the documented import path is PLCopen XML. However, it does not explicitly state whether the operation is read-only, whether it requires a loaded project, or whether there are 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is mostly concise and front-loaded with the purpose. The caveat referencing render_pou_source is relevant and compact. The Args section is clearly formatted and easy to parse, though the caveat might be slightly verbose for the value it adds.

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?

The description leaves ambiguity about whether the tool renders an existing type from the project or creates a new definition from provided members. It also does not mention prerequisites like loading a project, which is a significant gap given the siblings open_project/load_project exist. The optional members parameter further clouds this. The output schema may cover return values, but usage context is incomplete.

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?

Given 0% schema description coverage, the description compensates by explaining each parameter: name is the type name, members is a list of objects with a concrete example, and comment is an optional description stored in the DESCRIPTION region. The example for members adds valuable semantics, though it does not clarify optionality or whether additional fields are allowed.

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 opening sentence states a specific verb ('Emit') and resource ('TYPE ... END_TYPE struct definition') in a clear context ('MotionWorks' text shape'). This clearly distinguishes it from siblings like get_type/get_types, which would return structured data rather than source text.

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 does not explicitly state when to use this tool versus alternatives. The 'Same caveat as render_pou_source' line implies it is the type-focused analog, but it never names get_type/get_types or states when the source text is needed instead of the structured object. Usage is implied but not explicitly routed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_libraryA

Search the firmware library by block name, pin name, type or description.

Answers "which block do I use for X?" — searching names, formal parameters, descriptions, notes and example code, plus enumerated types and their values.

Args: query: Text to look for, e.g. "torque", "cam in", "BufferMode", "alarm". limit: Maximum number of matches.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

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 behavioral burden. It discloses what the search covers (names, formal parameters, descriptions, notes, example code, enumerated types) and includes example queries showing breadth. It does not mention side effects (search implies read-only), but that is implicitly safe. It does not discuss performance or limits beyond the 'limit' parameter, which is documented. Overall, it gives a solid behavioral picture.

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 front-loaded with the primary purpose in the first sentence, then a clarifying purpose statement, then a structured 'Args:' section. It is economical, though the enumeration of search fields is repeated (first sentence lists some, second sentence expands), causing slight redundancy. Still, it is compact and scannable.

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?

For a search tool with two simple parameters, the description covers the core behavior, search targets, and parameter meanings. An output schema exists, so return format is presumably defined there. It omits edge-case behavior (case sensitivity, wildcard support, pagination beyond limit), but for a straightforward search tool this is adequate. The example queries add practical context that helps an agent use it 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: for 'query' it provides a type ('Text to look for') and concrete examples ('torque', 'cam in', 'BufferMode', 'alarm'); for 'limit' it says 'Maximum number of matches', clarifying its meaning. Both parameters are covered, though default value (40) is not mentioned in the description (it is in the schema). This adds significant value over 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 states a specific verb ('search') and resource ('firmware library'), enumerates the search fields (block name, pin name, type, description, formal parameters, notes, example code, enumerated types), and explicitly frames the intended use case: 'Answers "which block do I use for X?"'. This clearly distinguishes it from siblings like list_library_blocks (listing all blocks) and search_logic (searching logic contexts).

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 gives a clear usage context: 'Search the firmware library by block name, pin name, type or description' and the purpose answer for 'which block do I use for X?'. It does not explicitly name alternatives or say when not to use it (e.g., for logic-specific searches, use search_logic), but the context is sufficient for an agent to infer typical use. Lacks explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_logicA

Search for a tag, block or regex across every POU and network.

Answers "where is this used?" and "which routines call this block?". Matches symbol-table entries (declarations, block types, instances, pins) first, then raw Structured Text lines, so both a tag name and a regex work.

Note the pattern is an ordinary regex, so MC_ matches every MC_* block reference (the underscore is literal, and MC_\d+ would require digits after it and so match nothing).

Args: path: Project file or directory. pattern: Tag name, block name, or regex pattern. limit: Maximum number of matches to return.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
limitNo
patternYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, and it delivers: it discloses the two-phase match ordering (symbol-table entries first, then raw Structured Text lines) and explains the plain-regex-vs-glob gotcha with a concrete example. Minor gaps remain — no explicit read-only statement and no behavior on zero matches — but the non-obvious semantics are genuinely surfaced.

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 purpose is front-loaded in the first sentence, followed by usage context, search-order disclosure, and the regex caveat before a compact Args block. The regex note is slightly verbose and its example is project-specific, but every sentence contributes value and nothing is filler.

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?

An output schema exists, so return values need no explanation. The description covers search scope, match ordering, regex semantics, and all parameters — a complete picture for a search tool of this complexity. It would benefit from a read-only safety hint and no-match behavior, but given zero annotations, the description handles the core burden well.

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 fully compensate, and it does. The Args section documents all three parameters with real semantics: path's target type, pattern's accepted forms (tag name, block name, or regex), and limit's meaning (maximum number of matches). The pattern parameter receives especially valuable interpretation guidance.

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 first sentence states a precise action — 'Search for a tag, block or regex across every POU and network' — with a defined scope that distinguishes it from the sibling search_library (which targets libraries, not POUs/networks). The question-answering framing ('where is this used?', 'which routines call this block?') reinforces its specific role in code navigation.

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 gives clear usage context by posing the exact questions it resolves ('where is this used?' and 'which routines call this block?'), which tells an agent when to reach for it. However, it never names alternatives or states exclusions, so an agent facing siblings like search_library or get_tag must infer the boundary from scope wording rather than being routed explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_pouA

Validate agent-written IEC code against the project's real symbols.

Call this on generated code before handing it to a user. It catches the mistakes an LLM actually makes: tags that do not exist in the project, types that are not defined, function blocks that are not in the library, and formal parameter names that the target block does not have.

Args: path: Project file or directory. code: The Structured Text body to check (no declaration blocks). declared_vars: Any VAR blocks the code relies on, so locally declared symbols are not reported as undeclared. pou_name: Optional name, used only for labelling the result.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
pathYes
pou_nameNo
declared_varsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It discloses that validation checks non-existent tags, undefined types, unavailable function blocks, and incorrect formal parameter names, and that declared_vars suppresses false positives for local symbols. It does not state whether the operation is read-only or requires an open project, but the 'validate' phrasing implies no mutation.

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?

Front-loaded purpose, then usage guidance, then a compact Args list. Every sentence earns its place, with no repetition of schema defaults or boilerplate. The formatting is scannable for an 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?

The description covers the core input semantics and the scenarios it handles. Since an output schema exists, return-value explanation is not required. It omits explicit mention that a project must be open/loaded before validation, but 'against the project's real symbols' implies that dependency. Minor gap only.

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%, but the description's Args section fully compensates: it explains the meaning and constraints of every parameter, including that code must contain no declaration blocks, declared_vars prevents false undeclared errors, and pou_name is only for labeling. This is strong added 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?

Description opens with a specific verb+resource: 'Validate agent-written IEC code against the project's real symbols.' It clearly identifies what the tool does and distinguishes it from sibling read/list/search/render tools by focusing on validation of generated code.

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?

Explicitly tells the agent when to use it: 'Call this on generated code *before* handing it to a user.' It also explains what kinds of LLM mistakes it catches, which clarifies the intended scenario. It does not mention exclusions or alternatives, but the usage context is clear.

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.

  1. 28 tool updatesv0.1.0
    • First observedget_code_conventions
    • First observedget_fb_signature
    • First observedget_io_config
    • First observedget_library_reference_status
    • First observedget_motion_config
    • First observedget_pou
    • First observedget_pous
    • First observedget_routine
    • First observedget_routines
    • First observedget_sources
    • First observedget_tag
    • First observedget_tags
    • First observedget_tasks
    • First observedget_type
    • First observedget_types
    • First observedget_udt
    • First observedget_udts
    • First observedlist_fb_catalog
    • First observedlist_languages
    • First observedlist_library_blocks
    • First observedload_project
    • First observedopen_project
    • First observedping
    • First observedrender_pou_source
    • First observedrender_type_source
    • First observedsearch_library
    • First observedsearch_logic
    • First observedvalidate_pou

TDQS

A3.5/5.0

Scored across 28 tools

Disambiguation3/5

Several tools have overlapping boundaries: get_udt/get_udts/get_type/get_types all deal with type definitions, get_routine/get_routines are aliases for get_pou/get_pous, and list_library_blocks/list_fb_catalog both list function blocks. The descriptions usually clarify which one is intended, but an agent must read carefully to pick the right tool.

Naming Consistency3/5

Naming is mostly lowercase snake_case verb_noun, but the verb set is inconsistent: reads mix get_ (get_pous, get_types) with list_ (list_library_blocks, list_fb_catalog), and there are open_/load_/ping/validate_/render_ actions. The core get_* pattern is recognizable, so it remains readable but not fully predictable.

Tool Count2/5

28 tools is over the 25-tool heavy threshold, and the count is inflated by redundant aliases (get_routine/get_routines), a parity loader (load_project), and overlapping type-list tools. A leaner set of roughly 20 distinct operations could cover the same domain without losing real capability.

Completeness4/5

For an analysis/code-generation server, coverage is strong: project opening, source-form diagnostics, tags, types, POUs, tasks, I/O, motion, library search, validation, and source rendering are all present. The main gap is the absence of any project-write or import operation, but that appears intentional since edits are expected through the IDE.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    F
    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
    37
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables AI agents to discover, inspect, edit, rebuild, and save Schneider Electric RemoteConnect and SCADAPack x70 IEC logic projects, including program sections, hardware, variables, and Modbus configuration.
    63
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    Lets AI agents and users analyze Mitsubishi MELSEC .gx3 projects directly, tracing coil conditions, checking device references, comparing program changes, and inspecting ladder logic without opening GX Works3.
    13
    3
    -