Files
ailine/backend/app/mcp/mcp_manager.py
root 9c53f58165
All checks were successful
构建并部署 AI Agent 服务 / deploy (push) Successful in 5m38s
feat: 集成MCP统一外部接口管理系统
- 添加MCP Manager统一入口管理
- 实现Contact/Dictionary/News三个适配器
- 三层降级策略:MCP -> Database -> Mock
- 保持原有api_client向后兼容
- 添加完整文档和测试
2026-05-03 12:36:12 +08:00

115 lines
3.3 KiB
Python

"""
MCP管理器
统一管理所有MCP适配器和外部接口
"""
from typing import Dict, Any, Optional, List, Type
from .mcp_client import MCPClient, MCPServerConfig
from .adapters.base_adapter import BaseAdapter, AdapterResult
class MCPManager:
"""
MCP管理器
职责:
1. 管理MCP客户端
2. 注册和管理适配器
3. 提供统一的调用接口
"""
def __init__(self):
self._mcp_client = MCPClient()
self._adapters: Dict[str, BaseAdapter] = {}
self._initialized = False
def configure_servers(self, servers_config: Dict[str, Dict[str, Any]]):
"""
配置MCP服务器
Args:
servers_config: 服务器配置字典
{
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path"]
},
"news": {...}
}
"""
for name, config in servers_config.items():
server_config = MCPServerConfig(
name=name,
server_type=config.get("type", "stdio"),
command=config.get("command"),
args=config.get("args", []),
url=config.get("url"),
headers=config.get("headers", {}),
env=config.get("env", {}),
enabled=config.get("enabled", True)
)
self._mcp_client.register_server(server_config)
def register_adapter(self, adapter: BaseAdapter):
"""注册适配器"""
adapter.mcp_client = self._mcp_client
self._adapters[adapter.name] = adapter
def get_adapter(self, name: str) -> Optional[BaseAdapter]:
"""获取适配器"""
return self._adapters.get(name)
async def initialize(self):
"""初始化MCP系统"""
if self._initialized:
return
await self._mcp_client.initialize()
# 初始化所有适配器
for name, adapter in self._adapters.items():
print(f"[MCP] 初始化适配器: {name}")
self._initialized = True
print(f"[MCP] 管理器初始化完成,适配器: {list(self._adapters.keys())}")
async def execute(
self,
adapter_name: str,
action: str,
**kwargs
) -> AdapterResult:
"""
统一执行接口
Args:
adapter_name: 适配器名称
action: 操作类型
**kwargs: 操作参数
Returns:
AdapterResult: 执行结果
"""
if not self._initialized:
await self.initialize()
adapter = self._adapters.get(adapter_name)
if not adapter:
return AdapterResult(
success=False,
error=f"适配器 {adapter_name} 不存在"
)
return await adapter.execute(action, **kwargs)
def get_available_adapters(self) -> List[str]:
"""获取所有可用适配器"""
return list(self._adapters.keys())
def get_available_tools(self) -> List[str]:
"""获取所有可用MCP工具"""
return self._mcp_client.get_available_tools()
# 全局单例
mcp_manager = MCPManager()