"""服务端MCP工具执行器"""
|
|
from typing import Dict, Any, Optional
|
from ..base import ToolType, ToolDefinition, ToolExecutor
|
from plugins_func.register import Action, ActionResponse
|
from .mcp_manager import ServerMCPManager
|
|
|
class ServerMCPExecutor(ToolExecutor):
|
"""服务端MCP工具执行器"""
|
|
def __init__(self, conn):
|
self.conn = conn
|
self.mcp_manager: Optional[ServerMCPManager] = None
|
self._initialized = False
|
|
async def initialize(self):
|
"""初始化MCP管理器"""
|
if not self._initialized:
|
self.mcp_manager = ServerMCPManager(self.conn)
|
self._initialized = True
|
await self.mcp_manager.initialize_servers()
|
|
async def execute(
|
self, conn, tool_name: str, arguments: Dict[str, Any]
|
) -> ActionResponse:
|
"""执行服务端MCP工具"""
|
if not self._initialized or not self.mcp_manager:
|
return ActionResponse(
|
action=Action.ERROR,
|
response="MCP管理器未初始化",
|
)
|
|
try:
|
# 移除mcp_前缀(如果有)
|
actual_tool_name = tool_name
|
if tool_name.startswith("mcp_"):
|
actual_tool_name = tool_name[4:]
|
|
result = await self.mcp_manager.execute_tool(actual_tool_name, arguments)
|
|
return ActionResponse(action=Action.REQLLM, result=str(result))
|
|
except ValueError as e:
|
return ActionResponse(
|
action=Action.NOTFOUND,
|
response=str(e),
|
)
|
except Exception as e:
|
return ActionResponse(
|
action=Action.ERROR,
|
response=str(e),
|
)
|
|
def get_tools(self) -> Dict[str, ToolDefinition]:
|
"""获取所有服务端MCP工具"""
|
if not self._initialized or not self.mcp_manager:
|
return {}
|
|
tools = {}
|
mcp_tools = self.mcp_manager.get_all_tools()
|
|
for tool in mcp_tools:
|
func_def = tool.get("function", {})
|
tool_name = func_def.get("name", "")
|
if tool_name == "":
|
continue
|
tools[tool_name] = ToolDefinition(
|
name=tool_name, description=tool, tool_type=ToolType.SERVER_MCP
|
)
|
|
return tools
|
|
def has_tool(self, tool_name: str) -> bool:
|
"""检查是否有指定的服务端MCP工具"""
|
if not self._initialized or not self.mcp_manager:
|
return False
|
|
# 移除mcp_前缀(如果有)
|
actual_tool_name = tool_name
|
if tool_name.startswith("mcp_"):
|
actual_tool_name = tool_name[4:]
|
|
return self.mcp_manager.is_mcp_tool(actual_tool_name)
|
|
async def cleanup(self):
|
"""清理MCP连接"""
|
if self.mcp_manager:
|
await self.mcp_manager.cleanup_all()
|