使用说明

项目简介

MCP网关是一个反向代理服务器,旨在为MCP客户端提供一个统一的入口来访问和管理多个后端的MCP服务器。通过该网关,客户端无需直接与每个MCP服务器交互,而是通过网关进行统一的请求转发和响应处理,从而简化了客户端的配置和管理,并支持对多个MCP服务器的集中监控和操作。

主要功能点

  • 多MCP服务器部署与管理:支持通过API动态部署和管理多个MCP服务器实例,可以方便地添加、移除或重启后端MCP服务器。
  • 统一入口:客户端通过单一网关地址即可访问所有后端MCP服务器,降低了客户端集成的复杂性。
  • 请求转发:网关接收客户端请求后,根据请求路径或消息内容,智能地将请求转发到相应的后端MCP服务器进行处理。
  • SSE流聚合:网关可以聚合来自所有后端MCP服务器的SSE(Server-Sent Events)流,为客户端提供实时的、统一的事件订阅服务。
  • 工具列表聚合:支持获取所有后端MCP服务器的工具列表,方便客户端了解所有可用功能。
  • 会话管理:网关支持全局会话管理,可以为客户端提供跨多个后端MCP服务器的会话上下文。

安装步骤

  1. 构建Docker镜像

    在仓库根目录下,使用Docker命令构建镜像:

    docker build -t mcp-gateway .
  2. 运行Docker容器

    使用以下命令运行构建好的Docker镜像,将容器的8080端口映射到宿主机的8080端口:

    docker run -d --name mcp-gateway -p 8080:8080 mcp-gateway

    成功运行后,MCP网关服务器将在 'http://localhost:8080' 启动。

服务器配置

MCP网关本身并不直接提供资源、工具或Prompt模板,而是作为代理管理后端的MCP服务器。因此,配置主要用于告知网关需要管理哪些MCP服务器。

通过向网关的 '/deploy' 接口发送POST请求,可以部署和配置需要管理的MCP服务器。请求体为JSON格式,示例如下:

{
    "mcpServers": {
        "time": {  //  server name,客户端使用时需要用到
            "command": "uvx",  // MCP 服务器的启动命令,例如 "uvx" 或 "npx"。 需要确保环境中已安装 uvx 或 npx
            "args": ["mcp-server-time", "--local-timezone=America/New_York"]  // 启动命令的参数,根据 MCP 服务器实际情况配置
        },
        "weather": { // server name,客户端使用时需要用到
            "url": "http://mcp-server-weather:8080"  // 已运行的 MCP 服务器的 URL,如果 MCP 服务器已独立运行,可以使用 URL 方式接入
        }
    }
}

配置参数说明:

  • 'mcpServers': 一个JSON对象,包含了需要部署和管理的MCP服务器的配置信息。
    • 'server name': MCP服务器的名称,例如示例中的 "time" 和 "weather"。客户端在调用网关API时需要使用此名称来指定目标MCP服务器。
      • 'url': (可选)已运行的MCP服务器的URL地址。如果MCP服务器已经独立运行,可以直接配置URL让网关代理请求。'url' 和 'command' 必须二选一。
      • 'command': (可选)MCP服务器的启动命令。网关可以通过命令启动并管理MCP服务器进程。'command' 和 'url' 必须二选一。
      • 'args': (可选)启动命令的参数,以字符串数组形式提供。根据MCP服务器的需要配置启动参数。
      • 'env': (可选)环境变量,以JSON对象形式提供。可以为MCP服务器设置需要的环境变量。

配置方式:

客户端需要构造上述JSON格式的配置信息,并通过HTTP POST请求发送到 'http://localhost:8080/deploy' 接口。Content-Type设置为 'application/json'。

基本使用方法

  1. 部署MCP服务器

    按照 服务器配置 章节的说明,通过POST请求 '/deploy' 接口部署和配置需要管理的MCP服务器。

  2. 直接访问MCP服务器 (通过网关)

    客户端可以通过以下URL格式直接访问特定的MCP服务器:

    • SSE订阅: 'http://localhost:8080/{mcp-server-name}/sse'
    • 发送消息: 'http://localhost:8080/{mcp-server-name}/message' (POST 请求,消息体为 JSON-RPC 格式)

    例如,要访问名为 "time" 的MCP服务器的SSE流,可以使用URL 'http://localhost:8080/time/sse'。

  3. 通过网关统一访问所有MCP服务器

    客户端也可以通过网关的统一入口访问所有已部署的MCP服务器:

    • 全局SSE订阅: 'http://localhost:8080/sse' (网关会聚合所有后端MCP服务器的SSE流)
    • 全局消息: 'http://localhost:8080/message?sessionId={sessionId}' (POST 请求,消息体为 JSON-RPC 格式,需要 URL 参数 'sessionId',sessionId 通过全局SSE的 'endpoint' 事件获取)

    使用全局消息接口时,需要在JSON-RPC请求的 'method' 字段前加上 '{mcpServerName}-' 前缀,以指定目标MCP服务器。例如,要调用 "time" 服务器的 "get_current_time" 工具,'method' 应设置为 '"time-tools/call"'。

    获取 'sessionId': 当客户端订阅全局SSE流 ('/sse') 时,网关会首先发送一个 'endpoint' 事件,其中包含 '/message?sessionId={sessionId}' 形式的URL。客户端需要保存这个 'sessionId',并在后续调用全局消息接口时作为URL参数传递。

  4. 获取网关下所有工具

    向 '/message' 接口发送 'tools/list' 消息,可以获取所有已部署的MCP服务器的工具列表。

    POST /message HTTP/1.1
    Host: localhost:8080
    Content-Type: application/json
    
    {
        "method": "tools/list",
        "jsonrpc": "2.0",
        "id": 1
    }

    网关会在SSE响应中返回所有工具的列表,工具名称会带有 '{mcpServerName}-' 前缀。

通过以上步骤,客户端可以方便地通过MCP网关管理和访问多个后端的MCP服务器,实现更灵活和可扩展的LLM应用架构。

信息

分类

网页与API