Claudegram
Provides 120 MCP tools for managing a personal Telegram account via MTProto, including messaging, history, media, contacts, chats, stickers, polls, stories, and more, with channel-mode for pushing incoming messages to Claude sessions.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Claudegram send a message to John: 'on my way'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
TL;DR
Claudegram — production-grade плагин Claude Code, превращающий личный Telegram в управляемый AI-инструмент:
MTProto, не Bot API — видит всю переписку, истории, поиск, медиа, статистику.
120 типизированных MCP-tools через FastMCP, разбиты на 9 доменов; покрыты
safe_toolmiddleware с FloodWait/RPCError handling и санитизацией секретов.Channel-режим: входящие сообщения push-ятся в активную сессию Claude как
<channel>теги с permission relay (yes/no через<id>).4-слойная safety net: PreToolUse hooks (
guard-delete,guard-destructive,guard-confirm) +disable-model-invocationдля отправки сообщений + sensitive userConfig в системный keychain.Skills + Prompts:
tg-digest,tg-search,tg-history,tg-send,tg-reply,telegram-workflow— готовые сценарии для рекрутерского тестового запуска.
Полный список возможностей — в таблице ниже.
Related MCP server: telegram-mcp
Why this project
Реальный production-ready MCP-сервер: типизированные tools, structured output, prompt templates, completions, resource templates.
Безопасность спроектирована up-front: модель угроз, hook-гейты, allowlist, sanitize в логах. См. SECURITY.md.
Чистая архитектура: 75 модулей, ~6.3k строк server-кода, ~900 строк тестов, ruff + mypy, CI на GitHub Actions, Codecov, CodeQL.
Каждое решение объяснено docstring'ом и CHANGELOG'ом, без «магии».
Quick start
git clone https://github.com/sanjar-x/claudegram.git && cd claudegram
uv sync
cp .env.example .env # вставь api_id/api_hash/phone с https://my.telegram.org
uv run claudegram-auth
# затем в Claude Code: /plugin add . && /plugin install claudegramПодробнее — в разделе «Установка» ниже.
В отличие от Bot API, Claudegram видит всю историю, все чаты и поддерживает поиск. Архитектура и компоненты выровнены под официальную спеку Claude Code Plugins.
Возможности
Слой | Что внутри |
MCP-сервер | 118 типизированных tool'ов через FastMCP + Telethon, разбиты по 9 доменам с подпакетами в |
Production middleware |
|
Health probe |
|
Channel-режим | Push входящих Telegram-сообщений в активную сессию Claude как |
Skills | 6 skill'ов: |
Hooks |
|
bin/ |
|
userConfig | Креденшелы + sender-allowlist запрашиваются GUI-промптом плагина, сенситивные в системном keychain |
Persistent data |
|
Marketplace |
|
Структура
Claudegram/
├── .claude-plugin/
│ └── plugin.json # манифест с userConfig (api_id/hash/phone/2fa)
├── .mcp.json # MCP stdio-сервер, env через ${user_config.*}
├── hooks/
│ ├── hooks.json # SessionStart auth-check, PreToolUse delete-guard
│ └── scripts/
│ ├── check-auth.sh
│ └── guard-delete.sh
├── skills/ # каждая команда — отдельный каталог с SKILL.md
│ ├── telegram-workflow/SKILL.md # фоновые правила (user-invocable: false)
│ ├── tg-channel-incoming/SKILL.md # обработка <channel source="claudegram"> тегов
│ ├── tg-digest/SKILL.md # /claudegram:tg-digest [N]
│ ├── tg-search/SKILL.md # /claudegram:tg-search <запрос> [@chat]
│ ├── tg-history/SKILL.md # /claudegram:tg-history <@chat> [limit]
│ ├── tg-send/SKILL.md # /claudegram:tg-send <@chat> <текст> (disable-model-invocation)
│ └── tg-reply/SKILL.md # /claudegram:tg-reply <@chat> <id> <текст>
├── bin/
│ └── claudegram-auth # шелл-обёртка над server.auth
├── server/ # Python MCP-сервер (FastMCP + Telethon)
│ ├── __init__.py
│ ├── config.py # plugin-mode + standalone-mode env loading
│ ├── auth.py # одноразовый интерактивный логин
│ ├── client.py # singleton TelegramClient
│ ├── formatters.py # сериализация в JSON
│ ├── channel.py # channel-режим: push + permission relay
│ ├── main.py # FastMCP entry + custom stdio runner с experimental caps
│ └── tools/ # 92 tools в 8 доменах с подпакетами
│ ├── __init__.py # register_all(mcp) — диспатчит по доменам
│ ├── _common.py # shared utils (ParseMode, normalize_chat, clamp, to_jsonable)
│ ├── identity/ # account, sessions
│ │ ├── account.py # get_me, update_profile, set_online, update_username, get_full_user
│ │ └── sessions.py # get_authorizations, terminate_authorization
│ ├── peers/ # discovery + метаданные сущностей
│ │ ├── lookup.py # resolve_username, get_chat_info, search_global, get_top_peers, get_input_peer
│ │ ├── users.py # get_profile_photos, download_profile_photo, get_common_chats
│ │ └── contacts.py # CRUD + block/unblock + import + get_blocked
│ ├── messaging/ # send/edit/history/pins/reactions
│ │ ├── messages.py # send/edit/delete/forward
│ │ ├── history.py # get_history (+filter_type), search_messages
│ │ ├── pins.py # pin_message, unpin_message
│ │ └── reactions.py # react_message
│ ├── dialogs/ # список и состояния диалогов
│ │ ├── list_.py # list_chats, get_drafts
│ │ ├── folders.py # archive/unarchive/pin_dialog
│ │ └── notify.py # mark_read, mute, unmute, delete_dialog
│ ├── chats/ # управление группами/каналами
│ │ ├── create.py # create_group, create_channel
│ │ ├── settings.py # title/about/photo/forum_mode
│ │ ├── members.py # participants, kick, ban, unban, restrict, promote, demote
│ │ ├── invites.py # join, leave, export_invite
│ │ └── admin.py # admin_log, stats
│ ├── media/ # файлы и attachments
│ │ ├── files.py # send_file, send_album
│ │ ├── download.py # download_media, get_media_info
│ │ ├── attachments.py # send_location, send_contact, send_dice
│ │ └── stickers.py # все sticker-операции
│ ├── content/ # контент-фичи
│ │ ├── polls.py # send/vote/results
│ │ ├── stories.py # all stories operations
│ │ └── forums.py # forum-topics
│ └── advanced/
│ └── raw.py # invoke_raw — ANY MTProto method
├── pyproject.toml + uv.lock # uv-проект
├── .env.example # для standalone-режима
├── .gitignore # игнорит .env, *.session, .venv, кеши
└── README.mdСтек
Установка
1. Получить API-креденшелы
Открой https://my.telegram.org → API development tools.
Создай приложение (любые
App title/Short name).Скопируй
api_idиapi_hash.
2. Установить зависимости (uv создаст .venv/)
cd ~/Desktop/Claudegram
uv sync3. Подключить плагин в Claude Code
Самый быстрый способ для разработки — --plugin-dir (грузит как сессионный плагин,
без установки):
claude --plugin-dir ~/Desktop/ClaudegramПостоянная установка через локальный marketplace (marketplace.json уже включён
в .claude-plugin/):
/plugin marketplace add ~/Desktop/Claudegram
/plugin install claudegram@claudegram-localclaudegram-local — имя локального marketplace из .claude-plugin/marketplace.json.
При первом включении Claude Code откроет промпт и попросит ввести
tg_api_id, tg_api_hash, tg_phone (поля userConfig из манифеста).
Сенситивные значения уйдут в системный keychain, не в settings.json.
4. Авторизоваться (один раз)
⚠️ Важно: bin/claudegram-auth попадает в PATH только Bash tool внутри
Claude Code, не в обычный shell хоста (это ограничение Claude Code, см.
plugins-reference).
Вариант A (рекомендуемый, из активной Claude-сессии):
! claudegram-authПрефикс ! запускает команду в shell сессии, и тогда bin/claudegram-auth
из плагина уже в PATH.
Вариант B (из обычного терминала, standalone):
cd ~/Desktop/Claudegram
uv run python -m server.auth
# или
uv run claudegram-auth # после `uv sync` появляется console-scriptВ обоих случаях — введи код из Telegram. Файл сессии создастся:
Plugin-mode:
~/.claude/plugins/data/claudegram-claudegram-local/claudegram.session(переменная${CLAUDE_PLUGIN_DATA}) — не теряется при апдейте плагина.Standalone: в корне проекта
~/Desktop/Claudegram/claudegram.session.
5. Проверить
/mcp # должен появиться сервер "claudegram"
/reload-plugins # после правок без рестарта
/hooks # увидишь SessionStart + PreToolUse гейтИспользование
Slash-skills (тип /claudegram:<skill>)
/claudegram:tg-digest [N]— сводка непрочитанных по N чатам./claudegram:tg-search <запрос> [@chat]— поиск./claudegram:tg-history <@chat> [N]— последние N сообщений чата./claudegram:tg-send <@chat> <текст>— отправка с подтверждением. Только пользователь вызывает (disable-model-invocation: true)./claudegram:tg-reply <@chat> <id> <текст>— ответ на конкретное сообщение. Только пользователь.
Авто-активация
Skill telegram-workflow (user-invocable: false) подгружается, когда ты пишешь
"что у меня в Telegram?", "найди в чатах", "напиши Пете". Claude по описанию
выбирает правильный MCP-tool и следует safety-правилам из этого skill.
Прямые MCP-инструменты (58 шт)
Полный namespace: mcp__plugin_claudegram_claudegram__<tool>. Wildcard для
permission-rule: mcp__plugin_claudegram_claudegram__*.
Полный каталог с описаниями и сигнатурами — в skill'е telegram-workflow/SKILL.md.
Краткая сводка по категориям:
Account (5):
get_me,get_authorizations,terminate_authorization,update_profile,set_onlineMessages (11):
send_message,edit_message,delete_message,forward_message,get_history,search_messages,mark_read,pin_message,unpin_message,react_message,send_diceDialogs (7):
list_chats,get_drafts,archive_dialog,unarchive_dialog,delete_dialog,mute_dialog,unmute_dialogUsers (7):
get_chat_info,resolve_username,get_participants,get_profile_photos,block_user,unblock_user,get_common_chatsChats (12):
create_group,create_channel,edit_chat_title,edit_chat_about,join_chat,leave_chat,kick_participant,ban_participant,unban_participant,promote_admin,demote_admin,get_admin_log,get_statsMedia (7):
download_media,download_profile_photo,send_file,send_album,send_location,send_contact,get_media_infoContacts (4):
get_contacts,add_contact,delete_contact,search_globalPolls (2):
send_poll,vote_pollRaw API (2):
invoke_raw,get_input_peer— escape hatch для любого MTProto-метода черезtelethon.tl.functions.<module>.<MethodNameRequest>. Покрывает Stories, Payments, Stickers, Channels admin, Folders, Themes — всё, что не обёрнуто high-level API.
Как работает безопасность
.envи*.sessionв.gitignore.Sensitive userConfig (api_hash, phone, 2FA) уходят в системный keychain (или
~/.claude/.credentials.json), не вsettings.json.*.sessionлежит в${CLAUDE_PLUGIN_DATA}— не утекает с апдейтом, но даёт полный доступ к аккаунту, храни как пароль.PreToolUse-хук наdelete_messageпринудительно спрашивает, еслиrevoke=true.Skill
telegram-workflowобязывает Claude получать явное подтверждение передsend_message/mark_read/delete_message.Telegram может посчитать активность подозрительной → возможна блокировка. Для экспериментов используй отдельный аккаунт.
Standalone-режим (без плагина)
Можно запустить MCP-сервер вне Claude Code:
cp .env.example .env
$EDITOR .env # заполни TG_API_ID/HASH/PHONE
uv run python -m server.auth # логин, .session ляжет в корень
uv run python -m server.main # MCP stdio-серверserver/config.py сначала читает TG_* (или .env), затем —
CLAUDE_PLUGIN_OPTION_TG_*, которые экспортируются плагином. Один и тот же код
работает в обоих режимах.
Расширение
Новый MCP-tool → функция в
server/main.pyс@mcp.tool(). FastMCP сам сгенерирует JSON-схему по type-hints + docstring.Новый skill → каталог
skills/<name>/сSKILL.md. Frontmatter:name,description, опциональноargument-hint,arguments,allowed-tools,disable-model-invocation,paths,model,effort.Новый hook → редактируй
hooks/hooks.json. Доступные события см. hooks reference.Бинарь → положи в
bin/<name>+ chmod +x. Автоматически попадёт в PATH.
После любых изменений: /reload-plugins в Claude Code (рестарт не нужен).
Channel-режим
Channels (research preview Claude Code v2.1.80+) —
двусторонний bridge: входящие Telegram-сообщения сами появляются в активной
Claude-сессии как XML-теги, Claude отвечает обратно через send_message.
Что под капотом
В
.mcp.jsonплагин выставляетCLAUDEGRAM_CHANNEL_MODE=1→server/main.pyобъявляет experimental capabilitiesclaude/channelиclaude/channel/permissionчерез кастомный stdio-runner (FastMCP сам не умеет — обходим через_mcp_server.create_initialization_options(experimental_capabilities=...)).server/channel.pyподписывается на Telethon@client.on(events.NewMessage(incoming=True)).Каждое входящее от ID из allowlist (
tg_allowed_sender_ids) пушится как rawJSONRPCNotification(method='notifications/claude/channel', ...)напрямую через write_stream stdio-сессии.Тег у Claude выглядит так:
<channel source="claudegram" chat_id="-1001234567890" message_id="42" sender_id="111222333" user="Pete"> привет, как дела? </channel>Skill
tg-channel-incoming(auto-active) объясняет Claude'у, что делать с такими тегами + правила безопасности (никакого автоответа без подтверждения).Permission relay: ответные сообщения вида
yes abcde/no abcde(5 строчных букв безl, regex case-insensitive) парсятся как verdict и шлются обратно какnotifications/claude/channel/permission— Claude Code применяет автоматически.
Включение
Channel-режим opt-in через userConfig поле enable_channel_mode:
В
/pluginинтерфейсе или при первой установке выставиenable_channel_mode = "1".Перезапусти Claude Code с обоими флагами:
claude \ --dangerously-load-development-channels plugin:claudegram@claudegram-local \ --channels plugin:claudegram@claudegram-localВ research preview кастомные плагины не входят в Anthropic allowlist (
--dangerously-load-development-channels), а--channelsявно регистрирует listener — оба флага нужны.
Если enable_channel_mode = "0" (default) — сервер работает только как tools-MCP,
push'и не отсылаются, Telegram-rate-limit не тратится.
Удобно завести алиас в ~/.zshrc:
alias claude-tg='claude --dangerously-load-development-channels plugin:claudegram@claudegram-local --channels plugin:claudegram@claudegram-local'Безопасность
Слой | Защита |
Sender gate |
|
Группы | Гейтим по |
Permission relay | Декларируем |
Skill | Обязывает Claude показывать draft и ждать "отправляй" перед |
Hook |
|
Узнать свой sender_id для allowlist
После авторизации (claudegram-auth) — спроси у @userinfobot
или вызови в активной Claude-сессии mcp__plugin_claudegram_claudegram__get_me.
Roadmap
Outbound permission_request handler — Claude Code шлёт
notifications/claude/channel/permission_requestкогда нужен approval; форвардить юзеру в Telegram. Сейчас inbound verdict работает, outbound forward — TODO (требует регистрации custom notification_handler в Server, не тривиально через FastMCP).send media (фото/документ/голосовое) — Telethon
send_fileуже умеет, обернуть в tool.pin / unpin / mute / archive / set_typing диалогов.
Stories API (Telegram Stories через MTProto).
Monitor на бэкап Saved Messages (
monitors/monitors.json).Submit в Anthropic official marketplace — channel-плагины проходят security review, после чего работают без
--dangerously-load-development-channels.Marketplace на GitHub + git-теги
claudegram--v0.1.0для version-constraints.
Available Tools
133 toolsadd_contactB
Добавить пользователя в контакты.
Args: user: id или @username существующего юзера. phone: опционально (можно пустое). add_phone_privacy_exception: разрешить юзеру видеть твой номер.
Inputs: user (required), first_name (required), phone, last_name, +1 more. Returns: object
archive_dialogB
Переместить диалог в архив (folder=1).
Inputs: chat (required). Returns: object
archive_dialogsCDestructive
Перенести N диалогов в архив.
Inputs: chat_ids (required), ctx. Returns: object
auth_cancelA
Отменить незавершённый auth-flow (если запросил код, но не ввёл).
Inputs: no named parameters. Returns: object
auth_request_codeA
Шаг 1: запросить SMS-код у Telegram. Очищает предыдущий auth-state.
Возвращает: ok: True если код отправлен code_sent: True phone: куда отправлен (масковано последние 4 цифры) already_authorized: True если сессия уже валидна (код не нужен)
Inputs: no named parameters. Returns: object
auth_submit_codeA
Шаг 2: отправить код (и опц. пароль 2FA).
Args: code: 5-значный SMS-код из Telegram. password_2fa: пароль cloud-2FA если включён. Если опущен и 2FA требуется — вернётся ошибка с просьбой повторить.
Inputs: code (required), password_2fa. Returns: object
ban_participantADestructive
Забанить участника навсегда — он не сможет вернуться.
Inputs: chat (required), user (required). Returns: object
block_userADestructive
Заблокировать пользователя — он не сможет писать.
Args: my_stories_from: True — добавить только в story-blocklist.
Inputs: user (required), my_stories_from. Returns: object
clear_draftBDestructive
Очистить draft в чате (синхронизация на все устройства).
Inputs: chat (required). Returns: object
click_inline_buttonA
Нажать inline-кнопку под сообщением бота.
Args:
button_text: текст кнопки (точное совпадение).
button_index: альтернатива — flat-индекс кнопки (через все ряды).
Передай либо button_text, либо button_index.
Inputs: chat (required), message_id (required), button_text, button_index. Returns: object
create_channelB
Создать канал (broadcast=True) или супергруппу (megagroup=True).
Args: broadcast: True — broadcast-канал (только админы пишут). megagroup: True — супергруппа.
Inputs: title (required), about, broadcast, megagroup. Returns: object
create_dialog_filterA
Создать/обновить кастомную папку диалогов.
Args: filter_id: уникальный id папки (2-255). 1 — резерв All. title: название (отображается в табе). emoticon: эмодзи иконки. included_chats: список id/@username включённых чатов. contacts/non_contacts/groups/broadcasts/bots: автоматически включать чаты этой категории. exclude_muted/read/archived: исключать соответствующие.
Inputs: title (required), filter_id (required), included_chats (required), bots, +8 more. Returns: object
create_forum_topicC
Создать новую тему в forum-супергруппе.
Args: icon_color: hex int цвета иконки (опционально, для дефолтных эмодзи). icon_emoji_id: id custom-emoji для иконки.
Inputs: chat (required), title (required), icon_color, icon_emoji_id. Returns: object
create_groupC
Создать обычную группу с указанными участниками.
Inputs: title (required), users (required). Returns: object
delete_contactCDestructive
Удалить пользователя из контактов.
Inputs: user (required). Returns: object
delete_dialogADestructive
Покинуть чат/канал или удалить личный диалог.
Args: revoke: True — удалить переписку и у собеседника (только PM).
Inputs: chat (required), revoke. Returns: object
delete_dialog_filterBDestructive
Удалить кастомную папку диалогов.
Inputs: filter_id (required). Returns: object
delete_dialogsADestructive
Удалить N диалогов одним MCP-вызовом.
Для supergroups = leave + delete dialog. Для PM = clear history (revoke=False) или revoke=True (PM only — у собеседника тоже).
Args: chat_ids: список int/str id диалогов. revoke: только для PM — удалить и у собеседника. auto_floodwait_retry: при FloodWait sleep'ить и продолжать. max_total_wait_seconds: верхний предел total sleep.
Inputs: chat_ids (required), ctx, revoke, auto_floodwait_retry, +1 more. Returns: object
delete_forum_topicADestructive
Удалить тему вместе со всеми сообщениями.
Inputs: chat (required), topic_id (required). Returns: object
delete_messageADestructive
Удалить сообщения. По умолчанию — только у себя.
Args: revoke: True — у всех (необратимо). При revoke=True вызывает elicit для подтверждения и параллельно срабатывает PreToolUse hook.
Inputs: chat (required), message_ids (required), revoke. Returns: object
delete_scheduledADestructive
Удалить отложенные сообщения (до их отправки).
Inputs: chat (required), message_ids (required). Returns: object
delete_storiesCDestructive
Удалить свои истории.
Inputs: story_ids (required). Returns: object
demote_adminADestructive
Снять права админа (все флаги в False).
Inputs: chat (required), user (required). Returns: object
dialog_statsARead-onlyIdempotent
Счётчики диалогов по типам — без payload, 1 запрос.
Возвращает: total / pm_users / bots / channels / supergroups / basic_groups / archived / pinned / unread.
Inputs: no named parameters. Returns: object
download_mediaA
Скачать медиа из сообщения.
Args: download_dir: куда писать (если roots заявлены — путь валидируется). thumb_index: если задан — скачать только превью указанного индекса. inline: True — вернуть Image/Audio inline (≤1 MB) вместо файла.
Inputs: chat (required), message_id (required), inline, thumb_index, +1 more. Returns: object
download_profile_photoA
Скачать аватарку юзера/чата на диск или inline (base64 в ответе).
Args: download_big: True — большая (640x640); False — маленькая (160x160). inline: True — вернуть фото как ImageContent inline (≤ 1 MB), False — записать в файл и вернуть путь.
Inputs: chat (required), inline, download_big, download_dir. Returns: object
edit_chat_aboutB
Установить описание чата (about/bio).
Inputs: chat (required), about (required). Returns: object
edit_chat_photoC
Установить аватарку чата/канала из файла.
Inputs: chat (required), file_path (required). Returns: object
edit_chat_titleC
Переименовать чат/канал.
Inputs: chat (required), title (required). Returns: object
edit_forum_topicA
Редактировать тему: переименовать, закрыть, скрыть.
Args: hidden: только для General-темы (id=1) — спрятать из шапки.
Inputs: chat (required), topic_id (required), title, closed, +2 more. Returns: object
edit_messageA
Отредактировать своё сообщение.
Inputs: chat (required), text (required), message_id (required), parse_mode, +1 more. Returns: object
export_chat_inviteA
Создать invite-ссылку на чат/канал.
Args: expire_unix: до когда действует. None = бессрочно. usage_limit: на сколько использований. request_needed: True — кандидаты ждут approval. title: метка ссылки (для аудита в админке).
Inputs: chat (required), title, expire_unix, usage_limit, +1 more. Returns: object
forward_messageC
Переслать сообщения из одного чата в другой.
Inputs: to_chat (required), from_chat (required), message_ids (required), silent, +1 more. Returns: result
get_admin_logCRead-onlyIdempotent
Журнал действий админов в супергруппе/канале.
Inputs: chat (required), limit, search. Returns: result
get_all_storiesARead-onlyIdempotent
Все доступные истории из ленты (по подпискам).
Inputs: no named parameters. Returns: result
get_app_configARead-onlyIdempotent
Конфигурация клиента (флаги фич, premium-лимиты, gifts и т.д.).
Возвращает raw config JSON — много ключей, нужно искать по имени.
Inputs: no named parameters. Returns: object
get_authorizationsARead-onlyIdempotent
Список активных сессий аккаунта (другие устройства/клиенты).
Полезно для аудита: "кто сейчас залогинен в мой аккаунт".
Inputs: no named parameters. Returns: result
get_blockedARead-onlyIdempotent
Список заблокированных юзеров.
Args: my_stories_from: True — story-blocklist; False — основной.
Inputs: limit, offset, my_stories_from. Returns: result
get_chat_infoARead-onlyIdempotent
Подробная инфа о любом entity: пользователе/чате/канале/боте.
Inputs: chat (required). Returns: id, type, phone, title, +6 more
get_common_chatsCRead-onlyIdempotent
Общие чаты с указанным юзером.
Inputs: user (required), limit. Returns: result
get_contactsARead-onlyIdempotent
Список всех контактов аккаунта.
Inputs: no named parameters. Returns: result
get_countries_listARead-onlyIdempotent
Список всех стран с phone-кодами (для интерфейса добавления контактов).
Args: lang_code: 'en', 'ru', etc. — язык названий.
Inputs: lang_code. Returns: result
get_dialog_filtersARead-onlyIdempotent
Список кастомных папок диалогов (Folders в UI Telegram).
Inputs: no named parameters. Returns: result
get_dialogs_by_idsARead-onlyIdempotent
Получить informация о N конкретных диалогах одним вызовом.
Полезно для batch-проверки is_pinned/unread перед массовой операцией.
Inputs: chat_ids (required), compact. Returns: result
get_draftsARead-onlyIdempotent
Список несохранённых черновиков по всем чатам.
Inputs: no named parameters. Returns: result
get_forum_topicsARead-onlyIdempotent
Список тем в forum-супергруппе.
Args: limit: 1-100. search: фильтр по названию темы. offset_id / offset_topic: пагинация.
Inputs: chat (required), limit, search, offset_id, +1 more. Returns: result
get_forum_topics_by_idBRead-onlyIdempotent
Получить конкретные темы по их id.
Inputs: chat (required), topic_ids (required). Returns: result
get_full_userARead-onlyIdempotent
Расширенная инфа о пользователе (bio, общие чаты, premium, etc).
Args: user: id/@username; None = я сам.
Inputs: user. Returns: object
get_historyARead-onlyIdempotent
Сообщения чата (новые → старые по умолчанию).
Args:
limit: 1-200.
offset_id: вернуть старше указанного id (пагинация).
min_id / max_id: границы id.
from_user: id/@username — фильтровать по отправителю.
reverse: True — от старых к новым.
ids: получить конкретные сообщения по id (без пагинации).
reply_to: показать сообщения треда/комментариев под этим id.
filter_type: media-фильтр: photo, video, document, voice,
music, gif, url, chat_photo, phone_call, roundvideo, mymentions.
scheduled: показать запланированные (а не уже отправленные) сообщения.
Inputs: chat (required), ids, limit, max_id, +7 more. Returns: result
get_history_with_linksARead-onlyIdempotent
Гибрид: компактные text-блоки + ResourceLink на каждое сообщение.
Клиент видит дешёвый список и может догрузить полное сообщение
через telegram://msg/{chat_id}/{message_id} ресурс.
Inputs: chat (required), limit. Returns: result
get_input_peerARead-onlyIdempotent
Получить InputPeer для чата (нужен для raw API вызовов).
Возвращает dict с _, который можно положить в kwargs_json для invoke_raw.
Inputs: chat (required). Returns: object
get_installed_stickersARead-onlyIdempotent
Список установленных стикерсетов.
Inputs: no named parameters. Returns: result
get_meARead-onlyIdempotent
Информация о текущем авторизованном пользователе.
Inputs: no named parameters. Returns: id, type, phone, title, +6 more
get_media_infoBRead-onlyIdempotent
Метаданные медиа в сообщении (тип, размер, mime, dimensions, duration).
Inputs: chat (required), message_id (required). Returns: object
get_nearest_dcARead-onlyIdempotent
Ближайший Telegram DC по geo (используется для оптимизации).
Inputs: no named parameters. Returns: object
get_participantsARead-onlyIdempotent
Список участников группы/канала.
Args: limit: 1-200. filter_admin/kicked/banned/bots/recent: показать только эту категорию. aggressive: для каналов с >200 участников — итерировать через индексные search-страницы (медленнее, но даёт больше).
Inputs: chat (required), limit, search, aggressive, +5 more. Returns: result
get_password_infoARead-onlyIdempotent
Информация о настроенном 2FA-пароле (включён ли, hint, recovery email).
НЕ возвращает сам пароль — только метаданные.
Inputs: no named parameters. Returns: object
get_peer_storiesARead-onlyIdempotent
Активные истории конкретного юзера/канала.
Inputs: peer (required). Returns: result
get_pinned_storiesCRead-onlyIdempotent
Закреплённые (сохранённые в профиле) истории юзера.
Inputs: peer (required), limit, offset_id. Returns: result
get_poll_resultsARead-onlyIdempotent
Текущие результаты опроса (количество голосов на вариант).
Inputs: chat (required), message_id (required). Returns: object
get_privacyARead-onlyIdempotent
Получить текущие privacy-настройки для указанного ключа.
Args:
key: один из last_seen, profile_photo, phone_call, phone_p2p,
phone_number, added_by_phone, forwards, chat_invite,
voice_messages, about, birthday.
Inputs: key (required). Returns: object
get_profile_photosARead-onlyIdempotent
Список фото профиля юзера/группы/канала (метаданные, без скачивания).
Args: offset: пропустить N фото с начала. max_id: вернуть фото старше указанного id.
Inputs: chat (required), limit, max_id, offset. Returns: result
get_scheduled_messagesARead-onlyIdempotent
Список отложенных сообщений в чате (которые ещё не отправлены).
Inputs: chat (required). Returns: result
get_server_versionARead-onlyIdempotent
Версия Claudegram + Telethon + MCP SDK.
Inputs: no named parameters. Returns: mcp, python, telethon, claudegram
get_stars_balanceARead-onlyIdempotent
Текущий баланс Telegram Stars (внутренняя валюта).
Inputs: no named parameters. Returns: object
get_stars_transactionsARead-onlyIdempotent
История Stars-транзакций (покупки/расходы).
Args: inbound: только пополнения. outbound: только списания. ascending: True — старые первыми.
Inputs: limit, inbound, outbound, ascending. Returns: result
get_statsARead-onlyIdempotent
Статистика канала/супергруппы (только если ты админ).
Inputs: chat (required). Returns: object
get_sticker_setARead-onlyIdempotent
Получить стикерсет по short_name (например 'AnimatedEmojies').
Возвращает метаданные сета + список первых 10 стикеров (id + emoji).
Inputs: short_name (required). Returns: object
get_stories_archiveCRead-onlyIdempotent
Архив моих историй (истёкшие, но не удалённые).
Inputs: limit, offset_id. Returns: result
get_stories_by_idBRead-onlyIdempotent
Получить конкретные истории по их id.
Inputs: peer (required), story_ids (required). Returns: result
get_story_viewsARead-onlyIdempotent
Кто посмотрел мою story.
Args: just_contacts: только контакты (не все 1000+ зрителей). reactions_first: сначала те, кто оставил реакцию.
Inputs: story_id (required), limit, just_contacts, reactions_first. Returns: object
get_telegram_configARead-onlyIdempotent
Базовый конфиг Telegram-сети (DC, лимиты файлов, edit_time_limit и т.д.).
Inputs: no named parameters. Returns: object
get_top_peersBRead-onlyIdempotent
Топ часто-используемых контактов в указанной категории.
Args: category: 'correspondents' (личные чаты), 'bots_pm', 'bots_inline', 'phone_calls', 'forward_users', 'forward_chats', 'groups', 'channels', 'bots_app'.
Inputs: limit, category. Returns: result
health_checkARead-onlyIdempotent
Проверка работоспособности: соединение с Telegram, валидность сессии.
Args:
force_reconnect: True — сбросить singleton-клиент и переподключиться.
Полезно после claudegram-auth, если сервер закэшировал старое
no-auth состояние.
Возвращает HealthReport со всеми полями даже при ошибке — включая session_path/session_exists/data_dir для диагностики path mismatch между CLI и MCP-сервером.
Inputs: force_reconnect. Returns: ok, message, self_id, data_dir, +7 more
import_contactsA
Массовый импорт контактов по номерам телефона (без знания Telegram-ID).
Args:
contacts: список dict'ов с ключами phone, first_name, last_name.
Inputs: contacts (required). Returns: result
inline_queryA
Сделать inline-запрос к боту (как @bot query в любом чате).
Возвращает список результатов, которые бот хочет показать.
Inputs: bot (required), query (required), limit, offset. Returns: result
install_sticker_setB
Установить стикерсет аккаунту.
Args: archived: True — добавить в архивированные (не показывать активно).
Inputs: short_name (required), archived. Returns: object
invoke_rawA
Вызвать произвольный Telegram MTProto-метод через Telethon.
Args: method_path: полный python-путь, например 'telethon.tl.functions.users.GetFullUserRequest'. kwargs_json: JSON-строка с kwargs для конструктора метода.
⚠️ Опасный tool — может изменить состояние аккаунта или вызвать flood-wait. Используй только когда нужного high-level метода нет.
Inputs: method_path (required), kwargs_json. Returns: object
join_chatA
Войти в публичный канал/группу (по @username или ссылке-приглашению).
Inputs: chat (required). Returns: object
kick_participantADestructive
Кикнуть участника из чата (он сможет вернуться).
Inputs: chat (required), user (required). Returns: object
leave_chatCDestructive
Выйти из канала/супергруппы.
Inputs: chat (required). Returns: object
leave_chatsBDestructive
Выйти из N каналов/супергрупп одним вызовом.
Inputs: chat_ids (required), ctx, auto_floodwait_retry, max_total_wait_seconds. Returns: object
list_botsCRead-onlyIdempotent
PM-боты в диалогах.
Inputs: limit, compact, archived, is_pinned. Returns: result
list_channelsARead-onlyIdempotent
Только broadcast-каналы (без supergroup'ов).
Args: archived: 'main' — основной список, 'archive' — только архив, 'both' — всё. Default 'both' — включает архивные. limit: верхняя граница по сырому фетчу диалогов до фильтрации. only_unread: True — только с unread_count > 0. is_pinned: 'any' / 'pinned' / 'unpinned'. min_participants / max_participants: фильтр по подписчикам. compact: default True — payload в ~5x меньше.
Inputs: limit, compact, archived, is_pinned, +3 more. Returns: result
list_chatsARead-onlyIdempotent
Список всех диалогов (юзеры/боты/группы/каналы — без фильтра).
Args: compact: True — облегчённая форма (id/name/type/is_pinned/unread/...) ~85% меньше payload.
Для типизированных списков см. list_channels, list_groups, list_bots.
Inputs: limit, compact, archived, only_unread, +1 more. Returns: result
list_groupsCRead-onlyIdempotent
Группы и супергруппы.
Args: include_supergroups: False — только old-style basic groups. is_pinned/min_participants/max_participants/compact — см. list_channels.
Inputs: limit, compact, archived, is_pinned, +4 more. Returns: result
list_pm_usersBRead-onlyIdempotent
Личные чаты с юзерами (без ботов).
Inputs: limit, compact, archived, is_pinned, +1 more. Returns: result
mark_readA
Пометить сообщения чата прочитанными.
Args: max_id: до какого id (0 — все). clear_mentions: ещё и сбросить @упоминания.
Inputs: chat (required), max_id, clear_mentions. Returns: object
mark_stories_readB
Пометить истории прочитанными до указанного id.
Inputs: peer (required), max_story_id (required). Returns: object
mute_dialogA
Замьютить уведомления чата.
Args: mute_until_unix: до какого UNIX timestamp (UTC). None = навсегда (2^31). show_previews: показывать текст превью в notification. silent: без звука уведомлений. stories_muted: True — также замьютить stories этого источника.
Inputs: chat (required), silent, show_previews, stories_muted, +1 more. Returns: object
pin_dialogB
Закрепить/открепить диалог в шапке списка.
Inputs: chat (required), pinned. Returns: object
pin_forum_topicC
Закрепить/открепить тему в шапке.
Inputs: chat (required), topic_id (required), pinned. Returns: object
pin_messageA
Закрепить сообщение в чате.
Args: notify: True — отправить уведомление участникам о новом pin. pm_oneside: только в PM — закрепить только у себя, не у собеседника.
Inputs: chat (required), message_id (required), notify, pm_oneside. Returns: object
promote_adminB
Назначить участника администратором с заданными правами.
Inputs: chat (required), user (required), rank, anonymous, +14 more. Returns: object
react_messageA
Поставить реакцию-эмодзи на сообщение.
Args: emoji: 1 эмодзи (👍, ❤️, 🔥). Пустая строка — снять все реакции. big: показать с анимацией "большой реакции". add_to_recent: добавить эмодзи в "недавно использованные".
Inputs: chat (required), emoji (required), message_id (required), big, +1 more. Returns: object
reorder_pinned_forum_topicsA
Переставить порядок закреплённых тем.
Args: topic_ids_in_order: id тем в нужном порядке. force: True — снять pin с тем, не указанных в списке.
Inputs: chat (required), topic_ids_in_order (required), force. Returns: object
resolve_usernameARead-onlyIdempotent
Найти entity по @username и вернуть инфу + id.
Inputs: username (required). Returns: id, type, phone, title, +6 more
restrict_participantADestructive
Ограничить права участника супергруппы (read-only mute и т.п.).
В ChatBannedRights каждый bool=True означает ЗАПРЕТ соответствующего действия. send_*=False → разрешено отправлять (стандартный участник). send_*=True → запрещено (mute).
Args: until_unix: до какого UNIX timestamp; None = навсегда.
Inputs: chat (required), user (required), send_gifs, send_media, +8 more. Returns: object
save_draftA
Сохранить серверный draft в чате (синхронизируется на все устройства).
Args: text: текст; пустая строка очищает draft. parse_mode: подсказка клиенту, как парсить при отправке (фактическое форматирование происходит в момент отправки сообщения).
Inputs: chat (required), text (required), reply_to, parse_mode, +1 more. Returns: object
search_globalARead-onlyIdempotent
Глобальный поиск по юзерам/чатам/каналам по имени или @username.
Inputs: query (required), limit. Returns: result
search_messagesARead-onlyIdempotent
Поиск сообщений по тексту глобально или в чате.
Inputs: query (required), chat, limit, from_user. Returns: result
search_sticker_setsBRead-onlyIdempotent
Поиск стикерсетов по имени (Telegram-каталог).
Args: exclude_featured: исключить из выдачи featured-наборы.
Inputs: query (required), exclude_featured. Returns: result
send_albumA
Отправить альбом из 2-10 фото/видео одной группой.
Caption ставится только на первое медиа альбома.
Inputs: chat (required), file_paths (required), silent, caption, +1 more. Returns: result
send_contactC
Отправить визитку контакта.
Inputs: chat (required), phone (required), first_name (required), silent, +1 more. Returns: object
send_diceA
Отправить интерактивный «кубик».
Args: emoji: 🎲 (кубик), 🎯 (дартс), 🏀 (баскетбол), ⚽ (футбол), 🎰 (слот), 🎳 (боулинг). Telegram пришлёт случайный результат.
Inputs: chat (required), emoji, silent. Returns: object
send_fileA
Отправить файл. Telethon сам определит тип (фото/видео/документ).
Args: file_path: путь к локальному файлу. caption: подпись (поддерживает форматирование, см. parse_mode). parse_mode: 'markdown', 'html' или 'none'. force_document: True — отправить как документ, не сжимать. voice_note: True — отправить голосовое (требует .ogg/.mp3). video_note: True — отправить video-кружок. ttl_seconds: self-destruct таймер (только для PM, 1-60 сек). clear_draft: очистить draft чата после отправки. supports_streaming: для видео — отметить как streamable. custom_filename: заменить имя файла при отправке.
Inputs: chat (required), file_path (required), silent, caption, +9 more. Returns: object
send_locationB
Отправить геолокацию.
Args: live_period: если задан (60-86400) — отправить как live-локацию.
Inputs: chat (required), latitude (required), longitude (required), silent, +1 more. Returns: object
send_messageA
Отправить текстовое сообщение.
Args: chat: id или @username получателя. text: текст сообщения. reply_to: id сообщения, на которое отвечаем. silent: без звука уведомления. parse_mode: 'markdown', 'html' или 'none' для plain-text. link_preview: показывать превью первой ссылки. schedule_unix: если задан — отправить отложенно на UNIX-таймстамп (UTC). comment_to: id поста в канале — отправить как комментарий (требует у канала включённой обсуждаемой группы). clear_draft: очистить draft чата после отправки.
Inputs: chat (required), text (required), silent, reply_to, +5 more. Returns: object
send_pollA
Создать и отправить опрос.
Args: options: 2-10 вариантов ответа. anonymous: голоса без видимости кто как голосовал. multiple_choice: можно выбрать несколько вариантов. quiz: режим викторины (один правильный ответ + объяснение). correct_option_index: индекс правильного варианта (для quiz=True). explanation: пояснение, показываемое после голосования (quiz). close_period_seconds: автозакрытие через N секунд (5-600 на момент API layer 215). close_unix: автозакрытие на UNIX-таймстамп. revoting_disabled: True — нельзя сменить голос (для викторин). shuffle_answers: True — порядок вариантов рандомизируется на каждом устройстве.
Inputs: chat (required), options (required), question (required), quiz, +9 more. Returns: object
send_scheduled_nowC
Принудительно отправить отложенные сообщения сейчас.
Inputs: chat (required), message_ids (required). Returns: result
send_sticker_by_idB
Отправить стикер по document_id (получи через get_sticker_set).
Args:
document_id: id стикер-документа.
access_hash: access_hash набора (поле set.access_hash).
sticker_set_short_name: short_name набора-источника.
Inputs: chat (required), access_hash (required), document_id (required), sticker_set_short_name (required), +2 more. Returns: object
send_storyA
Опубликовать новую story с фото/видео.
Args: media_path: путь к фото или видео. caption: подпись. period_seconds: время жизни (6/12/24/48 часов = 21600/43200/86400/172800). privacy: 'everyone' / 'contacts' / 'close_friends' / 'self' (никто кроме меня). pinned: True — сразу закрепить в профиле бессрочно. noforwards: запретить forward.
Inputs: media_path (required), pinned, caption, privacy, +2 more. Returns: object
send_video_noteA
Отправить video-кружок (.mp4 → круглое видео ≤60s, диаметр 384px).
Inputs: chat (required), file_path (required), silent, reply_to, +1 more. Returns: object
send_voiceA
Отправить голосовое сообщение (.ogg/.mp3 → opus voice note).
Inputs: chat (required), file_path (required), silent, caption, +2 more. Returns: object
set_onlineA
Установить online/offline статус.
Args: offline: True — пометить аккаунт как offline (не показывать "online" зелёный кружок).
Inputs: offline. Returns: object
set_privacyA
Установить privacy для указанного ключа.
Args: key: см. get_privacy. value: 'everyone', 'contacts', 'close_friends', 'nobody', 'nobody_contacts'.
Inputs: key (required), value. Returns: object
set_typingA
Послать сигнал активности в чат (печатает / записывает / отправляет).
Args:
chat: id или @username чата.
action: тип активности — typing для текста, record-audio перед
голосовым, cancel чтобы снять текущий статус и т.д.
delay_seconds: на сколько секунд держать статус (0 — мгновенный сигнал).
Inputs: chat (required), action, delay_seconds. Returns: object
start_botA
Запустить бота (отправить /start) с deep-link параметром.
Args:
bot: id/@username бота.
chat: куда добавлять бота. None = личный чат с ботом.
start_param: deep-link payload (часть после ?start=).
Inputs: bot (required), chat, start_param. Returns: object
summarize_chatARead-onlyIdempotent
Резюме последних N сообщений чата через LLM-вызов клиента.
Args: chat: id или @username. limit: 1-200 сообщений. instruction: дополнительная инструкция для модели (например, "сделай маркированный список", "выдели action items").
Если клиент не поддерживает sampling — возвращает сырые сообщения и просит юзера резюмировать самому.
Inputs: chat (required), limit, instruction. Returns: object
terminate_authorizationADestructive
Завершить чужую активную сессию по hash из get_authorizations.
Свою (current=true) сессию через этот метод завершить нельзя.
Inputs: hash_str (required). Returns: object
toggle_forum_modeA
Включить/выключить forum-режим (темы) в супергруппе.
Требует ≥200 участников. После включения супергруппа становится "форумом".
Inputs: chat (required), tabs, enabled. Returns: object
toggle_pinned_storiesA
Закрепить/открепить мои stories в профиле (доступно бессрочно).
Inputs: story_ids (required), pinned. Returns: object
transcribe_audioARead-onlyIdempotent
Транскрибировать голосовое в текст (Telegram Premium фича).
Возвращает текст или partial-транскрипцию + флаг pending.
Inputs: chat (required), message_id (required). Returns: object
unarchive_dialogA
Вернуть диалог из архива в основной список (folder=0).
Inputs: chat (required). Returns: object
unban_participantC
Снять бан с участника.
Inputs: chat (required), user (required). Returns: object
unblock_userC
Разблокировать пользователя.
Inputs: user (required), my_stories_from. Returns: object
uninstall_sticker_setA
Удалить стикерсет из аккаунта.
Inputs: short_name (required). Returns: object
unmute_dialogB
Снять mute с чата (вернуть дефолтные настройки).
Inputs: chat (required). Returns: object
unpin_messageA
Открепить одно сообщение или все pinned в чате.
Args: message_id: если задан — открепить конкретное; None — открепить все.
Inputs: chat (required), message_id. Returns: object
update_profileA
Изменить отображаемое имя/фамилию/био собственного профиля.
None в поле = не менять. Пустая строка = очистить.
Inputs: about, last_name, first_name. Returns: object
update_usernameA
Сменить @username аккаунта (пустая строка — снять username).
Inputs: username (required). Returns: object
vote_pollC
Проголосовать в poll.
Args: option_indices: 0-based индексы выбранных вариантов (один — для обычного, несколько — для multiple_choice).
Inputs: chat (required), message_id (required), option_indices (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 133 tools
With 133 tools, some overlap exists between entity lookups (get_chat_info, resolve_username, get_input_peer) and message history variants (get_history, get_history_with_links), but most tools target distinct actions or resources. Descriptions are detailed enough to resolve ambiguity in most cases.
All tools follow a consistent lowercase verb_noun snake_case pattern (e.g., get_history, send_message, create_channel). No mixed conventions or camelCase found.
At 133 tools, the set is extremely large, far exceeding practical MCP server scope. While Telegram is a broad domain, this creates significant navigation and selection overhead, and most servers operate effectively with far fewer tools.
The tool surface covers nearly all Telegram features: auth, messaging, media, stickers, polls, stories, forums, admin, contacts, privacy, and more. The presence of invoke_raw ensures no capability gap, making the set highly complete for its domain.
Maintenance
Related MCP Connectors
Hosted Telegram MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Hosted X (Twitter) MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Telegram bridge for your MCP-compatible agent. Bidirectional, no LLM in our stack.
Augments MCP Server - A comprehensive framework documentation provider for Claude Code
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA simple MCP server that allows Claude to access your Telegram account to read and send messages on your behalf.7Apache 2.0
- AlicenseNot gradedqualityDmaintenanceEnables MCP-compatible clients like Claude and Cursor to interact with Telegram accounts, supporting messaging, chat management, contacts, media, and admin operations via Telethon.Apache 2.0
- AlicenseNot gradedqualityCmaintenanceA Telegram integration for Claude, Cursor, and other MCP-compatible clients. It exposes over 80 tools for account, chat, message, contact, media, folder, and admin operations through the Model Context Protocol.Apache 2.0
- FlicenseNot gradedqualityDmaintenanceAn MCP server that sends and receives Telegram messages to a fixed contact, and triggers claude.ai routines for automatic replies.-