Claude Code Telegram Bridge
Мост ClaudeCode ↔ Telegram
Мост для Claude Code, привязанный к сессии. Бот живёт ровно столько, сколько длится ваша терминальная сессия — запустили, используете, закрыли. Никакого постоянно работающего демона.
Это форк официального плагина канала Claude Code для Telegram с патчем безопасности и портативной схемой развёртывания на базе tmux + Tailscale.
Как это работает
Phone (Telegram)
│
▼
┌─────────────────────┐
│ server.ts │ Standalone MCP HTTP server
│ Polls Telegram │ Runs as a systemd user unit
│ Queues messages │ Starts/stops with the pin
└──────────┬──────────┘
│ SSE (/events)
▼
┌─────────────────────┐
│ proxy.ts │ Stdio MCP proxy
│ Bridges to Claude │ Spawned by Claude Code
│ Owns the pin lock │ One session at a time
└──────────┬──────────┘
│ stdio
▼
┌─────────────────────┐
│ Claude Code │ Your session
│ Reads messages │ Calls reply/react/edit
│ Full tool access │ Permission buttons in TG
└─────────────────────┘Конструкция с пином: Только одна сессия Claude может владеть ботом одновременно. tgpin захватывает файл блокировки, запускает поллер и освобождает оба ресурса, когда сессия завершается. Это предотвращает ошибку 409 Conflict, которая возникает, когда два поллера борются за один и тот же токен Telegram.
Патч безопасности
В исходном плагине есть проблема раскрытия информации: команды /start, /help и /status регистрируются до того, как срабатывает шлюз доступа. При dmPolicy: "allowlist" посторонний, обнаруживший бота, получает полезный ответ, объясняющий, что это мост Claude Code — тем самым раскрывается факт существования бота и его назначение.
Патч добавляет защиту commandMuted(): в режиме allowlist или disabled команды от пользователей, не входящих в белый список, молча игнорируются. В режиме сопряжения они работают нормально (поскольку /start — это способ, которым новые пользователи узнают о сопряжении).
Это +15 строк, без удалений, видно в git diff.
Установка
Предварительные требования
Установлен CLI Claude Code
Среда выполнения Bun
Токен бота Telegram от @BotFather
1. Установите сервер
mkdir -p ~/.claude/telegram-server
cp server.ts proxy.ts package.json ~/.claude/telegram-server/
cd ~/.claude/telegram-server && bun install2. Настройте токен бота
mkdir -p ~/.claude/channels/telegram
echo "TELEGRAM_BOT_TOKEN=YOUR_TOKEN_HERE" > ~/.claude/channels/telegram/.env
chmod 600 ~/.claude/channels/telegram/.env3. Установите пользовательский юнит systemd
mkdir -p ~/.config/systemd/user
cp telegram-mcp.service ~/.config/systemd/user/
systemctl --user daemon-reloadНе включайте службу — tgpin запускает и останавливает её автоматически. Включение сделало бы бота бессмертным и конфликтовало бы с конструкцией пина.
4. Установите лаунчер
cp tgpin ~/bin/tgpin
chmod +x ~/bin/tgpin
# Optional: alias in your .bashrc
echo 'alias tg="~/bin/tgpin"' >> ~/.bashrc5. Ограничьте доступ (рекомендуется)
По умолчанию бот находится в режиме сопряжения — любой, кто напишет ему в личку, получит код сопряжения. Чтобы привязать его к вашему ID пользователя Telegram:
cat > ~/.claude/channels/telegram/access.json << 'EOF'
{
"dmPolicy": "allowlist",
"allowFrom": ["YOUR_TELEGRAM_USER_ID"],
"groups": {},
"pending": {}
}
EOFУзнайте свой ID, отправив сообщение @userinfobot в Telegram.
Использование
Запуск сессии
tg # start Claude with Telegram bridge
tg --continue # resume the last conversationПортативный доступ (tmux + Tailscale + Termius)
Настоящая мощь — в запуске этого по SSH с телефона. Стек:
Tailscale — mesh-VPN. Ваш телефон и машина видят друг друга в частной сети, без проброса портов и публичного IP. Бесплатно для личного использования.
Termius — SSH-клиент для Android/iOS. Поддерживает ключевую аутентификацию, постоянные сессии и адреса Tailscale. Бесплатного тарифа достаточно.
tmux — терминальный мультиплексор. Сессия переживает разрывы SSH.
# On your machine (once):
tmux new -s claude
tg
# Detach: Ctrl+B, then D
# From your phone (Termius → Tailscale IP):
ssh your-machine
tmux attach -t claudeБот остаётся живым, пока существует сессия tmux. Разрывы SSH его не убивают. Закрываете сессию tmux — бот умирает. Это задумано.
Рабочий процесс: Вы в автобусе, открываете Termius на телефоне, подключаетесь по SSH к своей машине через Tailscale, подключаетесь к сессии tmux — Claude живёт в Telegram. Закрываете Termius, сессия tmux сохраняется, бот продолжает работать. Вы вернётесь к нему позже откуда угодно.
Обработка разрешений
Вызовы инструментов отображаются в Telegram как кнопки одобрения/отказа. Сессия работает в режиме --permission-mode default, поэтому опасные операции (запись файлов, команды оболочки) требуют вашего явного нажатия перед выполнением.
Архитектурные решения
Почему привязка к сессии?
Постоянно работающий бот означает постоянно работающую сессию Claude, потребляющую ресурсы и потенциально действующую на основе устаревшего контекста. Конструкция с пином означает, что бот жив, когда он вам нужен, и мёртв, когда не нужен. Это особенность, а не ограничение.
Почему два файла (server.ts + proxy.ts)?
Сервер работает как юнит systemd и удерживает соединение поллинга Telegram. Прокси запускается Claude как stdio-транспорт MCP. Разделение означает:
Сервер может перезапускаться независимо от Claude
Прокси может переподключаться к работающему серверу
Состояние поллинга не теряется при перезапуске сессии Claude
Почему не вебхук?
Вебхукам нужен публичный URL, TLS и проброс портов. Длинный опрос работает где угодно — за NAT, на ноутбуке, на VPS. Ноль инфраструктуры, кроме самой машины.
Один поллер на токен
Bot API Telegram возвращает 409 Conflict, если два процесса опрашивают один и тот же токен. Файл блокировки (pinned.lock) гарантирует ровно один поллер. Если сессия падает без очистки, следующий tgpin обнаруживает устаревший PID и восстанавливает блокировку.
Файлы
Файл | Назначение |
| Автономный HTTP-сервер MCP — опрашивает Telegram, ставит сообщения в очередь, обслуживает инструменты |
| Stdio-прокси MCP — мост между сервером и Claude, управляет жизненным циклом пина |
| Зависимости: grammy, MCP SDK, express, zod |
| Скрипт-лаунчер — захватывает пин, запускает Claude с загруженным каналом |
| Пользовательский юнит systemd для сервера |
Лицензия
Apache-2.0 (такая же, как у исходного плагина канала Claude Code для Telegram).
Контакты
GitHub: Swigler
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Human-in-the-loop for AI coding agents — ask questions, get approvals via Slack.
Build and deploy websites, Telegram and Discord bots from chat via the DreamAgent platform.
Trade Robinhood through natural language in Claude Code.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/Swigler/claude-telegram-bridge'
If you have feedback or need assistance with the MCP directory API, please join our Discord server