MCP HTTP代理服务

一个用于Model Context Protocol (MCP)应用的HTTP/SSE代理服务器,通过标准输入输出实现与MCP服务器的通信,提供HTTP端点和实时事件推送功能。

  • by spontaneous-order
  • 本地部署
  • 更新于
在 GitHub 查看 spontaneous-order/mcp-http-proxy

使用说明

mcp-http代理

使用stdio的模型上下文协议(MCP)应用程序的HTTP/SSE代理服务器。通过HTTP支持原始JSON-RPC命令,并在没有MCP SDK的情况下实现直接的stdio通信。

MCP RPC代理工作器

概述

这个Node.js脚本(rpc-proxy-worker.js)充当HTTP客户端和底层MCP(模型上下文协议)服务器进程之间的中间代理服务器。它通过以下方式简化了与MCP服务器的交互:

  1. 管理MCP流程: 它生成并管理作为子进程运行的已配置MCP服务器的生命周期。
  2. 提供HTTP端点: 它公开了HTTP端点,允许客户端与MCP服务器的工具和资源进行交互,而无需直接处理MCP协议的stdio通信。
  3. 提供实时活动: 它为客户端提供了一个服务器发送事件(SSE)端点,以接收来自MCP服务器的异步通知和响应。
  4. 提供Web界面: 它包括一个用于查看可用工具的基本web仪表板和用于调试和发送命令的简单界面。

益处

这 mcp-http-proxy 提供了几个优点:

  • 标准Web协议访问: 暴露一个 stdio-基于MCP服务器的标准HTTP(GET/POST)和服务器发送事件(SSE),使其可供web应用程序和各种HTTP客户端访问(curlpython requests,JavaScript fetch等等)。
  • 解耦和集中: 充当稳定的中介,允许多个客户端与单个托管MCP流程实例交互,而无需自己处理流程管理。
  • 灵活的客户端交互: 支持多种交互方式:
    • 简化的URL参数(/tool/:toolName): 对于需要简单GET请求的客户来说很容易;代理处理JSON-RPC转换。
    • 原始JSON-RPC(/rpc/raw/command): 通过HTTP POST为客户端构建自己的JSON-RPC命令提供完全控制。
  • 实时通信: 使服务器能够通过以下方式将异步响应、日志和事件推送到连接的客户端 /sse 端点,非常适合长时间运行的任务和响应式UI。
  • 简化的客户端依赖关系: 客户端通过标准HTTP进行交互,无需安装或使用特定的MCP SDK或处理 stdio 沟通。
  • 内置自检和调试: 包括基本的web界面(/, /rpc/command, /debug等),用于工具发现、手动测试和观察原始通信流。
  • 直接代理控制: 通过实施 stdio 直接在代理内通信(不依赖于MCP SDK 在代理中),它提供了对代理到MCP交互的细粒度控制,并最大限度地减少了内部依赖。

原理

该系统通过两个主要过程运行:

  1. 代理工作器(此脚本):

    • 作为Node.js进程运行。
    • 启动HTTP服务器(使用Express)以侦听客户端请求。
    • 产卵 实际 基于配置的MCP服务器作为子进程(MCP_CONFIG).
    • 使用其标准输入与子MCP流程进行通信(stdin),标准输出(stdout),以及标准误差(stderr).
    • 处理将一些HTTP请求(如URL参数)转换为MCP进程的JSON-RPC命令。
    • 将通过特定HTTP端点接收到的原始JSON-RPC命令转发给MCP进程。
    • 从MCP流程中读取响应和事件 stdout/stderr.
    • 将响应发送回HTTP客户端。
    • 将事件和异步响应推送到连接的SSE客户端。
  2. MCP服务器(子进程):

    • 由代理工作程序启动。
    • 在其上监听JSON-RPC命令 stdin.
    • 执行MCP操作(如列出/调用工具)。
    • 将JSON-RPC响应和协议消息写入其 stdout.
    • 将日志或错误写入其 stderr.

启动服务器

  1. 先决条件: 请确保您已安装Node.js。
  2. 导航: 打开终端,将目录更改为 rpc-proxy-worker.js 位于。
  3. 运行: 执行以下命令:
    node rpc-proxy-worker.js
    
  4. 输出: 您应该看到指示服务器正在运行的输出,通常包括:
    Web interface running on http://localhost:3005
    SSE endpoint available at http://localhost:3005/sse
    
    默认情况下,服务器在端口3005上侦听。

通信机制

1.Stdio(代理<->MCP流程)- 内部

这就是 内部沟通渠道 在代理工作程序脚本和它管理的子MCP服务器进程之间。

  • 代理->MCP: 代理将经过验证的JSON-RPC命令字符串发送到MCP进程的 stdin.
  • MCP->代理:
    • MCP进程向其发送JSON-RPC响应字符串(结果、错误、协议消息) stdout.
    • MCP进程向其发送日志消息或致命错误 stderr.
  • 用户交互: 用户 不要 直接与 代理人 stdio发送命令。所有交互都是通过HTTP端点进行的。

2.服务器发送事件(SSE)(代理->客户端)- 外部

这是一个 外部,主要是单向通信信道 允许代理实时向连接的HTTP客户端推送事件。

  • 连接: 客户端通过HTTP建立SSE连接 GET 请求 /sse 终点。代理保持此连接打开。
  • 推送事件: 当代理从MCP进程接收数据时 stdout (回复)或 stderr (日志/错误),它根据SSE协议格式化此数据(data: <json_string>\n\n)并将其推下打开的连接 全部 当前连接的SSE客户端。
  • 发送命令: 客户 不能 发送命令 < 返回 通过相同的SSE连接连接到代理。为了执行命令,SSE客户端必须发出单独的标准HTTP请求(例如。, POST 向 /rpc/raw/command 或 GET 向 /tool/:toolName).然后,该命令的结果通常会通过 /sse 它正在收听的流媒体。

与代理交互(HTTP端点)

代理暴露了几个HTTP端点:

  • GET /

    • 显示主HTML仪表板,列出从子进程中发现的可用MCP工具。通过提供表单来执行工具 /tool/:toolName 终点。
  • GET /tools

    • 返回一个JSON数组,其中列出了MCP服务器提供的所有可用工具,包括它们的名称、描述和输入模式。
  • GET /tool/:toolName

    • 执行特定工具。
    • 工具的参数如下 URL查询参数 (例如。, /tool/my_tool?param1=valueA&param2=123).
    • 代理 翻译 将这些URL参数转换为有效的JSON-RPC tools/call 请求对象,根据工具的模式验证它们。
    • 通过stdio将命令发送到MCP进程。
    • 返回一个 HTML页面 显示发送的RPC命令和从MCP进程接收的响应。
  • POST /rpc/raw/command

    • 执行原始JSON-RPC命令。
    • 期待 完整的JSON-RPC 2.0请求对象 在 POST 请求正文 Content-Type: application/json.
    • 代理 验证 针对基本RPC模式的传入请求体的结构。
    • 它 向前 将经过验证的原始命令直接发送到MCP进程 stdin.
    • 返回 原始JSON-RPC响应 从MCP流程中收到 stdout 直接在HTTP响应体中作为JSON。 这是编程交互的主要端点,您可以在这里自己构建完整的RPC调用。
  • GET /sse

    • 建立服务器发送事件流。客户端在此处连接以接收从服务器推送的实时事件(MCP响应、日志)。
  • GET /sse-client

    • 提供一个简单的HTML页面,用于连接 /sse 端点,并显示接收到的事件。可用于调试SSE流。
  • GET /help

    • 显示一个HTML页面,提供可用工具的文档以及如何使用 /tool/:toolName 终点。
  • 调试端点:

    • GET /rpc/command:显示一个HTML界面,用于通过web表单手动构造和发送RPC命令(使用 /rpc/raw/command 内部)。
    • GET /rpc/raw:显示代理和MCP进程之间交换的原始消息的JSON历史记录。
    • POST /rpc/raw/clear:清除原始消息历史记录。
    • GET /debug:显示更全面的HTML调试界面,显示RPC、进程和SSE事件。
    • GET /debug/logs:以JSON格式返回当前调试日志。
    • GET /debug/sse:SSE流专门用于调试日志事件。
  • (可选)MCP管理端点: (/mcp/*)

    • 端点如 /mcp/install, /mcp/start, /mcp/stop, /mcp/list 用于动态管理不同的MCP服务器安装,如果 mcp-manager.js 使用。

发送命令(示例)

使用 POST /rpc/raw/command (建议用于程序化使用)

在正文中发送完整的JSON-RPC请求。

curl(Bash/zsh/WSL):

curl -X POST -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","method":"tools/list","id":1}' \
  http://localhost:3005/rpc/raw/command

curl(Windows cmd-请小心引用):

curl -X POST -H "Content-Type: application/json" -d "{\"jsonrpc\":\"2.0\",\"method\":\"tools/list\",\"id\":1}" http://localhost:3005/rpc/raw/command

PowerShell:

$rpcBody = @{
    jsonrpc = "2.0"
    method = "tools/call"
    id = 2
    params = @{
        name = "your_tool_name"
        arguments = @{
            param1 = "value1"
            count = 10
        }
    }
} | ConvertTo-Json -Depth 5

Invoke-RestMethod -Uri http://localhost:3005/rpc/raw/command -Method Post -ContentType 'application/json' -Body $rpcBody

使用 GET /tool/:toolName (方便简单的GET请求)

在URL查询字符串中提供参数。

卷曲:

# Assuming a tool 'worker_get' exists that takes a 'name' parameter
curl "http://localhost:3005/tool/worker_get?name=my-worker"

错误处理

代理试图优雅地处理错误:

  • HTTP错误: 返回标准HTTP状态代码(例如,404表示未知工具/端点,400表示上的无效参数 /tool/:toolName).
  • 参数验证: 这 /tool/:toolName 端点在发送命令之前根据工具的模式验证查询参数。HTML响应中返回错误。这 /rpc/raw/command 端点执行基本的JSON-RPC结构验证。
  • MCP错误: 底层MCP流程返回的错误(例如,工具执行失败)从其 stdout (作为JSON-RPC错误响应)或 stderr 并在直接HTTP响应中中继回客户端(用于 /rpc/raw/command)或在HTML页面内(用于 /tool/:toolName),并可能通过苏格兰和南方能源公司推动。

清理

该脚本为以下对象注册处理程序 exit 和 SIGINT (Ctrl+C)。退出时,它试图:

  1. 杀死子MCP进程(MCPWorker.mcpProcess.kill()).
  2. 关闭所有活动的SSE客户端连接。