MCP协议支持

📎 引用文件

本文引用的文件 - agent/mcp_server.py - agent/src/tools/mcp.py - agent/src/config/schema.py - agent/src/channelsui/mcp_presets_api.py - agent/tests/test_mcp_new_tools.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能与可靠性
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件为 Vibe-Trading 的 Model Context Protocol(MCP)支持提供完整技术文档,覆盖服务器端点、客户端SDK适配、消息格式规范、工具注册机制(动态发现、参数校验、权限控制)、连接管理(传输层、重试策略)、路由实现(请求转发、响应聚合、错误传播)、自定义工具开发、协议版本兼容与安全考虑、性能优化建议以及调试与监控方法。目标是帮助开发者快速理解并扩展Vibe-Trading的MCP能力,同时确保安全性与稳定性。

项目结构

Vibe-Trading对MCP的支持由“服务端”和“客户端适配器”两部分组成: - 服务端:基于FastMCP暴露大量金融研究工具,支持stdio、SSE与Streamable HTTP三种传输;内置Host/Origin白名单防护,默认仅允许回环地址访问网络端口。 - 客户端适配器:将外部MCP服务器(如券商或数据服务)的工具动态发现并包装成本地BaseTool,统一调用、重试、结果归一化与错误处理。

graph TB Client["MCP客户端<br/>OpenClaw / Claude Desktop / Cursor"] --> Transport["传输层<br/>stdio / SSE / Streamable HTTP"] Transport --> Server["FastMCP 服务器<br/>mcp_server.py"] Server --> Registry["本地工具注册表<br/>src.tools.build_registry"] Server --> GoalStore["目标存储<br/>src.goal.GoalStore"] Server --> MarketData["市场数据接口<br/>src.market_data"] Adapter["MCPServerAdapter<br/>agent/src/tools/mcp.py"] --> RemoteServer["远程MCP服务器<br/>配置: MCPServerConfig"] Adapter --> LocalTools["本地BaseTool封装<br/>MCPRemoteTool"]

图表来源 - agent/mcp_server.py:69-81 - agent/src/tools/mcp.py:370-535 - agent/src/config/schema.py:349-411

章节来源 - agent/mcp_server.py:1-120 - agent/src/tools/mcp.py:1-120 - agent/src/config/schema.py:1-50

核心组件

章节来源 - agent/mcp_server.py:495-1599 - agent/src/tools/mcp.py:143-207 - agent/src/config/schema.py:349-492 - agent/src/channelsui/mcp_presets_api.py:8-20

架构总览

下图展示了从客户端到服务端再到本地工具注册表的请求流,以及客户端适配器如何桥接远程MCP服务器。

sequenceDiagram participant C as "MCP客户端" participant T as "传输层" participant S as "FastMCP服务器" participant R as "本地工具注册表" participant A as "MCPServerAdapter" participant RS as "远程MCP服务器" C->>T : "Initialize / list_tools / call_tool" T->>S : "HTTP/SSE/stdio请求" S->>R : "执行本地工具(如factor_analysis)" R-->>S : "返回JSON结果" S-->>C : "标准MCP响应" Note over C,A : "当使用远程MCP服务器时" C->>A : "本地工具调用(mcp_xxx_yyy)" A->>RS : "list_tools / call_tool" RS-->>A : "工具元数据/结果" A-->>C : "归一化后的JSON载荷"

图表来源 - agent/mcp_server.py:495-1599 - agent/src/tools/mcp.py:439-589

详细组件分析

服务器端点与传输

章节来源 - agent/mcp_server.py:25-35 - agent/mcp_server.py:131-317 - agent/mcp_server.py:102-128

工具注册机制

flowchart TD Start(["开始"]) --> Discover["list_tools 获取远程工具"] Discover --> Filter{"是否在 enabled_tools 白名单?"} Filter -- 否 --> Skip["跳过该工具"] Filter -- 是 --> NameGen["生成稳定本地工具名"] NameGen --> SchemaNorm["规范化输入Schema"] SchemaNorm --> Wrap["封装为 MCPRemoteTool"] Wrap --> End(["完成"])

图表来源 - agent/src/tools/mcp.py:401-437 - agent/src/tools/mcp.py:289-324 - agent/src/config/schema.py:458-492

章节来源 - agent/src/tools/mcp.py:143-207 - agent/src/tools/mcp.py:289-324 - agent/src/config/schema.py:145-180 - agent/src/config/schema.py:458-492

WebSocket连接管理

sequenceDiagram participant L as "本地工具" participant A as "MCPServerAdapter" participant RT as "远程MCP服务器" L->>A : "execute(...)" A->>RT : "call_tool(name, args, timeout)" RT-->>A : "结构化内容/文本内容" A-->>L : "归一化JSON载荷(status/data/content/text)" Note over L,A : "进度保活 : run_swarm通过report_progress维持连接"

图表来源 - agent/src/tools/mcp.py:564-589 - agent/mcp_server.py:1403-1513

章节来源 - agent/src/tools/mcp.py:537-627 - agent/mcp_server.py:1403-1513

MCP路由实现

flowchart TD Req["收到MCP请求"] --> Route["路由到@mcp.tool函数"] Route --> Validate["参数校验/类型转换"] Validate --> Exec["执行本地工具/业务逻辑"] Exec --> Resp["构造标准JSON响应"] Resp --> Err{"是否异常?"} Err -- 是 --> Error["转换为error envelope"] Err -- 否 --> Ok["返回ok envelope"]

图表来源 - agent/mcp_server.py:411-457 - agent/src/tools/mcp.py:958-1061

章节来源 - agent/mcp_server.py:495-1599 - agent/src/tools/mcp.py:958-1061

自定义MCP工具开发

classDiagram class MCPServerAdapter { +discover_tools() list +call_tool(remote_name, arguments) dict -_build_client() AsyncMCPClient -_list_tools_once() list -_call_tool(remote_name, arguments) CallToolResult } class MCPRemoteTool { +name string +description string +parameters dict +execute(**kwargs) string -_filter_arguments(arguments) dict } MCPServerAdapter --> MCPRemoteTool : "生成封装"

图表来源 - agent/src/tools/mcp.py:370-694

章节来源 - agent/mcp_server.py:495-1599 - agent/src/tools/mcp.py:629-694

协议版本兼容性

章节来源 - agent/mcp_server.py:25-35 - agent/mcp_server.py:411-457 - agent/src/tools/mcp.py:958-1042

安全考虑

章节来源 - agent/mcp_server.py:131-317 - agent/src/config/schema.py:458-492 - agent/mcp_server.py:102-128

性能优化建议

章节来源 - agent/src/tools/mcp.py:62-84 - agent/src/tools/mcp.py:521-535 - agent/mcp_server.py:1542-1586 - agent/mcp_server.py:1403-1513

依赖关系分析

graph LR M["mcp_server.py"] --> F["FastMCP"] M --> R["工具注册表"] M --> G["GoalStore"] A["tools/mcp.py"] --> FC["FastMCP Client"] A --> O["OAuth"] A --> FS["FileTreeStore"] C["config/schema.py"] --> A

图表来源 - agent/mcp_server.py:69-81 - agent/src/tools/mcp.py:17-41 - agent/src/config/schema.py:349-411

章节来源 - agent/mcp_server.py:69-81 - agent/src/tools/mcp.py:17-41 - agent/src/config/schema.py:349-411

性能与可靠性

章节来源 - agent/src/tools/mcp.py:591-627 - agent/src/tools/mcp.py:1081-1118

故障排查指南

章节来源 - agent/src/config/schema.py:458-492 - agent/mcp_server.py:1403-1513 - agent/src/tools/mcp.py:411-457

结论

Vibe-Trading的MCP支持提供了完整的服务器端点、客户端适配器、工具注册与权限控制机制,支持多种传输与协议版本兼容。通过严格的安全中间件、参数校验与错误处理,确保了系统的健壮性与可扩展性。开发者可基于现有架构轻松添加自定义工具,并利用缓存、超时与进度保活等机制优化性能与可靠性。

附录

章节来源 - agent/tests/test_mcp_new_tools.py:26-214 - agent/src/channelsui/mcp_presets_api.py:8-20