Skip to main content
Glama
Svel26

Sigmatek LASAL MCP Server

by Svel26

apply_project_changes

Apply batch structural changes to LASAL projects: create or modify networks, objects, connections, set values, compile, and download to hardware.

Instructions

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.

Input Schema

TableJSON 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

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema 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"
      +  }
      +]
  2. First observedv0.1.0

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.