关于 mcproxy
mcproxy 是位于 MCP 客户端与服务之间的实验性代理层,面向探索两者间工作流改造的开发者。它转发消息,并提供内部功能和外部模块的结构,可用于筛选、重命名能力及更新内容。
主要功能
- 01连接多个 MCP 服务
- 02转发请求、响应、错误和通知
- 03聚合或屏蔽服务能力
- 04重命名能力以解决标识符冲突
- 05过滤或丰富文本内容
适用场景
- 01通过代理端点接入多个服务
- 02限制客户端可访问的服务能力
- 03区分重名的工具或资源
- 04在传输过程中处理消息内容
MCP 相关
从客户端视角看,mcproxy 表现为 MCP 服务;面向已连接服务时则表现为 MCP 客户端。它转发 MCP 消息,并可应用内部功能或调用已配置的外部模块。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
前言
这仍处于非常实验性的阶段,也可能完全毫无用处 😁。欢迎加入此讨论并提供反馈,我们将不胜感激。
注意:这可能与此处的内容相矛盾:“跨服务交互由宿主控制。”也可能不矛盾……
概述
本项目与 Anthropic 的 Model Context Protocol(MCP,参见文档和规范)有关。
MCProxy 是 MCP 客户端与 MCP 服务之间的代理,可在两者之间的工作流中提供新功能(下文给出了一些示例)。
MCProxy 提供了实现此类代理架构的基础构件,以及一些基本功能(待定:基本功能列表)。
可根据用户需求,通过插件模块添加新功能(待定:插件机制)。
全局架构
从 MCP 客户端的角度看,MCProxy 的行为类似于 MCP 服务。从 MCP 服务的角度看,MCProxy 的行为类似于 MCP 客户端。
最简单的形式如下:
flowchart LR
client1[MCP Client]
subgraph "MCProxy"
server1[MCP Server]
client2[MCP Client]
end
server2[MCP Server]
client1 <--MCP--> server1
client2 <--MCP--> server2
server1 <--> client2
一个 MCProxy 可以连接多个服务:
flowchart LR
client1[MCP Client]
subgraph "MCProxy"
server1[MCP Server]
client2[MCP Client A]
client3[MCP Client B]
end
server2[MCP Server A]
server3[MCP Server B]
client1 <--MCP--> server1
client2 <--MCP--> server2
client3 <--MCP--> server3
server1 <--> client2
server1 <--> client3
MCP 宿主可以连接配置截然不同的多个 MCProxy:
flowchart LR
subgraph "Host"
clientH1[MCP Client]
clientH2[MCP Client]
end
subgraph "MCProxy A"
serverPA[MCP Server]
clientPA[MCP Client]
end
serverA[MCP Server A]
subgraph "MCProxy B"
serverPB[MCP Server]
clientPB[MCP Client]
end
serverB[MCP Server B]
clientH1 <--MCP--> serverPA
clientH2 <--MCP--> serverPB
clientPA <--MCP--> serverA
clientPB <--MCP--> serverB
serverPA <--> clientPA
serverPB <--> clientPB
如果有用,也可以将多个 MCProxy 串联起来:
flowchart LR
client1[MCP Client]
subgraph "MCProxy A"
server1[MCP Server]
client2[MCP Client]
end
subgraph "MCProxy B"
server2[MCP Server]
client3[MCP Client]
end
server3[MCP Server]
client1 <--MCP--> server1
client2 <--MCP--> server2
client3 <--MCP--> server3
server1 <--> client2
server2 <--> client3
内部架构
基本组件包括:
- 服务管理器,负责处理与 MCP 客户端的通信(请求,也包括响应/错误/通知)
- 客户端管理器,维护已连接 MCP 服务的列表,并负责处理与它们的通信(请求,也包括响应/错误/通知)
内部功能组件提供始终可用的基本功能列表。
模块管理器维护外部模块列表,这些模块提供额外功能,并与它们交互。
核心组件是分发器,它:
- 在 MCP 客户端与 MCP 服务之间双向转发消息
- 在适用时应用内部功能
- 在适用时调用外部模块
flowchart LR
subgraph MCProxy
subgraph servermanager[Server manager]
server[MCP Server]
end
dispatcher[Dispatcher]
internalfeatures[Internal features]
modulesmanager[Modules manager]
subgraph clientsmanager[Clients manager]
direction TB
clientA[MCP Client A]
clientB[MCP Client B]
end
end
moduleA[External module A]
moduleB[External module B]
servermanager <--> dispatcher
dispatcher <--> clientsmanager
dispatcher <--> internalfeatures
dispatcher <--> modulesmanager
modulesmanager <--> moduleA
modulesmanager <--> moduleB
标识符
默认情况下,MCProxy 会使用相同的标识符(名称、URI……)公开其连接的 MCP 服务中的所有资源/提示词/工具。这些标识符可以重命名(参见下文的“功能”)。
配置
为了连接 MCP 服务,MCProxy 使用与 MCP 文档快速入门部分中定义的相同配置文件格式。
MCProxy 本身还提供一些内部配置。
最后,每个模块都提供一些配置指令。下文给出了示例。
注意:在 Claude Dekstop 等 MCP 宿主中,配置文件应指向 MCProxy,而不是其背后的各个服务。
功能
以下是 MCProxy 可以通过内部功能或外部模块实现的一些示例。
日志记录
MCProxy 可以记录 MCP 客户端与 MCP 服务之间往返的所有消息。
配置:
- 要记录的内容
- 记录位置
能力聚合
MCProxy 可以将不同 MCP 服务的能力聚合成一个有意义的整体。
能力屏蔽
MCProxy 可以只公开其所连接的 MCP 服务提供的部分能力。
配置:
- 要屏蔽的能力
能力消歧
随着 MCP 服务数量迅速增长,我们可能会遇到名称冲突。MCProxy 可以重命名能力,使其对 MCP 客户端而言各不相同,并负责将请求路由到相应的 MCP 服务。
配置:
- 服务/标识符列表 => 新标识符
内容更新
文本内容在经过 MCProxy 时可以进行筛选或补充。
即时国际化(i18n)
当前版本的 MCP 规范不支持 i18n(参见我关于此事的议题)。
MCProxy 可以通过翻译 API 或大模型即时翻译某些字段。
配置:
- 首选语言
- 翻译工具的连接参数
外部模块
它们在 MCProxy 自身提供的基本功能之上提供额外功能。
它们是可接入 MCProxy 的独立项目。
可以维护此类模块列表,就像目前正在建立 MCP 客户端 / 服务列表一样(例如参见此处、此处或此处)。
托管
它们可以作为服务在本地或远程托管。
功能
它们声明自己的“功能”,即它们感兴趣的 MCP 消息类型。
它们按照在配置文件中声明的顺序被调用。
协议
MCProxy 与外部模块之间的协议深受 MCP 规范的启发。
但工作流大不相同:响应通常与发送的消息类型相同。
例如:
- 发送给模块的
GetPromptRequest消息会返回一条更新后的GetPromptRequest消息 - 发送给模块的
ListToolsResult消息会返回一条更新后的ListToolsResult消息
(待定:此类协议的规范)
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。