Skip to main content
Glama

tmcproxy

Минимальный прокси-совместимости MCP stdio, который соединяет OpenAI Secure MCP Tunnel / ChatGPT коннекторы с устаревшими stdio MCP серверами.

Решаемая проблема

ChatGPT коннекторы (через OpenAI Secure MCP Tunnel) проверяют stdio MCP серверы с помощью server/discover — метода, введённого в MCP 2026-07-28. Устаревшие серверы, такие как codex mcp-server и local-mcp mcp, поддерживают только 2025-06-18 и возвращают method not found для server/discover, что приводит к сбою создания коннектора.

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 в режиме strip — этап сборки не требуется)

Использование

Автономно

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

Отредактируйте YAML профиль tunnel-client (например, ~/.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 запускает локальный in-memory control plane, который воспроизводит тот же MCP probe поток, который использует 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"}}}'

Сравнение для базового уровня

Чтобы убедиться, что прокси необходим, запустите нижестоящий сервер напрямую через 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, сохранение id в tools/call, ping, неизвестные методы, некорректный JSON, уведомления, зеркалирование stderr, обработку завершения нижестоящего сервера и обнаружение утечки stdout.

Интеграционные тесты запускают реальные бинарники codex mcp-server и local-mcp mcp, если они доступны в PATH.

Безопасность

  • Диагностика отправляется только в stderr; stdout зарезервирован для MCP трафика.

  • Никакие учётные данные, API-ключи или секреты не записываются.

  • Нижестоящий сервер запускается через argv (без оболочки).

  • Только 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