mcp_wrapper_tool.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. """
  2. MCP工具包装器 - 将单个MCP工具包装成HelloAgents Tool
  3. 这个模块将MCP服务器的每个工具展开为独立的HelloAgents Tool对象,
  4. 使得Agent可以像调用普通工具一样调用MCP工具。
  5. """
  6. from typing import Dict, Any, Optional, List
  7. from ..base import Tool, ToolParameter
  8. class MCPWrappedTool(Tool):
  9. """
  10. MCP工具包装器 - 将单个MCP工具包装成HelloAgents Tool
  11. 这个类将MCP服务器的一个工具(如 read_file)包装成一个独立的Tool对象。
  12. Agent调用时只需提供参数,无需了解MCP的内部结构。
  13. 示例:
  14. >>> # 内部使用,由MCPTool自动创建
  15. >>> wrapped_tool = MCPWrappedTool(
  16. ... mcp_tool=mcp_tool_instance,
  17. ... tool_info={
  18. ... "name": "read_file",
  19. ... "description": "Read a file...",
  20. ... "input_schema": {...}
  21. ... }
  22. ... )
  23. """
  24. def __init__(self,
  25. mcp_tool: 'MCPTool', # type: ignore
  26. tool_info: Dict[str, Any],
  27. prefix: str = ""):
  28. """
  29. 初始化MCP包装工具
  30. Args:
  31. mcp_tool: 父MCP工具实例
  32. tool_info: MCP工具信息(包含name, description, input_schema)
  33. prefix: 工具名前缀(如 "filesystem_")
  34. """
  35. self.mcp_tool = mcp_tool
  36. self.tool_info = tool_info
  37. self.mcp_tool_name = tool_info.get('name', 'unknown')
  38. # 构建工具名:prefix + mcp_tool_name
  39. tool_name = f"{prefix}{self.mcp_tool_name}" if prefix else self.mcp_tool_name
  40. # 获取描述
  41. description = tool_info.get('description', f'MCP工具: {self.mcp_tool_name}')
  42. # 解析参数schema
  43. self._parameters = self._parse_input_schema(tool_info.get('input_schema', {}))
  44. # 初始化父类
  45. super().__init__(
  46. name=tool_name,
  47. description=description
  48. )
  49. def _parse_input_schema(self, input_schema: Dict[str, Any]) -> List[ToolParameter]:
  50. """
  51. 将MCP的input_schema转换为HelloAgents的ToolParameter列表
  52. Args:
  53. input_schema: MCP工具的input_schema(JSON Schema格式)
  54. Returns:
  55. ToolParameter列表
  56. """
  57. parameters = []
  58. properties = input_schema.get('properties', {})
  59. required_fields = input_schema.get('required', [])
  60. for param_name, param_info in properties.items():
  61. param_type = param_info.get('type', 'string')
  62. param_desc = param_info.get('description', '')
  63. is_required = param_name in required_fields
  64. parameters.append(ToolParameter(
  65. name=param_name,
  66. type=param_type, # 直接使用JSON Schema的类型字符串
  67. description=param_desc,
  68. required=is_required
  69. ))
  70. return parameters
  71. def get_parameters(self) -> List[ToolParameter]:
  72. """
  73. 获取工具参数定义
  74. Returns:
  75. ToolParameter列表
  76. """
  77. return self._parameters
  78. def run(self, params: Dict[str, Any]) -> str:
  79. """
  80. 执行MCP工具
  81. Args:
  82. params: 工具参数(直接传递给MCP工具)
  83. Returns:
  84. 执行结果
  85. """
  86. # 构建MCP调用参数
  87. mcp_params = {
  88. "action": "call_tool",
  89. "tool_name": self.mcp_tool_name,
  90. "arguments": params
  91. }
  92. # 调用父MCP工具
  93. return self.mcp_tool.run(mcp_params)