关于 mcp-http-proxy
mcp-http-proxy 是 Node.js 代理,可通过 HTTP 和 SSE 暴露基于 stdio 的 MCP 服务,适合无需自行处理 stdio 或 MCP SDK 通信的 HTTP 客户端。
主要功能
- 01通过 HTTP 端点执行 MCP 操作
- 02转发原始 JSON-RPC 请求
- 03通过 SSE 推送事件和响应
- 04工具发现与网页面板
- 05管理子 MCP 服务进程
适用场景
- 01让 Web 应用连接 stdio MCP 服务
- 02通过 URL 参数调用工具
- 03发送自定义 JSON-RPC 请求
- 04检查事件并调试通信
MCP 相关
它通过 stdio 管理子 MCP 服务,并向 HTTP 客户端开放其工具、资源和 JSON-RPC 操作。SSE 用于传递异步响应、日志和事件。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
mcp-http-proxy
适用于使用 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 客户端(curl、Pythonrequests、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_CONFIG)将实际的 MCP 服务作为子进程启动。 - 使用子 MCP 进程的标准输入(
stdin)、标准输出(stdout)和标准错误(stderr)与其通信。 - 将部分 HTTP 请求(例如 URL 参数)转换为发往 MCP 进程的 JSON-RPC 命令。
- 将通过特定 HTTP 端点收到的原始 JSON-RPC 命令转发给 MCP 进程。
- 读取 MCP 进程
stdout/stderr中的响应和事件。 - 将响应发送回 HTTP 客户端。
- 向已连接的 SSE 客户端推送事件和异步响应。
-
MCP 服务(子进程):
- 由代理工作进程启动。
- 监听其
stdin上的 JSON-RPC 命令。 - 执行 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: 代理会向 MCP 进程的
stdin发送经过验证的 JSON-RPC 命令字符串。 - MCP -> 代理:
- MCP 进程会将 JSON-RPC 响应字符串(结果、错误、协议消息)发送到其
stdout。 - MCP 进程会将日志消息或致命错误发送到其
stderr。
- MCP 进程会将 JSON-RPC 响应字符串(结果、错误、协议消息)发送到其
- 用户交互: 用户不会直接通过代理的 stdio 发送命令。所有交互都通过 HTTP 端点进行。
2. 服务器发送事件(SSE)(代理 -> 客户端)- 外部
这是一个外部的、主要为单向的通信通道,允许代理向已连接的 HTTP 客户端实时推送事件。
- 连接: 客户端通过向
/sse端点发送 HTTPGET请求来建立 SSE 连接。代理会保持此连接处于打开状态。 - 推送事件: 当代理从 MCP 进程的
stdout(响应)或stderr(日志/错误)收到数据时,会根据 SSE 协议(data: <json_string>\n\n)格式化这些数据,并通过打开的连接推送给所有当前已连接的 SSE 客户端。 - 发送命令: 客户端无法通过同一 SSE 连接向代理发送命令。要执行命令,SSE 客户端必须单独发送标准 HTTP 请求(例如,向
/rpc/raw/command发送POST请求,或向/tool/:toolName发送GET请求)。该命令的结果通常会通过客户端正在监听的/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 命令。
- 要求在
POST请求正文中提供完整的 JSON-RPC 2.0 请求对象,并设置Content-Type: application/json。 - 代理会根据基本 RPC 架构验证传入请求正文的结构。
- 它会将经过验证的原始命令直接转发到 MCP 进程的
stdin。 - 在 HTTP 响应正文中以 JSON 格式直接返回从 MCP 进程的
stdout收到的原始 JSON-RPC 响应。这是以编程方式交互的主要端点,适用于自行构造完整 RPC 调用的场景。
-
GET /sse- 建立服务器发送事件流。客户端在此连接,以接收服务器推送的实时事件(MCP 响应、日志)。
-
GET /sse-client- 提供一个简单的 HTML 页面,用于连接
/sse端点并显示收到的事件。适用于调试 SSE 流。
- 提供一个简单的 HTML 页面,用于连接
-
GET /help- 显示一个 HTML 页面,提供可用工具的文档以及如何使用
/tool/:toolName端点的说明。
- 显示一个 HTML 页面,提供可用工具的文档以及如何使用
-
调试端点:
GET /rpc/command:显示一个 HTML 界面,可通过网页表单手动构造和发送 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-manager.js,则会提供/mcp/install、/mcp/start、/mcp/stop、/mcp/list等端点,用于动态管理不同的 MCP 服务安装。
- 如果使用
发送命令(示例)
使用 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 查询字符串中提供参数。
curl:
# Assuming a tool 'worker_get' exists that takes a 'name' parameter
curl "http://localhost:3005/tool/worker_get?name=my-worker"
错误处理
代理会尽量妥善处理错误:
- HTTP 错误: 返回标准 HTTP 状态码(例如,工具或端点未知时返回 404,
/tool/:toolName的参数无效时返回 400)。 - 参数验证:
/tool/:toolName端点会在发送命令前,根据工具的架构验证查询参数。错误会在 HTML 响应中返回。/rpc/raw/command端点会执行基本的 JSON-RPC 结构验证。 - MCP 错误: 底层 MCP 进程返回的错误(例如,工具执行失败)会从其
stdout(作为 JSON-RPC 错误响应)或stderr中捕获,并通过直接 HTTP 响应(对于/rpc/raw/command)或 HTML 页面(对于/tool/:toolName)转发给客户端,也可能通过 SSE 推送。
清理
脚本会为 exit 和 SIGINT(Ctrl+C)注册处理程序。退出时,脚本会尝试:
- 终止子 MCP 进程(
MCPWorker.mcpProcess.kill())。 - 关闭所有活动的 SSE 客户端连接。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。