mcp_search_tool.py — verl/tools/mcp_search_tool.py¶
文件路径¶
verl/tools/mcp_search_tool.py
文件概述¶
MCPSearchTool 是通过 MCP 协议实现的搜索工具,继承自 MCPBaseTool。它与 SearchTool(直接调用 HTTP API)的功能类似,但走的是 MCP 协议通道。这个类的核心工作是自定义解析 MCP 返回的搜索结果。
关键代码讲解¶
1. 构造函数¶
class MCPSearchTool(MCPBaseTool):
def __init__(self, config: dict, tool_schema: OpenAIFunctionToolSchema):
super().__init__(config, tool_schema)
非常简洁,直接复用父类 MCPBaseTool 的所有逻辑。
2. 解析搜索结果(核心方法)¶
def _parse_tool_result(self, content: list) -> tuple[str, dict]:
res = ""
res_cnt = 0
query_list = []
metadata = {
"api_request_error": "",
"status": "unknown",
"total_results": 0,
}
try:
for part in content:
if part.type != "text":
continue
text = part.text.replace("'", '"')
query_match = re.search(r'query"\s*:\s*"([^"]+)"', text)
query = query_match.group(1) if query_match else ""
query_list.append(query)
title_matches = re.findall(r'"title"\s*:', text)
title_count = len(title_matches)
results_match = re.search(r'"results"\s*:\s*(\[.*?\])', text, re.DOTALL)
results_content = results_match.group(1) if results_match else ""
res += results_content
res_cnt += title_count
except json.JSONDecodeError:
# ...错误处理...
metadata["status"] = "success"
metadata["queries"] = query_list
metadata["query_count"] = len(query_list)
metadata["total_results"] = res_cnt
return res, metadata
这个方法覆写了 MCPBaseTool._parse_tool_result,实现了搜索结果的定制化解析:
1. 遍历 MCP 返回的所有文本内容。
2. 用正则表达式提取 query(搜索关键词)。
3. 用正则表达式计算 title 出现次数(搜索结果数量)。
4. 用正则表达式提取 results 数组内容。
5. 将所有结果拼接成字符串返回。
核心类/函数列表¶
| 类/方法 | 作用 |
|---|---|
MCPSearchTool |
MCP 协议的搜索工具 |
_parse_tool_result |
解析 MCP 返回的搜索结果 |
与其他模块的关系¶
- 继承自
MCPBaseTool(mcp_base_tool.py)。 - 对比
SearchTool(search_tool.py):两者功能相同,但SearchTool直接调 HTTP API,MCPSearchTool通过 MCP 协议。 - 依赖
ClientManager进行 MCP 通信(继承自父类)。
小结¶
MCPSearchTool 是一个简洁的子类实现,展示了 MCP 工具体系的优势——只需覆写结果解析方法,就能快速适配不同的 MCP 服务。