使用说明
mcp-http代理
使用stdio的模型上下文协议(MCP)应用程序的HTTP/SSE代理服务器。通过HTTP支持原始JSON-RPC命令,并在没有MCP SDK的情况下实现直接的stdio通信。
MCP RPC代理工作器
概述
这个Node.js脚本(rpc-proxy-worker.js)充当HTTP客户端和底层MCP(模型上下文协议)服务器进程之间的中间代理服务器。它通过以下方式简化了与MCP服务器的交互:
- 管理MCP流程: 它生成并管理作为子进程运行的已配置MCP服务器的生命周期。
- 提供HTTP端点: 它公开了HTTP端点,允许客户端与MCP服务器的工具和资源进行交互,而无需直接处理MCP协议的stdio通信。
- 提供实时活动: 它为客户端提供了一个服务器发送事件(SSE)端点,以接收来自MCP服务器的异步通知和响应。
- 提供Web界面: 它包括一个用于查看可用工具的基本web仪表板和用于调试和发送命令的简单界面。
益处
这 mcp-http-proxy 提供了几个优点:
- 标准Web协议访问: 暴露一个
stdio-基于MCP服务器的标准HTTP(GET/POST)和服务器发送事件(SSE),使其可供web应用程序和各种HTTP客户端访问(curlpythonrequests,JavaScriptfetch等等)。 - 解耦和集中: 充当稳定的中介,允许多个客户端与单个托管MCP流程实例交互,而无需自己处理流程管理。
- 灵活的客户端交互: 支持多种交互方式:
- 简化的URL参数(
/tool/:toolName): 对于需要简单GET请求的客户来说很容易;代理处理JSON-RPC转换。 - 原始JSON-RPC(
/rpc/raw/command): 通过HTTP POST为客户端构建自己的JSON-RPC命令提供完全控制。
- 简化的URL参数(
- 实时通信: 使服务器能够通过以下方式将异步响应、日志和事件推送到连接的客户端
/sse端点,非常适合长时间运行的任务和响应式UI。 - 简化的客户端依赖关系: 客户端通过标准HTTP进行交互,无需安装或使用特定的MCP SDK或处理
stdio沟通。 - 内置自检和调试: 包括基本的web界面(
/,/rpc/command,/debug等),用于工具发现、手动测试和观察原始通信流。 - 直接代理控制: 通过实施
stdio直接在代理内通信(不依赖于MCP SDK 在代理中),它提供了对代理到MCP交互的细粒度控制,并最大限度地减少了内部依赖。
原理
该系统通过两个主要过程运行:
-
代理工作器(此脚本):
- 作为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客户端。
-
MCP服务器(子进程):
- 由代理工作程序启动。
- 在其上监听JSON-RPC命令
stdin. - 执行MCP操作(如列出/调用工具)。
- 将JSON-RPC响应和协议消息写入其
stdout. - 将日志或错误写入其
stderr.
启动服务器
- 先决条件: 请确保您已安装Node.js。
- 导航: 打开终端,将目录更改为
rpc-proxy-worker.js位于。 - 运行: 执行以下命令:
node rpc-proxy-worker.js - 输出: 您应该看到指示服务器正在运行的输出,通常包括:默认情况下,服务器在端口3005上侦听。
Web interface running on http://localhost:3005 SSE endpoint available at http://localhost:3005/sse
通信机制
1.Stdio(代理<->MCP流程)- 内部
这就是 内部沟通渠道 在代理工作程序脚本和它管理的子MCP服务器进程之间。
- 代理->MCP: 代理将经过验证的JSON-RPC命令字符串发送到MCP进程的
stdin. - MCP->代理:
- MCP进程向其发送JSON-RPC响应字符串(结果、错误、协议消息)
stdout. - MCP进程向其发送日志消息或致命错误
stderr.
- MCP进程向其发送JSON-RPC响应字符串(结果、错误、协议消息)
- 用户交互: 用户 不要 直接与 代理人 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终点。
- 显示主HTML仪表板,列出从子进程中发现的可用MCP工具。通过提供表单来执行工具
-
GET /tools- 返回一个JSON数组,其中列出了MCP服务器提供的所有可用工具,包括它们的名称、描述和输入模式。
-
GET /tool/:toolName- 执行特定工具。
- 工具的参数如下 URL查询参数 (例如。,
/tool/my_tool?param1=valueA¶m2=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流。
- 提供一个简单的HTML页面,用于连接
-
GET /help- 显示一个HTML页面,提供可用工具的文档以及如何使用
/tool/:toolName终点。
- 显示一个HTML页面,提供可用工具的文档以及如何使用
-
调试端点:
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)。退出时,它试图:
- 杀死子MCP进程(
MCPWorker.mcpProcess.kill()). - 关闭所有活动的SSE客户端连接。
