跳转至

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 服务。