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

A
license - permissive license
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

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

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/mkusaka/tmcproxy'

If you have feedback or need assistance with the MCP directory API, please join our Discord server