MCP-сервер
Документация: v0.24.0
MCP и документация →Что MCP даёт агенту, как подключить свой клиент и как читать эти доки.tg mcp предоставляет агенту доступ к профилю по MCP через stdin и stdout, без сетевого порта. Сервер входит в tg; отдельная установка не нужна.
Когда нужен MCP. В Claude Code, Codex и других агентах с терминалом достаточно tg: возможности и расход токенов те же. MCP нужен клиентам без терминала, например Claude Desktop или чату Cursor, и для подтверждения отправок в интерфейсе клиента. ChatGPT или Claude в браузере требуют дополнительной настройки: Удалённый доступ.
Сервер основан на реализации max-cli (max mcp) и ведёт себя аналогично.
Подключение
Сначала выполните tg setup --agent none в локальном терминале: эта команда настраивает аккаунт Telegram. tg mcp setup отдельно подключает клиент. tg skill show объясняет оба шага до входа. Сам MCP-сервер не выполняет вход за вас.
Codex или Claude Code на этом компьютере:
tg mcp doctor # check that MCP starts and lists tools
tg mcp setup codex # add it to Codex
tg mcp setup claude-code # or add it to Claude CodeУкажите профиль первым, например tg work mcp setup codex. Настройка использует собственную команду клиента и не меняет другие серверы. Если сервер с таким именем уже есть, удалите его запись в клиенте перед повторной настройкой. Стандартный профиль tg предлагает инструменты изменения данных, поэтому настройка просит проверить разрешения и повторить команду с --allow-writes. Этот флаг подтверждает установку, но не меняет разрешения. Чтобы ограничить действия агента, сначала задайте permissions профиля (ниже).
mcp doctor не читает сообщения и не входит в Telegram. Успешная проверка означает, что подключение MCP и список инструментов работают; она не подтверждает действительность сессии аккаунта. potentialWrites считает инструменты без объявления «только чтение». Для браузера и мобильных чатов требуется отдельное удалённое подключение (инструкция).
Claude Code:
claude mcp add tg -- tg mcpС профилем — имя ставится первым, как в обычной команде:
claude mcp add tg-work -- tg work mcpClaude Desktop, Cursor и другие: tg выводит запись для файла настроек клиента:
tg mcp config
tg work mcp config --confirm-send # the entry with a form before every change--confirm-send, --allow-dangerous и --yes включаются в запись как указаны (ниже).
{
"mcpServers": {
"tg": {
"type": "stdio",
"command": "/usr/bin/node",
"args": ["/usr/lib/node_modules/@leemour/tg-cli/dist/bin/tg.js", "mcp"],
"env": { "XDG_RUNTIME_DIR": "/run/user/1000" }
}
}
}Вставьте запись в mcpServers: Claude Desktop использует ~/Library/Application Support/Claude/claude_desktop_config.json в macOS и %APPDATA%\Claude\claude_desktop_config.json в Windows; Cursor — ~/.cursor/mcp.json. Команда сама не записывает файл.
Пути абсолютные: приложение, запущенное с рабочего стола, не видит PATH терминала. В Windows tg — файл tg.cmd, который клиент без оболочки не может запустить напрямую. Запись копирует заданные TG_CONFIG_DIR, TG_STATE_DIR, TG_CACHE_DIR, MESSAGING_STORE, XDG_RUNTIME_DIR, но никогда TG_API_ID, TG_API_HASH или сессию.
Если Node установлен через nvm, fnm или Volta, путь привязан к его версии: после смены повторите tg mcp config. Запуск из npx отклоняется, поскольку очистка кеша npx удалит путь.
⚠ TG_CONFIG_DIR, TG_STATE_DIR и TG_CACHE_DIR меняют место поиска сессии. Разные значения в терминале и MCP-клиенте приводят к сообщению «нет сессии», хотя tg работает в терминале. Задайте одинаковые значения в обоих окружениях или не задавайте нигде.
⚠ В Linux доступ к данным приложения в хранилище ключей зависит от XDG_RUNTIME_DIR. Клиент с сокращённым окружением может убрать переменную; тогда инструменты сообщают о недоступном хранилище. tg mcp config включает её в запись.
Разрешения агента
permissions профиля определяет доступные инструменты по тем же уровням, что команды (Настройки):
| Уровень | Поведение MCP |
|---|---|
deny | инструмент скрыт; messages: deny также скрывает готовые запросы и ресурсы чатов |
readonly | доступны инструменты чтения, изменения скрыты |
ask | сервер показывает форму перед действием (ниже) |
allow | действие без подтверждения |
По умолчанию агент может отправлять, редактировать, ставить реакции, пересылать, закреплять, голосовать и отмечать прочитанным без параметра или подтверждения. Только tg_messages_delete имеет уровень ask: перед каждым удалением появляется форма. Агент никогда не удаляет у всех и не завершает другие сессии независимо от уровня.
Для чтения выделите агенту отдельный профиль: tg agent session start создаёт ещё одну сессию того же аккаунта. Настройте в нём каждый ресурс:
for key in messages reactions polls topics chats contacts account; do
tg agent config set permissions.$key readonly
done
claude mcp add tg -- tg agent mcpСтарая настройка readOnly: true делает то же. Чтобы запрашивать подтверждение каждой отправки, задайте messages.send уровень ask:
tg agent config set permissions.messages.send askОграничения действуют и на вас: tg agent messages send тоже спросит подтверждение. Два параметра пропускают форму для уровня ask:
tg mcp --allow-dangerous— без формы перед удалением;tg mcp --yes— без формы перед другими изменениями.
Отправка, редактирование и пересылка через MCP проверяют permissions, получателей, часовой лимит и журнал (tg sends list), как обычные команды. Инструменты изменения также отмечены опасными: VS Code и Cursor запрашивают подтверждение каждого вызова; по документации Claude Code показывает диалог даже при предварительном разрешении.
Отметка прочитанным — chats.mark-read: собеседник видит прочтение. Задайте readonly, если агент не должен выдавать просмотр. tg_chats_mark_read не входит в часовой лимит.
Удаление — messages.delete. tg_messages_delete удаляет до 10 сообщений только из вашего вида. Удаление у всех доступно только вашей команде в терминале. В супергруппах и каналах Telegram не поддерживает удаление только для себя: инструмент там отклоняется.
--allow-send, --allow-mark-read и --allow-delete больше не влияют на разрешения. Они принимаются с предупреждением для совместимости; удалите их из настроек клиента.
Форма подтверждения сервера
claude mcp add tg -- tg mcp --confirm-sendПеред изменением с уровнем ask, а с --confirm-send — перед любым изменением, сервер показывает форму. При отправке в ней указаны чат (название и идентификатор, найденные по аргументу агента) и полный текст. Действие выполняется только после Accept; полей ввода нет. Окно клиента показывает исходные аргументы модели (chat: "Anna"), а форма — фактического получателя («Anna Petrova (123456)»).
- Отказ или закрытие: изменений нет; агент получает
confirmation_requiredи не должен повторять запрос. - Клиент без поддержки форм получает ошибку: изменений нет. Claude Code поддерживает формы.
- Подтверждение связано с показанными данными: при смене чата, текста или инструмента действие не выполняется.
- Подтверждение действует один раз, пять минут. Повторное использование ничего не меняет.
Инструменты
| Инструмент | Команда | Назначение |
|---|---|---|
tg_status | tg doctor | профиль сервера, последний увиденный аккаунт и включённые инструменты изменения; без подключения |
tg_review | tg review, --since-time, --chat, --unanswered, --all | все сообщения, включая ваши, в чатах с изменениями после заданного времени (по умолчанию три дня); complete и until задают начало следующей проверки; unanswered оставляет вопросы без ответа; transcribe распознаёт голосовые, model выбирает модель |
tg_inbox | tg inbox, --since-time, --all | входящие: непрочитанные или все сообщения после указанного времени одним вызовом; чаты без уведомлений и архив — только с упоминанием владельца или с all; не отмечает прочитанным и не меняет позицию tg inbox --new; transcribe распознаёт голосовые, model выбирает модель |
tg_account_show | tg account show | аккаунт сессии; телефон всегда только последние четыре цифры |
tg_account_sessions | tg account sessions list | все подключённые устройства и приложения; только чтение |
tg_chats_list | tg chats list, --search, --kind, --unread | чаты от новых к старым; фильтрация по последним 200; partial, если есть более старые |
tg_chats_events | tg chats events, --since-time, --type | кто вступил, вышел, кого добавили или удалили и кем, по служебным сообщениям; без since_time — семь дней |
tg_chats_members | tg chats members list | участники группы постранично, роли и последнее появление |
tg_chats_inspect | tg chats inspect | куда ведёт публичная ссылка или приглашение; без вступления |
tg_topics_enable | tg topics enable | включить форум с разрешением groups; только владелец группы может включить темы; явное преобразование обычной группы возвращает новый идентификатор чата |
tg_topics_create | tg topics create | создать тему с разрешением groups; при неизвестном результате проверить tg_topics_list, а не повторять, даже с тем же send_id |
tg_topics_list | tg topics list, tg topics search | темы форума с идентификаторами; search ищет по названию |
tg_chats_show | tg chats show | один чат и его участники |
tg_contacts_list | tg contacts list | люди с личным чатом |
tg_contacts_show | tg contacts show | человек и общие с ним чаты |
tg_contacts_lookup | tg contacts lookup | владелец номера телефона, если разрешено приватностью; не добавляет контакт |
tg_messages_evidence | tg messages evidence, --limit, --before-id | локальный пакет данных чата от новых к старым: указатели, отпечатки, полнота, nextBeforeId; передайте курсор в before_id. Целые сообщения в пределах 64 КиБ JSON плюс заголовок. Полнота истории неизвестна. Слишком большое первое сообщение даёт пустой усечённый пакет без курсора. Без подключения и отметки прочитанным; разрешение messages.evidence |
tg_messages_list | tg messages list, --before-id, --before-time, --after-id, --after-time | сообщения чата; before_id или before_time — назад, after_id или after_time — вперёд; максимум один параметр. Не отмечает прочитанным: для этого отдельный tg_chats_mark_read. Распознанное голосовое содержит transcript; transcribe распознаёт остальные, model выбирает модель |
tg_messages_context | tg messages show, context, --before-n, --after-n | сообщение и соседние; before_n и after_n задают количество |
tg_messages_scheduled | tg messages scheduled | ожидающие отправки сообщения от ближайших к поздним, с scheduledFor |
tg_messages_photo | tg messages download | фотография сообщения как изображение до 512 КБ; для остальных вложений возвращает отказ с командой сохранения tg messages download |
tg_messages_transcribe | tg messages transcribe | голосовое в текст через Telegram (Premium или недельная пробная квота), иначе локальной моделью; local: true пропускает Telegram; pending: true означает, что результат не готов за минуту; отсутствующая модель не скачивается, возвращается команда tg models audio download |
tg_messages_search | tg messages search | поиск сохранённого на компьютере; без запросов Telegram |
tg_messages_send | tg messages send, --reply-to, --topic | отправить с разрешением messages.send; reply_to отвечает на сообщение; send_id повторяет отправку с неизвестным результатом; silent, no_preview и md соответствуют --silent, --no-preview и --md; topic выбирает тему форума; at_time отправляет позже — без повторов, время показано в форме подтверждения; file или photo прикрепляет путь на этом компьютере, текст становится подписью (as_file сохраняет видео как файл), voice отправляет Ogg Opus как голосовое сообщение — скрытые файлы, ~/.ssh, каталоги tg и база сообщений запрещены без обхода через MCP |
tg_messages_edit | tg messages edit | новый текст собственного сообщения, разрешение messages.edit; md как --md; повтор ничего не меняет |
tg_chats_mark_read | tg chats mark-read | отметка прочитанным до последнего или указанного until сообщения, разрешение chats.mark-read; собеседник видит прочтение |
tg_messages_delete | tg messages delete | до 10 сообщений только из вида владельца, разрешение messages.delete; по умолчанию форма подтверждения; никогда у всех; каждое входит в часовой лимит |
tg_reactions_add, tg_reactions_remove | tg reactions add, remove | реакция владельца на сообщение, разрешение reactions; форма показывает эмодзи |
tg_polls_show | tg polls show | опрос и идентификаторы ответов; только чтение |
tg_polls_vote, tg_polls_close, tg_polls_create | tg polls vote, close, create | проголосовать по идентификатору ответа (polls.vote), закрыть собственный опрос (polls.close), создать опрос (polls.create, с send_id для повтора, revote для изменения голоса и topic для выбора темы форума) |
tg_messages_forward | tg messages forward | пересылка сообщения в другой чат (to), разрешение messages.forward; send_id повторяет пересылку с неизвестным результатом |
tg_messages_pin, tg_messages_unpin | tg messages pin, unpin | закрепить или открепить сообщение; тихо, если нет notify; разрешения messages.pin и messages.unpin |
tg_chats_create, tg_chats_join, tg_chats_leave | tg chats create, join, leave | создать группу или канал с участниками, вступить по ссылке, выйти; каждое действие видно другим |
tg_chats_update | tg chats update | название, описание и настройки группы или канала; изменения видны участникам |
tg_chats_link_show, tg_chats_link_reset | tg chats link show, reset | ссылка-приглашение; новая ссылка отключает старую |
tg_chats_members_add, tg_chats_members_remove | tg chats members add, remove | добавить участников (каждый получает уведомление) или удалить; сообщения остаются |
tg_chats_admins_add, tg_chats_admins_remove | tg chats admins add, remove | назначить администратора с заданными правами или снять права |
tg_chats_folders_list, _create, _update, _delete | tg chats folders … | папки чатов владельца; создать, переименовать, изменить состав, удалить; чаты сохраняются |
tg_chats_rules_show, tg_chats_moderate | tg chats rules show, tg chats moderate | правила группы; проверка новых сообщений и участников и действия в пределах разрешений (Управление группами) |
tg_account_update | tg account update | имя и описание профиля владельца, видимые всем |
tg_contacts_rename | tg contacts rename | имя человека, видимое только владельцу |
tg_conversations_list, tg_conversations_show | tg conversations list, show | разговоры внутри группы из локальной базы и сообщения отдельного разговора |
Ответы соответствуют --json команд: список — { items, page, limit, hasMore }, сообщения чата — { items, limit, hasMore }, идентификаторы — строки. Ошибка — { error: { code, message, … } } с кодами CLI; неоднозначное название возвращает candidates.
Чтение Telegram сохраняется в базу; пакет исходных данных читает этот архив. Вызовы можно записывать как запуски (tg runs list) с именами mcp chats list и подобными.
Готовые запросы и чаты через @
Сервер предоставляет четыре готовых запроса; в Claude Code они доступны как команды /:
reply и review отправляют через tg_messages_send. При messages.send уровня readonly агент только показывает черновики.
Чаты доступны как ресурсы tg://chat/<id>; в Claude Code их можно упоминать через @. Ресурс содержит чат и недавние сообщения. Список читается из базы без подключения к Telegram и пуст, пока ничего не прочитано. Подключение требуется при чтении конкретного чата.
Работа соединения
Первый вызов подключается к Telegram, следующие используют соединение. Оно закрывается после двух минут без вызовов и в любом случае через пять минут после открытия, чтобы длительная сессия не читала устаревшие данные. Следующий вызов подключается заново. Вызовы выполняются по одному даже при одновременной отправке клиентом.
При закрытии stdin клиентом сервер завершается и закрывает подключение к Telegram.