FlexSim MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@FlexSim MCP ServerOpen MyModel, add a Source S1 and a Queue Q1, connect S1 to Q1, run 10 seconds, report Q1 output."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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,所以必须完整执行:
用 FlexSim 打开你的模型(.fsm)。
在模型树
Tools节点下新建子节点serverinterface(已存在则跳过);再在serverinterface下新建子节点queryhandlers(已存在则跳过)。最终路径为:Tools/serverinterface/queryhandlers导入
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 代码无法编译执行。
确认
Tools/serverinterface/queryhandlers/下出现 4 个节点:template、copy_handler、set_code、delete_object。Ctrl+S 保存模型(必须保存,否则重启后丢失)。
重新通过 WebServer 打开模型实例:先停止 / 关闭当前实例,再重新打开(或重启 WebServer 服务)。不重启实例,新 handler 不会被识别,调用会 404。
2.5 验证自增长链路
新版 queryhandlers.t 已把 copy_handler 和 set_code 纳入基础包,无需再手工补装:
template:写模型树现有节点copy_handler:从模板复制、写入源码并编译新 handlerset_code:原地修改并重新编译已有 handlerdelete_object:删除对象、节点或不再需要的 handler
建议让 AI 调 deploy_handler 创建一个最简单的 ping(返回 <pong>1</pong>),再修改和删除它;全流程成功即说明自增长链路可用。
3. 启动 MCP 服务器
node server/mcp-server.cjs不需要 npm install(零第三方依赖)。也可 npm i -g . 安装后用 flexsim-mcp 命令启动。可选环境变量:
变量 | 默认值 | 作用 |
|
| 工具注册表路径 |
| 本机 WebServer | WebServer 地址(可用环境变量覆盖) |
| 未设置 | 启动时默认锁定的模型名(如 |
|
| 与 |
| 未设置( | 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: 120000Claude 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 个)
分类 | 工具 |
环境 |
|
实例 / 模型 |
|
树与节点 |
|
对象操作 |
|
运行控制 |
|
插件 |
|
文档
目录结构
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
└── .gitignoreJSON-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-RPCerror。 只有协议层错误才用error:-32700解析失败 /-32601方法不存在 /-32602参数无效。
测试
# 协议端到端测试(起真实 stdio 客户端,不需要 FlexSim)
node tests/test-mcp-protocol.cjs
# 语法自检
node --check server/mcp-server.cjstest-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
模型里没有装 handler → 按「快速开始」第 2 步导入,注意节点类型必须是 flexscript
装了但没重启实例 → handler 只在实例启动时加载,WebServer 里关掉再重开
装了但没 Ctrl+S → 重启后丢失
路径写错 → 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
Available Tools
25 toolsadd_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
Scored across 25 tools
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.
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.
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.
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
Related MCP Connectors
Create, update, and publish real hosted websites from your agent via the Aveiro API.
Remote MCP server exposing your Node Command fleet (files, shell, processes, browser) to AI hosts.
MCP server for AI access to Swagger by SmartBear.
Host any HTTP API as a standard MCP server; auto-distribute to 12+ mainstream agent platforms.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to load, translate, simulate, and analyze Modelica models in Dymola via the Model Context Protocol.2MIT
- FlicenseNot gradedqualityCmaintenanceFull-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-
- AlicenseCqualityCmaintenanceEnables 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.231MIT
- AlicenseBqualityCmaintenanceEnables 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.9MIT