Telegram

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 mcp

Claude 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_statustg doctorпрофиль сервера, последний увиденный аккаунт и включённые инструменты изменения; без подключения
tg_reviewtg review, --since-time, --chat, --unanswered, --allвсе сообщения, включая ваши, в чатах с изменениями после заданного времени (по умолчанию три дня); complete и until задают начало следующей проверки; unanswered оставляет вопросы без ответа; transcribe распознаёт голосовые, model выбирает модель
tg_inboxtg inbox, --since-time, --allвходящие: непрочитанные или все сообщения после указанного времени одним вызовом; чаты без уведомлений и архив — только с упоминанием владельца или с all; не отмечает прочитанным и не меняет позицию tg inbox --new; transcribe распознаёт голосовые, model выбирает модель
tg_account_showtg account showаккаунт сессии; телефон всегда только последние четыре цифры
tg_account_sessionstg account sessions listвсе подключённые устройства и приложения; только чтение
tg_chats_listtg chats list, --search, --kind, --unreadчаты от новых к старым; фильтрация по последним 200; partial, если есть более старые
tg_chats_eventstg chats events, --since-time, --typeкто вступил, вышел, кого добавили или удалили и кем, по служебным сообщениям; без since_time — семь дней
tg_chats_memberstg chats members listучастники группы постранично, роли и последнее появление
tg_chats_inspecttg chats inspectкуда ведёт публичная ссылка или приглашение; без вступления
tg_topics_enabletg topics enableвключить форум с разрешением groups; только владелец группы может включить темы; явное преобразование обычной группы возвращает новый идентификатор чата
tg_topics_createtg topics createсоздать тему с разрешением groups; при неизвестном результате проверить tg_topics_list, а не повторять, даже с тем же send_id
tg_topics_listtg topics list, tg topics searchтемы форума с идентификаторами; search ищет по названию
tg_chats_showtg chats showодин чат и его участники
tg_contacts_listtg contacts listлюди с личным чатом
tg_contacts_showtg contacts showчеловек и общие с ним чаты
tg_contacts_lookuptg contacts lookupвладелец номера телефона, если разрешено приватностью; не добавляет контакт
tg_messages_evidencetg messages evidence, --limit, --before-idлокальный пакет данных чата от новых к старым: указатели, отпечатки, полнота, nextBeforeId; передайте курсор в before_id. Целые сообщения в пределах 64 КиБ JSON плюс заголовок. Полнота истории неизвестна. Слишком большое первое сообщение даёт пустой усечённый пакет без курсора. Без подключения и отметки прочитанным; разрешение messages.evidence
tg_messages_listtg 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_contexttg messages show, context, --before-n, --after-nсообщение и соседние; before_n и after_n задают количество
tg_messages_scheduledtg messages scheduledожидающие отправки сообщения от ближайших к поздним, с scheduledFor
tg_messages_phototg messages downloadфотография сообщения как изображение до 512 КБ; для остальных вложений возвращает отказ с командой сохранения tg messages download
tg_messages_transcribetg messages transcribeголосовое в текст через Telegram (Premium или недельная пробная квота), иначе локальной моделью; local: true пропускает Telegram; pending: true означает, что результат не готов за минуту; отсутствующая модель не скачивается, возвращается команда tg models audio download
tg_messages_searchtg messages searchпоиск сохранённого на компьютере; без запросов Telegram
tg_messages_sendtg 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_edittg messages editновый текст собственного сообщения, разрешение messages.edit; md как --md; повтор ничего не меняет
tg_chats_mark_readtg chats mark-readотметка прочитанным до последнего или указанного until сообщения, разрешение chats.mark-read; собеседник видит прочтение
tg_messages_deletetg messages deleteдо 10 сообщений только из вида владельца, разрешение messages.delete; по умолчанию форма подтверждения; никогда у всех; каждое входит в часовой лимит
tg_reactions_add, tg_reactions_removetg reactions add, removeреакция владельца на сообщение, разрешение reactions; форма показывает эмодзи
tg_polls_showtg polls showопрос и идентификаторы ответов; только чтение
tg_polls_vote, tg_polls_close, tg_polls_createtg polls vote, close, createпроголосовать по идентификатору ответа (polls.vote), закрыть собственный опрос (polls.close), создать опрос (polls.create, с send_id для повтора, revote для изменения голоса и topic для выбора темы форума)
tg_messages_forwardtg messages forwardпересылка сообщения в другой чат (to), разрешение messages.forward; send_id повторяет пересылку с неизвестным результатом
tg_messages_pin, tg_messages_unpintg messages pin, unpinзакрепить или открепить сообщение; тихо, если нет notify; разрешения messages.pin и messages.unpin
tg_chats_create, tg_chats_join, tg_chats_leavetg chats create, join, leaveсоздать группу или канал с участниками, вступить по ссылке, выйти; каждое действие видно другим
tg_chats_updatetg chats updateназвание, описание и настройки группы или канала; изменения видны участникам
tg_chats_link_show, tg_chats_link_resettg chats link show, resetссылка-приглашение; новая ссылка отключает старую
tg_chats_members_add, tg_chats_members_removetg chats members add, removeдобавить участников (каждый получает уведомление) или удалить; сообщения остаются
tg_chats_admins_add, tg_chats_admins_removetg chats admins add, removeназначить администратора с заданными правами или снять права
tg_chats_folders_list, _create, _update, _deletetg chats folders …папки чатов владельца; создать, переименовать, изменить состав, удалить; чаты сохраняются
tg_chats_rules_show, tg_chats_moderatetg chats rules show, tg chats moderateправила группы; проверка новых сообщений и участников и действия в пределах разрешений (Управление группами)
tg_account_updatetg account updateимя и описание профиля владельца, видимые всем
tg_contacts_renametg contacts renameимя человека, видимое только владельцу
tg_conversations_list, tg_conversations_showtg 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 они доступны как команды /:

ЗапросАргументДействие агента
catch-upsince — необязателенодин вызов tg_inbox, сводка по чатам; без отправки
replychatчтение чата, черновик, отправка только после вашего согласия с текстом
findtextпоиск человека или слов с контекстом сообщений; без отправки
reviewsince, groups — необязательныодин вызов tg_review, ваши обязательства, ожидания от других, уточнения; черновики напоминаний и отправка только после согласия

reply и review отправляют через tg_messages_send. При messages.send уровня readonly агент только показывает черновики.

Чаты доступны как ресурсы tg://chat/<id>; в Claude Code их можно упоминать через @. Ресурс содержит чат и недавние сообщения. Список читается из базы без подключения к Telegram и пуст, пока ничего не прочитано. Подключение требуется при чтении конкретного чата.

Работа соединения

Первый вызов подключается к Telegram, следующие используют соединение. Оно закрывается после двух минут без вызовов и в любом случае через пять минут после открытия, чтобы длительная сессия не читала устаревшие данные. Следующий вызов подключается заново. Вызовы выполняются по одному даже при одновременной отправке клиентом.

При закрытии stdin клиентом сервер завершается и закрывает подключение к Telegram.

На этой странице