*/list
)、检索(*/get
),以及在某些情况下执行(tools/call
)。MCP 客户端将使用 */list
方法来发现可用的原语。例如,客户端可以首先列出所有可用的工具(tools/list
),然后执行它们。这种设计允许列表是动态的。 举一个具体的例子,考虑一个提供有关数据库上下文的 MCP 服务器。它可以公开用于查询数据库的工具、一个包含数据库模式的资源以及一个包含与工具交互的少样本示例的提示。 有关服务器原语的更多详细信息,请参阅服务器概念。 MCP 还定义了客户端可以公开的原语。这些原语允许 MCP 服务器作者构建更丰富的交互。sampling/complete
方法从客户端的 AI 应用程序请求语言模型补全。elicitation/request
方法向用户请求额外信息。初始化(生命周期管理)
initialize
请求来建立连接并协商支持的功能。protocolVersion
字段(例如,“2025-06-18”)确保客户端和服务器都使用兼容的协议版本。这可以防止不同版本尝试交互时可能发生的通信错误。如果未能协商出相互兼容的版本,则应终止连接。
capabilities
对象允许各方声明它们支持哪些功能,包括它们可以处理哪些原语(工具、资源、提示)以及是否支持通知等功能。这通过避免不支持的操作来实现高效通信。
clientInfo
和 serverInfo
对象提供了用于调试和兼容性目的的身份和版本信息。
"tools": {}
- 客户端声明它可以处理工具原语(可以调用 tools/list
和 tools/call
方法)"tools": {"listChanged": true}
- 服务器支持工具原语,并且当其工具列表发生变化时可以发送 tools/list_changed
通知"resources": {}
- 服务器还支持资源原语(可以处理 resources/list
和 resources/read
方法)工具发现(原语)
tools/list
请求来发现可用的工具。这个请求是 MCP 工具发现机制的基础——它允许客户端在尝试使用工具之前了解服务器上有哪些可用的工具。tools/list
请求很简单,不包含任何参数。tools
数组,该数组提供了关于每个可用工具的全面元数据。这种基于数组的结构允许服务器同时公开多个工具,同时在不同功能之间保持清晰的界限。响应中的每个工具对象都包含几个关键字段:name
:服务器命名空间内工具的唯一标识符。这作为工具执行的主键,并且最好是 URI 形式以便更好地进行命名空间管理(例如,com.example.calculator/arithmetic
而不是简单的 calculate
)title
:工具的可读显示名称,客户端可以向用户展示description
:详细解释工具的功能和使用时机inputSchema
:一个定义预期输入参数的 JSON Schema,可实现类型验证并提供关于必需和可选参数的清晰文档工具执行(原语)
tools/call
方法执行一个工具。这演示了 MCP 原语在实践中是如何使用的:在发现可用工具后,客户端可以用适当的参数调用它们。tools/call
请求遵循一种结构化格式,以确保类型安全和客户端与服务器之间的清晰通信。请注意,我们使用的是发现响应中正确的工具名称(com.example.weather/current
),而不是一个简化的名称。name
:必须与发现响应中的工具名称完全匹配(com.example.weather/current
)。这确保服务器可以正确识别要执行的工具。
arguments
:包含由工具的 inputSchema
定义的输入参数。在此示例中:
location
: "San Francisco" (必需参数)units
: "imperial" (可选参数,如果未指定则默认为 "metric")id
用于请求-响应关联。
content
数组:工具响应返回一个内容对象数组,允许丰富的、多格式的响应(文本、图片、资源等)
type
字段。在本例中,"type": "text"
表示纯文本内容,但 MCP 支持各种内容类型以适应不同的用例。
实时更新(通知)
id
字段。这遵循了 JSON-RPC 2.0 的通知语义,即不期望或发送响应。
"listChanged": true
的服务器发送(如步骤 1 所示)。