Skip to content

feat: 完成 #176/#177 MCP 能力建设并补齐质量收口#181

Merged
minorcell merged 13 commits into
1024XEngineer:mainfrom
Cai-Tang-www:P0-8
Apr 7, 2026
Merged

feat: 完成 #176/#177 MCP 能力建设并补齐质量收口#181
minorcell merged 13 commits into
1024XEngineer:mainfrom
Cai-Tang-www:P0-8

Conversation

@Cai-Tang-www

@Cai-Tang-www Cai-Tang-www commented Apr 7, 2026

Copy link
Copy Markdown
Collaborator

目标(对应 #176

在 NeoCode 内建立一套可扩展的 MCP 工具接入基础层,使外部 MCP Server 的能力可以被统一注册、发现、调用,并与现有工具体系保持一致的调用语义。

背景(为什么做)

当前内置工具链路完整,但缺少对 MCP 生态工具的标准接入能力。为后续多 Server、健康管理、动态上下线与策略控制打基础,需要先落地:

  • Registry:管理 MCP Server 生命周期与工具快照。
  • Adapter:把 MCP 工具映射为 NeoCode 可消费的统一工具描述。
  • Transport 基础:先完成 stdio 协议可用闭环,保证工具可真正执行。

范围说明

本 PR 覆盖 #176(基础层)并同步完成 #177(接入主执行链),先让能力可用,再做质量收口。


#176 主要变更(基础能力)

1) MCP Registry

新增 MCP Registry,支持:

  • Server 注册/注销
  • Server 状态流转(connecting / ready / degraded / offline)
  • 工具列表刷新与快照读取
  • 按 server + tool 分发调用

2) MCP Adapter / AdapterFactory

新增适配层,将 MCP 工具统一映射为:

  • 工具命名:mcp.<server>.<tool>
  • 工具描述:标准 description/schema 输出
  • schema 归一化:保证最小 object schema 可被上层稳定消费

3) 模型与数据结构

新增统一抽象:

  • ToolDescriptor
  • ServerSnapshot
  • CallResult
  • ServerClient 接口(ListTools / CallTool / HealthCheck)

#177 主要变更(主链路接入)

1) 接入工具注册与发现链路

  • MCP 工具接入 internal/tools/registryListAvailableSpecs,可与内置工具一起对模型暴露。

2) 接入统一执行链路

  • MCP 工具接入 Execute 主路径,统一走 Tool Registry 分发。
  • 返回结果统一收敛并注入 MCP 元信息(server/tool)。

3) 新增 stdio 传输客户端

新增 StdIOClient(JSON-RPC framed 协议):

  • tools/list
  • tools/call
  • HealthCheck

本 PR 额外质量增强(在功能落地后)

  • 修复 MCP resolve 失败时错误透传不准确问题(返回真实 resolveErr)。
  • 修复调用失败时结果被默认 ok 污染的问题。
  • 增加 stdio 并发写入串行化,避免 frame 交错。
  • 修复 waitLoop 进程句柄并发窗口。
  • 增加 stdin == nil 防护与 Content-Length 上限(8MB)。
  • schema clone 升级为递归深拷贝,避免嵌套引用污染。

新增/变更接口(对开发者可见)

MCP 侧

  • internal/tools/mcp/registry.go
    • RegisterServer
    • UnregisterServer
    • RefreshServerTools
    • HealthCheck
    • Call
    • Snapshot
  • internal/tools/mcp/adapter.go
    • AdapterFactory.BuildAdapters
    • Adapter.FullName/Schema/Call
  • internal/tools/mcp/stdio_client.go
    • NewStdIOClient
    • ListTools
    • CallTool
    • HealthCheck

Tools 主链路

  • internal/tools/registry.go
    • SetMCPRegistry
    • ListAvailableSpecs(纳入 MCP tools)
    • Execute(支持 MCP 分发)
    • Supports(支持 MCP tool 检测)

测试与覆盖

  • 新增并补齐:registry/adapter/stdio 的功能与边界测试。
  • 重点覆盖:
    • 规格暴露与执行分发
    • 并发写入稳定性
    • 错误透传与错误语义
    • 超大帧拒绝
    • schema 深拷贝隔离
  • 覆盖率结果(本地):
    • internal/tools/mcp85.8%
    • internal/tools95.9%
  • 本地通过:
    • go test ./...
    • go test -race ./internal/tools ./internal/tools/mcp

Closes #176
Closes #177

@codecov

codecov Bot commented Apr 7, 2026

Copy link
Copy Markdown

@Cai-Tang-www Cai-Tang-www changed the title feat(tools/mcp): harden stdio transport and registry execution path feat: 完成 #176/#177 MCP 主链路接入并强化安全质量 Apr 7, 2026
@Cai-Tang-www Cai-Tang-www changed the title feat: 完成 #176/#177 MCP 主链路接入并强化安全质量 feat: 完成 #176/#177 MCP 能力建设并补齐质量收口 Apr 7, 2026
@Cai-Tang-www Cai-Tang-www self-assigned this Apr 7, 2026
@minorcell

Copy link
Copy Markdown
Member

@Cai-Tang-www 功能测试过没有?

@Cai-Tang-www

Copy link
Copy Markdown
Collaborator Author

bootstrap还没接入mcp注册,还没测试

@minorcell

Copy link
Copy Markdown
Member

bootstrap还没接入mcp注册,还没测试

看看这个功能怎么接入其他模块,先测起来。

@Cai-Tang-www

Copy link
Copy Markdown
Collaborator Author

收到,已本地测试完成,等我补个测试率

@phantom5099

Copy link
Copy Markdown
Collaborator

stdio_client.go (line 771):decodeCallResult 会把非文本 MCP content 吞掉并回退成 ok,这会让 resource_link、image、audio 等结果在主链路里全部丢失。
registry.go (line 174):空内容但 isError=true 的 MCP 结果会被改写成 ok。结合 request.go (line 59),这个错误标记不会传给模型,实际失败会被当成成功继续推理。
registry.go (line 96):注销 server 不会关闭 StdIOClient,启动过程中后续 server 注册失败时,前面已经拉起的 MCP 子进程也没有回滚。
adapter.go (line 113):ensureObjectSchema 没有把非法非 object schema 纠正成 object,provider 仍会原样透传,容易把整次请求的 tool 定义打坏。

@minorcell minorcell merged commit e3d8984 into 1024XEngineer:main Apr 7, 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.

feat(tools/mcp): 接入 Tool Manager 主执行链 feat(mcp/tools): 设计 MCP registry + adapter

3 participants