Управление Claude Desktop через Telegram-бота с доступом ко всем инструментам десктоп-версии (MCP-серверы, коннекторы, веб-поиск, анализ файлов, артефакты).
Работает поверх Windows UI Automation (дерево доступности Chromium внутри
Electron). Это сознательный выбор: подход claude-automator через CDP
(--remote-debugging-port) на текущих сборках Claude Desktop заблокирован —
Anthropic гейтит remote-debugging подписанным токеном (см. ниже). UIA такого
ограничения не имеет и отдаёт всё нужное структурно.
Платформа: только Windows (UI Automation). Python 3.11+.
- Текстовый диалог с Claude Desktop из Telegram (используется подписка, не API).
- Сессии:
/new,/sessions,/switch— создание и переключение бесед; при выборе показываются последние сообщения беседы. - Контекст и лимиты:
/context,/limits— точные проценты прямо из UI Desktop. - Все инструменты: запросы «Allow tool» приходят в Telegram кнопками
Allow / Once / Deny;
/auto on— авто-подтверждение (чувствительные — файлы, команды — всё равно спрашиваются). - Интерактивные вопросы Claude (AskUserQuestion) приходят в Telegram кнопками опций; выбор кликается в Desktop и возвращается агенту.
- Команды Claude (
/compact,/clear,/model…) проходят как есть. - Богатый релей: в футере ответа видны выполненные команды и изменённые файлы
(
🖥 Ran …,✏️ Edited file.py +N -M,🔍 Searched …). - Читаемая разметка: ответы конвертируются в Telegram-HTML (код-блоки, жирный, таблицы, ссылки) с безопасным откатом на текст.
- Файлы по кнопке: под ответом — кнопка «📎 Файлы» (только по запросу, не
авто). По нажатию приходят: крупные код-блоки из ответа + реальные изменённые
файлы с диска (по именам из инструментов, поиск в
CLAUDE_PROJECT_ROOTS). - Голосовые сообщения: голос/аудио из Telegram распознаются локально
(faster-whisper, без ключей) и уходят в Claude как текст. Модель и язык —
WHISPER_MODEL/WHISPER_LANGUAGEв.env. - Зеркало (
/mirror on): новые ответы Claude в выбранной беседе (в т.ч. на запрос прямо в Desktop) приходят в Telegram. - Устойчивость: переживает отключение RDP (keepalive
tscon→console + запрет сна) и перезапуск посреди ответа — бот дочитывает прерванный ответ на старте. /hide on|off— сворачивать окно Claude после ответа.- Жёсткий allowlist по
user_id.
Проще всего — bot.bat: дважды кликните, откроется панель управления (ASCII-меню):
запуск / остановка / перезапуск, статус, просмотр и слежение за логом, установка
зависимостей (venv + pip) и настройка .env (токен, allowed IDs, режим
инструментов, модель и язык Whisper, папки проектов). Панель держит ровно один
экземпляр и проверяет, что бот поднялся.
Вручную:
# 1. зависимости
copy .env.example .env # заполните TELEGRAM_BOT_TOKEN и TELEGRAM_ALLOWED_IDS
py -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txtЗапуск (одним процессом):
.\start-bot.ps1 # убивает старые экземпляры и запускает одинВажно: запускать БАЗОВЫМ интерпретатором, а не
.venv\Scripts\python.exe -m claude_bridgeнапрямую — venv-лаунчер на этой системе раздваивает процесс, и Telegram рвёт polling (Conflict).start-bot.ps1уже использует базовый python с нужнымPYTHONPATH.
Автозапуск (бот живёт сам, поднимается после сбоя):
.\install-startup.ps1 # автозапуск при входе в систему (без прав админа)
# или, с правами: .\install-autostart.ps1 (Task Scheduler, рестарт при сбое)Перед стартом: Claude Desktop должен быть запущен, открыта любая беседа. Перезапускать Desktop с флагами не нужно — UIA подключается к обычному окну.
| Команда | Действие |
|---|---|
/help |
список команд |
/new |
новая беседа |
/sessions |
беседы из Recents (кнопки: переключить / 📌 закрепить) |
/model [имя] |
выбрать модель (без аргумента — меню кнопками) |
/find <запрос> |
поиск по ВСЕМ беседам (не только Recents) → открыть и закрепить |
/switch <N|имя> |
переключиться на беседу |
/pin /unpin |
закрепить/открепить целевую беседу |
/history [N] |
последние N сообщений беседы |
/whereami |
где сейчас пишем |
/context /limits |
заполнение контекста / лимиты плана (%) |
/stop |
прервать генерацию (есть и кнопка ⏹ на статусе) |
/auto on|off |
авто-подтверждение инструментов |
/hide on|off |
сворачивать окно Claude после ответа |
/mirror on|off |
зеркалить новые ответы выбранной беседы в Telegram |
/status |
модель, контекст/план, цель, режимы |
/compact, /clear … |
команды для самого Claude — проходят как есть |
Плюс: фото и документы из Telegram уходят в Claude как вложение; ответ стримится в статус-сообщение с кнопкой ⏹ Остановить и форматируется (код-блоки/жирный/таблицы). Прерванный перезапуском ответ дочитывается на старте.
Telegram ──► claude_bridge ──► Claude Desktop (окно)
telegram_bot.py через Windows UI Automation:
bridge.py • поле ввода = Group 'Prompt' (прямая печать + Enter)
uia_desktop.py • ответ = прямое чтение текста из дерева (без буфера)
• конец генерации = исчезла кнопка 'Stop'
• сессии = кнопки 'Idle/Running <имя>'
• лимиты = элемент 'Usage: context N%, plan M%'
- Дерево доступности Chromium «ленивое»: бот включает его на старте
(
SPI_SETSCREENREADER=1) и снимает на выходе. - Все обращения к UIA сериализуются в одном потоке (COM-модель).
- Карта UIA-локаторов — UIA-MAP.md. При обновлении Claude Desktop
правки локаторов и
python -m claude_bridge.probe(дамп дерева) — там.
В app.asar Claude Desktop зашит гейт: аргументы remote-debugging-port/-pipe
вырезаются при саморелонче, если не задан CLAUDE_CDP_AUTH — короткоживущий токен,
проверяемый Ed25519-ключом Anthropic. Подделать нельзя. Поэтому — UIA.
Бот даёт удалённый доступ к вашему ПК через Claude. Держите TELEGRAM_ALLOWED_IDS
только со своим id; чувствительные инструменты оставляйте на ручном подтверждении.
Если ПК используется по RDP, после отключения сессия становится «Disc» и синтетический ввод перестаёт доставляться. Лечится один раз:
# двойной клик или из PowerShell; запросит UAC
.\setup-keepalive.batСкрипт настраивает питание (без сна/гашения экрана) и регистрирует SYSTEM-задачу:
при отключении RDP сессия перебрасывается на консоль (tscon /dest:console) и
остаётся активной/разблокированной — бот продолжает работать. Дополнительно сам
бот держит систему активной (SetThreadExecutionState).
send_messageпроверяет, что текст реально попал в поле, и повторяет при переходной потере фокуса (RDP-реконнект/блокировка) — без молчаливой отправки «старого» сообщения.
Рабочее решение: полный цикл «сообщение → ответ» со стримингом, подтверждение инструментов и интерактивные вопросы кнопками, голосовые (локальный Whisper), файлы по кнопке, дочтение прерванного ответа, устойчивость к RDP/сну. Артефакты-панели (Canvas) — единственный пока не покрытый пункт.