Skip to main content
Glama

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 through

Related 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 mcp

O mediante variable de entorno:

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

Con 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

server/discover

El proxy responde con un DiscoverResult con forma de especificación. Las capacidades se sondean desde el servidor aguas abajo mediante tools/list (no se adivinan).

initialize

Se reenvía sin cambios al servidor aguas abajo. El proxy nunca llama a initialize por sí mismo — codex mcp-server lo permite exactamente una vez, por lo que el handshake del cliente debe ser el que llegue.

tools/list, tools/call, ping, etc.

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 -32700 Parse error al servidor aguas arriba, no se reenvía.

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-codex

Salida 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 found

Pruebas

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

Las 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/discover es 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

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