Skip to main content
Glama

mikezero-mcp

用 MCP 无界面(headless)驱动 DHI MIKE Zero 的 MCP Server。

先说清楚一件事

**DHI 官方并没有叫 "MIKE Zero Commander" 的组件。

程序

作用

替代了 GUI 里的

MzLaunch.exe

从 setup 文件启动模拟,支持 MPI / GPU / 优先级

Launch Simulation Engine

ToolboxShell.exe

运行 Toolbox setup(.mzt/.21t/.3t/.lpkt/.mst

MIKE Zero Toolbox

MzPlotCompApp.exe

Plot Composer 批量出图

Plot Composer

本 server 就是把这套东西 + DHI 官方开源库 mikeio(读 dfs 结果)封装成 MCP 工具。


Related MCP server: Codex MCP Abaqus

安装

已经装好了。如果要安装:

# 1. 建虚拟环境(mikeio 需要 Python >= 3.12)
<python> -m venv .venv

# 2. 装依赖:mcp 必需;mikeio / mikeio1d 可选(只有读结果才需要)
.venv/Scripts/python.exe -m pip install -e .
.venv/Scripts/python.exe -m pip install -e ".[results]"   # mikeio:dfs0/1/2/3/dfsu
.venv/Scripts/python.exe -m pip install mikeio1d          # .res1d / .res11(MIKE 11)

本机实际装好的版本:mcp 2.2.0 + mikeio 3.3.0 + mikeio1d 1.3.1(Python 3.13.14)。

注意 mcp 2.x 把 FastMCP 改名为 MCPServermikezero_mcp/server.py 里做了 两代 API 的兼容适配,1.x / 2.x 都能跑。

注册到 WorkBuddy

编辑 ~/.workbuddy/mcp.json(注意不是 ~/.workbuddy/.mcp.json):

{
  "mcpServers": {
    "mikezero": {
      "type": "stdio",
      "command": "C:\\Users\\<你>\\.workbuddy\\mcp-servers\\mikezero-mcp\\.venv\\Scripts\\python.exe",
      "args": ["-X", "utf8", "-m", "mikezero_mcp.server"],
      "timeout": 120000,
      "disabled": false
    }
  }
}

⚠️ 千万不要写 env 字段(本工程踩过的最隐蔽的坑)

MCP 宿主(Electron/Node)用 child_process.spawn(cmd, { env }) 启动子进程, 而 Node 的 env整体替换语义,不是合并。只要 mcp.json 里写了 envSystemRoot 就会丢失;Windows 上 Python 首次 import asyncio 会连带 import _overlapped,winsock 初始化拿不到 SystemRoot 直接抛:

OSError: [WinError 10106] 无法加载或初始化请求的服务提供程序

于是 server 在导入阶段就崩掉,宿主侧只显示「连接失败 / 出错了」,毫无线索。 本机实测(同一台机器、同一份代码,只改启动环境):

启动时的环境

结果

完整继承父进程环境

✅ 握手成功

只给 {PYTHONPATH, PYTHONUTF8, PYTHONIOENCODING}

WinError 10106,rc=1

只给 {PYTHONPATH, SystemRoot}

✅ 握手成功

完全空环境(连 SystemRoot 都没有)

✅ 握手成功(靠下面的自愈代码)

所以本工程做了两件事,让启动与宿主的 env 语义完全无关

  1. mikezero_mcp/__init__.py 在导入任何第三方库之前,用 os.environ.setdefault()SystemRoot / windir / TEMP / TMP 补回去 —— 包初始化一定早于 server.py 里的 import mcp

  2. 不依赖 PYTHONPATH:靠 pip install -e . 的可编辑安装让 mikezero_mcp 可被导入;编码需求改用命令行开关 -X utf8 表达 (argv 不受 env 语义影响,环境变量才会)。

验证脚本:scripts/host_sim_test.py —— 它直接从 mcp.json 读配置, 分别用「继承 / 替换 / 空环境」三种基环境启动并真实握手。

写完后不会自动生效:到连接器管理页右上角的「自定义连接器」入口,对新出现的 server 点「信任」才会启动。注意:改动过 mcp.json 内容后,之前的信任记录 会因配置指纹变化而失效,需要重新点一次。


工具一览(15 个)

环境与勘察

工具

作用

mz_env

探测安装位置、bin/x64、三个无界面入口、引擎数量、mikeio 可用性

mz_engines

列出 MzEngines.cfg 的 扩展名 → 引擎 exe 映射(如 .m21fmFemEngineHD.exe

mz_scan

扫描工程目录,按类型归类 setup 文件与结果文件

mz_read_setup

解析 setup 文件(PFS 格式):引擎、段结构、输入文件引用、关键参数

运行模拟

工具

作用

mz_run

无界面启动单个模拟,返回作业 id(默认后台跑)

mz_run_batch

批量顺序执行多个 setup,生成 .bat(DHI 官方做法)并后台运行

mz_toolbox

运行 Toolbox setup

作业跟踪

工具

作用

mz_jobs

列出最近作业

mz_progress

实时进度:百分比、当前模拟时刻、步数、速度、预计剩余时间、完成标志

mz_job_status

进程是否存活、耗时、日志文件、报错行、新增的结果文件(递归扫描结果子目录)

mz_job_log

读日志末尾 N 行(优先给 ._spi_

mz_job_kill

终止作业(taskkill /T,连带子进程)

读结果(需要 mikeio / mikeio1d)

工具

作用

mz_dfs_info

元信息:类型、条目名/单位、时间轴、网格规模;1D 结果额外给出河段与节点

mz_dfs_read

读数据:最大/最小/均值 + 抽样序列(自动截断,不撑爆上下文)

mz_dfs_plot

画成 PNG

支持的格式:

格式

说明

.dfs0/.dfs1/.dfs2/.dfs3/.dfsu

mikeio

时间序列 / 栅格 / 非结构网格

.res1d/.res11

mikeio1d

MIKE 11 / 1D 结果,列名形如 Water Level:CALI:0(量:河段:里程)


用法示例

1. 先看环境

mz_env()
mz_engines(extension=".m21fm")

2. 勘察工程目录

mz_scan(root="D:\\Projects\\Odense")
mz_read_setup(setup="D:\\Projects\\Odense\\odense.m3fm")

3. 跑一个模拟(8 子域 MPI)

mz_run(setup="D:\\Projects\\Odense\\odense.m3fm", mpi=8)
→ {"ok": true, "runner": "mzlaunch",
   "job": {"id": "a1b2c3d4e5f6", "status": "running", ...}}

mz_progress(job_id="a1b2c3d4e5f6")
→ {"progress_percent": 42.5, "current_sim_time": "2000/1/13 4:20:00",
   "step": 1897, "total_steps": 4464, "time_left_seconds": 510, "completed": false}

mz_job_status(job_id="a1b2c3d4e5f6")
mz_job_log(job_id="a1b2c3d4e5f6", lines=100)

3b. 直调引擎(跑完保留 ._spi_

mz_run(setup="D:\\P\\Test1.sim11", direct=True)
→ {"ok": true, "runner": "direct:MIKE11.exe",
   "job": {"cmd": ["...\\MIKE11.exe", "-b", "...\\Test1.sim11"], ...}}

direct=True 会按 MzEngines.cfg 从扩展名找引擎,并套用该引擎自己的开关 (MIKE 11 用 -b,MIKE SHE 用 /Silent,FemEngine 不加)。

4. 批量跑三个工况

mz_run_batch(setups=[
  "D:\\P\\Scenario1.m21fm",
  "D:\\P\\Scenario2.m21fm",
  "D:\\P\\Scenario3.m21fm"
])

5. 读结果

mz_dfs_info(path="D:\\P\\Scenario1_Result.dfsu")
mz_dfs_read(path="D:\\P\\Result.dfs0", item="Water Level", max_points=300)
mz_dfs_plot(path="D:\\P\\Result.dfs0")

6. 读 MIKE 11 结果(1D)

mz_dfs_info(path="D:\\P\\CALI-HD.res11")
# → quantities: ['Water Level', 'Discharge'], n_reaches: 3, n_nodes: 4

mz_dfs_read(path="D:\\P\\CALI-HD.res11", item="Water Level")      # 按量名
mz_dfs_read(path="D:\\P\\CALI-HD.res11", item="Water Level:CALI:0")  # 按列名
mz_dfs_plot(path="D:\\P\\CALI-HD.res11")

命令行参数对照(实测自 exe 内嵌 usage)

MzLaunch.exemz_run 默认走这条)

Usage: MzLaunch [model-setup-file] [Options]

参数

含义

对应本服务参数

-x

模拟结束后退出 MzLaunch

exit_when_done=True(默认)

-e <engine>

引擎 exe 完整路径

engine= / engine_flag=

-z <mzp|folder>

结果目录

result_dir=

-y 1|2|3|4

CPU 优先级(1 低,2 低于正常,3 正常,4 高于正常)

priority=

-mpi N

N 个子域做 MPI 并行

mpi=

-gpu N / -gpusp N

双精度 / 单精度 GPU,N 为子域数

gpu=

-x86

在 64 位系统上用 32 位引擎

-r <ms>

扫描模拟日志的刷新间隔,默认 200 ms

-m <email>

模拟结束发邮件通知

-h

显示帮助 —— 弹对话框,不是打印到控制台

-run

⚠️ 未在官方 usage 中列出。实测加不加都能正常跑,本服务默认不加

silent=

引擎直调(mz_run(direct=True))—— 每个引擎的开关都不一样

引擎

官方 usage

批处理/静默开关

MIKE11.exe

Syntax: MIKE11 [Options] SimulationFileName

-b 批处理(出错不弹框,进度照写-s 全静默(会把 ._spi_ 清成 0 字节-v 仅校验 · -w 独立进度窗 · -lx 语言

MSHE_Simulation.exe

Usage: MShe_Simulation.exe [/Silent] [/PP] [/WM] [/WQ] pfs

/Silent(斜杠风格)

FemEngineHD.exe

Usage: <pfs-file>

无静默开关;可选 -gpu / -gpusp

所以 direct=True 时本服务按 exe 名查表选开关,不会拿 -run-b 乱套。


日志与进度(实测规律)

跑一次 MIKE 11 之后,setup 目录里会出现这些文件:

文件

内容

用途

<setup名>._spi_

逐行进度纯文本

最佳进度来源mz_progress 就读它)

<setup名>-SimStat.Log

// Simulation Started : <时间> / Simulation Ended : <时间>

判断是否跑完

<setup名>.Log

通常为空,出错时才有内容

查错

<setup名>-Info.Log

通常为空

查错

._spi_ 的真实内容(节选):

MESSAG Setup Finished (858 Kb)
MESSAG Starting time loop (858 Kb)
STATUS 2000/1/1 0:10:00        <- 当前模拟时刻
MESSAG 1 of 4464               <- 步数进度
PROGRE 0                       <- 进度千分比(1000 = 完成)
COMSPD 1                       <- 计算速度
TIMLFT 182983                  <- 预计剩余秒数
...
MESSAG 4464 of 4464
PROGRE 1000
MESSAG Completed               <- 完成标志
CLOSE  0                       <- 0 = 正常退出

FemEngine 的 SPI 字段名不一样(MIKE 21/3 FM 系列,实测 .m3fm):

MESSAG Initializing
STALBL Simulation date and time [YYYY-MM-DD hh:mm:ss]
STATUS 2004-01-01 00:00:00     <- 当前模拟时刻
MESLBL Simulation time step
MESSAG Time step: 0            <- 步数进度(不是 MIKE 11 的 "N of M")
PROGRE          0              <- 千分比
COMSPD      14329              <- 计算速度

即:里程碑标签是 STALBL / MESLBL,步数写成 Time step: N没有 TIMLFT(预计剩余时间)—— 所以 FemEngine 上 time_left_seconds 恒为 0,别把它当成异常。

三个必须记住的坑:

  1. -s(全静默)会把 ._spi_ 清成 0 字节,进度就没了。 后台跑又要进度 → 用 -b,不要用 -s

  2. 经 MzLaunch 启动时,模拟一结束 ._spi_ 就被删掉;直调引擎则保留。 本服务会自动把 SPI 归档到 state/jobs/<作业id>.spi,跑完仍可回溯。

  3. MzLaunch 模式下,作业结束后 mz_progress 会停在归档的最后一帧 (实测 81.4% / Time step: 391),因为引擎收尾写的那几帧随 SPI 一起被删了。 这是归档机制的必然结果,不是卡住 —— 判断是否跑完请以 statusfinished)和 exit_code0)为准,别盯着百分比等 100%。 直调引擎模式下 SPI 保留,能看到完整的 100%。


结果文件在哪

不在 setup 根目录,而在 <setup 文件名> - Result Files\ 子目录里:

demo/mike11_smoke/
├── Test1.sim11                        ← setup
├── Test1._spi_                        ← 进度
├── Test1-SimStat.Log                  ← 起止时间
└── Test1.sim11 - Result Files/
    └── Test1.res11   (987,772 B)      ← 结果在这里

所以 mz_job_status 的目录快照是递归的(只扫根目录会把结果全漏掉)。


已知限制

  1. MzLaunch.exe 是 GUI 子系统程序,没有可用 stdout-h 也会弹对话框)。 本 server 不依赖 stdout,进度全部来自引擎写的 ._spi_-SimStat.Log

  2. 许可:读结果(mz_dfs_*)免许可;跑模拟需要有效的 DHI 许可, 否则 MIKE Zero 会以 DEMO 模式启动并限制模型规模。

  3. 许可通常是单机独占的 → 同一时刻只跑一个模拟。 上一个作业的进程还没 完全退出就启动下一个,引擎会因拿不到许可快速失败(退出码非 0、._spi_ 不生成)。实测:紧接 MzLaunch 之后再起一个引擎,耗时 16.9 s 后 rc=1; 等进程退出后再起,1.6 s 就 rc=0。 mz_run 检测到其他作业仍在运行时会返回 warning 提醒。 要多工况请用 mz_run_batch(内部顺序执行),不要手工并发; 单个模型内部并行用 -mpi

  4. mikeio 需要 Python >= 3.12mikeplus(MIKE+ 专用)才要求 3.9–3.11, 两者不要混。

  5. mikeio1d 依赖 pythonnet + .NET 运行时。本机已装通,换机器时若导入失败, 先确认 .NET 运行时可用。

  6. .res11 读的是 MIKE 11 结果;MIKE 11 / MIKE FLOOD 自 2024 版起已并入 MIKE+, 2023 及更早版本仍可正常使用。

  7. 各引擎的静默开关不统一-b / /Silent / 无),跨引擎切换时注意。 表里没有的引擎,本服务不会擅自加开关,可用 extra_args 手工补。

  8. 启动环境mcp.json 里不要写 env(原理见上文「注册到 WorkBuddy」), 否则可能以 OSError: [WinError 10106] 在导入阶段崩溃。代码已做自愈, 但仍建议保持配置干净。

冒烟 / 集成测试

不用启动 MCP 客户端,直接跑脚本:

# 1) 环境 / 解析 / 扫描(快,不跑模拟)
.venv/Scripts/python.exe scripts/smoke_test.py

# 2) 真跑一次 MIKE 11 模拟,对照四种入口
.venv/Scripts/python.exe scripts/run_smoke.py A   # MIKE11.exe -b -s
.venv/Scripts/python.exe scripts/run_smoke.py C   # MIKE11.exe -b(保留进度)
.venv/Scripts/python.exe scripts/run_smoke.py B   # MzLaunch -run -x
.venv/Scripts/python.exe scripts/run_smoke.py D   # MzLaunch -x

# 3) 作业 / 进度 / 结果 全链路集成测试
.venv/Scripts/python.exe scripts/test_run_integration.py

# 4) 排查用:单步观察状态/进度/归档
.venv/Scripts/python.exe scripts/diag_direct.py

# 5) 启动链路:模拟宿主(继承 / 替换 / 空环境)启动并真实握手
.venv/Scripts/python.exe scripts/host_sim_test.py

本机实测结果

环境与解析:15 个工具;识别到 MIKE Zero 2023;解析出 30 条引擎映射; 成功解析 5 个真实官方算例(.m21fm/.m3fm/.sim11/.she/.couple); 扫描 Examples 1684 个文件(392 setup + 776 结果)。

真实跑通模拟 —— 用的是官方算例 MIKE_ZERO\AutoCal\MIKE_11\Example1\Setup\Test1.sim11 的副本 (MIKE 11 HD,2000-01-01 → 2000-02-01,步长 10 s,共 4464 步):

入口

命令

耗时

退出码

结果

._spi_

直调·全静默

MIKE11.exe -b -s <setup>

3.0 s

0

Test1.res11 987,772 B

被清成 0 字节

直调·保留进度

MIKE11.exe -b <setup>

2.4 s

0

同上

1,666 B(完整进度)

MzLaunch

MzLaunch.exe <setup> -run -x

3.6 s

0

同上

结束后被删

MzLaunch

MzLaunch.exe <setup> -x

2.4 s

0

同上

同上

mz_progress 的实时轨迹(0.8 s 采样):

[0.0s] status=running   None%    spi 尚未生成
[0.8s] status=running    0.0%   t=2000/1/1 0:10:00  step=1/4464     speed=1       left=182983s
[1.6s] status=finished 100.0%   t=2000/2/1          step=4464/4464  speed=239820  left=0s  done=True

结果读取mz_dfs_readCALI-HD.res11 读出水位 min 56.272 / max 58.610bathy.dfs2 读出 -10.0 m;Waves_Constant.dfsu 读出有效波高。

FemEngine 回归(MIKE 3 FM / .m3fm —— 算例 Examples\MIKE_3\FlowModel_FM\ST\Basin\Sim1.m3fm 的副本 (3D 水动力 + 输沙,12 线程,480 步 × 10 s = 4800 s,网格 174 单元):

入口

命令

耗时

退出码

结果

._spi_

MzLaunch

MzLaunch.exe <setup> -x

16.3 s

0

4 个 dfs 文件

结束后被删

直调引擎

FemEngineHD.exe <setup>

23.0 s

0

同上

保留(2,158 B)

日志尾部(Sim1.log):Calculation 32.4 s CPU / 3.3 s elapsed,峰值内存 61.7 MBNumber of warnings: 0Normal run completion。 产出:Sim1_HD.dfs0(2 点位水位)、Sim1_HD.dfs1Sim1_ST.dfs1Sim1_ST.dfsu(Dfsu2DH,7 个条目)。

mz_progress直调模式下可用(MzLaunch 会删 SPI,只能读归档):

status=running    81.8%   t=2004-01-01 01:05:30   Time step: 393   speed=12634
status=running    99.9%   t=2004-01-01 01:20:00   Time step: 480   speed=11794
status=finished   exit=0  elapsed=23.0s

读出的量:Point 1 水位 481 步(min -0.0172 / max 0.0 / mean -0.0144 m); Depth average U velocity 41×174(min -0.00355 / max 0.00483 m/s)。

注意:该 setup 里写着 number_of_domains = 16实际只起了 1 个子域 (日志明确 Number of subdomains: 1,12 线程/子域)—— 分域数由许可与启动方式 决定,不能只看 setup 里的声明值。

MCP 协议:真实 stdio 握手成功(protocol 2025-11-25),15 个工具可见可调。

启动环境语义scripts/host_sim_test.py,从 mcp.json 读配置真实启动): mikezerohecras 两个 server 在「继承 / 替换 / 空环境」三种基环境下 均能完成握手 —— 即本 server 的启动与宿主的 env 语义无关。

启动失败(宿主里显示「出错了」)的排查顺序

遇到宿主侧加载失败,按这个顺序查,别急着怀疑代码

  1. 先证明 server 本身是好的:直接跑 scripts/host_sim_test.py。 它通过 → 问题在宿主侧的环境/配置,不在 server。

  2. 看宿主日志~/.workbuddy/logs/daemon.logmain.log, 按 server 名 grep;MCP app 目录扫描在 mcp-apps-diag.logcatalog.refresh scanned=… accepted=…)。

  3. 确认配置真的被读~/.workbuddy/mcp-approvals.json 里有该 server 的 指纹记录,说明宿主识别到了这条配置。

  4. 最常见的两个原因

    • env 字段导致 WinError 10106(见上文,已自愈);

    • 改完 mcp.json没重启宿主 / 没重新点信任(指纹变了)。

真跑之后才发现的坑(都已修)

  1. 结果在 - Result Files 子目录 —— 目录快照原本是非递归的,结果全被漏掉。

  2. -s 会清空 ._spi_ —— 想后台跑又要进度,只能用 -b

  3. MzLaunch 结束后删 ._spi_ —— 所以本服务会归档到 state/jobs/<id>.spi

  4. 上一轮遗留的 SPI / SimStat 会污染新作业 —— 新作业开局就被判「已完成」。 现在用「启动时指纹 + mtime ≥ started_at」双重过滤。

  5. 各引擎开关不统一 —— -b / /Silent / 无,必须按 exe 名查表。

  6. mz_progressmz_job_status 的状态判断必须共用一套逻辑 —— 否则一个说 running 一个说 finished。现已抽成 JobRegistry._sync()

  7. 退出码会永远拿不到 —— 原实现只在状态还是 running 时才 poll();一旦状态 被 SPI 判定为 finished,就再也不取退出码,exit_code 恒为 null。 现在只要还没拿到码就继续 poll。

  8. 许可证单机独占 —— 两个模拟挨着跑,第二个会因拿不到许可而 rc=1 (实测耗 16.9 s 才失败)。mz_run 现在检测到并发会返回 warning

  9. mz_dfs_read / mz_dfs_plot 的「整数序号」其实是坏的(FemEngine 回归时抓到):

    • plotitem 直接透传给 mikeio.read(items=...),传 0 会被当成名字, 报 KeyError: Selected item name not found

    • read 虽然写了 isinstance(item, int) 分支,但实测 item 抵达时是字符串 (宿主会把 JSON 里的整数序号序列化成 "1"),于是走进「按名字查」的分支, 同样 KeyError,且静默降级成 series["1"]["error"]

    修法:新增 _coerce_index() 把纯数字串转成 int,四条路径(read/plot/ _read1d/_plot1d)统一走它;plot 改为先读全部再按名字取; 越界/无匹配返回带候选清单的友好错误。 顺带把 read 返回的 time 也做了抽样(原先 481 步的 dfs0 会把上下文灌满)。 回归脚本:scripts/verify_dfs_item_fix.py(13/13 通过)。

目录结构

mikezero-mcp/
├── mikezero_mcp/
│   ├── locate.py    定位安装、bin/x64、无界面入口
│   ├── pfs.py       MzEngines.cfg + PFS setup 解析
│   ├── spi.py       解析 ._spi_ 进度与 -SimStat.Log
│   ├── jobs.py      启动模拟(MzLaunch / 直调引擎)、作业注册表、SPI 归档
│   ├── dfs.py       mikeio / mikeio1d 读结果(可选依赖)
│   └── server.py    MCP server 与 15 个工具
├── scripts/
│   ├── smoke_test.py             环境 / 解析 / 扫描 冒烟
│   ├── run_smoke.py              真跑一次模拟(A/C/B/D 四种入口对照)
│   ├── test_run_integration.py   作业 / 进度 / 结果 全链路集成测试
│   ├── diag_direct.py            单步观察状态 / 进度 / 归档
│   ├── verify_dfs_item_fix.py    结果读取入参回归(名字 / 序号 / 越界)
│   └── host_sim_test.py          模拟宿主启动(继承 / 替换 / 空环境)
├── demo/                         【本地目录,不入库】官方算例副本,见下方说明
├── state/                        【本地目录,不入库】作业元数据 + SPI 归档
├── pyproject.toml
├── .gitignore
└── README.md

demo/state/ 为什么被 .gitignore 排除? state/ 是运行时数据,含本机绝对路径;demo/ 放的是从 MIKE Zero 安装目录 复制出来的官方算例,版权属 DHI,随包分发会侵权。 想复现本文档里的实测,按「冒烟 / 集成测试」一节的说明,自己把算例拷进 demo/ 即可 —— 目录名对上就行。

Available Tools

15 tools
mz_dfs_infoA

读取结果文件元信息:类型、条目名称/单位、时间轴、网格规模。

支持 dfs 系列(.dfs0/.dfs1/.dfs2/.dfs3/.dfsu,走 mikeio) 以及 MIKE 11 / 1D 结果(.res1d/.res11,走 mikeio1d)。

Args: path: 结果文件绝对路径。

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral burden; the explicit verb '读取' does signal a read-only operation and the format list explains which backends are used. It does not mention errors on unsupported files, file-size performance, or what happens when metadata is unavailable, leaving some behavioral uncertainty.

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 front-loads the purpose in a single sentence and then gives only the supporting format and argument details. Every sentence adds information and there is no filler.

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 one-parameter metadata reader with no output schema, the description covers the expected return facets (type, item names/units, time axis, grid size), accepted file families, and the required absolute path. It could be more complete by noting failure behavior on invalid paths or unsupported files, but nothing essential is missing for normal use.

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?

Although schema description coverage is 0%, the Args section supplies 'path: 结果文件绝对路径', adding the crucial requirement that the path be absolute, which the bare schema ('Path') omits. The supported-format list in the main description also constrains what path should point to.

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 opens with '读取结果文件元信息' and then enumerates exactly what is returned: 类型、条目名称/单位、时间轴、网格规模. This clearly distinguishes it from siblings mz_dfs_read and mz_dfs_plot by scoping it to metadata retrieval rather than data reading or plotting.

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 tells the agent which file families are supported (.dfs0/.dfs1/.dfs2/.dfs3/.dfsu and .res1d/.res11), so suitable inputs are clear. However, it does not explicitly state when to prefer this over mz_dfs_read or mz_dfs_plot, nor any when-not conditions; the routing is only implied by the word 'info' and the file-type list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_dfs_plotA

把结果序列画成 PNG 图片,返回图片路径。支持 dfs 系列与 1D 结果。

Args: path: 结果文件绝对路径。 item: 条目名 / 量名 / 序号;不传则取第一项。 out_png: 输出 PNG 路径;不传则与结果文件同目录同名。

ParametersJSON Schema
NameRequiredDescriptionDefault
itemNo
pathYes
out_pngNo

TDQS

A4.3/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. It discloses the core side effect (creates a PNG file), the return value (image path), and default naming/location of the output. However, it does not mention overwrite behavior, error conditions, or whether the input file is left untouched, which would improve transparency.

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 main purpose is front-loaded in one sentence, followed by a compact, structured Args list. Every sentence provides useful information and there is no filler.

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 plotting tool with no output schema and no annotations, the description gives enough to invoke it correctly: required path, optional parameters with defaults, and return value. It could mention overwrite or failure behavior, but those are minor for basic usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description fully compensates by explaining all three parameters: path is an absolute result file path, item selects a named entry or index and defaults to the first item, and out_png defaults to a sibling of the result file. This adds real meaning beyond the bare 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 states a clear verb–resource pair: plot result sequences into a PNG image and return the image path. It also names supported input classes (dfs series and 1D results), which distinguishes it from sibling tools like mz_dfs_read or mz_dfs_info.

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 intended use is clear from the description: whenever a result sequence needs to be visualized as a PNG. It states supported input types and default behaviors. It does not explicitly name alternatives or exclusions, but there is no competing plotting tool among the siblings, so clear context suffices.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_dfs_readA

读取结果数据:统计量(最大/最小/均值)与抽样后的序列。

数据量大时自动抽样到 max_points 个点,避免撑爆上下文。 对 1D 结果(.res1d/.res11),item 可传量名(如 "Water Level",返回该量的前几列) 或具体列名(如 "Water Level:CALI:0",即 量:河段:里程)。

Args: path: 结果文件绝对路径。 item: dfs:条目名或序号。1D:量名 / 列名 / 序号。不传则取第一项。 start: 起始时间,如 "1989-07-27 00:00"。 end: 结束时间。 max_points: 序列抽样点数上限,默认 500。

ParametersJSON Schema
NameRequiredDescriptionDefault
endNo
itemNo
pathYes
startNo
max_pointsNo

TDQS

A4/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 explicitly states that data is auto-sampled to max_points to avoid context overflow, explains how 'item' works for 1D results with examples, and notes that omitting 'item' defaults to the first item. It does not cover error handling or exact return structure, but the key behaviors are transparent.

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 appropriately concise and front-loaded with the purpose. The Args section is somewhat verbose but each sentence adds necessary detail, especially the item handling example. The structure is logical: purpose, behavior, then parameter explanations. No waste, though it could be tightened slightly.

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 5-parameter tool with no output schema and no annotations, the description is fairly complete. It covers all parameters, explains sampling behavior, and gives item examples. It does not describe the exact return format of statistics or series, nor error cases, but these are minor given the tool's scope and the absence of output schema. Overall, an agent can use this description effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides zero descriptions (0% coverage), so the description must fully explain parameters. It does: path is absolute path, item is explained with examples for both dfs and 1D cases, start/end are time strings with format example, and max_points is clearly the sampling limit. Every parameter is addressed with practical detail, going well beyond the schema's type/default information.

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 reads result data and returns statistics (max/min/mean) plus sampled series. The verb '读取' (read) is specific, and the resource is well-defined. It distinguishes itself from siblings like mz_dfs_info (metadata) and mz_dfs_plot (visualization) by focusing on actual data extraction.

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 explains what the tool does and how to use its parameters, but it provides no guidance on when to choose this tool over alternatives. It does not mention exclusions or conditions that would make another sibling more appropriate, such as when to use mz_dfs_plot instead for visualization or mz_dfs_info for metadata. The usage context is only implied by the tool's name and purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_enginesB

列出 MIKE Zero 的 扩展名 -> 引擎 映射(来自 MzEngines.cfg)。

Args: extension: 可选,只看某个扩展名,如 ".m21fm"。 year: 可选,指定 MIKE Zero 年份。

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNo
extensionNo

TDQS

B3.4/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. '列出' implies a read-only listing operation, and the mention of MzEngines.cfg adds useful source context, but side effects, error behavior, and output format are not disclosed.

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 compact and well-structured, with the purpose front-loaded and parameter details presented in a clear Args block. Every sentence earns its place.

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 simple two-optional-parameter list tool, the core invocation details are present, but with no output schema and no annotations, the return shape and the exact effect of the year filter are left unspecified. Adequate but not fully complete.

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 description coverage is 0%, and the description compensates by explaining both parameters: extension is optional and demonstrated with '.m21fm', and year is optional and scopes the MIKE Zero version. This adds real meaning beyond the bare schema.

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 a specific verb ('列出' / list) and a concrete resource ('扩展名 -> 引擎 映射' from MzEngines.cfg). It clearly identifies what the tool does, though it does not explicitly contrast itself with any 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 Guidelines2/5

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

There is no guidance about when to use this tool versus alternatives, nor any exclusions or prerequisites. The Args section explains parameters but not usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_envB

探测本机 MIKE Zero 环境:安装位置、bin/x64、无界面入口、引擎数量、mikeio 可用性。

Args: year: 可选,指定 MIKE Zero 年份(如 "2023");不传则取最新安装。

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNo

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It lists what is probed, implying a read-only diagnostic tool, but it never explicitly states that it is non-destructive, whether it requires special permissions, or what happens if no MIKE Zero installation is found. This is a significant gap because there are no other behavioral cues.

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: two sentences, with the purpose stated first and the argument explained second. Every word earns its place, and there is no redundant or filler 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?

For a one-parameter probe tool with no output schema, the description covers the core purpose and the parameter semantics well. However, it does not describe the shape or format of the probe results (e.g., fields returned, error behavior), which an agent would need to interpret the output correctly. Given the lack of an output schema, this omission leaves the agent partially in the dark.

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 only defines year as an optional string or null with default null, so the description adds crucial meaning: year selects a specific MIKE Zero version and omitting it defaults to the latest installation. It also provides an example value ('2023'), which is exactly the kind of compensation needed when schema description coverage is 0%.

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 a specific action ('探测') on a defined resource ('本机 MIKE Zero 环境') and enumerates the exact aspects checked (installation location, bin/x64, headless entry, engine count, mikeio availability). This distinguishes it from many siblings, though it does not explicitly contrast with mz_engines, which likely overlaps on engine count.

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?

There is no guidance on when to use mz_env versus alternatives like mz_engines or mz_scan. The description explains what the tool does but never provides a selection condition, exclusion, or reference to siblings, leaving the agent to infer the appropriate use case.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_job_killB

终止一个作业(连同其子进程,用 taskkill /T)。

Args: job_id: 作业 id。 force: 是否强制结束,默认 True。

ParametersJSON Schema
NameRequiredDescriptionDefault
forceNo
job_idYes

TDQS

B3.3/5.0
Behavior2/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 does mention that child processes are killed (taskkill /T) and that force defaults to true, but it does not warn about irreversibility, permissions, or side effects on other jobs. For a destructive operation, this leaves significant gaps.

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: a one-sentence purpose statement followed a short parameter list. No filler or repetition. The purpose is front-loaded, and every sentence is informative. It earns its place entirely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

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

For a simple tool with 2 parameters and no output schema, the description is thin on context. It omits what happens after a successful kill, error handling, prerequisites (e.g., the job must exist or be running), and how to obtain job_id. It also doesn't reference siblings like mz_jobs for listing jobs, leaving agents to infer basic operational details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. The 'job_id' explanation ('作业 id') merely restates the schema title, adding no meaning. 'force' does add meaning (whether to force-terminate, default True), but this is minimal and does not fully substitute for the missing schema descriptions.

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 a specific verb and resource: '终止一个作业' (terminate a job) with the extra detail that it kills child processes using taskkill /T. This distinguishes it from siblings like mz_job_status and mz_job_log, so an agent can select it without opening schemas.

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?

Usage is implied by the action itself—'terminate a job'—but there are no explicit when-to-use/when-not-to-use conditions or named alternatives. An agent must infer that this is the tool for stopping jobs rather than checking status or logs, which is clear from the verb but not spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_job_logA

读取作业日志末尾若干行(MIKE Zero 把进度写在结果目录的 .log 里)。

Args: job_id: 作业 id。 lines: 读取末尾行数,默认 200。

ParametersJSON Schema
NameRequiredDescriptionDefault
linesNo
job_idYes

TDQS

A3.5/5.0
Behavior3/5

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

没有注释信息,描述承担了揭示行为的责任。它说明了读取范围(末尾若干行)、默认行数(200)以及日志位置(结果目录下的 .log),但未提及输出格式、可能的失败模式或读取是否安全。对于只读工具,这些信息部分足够,但仍不完整。

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?

描述简短精炼,先给出一句话功能概括,再列出参数说明,没有任何冗余。每一句都有实际价值,结构清晰,易于快速理解。

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?

工具结构简单(2 个参数、1 个必填),描述覆盖了核心行为、参数含义和默认值。虽然没有输出 schema,但“读取日志末尾若干行”已经暗示返回内容是日志文本,足够支持正确调用。缺失的部分主要是与兄弟工具的区分和异常行为说明。

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 没有任何参数描述(覆盖率为 0%),描述中为 job_id 和 lines 补充了含义:job_id 是作业 id,lines 是读取末尾行数并默认 200。这远超 schema 提供的价值,足以帮助代理正确传参。

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?

描述明确说明了工具功能:读取作业日志末尾若干行,并指出 MIKE Zero 将进度写入结果目录的 .log 文件。有清晰的动词和资源,但没有与其他兄弟工具(如 mz_progress、mz_job_status)做显式区分,因此未达到 5 分。

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?

描述仅说明该工具读取日志尾部,未说明何时应使用 mz_job_log 而非 mz_progress 或 mz_job_status,也未提供替代工具或排除场景。缺少实际使用指导,只能从功能上推断用途。

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_jobsB

列出最近的作业(模拟 / 批量 / 工具箱)。

Args: limit: 最多返回多少条,默认 20。

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It discloses that the tool lists recent jobs and that limit caps the count, but it does not mention ordering, whether the list is read-only, whether it includes running/completed/failed jobs, or any side effects. For a listing tool this is a moderate gap.

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 short and front-loaded with the core purpose. The Args section is minimal but useful. It earns its place, though it could be slightly more structured with explicit notes on ordering or status filtering.

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 simple list tool with one optional parameter and no output schema, the description is mostly adequate. However, it lacks any mention of what fields are returned, how jobs are ordered, or whether the list includes all statuses. Given the sibling tools for job status/log/kill, an agent would benefit from knowing what 'recent jobs' means in terms of status and time window.

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 0%, so the description must compensate. It does explain the only parameter, limit, with a default of 20, which matches the schema. However, it adds no detail about allowed range, semantics of 'recent', or how the limit interacts with pagination. Baseline 3 is appropriate because the single parameter is at least explained.

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 states a specific verb ('列出' = list) and resource ('最近的作业' = recent jobs), and clarifies the scope by enumerating job types (模拟/批量/工具箱). It is clear enough to distinguish from siblings like mz_job_status or mz_job_log, though it does not explicitly name a sibling alternative.

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: call this to list recent jobs, and the limit parameter controls how many are returned. It does not explicitly state when to use this versus mz_job_status, mz_job_log, or mz_progress, so the agent must infer the distinction from the job-type enumeration.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_job_statusA

查询作业状态:进程是否存活、耗时、日志文件、报错行、新增结果文件。

Args: job_id: mz_run / mz_run_batch / mz_toolbox 返回的作业 id。

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

TDQS

A4.1/5.0
Behavior4/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 explaining behavior. It does so by explicitly listing the status dimensions returned: process liveness, elapsed time, log file, error line, and new result files. It does not cover return format or error handling, but for a read-oriented status query the behavioral disclosure is reasonably complete.

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 and well-structured: one sentence summarizes the query purpose and output facets, followed by an Args section defining the parameter. No filler or redundant information is present.

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 status query with no annotations and no output schema, the description is mostly complete: it defines the parameter source and the kind of information returned. It could be more complete by describing the response format or expected error behavior, but the essential context for invoking it correctly is present.

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 0%, so the description must compensate for the parameter's meaning. It does this well by explaining that job_id is the identifier returned by mz_run, mz_run_batch, or mz_toolbox, adding meaningful provenance beyond the schema's generic 'Job Id' string.

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's purpose: query job status and enumerates what it reports (process liveness, duration, log file, error line, new result files). It identifies the job_id as coming from mz_run/mz_run_batch/mz_toolbox, but it does not explicitly distinguish itself from closely related siblings like mz_progress, mz_jobs, or mz_job_log.

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 clear context: it is used with a job id returned by mz_run, mz_run_batch, or mz_toolbox. This implies the tool is meant to be called after launching a job, but it does not explicitly state when to prefer this over alternatives such as mz_progress or mz_job_log.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_progressA

读某个作业的实时进度:百分比、当前模拟时刻、步数、计算速度、剩余时间。

数据来自引擎写的 <setup名>._spi_(例如 PROGRE 1000 表示完成)。 若原文件已被 MzLaunch 删除,则读本服务归档的副本。

Args: job_id: mz_run 返回的作业 id。

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYes

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. It discloses that data is sourced from an engine-written `<setup名>._spi_` file, with the example `PROGRE 1000` meaning completion, and that it reads an archived copy if MzLaunch deleted the original. This explains the tool's internal fallback behavior. It could add failure handling or latency notes, but for a read-only progress tool the disclosure is above average.

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 compact: a one-line purpose, a concise data-source note, a fallback sentence, and the Args line. Every sentence serves a purpose and there is no filler. The most important information is front-loaded in the first line, and the parameter note is clearly separated.

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 one-parameter, no-output-schema tool, the description covers purpose, data source, fallback behavior, and parameter origin. It does not specify the exact response structure or error scenarios, and the absence of an output schema could merit more detail on the return format, but the listed metrics partially compensate. Overall it is nearly complete for the task of retrieving progress.

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 0%, but the description explicitly documents job_id as "mz_run 返回的作业 id" (the job id returned by mz_run). This adds meaningful provenance beyond the bare schema property, telling the agent exactly where the value comes from. It doesn't give format examples, but for a single simple string parameter this is 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?

Description opens with a specific verb and resource: "读某个作业的实时进度" (read a job's real-time progress), then enumerates the exact metrics returned (percentage, current simulation time, steps, speed, remaining time). This is clearly distinct from sibling tools like mz_job_status or mz_job_log, making the purpose unambiguous without needing to reference siblings.

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 clear context: it reads progress data written by the engine to a `_spi_` file, and falls back to an archived copy if the original was deleted by MzLaunch. It also states that job_id comes from mz_run, which tells the agent when this tool is relevant. However, it does not explicitly name alternatives or explain when not to use it, so it misses the top bar for exclusion guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_read_setupA

解析一个 MIKE Zero setup 文件(PFS 格式),返回引擎、段、文件引用、关键参数。

Args: setup: setup 文件绝对路径,例如 .m21fm / .sim11 / .she / .couple / .mzt。 year: 可选,指定 MIKE Zero 年份。

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNo
setupYes

TDQS

A3.9/5.0
Behavior3/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 states the tool 'parses' and 'returns' data, implying a read-only operation, but does not explicitly confirm no side effects, nor does it mention potential errors, file existence requirements, or output format. The level of transparency is minimal but not misleading.

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—two sentences total—with the purpose front-loaded and parameter details following. Every word contributes, and the format (description followed by Args) is clean and scannable.

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?

The tool has no output schema, so the description should clarify return structure. It lists what is returned (engine, sections, file references, key parameters) but does not specify the format (e.g., dict, list) or error behavior. Given the tool's simplicity, this is a minor gap, but for an agent invoking it, knowing the return shape 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?

The description explains both parameters meaningfully: setup is an absolute path with concrete examples, and year is an optional MIKE Zero version selector. This adds value beyond the bare schema types, which only define string/null. Given 0% schema coverage, the description effectively compensates, though it could be more explicit about year's effect.

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 parses MIKE Zero setup files in PFS format and enumerates the extracted content (engine, sections, file references, key parameters). This distinguishes it from sibling tools like mz_dfs_read which read data files, and mz_scan which likely scans projects. The verb 'parse' and resource 'setup file' are specific.

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 for reading setup files by providing file extension examples (.m21fm, .sim11, etc.) but does not explicitly state when to use this tool versus alternatives like mz_dfs_read or mz_scan. There is no mention of exclusion criteria or alternative selection, leaving some inference required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_runA

无界面启动一次 MIKE Zero 模拟,返回作业 id。

默认后台运行,用 mz_progress / mz_job_status / mz_job_log 跟踪进度。

两种入口(实测 MIKE Zero 2023):

  • direct=False(默认)走 MzLaunch.exe:支持 -e/-mpi/-gpu/-y/-z, 但模拟结束后会删掉 ._spi_ 进度文件(本服务会先归档)。

  • direct=True 直接调引擎 exe(如 MIKE11.exe / FemEngineHD.exe):开关按引擎 自己的语法拼装,._spi_ 跑完仍保留。不支持 -mpi/-gpu/-z。

Args: setup: setup 文件绝对路径。 engine: 可选,显式指定引擎 exe(如 MIKE11.exe);不传则由 MzEngines.cfg 按扩展名自动选择。 direct: True 时绕过 MzLaunch,直接调用引擎。 engine_flag: 走 MzLaunch 时指定引擎的参数名,默认 "-e"。 silent: 走 MzLaunch 时传未文档化的 -run(实测可省,非必要不要开)。 exit_when_done: 走 MzLaunch 时传 -x,模拟结束后退出启动器。 mpi: 子域数,传 -mpi N(需该引擎支持 MPI)。 gpu: GPU 卡数,传 -gpu N。 priority: CPU 优先级,传 -y 1..4(1 低,4 高于正常)。 extra_args: 追加的原始命令行参数。 result_dir: 走 MzLaunch 时传 -z 指定结果目录。 year: 可选,指定 MIKE Zero 年份。 wait: 是否同步等待结束(长时间模拟建议保持 False)。 timeout: wait=True 时的等待上限(秒)。

ParametersJSON Schema
NameRequiredDescriptionDefault
gpuNo
mpiNo
waitNo
yearNo
setupYes
directNo
engineNo
silentNo
timeoutNo
priorityNo
extra_argsNo
result_dirNo
engine_flagNo-e
exit_when_doneNo

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries full behavioral burden, and it does so thoroughly: it discloses background execution, return of a job id, the side effect that MzLaunch deletes `._spi_` progress files (archived first), direct-mode preservation of those files, unsupported flags in direct mode, and wait/timeout behavior. This materially exceeds what the schema alone provides.

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 long but structured: a one-line purpose, a short tracking pointer, a compact two-mode comparison, and then a clean bullet-style Args list. Every sentence adds operational value, and the most decision-critical information is front-loaded.

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?

For a 14-parameter, side-effect-heavy launch tool with no annotations and no output schema, this description is unusually complete. It covers what is returned, background behavior, progress tracking, mode-specific differences, version caveat, parameter effects, and wait/timeout semantics. An agent has enough to call the tool correctly in most real scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: every one of the 14 parameters is given meaningful semantics, including defaults, exact CLI flags they map to, and conditional effects (e.g., direct mode disables -mpi/-gpu/-z). This is far beyond raw schema property names.

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 opens with a precise statement: '无界面启动一次 MIKE Zero 模拟,返回作业 id' – a specific verb, resource, and observable result. It also orients the agent relative to sibling tracking tools by naming mz_progress / mz_job_status / mz_job_log for follow-up, which helps differentiation.

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 clearly explains the default background execution model and when to use the progress/job-status tools, and it gives detailed guidance on choosing direct=False vs direct=True. It does not explicitly contrast with mz_run_batch or say 'do not use this when...', so it falls just short of fully explicit alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_run_batchA

批量顺序执行多个 setup:生成 .bat(DHI 官方做法)并后台运行。

生成的 .bat 会保留在 workdir 里,可自行查看或手工重跑。

Args: setups: setup 文件绝对路径列表,按顺序执行。 workdir: 工作目录,默认取第一个 setup 所在目录。 engine / engine_flag / mpi / gpu / priority / extra_args: 同 mz_run。 year: 可选,指定 MIKE Zero 年份。 wait: 是否同步等待整批结束。 timeout: wait=True 时的等待上限(秒)。

ParametersJSON Schema
NameRequiredDescriptionDefault
gpuNo
mpiNo
waitNo
yearNo
engineNo
setupsYes
timeoutNo
workdirNo
priorityNo
extra_argsNo
engine_flagNo-e

TDQS

A4.3/5.0
Behavior4/5

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

The description discloses key behavioral traits: it generates .bat files, runs them in the background, and leaves the .bat files in the workdir for inspection or manual re-run. It also explains the wait parameter controls synchronous waiting and timeout applies when wait=True. No annotations are provided, so the description carries the burden, and it does a good job.

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 compact and front-loaded with the core behavior (batch sequential execution, .bat generation, background running). The Args section is structured and readable. It could be slightly more concise, but every sentence 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 tool with 11 parameters, no annotations, and no output schema, the description covers the essential behavioral context: what it does, where artifacts go, how wait/timeout work, and how to interpret the shared parameters. It doesn't describe return values or error behavior, but the core invocation context is complete enough for an agent to use it correctly.

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 description coverage is 0%, so the description must compensate. It explains setups (absolute paths, executed in order), workdir (defaults to first setup's directory), wait (whether to synchronously wait for the whole batch), timeout (waiting limit in seconds when wait=True), and defers engine/engine_flag/mpi/gpu/priority/extra_args to mz_run. This covers most parameters meaningfully, though year is only mentioned as 'optional, specify MIKE Zero year' without deeper detail.

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: batch sequential execution of multiple setups, generating .bat files (DHI official approach) and running them in the background. It distinguishes itself from mz_run by explicitly mentioning batch execution of multiple setups and the .bat generation behavior.

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 explains when to use this tool (for batch sequential execution of multiple setups) and references mz_run for parameter semantics. It doesn't explicitly state when NOT to use it or name alternatives, but the batch context is clear enough for an agent to differentiate from the single-run sibling mz_run.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_scanA

扫描一个工程目录,按类型归类 MIKE Zero 的 setup 文件与结果文件。

Args: root: 要扫描的目录(绝对路径)。 max_files: 最多扫描多少个文件,默认 5000。 year: 可选,指定 MIKE Zero 年份以确定 setup 扩展名。

ParametersJSON Schema
NameRequiredDescriptionDefault
rootYes
yearNo
max_filesNo

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the transparency burden. It discloses useful behavioral constraints: max_files caps how many files are scanned and year determines setup-extension matching. However, it does not clarify whether the scan is recursive, what the output/return structure looks like, or whether the operation is strictly read-only.

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 short, front-loaded with the core purpose, and uses a clean Args block for parameter details. Every sentence or line adds information without redundancy.

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?

The description covers the tool's purpose and all parameter semantics, which is enough to invoke it with just root. But with no output schema and no annotations, it should say more about the return format, whether scanning is recursive, and what '按类型归类' produces in practice.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description fully compensates. It explains root as an absolute path, max_files as a scan limit with a default of 5000, and year as an optional selector that determines MIKE Zero setup extensions. These semantics go well beyond the bare schema types.

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 a specific action ('扫描一个工程目录') and a concrete result ('按类型归类 MIKE Zero 的 setup 文件与结果文件'). It is distinct from mz_read_setup/mz_dfs_read, though it does not explicitly name or 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 Guidelines3/5

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

Usage is implied: this is the tool to use when you want to scan a project directory and classify MIKE Zero files. However, it gives no explicit when-to-use/when-not-to-use guidance and never mentions alternatives like mz_read_setup or mz_dfs_info.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mz_toolboxA

用 ToolboxShell.exe 无界面运行一个 Toolbox setup(.mzt / .21t / .3t / .lpkt / .mst)。

Args: setup: toolbox setup 文件绝对路径。 extra_args: 追加参数。 year: 可选,指定 MIKE Zero 年份。 wait: 是否同步等待。 timeout: wait=True 时的等待上限(秒)。

ParametersJSON Schema
NameRequiredDescriptionDefault
waitNo
yearNo
setupYes
timeoutNo
extra_argsNo

TDQS

A3.7/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 full burden of disclosing behavior. It does reveal that the tool runs via ToolboxShell.exe in non-GUI modeaine, and the wait/timeout parameters imply synchronous vs asynchronous execution. However, it does not disclose what the tool outputs or returns (e.g., exit code, job ID), what side effects occur (e.g., generated files), or whether errors are surfaced. This is only partial transparency.

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 highly efficient: one sentence establishes the purpose and supported file types, followed by a clean bullet list of all parameters. Everything is front-loaded, and there is no redundant or filler text. It earns its keep with every word.

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 an external-process-execution tool with no output schema, an agent would need to know what the invocation returns, how to interpret failures, and how this relates to sibling tools like mz_jobs or mz_progress. The description explains inputs and execution flags but is silent on return values, logging, and post-run behavior. Given the tool's complexity, this is a notable gap.

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 description coverage is 0%, so the description must compensate. The 'Args' section defines each of the five parameters: setup as an absolute path, extra_args as appended arguments, year as an optional MIKE Zero year, wait as whether to synchronously wait, and timeout as the wait limit when wait=True. This adds meaning beyond the raw schema. extra_args is somewhat vague, but overall the parameter semantics are clearly communicated.

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 explicitly states that the tool runs a Toolbox setup headlessly using ToolboxShell.exeaine, listing the supported file extensions (.mzt / .21t / .3t / .lpkt / .mst). The verb '运行' (run) plus the specific resource 'Toolbox setup' clearly differentiates it from sibling tools such as mz_run (likely for engine simulation) or mz_read_setup (reading setups). This is a distinct, unambiguous purpose.

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 provides no explicit guidance on when to choose this tool over its siblings. It states that it runs setup files without a GUI, but never mentions alternatives like mz_run or mz_read_setup, nor does it say 'use this tool for .mzt setups and that tool for engine runs'. The only implicit hint is the file extension list, which is not sufficient for an agent to make an informed selection.

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. 15 tool updatesv1.0.1
    • First observedmz_dfs_info
    • First observedmz_dfs_plot
    • First observedmz_dfs_read
    • First observedmz_engines
    • First observedmz_env
    • First observedmz_job_kill
    • First observedmz_job_log
    • First observedmz_job_status
    • First observedmz_jobs
    • First observedmz_progress
    • First observedmz_read_setup
    • First observedmz_run
    • First observedmz_run_batch
    • First observedmz_scan
    • First observedmz_toolbox

TDQS

A3.8/5.0

Scored across 15 tools

Disambiguation5/5

Each tool targets a distinct phase: environment detection, engine mapping, file scanning, setup parsing, job execution, progress tracking, batch runs, toolbox runs, job management, and result analysis. Even the closely related mz_progress and mz_job_status are clearly separated by their data sources (progress file vs process/log).

Naming Consistency4/5

All tools share the mz_ prefix and group logically (mz_job_* for lifecycle, mz_dfs_* for results), making the pattern predictable. Minor inconsistency exists between noun-style names (mz_env, mz_progress) and verb_noun names (mz_read_setup, mz_dfs_read), but this does not cause confusion.

Tool Count4/5

15 tools is at the upper edge of the typical well-scoped range, but each tool serves a distinct purpose across discovery, execution, monitoring, and post-processing. The four job-monitoring tools are individually justified by the async nature of simulations, though the count feels slightly heavy.

Completeness4/5

The set covers the full simulation workflow: environment discovery, project scanning, setup parsing, single/batch/toolbox execution, progress/status/log monitoring, job termination, and result reading/plotting. Notable gaps include the inability to create or edit setup files and a lack of result export or cleanup operations, but these can be worked around.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables interaction with SU2 CFD solver for session lifecycle management, config editing, solver execution, and results inspection, with optional CPACS integration for aircraft analysis.
    4
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables to interact with Abaqus FEA software through an MCP bridge, supporting connection checks, script execution, model queries, job submission, and simulation automation.
    3
    -
  • A
    license
    A
    quality
    B
    maintenance
    A headless, natural-language-driven automated modelling workflow for MIKE+, enabling users to inspect models, change parameters, run simulations, and analyze results without the MIKE+ GUI.
    10
    7
    MIT