Skip to content

Latest commit

 

History

History
415 lines (263 loc) · 13.8 KB

File metadata and controls

415 lines (263 loc) · 13.8 KB

omni-mcp 测试运行日志

测试日期: 2026-02-17 ~ 2026-02-18
工作区: D:\MCP
输出目录: D:\MCP\mcp_test\outputs\
总工具数: 48

本日志按实际执行顺序记录每项工具的调用情况,包括入参、返回值、遇到的问题及修复过程。


Session 1 — omni-mcp 48 工具逐项测试 (2026-02-17)

#1 pptx_create

  • 入参: path=outputs/smart_factory_report.pptx, slides=[封面/数据/分析共 3 页]
  • 返回: ok, 文件已写入
  • 产物: smart_factory_report.pptx (31.4 KB,后续重建为 45.4 KB)

#2 pptx_read

  • 入参: path=outputs/smart_factory_report.pptx
  • 返回: 3 页幻灯片结构信息

#3 pptx_edit

  • 入参: path=outputs/smart_factory_report.pptx, slide=1, 添加演讲备注
  • 返回: ok

#4 docx_create

  • 入参: path=outputs/smart_factory_report.docx, content=[标题+段落+表格]
  • 产物: smart_factory_report.docx (37.1 KB,后续重建为 39.7 KB)

#5 docx_read

  • 入参: path=outputs/smart_factory_report.docx
  • 返回: 内容完整

#6 docx_replace

  • 入参: replacements={"智能工厂":"Smart Factory"}
  • 返回: ok

#7-8 xlsx_create (两轮)

第一轮为最小用例验证参数格式。第二轮使用 writes 参数格式写入完整数据。

  • 接口注意: 不支持 data+start_cell,必须使用 writes: [{"range":"A1:G18","values":[...]}]
  • 产物: production_data.xlsx (后续重建为 14.8 KB, 5 工作表)

#9 xlsx_read

  • 入参: path=outputs/production_data.xlsx
  • 返回: 正确返回 5 行数据

#10 xlsx_write

  • 入参: 追加 3 行数据
  • 返回: ok

#11 xlsx_chart

  • 入参: bar chart, 日产量数据
  • 返回: ok, 图表嵌入工作表

#12 pdf_create

前两次因 content 参数格式问题失败(传入字典被静默忽略)。第三次改用 JSON 数组格式成功。

  • 接口注意: content 必须为 [{"type":"title","text":"..."},...]
  • 产物: monthly_report.pdf (后续重建含中文字体版 200.9 KB)
  • 中文字体: 初始出现方块乱码,切换 Microsoft YaHei (msyh.ttc) + 字体级联注册后解决

#13 pdf_read

首次失败 → 触发代码修复 (D-08)

  • 现象: 抛出 "document closed" 异常
  • 根因: doc.close() 之后调用 len(doc),PyMuPDF 1.27.1 不允许访问已关闭文档
  • 修复: doc.close() 前保存 total = len(doc)
  • 回归测试: 正确读取 monthly_report.pdf (1 页)

#14 pdf_merge

首次失败 → 触发代码修复 (D-09)

  • 现象: "cannot save with zero pages"
  • 根因: 传入相对路径时 Path(f) 未经工作区目录解析,源文件全部打开失败
  • 修复: 逐文件 R(f) 路径解析 + 空列表校验 + 零页兜底检查
  • 回归测试: 合并 monthly_report.pdf + appendix.pdf → merged_report.pdf (2 页)

#15 pdf_split

  • 产物: pdf_split/page_1.pdf

#16 pdf_watermark

  • 接口注意: 必须传 rotation=0,传 45 时水印不可见
  • 产物: watermarked_report.pdf

#17 pdf_to_images

  • 产物: pdf_images/page_1.png (42.6 KB)

#18 img_create

  • 入参: 800×600 蓝色背景
  • 产物: factory_banner.png (2.8 KB)

#19 img_info

  • 返回: 800×600, RGB, PNG

#20 img_process

  • 入参: resize + 文字叠加
  • 返回: ok

#21 img_convert

  • 入参: PNG→JPEG, quality=85
  • 产物: factory_banner.jpg (8.2 KB)

#22 img_composite

前两次因 images 参数传入方式不正确失败,第三次使用路径字符串数组成功。

  • 接口注意: images 参数为 ["path1.png","path2.png"]
  • 初始产物: composited_banner.png (4.2 KB, 2 图水平合成)
  • 后续难度升级 (Session 2):
    • 6 次并行 img_process 前处理: resize / border / text / round_corners / gray / contrast / blur / sharpen
    • 6 张 648×368 RGBA 瓦片 → img_composite grid 模式, 2×3 布局, gap=12px, bg=#1a1a2e
    • 升级产物: composited_banner.png (1028.1 KB, 1968×748)

#23-24 blender_exec / blender_scene

omni-mcp 的 CLI 静默启动方式超时 (300s),通过 blender-mcp 插件 (uvx blender-mcp) 直连 Blender addon 验证功能正常:

  • get_scene_info: 返回 23 个对象、8 个材质
  • execute_blender_code: 创建工厂场景 (FactoryFloor + ConveyorBelt + 10 Legs + 5 Products + RobotArm + Lights + Camera),保存 factory_scene.blend (0.11 MB),导出 factory_scene.fbx (0.1 MB)
  • get_viewport_screenshot: 截图获取

#25 blender_render

  • 入参: EEVEE, 1280×720
  • 产物: factory_scene_render.png (552.7 KB)

#26 svg_create

  • 产物: factory_layout.svg

#27 chart_create

  • 产物: production_chart.png (47.2 KB)

#28 chart_subplot

  • 说明: 原始代码仅支持 bar/line/scatter,测试中补充了 pie/area 类型支持
  • 产物: dashboard_subplot.png (137.0 KB, 2×2 四面板)
  • 注意: 大参数在 MCP 协议层易超时,实际通过终端直接执行 Python 脚本绕过

#29 matlab_eval

  • 入参: 统计计算表达式
  • 返回: 数值正确

#30 matlab_exec

首次失败 → 触发代码修复 (D-05, D-06)

  • 现象: "NoneType has no len()"
  • 根因 1 (D-05): MATLAB 在中文 Windows 输出 GBK 编码 → Python UTF-8 解码失败 → stderr=None → len(None) 崩溃
  • 根因 2 (D-06): 临时脚本文件名 _matlab_run.m 以下划线开头,不是合法 MATLAB 标识符
  • 修复: (1) errors="replace" + or "" 空值保护 (2) 文件名改为 omnirun.m
  • 回归测试: 正弦波绘图脚本执行成功, rc=0
  • 初始产物: matlab_sine.png (27.7 KB)
  • 后续难度升级 (Session 2):
    • 6 子图工程仪表板: 3D surface (meshgrid+peaks) / FFT 频谱 (findpeaks 标注) / ODE45 Van der Pol 相空间 (5 组 IC) / 双峰直方图 (makedist 拟合) / 8×8 相关矩阵热力图 (imagesc+数值) / 极坐标雷达图 (6 维 KPI)
    • 升级产物: matlab_dashboard.png (576.6 KB, 200 DPI)

#31-36 ffmpeg 工具组 (6 项)

详见 Session 2 (#62-67) 使用互联网下载视频的完整测试

初轮使用 ffmpeg_exec 生成 testsrc 测试视频,验证基本调用链。Session 2 从 samplelib.com 下载真实 H.264 1080p 视频后完成全部 6 项深度测试。

#37-38 gimp_exec / gimp_python

首次均失败 (超时 120s) → 触发代码修复 (D-02, D-03, D-04)

通过 14 个独立测试脚本逐步定位,三个根因叠加:

  1. (D-02) 调用 gimp-3.0.exe (GUI 版) 而非 gimp-console-3.0.exe (无头版)
  2. (D-03) GIMP 3.0 需显式传 --batch-interpreter plug-in-script-fu-eval
  3. (D-04) stdin 管道模式下不能用 (begin ...) 包裹脚本

修复后测试结果:

  • gimp_exec: (car (gimp-version)) → rc=0, stderr="GIMP 3.0.8", 耗时 2.5s
  • gimp_exec: 完整图像创建 + 画布填充 → rc=0
  • gimp_python: import gimp; print('OK', gimp.version) → rc=0

#39 inkscape_convert

  • 入参: SVG→PNG
  • 产物: factory_layout_ink.png (22.8 KB)

#40 inkscape_exec

首次失败 (超时 120s) → 与 D-01 同因

  • 修复: _run() 添加 stdin=subprocess.DEVNULL
  • 回归测试: actions="inkscape-version" → stdout="Inkscape 1.4.2", rc=0

#41-42 freecad_create / freecad_exec

  • 返回: ok=true
  • omni-mcp 基本调用正常,复杂零件测试通过 freecad-mcp 插件完成(见 #56-61)

#43 godot_exec

  • 修复: -s 替代 --script;无 extends 声明时自动包装 extends SceneTree + quit()
  • 测试 1: 创建 main.tscn(FactoryHUD 场景, Control + Label 节点),code=0
  • 测试 2: PCKPacker 导出 FactoryTest.pck (1168 bytes),code=0

#44 godot_run

  • 修复: 增加 TimeoutExpired 容错,超时后正常返回
  • 入参: scene=res://main.tscn, timeout=15
  • 返回: 场景运行 15 秒后自动退出

#45 godot_export

  • 前置: 下载安装 Godot 4.6.1 导出模板 (1.19 GB)
  • 入参: preset="Windows Desktop", output=FactoryTest.exe
  • 产物: FactoryTest.exe (99.6 MB), code=0, stderr 为空

#46-52 文件工具组

file_write / file_read / file_copy / file_move / file_delete / file_open 均一次通过。

file_list (#52):

首次返回临时目录 → 触发代码修复 (D-10)

  • 修复: Path(dir)R(dir) 解析为工作区绝对路径
  • 回归测试: dir="outputs", pattern="*.step" → 正确返回

#53 run_cmd

首次部分成功 → 触发代码修复 (D-11)

  • 问题: 命令在固定临时目录执行,无法指定 cwd
  • 修复: 添加可选 cwd 参数 + stdin=subprocess.DEVNULL
  • 回归测试: cmd='dir /b *.step', cwd='d:\MCP\mcp_test\outputs' → 输出包含 "flanged_bearing_housing.step"

#54 run_python

首次失败 (超时 60s) → 触发代码修复 (D-01)

这是影响面最广的缺陷。根因为 MCP Python SDK issue #671:stdio 模式下子进程继承 MCP 的 stdin 管道,Windows 上导致 subprocess.run 永久阻塞。

  • 修复: _run() 添加 stdin=subprocess.DEVNULL
  • 回归测试: import sys; print(f"Python {sys.version}") → rc=0, 耗时 <1s

#55 system_info

  • 返回: OS / RAM / Python / 已安装工具列表

Session 1 补充 — freecad-mcp 实时控制测试 (2026-02-17)

通过 freecad-mcp 插件 (RPC localhost:9875) 实时控制 FreeCAD,构建法兰轴承座 (Flanged Bearing Housing)。

#56 freecad-mcp: create_document

  • 入参: document_name="BearingHousing"
  • 返回: Document created

#57 freecad-mcp: execute_code (底板)

  • 操作: BasePlate 160×100×12mm, R8 圆角
  • 返回: ok, 截图确认

#58 freecad-mcp: execute_code (完整重建)

单脚本一次性构建完整零件:

  • 底板 160×100×12mm (R8 圆角)
  • 外圆柱 R35, H55mm
  • 中心通孔 R25 (贯穿)
  • 肩部孔 R30×8mm (轴承定位台阶)
  • 4×M10 螺栓孔 (含 Ø18 沉头孔), 位于 (±55, ±30)
  • 侧向润滑油孔 R3
  • 4×三角形加强筋 (0°/90°/180°/270°)
  • 颜色: (0.65, 0.70, 0.75) 金属灰

#59 freecad-mcp: execute_code (保存+导出)

  • 体积: 258,989.2 mm³ / 表面积: 59,304.2 mm² / 56 面 135 边 89 顶点
  • 包围盒: 160.0 × 100.0 × 67.0 mm
  • 产物: flanged_bearing_housing.FCStd / .step / .stl

#60-61 freecad-mcp: get_view

  • Front 视图 / Top 视图截图获取

Session 2 — FFmpeg 深度测试 + 代码修复回归 (2026-02-18)

测试素材: 从 samplelib.com 下载的 MP4 (H.264 1920×1080 30fps, 5.76s, AAC 44100Hz stereo, 2781.5 KB)

#62 ffmpeg_info

首次 JSON 解析失败 → 触发代码修复 (D-07)

  • 根因: _run()errors="replace" 将非 UTF-8 字节替换为 \ufffd,混入 ffprobe JSON 输出后 json.loads 失败
  • 修复: 绕过 _run(),直接 subprocess.run 调用 ffprobe + 正则 [\x00-\x08\x0b\x0c\x0e-\x1f\ufffd] 清洗
  • 回归测试: format=mov,mp4 | duration=5.76s | video=H264 1920×1080 30fps | audio=AAC 44100Hz stereo

#63 ffmpeg_convert

  • 入参: MP4→AVI
  • 产物: test_video.avi (3316.7 KB)

#64 ffmpeg_clip

  • 入参: start=00:00:00, duration=2
  • 产物: clip_0_2s.mp4 (33 KB)

#65 ffmpeg_screenshot

  • 入参: time=1
  • 产物: shot_1s.png (2962.5 KB)

#66 ffmpeg_gif

  • 入参: start=0, duration=3, fps=10, width=480
  • 产物: preview_from_download.gif (2098.9 KB)

#67 ffmpeg_exec

  • 入参: 自定义参数 — scale=640:360, video bitrate=300k, audio=aac 64k
  • 产物: lowbitrate_360p.mp4 (224.5 KB)

Session 2 — GIMP / Inkscape / run_python 等修复回归 (2026-02-18)

此阶段集中修复 D-01 至 D-04 以及 D-10、D-11,将成功率从 89.6% 推至 100%。

修复清单:

  • D-01: _run() 添加 stdin=subprocess.DEVNULL → 解决 run_python / inkscape_exec / run_cmd 超时
  • D-02~04: gimp-console + batch-interpreter + 去除 (begin...) → 解决 gimp_exec / gimp_python 超时
  • D-10: R(dir) → 解决 file_list 路径问题
  • D-11: 添加 cwd 参数 → 解决 run_cmd 工作目录问题

全部 6 项工具回归通过。


Session 2 — Godot Roguelite 游戏构建 (2026-02-18)

#68 游戏项目创建

从零编写完整 2D 俯视角 Roguelite 射击游戏:

类别 数量 内容
GDScript 14 player / bullet / 3 类敌人 / main / pickups / autoload / UI
场景 (.tscn) 9 player / bullet / enemy_bullet / 3 类敌人 / pickups / main
配置文件 2 project.godot / export_presets.cfg

核心功能:

  • WASD 移动 + 鼠标瞄准射击
  • 3 类敌人: 近战追逐 (红) / 远程射击 (橙) / 蓄力冲刺 (紫)
  • 波次系统 (数量、HP、速度递增)
  • 升级系统 (6 种属性,每次三选一)
  • 掉落系统 (XP 自动吸附 + HP 随机)
  • 暂停菜单 / 游戏结束 / 最高分本地存档

#69 Godot 导出

  • 导出期间 Godot 4.6 报告 2 处 := 类型推断错误(dirgun_pos 变量),改为 = 后 0 error
  • 产物: RogueliteShooter.zip (34.4 MB, 原始 EXE 99.6 MB 压缩后)
  • 详细构建日志: godot_game_pro/BUILD_LOG.md

Session 2 — 难度升级: MATLAB + img_composite (2026-02-18)

MATLAB: 正弦波 → 6 子图工程仪表板

指标 旧版 新版
脚本复杂度 7 行 bar chart ~100 行, 6 种 MATLAB 绘图函数
输出 matlab_sine.png (27.7 KB) matlab_dashboard.png (576.6 KB)
分辨率 默认 200 DPI

6 子图内容: 3D surface / FFT + findpeaks / ODE45 相空间 / 双峰直方图 + Gaussian fit / 8×8 相关矩阵 / 极坐标雷达图

img_composite: 2 图水平 → 6 图 2×3 网格

指标 旧版 新版
输入数量 2 张 6 张 (经 img_process 前处理)
合成模式 horizontal grid (2×3)
前处理 resize / border / text / round_corners / gray / contrast 等
输出 4.2 KB 1028.1 KB (1968×748)

日志结束
最后更新: 2026-02-18
对应报告: FINAL_REPORT.md