这非常实验性,可能完全没用 😁。加入这个讨论,提供反馈,这将非常受欢迎。
注意:这可能会与这个相矛盾:“跨服务器交互由主机控制”。或者不会……
该项目与Anthropic的模型上下文协议(MCP,参见文档和规范)相关。
MCProxy是MCP客户端和MCP服务器之间的代理,允许在它们之间的工作流程中添加新功能(下面给出了一些示例)。
MCProxy提供了这种代理架构的基本构建模块,以及一些基本功能(待定:基本功能列表)。
根据用户需求,可以添加新的功能,通过插件模块(待定:插件机制)。
从MCP客户端的角度来看,MCProxy表现得像一个MCP服务器。从MCP服务器的角度来看,MCProxy表现得像一个MCP客户端。
在其最简单的形式下:
flowchart LR
client1[MCP 客户端]
subgraph "MCProxy"
server1[MCP 服务器]
client2[MCP 客户端]
end
server2[MCP 服务器]
client1 <--MCP--> server1
client2 <--MCP--> server2
server1 <--> client2
一个MCProxy可以连接到多个服务器:
flowchart LR
client1[MCP 客户端]
subgraph "MCProxy"
server1[MCP 服务器]
client2[MCP 客户端 A]
client3[MCP 客户端 B]
end
server2[MCP 服务器 A]
server3[MCP 服务器 B]
client1 <--MCP--> server1
client2 <--MCP--> server2
client3 <--MCP--> server3
server1 <--> client2
server1 <--> client3
一个MCP主机可以连接到具有不同配置的不同MCProxies:
flowchart LR
subgraph "主机"
clientH1[MCP 客户端]
clientH2[MCP 客户端]
end
subgraph "MCProxy A"
serverPA[MCP 服务器]
clientPA[MCP 客户端]
end
serverA[MCP 服务器 A]
subgraph "MCProxy B"
serverPB[MCP 服务器]
clientPB[MCP 客户端]
end
serverB[MCP 服务器 B]
clientH1 <--MCP--> serverPA
clientH2 <--MCP--> serverPB
clientPA <--MCP--> serverA
clientPB <--MCP--> serverB
serverPA <--> clientPA
serverPB <--> clientPB
如果需要,MCProxies可以被串联起来:
flowchart LR
client1[MCP 客户端]
subgraph "MCProxy A"
server1[MCP 服务器]
client2[MCP 客户端]
end
subgraph "MCProxy B"
server2[MCP 服务器]
client3[MCP 客户端]
end
server3[MCP 服务器]
client1 <--MCP--> server1
client2 <--MCP--> server2
client3 <--MCP--> server3
server1 <--> client2
server2 <--> client3
基本组件包括:
内部功能组件提供了一组始终可用的基本功能。
模块管理器维护外部模块的列表,这些模块提供额外的功能,并与它们进行交互。
核心组件是调度器,它:
flowchart LR
subgraph MCProxy
subgraph servermanager[服务器管理器]
server[MCP 服务器]
end
dispatcher[调度器]
internalfeatures[内部功能]
modulesmanager[模块管理器]
subgraph clientsmanager[客户端管理器]
direction TB
clientA[MCP 客户端 A]
clientB[MCP 客户端 B]
end
end
moduleA[外部模块 A]
moduleB[外部模块 B]
servermanager <--> dispatcher
dispatcher <--> clientsmanager
dispatcher <--> internalfeatures
dispatcher <--> modulesmanager
modulesmanager <--> moduleA
modulesmanager <--> moduleB
默认情况下,MCProxy暴露其连接的所有MCP服务器的资源/提示/工具,使用相同的标识符(名称、URI等)。这些标识符可以被重命名(参见下方功能)。
为了连接到MCP服务器,MCProxy使用与MCP文档中的快速入门部分定义的相同配置文件格式。
还有一些更深层次的内部配置可用于MCProxy本身。
最后,每个模块都提供了一些配置指令。以下是一些示例。
注意:在像Claude Dekstop这样的MCP主机中,配置文件会指向MCProxy,而不是其背后的各个服务器。
这里有一些MCProxy可以实现的功能示例,无论是内部还是通过外部模块。
MCProxy可以记录MCP客户端和MCP服务器之间来回的所有消息。
配置:
MCProxy可以从不同的MCP服务器聚合能力,形成有意义的包。
MCProxy可以只暴露所连接MCP服务器提供的能力的一个子集。
配置:
随着MCP服务器数量的快速增长,我们可能会遇到一些名称冲突。MCProxy可以重命名能力,使它们对MCP客户端来说显得唯一,并处理路由到适当的MCP服务器。
配置:
文本内容可以在通过MCProxy时被过滤或丰富。
当前版本的MCP规范不提供i18n(参见我关于此问题的议题)。
MCProxy可以实时翻译某些字段,使用翻译API或LLM。
配置:
它们在MCProxy自身提供的基本功能之上提供了额外的功能。
它们是独立项目,可以插入到MCProxy中。
可以维护这样模块的列表,就像目前正在建立的MCP客户端/服务器列表一样(例如参见这里,这里或这里)。
它们可以本地托管或作为服务远程托管。
它们声明自己的“能力”,即它们感兴趣的MCP消息类型。
它们按照配置文件中声明的顺序被调用。
MCProxy和外部模块之间的协议强烈借鉴了MCP规范。
但工作流程有所不同:通常,响应的消息类型与发送的消息类型相同。
例如:
GetPromptRequest消息会返回更新后的GetPromptRequest消息ListToolsResult消息会返回更新后的ListToolsResult消息(待定:此类协议的规范)