返回市场
代理服务器

代理服务器

作者:LaurentAjdnik2 星标更新:2024-12-09

项目介绍

前言

这非常实验性,可能完全没用 😁。加入这个讨论,提供反馈,这将非常受欢迎。

注意:这可能会与这个相矛盾:“跨服务器交互由主机控制”。或者不会……

概述

该项目与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

内部架构

基本组件包括:

  • 服务器管理器,处理与MCP客户端的通信(请求、响应、错误、通知)
  • 客户端管理器,维护已连接MCP服务器的列表,并处理与它们的通信(请求、响应、错误、通知)

内部功能组件提供了一组始终可用的基本功能。

模块管理器维护外部模块的列表,这些模块提供额外的功能,并与它们进行交互。

核心组件是调度器,它:

  • 在MCP客户端和MCP服务器之间转发消息,来回传递
  • 应用内部功能,当适用时
  • 调用外部模块,当适用时
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时被过滤或丰富。

实时国际化(i18n)

当前版本的MCP规范不提供i18n(参见我关于此问题的议题)。

MCProxy可以实时翻译某些字段,使用翻译API或LLM。

配置:

  • 喜好的语言
  • 连接到翻译工具的连接参数

外部模块

它们在MCProxy自身提供的基本功能之上提供了额外的功能。

它们是独立项目,可以插入到MCProxy中。

可以维护这样模块的列表,就像目前正在建立的MCP客户端/服务器列表一样(例如参见这里这里这里)。

托管

它们可以本地托管或作为服务远程托管。

能力

它们声明自己的“能力”,即它们感兴趣的MCP消息类型。

它们按照配置文件中声明的顺序被调用。

协议

MCProxy和外部模块之间的协议强烈借鉴了MCP规范。

但工作流程有所不同:通常,响应的消息类型与发送的消息类型相同。

例如:

  • 发送到模块的GetPromptRequest消息会返回更新后的GetPromptRequest消息
  • 发送到模块的ListToolsResult消息会返回更新后的ListToolsResult消息

(待定:此类协议的规范)