Skip to main content
Glama

tmcproxy

Minimaler MCP stdio-Kompatibilitäts-Proxy, der OpenAI Secure MCP Tunnel / ChatGPT-Connectors mit Legacy stdio MCP-Servern verbindet.

Das Problem, das dies löst

ChatGPT-Connectors (über OpenAI Secure MCP Tunnel) testen stdio MCP-Server mit server/discover – eine Methode, die in MCP 2026-07-28 eingeführt wurde. Legacy-Server wie codex mcp-server und local-mcp mcp sprechen nur 2025-06-18 und geben method not found für server/discover zurück, was dazu führt, dass die Connector-Erstellung fehlschlägt.

tmcproxy sitzt dazwischen, beantwortet server/discover im Namen des Downstreams und leitet jede andere Anfrage unverändert weiter.

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

Voraussetzungen

  • Node.js >= 23.6.0 (für native TypeScript-Strip-Mode-Ausführung – kein Build-Schritt erforderlich)

Verwendung

Eigenständig

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

Oder über Umgebungsvariable:

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

Mit tunnel-client

Bearbeiten Sie Ihr tunnel-client-Profil YAML (z.B. ~/.config/tunnel-client/<profile>.yaml):

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

Dann:

tunnel-client run --profile <profile>

Das Wechseln des Downstreams erfolgt einfach durch Ändern des Befehls nach --:

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

Funktionsweise

Anfrage

Verhalten

server/discover

Proxy antwortet mit einem spezifikationskonformen DiscoverResult. Fähigkeiten werden vom Downstream über tools/list abgefragt (nicht erraten).

initialize

Unverändert an Downstream weitergeleitet. Der Proxy ruft niemals selbst initialize auf – codex mcp-server erlaubt es genau einmal, daher muss der Handshake des Clients derjenige sein, der ihn erreicht.

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

Unverändert weitergeleitet, wobei die JSON-RPC-ID erhalten bleibt.

Notifications (no id)

Weitergeleitet; keine Antwort erwartet.

Malformed JSON

-32700 Parse error an Upstream zurückgegeben, nicht weitergeleitet.

Unknown method

Weitergeleitet; Downstream-Fehler fließt zurück.

Warum supportedVersions 2026-07-28 enthält

ChatGPT testet mit 2026-07-28. Wenn die Antwort nur 2025-06-18 auflistet, behandelt ChatGPT dies als „angeforderte Version nicht unterstützt“ und wiederholt unendlich – ohne jemals initialize oder tools/list zu erreichen. Durch die Auflistung von 2026-07-28 wechselt ChatGPT in den modernen Modus und sendet zustandslose Anfragen (tools/list, tools/call) direkt. Der Legacy-Downstream beantwortet diese ohne vorheriges initialize (bestätigt für sowohl codex mcp-server als auch local-mcp mcp), sodass die transparente Weiterleitung funktioniert.

Debugging

Debug-Protokoll

Setzen Sie TMCPROXY_DEBUG=1, um server/discover-Anfragen und -Antworten auf stderr zu protokollieren:

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

Ausgabe auf stderr (stdout bleibt sauber – es ist der MCP-Kanal):

[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"],...}

Lokaler End-to-End-Test (kein API-Schlüssel erforderlich)

tunnel-client dev proxy führt eine lokale In-Memory-Control-Plane aus, die denselben MCP-Probe-Flow reproduziert, den ChatGPT verwendet:

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"}}}'

Basislinienvergleich

Um zu bestätigen, dass der Proxy benötigt wird, führen Sie den Downstream direkt über dev proxy aus und beobachten Sie den server/discover-Fehler:

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

Tests

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

Unit-Tests verwenden einen Mock-Downstream (test/fixtures/mock-downstream.js) und decken ab: Discover-Response-Form, Fähigkeitsabfrage, Initialize-Weiterleitung, tools/list, tools/call-ID-Erhaltung, ping, unbekannte Methoden, fehlerhaftes JSON, Benachrichtigungen, stderr-Spiegelung, Downstream-Exit-Handling und stdout-Leckerkennung.

Integrationstests starten die echten codex mcp-server- und local-mcp mcp-Binärdateien, falls sie im PATH verfügbar sind.

Sicherheit

  • Diagnosen gehen nur an stderr; stdout ist für MCP-Verkehr reserviert.

  • Es werden keine Anmeldeinformationen, API-Schlüssel oder Geheimnisse protokolliert.

  • Downstream wird über argv gestartet (keine Shell).

  • Nur server/discover wird vom Proxy behandelt; alle anderen Anfragen werden unverändert durchgereicht.

  • Der Proxy erweitert nicht die Berechtigungen des Downstreams.

Lizenz

Apache-2.0

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