Skip to main content
Glama

tmcproxy

最小化的 MCP stdio 兼容性代理,将 OpenAI Secure MCP Tunnel / ChatGPT 连接器桥接到传统的 stdio MCP 服务器。

解决的问题

ChatGPT 连接器(通过 OpenAI Secure MCP Tunnel)使用 server/discover 探测 stdio MCP 服务器——这是 MCP 2026-07-28 引入的方法。像 codex mcp-server 和 local-mcp mcp 这样的传统服务器只支持 2025-06-18,对于 server/discover 返回 method not found,导致连接器创建失败。

tmcproxy 位于中间,代表下游响应 server/discover,并将所有其他请求原样转发。

ChatGPT → tunnel-client → tmcproxy → codex mcp-server (or local-mcp mcp)
                                ↑
                   answers server/discover here,
                   forwards everything else straight through

Related MCP server: MCP SSE Proxy

要求

  • Node.js >= 23.6.0(用于原生 TypeScript 剥离模式执行——无需构建步骤)

用法

独立运行

node src/tmcproxy.ts -- codex mcp-server
node src/tmcproxy.ts -- local-mcp mcp

或通过环境变量:

TMCPROXY_DOWNSTREAM="codex mcp-server" node src/tmcproxy.ts

与 tunnel-client 配合使用

编辑你的 tunnel-client 配置文件 YAML(例如 ~/.config/tunnel-client/<profile>.yaml):

mcp:
  commands:
    - channel: main
      command: "node /path/to/tmcproxy/src/tmcproxy.ts -- codex mcp-server"

然后:

tunnel-client run --profile <profile>

切换下游只需更改 -- 后面的命令:

      command: "node /path/to/tmcproxy/src/tmcproxy.ts -- local-mcp mcp"

工作原理

请求

行为

server/discover

代理返回一个符合规范的 DiscoverResult。能力通过 tools/list 从下游探测(不是猜测)。

initialize

原样转发给下游。代理从不自行调用 initialize——codex mcp-server 只允许一次,因此客户端的握手必须是到达它的那一次。

tools/list, tools/call, ping 等

原样转发,保留 JSON-RPC id。

通知(无 id)

转发;不期望响应。

格式错误的 JSON

向上游返回 -32700 Parse error,不转发。

未知方法

转发;下游错误会流回。

为什么 supportedVersions 包含 2026-07-28

ChatGPT 使用 2026-07-28 探测。如果响应仅列出 2025-06-18,ChatGPT 会将其视为“请求的版本不受支持”并无限重试——永远不会到达 initialize 或 tools/list。通过列出 2026-07-28,ChatGPT 进入现代模式,直接发送无状态请求(tools/list, tools/call)。传统下游无需事先 initialize 即可回答这些请求(已对 codex mcp-server 和 local-mcp mcp 确认),因此透明转发可以工作。

调试

调试日志

设置 TMCPROXY_DEBUG=1 以将 server/discover 请求和响应记录到 stderr:

TMCPROXY_DEBUG=1 tunnel-client run --profile local-codex

stderr 上的输出(stdout 保持干净——它是 MCP 通道):

[tmcproxy] downstream: ["codex","mcp-server"]
[tmcproxy] discover request: {"jsonrpc":"2.0","id":"openai-mcp-discover",...}
[tmcproxy] discover response: {"resultType":"complete","supportedVersions":["2026-07-28","2025-06-18"],...}

本地端到端测试(无需 API 密钥)

tunnel-client dev proxy 运行一个本地内存控制平面,重现 ChatGPT 使用的相同 MCP 探测流程:

tunnel-client dev proxy \
  --mcp-command "command=node /path/to/tmcproxy/src/tmcproxy.ts -- codex mcp-server,channel=main" \
  --url-file /tmp/url.json \
  --duration 30s

MCP_URL=$(node -e "console.log(JSON.parse(require('fs').readFileSync('/tmp/url.json','utf8')).mcp_url)")
curl -sS -X POST "$MCP_URL" \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2026-07-28' \
  -H 'Mcp-Method: server/discover' \
  -d '{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28"}}}'

基线对比

为了确认代理的必要性,直接通过 dev proxy 运行下游,观察 server/discover 失败:

tunnel-client dev proxy \
  --mcp-command "command=codex mcp-server,channel=main" \
  --url-file /tmp/url.json --duration 30s
# server/discover → -32601 method not found

测试

pnpm install
pnpm test          # unit + integration
pnpm test:unit     # mock downstream only
pnpm test:integration  # real codex / local-mcp (auto-skipped if not installed)
pnpm typecheck

单元测试使用模拟下游(test/fixtures/mock-downstream.js),涵盖:discover 响应形状、能力探测、initialize 转发、tools/list、tools/call id 保留、ping、未知方法、格式错误的 JSON、通知、stderr 镜像、下游退出处理和 stdout 泄漏检测。

集成测试在 PATH 可用时,会生成真实的 codex mcp-server 和 local-mcp mcp 二进制文件。

安全性

  • 诊断信息仅输出到 stderr;stdout 保留给 MCP 流量。

  • 不会记录任何凭据、API 密钥或密钥。

  • 下游通过 argv 生成(无 shell)。

  • 只有 server/discover 由代理处理;所有其他请求保持原样通过。

  • 代理不会扩展下游的权限。

许可证

Apache-2.0

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    F
    maintenance
    A lightweight bridge that wraps OpenAI's built-in tools (like web search and code interpreter) as Model Context Protocol servers, enabling their use with Claude and other MCP-compatible models.
    4
    12
    MIT
  • F
    license
    Not graded
    quality
    Not graded
    maintenance
    Bridges STDIO-based MCP clients with SSE-based MCP servers, allowing applications like Claude Desktop to connect to remote MCP servers that use SSE transport.
    9
    -
  • A
    license
    A
    quality
    A
    maintenance
    MCP (Model Context Protocol) server for rustunnel. Lets AI agents (Claude Code, Cursor, Windsurf) create and manage public tunnels to local services from inside an agent session.
    6
    660
    AGPL 3.0