| """ |
| 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', |
| 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') |
|
|
| |
| |
| tool_name = self.mcp_tool_name |
|
|
| |
| description = tool_info.get('description', f'MCP工具: {self.mcp_tool_name}') |
|
|
| |
| 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, |
| 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_params = { |
| "action": "call_tool", |
| "tool_name": self.mcp_tool_name, |
| "arguments": parameters |
| } |
|
|
| |
| return self.mcp_tool.run(mcp_params) |
|
|
|
|