Skip to main content
Glama
Svel26

Sigmatek LASAL MCP Server

by Svel26

Sigmatek LASAL MCP Server

CI npm version License: MIT PRs Welcome

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-mcp

Local Installation & Setup (for Developers)

git clone https://github.com/Svel26/Lasal-MCP.git
cd Lasal-MCP
npm install
npm run build

When 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

LASAL_CLASS2_EXE

C:\Program Files (x86)\Sigmatek\Lasal\Class2\Bin\Lasal2.exe

CLASS 2 IDE path

LASAL_VISUDESIGNER_EXE

C:\Program Files\Sigmatek\Lasal\VISUDesigner\VISUDesigner.exe

VISUDesigner path

LASAL_DATASERVICE_EXE

auto-discovered (latest version)

DataService path

LASAL_EDGE_EXE

auto-discovered

Edge browser path

LASAL_MCP_TIMEOUT_COMPILE

600000

Compile timeout (ms)

LASAL_MCP_TIMEOUT_DOWNLOAD

600000

Download timeout (ms)

LASAL_MCP_TIMEOUT_VISU

300000

Visu operation timeout (ms)

LASAL_MCP_TIMEOUT_SCRIPT

120000

Script execution timeout (ms)

LASAL_LARS_EXE

C:\Program Files (x86)\Sigmatek\Lars\Lars.exe

LARS runtime path

LASAL_LARS_CONFIG

%APPDATA%\lasalos2.xml

LARS workspace config file

LASAL_MCP_HMI_DIR

C:\lslvisu

Local HMI runtime directory

LASAL_MCP_SCRATCH_MAX_AGE_H

24

Hours before temp files are cleaned

Available Tools

Engine & Hardware Tools (MCP)

Tool

Description

select_project

Set the active project root directory.

lasal_status

Check project, stations, engines, processes, HMI health.

manage_class2

Open or close the CLASS 2 IDE.

manage_visudesigner

Open or close VISUDesigner.

build_project

Compile or download to PLC.

control_plc

Start, stop, or query PLC runtime state.

plc_values

Read/write live channel values on a running PLC.

lars_runtime

Local LARS simulation: list/setup workspaces per station, start/stop, point stations at LARS (set_station_target), revert (restore), switch ARM projects to the PC target (target_pc).

apply_project_changes

CLASS 2 batch engine operations (networks, objects, connections, tasks).

visu_project

VISUDesigner engine operations (text lists, schemes, media, publish, download).

hmi_runtime

Start/stop local HMI web simulation (DataService).

hmi_browser

Headless Edge browser for HMI testing and screenshots.

plc_diagnostics

Tracing, file transfer, static code analysis.

deploy_all

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

.lsm

XML

latin1

Solution — lists all stations

.lss

XML

latin1

Station settings — target IP, project references

.lcp

XML

latin1

CLASS 2 project manifest — class and network file paths

.st

XML + ST

latin1

Class source — XML header + Structured Text body

.lcn

XML

latin1

Network definitions — objects, connections, init values

.lvp

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 debugging

Simulating 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:

  1. lars_runtime setup — creates workspaces for every station in the selected solution (distinct ports per instance).

  2. lars_runtime start <station> — launches the LARS window for that station.

  3. lars_runtime set_station_target <station> — points the station's .lss at the LARS instance.

  4. Now build_project, control_plc, and plc_values work unchanged against the local runtime.

  5. lars_runtime restore <station> — reverts the .lss to the real hardware target.

Notes:

  • Projects compiled for Processor="ARM" (most machine PLCs) need lars_runtime target_pc first — 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_runtime remaps 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 tools
apply_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoValidate operations without applying them.
lcp_pathNoAbsolute path to the .lcp file. Omit to use the currently selected project.
operationsYesOrdered 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

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden. It 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.

Conciseness5/5

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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 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.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes'compile' builds the project; 'download' transfers it to the PLC.
optionsNoCompile mode (compile only). RebuildAll is safest; BuildChanges is faster for incremental work.RebuildAll
lcp_pathNoAbsolute path to the .lcp file. Omit to use the selected project.
timeout_sNoTimeout in seconds for compile or download. Omit for default (600s).
connectionNoConnection 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_anywayNoForce loader download even if the target OS already has a compatible loader (download only).

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes'start' runs the PLC project; 'stop' halts it; 'get_state' queries its current state.
lcp_pathNoAbsolute path to the .lcp file. Omit to use the selected project.
connectionNoConnection string or address-book name. Omit to use the project's saved connection.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
compileNoCompile the CLASS 2 project. Default true.
lcp_pathNoAbsolute path to the .lcp file. Omit to use the selected project.
lvp_pathNoAbsolute path to the .lvp file. Omit to auto-detect from the selected project.
start_plcNoStart the PLC runtime after a successful download. Default true.
timeout_sNoTimeout override in seconds for compile and download steps.
download_plcNoDownload the compiled CLASS 2 project to the PLC. Default true.
download_visuNoDownload the VISUDesigner project to the HMI after updating stations. Requires visu_connection. Default false.
add_plc_loaderNoForce loader download to PLC even if the target already has a compatible loader.
plc_connectionNoPLC connection string (e.g. 'TCPIP:192.168.1.100'). Omit to use the connection saved in the project's .lss file.
compile_optionsNoCompile mode. RebuildAll is safest; BuildChanges is faster for incremental work.RebuildAll
visu_connectionNoHMI connection string (e.g. 'TCPIP:192.168.1.100'). Required when download_visu is true.
add_visu_runtimeNoForce runtime download to HMI even if the version already matches.
start_hmi_runtimeNoStart the local HMI runtime (DataService) and copy HMI files after a successful compilation/update. Default false.
visu_download_flagsNoVISUDesigner download mode: 0=normal (default), 1=changes only, 2=publish+download changes.
update_visu_stationsNoRun update_all_stations on the VISUDesigner project to sync datapoints after CLASS 2 changes. Default true.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
xNoX coordinate for mouse click.
yNoY coordinate for mouse click.
msNoMilliseconds to wait (wait action only).
urlNoURL to navigate to (open action only). Defaults to the live HMI panel (http://<hmi-station-ip>/) when reachable, else the local HMI runtime URL.
textNoText content to type, or to find for clicking.
clearNoClear the console/error buffers after reading them (console action only).
actionYesAction to perform in the HMI browser session.
fullPageNoTake a full page screenshot (screenshot action only).
selectorNoCSS/Text selector to screenshot, click, type, or wait for.
viewportNoBrowser viewport size (open action only). Defaults to 1200x800.
expressionNoJavaScript expression to evaluate (eval action only).

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesAction to perform on the HMI runtime DataService.
lvp_pathNoAbsolute path to the .lvp file. Omit to use the currently selected project.
debugPublishNoUse debug publish (requires TypeScript project support). Fallback to standard publish on failure. Default true.
publishFirstNoPublish the project before starting the DataService. Default true.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoLARS workspace name (e.g. 'VisuPalletizer_PLC'). Required for start/stop/remove/set_station_target/restore when station is omitted.
actionYes'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_runNoWith action 'gc': report what would be removed without deleting anything. Default false.
stationNoStation name from the solution (e.g. 'PLC', 'HMI', 'Local'). Picks the matching workspace. Mutually exclusive with name.
lcp_pathNoAbsolute path to a .lcp to create a workspace for (setup only, when no station name is usable).
min_age_hNoWith action 'gc': only delete workspaces unreferenced for at least this many hours (overrides LASAL_MCP_LARS_GC_MIN_AGE_H; 0 = immediately.
project_dirNoSolution directory to auto-detect stations from (setup/list only. Defaults to the selected project.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: managing 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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes'open' launches LASAL CLASS 2; 'close' kills it.
lcp_pathNoFull path to the .lcp station file to open (open only). Omit to auto-detect from the selected project.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes'open' launches VISUDesigner; 'close' kills it.
lvp_pathNoFull path to the .lvp station file to open (open only). Omit to auto-detect from the selected project.

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: '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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesPLC diagnostics/maintenance action to perform.
lcp_pathNoAbsolute path to the .lcp file. Omit to use the currently selected project.
plc_pathNoFile path on the PLC (for file upload/download/delete).
connectionNoPLC connection string. Omit to use connection from project's .lss file.
local_pathNoLocal file path on the host (for file upload/download).
config_pathNoAbsolute path to the DataAnalyzer config file (trace action only).
duration_msNoDuration in milliseconds to run the trace (trace action only). Default 5000.
output_pathNoDestination path for the trace output or code analysis result.

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYes'read' fetches live channel values; 'write' pushes new values.
valuesNoChannel/value pairs to write (write only).
channelsNoChannel paths to read, each in 'ObjectName.ChannelName' format (read only).
lcp_pathNoAbsolute path to the .lcp file. Omit to use the selected project.
connectionNoConnection string or address-book name. Omit to use the project's saved connection.

TDQS

A4/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 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose 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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYesFull path to the LASAL solution folder (must contain a .lsm file).

TDQS

A4.4/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 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
flagsNoDownload mode: 0=normal (default), 1=changes only, 2=publish+download changes (download only).
actionYes'apply_changes' loads the project, runs operations, saves, and closes. 'download' pushes the project to an HMI without saving content changes.
lvp_pathNoFull path to the .lvp project file. Omit to auto-detect from the selected project.
connectionNoHMI connection string, e.g. 'TCPIP:192.168.1.100' (download only).
operationsNoOrdered 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_runtimeNoForce runtime download even if version already matches (download only).

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 31 tool updates
    • Changedapply_project_changes3 fields changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": false,
        +  "description": "Validate operations without applying them.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / operations / description
        Previous 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"
      • addedInput schema / properties / operations / items / oneOf
        Added 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"
        +  }
        +]
    • Removedapply_visu_changes
    • Addedbuild_project
    • Removedclose_class2
    • Removedclose_visudesigner
    • Removedcompile_project
    • Addedcontrol_plc
    • Changeddeploy_all2 fields changed
      • addedInput schema / properties / start_hmi_runtime
        Added value: +{
        +  "default": false,
        +  "description": "Start the local HMI runtime (DataService) and copy HMI files after a successful compilation/update. Default false.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / timeout_s
        Added value: +{
        +  "description": "Timeout override in seconds for compile and download steps.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
    • Removeddownload_project
    • Removeddownload_visu_project
    • Removedget_plc_state
    • Addedhmi_browser
    • Addedhmi_runtime
    • Removedinspect_project
    • Removedinspect_visu_project
    • Addedlars_runtime
    • Addedlasal_status
    • Addedmanage_class2
    • Addedmanage_visudesigner
    • Removedopen_class2
    • Removedopen_visudesigner
    • Addedplc_diagnostics
    • Addedplc_values
    • Removedread_class_source
    • Removedread_plc_values
    • Removedset_target_ip
    • Removedstart_plc
    • Removedstop_plc
    • Addedvisu_project
    • Removedwrite_class_source
    • Removedwrite_plc_values
  2. 21 tool updatesv0.1.0
    • First observedapply_project_changes
    • First observedapply_visu_changes
    • First observedclose_class2
    • First observedclose_visudesigner
    • First observedcompile_project
    • First observeddeploy_all
    • First observeddownload_project
    • First observeddownload_visu_project
    • First observedget_plc_state
    • First observedinspect_project
    • First observedinspect_visu_project
    • First observedopen_class2
    • First observedopen_visudesigner
    • First observedread_class_source
    • First observedread_plc_values
    • First observedselect_project
    • First observedset_target_ip
    • First observedstart_plc
    • First observedstop_plc
    • First observedwrite_class_source
    • First observedwrite_plc_values

TDQS

A4/5.0

Scored across 14 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables 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.
    13
    MIT
  • F
    license
    Not graded
    quality
    A
    maintenance
    MCP server that connects AI assistants to Siemens TIA Portal via the Openness API. AI-assisted PLC programming, project management, hardware configuration, cross-reference analysis, and deployment. 19 tools, 230 actions.
    35
    -
  • 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