MCP 集成实战

适用版本:ChengOS v0.1.0+ | 最后核对:2026-08-12 | 来源:crates/cheng-nodes/src/nodes/builtin/tools/mcp_hub.rscrates/cheng-mcp/src/lib.rscrates/cheng-core/src/domain/mcp_server.rs

ChengOS 在 MCP 上是双向的:

方向 含义 位置
客户端 你的智能体调用外部 MCP 服务提供的工具 tools/mcp_hub
服务端 你的工作流以 MCP 工具的形式暴露给外部 AI 客户端 cheng-mcp

本页主要讲客户端,因为「接入 MCP Server」通常指的就是它。

MCP Hub 节点

tools/mcp_hub 是一个节点管理多个 MCP 服务。把它连到智能体的 tools 端口,智能体就获得了这些服务暴露的全部工具——受下文可见性规则约束。

它的指导原则是配置优先:默认情况下节点只返回服务器状态,只有当你显式发现或调用时才会发出请求。把节点丢到画布上并不会触发任何连接。

传输方式

传输 配置
stdio command(如 uvxnpx)加 argsenv——通过换行分隔的 stdin/stdout 与子进程做 JSON-RPC
streamable_http url,可选 authorization、可选 headers——通过 HTTP POST 做 JSON-RPC

两者互斥:带 command 的服务器配置是 stdio,带 url 的是 HTTP。

每个服务器条目还有 enabled、独立的 timeout,以及 long_running 标志。long_running 会保持一个常驻会话——stdio 是常驻子进程,否则是常驻 HTTP 会话——而不是每次调用都重连。启动开销大的服务器该开它;节点会缓存并复用该会话。

用凭证,别写字面量

不要把 API 密钥粘进服务器配置。把 utils/credential 节点的 env_vars 输出连到 Hub 的 env_vars 输入,然后用 ${env:KEY} 引用。

占位符在所有字符串字段中展开——urlauthorizationheadersargsenv。当同一个键两边都定义时,凭证节点的值优先于系统进程环境变量,因此工作流自己的凭证不会被服务器环境里恰好存在的东西覆盖掉。

可见性控制

把每个服务的每个工具都暴露给模型通常是错的:既烧上下文,又默认把破坏性操作交到模型手上。Hub 把可见(模型能看到)和可调用(模型可以调)分开。

推荐的结构化写法:

{
  "servers": {
    "my-server": { "visible": true, "callable": true },
    "*":         { "visible": true, "callable": true }
  },
  "tools": {
    "my-server:search": { "visible": true,  "callable": true  },
    "my-server:delete": { "visible": false, "callable": false },
    "*":                { "visible": true,  "callable": true  }
  }
}

另有一种以 server:tool 为键的扁平兼容写法。两者同时存在时,visibility_config 压过 tool_visibility

匹配从最具体开始:

1. server:tool     精确匹配
2. server:*        服务器通配
3. *:tool          工具名通配
4. *               全局默认

值得采用的模式是:把 * 设为可见且可调用,然后按名字显式禁掉那些破坏性工具。visible: false 的工具同时也不占用上下文。

调用工具

输入 含义
tool_name server:tool——只有一个服务器时也可以只写 tool
arguments 参数的 JSON 对象
discover_only 只列出各服务器的工具,不做任何调用
timeout_ms 请求超时;0 或留空表示不限时

tool_nameargumentsdiscover_only 可由 LLM 填写。服务器清单、可见性配置和凭证属于模型永远看不到的画布静态配置——这正是模型无法修改自己权限的原因。

输出是单一的 result 端口,携带摘要、各服务器状态、发现到的工具,以及可能的工具调用输出,因此节点的形状在配置态、发现态和调用态之间不会改变。

多模态结果

MCP 工具返回的可以不止文本,Hub 会在 content_parts 中完整保留:

{"type":"text","text":"..."}
{"type":"image","mimeType":"image/png","data":"base64..."}
{"type":"resource","resource":{"uri":"...","text":"...","mimeType":"..."}}

因此一个会画图的 MCP 工具,其结果能以图片形式抵达具备视觉能力的模型,而不是被当成附件丢掉。

把工作流发布为 MCP 服务

另一个方向。cheng-mcp 提供两种服务模式:

模式 暴露什么 端点
ChengMcpServer 应用级的工作流操作作为工具 /mcp,由 MCP_ENABLED=true 启用
WorkflowMcpServer 某个已发布工作流的工具 自己的临时端口,如 http://127.0.0.1:PORT/mcp

两者都走 Streamable HTTP。stdio 模式:

cargo run -p cheng-mcp -- --stdio

已发布的工作流会得到一条 McpServer 记录,把它绑定到网关端口、节点通过心跳上报的内部 URL,以及写进 JSON manifest 的公开网关 URL。发布者拥有相应的认证令牌。

排查

现象 检查
服务器显示未连接 stdio:command 在服务端的 PATH 里吗?HTTP:url 是从后端可达吗(不是从你的浏览器)?
工具不出现 先用 discover_only 跑一次;若那里有而智能体看不到,那就是可见性规则
鉴权失败 ${env:KEY} 没解析出来——确认凭证节点已连接且键名一致
首次调用很慢 服务器启动开销大;打开 long_running
模型调了你不希望它调的工具 给它设 callable: false——别指望在提示词里叮嘱

下一步

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容