本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
工具发现
在 MCP 服务器中发现和注册代理中的工具有三种方法:静态定义、动态发现和搜索功能。
静态定义
首先,您可以直接在代理代码中静态定义可用工具。在这种方法中,您可以为 MCP 服务器提供的、由 MCP 客户端访问的每个工具定义一个远程工具(像 Strands Agent SDK 这样的框架中的客户端参考对象)。以下示例使用可流式传输的 HTTP 传输:
from mcp.client.streamable_http import streamablehttp_client from strands import Agent from strands.tools.mcp import MCPClient streamable_http_mcp_client = MCPClient( lambda: streamablehttp_client("https://mcp1:8000/mcp") ) reverse_text = RemoteTool( name="reverseText", client=streamable_http_mcp_client ) agent = Agent(tools=[reverse_text])
单独的工具注册可以帮助你对提供给法学硕士的工具非常有选择性,从而最大限度地减少了上下文窗口的使用量。权衡之处在于,它需要知道可用工具的名称,如果可用工具在 MCP 服务器中发生变化,则可能会很脆弱。
动态发现
下一个方法是使用动态发现并将所有可用工具注册到代理。随着更多工具添加到 MCP 服务器,这种方法会线性地消耗上下文。以下是这种方法的示例:
from mcp.client.streamable_http import streamablehttp_client from strands import Agent from strands.tools.mcp import MCPClient streamable_http_mcp_client = MCPClient( lambda: streamablehttp_client("https://mcp1:8000/mcp") ) with streamable_http_mcp_client: tools = streamable_http_mcp_client.list_tools_sync() agent = Agent(tools=tools)
假设一个典型的工具定义消耗大约 250-500 个标记(包括名称、描述和架构)的场景。注册 20 个工具将消耗上下文窗口的 5,000—10,000 个令牌。当您有少量 MCP 服务器并且可以控制工具数量时,此选项最容易实现。但是,如果预计工具列表会增加,则可能会在代理中造成静默的上下文管理问题。这种方法的另一种变体是在调list_tools用时使用工具筛选参数(例如 Strands Agents SDK 提供的
搜索功能
第三种选择是在运行时使用搜索功能查找相关工具。您可以列出 MCP 服务器上的所有可用工具,然后根据用户提示对这些工具进行语义搜索。然后,将生成的工具注册到您的代理中。Amazon Bedrock AgentCore Gateway 提供了原生语义搜索功能,可以使此类解决方案更易于实施。
发现 MCP 工具的最佳实践
-
上下文窗口保存-选择一种工具发现和注册方法,以尽可能多地保留上下文窗口。
-
使用工具筛选或语义搜索功能 — 动态地为 LLM 提供一组范围缩小的工具供您选择,从而提高其选择正确工具的准确性和有效性。工具筛选可以对工具名称(精确匹配或模式)、工具描述(语义匹配)或域或类别标签进行操作。语义搜索对于将用户意图与工具描述相匹配特别有效。这两种方法都减少了上下文窗口的使用。