tmcproxy
tmcproxy
Proxy mínimo de compatibilidad stdio MCP que puentea el Túnel Seguro MCP de OpenAI / conectores ChatGPT a servidores MCP stdio heredados.
El problema que resuelve
Los conectores ChatGPT (a través del Túnel Seguro MCP de OpenAI) sondean servidores MCP stdio con server/discover — un método introducido en MCP 2026-07-28. Los servidores heredados como codex mcp-server y local-mcp mcp solo hablan 2025-06-18 y devuelven method not found para server/discover, lo que provoca que la creación del conector falle.
tmcproxy se sitúa en medio, responde server/discover en nombre del servidor aguas abajo y reenvía cualquier otra solicitud sin cambios.
ChatGPT → tunnel-client → tmcproxy → codex mcp-server (or local-mcp mcp)
↑
answers server/discover here,
forwards everything else straight throughRelated MCP server: MCP SSE Proxy
Requisitos
Node.js >= 23.6.0 (para la ejecución nativa en modo strip de TypeScript — no se necesita paso de compilación)
Uso
Independiente
node src/tmcproxy.ts -- codex mcp-server
node src/tmcproxy.ts -- local-mcp mcpO mediante variable de entorno:
TMCPROXY_DOWNSTREAM="codex mcp-server" node src/tmcproxy.tsCon tunnel-client
Edita tu perfil YAML de tunnel-client (ej. ~/.config/tunnel-client/<profile>.yaml):
mcp:
commands:
- channel: main
command: "node /path/to/tmcproxy/src/tmcproxy.ts -- codex mcp-server"Luego:
tunnel-client run --profile <profile>Cambiar de servidor aguas abajo es solo modificar el comando después de --:
command: "node /path/to/tmcproxy/src/tmcproxy.ts -- local-mcp mcp"Cómo funciona
Solicitud | Comportamiento |
| El proxy responde con un |
| Se reenvía sin cambios al servidor aguas abajo. El proxy nunca llama a |
| Se reenvían sin cambios con el id JSON-RPC preservado. |
Notificaciones (sin id) | Se reenvían; no se espera respuesta. |
JSON malformado | Se devuelve |
Método desconocido | Se reenvía; el error del servidor aguas abajo fluye de vuelta. |
Por qué supportedVersions incluye 2026-07-28
ChatGPT sondea con 2026-07-28. Si la respuesta solo lista 2025-06-18, ChatGPT lo trata como "versión solicitada no soportada" y reintenta indefinidamente — nunca llegando a initialize o tools/list. Al listar 2026-07-28, ChatGPT entra en modo moderno y envía solicitudes sin estado (tools/list, tools/call) directamente. El servidor aguas abajo heredado responde a estas sin un initialize previo (confirmado tanto para codex mcp-server como para local-mcp mcp), por lo que el reenvío transparente funciona.
Depuración
Registro de depuración
Establece TMCPROXY_DEBUG=1 para registrar las solicitudes y respuestas de server/discover en stderr:
TMCPROXY_DEBUG=1 tunnel-client run --profile local-codexSalida en stderr (stdout se mantiene limpio — es el canal 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"],...}Prueba local de extremo a extremo (no se necesita clave API)
tunnel-client dev proxy ejecuta un plano de control en memoria local que reproduce el mismo flujo de sondeo MCP que usa ChatGPT:
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"}}}'Comparación de referencia
Para confirmar que el proxy es necesario, ejecuta el servidor aguas abajo directamente a través de dev proxy y observa el fallo de 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 foundPruebas
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 typecheckLas pruebas unitarias utilizan un servidor aguas abajo simulado (test/fixtures/mock-downstream.js) y cubren: forma de la respuesta discover, sondeo de capacidades, reenvío de initialize, tools/list, preservación de id en tools/call, ping, métodos desconocidos, JSON malformado, notificaciones, duplicación de stderr, manejo de salida del servidor aguas abajo y detección de fugas en stdout.
Las pruebas de integración ejecutan los binarios reales de codex mcp-server y local-mcp mcp si están disponibles en PATH.
Seguridad
Los diagnósticos van solo a stderr; stdout está reservado para tráfico MCP.
No se registran credenciales, claves API ni secretos.
El servidor aguas abajo se inicia mediante argv (sin shell).
Solo
server/discoveres manejado por el proxy; todas las demás solicitudes pasan sin cambios.El proxy no expande los permisos del servidor aguas abajo.
Licencia
Apache-2.0
This server cannot be deployed
Maintenance
Related MCP Connectors
- QuallaaOAuthcom.quallaa
Talk to your public-facing AI from any MCP client — Claude, ChatGPT, Cursor, Cline, Windsurf.
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
MCP server for OpenAI API (chat completions, image generation, embeddings) via AceDataCloud
Enable secure connectivity between Sentry issues and debugging data, and LLM clients, using a Model Context Protocol (MCP) server.
Related MCP Servers
- AlicenseBqualityFmaintenanceA 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.412MIT
- FlicenseNot gradedqualityNot gradedmaintenanceBridges 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-
- FlicenseNot gradedqualityDmaintenanceEnables LLMs to use llama.cpp models via MCP protocol by bridging MCP requests to an OpenAI-compatible API.-
- AlicenseAqualityAmaintenanceMCP (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.6660AGPL 3.0