MCP Go SDK 中的工具系统提供了一个全面的框架,用于定义、管理和执行可由 MCP 客户端调用的可执行函数。该系统处理工具模式定义、参数验证、执行路由以及与 MCP 协议的集成。
有关数据访问等其他 MCP 功能的信息,请参阅资源。有关用户交互模板,请参阅提示。有关完整的服务器设置和配置,请参阅MCP 服务器。
MCP 中的工具是使用Tool结构体定义的,该结构体包含名称、描述、输入模式和行为注释。输入模式使用 JSON Schema 来验证和记录预期参数。
工具模式结构
Sources: mcp/tools.go472-483 mcp/tools.go518-540 mcp/tools.go541-552
该系统支持两种定义工具模式的方法
| 方法 | 用例 | 优点 |
|---|---|---|
结构化模式 (ToolInputSchema) | 大多数具有标准 JSON Schema 需求的工具 | 类型安全、构建器模式、验证 |
原始模式 (RawInputSchema) | 需要高级 JSON Schema 功能的复杂模式 | 完整的 JSON Schema 灵活性 |
工具是使用构建器函数创建的,这些函数提供了用于配置的流畅 API。NewTool 函数创建具有结构化模式的工具,而 NewToolWithRawSchema 允许任意 JSON Schema 定义。
工具构建器模式
Sources: mcp/tools.go569-591 mcp/tools.go600-608 mcp/tools.go847-865
该系统提供具有验证选项的特定类型属性构建器
| 属性类型 | 构建器函数 | 通用选项 |
|---|---|---|
| 字符串 | WithString(name, opts...) | Required(), MinLength(), MaxLength(), Pattern(), Enum() |
| 数字 | WithNumber(name, opts...) | Required(), Min(), Max(), MultipleOf() |
| 布尔值 | WithBoolean(name, opts...) | Required(), DefaultBool() |
| 数组 | WithArray(name, opts...) | Required(), Items(), MinItems(), MaxItems(), UniqueItems() |
| 对象 | WithObject(name, opts...) | Required(), Properties(), AdditionalProperties() |
Sources: mcp/tools.go804-821 mcp/tools.go825-843 mcp/tools.go847-865
CallToolRequest 提供了多种访问工具参数的方法,从简单的键值访问到强类型绑定。
参数访问方法
Sources: mcp/tools.go46-70 mcp/tools.go73-90 mcp/tools.go93-234
该系统处理三种参数格式
map[string]any) - 传统的键值参数| 访问方式 | 返回类型 | 错误处理 |
|---|---|---|
GetString(key, default) | 字符串 | 如果缺失/无效,则返回默认值 |
RequireString(key) | (string, error) | 如果缺失/无效,则返回错误 |
BindArguments(&struct) | error | JSON 解组到结构体 |
GetRawArguments() | any | 按原样返回参数 |
Sources: mcp/tools.go58-70 mcp/tools.go93-113 mcp/tools.go236-278
工具执行由处理CallToolRequest并返回CallToolResult的处理器函数处理。该系统支持无类型和强类型处理器。
处理器函数类型
Sources: mcp/typed_tools.go8-20 mcp/tools.go26-43
工具执行结果包含内容和错误信息
| 字段 | 类型 | 目的 |
|---|---|---|
内容 | []Content | 响应数据(文本、图像、音频、嵌入式资源) |
IsError | bool | 指示工具执行是否失败 |
CallToolResult 遵循 MCP 约定,即工具级别的错误在结果对象中报告,而不是作为协议级别的错误,从而允许 LLM 查看并可能从失败中恢复。
Sources: mcp/tools.go26-43
工具通过ServerTool封装器和管理方法集成到 MCP 服务器中。服务器处理工具注册、列出和执行路由。
服务器工具集成
Sources: server/server_test.go161-180 server/server_test.go255-285
服务器提供全面的工具生命周期管理
| 操作 | 方法 | 通知 |
|---|---|---|
| 添加单个工具 | AddTool(tool, handler) | notifications/tools/list_changed |
| 替换所有工具 | SetTools(...ServerTool) | notifications/tools/list_changed |
| 移除工具 | DeleteTools(...names) | notifications/tools/list_changed 如果有任何工具被移除 |
当工具列表被修改时,服务器会自动向活跃的客户端会话发送tools/list_changed通知。
Sources: server/server_test.go182-210 server/server_test.go287-315
工具通过标准化的请求/响应消息和通知模式与 MCP 协议集成。
MCP 协议流程
Sources: mcp/tools.go15-24 mcp/tools.go464-469
| 消息类型 | 方向 | 目的 |
|---|---|---|
tools/list | 客户端 → 服务器 | 请求可用工具 |
tools/call | 客户端 → 服务器 | 执行特定工具 |
notifications/tools/list_changed | 服务器 → 客户端 | 通知工具列表更改 |
该协议支持工具列表的分页,并包含用于进度跟踪和附加上下文的元数据。
Sources: mcp/tools.go15-24 mcp/tools.go464-469