Skip to main content
Glama

@reachpad/mcp

reachpad позволяет Claude, Codex и другим агентам кодинга создавать полнофункциональные приложения в постоянных рабочих пространствах и делиться ими по ссылке, без отдельного развертывания. Рабочее пространство — это облачный компьютер разработки, которым агент управляет сам: репозиторий, файловая система, установленные зависимости и состояние сборки, которые сохраняются между вызовами, а не эфемерная песочница, которая всё забывает. Исключение — процессы; см. ниже.

Это MCP-сервер. Он позволяет Claude, ChatGPT, Cursor, OpenCode или вашему собственному агенту создать среду, выполнять в ней команды, форкать её и возвращаться к ней позже, без необходимости держать ноутбук открытым для разработчика.

  • Он сохраняет состояние. Приостановите его — и диск запечатывается; следующий вызов загружается из этого слепка с файлами, установками и состоянием git, а не пересобирается. Исключение — процессы: запуск всегда означает холодную загрузку.

  • Он форкается. Двадцать попыток из одного подготовленного состояния стоят по дельте каждая, а не двадцать пересборок — потому что среда — это цепочка снапшотов, а не машина.

  • Он может не допускать секреты наружу из коробки. Брокеризованный credential вызывается на границе от вашего имени, и его значение никогда не попадает в среду, лог или хранилище. Credential, записанный в среду, наоборот, читается там — это задумано.

  • Он не зависит от агента. REST API является каноническим; этот сервер, SDK и CLI — его реализации. Принесите своего агента.

API — это граница продукта, а не веб-интерфейс: reachpad.dev.

Установка

npx -y @reachpad/mcp          # stdio, for a local client

В Claude Code:

claude mcp add reachpad -e REACHPAD_IDENTITY_CREDENTIAL=… -- npx -y @reachpad/mcp

Related MCP server: Nolane Habitat

Два транспорта, одна реализация

npx @reachpad/mcp                                  # stdio
REACHPAD_MCP_HTTP_PORT=8722 npx @reachpad/mcp      # streamable http

stdio — это то, с чем общается локальный клиент; Streamable HTTP — то, с чем общается удалённый коннектор. Те же инструменты, то же поведение — добавлено, а не разветвлено, потому что две реализации одной поверхности — это путь к расхождению.

HTTP-сторона отвечает 405 на GET: каждый инструмент здесь — запрос/ответ, и спецификация позволяет отклонять поток, инициированный сервером, а не держать соединение открытым для трафика, который никогда не придёт. Сессий нет — ничего не хранится между вызовами, что нельзя было бы пересоздать при перезапуске. И он не несёт собственных учётных данных: то, что авторизует HTTP-запрос, авторизует и reachpad.

Конфигурация

переменная

значение

REACHPAD_ENDPOINT

ваш хост reachpad. Обычный http:// к чему-либо, кроме loopback, отклоняется до открытия сокета.

REACHPAD_IDENTITY_CREDENTIAL

ваш персональный credential. Он называет одну учётную запись и не может действовать от имени другой — сервер берёт идентичность из собственной записи credential, а не из запроса.

REACHPAD_API_KEY

необязательный, ограниченный средой и отзываемый. Если задан, run_command использует его и не требует обмена идентичностью.

REACHPAD_MCP_HTTP_PORT

обслуживать HTTP вместо stdio.

REACHPAD_MCP_HTTP_HOST

по умолчанию 127.0.0.1. Этот процесс соединяется с control plane, используя ваши учётные данные, поэтому привязка его к миру — это осознанное решение, за прокси, который завершает TLS.

REACHPAD_MCP_HTTP_TOKEN

bearer-токен, сравнивается за постоянное время. Если отсутствует, любой вызывающий, который может достичь порта, авторизован, и сервер сообщает об этом в stderr.

REACHPAD_MCP_ALLOWED_ORIGINS

разделённый запятыми список. Запрос с Origin, отсутствующим в списке, отклоняется — браузер не может подделать его, что закрывает DNS rebinding. Отсутствие Origin — это не-браузерный клиент, и он допускается.

Если задано несколько учётных данных, побеждает самый узкий, и отказанный credential никогда не повторяется с более широким — откат был бы эскалацией привилегий, которую никто не выбирал.

Инструменты

инструмент

что делает

get_credit_balance()

оставшиеся вычислительные кредиты. Один кредит запускает одну стандартную среду на одну минуту.

create_environment(repo?, ref?, name?)

новая среда, опционально с репозиторием, клонированным в $HOME/work. Reachpad генерирует отображаемое имя, если оно опущено.

list_environments()

ваши среды и сколько форков у каждой

get_environment(environment)

с чего она загружается: её головной снапшот, позиция лога и дерево форков

run_command(environment, argv, cwd?, env?, timeout_ms?)

одна команда, её код выхода и вывод. Приостановленная среда возобновляется для её выполнения.

checkpoint_environment(environment, name?)

форк от последнего запечатанного снапшота; оригинал не затрагивается

expose_port(environment, port, check?)

открыть порт в веб и получить ссылку, которая до него достаёт. Идемпотентно для каждого порта.

list_ports(environment)

порты, открытые в этой среде, от старых к новым, с их ссылками

revoke_port(environment, port)

закрыть один порт. Повторное открытие позже создаёт другую ссылку.

delete_environment(environment)

архивировать её и освободить слот плана. Ничего не удаляется — снапшоты и история сохраняются.

Здесь намеренно нет: запуска агента внутри среды. Это в дорожной карте reachpad, но ещё не в парке — инструмент, который всегда падает, стоит модели хода и учит её не доверять остальным, поэтому этот сервер не рекламирует то, что не может выполнить.

Что такое ссылка на порт и чем она не является

Стоит прочитать, прежде чем передавать её кому-то, потому что ничего из этого не видно из URL:

  • Любой, кто вошёл в Reachpad и имеет ссылку, может открыть её. Это не приватный URL и не защищённый. Относитесь к ней как к превью-развёртыванию.

  • Ссылка — это адрес, а не копия. Перезапустите приложение на том же порту — и та же ссылка будет обслуживать новую версию.

  • Запущенный процесс не переживает паузу. Среда холодно загружается с файлами, но без запущенных процессов, поэтому после паузы ссылка отвечает ошибкой, пока на этом порту снова не появится слушатель. Запрос посетителя пробуждает приостановленную среду; он не перезапускает ничего внутри неё.

  • expose_port после этого проверяет порт и сообщает, если никто не ответил, потому что ссылка на порт, который ничего не обслуживает, выглядит точно так же, как рабочая ссылка. Передайте check: false, чтобы пропустить проверку — проверка возобновляет приостановленную среду.

  • Только с REACHPAD_API_KEY ключ должен быть --role owner. Ключ collaborator отклоняется: список выдаёт живые токены, а токен — это возможность.

Правила, по которым он построен

Вот как наивный клиент потокового exec API вводит модель в заблуждение, и что этот сервер делает вместо этого.

  • Незавершённый поток — это UNKNOWN, никогда не успех. Если ответ заканчивается без терминального события, инструмент говорит об этом именно этими словами. Это не нулевой код выхода, и агент не должен повторять неидемпотентную команду на этом основании.

  • Его дедлайн мягче, чем у сервера, поэтому ответ сервера всегда выигрывает гонку. Клиент, который сдаётся первым, превращает «ваша сборка завершена» в «неизвестно», и числа зеркалируются с сервера, а не угадываются.

  • Отказы несут remedies, а не коды. При достижении лимита плана вы получаете лимит, текущее количество и что делать — числа приходят с сервера, потому что лимит, захардкоженный в клиенте, — это ложь, как только ваш план меняется.

  • Результаты — это дескрипторы, а не полезные нагрузки. Вывод обрезается с указанием количества отброшенных байт. Логи сборки могут быть мегабайтами, и результат MCP такого размера уничтожает контекстное окно вызывающего.

  • Отказ — это результат, а не ошибка транспорта, чтобы модель могла прочитать его и действовать. Только неизвестный инструмент — это ошибка протокола.

Тест

node --test 'test/*.test.mjs'

Без сети и без учётных данных. Набор протокольных тестов запускает поставляемый сервер как дочерний процесс и общается с ним по реальному JSON-RPC через его stdio, используя заглушку control plane на реальном сокете, так что ничто под тестом не является внутренним импортом. Один тест выполняет тот же сценарий против реального reachpad и пропускается, если конечная точка не настроена.

Репозиторий

Этот репозиторий — исходный код. Он намеренно отделён от бэкенда reachpad: этот код публичен, он публикуется в npm, и его процесс выпуска владеет правами на публикацию — ничего из этого не должно находиться в том же репозитории, что и control plane. Ничто здесь не может читать исходный код бэкенда, и ни одна задача в бэкенде не копирует файлы сюда.

Две серверные константы зеркалируются в src/client.js — льготный период exec и таймаут exec по умолчанию. Зеркалированная константа обычно гниёт; эта не гниёт, потому что собственный CI бэкенда загружает этот опубликованный пакет и падает, если они расходятся. Проверка находится там, где число могло бы измениться.

Related MCP Connectors

Related MCP Servers

View all related MCP servers

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/Reachpad/reachpad-mcp'

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