MCP 工具提供与调用流程
MCP 工具调用涉及两个相邻但不同的环节:Host 让模型看见工具,模型提出使用工具;随后 MCP Client 向 Server 发起 tools/call。理解这条边界,才能定位“工具列表可见却没有调用”与“调用已发送但工具执行失败”两类问题。MCP 工具规范
1. Server 提供工具定义
Server 实现工具处理逻辑,并以工具名称、说明和 inputSchema 描述参数。下面是 tools/list 返回的一个简化工具定义;inputSchema 使用 JSON Schema,required 指定必填项。
{
"name": "add",
"description": "返回两个整数的和",
"inputSchema": {
"type": "object",
"properties": {
"a": { "type": "integer" },
"b": { "type": "integer" }
},
"required": ["a", "b"]
}
}声明工具不意味着它可以绕过权限检查。Server 应验证参数和调用者权限;Host 应决定是否向模型暴露该工具,并在有副作用的操作前执行用户确认。
2. Client 初始化并发现工具
Client 先发送 initialize,双方协商协议版本并交换能力;Client 随后发送 notifications/initialized。Server 声明 tools 能力后,Client 才能使用 tools/list 获取具体工具。工具列表可能分页,Client 应按返回的游标继续读取;若 Server 声明列表变化通知,Client 可在收到 notifications/tools/list_changed 后刷新。生命周期规范、工具列表规范
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
}Host 从发现的工具中选择当前会话可用的部分,把描述转换为模型所需的工具定义。模型看到的是 Host 提供的工具集合,未必等于 Server 上的全部工具。
3. 模型选择,Host 发起 MCP 调用
用户提出“19 加 23”。模型可以给出一个结构化工具调用请求;Host 检查策略后,通过对应 Client 发送 MCP 消息:
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "add",
"arguments": { "a": 19, "b": 23 }
}
}模型侧的 Function Call 由模型 API 与 Host 约定;tools/call 是 Client 与 MCP Server 之间的方法。Host 也可以在测试或固定工作流中不经模型而直接调用 MCP 工具。两者不能混作同一个协议请求。Function Call 介绍
4. Server 执行并返回结果
Server 按名称定位工具,校验参数并执行。正常工具结果可以包含文本、图像或其他受支持的内容块;这里用文本表示 42:
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [{ "type": "text", "text": "42" }]
}
}Client 把结果交给 Host,Host 再决定如何提供给模型以继续生成回答。工具执行出错时可返回 isError: true 的工具结果;消息格式或协议方法出错则使用 JSON-RPC error。JSON-RPC 错误说明
从哪里找现成的 MCP 工具
自己实现 Server 不是唯一途径。工具通常由一个 MCP Server 打包提供;目录负责帮助发现 Server,实际连接仍由 Host 中的 MCP Client 完成。
| 来源 | 适合做什么 | 使用时注意 |
|---|---|---|
| ModelScope MCP 广场 | 按用途查找社区 Server,查看工具说明、源码、运行参数和连接配置;部分服务可由平台托管 | 以具体服务页给出的传输方式、有效地址与鉴权要求为准,托管地址可能有有效期 |
| 官方 MCP Registry | 按名称查找公开 Server 的标准化元数据,包括包或远程地址 | Registry 主要收录发现与安装信息,不托管 Server 代码,也不替使用者审查每个工具的行为 |
| MCP 参考 Server 仓库 | 阅读协议示例,使用 Everything 等参考实现测试 Client | 仓库明确将这些 Server 定位为参考实现,生产使用前要自行评估权限与安全要求 |
ModelScope 广场是服务发现入口;ModelScope 的 MCP 使用说明指出,服务页通常包含工具、源码、运行参数和可用连接配置。官方 Registry 则是元数据目录,其说明区分了 Registry 与实际的软件包仓库。
以 ModelScope 托管服务为例
- 在广场中按任务搜索 Server,打开服务页,先核对发布者、源码、工具清单及其读写权限。
- 按服务页说明启动或连接服务。若选择平台托管服务,取得该实例当前的连接地址、传输类型以及所需凭证;若选择本地运行,则复制服务页提供的启动命令。不要把旧版 SSE 地址配置成 Streamable HTTP。
- 在所用 Host 的 MCP 配置中添加该连接。下例只表示 Streamable HTTP 连接所需的信息,字段名以具体 Host 的配置文档为准;地址须从服务页复制,不能直接使用占位值。
{
"mcpServers": {
"example-service": {
"type": "streamable_http",
"url": "<从服务页复制的当前 MCP 地址>"
}
}
}- 让 Client 完成初始化,先用
tools/list确认预期工具和参数模式,再选一个只读工具用tools/call小范围试用。若失败,依次核对地址是否过期、传输类型、凭证、工具名和参数。ModelScope 的服务 API 同时支持sse与streamable_http部署类型,实际 URL 随部署类型而不同。ModelScope 服务操作说明
目录收录或工具能列出,并不代表它适合获得本机文件、密钥或写入权限。接入第三方 Server 前,应查看其代码与权限范围,并让 Host 只暴露当前任务需要的工具。
排查顺序
- 无法连接:先核对 stdio 启动命令或 Streamable HTTP 端点,再检查初始化是否完成。
- 工具不可见:检查 Server 是否声明
tools、tools/list是否返回目标工具,以及 Host 是否过滤了它。 - 模型没有调用:核对模型是否支持工具调用、工具描述是否清楚、Host 是否把工具交给模型。不能只凭最终答案判断模型是否执行了工具。
- 调用失败:记录
tools/call的id、工具名和参数,区分 JSON-RPCerror与结果中的isError。
想在 Java 中跑通这条链路,继续阅读 Spring AI MCP 实践。
