Skip to content

fix(mcp): 修复结果语义丢失、错误误判与生命周期回收#195

Merged
phantom5099 merged 2 commits into
1024XEngineer:mainfrom
Cai-Tang-www:main
Apr 9, 2026
Merged

fix(mcp): 修复结果语义丢失、错误误判与生命周期回收#195
phantom5099 merged 2 commits into
1024XEngineer:mainfrom
Cai-Tang-www:main

Conversation

@Cai-Tang-www

Copy link
Copy Markdown
Collaborator

变更背景

修复 MCP 主链路中的 4 个关键问题:

  • 非文本 content(resource_link/image/audio)被吞掉
  • isError=true 但空内容被错误回退为 ok
  • 注销/注册失败路径缺少 client 关闭与回滚
  • 非 object schema 未归一导致 tool 定义污染风险

主要改动

  • internal/tools/mcp/stdio_client.go
    • 强化 decodeCallResult,新增 decodeCallContent / decodeCallContentItem
    • 非文本项保留为可读 JSON 文本,不再丢失
    • isError=true 且空内容时不再回退成功语义
  • internal/tools/registry.go
    • MCP 返回 isError=true 时返回错误,禁止空内容回退 ok
  • internal/tools/mcp/registry.go
    • UnregisterServer 增加 client 关闭流程(closeable client)
  • internal/app/mcp_bootstrap.go
    • 多 server 注册失败时回滚已注册 server
    • 单 server refresh 失败时注销并清理
  • internal/tools/mcp/adapter.go
    • ensureObjectSchema 强制归一为合法 object schema

测试

  • 补充/增强以下测试:
    • internal/tools/mcp/stdio_client_test.go
    • internal/tools/mcp/registry_test.go
    • internal/tools/mcp/adapter_test.go
    • internal/tools/registry_test.go
    • internal/app/bootstrap_test.go
  • 本地执行:
    • go test ./internal/app ./internal/tools ./internal/tools/mcp -count=1
    • go test ./... -count=1

Closes #194

@codecov

codecov Bot commented Apr 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 97.33333% with 2 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
internal/tools/mcp/adapter.go 81.81% 1 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

@phantom5099

Copy link
Copy Markdown
Collaborator

[adapter.go:122]这里的 schema 归一化过头了。现在只要 type 不是 "object",就会直接把 properties 清空;这会把那些“没写 type 但已经有合法 properties”的 MCP tool 也错误降成无参数工具,导致原本的参数语义丢失。

@Cai-Tang-www

Copy link
Copy Markdown
Collaborator Author

修了

@Cai-Tang-www

Copy link
Copy Markdown
Collaborator Author

[adapter.go:122]这里的 schema 归一化过头了。现在只要 type 不是 "object",就会直接把 properties 清空;这会把那些“没写 type 但已经有合法 properties”的 MCP tool 也错误降成无参数工具,导致原本的参数语义丢失。

当前逻辑确实会把 type 缺失但 properties 合法的 schema 清空,把工具误降成“无参数工具”,影响真实调用语义
已经改成如下规则:
type == "object":保留现有 properties
type 为空:补成 "object",保留已有 properties
type 非空且不是 "object":再做降级兜底(可清空并置空 properties)
也就是说:只在明确非法类型时降级,不要在“缺省但可推断”为 object 的情况降级。

@phantom5099 phantom5099 merged commit 2a6fd21 into 1024XEngineer:main Apr 9, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(mcp): 修复 MCP 结果语义/错误传递/生命周期回收

2 participants