Skip to main content
Glama
FlexSim MCP Server

FlexSim MCP Server

by fateedit

FlexSim MCP Server — AI 远程建模工具箱

中文 | English

基于 FlexSim WebServer 的 MCP(Model Context Protocol) 服务器。让 AI 助手(DeepSeek Harness / Claude / Cursor 等任何支持 MCP 的客户端)通过自然语言直接操控 FlexSim 仿真模型:创建对象、读写模型树节点、连接 / 删除对象、运行控制、甚至给模型热部署新功能。

AI 客户端  ←(stdio, JSON-RPC 2.0)→  mcp-server.cjs  ←(HTTP)→  FlexSim WebServer  ←→  模型内的自定义 handler

特性

  • 纯 stdio MCP 服务器,零第三方依赖(仅需 Node.js)

  • 25 个内置工具:实例管理、目标锁定、模型树浏览、节点读写、创建 / 连接 / 删除对象、运行控制、部署自定义 handler 等

  • 插件架构:deploy_handler 可给运行中的模型热部署任意新功能(copyhandler 增殖原语)

  • 自带 4 个自增 handler 节点(template、copy_handler、set_code、delete_object),可由 AI 动态创建、修改和删除新能力

Related MCP server: Webots MCP

快速开始

1. 环境要求

  • Node.js ≥ 18

  • FlexSim 且 WebServer 已启动(地址由 FLEXSIM_WS_BASE 指定,默认连本机 WebServer)

2. 给模型安装 4 个自增 handler(手动安装)

handler 是模型树 Tools/serverinterface/queryhandlers/ 下的功能节点。WebServer 只认这个固定路径,且只在实例启动时加载 handler,所以必须完整执行:

  1. 用 FlexSim 打开你的模型(.fsm)。

  2. 在模型树 Tools 节点下新建子节点 serverinterface(已存在则跳过);再在 serverinterface 下新建子节点 queryhandlers(已存在则跳过)。最终路径为:

    Tools/serverinterface/queryhandlers
  3. 导入 handlers/queryhandlers.t,两种方式任选:

    • 方式一(子节点导入):选中 queryhandlers 节点 → 右键 → Paste / Import → 选择 handlers/queryhandlers.t,把 4 个 handler 作为子节点粘贴进去。

    • 方式二(整节点覆盖):在 Tools 下新建一个子节点 → 右键 → Paste / Import 选择 handlers/queryhandlers.t 粘贴覆盖该节点(文件是完整的 queryhandlers 节点,覆盖后即为 queryhandlers,内含 4 个 handler);必要时把节点改名为 queryhandlers 并移到 Tools/serverinterface/ 下。

💡 推荐用文件导入 / 覆盖(新手友好,避免踩类型坑):queryhandlers.t 已包含正确的节点类型与参数结构,导入即用。若你选择手工新建节点填代码,必须把节点类型设置为 flexscript,否则 handler 代码无法编译执行。

  1. 确认 Tools/serverinterface/queryhandlers/ 下出现 4 个节点:template、copy_handler、set_code、delete_object。

  2. Ctrl+S 保存模型(必须保存,否则重启后丢失)。

  3. 重新通过 WebServer 打开模型实例:先停止 / 关闭当前实例,再重新打开(或重启 WebServer 服务)。不重启实例,新 handler 不会被识别,调用会 404。

2.5 验证自增长链路

新版 queryhandlers.t 已把 copy_handler 和 set_code 纳入基础包,无需再手工补装:

  • template:写模型树现有节点

  • copy_handler:从模板复制、写入源码并编译新 handler

  • set_code:原地修改并重新编译已有 handler

  • delete_object:删除对象、节点或不再需要的 handler

建议让 AI 调 deploy_handler 创建一个最简单的 ping(返回 <pong>1</pong>),再修改和删除它;全流程成功即说明自增长链路可用。

3. 启动 MCP 服务器

node server/mcp-server.cjs

不需要 npm install(零第三方依赖)。也可 npm i -g . 安装后用 flexsim-mcp 命令启动。可选环境变量:

变量

默认值

作用

FSW_REGISTRY

./registry.json(相对脚本)

工具注册表路径

FLEXSIM_WS_BASE

本机 WebServer

WebServer 地址(可用环境变量覆盖)

FLEXSIM_MODEL

未设置

启动时默认锁定的模型名(如 MyModel)

FLEXSIM_INSTANCE

1

与 FLEXSIM_MODEL 配套的实例号

FLEXSIM_WS_DIR

未设置(start_webserver 必填)

WebServer 服务目录(内含 index.js)

FLEXSIM_NODE

当前 node 进程

start_webserver 使用的 node 可执行文件

多个模型实例同时在线时,服务器不会再隐式选择第一个实例。请先调用 select_target,或在 MCP 客户端环境变量中设置 FLEXSIM_MODEL=MyModel、FLEXSIM_INSTANCE=1。

4. 接入 AI 客户端

以 DeepSeek Harness(DSH)为例,在 cordis.patch.yml 增加一个 MCP 客户端插件条目:

- insert:
    - id: mcp-flexsim
      name: '@deepseek-ai/dsh-mcp-client'
      config:
        serverName: flexsim
        transport: stdio
        command: node
        args:
          - <repo>/server/mcp-server.cjs
        toolCallTimeoutMs: 120000

Claude Desktop / Cursor 等其他客户端的 mcpServers 配置同理:

{
  "mcpServers": {
    "flexsim": {
      "command": "node",
      "args": ["<repo>/server/mcp-server.cjs"]
    }
  }
}

然后你就可以对 AI 说:“打开 ai 模型,创建一个 Source 叫 S1,一个 Queue 叫 Q1,把 S1 连到 Q1,跑 10 秒,告诉我 Q1 释放了多少个。”

MCP 工具一览(25 个)

分类

工具

环境

webserver_status start_webserver get_guide

实例 / 模型

list_instances get_target select_target list_models open_model list_handlers

树与节点

list_tree get_node write_node add_node rename_node

对象操作

create_object connect_objects delete_object set_loc

运行控制

control(run/stop/reset) set_run_speed set_stop_time set_datetime get_run_state

插件

deploy_handler call_handler

文档

目录结构

flexsim-mcp/
├── server/
│   ├── mcp-server.cjs         # ★ MCP 服务器(stdio)— 唯一运行入口
│   └── registry.json          # ★ 工具注册表:工具定义 / guide / prompts / 部署模板
├── handlers/
│   └── queryhandlers.t        # ★ 4 个自增 handler 节点文件(FlexSim 模型导入用)
├── tests/
│   └── test-mcp-protocol.cjs  # 端到端 stdio 协议测试(不需要 FlexSim)
├── docs/
│   └── HANDLERS.md            # handler 详解、执行模型、FlexScript 函数存在性
├── AGENTS.md                  # 给 AI 编码助手的仓库指南
├── README.md                  # 中文文档(默认)
├── README.en.md               # English
├── LICENSE
└── .gitignore

JSON-RPC 调用示例

服务器是标准 JSON-RPC 2.0 over stdio(每行一条消息,换行分隔)。下面每条都可以直接粘进 stdin。

① 握手(必须先做,之后才能调工具)

{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"my-client","version":"1.0.0"}}}

响应里带 capabilities(tools / prompts)、serverInfo,以及 instructions(操作指南全文,建议读)。

② 握手完成通知(无 id,不需要响应)

{"jsonrpc":"2.0","method":"notifications/initialized"}

③ 列工具

{"jsonrpc":"2.0","id":2,"method":"tools/list"}

④ 调工具 —— 参数一律放在 arguments 里;get_guide 无参数:

{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_guide","arguments":{}}}

⑤ 建对象 → 摆位置 → 连线

{"jsonrpc":"2.0","id":4,"method":"tools/call","params":{"name":"create_object","arguments":{"type":"Queue","name":"Q1"}}}
{"jsonrpc":"2.0","id":5,"method":"tools/call","params":{"name":"set_loc","arguments":{"object":"Q1","x":5,"y":0,"z":0}}}
{"jsonrpc":"2.0","id":6,"method":"tools/call","params":{"name":"connect_objects","arguments":{"from":"Source1","to":"Q1","key":"A"}}}

⑥ 读节点 / 写节点

{"jsonrpc":"2.0","id":7,"method":"tools/call","params":{"name":"get_node","arguments":{"path":"Q1"}}}
{"jsonrpc":"2.0","id":8,"method":"tools/call","params":{"name":"write_node","arguments":{"path":"Q1>variables/maxcontent","value":"10"}}}

⑦ 运行控制

{"jsonrpc":"2.0","id":9,"method":"tools/call","params":{"name":"control","arguments":{"action":"reset"}}}
{"jsonrpc":"2.0","id":10,"method":"tools/call","params":{"name":"control","arguments":{"action":"run"}}}

⑧ 提示模板(prompts 能力)

{"jsonrpc":"2.0","id":11,"method":"prompts/list"}
{"jsonrpc":"2.0","id":12,"method":"prompts/get","params":{"name":"build_production_line","arguments":{"description":"一条 Source→Queue→Processor→Sink 的产线"}}}

错误约定:工具执行失败走 result.isError: true(MCP 规范),不是 JSON-RPC error。 只有协议层错误才用 error:-32700 解析失败 / -32601 方法不存在 / -32602 参数无效。

测试

# 协议端到端测试(起真实 stdio 客户端,不需要 FlexSim)
node tests/test-mcp-protocol.cjs

# 语法自检
node --check server/mcp-server.cjs

test-mcp-protocol.cjs 覆盖 10 组断言:握手与能力协商、tools/list 完整性、tools/call 成功与失败路径、错误码(-32601/-32602/isError)、id 回填、prompts、以及 stdout 纪律(确认 stdout 只有 JSON-RPC、日志全走 stderr)。

⚠️ 这个测试要 child_process.spawn + 管道。受限沙箱会报 spawn EPERM,那不是测试失败。

故障排查

list_handlers 返回空 / 调用 handler 一律 404

  1. 模型里没有装 handler → 按「快速开始」第 2 步导入,注意节点类型必须是 flexscript

  2. 装了但没重启实例 → handler 只在实例启动时加载,WebServer 里关掉再重开

  3. 装了但没 Ctrl+S → 重启后丢失

  4. 路径写错 → handler 必须在 Tools/serverinterface/queryhandlers/ 下

deploy_handler 返回 404 模型里没有正确加载新版 copy_handler。重新导入 handlers/queryhandlers.t,保存模型并重启 WebServer 实例;见「快速开始」第 2 节。

call_handler 报 object not found / node not found

  • 传了裸对象名,但目标是模型树里的深层节点 → 改用完整路径

  • 删除 handler 必须给全路径:delete_object 的 value 要写 Tools/serverinterface/queryhandlers/<名字>(裸名只在模型层找)

handler 改完不生效 handler 的执行体是已编译代码,改节点文本(data)不会自动重编译。新增用 copy_handler,修改用 set_code;两者都会调用 switch_flexscript + buildnodeflexscript。改完记得 Ctrl+S + 重启实例。详见 docs/HANDLERS.md。

取不到仿真时间 / handler 编译报错 FlexScript 里没有 getmodeltime()(也没有 savemodel / numtostr)。取时间用 WebServer 内置 getruntime,或读节点 Tools/ModelUnits/ModelDateTimes/currentTime/modelTime。

HTTP 200 但正文是 HTTP/1.1 404 Not Found WebServer 的已知怪行为:404/500 有时以「HTTP 200 + 正文状态行」返回。本服务器的 get() 已统一归一化,看到这种正文即表示真 404。

WebServer 服务起不来 start_webserver 需要管理员权限,会尝试提权(弹 UAC)。若仍失败,手动用管理员身份运行 WebServer 的 flexsimserver.bat。

想跑任意 FlexScript(像 evaluate 那样) 本架构做不到——WebServer 只放行「内置命令 + 已注册 handler + 实例管理」,实测 14 个 evaluate 类候选全部 404。需要该能力请用 FlexSimPy 通道(进程内加载 flexsim.dll,见同项目 mcp_server/flexsim_mcp.py)。

License

MIT

Available Tools

25 tools
add_nodeC

在模型树指定父节点下添加一个普通节点。add_node=&value=父路径&name=新节点名(参数无关)。

Inputs: name (required), parent (required).

call_handlerA

通用调用任意已部署 handler。参数用通用名:value(对象/路径)、action(值/动作)、name(新名)、msg(消息)。返回 XML/文本。调用前如不确定 handler 是否存在,先 list_handlers。

Inputs: handler (required), msg, name, value, +1 more.

connect_objectsB

如未先读操作指南,请先调用 get_guide。连接两个对象(A 连接=输出到输入,S 连接=共享)。contextdragconnection 语义,A 键建输入输出连接。

Inputs: to (required), from (required), key.

controlA

如未先读操作指南,请先调用 get_guide。仿真控制:run 运行 / stop 停止 / reset 重置(回到初始状态,时间类修改后需 reset 生效)。

Inputs: action (required).

create_objectA

如未先读操作指南,请先调用 get_guide。从 FlexSim 对象库创建对象到模型。类型如 Source/Sink/Queue/Processor/Dispatcher/Rack/Conveyor/Combiner/Separator/MergeSort/Transporter/Robot/Operator/ProcessFlow 等。

Inputs: name (required), type (required).

delete_objectA

如未先读操作指南,请先调用 get_guide。删除对象/节点。注意:删除是异步操作,3~8 秒后模型界面才生效;删除后不能立即用 get_node 判断是否成功(会误报残留),应稍后重试 delete_object 看是否返回 not found。

Inputs: object (required).

deploy_handlerA

★ 核心:向目标模型部署(复制)一个新 handler(功能)。copy_handler=&value=模板&name=新名&code=新代码。业务参数必须用通用名(value/action/name/msg),绝不能读取 handler 自身名字的参数。部署后立即生效(仅当前实例内存),持久化需用户在 FlexSim 界面 Ctrl+S。部署成功后应调用一次验证。

Inputs: code (required), name (required), template.

get_guideA

获取 FlexSim 远程建模操作指南(AI 必读):工作流程、硬性规则(参数无关/异步删除/Ctrl+S 持久化/路径大小写等)、部署新功能方法与典型场景。建议动手前先调用。

Inputs: no named parameters.

get_nodeA

读取模型树节点值,返回 JSON(数字/字符串/复合数组)。路径大小写敏感;对象名(如 Q1)或完整路径(如 Tools/ModelUnits/ModelDateTimes/startTime/dateString)均可。

Inputs: path (required).

get_run_stateB

查询运行状态(runstate 0/1)与当前模型时间。

Inputs: no named parameters.

get_targetA

读取当前锁定的模型实例。所有读取、写入、运行和 handler 操作都会作用于这个目标;操作前必须检查。

Inputs: no named parameters.

list_handlersB

列出目标模型已部署的所有 handler(功能)名称。handler 位于 Tools/serverinterface/queryhandlers 目录,是模型可通过 HTTP 调用的功能节点。

Inputs: model, instance.

list_instancesA

列出 WebServer 上所有运行中的模型实例(模型名+实例号)。操作前先调用确认目标模型在线。

Inputs: no named parameters.

list_modelsA

列出 WebServer 上所有可运行的模型名(availablemodels)。用户要求打开某模型时,先查这个名字是否存在。

Inputs: no named parameters.

list_treeA

浏览模型树任意路径的子节点(treelayer),返回子节点名与类型。root 用 MODEL: 或留空;子路径用相对路径(如 Tools/ModelUnits 或对象名 Q1)。用于探索模型结构、找节点路径。

Inputs: path.

open_modelA

在 WebServer 上启动(打开)一个模型实例(createinstance)。大模型加载需要时间,启动后稍等几秒再用 list_instances 确认在线。若模型已在线则无需调用。

Inputs: model (required).

rename_nodeB

给模型树节点/对象改名。value=旧路径,name=新名。若模型未装 rename_node handler 会自动先部署再调用。

Inputs: name (required), path (required).

select_targetA

锁定后续所有模型操作的目标实例。会验证该实例确实在线;多个实例在线时必须先调用本工具,服务器不会再默认选择第一个实例。

Inputs: model (required), instance.

set_datetimeA

设置模型开始时间,格式 YYYY-MM-DD HH:MM:SS(如 2026-08-25 08:30:00)。设置后需 reset 生效。

Inputs: datetime (required).

set_locA

如未先读操作指南,请先调用 get_guide。设置对象坐标(x/y/z)。通过写入对象 spatial 节点实现,不依赖模型侧 set_loc handler(只装 4 个基础 handler 即可用)。注意:多个对象创建后默认堆叠在原点 (0,0,0),创建后必须用本工具排布位置(如产线按 x=0,5,10,15 一字排开)。

Inputs: x (required), y (required), z (required), object (required).

set_run_speedC

设置运行速度倍数。

Inputs: speed (required).

set_stop_timeC

设置模型停止时间(秒)。

Inputs: seconds (required).

start_webserverA

启动 FlexSim WebServer 服务(node index.js)。若直接启动失败(端口绑定需要管理员权限)会自动尝试提权(可能弹 UAC 窗口)。启动后稍等几秒再用 webserver_status 确认。

Inputs: no named parameters.

webserver_statusA

检测 FlexSim WebServer 是否在线。所有模型操作都依赖 WebServer,动手前先确认;不在线用 start_webserver 启动。

Inputs: no named parameters.

write_nodeA

如未先读操作指南,请先调用 get_guide。写入模型树节点值(数字/字符串由模型自动判断)。写入复合(数组)节点会失败,必须写叶子子节点。修改时间类节点后通常需要 reset 才生效。

Inputs: path (required), value (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

    TDQS

    B3.3/5.0

    Scored across 25 tools

    Disambiguation4/5

    Most tools map to a distinct resource+action (node CRUD, object creation, sim control, handler management) and descriptions clarify the boundaries. Minor overlaps exist between get_run_state and control, and between set_datetime/set_stop_time/set_run_speed and direct write_node edits, but these are workable.

    Naming Consistency4/5

    The dominant pattern is verb_noun snake_case (get_node, create_object, deploy_handler, list_models), which is predictable. Two outliers — 'webserver_status' (noun-first) and 'control' (bare verb) — are minor deviations that don't hurt readability.

    Tool Count3/5

    25 tools sits at the heavy end. The surface spans server lifecycle, model/instance management, tree editing, simulation control, and handler deployment, so the count is defensible, but several narrow setters (set_run_speed, set_stop_time, set_loc) inflate the list beyond what an agent can comfortably scan.

    Completeness3/5

    Core workflows are covered: node read/write/add/rename/delete, object creation and wiring, run/stop/reset, and handler deploy/call/list. However, there is no way to close or unload a model instance, no handler removal/undeploy, and no error/log retrieval, leaving notable lifecycle gaps.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      C
      maintenance
      Full-access MCP server for the Webots robot simulator that enables AI assistants to see, understand, and modify a running simulation, including scene-tree inspection/editing, robot control, viewport screenshots, and arbitrary code execution.
      4
      -
    • A
      license
      C
      quality
      C
      maintenance
      Enables AI agents to read and write .mph model files, control the COMSOL desktop GUI in real time, and run complete modeling, meshing, solving, and post-processing workflows.
      23
      1
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      Enables an MCP-compatible AI client to control CADFEKO, the FEKO solver, and POSTFEKO by running Lua API scripts, launching asynchronous jobs, tracking progress, and exporting S11, impedance, Touchstone, model files, and images.
      9
      MIT