Telegram control plane для MCP-подключённых coding agents
@deadragdoll/tellymcp — Telegram control plane для MCP-подключённых coding agents.
Текущая модель — gateway-first:
- один gateway держит Telegram-бота, web app, проекты и live registry консолей
- один или несколько agent-процессов подключаются к этому gateway
- каждая запущенная консоль агента — отдельный routable target
- пользователь работает через gateway-бота, а не через pairing отдельных сессий
- даёт MCP tools для human-in-the-loop через Telegram
- позволяет одной консоли агента ставить задачу другой консоли
- позволяет MCP chat-клиенту получать проектный текст, изображения и артефакты выбранной консоли
- хранит structured xchange records в
.mcp-xchange - поддерживает browser automation через Playwright
- умеет attach к уже открытому Firefox или Chrome через bundled local extensions
- умеет писать structured browser bundles в
.mcp-xchange/web/...с HTML, network и console артефактами - умеет инжектить helper scripts в attached tabs или Playwright pages через
browser_inject_script - отдаёт Telegram Mini App / Live View с gateway
- поддерживает polling и webhook на gateway
- поставляет встроенный Codex plugin со skills под типовые workflow
Схема:
Telegram user
|
Telegram bot + WebApp
|
Gateway
|
+-- Agent console A
+-- Agent console B
+-- Agent console C
Следствия:
- обычный flow больше не использует pairing
/menuв gateway-боте показывает live-консоли напрямую- межсессионная маршрутизация идёт по canonical
session_id = client_uuid:local_session_id - несвязанные задачи читаются через structured xchange records, а не через старые inbox APIs
Для человека:
telegram_messagenotify_telegrambrowser_screenshot(send_to_telegram=true)get_fileдля возврата скриншотов и артефактов в MCP chat-клиент
Для agent-to-agent:
partner_notesend_partner_notesend_partner_filelist_gateway_sessions
Для диагностики:
get_runtime_diagnosticsдля безопасной end-to-end проверки gateway/client
Для браузера:
browser_openbrowser_clickbrowser_fillbrowser_inject_scriptbrowser_pressbrowser_wait_forbrowser_screenshotbrowser_recording_startbrowser_recording_stopbrowser_recording_status
Файлы:
get_file_list(source=..., limit=...)get_file(file_path=..., type="url")get_file(file_path=..., type="image")get_file(file_path=..., type="text")get_file(file_path=..., type="base64")get_file(selector="latest_screenshot")
Синхронизация инструкций:
refresh_tools_markdown.mcpsession.jsonхранит startup identity и последний известный tools hash
- Node.js
>= 24 - Python 3,
makeи C/C++ toolchain на Linux для локальной сборки native addonnode-pty; npm lifecycle scripts должны быть включены - Redis только для режимов gateway и
both; клиент Redis не использует - PostgreSQL для gateway mode
- опционально RabbitMQ для durable gateway fanout
- Playwright browser binaries, если нужны browser tools
На Debian/Ubuntu сначала установи зависимости для сборки native PTY:
sudo apt install -y python3 make g++
npm config set ignore-scripts falsenpm install -g @deadragdoll/tellymcp --foreground-scriptsОпубликованная зависимость node-pty не содержит готового Linux ARM64 binary,
поэтому install lifecycle собирает pty.node локально. Если пакет ранее
установился без него, восстанови глобальную установку:
npm uninstall -g @deadragdoll/tellymcp
npm install -g @deadragdoll/tellymcp@latest --foreground-scripts
tellymcp doctor --env <file>tellymcp --help и setup-команды не загружают native PTY. Runtime проверяет
модуль перед запуском и вместо сырого stack trace выводит те же инструкции по
восстановлению.
Если нужны browser tools:
tellymcp browser installЕсли нужны attach extensions для существующего Firefox/Chrome:
tellymcp extension firefox
tellymcp extension chromeКоманда выгружает готовые unpacked bundles в текущий каталог:
./tellymcp-firefox-attach./tellymcp-chrome-attach
Если используешь Codex:
tellymcp codex-plugin installСоздай workspace и env:
mkdir -p ~/telly-gateway
cd ~/telly-gateway
tellymcp configureКоманда открывает защищённую одноразовым токеном локальную страницу на
127.0.0.1. Выбери в wizard роль Gateway, заполни и проверь настройки, затем
сохрани .env-gateway обычным browser download. Перед использованием выставь
файлу права 0600. tellymcp init gateway остаётся вариантом для ручного
редактирования шаблона.
Публичный origin или API base вводится один раз. Wizard сам формирует gateway HTTP, WebSocket, Mini App, webhook, root-prefix и опциональные OAuth URL. На ключевых этапах доступны реальные проверки Telegram, Redis, PostgreSQL, gateway HTTP/WebSocket и опционального RabbitMQ.
Или возьми sample:
Минимально важные значения:
TELEGRAM_BOT_TOKENREDIS_HOSTDB_HOSTDB_USERDB_PASSWORDDB_NAMEGATEWAY_PUBLIC_URLGATEWAY_WS_URLGATEWAY_SCOPE_TOKENGATEWAY_AUTH_TOKEN
Запуск:
tellymcp run --env .envДля каждой консоли лучше отдельный workspace:
mkdir -p ~/agent-a
cd ~/agent-a
tellymcp configureВыбери в wizard роль Client. В форме есть подключение к gateway, identity
консоли, terminal, browser, MCP и расширенные runtime-настройки. После
валидации браузер скачает .env-client. Флаг --no-open выводит локальный URL
без автоматического открытия браузера.
Для клиента тот же Public base URL автоматически формирует
GATEWAY_PUBLIC_URL, GATEWAY_WS_URL и GATEWAY_WS_PATH.
Или используй sample:
Минимально важные значения:
GATEWAY_PUBLIC_URLGATEWAY_WS_URLGATEWAY_SCOPE_TOKENGATEWAY_AUTH_TOKEN(тот же transport-токен, который задан на gateway)GATEWAY_USER_UUID, если консоль должна быть видна конкретному владельцу в gateway-боте
Рекомендуется:
- по умолчанию используется встроенный PTY terminal runtime
- на первом запуске явно задать
TELLYMCP_SESSION_IDиTELLYMCP_SESSION_LABEL
Первый запуск:
tellymcp run --env .env -s NEWПосле первого запуска .mcpsession.json хранит:
local_session_idsession_labelenv_filegateway_client_uuid
Runtime-состояние клиента локальное и не требует Redis. Сохранённый
gateway_client_uuid обеспечивает стабильную идентичность после перезапуска.
Поэтому дальше в том же каталоге обычно достаточно:
tellymcp runGateway умеет работать через Telegram webhook.
Если nginx уже проксирует весь /api/ на standalone HTTP listener gateway, отдельный location для webhook не обязателен. Route такой:
/api/telegram/webhook
Нужные env:
TELEGRAM_WEBHOOK_ENABLED=true
TELEGRAM_WEBHOOK_PATH=/telegram/webhook
TELEGRAM_WEBHOOK_PUBLIC_URL=https://your-domain.example/api/telegram/webhook
TELEGRAM_WEBHOOK_SECRET=change_me_webhook_secretКогда webhook mode включён:
- gateway вызывает
setWebhook(...)на старте - polling не запускается
- секрет проверяется через
x-telegram-bot-api-secret-token
В client mode локальный MCP endpoint обычно:
http://127.0.0.1:8787/mcp
Helper:
tellymcp mcp --url http://127.0.0.1:8787/mcpДля Codex и похожих агентов используй MCP HTTP endpoint, который поднимает tellymcp run.
Пакет включает локальный Codex plugin со skills для:
- ответов человеку в Telegram
partner_note- browser screenshot задач
- artifact-return flow
Команды:
tellymcp codex-plugin status
tellymcp codex-plugin installInstaller:
- копирует bundled plugin в managed local Codex path
- обновляет personal marketplace manifest
- ставит или обновляет plugin, если найден Codex CLI
Browser tools используют Playwright Chromium.
Предпочтительный путь:
browser_openbrowser_screenshot- дальше либо:
send_to_telegram=trueдля ответа человекуsend_partner_fileдля возврата артефакта другой консоли
Если browser runtime не установлен:
tellymcp browser installНе подменяй browser workflow ad hoc shell-командами с Playwright, кроме случаев, когда ты отлаживаешь сам browser runtime.
Gateway prompt scanner теперь живёт от live-client lifecycle:
- на старте gateway scanner только armed, но не крутится вхолостую
- реальная работа начинается после подключения live client
- relay console materialization идёт из
helloи owner-route hydration, а не из/menu - детект работает по хвосту захваченного terminal buffer
Основная эвристика blocker-а:
- подряд идущие numbered choices:
1.,2.,3. - рядом есть action hints вроде
press,input,choose,enter,esc,yes,no - в Telegram notice попадают и 1-2 строки контекста выше menu block
Когда blocker найден, gateway может отправить inline-кнопки:
1..NEnterEsc
Эти кнопки отправляют в консоль ровно цифру или terminal action. Навигация маркером не используется.
Операционные заметки:
- одинаковый blocker fingerprint не перевысылается повторно
- relay capture miss для offline agent считается debug-only шумом
StorageиScreenshotsна gateway теперь relay-aware и читают metadata через gateway routes, а не через filesystem самого gateway
Проекты:
- live presence консолей идёт из gateway live registry
- membership проекта хранится отдельно от live presence
- один client может иметь несколько live консолей одновременно
- console participation в проекте хранится отдельно
Ожидаемое поведение агента:
- target резолвится через
list_gateway_sessions - входящая работа читается через
list_xchange_recordsиget_xchange_record - реальные файлы возвращаются через
send_partner_file mark_xchange_record_readвызывается только после успешного outbound reply
Канонические стартовые точки:
Bundled templates:
- config/templates/env.gateway.template
- config/templates/env.client.template
- config/templates/env.both.template
Samples уже вычищены под текущий runtime:
- убраны старые inbox-only настройки
- убраны obsolete pairing-oriented тексты
- убраны неиспользуемые секреты вроде
SESSION_SECRET - убран неиспользуемый
APP_NAME - неоднозначные старые имена заменены на
TERMINAL_*,GATEWAY_SCOPE_TOKEN,TELEGRAM_REQUEST_MODE,DB_SCHEMAиLOGFEED_ENABLED
Проверка окружения:
tellymcp doctor --env .envРазрушительная очистка local+gateway state:
tellymcp system-prune --env .env --yesМиграция старого env в текущий ролевой контракт:
tellymcp migrate-env ./old.env > ./.migrated-envFallback на старую схему отсутствует. Если найдены legacy-ключи, запуск останавливается и выводит команду миграции.
- README.md
- STANDALONE.md
- STANDALONE-ru.md
- CHAT_CONNECTOR.md — OAuth-коннектор ChatGPT/Claude
- TOOLS.md
- screenshots/README.md
Этот README описывает текущую gateway-first модель.
Legacy concepts, которые не стоит использовать в новых setup:
- pairing codes
- session inbox APIs
Localpartner menu- linked-session flows вне
partner_note/ project collaboration