Sigmatek LASAL MCP Server
The Sigmatek LASAL MCP Server enables AI assistants to automate the full Sigmatek LASAL engineering workflow for PLC and HMI development — from project inspection and code editing to compilation, deployment, and live runtime control.
Project Management
Select the active LASAL project directory and resolve project files
Inspect CLASS 2 project structure: classes, networks, objects, channels, and connections
Inspect VISUDesigner HMI projects: stations, datapoints, text lists, and schemes
Source Code & Structural Editing
Read and write Structured Text (
.st) and header (.h) files for CLASS 2 classesApply transactional structural changes: create/delete/rename networks, add/remove/rename objects, connect/disconnect channels, set init values, and delete classes — with rollback support
IDE Control
Open and close the LASAL CLASS 2 and VISUDesigner IDEs
Build & Deployment
Compile CLASS 2 projects in configurable modes (RebuildAll, BuildChanges, etc.) and retrieve compiler logs, errors, and warnings
Download compiled projects to target PLCs over TCP
Set target PLC/HMI IP addresses in project configuration
Run a full deploy pipeline in one call: compile → download to PLC → update VISUDesigner stations → optionally download to HMI
PLC Runtime Control
Start, stop, and query the runtime state of a PLC (Running, Stopped, Offline)
Read and write live channel values on a running PLC
VISUDesigner (HMI) Automation
Apply headless HMI changes: sync datapoints, manage text lists and translations (CSV import/export), configure schemes, manage media assets, add/remove code modules, and edit datapoint/datatype properties
Download VISUDesigner projects to HMI devices
HMI Simulation & Diagnostics
Start/stop a local HMI web runtime (LasalVISUDataService) and automate testing via headless browser
Access PLC diagnostics: tracing, file transfer, and static code analysis
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Sigmatek LASAL MCP ServerCompile and download the PLC project to the target hardware."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Sigmatek LASAL MCP Server
A Model Context Protocol (MCP) server for automating the Sigmatek LASAL software suite. It gives AI coding assistants (Claude, Gemini, Cursor, etc.) the ability to compile, deploy to hardware, control PLCs, read/write live values, run HMI simulations, and automate a headless browser — while the agent edits project files directly.
Warning: This is NOT an official Sigmatek product. This project is in active development — bugs and unpredictable behavior are likely. Do not use on production projects without backups or version control.
Design Philosophy
The MCP only exposes tools for operations that require an external engine or hardware — compiling, deploying, PLC control, browser automation. For everything else (reading/editing .st, .lcp, .lcn, .lss, .lvp, dashboard JSON), the AI agent works with the files directly using its native file tools. This keeps the tool set small, reliable, and focused.
Related MCP server: tiacommander-mcp
Features
Build & Deploy: Compile CLASS 2 projects, download to PLC, full deploy pipelines.
PLC Control: Start/stop PLC runtime, read/write live channel values, query state.
Local Simulation (LARS): Run one LASAL program per LARS instance — one workspace per station (PLC + HMI) so both run simultaneously on separate ports. Point stations at the local runtime with a single call, compile/download/start/read values exactly like a real PLC, and browse the HMI via DataService. No hardware needed.
CLASS 2 Batch Engine: Create/delete networks, add/remove objects, manage connections, configure tasks — operations that require the CLASS 2 scripting engine.
VISUDesigner Engine: Sync datapoints, manage text lists/schemes/media, publish, download to HMI.
HMI Simulation: Local web runtime via LasalVISUDataService with headless Edge browser automation for visual verification.
PLC Diagnostics: Tracing, file transfer, static code analysis.
Project Guide: Built-in resource (
lasal://guide) documenting all LASAL file formats so the agent can edit project files directly.
Prerequisites
Windows OS (Sigmatek LASAL suite runs exclusively on Windows).
Node.js v18 or higher.
Sigmatek LASAL Suite:
LASAL CLASS 2 (PLC engineering).
VISUDesigner (HMI design).
Quick Start (with npx)
No repository clone or build required — configure your favorite MCP client to run directly via npx:
Claude Desktop
Add to %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"lasal-mcp": {
"command": "npx",
"args": ["-y", "lasal-mcp"]
}
}
}Cursor
Add to your project's .cursor/mcp.json (or global Cursor MCP settings):
{
"mcpServers": {
"lasal-mcp": {
"command": "npx",
"args": ["-y", "lasal-mcp"]
}
}
}Claude Code
Run:
claude mcp add lasal-mcp npx -y lasal-mcpLocal Installation & Setup (for Developers)
git clone https://github.com/Svel26/Lasal-MCP.git
cd Lasal-MCP
npm install
npm run buildWhen running from a local clone, point your MCP client to:
{
"mcpServers": {
"lasal-mcp": {
"command": "node",
"args": ["C:/path/to/Lasal-MCP/dist/server.js"]
}
}
}Configuration
Environment Variables
Variable | Default | Purpose |
|
| CLASS 2 IDE path |
|
| VISUDesigner path |
| auto-discovered (latest version) | DataService path |
| auto-discovered | Edge browser path |
|
| Compile timeout (ms) |
|
| Download timeout (ms) |
|
| Visu operation timeout (ms) |
|
| Script execution timeout (ms) |
|
| LARS runtime path |
|
| LARS workspace config file |
|
| Local HMI runtime directory |
|
| Hours before temp files are cleaned |
Available Tools
Engine & Hardware Tools (MCP)
Tool | Description |
| Set the active project root directory. |
| Check project, stations, engines, processes, HMI health. |
| Open or close the CLASS 2 IDE. |
| Open or close VISUDesigner. |
| Compile or download to PLC. |
| Start, stop, or query PLC runtime state. |
| Read/write live channel values on a running PLC. |
| Local LARS simulation: list/setup workspaces per station, start/stop, point stations at LARS ( |
| CLASS 2 batch engine operations (networks, objects, connections, tasks). |
| VISUDesigner engine operations (text lists, schemes, media, publish, download). |
| Start/stop local HMI web simulation (DataService). |
| Headless Edge browser for HMI testing and screenshots. |
| Tracing, file transfer, static code analysis. |
| Full pipeline: compile → download → start PLC → sync visu → start HMI. |
Direct File Editing (no MCP needed)
The agent edits these files directly with its native file tools:
File | Format | Encoding | What it contains |
| XML | latin1 | Solution — lists all stations |
| XML | latin1 | Station settings — target IP, project references |
| XML | latin1 | CLASS 2 project manifest — class and network file paths |
| XML + ST | latin1 | Class source — XML header + Structured Text body |
| XML | latin1 | Network definitions — objects, connections, init values |
| Mixed | utf-8 | VISUDesigner project manifest |
Dashboard JSON | JSON | utf-8 | HMI dashboards, windows, controls, property bindings |
See the built-in lasal://guide resource for detailed file format documentation.
Development
npm run dev # Watch mode
npm test # Run tests (Vitest)
npm run test:watch # Tests in watch mode
npm run lint # ESLint
npm run format # Prettier
npm run inspector # MCP Inspector for interactive debuggingSimulating without hardware (LARS)
LARS (LASAL Runtime System) runs LASAL programs on a normal PC. Since each LARS instance runs one program, the MCP creates one workspace per station:
lars_runtime setup— creates workspaces for every station in the selected solution (distinct ports per instance).lars_runtime start <station>— launches the LARS window for that station.lars_runtime set_station_target <station>— points the station's.lssat the LARS instance.Now
build_project,control_plc, andplc_valueswork unchanged against the local runtime.lars_runtime restore <station>— reverts the.lssto the real hardware target.
Notes:
Projects compiled for
Processor="ARM"(most machine PLCs) needlars_runtime target_pcfirst — LARS is an x86 runtime and rejects ARM images.HMI panel / Local stations are already PC-targeted and work directly.
Downloads to LARS automatically include the PC loader (
addLoaderAnyway).hmi_runtimeremaps published stations.json entries to running LARS instances, so the web HMI talks to the local simulation.
Contributing
Contributions are welcome! Please check out CONTRIBUTING.md for guidelines on code standards, adding tools, and submitting pull requests.
Releasing & CI/CD
Automated releases and publishing to npm are powered by GitHub Actions. Releases can be triggered manually via workflow dispatch with automated version bumping or by pushing version tags (v*.*.*).
License
This project is licensed under the MIT License.
Available Tools
14 toolsapply_project_changesA
Run CLASS 2 batch engine operations that cannot be done by editing files directly: create/delete/rename networks, add/remove/rename objects, create/delete connections, set init values, configure tasks, compile, download. Kills CLASS 2 IDE before running.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Validate operations without applying them. | |
| lcp_path | No | Absolute path to the .lcp file. Omit to use the currently selected project. | |
| operations | Yes | Ordered list of CLASS 2 batch engine operations. Available types: create_network, delete_network, rename_network, duplicate_network, add_object, remove_object, rename_object, change_object_class, create_connection, delete_connection, set_init_value, delete_class, compile, download, set_task_order, set_task_time, set_task_cpu_core, set_multi_cpu_core, set_visualized_flag, set_comment_network, set_comment_object, set_network_options, reset_network_options, move_network_to_folder, set_parameter_value |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It explicitly discloses a significant side effect: 'Kills CLASS 2 IDE before running.' This is critical behavioral information. It also implies the tool modifies project state (batch operations). It does not disclose reversibility or other side effects, but the IDE kill is a major disclosure that goes beyond typical expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, with the purpose and scope front-loaded. The first sentence states the primary function and lists representative operations; the second sentence warns about the IDE kill. There is no fluff or redundant content. It is efficient and well-structured for an agent scanning descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (25 operation types, nested oneOf schema), the description provides the essential high-level context and the critical side effect. The schema carries detailed parameter information, so the description does not need to enumerate every operation. It might mention that operations are applied in order, but the schema already labels the array as 'Ordered list'. The description is sufficient for an agent to understand the tool's role and its main hazard.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the three top-level parameters (dry_run, lcp_path, operations). The schema already documents these, including a description for operations listing all available types. The tool description adds minimal extra meaning—it lists examples of operations, but these are already present in the schema. Thus, the description does not significantly augment parameter understanding beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to run CLASS 2 batch engine operations. It lists specific operation categories (create/delete/rename networks, add/remove/rename objects, etc.) which distinguishes it from editing files directly. The verb 'Run' and resource 'CLASS 2 batch engine operations' are specific and unambiguous, and the scope is well-defined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear usage condition: operations that cannot be done by editing files directly. This implies when to use this tool versus file editing. It does not explicitly name sibling tools like build_project or manage_class2, but the condition is a reasonable guideline. The mention of killing the IDE also warns about a side effect that affects when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
build_projectA
Compile the CLASS 2 project or download it to the PLC. Compilation kills CLASS 2 IDE. Download pings the PLC first.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | 'compile' builds the project; 'download' transfers it to the PLC. | |
| options | No | Compile mode (compile only). RebuildAll is safest; BuildChanges is faster for incremental work. | RebuildAll |
| lcp_path | No | Absolute path to the .lcp file. Omit to use the selected project. | |
| timeout_s | No | Timeout in seconds for compile or download. Omit for default (600s). | |
| connection | No | Connection string (e.g. 'TCPIP:192.168.1.100') or address-book name (download only). Omit to use the connection saved in the .lss file. | |
| add_loader_anyway | No | Force loader download even if the target OS already has a compatible loader (download only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses important side effects: compilation kills the CLASS 2 IDE and download pings the PLC first. However, it does not explain consequences of ping failure, loader behavior, or whether state changes are reversible, leaving some behavioral aspects undocumented.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Very concise and front-loaded. The core purpose is stated in the first sentence, followed by clear behavioral warnings. No redundant or extraneous content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequately covers inputs and key side effects, but with no output schema it does not describe expected return values, success/failure indications, or error handling. Given the moderate complexity and multiple parameters, this leaves some contextual gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema descriptions already cover all parameters, and the description adds useful semantic details such as 'compile only', 'download only', default timeout, and using the connection saved in the .lss file. This enriches parameter understanding beyond the basic schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action: compiles a CLASS 2 project or downloads it to the PLC, clearly distinguishing the two main operations. The resource and verbs are explicit and differentiate this tool from related siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Describes what the tool does but provides no explicit guidance on when to choose this tool over alternatives like apply_project_changes, deploy_all, or manage_class2. No use cases or selection criteria are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
control_plcA
Start, stop, or query PLC runtime state. Pings the target PLC before start/stop.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | 'start' runs the PLC project; 'stop' halts it; 'get_state' queries its current state. | |
| lcp_path | No | Absolute path to the .lcp file. Omit to use the selected project. | |
| connection | No | Connection string or address-book name. Omit to use the project's saved connection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the additional behavior of pinging the target PLC before start/stop. However, it does not describe error handling or side effects, which would be expected without annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences, with the primary action stated first and the additional behavioral detail in the second sentence. No unnecessary content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with a single action parameter, and the description covers the core functionality. It doesn't specify return values, but given no output schema, that is not a major gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full descriptions for all parameters, and the tool description does not add further semantic context beyond what is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Start, stop, or query') and a clear object ('PLC runtime state'), making it distinct from sibling tools that deal with values, diagnostics, or project management.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the tool's purpose but does not explicitly mention when to prefer this over sibling tools like lasal_status or plc_values. The ping note is more of a behavioral detail than a usage guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deploy_allA
Full deploy pipeline: compile → download PLC → start PLC → verify state → update Visu stations → download Visu → start HMI runtime. Each step is optional via flags.
| Name | Required | Description | Default |
|---|---|---|---|
| compile | No | Compile the CLASS 2 project. Default true. | |
| lcp_path | No | Absolute path to the .lcp file. Omit to use the selected project. | |
| lvp_path | No | Absolute path to the .lvp file. Omit to auto-detect from the selected project. | |
| start_plc | No | Start the PLC runtime after a successful download. Default true. | |
| timeout_s | No | Timeout override in seconds for compile and download steps. | |
| download_plc | No | Download the compiled CLASS 2 project to the PLC. Default true. | |
| download_visu | No | Download the VISUDesigner project to the HMI after updating stations. Requires visu_connection. Default false. | |
| add_plc_loader | No | Force loader download to PLC even if the target already has a compatible loader. | |
| plc_connection | No | PLC connection string (e.g. 'TCPIP:192.168.1.100'). Omit to use the connection saved in the project's .lss file. | |
| compile_options | No | Compile mode. RebuildAll is safest; BuildChanges is faster for incremental work. | RebuildAll |
| visu_connection | No | HMI connection string (e.g. 'TCPIP:192.168.1.100'). Required when download_visu is true. | |
| add_visu_runtime | No | Force runtime download to HMI even if the version already matches. | |
| start_hmi_runtime | No | Start the local HMI runtime (DataService) and copy HMI files after a successful compilation/update. Default false. | |
| visu_download_flags | No | VISUDesigner download mode: 0=normal (default), 1=changes only, 2=publish+download changes. | |
| update_visu_stations | No | Run update_all_stations on the VISUDesigner project to sync datapoints after CLASS 2 changes. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description transparently lists the main side effects (downloading to PLC, starting PLC, downloading Visu, starting HMI runtime, updating stations). Since no annotations are provided, the description carries the burden, and it does so reasonably well, though it does not explicitly warn about overwriting target systems.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the pipeline sequence and immediately notes that every step is optional. It is concise and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema (15 parameters, all described), the brief description is sufficient to convey the overall purpose and flow. It does not need to repeat parameter details, and the pipeline steps align well with the boolean flags in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides descriptions for 100% of parameters, so the baseline applies. The description itself adds little beyond the schema, but the schema's parameter descriptions are detailed and sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a full deploy pipeline and enumerates the exact sequence of steps it performs (compile, download PLC, start PLC, verify state, update Visu stations, download Visu, start HMI runtime). This distinguishes it from the individual sibling tools that handle only one step.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context: it is a full deployment pipeline, and each step is optional via flags, making it suitable for both full and partial deployments. It does not explicitly name alternative single-step tools, but the pipeline nature is clear enough for an agent to infer when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hmi_browserA
Automate a headless Edge browser to test the HMI. Actions: open (navigate), screenshot (capture viewport or element), console (read logs/errors), eval (run JS), click, type, wait, close. ALWAYS use this after deploy to visually verify the HMI works.
| Name | Required | Description | Default |
|---|---|---|---|
| x | No | X coordinate for mouse click. | |
| y | No | Y coordinate for mouse click. | |
| ms | No | Milliseconds to wait (wait action only). | |
| url | No | URL to navigate to (open action only). Defaults to the live HMI panel (http://<hmi-station-ip>/) when reachable, else the local HMI runtime URL. | |
| text | No | Text content to type, or to find for clicking. | |
| clear | No | Clear the console/error buffers after reading them (console action only). | |
| action | Yes | Action to perform in the HMI browser session. | |
| fullPage | No | Take a full page screenshot (screenshot action only). | |
| selector | No | CSS/Text selector to screenshot, click, type, or wait for. | |
| viewport | No | Browser viewport size (open action only). Defaults to 1200x800. | |
| expression | No | JavaScript expression to evaluate (eval action only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description bears the full burden. It transparently lists all supported actions (open, screenshot, console, eval, click, type, wait, close) and clarifies that it runs headless. It does not detail side effects like session cleanup or potential interference, but the action list gives a clear behavioral model.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, a single paragraph that lists actions and includes a high-priority usage directive. Every sentence adds value; there is no fluff or redundancy. The structure is clean and immediately readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While no output schema is provided, the action names imply return types (e.g., screenshot returns an image, console returns logs). The description does not explicitly state return formats, but the tool's purpose and action list provide enough context for an agent to use it correctly in most scenarios.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters with descriptions. Each parameter is tied to specific actions (e.g., 'url' for open, 'clear' for console, 'expression' for eval), adding meaningful context beyond the schema structure. The nested 'viewport' object is also described, making the semantics clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: automating a headless Edge browser to test the HMI. It lists specific actions and gives a concrete directive ('ALWAYS use this after deploy'), which distinguishes it from sibling tools like hmi_runtime or visu_project that focus on the runtime environment rather than browser-based visual verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use the tool ('ALWAYS use this after deploy to visually verify the HMI works'), providing strong contextual guidance. It does not mention alternatives or when not to use it, but the explicit directive covers the primary scenario sufficiently.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hmi_runtimeA
Start, stop, or check the local HMI web simulation (LasalVISUDataService). Publishes the project, copies webroot, and spawns the DataService. Use hmi_browser to interact with it afterwards.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | Action to perform on the HMI runtime DataService. | |
| lvp_path | No | Absolute path to the .lvp file. Omit to use the currently selected project. | |
| debugPublish | No | Use debug publish (requires TypeScript project support). Fallback to standard publish on failure. Default true. | |
| publishFirst | No | Publish the project before starting the DataService. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description must disclose side effects. It explicitly mentions publishing, copying webroot, and spawning the DataService, which are relevant side effects. Does not mention potential cleanup on stop, but acceptable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no redundant information, well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete for the tool's purpose; no output schema, so no need to explain returns. Mentions service name and interaction pointer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all parameters with descriptions; description adds no additional semantics beyond restating publishFirst. Baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (start/stop/check), the resource (local HMI web simulation, LasalVISUDataService), and differentiates from hmi_browser by pointing to it for interaction. Clear and specific.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a hint to use hmi_browser for interaction after starting, but does not explicitly compare with lars_runtime or other management tools. Implicit usage context is clear, but explicit differentiation is lacking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lars_runtimeA
Manage local LARS (LASAL Runtime System) simulation instances. LARS runs one program per instance — use one workspace per station (PLC + HMI) so both run simultaneously on separate ports. Actions: list (auto-cleans stale workspaces), setup (create workspaces for all stations), start (auto-creates the workspace if the station is known but unconfigured), stop, remove, gc (lazy cleanup of unreferenced workspaces), set_station_target (point a station's .lss at its LARS instance), restore (revert .lss to the real target. After set_station_target, build_project/control_plc/plc_values/deploy_all operate on the LARS instance automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | LARS workspace name (e.g. 'VisuPalletizer_PLC'). Required for start/stop/remove/set_station_target/restore when station is omitted. | |
| action | Yes | 'list' shows all configured LARS workspaces and their state (auto-cleans stale ones). 'setup' creates/updates LARS workspaces for the selected project's stations (or one station/lcp. 'start' launches a LARS instance (auto-creates the workspace first if the station is known but unconfigured), 'stop' terminates it, 'remove' deletes its workspace config. 'gc' runs lazy garbage collection: deletes auto-created workspaces that are not running and no longer referenced by any station .lss or published DataService stations.json. 'set_station_target' points a station's .lss at its LARS instance (127.0.0.1:<port>); 'restore' reverts to the saved real target. 'target_pc' switches an ARM-compiled .lcp to the PC (x86) compile target LARS requires (restore via 'restore'). | |
| dry_run | No | With action 'gc': report what would be removed without deleting anything. Default false. | |
| station | No | Station name from the solution (e.g. 'PLC', 'HMI', 'Local'). Picks the matching workspace. Mutually exclusive with name. | |
| lcp_path | No | Absolute path to a .lcp to create a workspace for (setup only, when no station name is usable). | |
| min_age_h | No | With action 'gc': only delete workspaces unreferenced for at least this many hours (overrides LASAL_MCP_LARS_GC_MIN_AGE_H; 0 = immediately. | |
| project_dir | No | Solution directory to auto-detect stations from (setup/list only. Defaults to the selected project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly discloses side effects and destructive behaviors: list auto-cleans stale workspaces, start auto-creates workspaces, remove deletes workspace configs, gc deletes unreferenced workspaces (with a dry_run option to preview), set_station_target modifies .lss files, and target_pc switches compile targets. Even though no annotations are provided, the description carries the full burden and does so thoroughly, including the lazy cleanup behavior and the fact that changes alter station configuration.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense, with a clear structure: an overall purpose sentence, a key architectural note (one workspace per station), and a colon-separated action list. Each sentence earns its place, though the repetition of action names in the initial summary and the action enum description is slightly redundant. It's not overly verbose for the complexity of the tool, but a more compact phrasing could improve clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the tool's role within the broader ecosystem (e.g., interaction with build_project and deploy_all after set_station_target, the port separation between PLC and HMI). It also explains the purpose of the less obvious actions like target_pc and restore. There is no output schema, so return values are not specified, but the description is sufficient for an agent to understand when and why to call this tool and what side effects to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already provides descriptions for all seven parameters (100% coverage), so the baseline is 3. The tool description adds extra meaning beyond the schema: it explains the action parameter's semantics in detail (e.g., the auto-clean behavior of list, the auto-create behavior of start, and the lazy criteria for gc). This enrichment of parameter meaning, especially for action with its eight enum values, justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: managing local LARS simulation instances, with a specific note about one workspace per station (PLC + HMI) running on separate ports. The list of actions (list, setup, start, stop, remove, gc, etc.) immediately distinguishes this from sibling tools like control_plc or hmi_runtime, which focus on other aspects of the runtime environment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides usage context for each action (e.g., 'start' auto-creates the workspace if unconfigured, 'gc' runs lazy garbage collection with specific retention rules). It also explains a cross-tool interaction: after set_station_target, build_project/control_plc/plc_values/deploy_all operate on the LARS instance. While it doesn't explicitly contrast with every sibling, the action semantics and the note about when to use this tool relative to others are clear enough for an agent to decide when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lasal_statusA
Check project selection, station discovery, PLC/HMI reachability, engine paths, running processes, and HMI runtime health. Call to orient or diagnose connection issues.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since there are no annotations provided, the description carries the burden of transparency. It describes the tool as a check/status operation, implying read-only behavior without side effects. While it does not explicitly state 'read-only' or list potential side effects, the nature of the checks strongly suggests it is safe and non-mutating.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, covering the tool's functionality and usage in a single sentence. It lists the key checks without unnecessary detail, and it is well-structured for quick comprehension by an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of parameters and output schema, the description provides sufficient context for an agent to understand what the tool does and when to call it. It does not describe return values or prerequisites, but these are not necessary for a status-check tool. The description is complete enough for its purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has no parameters, so there is nothing for the description to add beyond the empty schema. The baseline for 0 parameters is 4, and the description adequately conveys that no input is required. No additional parameter information is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: checking project selection, station discovery, PLC/HMI reachability, engine paths, running processes, and HMI runtime health. It also differentiates itself by indicating it is for orientation and diagnosing connection issues, which distinguishes it from sibling tools that perform other actions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use the tool: 'Call to orient or diagnose connection issues.' This is a clear usage scenario, though it does not name specific alternative tools. The context of sibling tools implies that this is the go-to for status checks, which is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_class2A
Open or close the LASAL CLASS 2 IDE GUI. Close before running batch operations.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | 'open' launches LASAL CLASS 2; 'close' kills it. | |
| lcp_path | No | Full path to the .lcp station file to open (open only). Omit to auto-detect from the selected project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the primary behavior (open/close) and hints at a side effect (interference with batch operations if left open). However, it does not detail potential consequences like unsaved data loss, process termination, or confirmation prompts, and there are no annotations to supplement this.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, using only two sentences to convey purpose and a usage warning. It is well-structured and front-loaded, with no unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete enough for the agent to know when and why to use the tool, especially with the batch operation warning. It does not mention return values or output, but since there is no output schema, this omission is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The main description adds no additional meaning to the parameters beyond what is already in the schema. The schema covers both 'action' and 'lcp_path' with clear descriptions, so the baseline is appropriate; no extra parameter guidance is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: to open or close the LASAL CLASS 2 IDE GUI. It uses a specific verb ('open or close') and names the resource exactly, differentiating it from sibling tools like manage_visudesigner.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides direct guidance on when to use the tool (open/close the IDE) and includes a specific caution: 'Close before running batch operations.' This gives the agent a practical condition, though it does not explicitly compare with alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_visudesignerA
Open or close the VISUDesigner GUI. Close before running automated visu operations.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | 'open' launches VISUDesigner; 'close' kills it. | |
| lvp_path | No | Full path to the .lvp station file to open (open only). Omit to auto-detect from the selected project. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the burden. It states the actions (open/close) and gives a reason for closing (before automated operations). However, it does not disclose potential side effects like unsaved changes being lost or the process being killed abruptly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise, with the purpose stated in the first sentence and usage guidance in the second. No fluff, front-loaded information, and easy to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple open/close tool with no output schema, the description provides sufficient context: what it does, when to use it (close before automated ops), and the parameters. It could mention the necessity of a project being selected, but that is inferable from the sibling tool 'select_project' and the optional 'lvp_path'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully describes both parameters: 'action' with enum values and 'lvp_path' with a clear purpose. The main description adds context for when 'lvp_path' should be omitted. Since schema coverage is 100% and descriptions are meaningful, this is above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Open or close the VISUDesigner GUI.' It identifies the specific resource (VISUDesigner GUI) and the action (open/close), distinguishing it from sibling tools like build_project or deploy_all.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: 'Close before running automated visu operations.' This tells the agent when to use the 'close' action. The open action is implied as the natural counterpart. Could be slightly more explicit about when opening is needed, but the guidance is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plc_diagnosticsB
Run PLC diagnostics: trace recording, file upload/download/delete on PLC, or static code analysis.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | PLC diagnostics/maintenance action to perform. | |
| lcp_path | No | Absolute path to the .lcp file. Omit to use the currently selected project. | |
| plc_path | No | File path on the PLC (for file upload/download/delete). | |
| connection | No | PLC connection string. Omit to use connection from project's .lss file. | |
| local_path | No | Local file path on the host (for file upload/download). | |
| config_path | No | Absolute path to the DataAnalyzer config file (trace action only). | |
| duration_ms | No | Duration in milliseconds to run the trace (trace action only). Default 5000. | |
| output_path | No | Destination path for the trace output or code analysis result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for disclosing behavior. It does not mention that actions like file_delete or file_upload modify or delete data, nor does it warn about potential side effects or required permissions. The description is neutral and lacks transparency about the impact of certain actions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence that efficiently lists the three diagnostic categories without unnecessary words. It is well-structured and immediately understandable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the schema fully documents all parameters and there is no output schema, the description does not need to explain return values. However, because the tool combines multiple actions (trace, file ops, code analysis), a bit more contextual guidance on when each action applies would improve completeness, but it is not strictly required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters with descriptions, so the baseline is 3. The description adds no extra meaning beyond the schema, but since the schema is fully documented, it meets the minimum standard.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool runs PLC diagnostics and enumerates three categories: trace recording, file operations, and static code analysis. It is specific enough to understand the tool's primary function, though it does not explicitly differentiate from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a general purpose but offers no explicit guidance on when to use this tool versus alternatives. There is no mention of prerequisites, conditions, or exclusions for using the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plc_valuesA
Read or write live channel values on a running PLC. Channels use 'ObjectName.ChannelName' format. Auto-coerces types based on ST declarations.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | 'read' fetches live channel values; 'write' pushes new values. | |
| values | No | Channel/value pairs to write (write only). | |
| channels | No | Channel paths to read, each in 'ObjectName.ChannelName' format (read only). | |
| lcp_path | No | Absolute path to the .lcp file. Omit to use the selected project. | |
| connection | No | Connection string or address-book name. Omit to use the project's saved connection. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of disclosing behavior. It does mention reading/writing live values and automatic type coercion, but it does not disclose side effects of writes, permission requirements, or error behavior. It is not contradictory, but it is not deeply transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief, well-structured, and front-loaded with the primary purpose. It avoids unnecessary detail while still covering key operational constraints and parameter semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description gives enough context for typical usage: it specifies the operating context (running PLC), the channel naming format, the read/write distinction, and type handling. Since there is no output schema, the absence of return format details is acceptable, though more error handling context would improve completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and descriptions add helpful context beyond the schema, such as 'read only', 'write only', the format for channel paths, and behavior when lcp_path or connection are omitted. The type coercion note clarifies how string values are interpreted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose with a specific verb pair ('Read or write') and resource ('live channel values on a running PLC'). It also defines the channel naming format, distinguishing it from broader or more general PLC tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage through the read/write action and 'running PLC' context, but it does not explicitly name alternative tools or state when this tool should be chosen over siblings like plc_diagnostics or control_plc. Guidance is present but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_projectA
Set the active LASAL project by directory path. Call first — all other tools default to this project.
| Name | Required | Description | Default |
|---|---|---|---|
| path | Yes | Full path to the LASAL solution folder (must contain a .lsm file). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the primary side effect: setting the active project and affecting all other tools. It does not mention persistence, validation errors, or reversibility, but for a simple setter the description is transparent about its impact on global state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste. The core purpose is front-loaded, and the usage instruction is appended concisely. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter setter with no output schema, the description is nearly complete. It explains what it does, when to call it, and the schema covers the parameter requirements. It could optionally mention what happens on invalid input, but that is minor given the low complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'path' is fully documented in the schema (100% coverage), including the requirement that the folder must contain a .lsm file. The description adds no additional parameter semantics, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Set') and resource ('active LASAL project') with a clear scope ('by directory path'). It explicitly distinguishes itself from siblings by saying 'Call first — all other tools default to this project', so an agent can tell it apart from the other project-related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Call first — all other tools default to this project', providing clear when-to-use guidance. It implies that this tool should be invoked before any other tool that depends on project context, leaving no ambiguity about ordering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
visu_projectA
Run VISUDesigner engine operations: update stations, publish, manage text lists/schemes/media/code modules, set datapoint properties, or download to HMI. These need the VISUDesigner engine — for direct dashboard JSON editing, edit the files in the project directly.
| Name | Required | Description | Default |
|---|---|---|---|
| flags | No | Download mode: 0=normal (default), 1=changes only, 2=publish+download changes (download only). | |
| action | Yes | 'apply_changes' loads the project, runs operations, saves, and closes. 'download' pushes the project to an HMI without saving content changes. | |
| lvp_path | No | Full path to the .lvp project file. Omit to auto-detect from the selected project. | |
| connection | No | HMI connection string, e.g. 'TCPIP:192.168.1.100' (download only). | |
| operations | No | Ordered list of VISUDesigner operations (apply_changes only). Each has a 'type' field. Available types: update_all_stations | update_station | publish | add_text_lists | remove_text_lists | add_texts | remove_texts | change_texts | change_component_texts | set_text_list_revisions | set_component_text_list_revisions | csv_export_text_lists | csv_import_text_lists | csv_export_component_text_lists | csv_import_component_text_lists | set_datapoint_properties | set_datatype_properties | add_schemes | remove_schemes | add_scheme_entries | remove_scheme_entries | move_scheme_entries | set_scheme_inputs | set_scheme_properties | set_scheme_entry_properties | add_media_items | remove_media_items | add_code_modules | remove_code_modules | update_property_values | download | |
| add_runtime | No | Force runtime download even if version already matches (download only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states that apply_changes 'loads the project, runs operations, saves, and closes' and that download 'pushes the project to an HMI without saving content changes', which are useful behavioral details. However, with no annotations provided, it doesn't cover side effects like whether operations are atomic, whether text list revisions auto-increment, or whether a failed operation leaves the project partially modified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact paragraph that front-loads the core purpose and gives the key scoping constraint (apply_changes vs download) before the alternative instruction. It is dense but not bloated given the tool's complexity, and the second sentence adds critical guidance without excess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a highly complex tool with a large operations enum and 6 parameters, the description gives the essential action-level guidance and the main alternative path (direct file editing). It lacks details on output/return behavior and error cases, and the schema's nested operation objects carry most of the per-operation semantics, so the description alone is not fully self-sufficient but is reasonable given the schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters with descriptions, but the top-level description adds value by clarifying the key action parameter ('apply_changes' vs 'download'), the lvp_path auto-detection behavior, and the connection string format with the 'TCPIP:' prefix. It also explains that flags are download-only, which is a semantic distinction not fully obvious from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific tool (VISUDesigner engine) and a clear verb ('Run VISUDesigner engine operations'), then enumerates the operation categories. It distinguishes itself from direct dashboard JSON editing via the last sentence, though it doesn't name a specific sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly contrasts with 'direct dashboard JSON editing' by saying 'for direct dashboard JSON editing, edit the files in the project directly.' This provides a clear when-to-use/when-not-to-use boundary, though it doesn't list alternative sibling tools by name.
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.
31 tool updates
- Changed
apply_project_changes3 fields changed- added
Input schema / properties / dry_runAdded value: +{ + "default": false, + "description": "Validate operations without applying them.", + "type": "boolean" +} - changed
Input schema / properties / operations / descriptionPrevious value: -"Ordered list of operations to apply. Each has a 'type' field. Channel ops (add/remove/rename_server, add/remove/rename_client) edit .st files directly and cascade to .lcn files. Network ops (create/delete/rename_network, add/remove/rename_object, create/delete_connection, set_init_value, delete_class) run via Lasal2.exe batch script."New value: +"Ordered list of CLASS 2 batch engine operations. Available types: create_network, delete_network, rename_network, duplicate_network, add_object, remove_object, rename_object, change_object_class, create_connection, delete_connection, set_init_value, delete_class, compile, download, set_task_order, set_task_time, set_task_cpu_core, set_multi_cpu_core, set_visualized_flag, set_comment_network, set_comment_object, set_network_options, reset_network_options, move_network_to_folder, set_parameter_value" - added
Input schema / properties / operations / items / oneOfAdded value: +[ + { + "properties": { + "name": { + "type": "string" + }, + "type": { + "const": "create_network", + "type": "string" + } + }, + "required": [ + "type", + "name" + ], + "type": "object" + }, + { + "properties": { + "deleteConnections": { + "default": true, + "type": "boolean" + }, + "name": { + "type": "string" + }, + "type": { + "const": "delete_network", + "type": "string" + } + }, + "required": [ + "type", + "name" + ], + "type": "object" + }, + { + "properties": { + "newName": { + "type": "string" + }, + "oldName": { + "type": "string" + }, + "type": { + "const": "rename_network", + "type": "string" + } + }, + "required": [ + "type", + "oldName", + "newName" + ], + "type": "object" + }, + { + "properties": { + "name": { + "type": "string" + }, + "newName": { + "type": "string" + }, + "type": { + "const": "duplicate_network", + "type": "string" + } + }, + "required": [ + "type", + "name", + "newName" + ], + "type": "object" + }, + { + "properties": { + "className": { + "type": "string" + }, + "network": { + "type": "string" + }, + "objectName": { + "type": "string" + }, + "type": { + "const": "add_object", + "type": "string" + }, + "visualized": { + "default": true, + "type": "boolean" + }, + "x": { + "default": 300, + "type": "number" + }, + "y": { + "default": 300, + "type": "number" + } + }, + "required": [ + "type", + "network", + "className", + "objectName" + ], + "type": "object" + }, + { + "properties": { + "deleteConnections": { + "default": true, + "type": "boolean" + }, + "network": { + "type": "string" + }, + "objectName": { + "type": "string" + }, + "type": { + "const": "remove_object", + "type": "string" + } + }, + "required": [ + "type", + "network", + "objectName" + ], + "type": "object" + }, + { + "properties": { + "network": { + "type": "string" + }, + "newName": { + "type": "string" + }, + "oldName": { + "type": "string" + }, + "type": { + "const": "rename_object", + "type": "string" + } + }, + "required": [ + "type", + "network", + "oldName", + "newName" + ], + "type": "object" + }, + { + "properties": { + "className": { + "type": "string" + }, + "network": { + "type": "string" + }, + "objectName": { + "type": "string" + }, + "type": { + "const": "change_object_class", + "type": "string" + } + }, + "required": [ + "type", + "network", + "objectName", + "className" + ], + "type": "object" + }, + { + "properties": { + "fromClient": { + "type": "string" + }, + "fromObject": { + "type": "string" + }, + "network": { + "type": "string" + }, + "toObject": { + "type": "string" + }, + "toServer": { + "type": "string" + }, + "type": { + "const": "create_connection", + "type": "string" + } + }, + "required": [ + "type", + "fromObject", + "fromClient", + "toObject", + "toServer" + ], + "type": "object" + }, + { + "properties": { + "clientName": { + "type": "string" + }, + "network": { + "type": "string" + }, + "objectName": { + "type": "string" + }, + "type": { + "const": "delete_connection", + "type": "string" + } + }, + "required": [ + "type", + "objectName", + "clientName" + ], + "type": "object" + }, + { + "properties": { + "channelName": { + "type": "string" + }, + "network": { + "type": "string" + }, + "objectName": { + "type": "string" + }, + "type": { + "const": "set_init_value", + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "type", + "objectName", + "channelName", + "value" + ], + "type": "object" + }, + { + "properties": { + "className": { + "type": "string" + }, + "force": { + "default": false, + "type": "boolean" + }, + "type": { + "const": "delete_class", + "type": "string" + } + }, + "required": [ + "type", + "className" + ], + "type": "object" + }, + { + "properties": { + "options": { + "default": "RebuildAll", + "enum": [ + "RebuildAll", + "BuildChanges", + "UserClassesOnly", + "NoDebugInfo" + ], + "type": "string" + }, + "type": { + "const": "compile", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "add_loader_anyway": { + "default": false, + "type": "boolean" + }, + "connection": { + "type": "string" + }, + "type": { + "const": "download", + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, + { + "properties": { + "network": { + "type": "string" + }, + "objectName": { + "type": "string" + }, + "position": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "task": { + "enum": [ + "realtime", + "cyclicwork", + "background" + ], + "type": "string" + }, + "type": { + "const": "set_task_order", + "type": "string" + } + }, + "required": [ + "type", + "network", + "objectName", + "task", + "position" + ], + "type": "object" + }, + { + "properties": { + "network": { + "type": "string" + }, + "objectName": { + "type": "string" + }, + "task": { + "enum": [ + "realtime", + "cyclicwork", + "background" + ], + "type": "string" + }, + "time": { + "type": "string" + }, + "type": { + "const": "set_task_time", + "type": "string" + } + }, + "required": [ + "type", + "network", + "objectName", + "task", + "time" + ], + "type": "object" + }, + { + "properties": { + "core": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "network": { + "type": "string" + }, + "objectName": { + "type": "string" + }, + "task": { + "enum": [ + "realtime", + "cyclicwork" + ], + "type": "string" + }, + "type": { + "const": "set_task_cpu_core", + "type": "string" + } + }, + "required": [ + "type", + "network", + "objectName", + "task", + "core" + ], + "type": "object" + }, + { + "properties": { + "multiCore": { + "type": "boolean" + }, + "type": { + "const": "set_multi_cpu_core", + "type": "string" + } + }, + "required": [ + "type", + "multiCore" + ], + "type": "object" + }, + { + "properties": { + "isVisualized": { + "type": "boolean" + }, + "network": { + "type": "string" + }, + "objectName": { + "type": "string" + }, + "type": { + "const": "set_visualized_flag", + "type": "string" + } + }, + "required": [ + "type", + "network", + "objectName", + "isVisualized" + ], + "type": "object" + }, + { + "properties": { + "comment": { + "type": "string" + }, + "network": { + "type": "string" + }, + "type": { + "const": "set_comment_network", + "type": "string" + } + }, + "required": [ + "type", + "network", + "comment" + ], + "type": "object" + }, + { + "properties": { + "comment": { + "type": "string" + }, + "network": { + "type": "string" + }, + "objectName": { + "type": "string" + }, + "type": { + "const": "set_comment_object", + "type": "string" + } + }, + "required": [ + "type", + "network", + "objectName", + "comment" + ], + "type": "object" + }, + { + "properties": { + "network": { + "type": "string" + }, + "optionNames": { + "items": { + "type": "string" + }, + "type": "array" + }, + "resetAllOthers": { + "default": false, + "type": "boolean" + }, + "type": { + "const": "set_network_options", + "type": "string" + } + }, + "required": [ + "type", + "network", + "optionNames" + ], + "type": "object" + }, + { + "properties": { + "network": { + "type": "string" + }, + "optionNames": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": { + "const": "reset_network_options", + "type": "string" + } + }, + "required": [ + "type", + "network", + "optionNames" + ], + "type": "object" + }, + { + "properties": { + "folder": { + "type": "string" + }, + "network": { + "type": "string" + }, + "type": { + "const": "move_network_to_folder", + "type": "string" + } + }, + "required": [ + "type", + "network", + "folder" + ], + "type": "object" + }, + { + "properties": { + "network": { + "type": "string" + }, + "objectName": { + "type": "string" + }, + "parameterName": { + "type": "string" + }, + "type": { + "const": "set_parameter_value", + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "type", + "network", + "objectName", + "parameterName", + "value" + ], + "type": "object" + } +]
- Removed
apply_visu_changes - Added
build_project - Removed
close_class2 - Removed
close_visudesigner - Removed
compile_project - Added
control_plc - Changed
deploy_all2 fields changed- added
Input schema / properties / start_hmi_runtimeAdded value: +{ + "default": false, + "description": "Start the local HMI runtime (DataService) and copy HMI files after a successful compilation/update. Default false.", + "type": "boolean" +} - added
Input schema / properties / timeout_sAdded value: +{ + "description": "Timeout override in seconds for compile and download steps.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +}
- Removed
download_project - Removed
download_visu_project - Removed
get_plc_state - Added
hmi_browser - Added
hmi_runtime - Removed
inspect_project - Removed
inspect_visu_project - Added
lars_runtime - Added
lasal_status - Added
manage_class2 - Added
manage_visudesigner - Removed
open_class2 - Removed
open_visudesigner - Added
plc_diagnostics - Added
plc_values - Removed
read_class_source - Removed
read_plc_values - Removed
set_target_ip - Removed
start_plc - Removed
stop_plc - Added
visu_project - Removed
write_class_source - Removed
write_plc_values
21 tool updates
v0.1.0- First observed
apply_project_changes - First observed
apply_visu_changes - First observed
close_class2 - First observed
close_visudesigner - First observed
compile_project - First observed
deploy_all - First observed
download_project - First observed
download_visu_project - First observed
get_plc_state - First observed
inspect_project - First observed
inspect_visu_project - First observed
open_class2 - First observed
open_visudesigner - First observed
read_class_source - First observed
read_plc_values - First observed
select_project - First observed
set_target_ip - First observed
start_plc - First observed
stop_plc - First observed
write_class_source - First observed
write_plc_values
TDQS
Scored across 14 tools
Tools are largely distinct with detailed descriptions, but there is some overlap in functionality (e.g., control_plc, build_project, and deploy_all all involve starting or downloading to a PLC; hmi_runtime and visu_project both touch the HMI). The descriptions clarify context (real vs. simulation, single step vs. pipeline), so misselection is unlikely but possible.
All tool names follow a consistent snake_case style (e.g., control_plc, build_project, lars_runtime). While not every name follows the verb_noun pattern (lasal_status, plc_values are nouns), the naming convention is uniform and predictable.
14 tools is well-scoped for a complex PLC/HMI development and automation environment. The count covers project management, build/deploy, runtime control, diagnostics, HMI validation, and browser testing without being overwhelming.
The toolset covers the full development lifecycle: project selection, building, downloading, runtime state, diagnostics, HMI runtime management, and browser-based verification. It also includes composite pipelines like deploy_all and granular operations for LARS and VS engine, leaving no obvious gaps for typical tasks.
Maintenance
Related MCP Connectors
- ApricotOAuthtools.apricot
Manage SysML2 projects and files directly through your coding agent.
Architecture compiler for AI code. 11 tools, 92 actions, 872 Lean4 proofs, 100/100 self-cert.
- mcp-serverOAuthcom.make
Give your AI agents the tools to build, manage, and run automation workflows.
Operate Linux, macOS and Windows from your LLM. Every action runs through an auditable allowlist.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with B\&R Automation Studio projects by building code, running ARsim simulators, and reading or writing OPC UA variables. It facilitates industrial automation development and real-time variable integration through natural language commands.13MIT
- FlicenseNot gradedqualityAmaintenanceMCP server that connects AI assistants to Siemens TIA Portal via the Openness API. AI-assisted PLC programming, project management, hardware configuration, cross-reference analysis, and deployment. 19 tools, 230 actions.35-
- FlicenseNot gradedqualityCmaintenanceConverts natural language specifications into working ladder logic and complete Studio 5000 projects, enabling AI-powered PLC programming with L5X and .ACD file generation, semantic search, and documentation access.-
- AlicenseBqualityBmaintenanceEnables 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.63MIT