测试日期: 2026-02-17 ~ 2026-02-18
工作区: D:\MCP
输出目录: D:\MCP\mcp_test\outputs\
总工具数: 48
本日志按实际执行顺序记录每项工具的调用情况,包括入参、返回值、遇到的问题及修复过程。
- 入参: path=outputs/smart_factory_report.pptx, slides=[封面/数据/分析共 3 页]
- 返回: ok, 文件已写入
- 产物: smart_factory_report.pptx (31.4 KB,后续重建为 45.4 KB)
- 入参: path=outputs/smart_factory_report.pptx
- 返回: 3 页幻灯片结构信息
- 入参: path=outputs/smart_factory_report.pptx, slide=1, 添加演讲备注
- 返回: ok
- 入参: path=outputs/smart_factory_report.docx, content=[标题+段落+表格]
- 产物: smart_factory_report.docx (37.1 KB,后续重建为 39.7 KB)
- 入参: path=outputs/smart_factory_report.docx
- 返回: 内容完整
- 入参: replacements={"智能工厂":"Smart Factory"}
- 返回: ok
第一轮为最小用例验证参数格式。第二轮使用 writes 参数格式写入完整数据。
- 接口注意: 不支持
data+start_cell,必须使用writes: [{"range":"A1:G18","values":[...]}] - 产物: production_data.xlsx (后续重建为 14.8 KB, 5 工作表)
- 入参: path=outputs/production_data.xlsx
- 返回: 正确返回 5 行数据
- 入参: 追加 3 行数据
- 返回: ok
- 入参: bar chart, 日产量数据
- 返回: ok, 图表嵌入工作表
前两次因 content 参数格式问题失败(传入字典被静默忽略)。第三次改用 JSON 数组格式成功。
- 接口注意: content 必须为
[{"type":"title","text":"..."},...] - 产物: monthly_report.pdf (后续重建含中文字体版 200.9 KB)
- 中文字体: 初始出现方块乱码,切换 Microsoft YaHei (msyh.ttc) + 字体级联注册后解决
首次失败 → 触发代码修复 (D-08)
- 现象: 抛出 "document closed" 异常
- 根因:
doc.close()之后调用len(doc),PyMuPDF 1.27.1 不允许访问已关闭文档 - 修复:
doc.close()前保存total = len(doc) - 回归测试: 正确读取 monthly_report.pdf (1 页)
首次失败 → 触发代码修复 (D-09)
- 现象: "cannot save with zero pages"
- 根因: 传入相对路径时
Path(f)未经工作区目录解析,源文件全部打开失败 - 修复: 逐文件
R(f)路径解析 + 空列表校验 + 零页兜底检查 - 回归测试: 合并 monthly_report.pdf + appendix.pdf → merged_report.pdf (2 页)
- 产物: pdf_split/page_1.pdf
- 接口注意: 必须传
rotation=0,传 45 时水印不可见 - 产物: watermarked_report.pdf
- 产物: pdf_images/page_1.png (42.6 KB)
- 入参: 800×600 蓝色背景
- 产物: factory_banner.png (2.8 KB)
- 返回: 800×600, RGB, PNG
- 入参: resize + 文字叠加
- 返回: ok
- 入参: PNG→JPEG, quality=85
- 产物: factory_banner.jpg (8.2 KB)
前两次因 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)
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: 截图获取
- 入参: EEVEE, 1280×720
- 产物: factory_scene_render.png (552.7 KB)
- 产物: factory_layout.svg
- 产物: production_chart.png (47.2 KB)
- 说明: 原始代码仅支持 bar/line/scatter,测试中补充了 pie/area 类型支持
- 产物: dashboard_subplot.png (137.0 KB, 2×2 四面板)
- 注意: 大参数在 MCP 协议层易超时,实际通过终端直接执行 Python 脚本绕过
- 入参: 统计计算表达式
- 返回: 数值正确
首次失败 → 触发代码修复 (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)
详见 Session 2 (#62-67) 使用互联网下载视频的完整测试
初轮使用 ffmpeg_exec 生成 testsrc 测试视频,验证基本调用链。Session 2 从 samplelib.com 下载真实 H.264 1080p 视频后完成全部 6 项深度测试。
首次均失败 (超时 120s) → 触发代码修复 (D-02, D-03, D-04)
通过 14 个独立测试脚本逐步定位,三个根因叠加:
- (D-02) 调用
gimp-3.0.exe(GUI 版) 而非gimp-console-3.0.exe(无头版) - (D-03) GIMP 3.0 需显式传
--batch-interpreter plug-in-script-fu-eval - (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
- 入参: SVG→PNG
- 产物: factory_layout_ink.png (22.8 KB)
首次失败 (超时 120s) → 与 D-01 同因
- 修复:
_run()添加stdin=subprocess.DEVNULL - 回归测试:
actions="inkscape-version"→ stdout="Inkscape 1.4.2", rc=0
- 返回: ok=true
- omni-mcp 基本调用正常,复杂零件测试通过 freecad-mcp 插件完成(见 #56-61)
- 修复:
-s替代--script;无extends声明时自动包装extends SceneTree+quit() - 测试 1: 创建 main.tscn(FactoryHUD 场景, Control + Label 节点),code=0
- 测试 2: PCKPacker 导出 FactoryTest.pck (1168 bytes),code=0
- 修复: 增加
TimeoutExpired容错,超时后正常返回 - 入参: scene=res://main.tscn, timeout=15
- 返回: 场景运行 15 秒后自动退出
- 前置: 下载安装 Godot 4.6.1 导出模板 (1.19 GB)
- 入参: preset="Windows Desktop", output=FactoryTest.exe
- 产物: FactoryTest.exe (99.6 MB), code=0, stderr 为空
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"→ 正确返回
首次部分成功 → 触发代码修复 (D-11)
- 问题: 命令在固定临时目录执行,无法指定 cwd
- 修复: 添加可选
cwd参数 +stdin=subprocess.DEVNULL - 回归测试:
cmd='dir /b *.step', cwd='d:\MCP\mcp_test\outputs'→ 输出包含 "flanged_bearing_housing.step"
首次失败 (超时 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
- 返回: OS / RAM / Python / 已安装工具列表
通过 freecad-mcp 插件 (RPC localhost:9875) 实时控制 FreeCAD,构建法兰轴承座 (Flanged Bearing Housing)。
- 入参: document_name="BearingHousing"
- 返回: Document created
- 操作: BasePlate 160×100×12mm, R8 圆角
- 返回: ok, 截图确认
单脚本一次性构建完整零件:
- 底板 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) 金属灰
- 体积: 258,989.2 mm³ / 表面积: 59,304.2 mm² / 56 面 135 边 89 顶点
- 包围盒: 160.0 × 100.0 × 67.0 mm
- 产物: flanged_bearing_housing.FCStd / .step / .stl
- Front 视图 / Top 视图截图获取
测试素材: 从 samplelib.com 下载的 MP4 (H.264 1920×1080 30fps, 5.76s, AAC 44100Hz stereo, 2781.5 KB)
首次 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
- 入参: MP4→AVI
- 产物: test_video.avi (3316.7 KB)
- 入参: start=00:00:00, duration=2
- 产物: clip_0_2s.mp4 (33 KB)
- 入参: time=1
- 产物: shot_1s.png (2962.5 KB)
- 入参: start=0, duration=3, fps=10, width=480
- 产物: preview_from_download.gif (2098.9 KB)
- 入参: 自定义参数 — scale=640:360, video bitrate=300k, audio=aac 64k
- 产物: lowbitrate_360p.mp4 (224.5 KB)
此阶段集中修复 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 项工具回归通过。
从零编写完整 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 随机)
- 暂停菜单 / 游戏结束 / 最高分本地存档
- 导出期间 Godot 4.6 报告 2 处
:=类型推断错误(dir和gun_pos变量),改为=后 0 error - 产物: RogueliteShooter.zip (34.4 MB, 原始 EXE 99.6 MB 压缩后)
- 详细构建日志: godot_game_pro/BUILD_LOG.md
| 指标 | 旧版 | 新版 |
|---|---|---|
| 脚本复杂度 | 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 相关矩阵 / 极坐标雷达图
| 指标 | 旧版 | 新版 |
|---|---|---|
| 输入数量 | 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