为了避免冲突,MCP 工具的命名空间为
mcp__{server_name}__{tool_name};被标注 readOnlyHint 的 MCP 工具会被权限系统识别为只读(在 EXPLORE 与 ACCEPT_EDITS 模式下自动放行;DEFAULT 模式下若没有 allow 规则命中,仍然会 ASK)。
AgentScope 2.0.11 使用 MCP Python SDK 2.x(mcp>=2.0.0),并自动与现有
STDIO、Streamable HTTP 和 SSE 服务器协商协议。
注册 MCP 客户端
通过Toolkit(mcps=[...]) 接口可以注册多个 MCP 客户端,其中有状态的 MCP 客户端必须在构造 toolkit 之前完成连接。
筛选暴露的工具
如果希望只暴露 MCP 服务的部分工具,可以在客户端上配置enable_tools 或 disable_tools 参数:
运行时更新 HTTP header
mcp_config 中的 headers 在构造时就已固定。当鉴权令牌会在会话中途轮换时,对 Streamable HTTP 客户端调用 set_runtime_headers() 即可替换后续请求携带的 header,既不用重建客户端,也不用重新连接:
Docker 工作区中真正的 MCP 客户端跑在网关进程里,主机侧持有的是代理对象。对代理调用
set_runtime_headers() 会转发给网关,详见 MCP 网关。在 Toolkit 之外使用 MCP 工具
需要在Toolkit 之外直接调用 MCP 工具时,调用 await client.list_tools() 拿到 MCPTool 实例列表后,即可像普通 ToolBase 一样使用。
接收工具进度
为本地MCPClient 设置 stream_progress=True,可以在工具执行期间展示进度。
MCP 服务器需要主动发送进度通知:
启用进度通知
Agent.reply_stream() 中,进度以 CustomEvent(name="mcp_progress")
发出。其 value 包含 reply_id、tool_call_id、progress,以及可为空的
total 和 message。使用这两个 ID 更新对应工具的进度显示。进度是临时快照,
不保证逐条送达,也不会写入最终工具结果;Msg.append_event() 会忽略这些事件。
在工具包外调用工具时,启用进度后,await tool(...) 返回由 ToolChunk 组成的
异步迭代器。进度位于 chunk.metadata["mcp_progress"],最后一个块携带最终结果。
默认的 stream_progress=False 则只返回最终结果块。
沙箱网关工具即使启用进度配置,也只返回最终结果。如果 MCP 结果只有结构化内容而
没有文本块,AgentScope 会将其 JSON 表示补充到最终结果中。