agent / backend /backend_app /helloAgents /tools /builtin /mcp_wrapper_tool.py
Toadied's picture
2312
8b383ad verified
Raw
History Blame Contribute Delete
3.74 kB
"""
MCP工具包装器 - 将单个MCP工具包装成HelloAgents Tool
这个模块将MCP服务器的每个工具展开为独立的HelloAgents Tool对象,
使得Agent可以像调用普通工具一样调用MCP工具。
"""
from typing import Dict, Any, Optional, List
from ..base import Tool, ToolParameter
class MCPWrappedTool(Tool):
"""
MCP工具包装器 - 将单个MCP工具包装成HelloAgents Tool
这个类将MCP服务器的一个工具(如 read_file)包装成一个独立的Tool对象。
Agent调用时只需提供参数,无需了解MCP的内部结构。
示例:
>>> # 内部使用,由MCPTool自动创建
>>> wrapped_tool = MCPWrappedTool(
... mcp_tool=mcp_tool_instance,
... tool_info={
... "name": "read_file",
... "description": "Read a file...",
... "input_schema": {...}
... }
... )
"""
def __init__(self,
mcp_tool: 'MCPTool', # type: ignore
tool_info: Dict[str, Any],
prefix: str = ""):
"""
初始化MCP包装工具
Args:
mcp_tool: 父MCP工具实例
tool_info: MCP工具信息(包含name, description, input_schema)
prefix: 工具名前缀(如 "filesystem_")
"""
self.mcp_tool = mcp_tool
self.tool_info = tool_info
self.mcp_tool_name = tool_info.get('name', 'unknown')
# 构建工具名:prefix + mcp_tool_name
# tool_name = f"{prefix}{self.mcp_tool_name}" if prefix else self.mcp_tool_name
tool_name = self.mcp_tool_name # 直接使用MCP工具名,不添加前缀
# 获取描述
description = tool_info.get('description', f'MCP工具: {self.mcp_tool_name}')
# 解析参数schema
self._parameters = self._parse_input_schema(tool_info.get('input_schema', {}))
# 初始化父类
super().__init__(
name=tool_name,
description=description
)
def _parse_input_schema(self, input_schema: Dict[str, Any]) -> List[ToolParameter]:
"""
将MCP的input_schema转换为HelloAgents的ToolParameter列表
Args:
input_schema: MCP工具的input_schema(JSON Schema格式)
Returns:
ToolParameter列表
"""
parameters = []
properties = input_schema.get('properties', {})
required_fields = input_schema.get('required', [])
for param_name, param_info in properties.items():
param_type = param_info.get('type', 'string')
param_desc = param_info.get('description', '')
is_required = param_name in required_fields
parameters.append(ToolParameter(
name=param_name,
type=param_type, # 直接使用JSON Schema的类型字符串
description=param_desc,
required=is_required
))
return parameters
def get_parameters(self) -> List[ToolParameter]:
"""
获取工具参数定义
Returns:
ToolParameter列表
"""
return self._parameters
def run(self, parameters: Dict[str, Any]) -> str:
"""
执行MCP工具
Args:
params: 工具参数(直接传递给MCP工具)
Returns:
执行结果
"""
# 构建MCP调用参数
mcp_params = {
"action": "call_tool",
"tool_name": self.mcp_tool_name,
"arguments": parameters
}
# 调用父MCP工具
return self.mcp_tool.run(mcp_params)