Skip to main content
Glama
Claudegram

Claudegram

by sanjar-x

TL;DR

Claudegram — production-grade плагин Claude Code, превращающий личный Telegram в управляемый AI-инструмент:

  • MTProto, не Bot API — видит всю переписку, истории, поиск, медиа, статистику.

  • 120 типизированных MCP-tools через FastMCP, разбиты на 9 доменов; покрыты safe_tool middleware с 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 доменам с подпакетами в server/tools/

Production middleware

safe_tool decorator с graceful FloodWait/RPCError handling, latency logging, sensitive-sanitization

Health probe

health_check + get_server_version для readiness/liveness

Channel-режим

Push входящих Telegram-сообщений в активную сессию Claude как <channel source="claudegram"> теги + permission relay (yes/no <id>)

Skills

6 skill'ов: tg-digest, tg-search, tg-history, tg-send, tg-reply + фоновые telegram-workflow и tg-channel-incoming

Hooks

SessionStart — авто-проверка авторизации; PreToolUse — гейт перед delete revoke=true (с jq/python3 fallback)

bin/

claudegram-auth — попадает в PATH Bash tool Claude Code (не в shell хоста); снаружи — uv run claudegram-auth

userConfig

Креденшелы + sender-allowlist запрашиваются GUI-промптом плагина, сенситивные в системном keychain

Persistent data

*.session живёт в ${CLAUDE_PLUGIN_DATA} — не теряется при апдейте плагина

Marketplace

.claude-plugin/marketplace.json — каталог из одного плагина для /plugin install

Структура

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

Стек

  • Python 3.14, uv

  • Telethon 1.43+ — MTProto-клиент

  • mcp[cli] 1.x — официальный SDK MCP

Установка

1. Получить API-креденшелы

  1. Открой https://my.telegram.org → API development tools.

  2. Создай приложение (любые App title / Short name).

  3. Скопируй api_id и api_hash.

2. Установить зависимости (uv создаст .venv/)

cd ~/Desktop/Claudegram
uv sync

3. Подключить плагин в Claude Code

Самый быстрый способ для разработки — --plugin-dir (грузит как сессионный плагин, без установки):

claude --plugin-dir ~/Desktop/Claudegram

Постоянная установка через локальный marketplace (marketplace.json уже включён в .claude-plugin/):

/plugin marketplace add ~/Desktop/Claudegram
/plugin install claudegram@claudegram-local

claudegram-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_online

  • Messages (11): send_message, edit_message, delete_message, forward_message, get_history, search_messages, mark_read, pin_message, unpin_message, react_message, send_dice

  • Dialogs (7): list_chats, get_drafts, archive_dialog, unarchive_dialog, delete_dialog, mute_dialog, unmute_dialog

  • Users (7): get_chat_info, resolve_username, get_participants, get_profile_photos, block_user, unblock_user, get_common_chats

  • Chats (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_stats

  • Media (7): download_media, download_profile_photo, send_file, send_album, send_location, send_contact, get_media_info

  • Contacts (4): get_contacts, add_contact, delete_contact, search_global

  • Polls (2): send_poll, vote_poll

  • Raw 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 capabilities claude/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) пушится как raw JSONRPCNotification(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:

  1. В /plugin интерфейсе или при первой установке выстави enable_channel_mode = "1".

  2. Перезапусти 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

parse_allowed_ids() в channel.py пушит только от ID из tg_allowed_sender_ids. Пустой allowlist = только себе (свой get_me().id).

Группы

Гейтим по event.sender_id, не chat_id — иначе любой в allowlisted-группе мог бы инжектить промпты.

Permission relay

Декларируем claude/channel/permission. Анonymously пушнувший в обход allowlist'а не получит право жать yes — verdict тоже гейтится по sender.

Skill tg-channel-incoming

Обязывает Claude показывать draft и ждать "отправляй" перед send_message. Запрещает реагировать на prompt-injection из тела сообщения.

Hook guard-delete

revoke=true для удаления требует явного approval даже из channel-сценария.

Узнать свой 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 tools
add_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_dialogsC
Destructive

Перенести 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_participantA
Destructive

Забанить участника навсегда — он не сможет вернуться.

Inputs: chat (required), user (required). Returns: object

block_userA
Destructive

Заблокировать пользователя — он не сможет писать.

Args: my_stories_from: True — добавить только в story-blocklist.

Inputs: user (required), my_stories_from. Returns: object

clear_draftB
Destructive

Очистить 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_contactC
Destructive

Удалить пользователя из контактов.

Inputs: user (required). Returns: object

delete_dialogA
Destructive

Покинуть чат/канал или удалить личный диалог.

Args: revoke: True — удалить переписку и у собеседника (только PM).

Inputs: chat (required), revoke. Returns: object

delete_dialog_filterB
Destructive

Удалить кастомную папку диалогов.

Inputs: filter_id (required). Returns: object

delete_dialogsA
Destructive

Удалить 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_topicA
Destructive

Удалить тему вместе со всеми сообщениями.

Inputs: chat (required), topic_id (required). Returns: object

delete_messageA
Destructive

Удалить сообщения. По умолчанию — только у себя.

Args: revoke: True — у всех (необратимо). При revoke=True вызывает elicit для подтверждения и параллельно срабатывает PreToolUse hook.

Inputs: chat (required), message_ids (required), revoke. Returns: object

delete_scheduledA
Destructive

Удалить отложенные сообщения (до их отправки).

Inputs: chat (required), message_ids (required). Returns: object

delete_storiesC
Destructive

Удалить свои истории.

Inputs: story_ids (required). Returns: object

demote_adminA
Destructive

Снять права админа (все флаги в False).

Inputs: chat (required), user (required). Returns: object

dialog_statsA
Read-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_logC
Read-onlyIdempotent

Журнал действий админов в супергруппе/канале.

Inputs: chat (required), limit, search. Returns: result

get_all_storiesA
Read-onlyIdempotent

Все доступные истории из ленты (по подпискам).

Inputs: no named parameters. Returns: result

get_app_configA
Read-onlyIdempotent

Конфигурация клиента (флаги фич, premium-лимиты, gifts и т.д.).

Возвращает raw config JSON — много ключей, нужно искать по имени.

Inputs: no named parameters. Returns: object

get_authorizationsA
Read-onlyIdempotent

Список активных сессий аккаунта (другие устройства/клиенты).

Полезно для аудита: "кто сейчас залогинен в мой аккаунт".

Inputs: no named parameters. Returns: result

get_blockedA
Read-onlyIdempotent

Список заблокированных юзеров.

Args: my_stories_from: True — story-blocklist; False — основной.

Inputs: limit, offset, my_stories_from. Returns: result

get_chat_infoA
Read-onlyIdempotent

Подробная инфа о любом entity: пользователе/чате/канале/боте.

Inputs: chat (required). Returns: id, type, phone, title, +6 more

get_common_chatsC
Read-onlyIdempotent

Общие чаты с указанным юзером.

Inputs: user (required), limit. Returns: result

get_contactsA
Read-onlyIdempotent

Список всех контактов аккаунта.

Inputs: no named parameters. Returns: result

get_countries_listA
Read-onlyIdempotent

Список всех стран с phone-кодами (для интерфейса добавления контактов).

Args: lang_code: 'en', 'ru', etc. — язык названий.

Inputs: lang_code. Returns: result

get_dialog_filtersA
Read-onlyIdempotent

Список кастомных папок диалогов (Folders в UI Telegram).

Inputs: no named parameters. Returns: result

get_dialogs_by_idsA
Read-onlyIdempotent

Получить informация о N конкретных диалогах одним вызовом.

Полезно для batch-проверки is_pinned/unread перед массовой операцией.

Inputs: chat_ids (required), compact. Returns: result

get_draftsA
Read-onlyIdempotent

Список несохранённых черновиков по всем чатам.

Inputs: no named parameters. Returns: result

get_forum_topicsA
Read-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_idB
Read-onlyIdempotent

Получить конкретные темы по их id.

Inputs: chat (required), topic_ids (required). Returns: result

get_full_userA
Read-onlyIdempotent

Расширенная инфа о пользователе (bio, общие чаты, premium, etc).

Args: user: id/@username; None = я сам.

Inputs: user. Returns: object

get_historyA
Read-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_input_peerA
Read-onlyIdempotent

Получить InputPeer для чата (нужен для raw API вызовов).

Возвращает dict с _, который можно положить в kwargs_json для invoke_raw.

Inputs: chat (required). Returns: object

get_installed_stickersA
Read-onlyIdempotent

Список установленных стикерсетов.

Inputs: no named parameters. Returns: result

get_meA
Read-onlyIdempotent

Информация о текущем авторизованном пользователе.

Inputs: no named parameters. Returns: id, type, phone, title, +6 more

get_media_infoB
Read-onlyIdempotent

Метаданные медиа в сообщении (тип, размер, mime, dimensions, duration).

Inputs: chat (required), message_id (required). Returns: object

get_nearest_dcA
Read-onlyIdempotent

Ближайший Telegram DC по geo (используется для оптимизации).

Inputs: no named parameters. Returns: object

get_participantsA
Read-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_infoA
Read-onlyIdempotent

Информация о настроенном 2FA-пароле (включён ли, hint, recovery email).

НЕ возвращает сам пароль — только метаданные.

Inputs: no named parameters. Returns: object

get_peer_storiesA
Read-onlyIdempotent

Активные истории конкретного юзера/канала.

Inputs: peer (required). Returns: result

get_pinned_storiesC
Read-onlyIdempotent

Закреплённые (сохранённые в профиле) истории юзера.

Inputs: peer (required), limit, offset_id. Returns: result

get_poll_resultsA
Read-onlyIdempotent

Текущие результаты опроса (количество голосов на вариант).

Inputs: chat (required), message_id (required). Returns: object

get_premium_promoB
Read-onlyIdempotent

Промо-материал Telegram Premium (фичи, цены).

Inputs: no named parameters. Returns: object

get_privacyA
Read-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_photosA
Read-onlyIdempotent

Список фото профиля юзера/группы/канала (метаданные, без скачивания).

Args: offset: пропустить N фото с начала. max_id: вернуть фото старше указанного id.

Inputs: chat (required), limit, max_id, offset. Returns: result

get_scheduled_messagesA
Read-onlyIdempotent

Список отложенных сообщений в чате (которые ещё не отправлены).

Inputs: chat (required). Returns: result

get_server_versionA
Read-onlyIdempotent

Версия Claudegram + Telethon + MCP SDK.

Inputs: no named parameters. Returns: mcp, python, telethon, claudegram

get_stars_balanceA
Read-onlyIdempotent

Текущий баланс Telegram Stars (внутренняя валюта).

Inputs: no named parameters. Returns: object

get_stars_transactionsA
Read-onlyIdempotent

История Stars-транзакций (покупки/расходы).

Args: inbound: только пополнения. outbound: только списания. ascending: True — старые первыми.

Inputs: limit, inbound, outbound, ascending. Returns: result

get_statsA
Read-onlyIdempotent

Статистика канала/супергруппы (только если ты админ).

Inputs: chat (required). Returns: object

get_sticker_setA
Read-onlyIdempotent

Получить стикерсет по short_name (например 'AnimatedEmojies').

Возвращает метаданные сета + список первых 10 стикеров (id + emoji).

Inputs: short_name (required). Returns: object

get_stories_archiveC
Read-onlyIdempotent

Архив моих историй (истёкшие, но не удалённые).

Inputs: limit, offset_id. Returns: result

get_stories_by_idB
Read-onlyIdempotent

Получить конкретные истории по их id.

Inputs: peer (required), story_ids (required). Returns: result

get_story_viewsA
Read-onlyIdempotent

Кто посмотрел мою story.

Args: just_contacts: только контакты (не все 1000+ зрителей). reactions_first: сначала те, кто оставил реакцию.

Inputs: story_id (required), limit, just_contacts, reactions_first. Returns: object

get_telegram_configA
Read-onlyIdempotent

Базовый конфиг Telegram-сети (DC, лимиты файлов, edit_time_limit и т.д.).

Inputs: no named parameters. Returns: object

get_top_peersB
Read-onlyIdempotent

Топ часто-используемых контактов в указанной категории.

Args: category: 'correspondents' (личные чаты), 'bots_pm', 'bots_inline', 'phone_calls', 'forward_users', 'forward_chats', 'groups', 'channels', 'bots_app'.

Inputs: limit, category. Returns: result

health_checkA
Read-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_participantA
Destructive

Кикнуть участника из чата (он сможет вернуться).

Inputs: chat (required), user (required). Returns: object

leave_chatC
Destructive

Выйти из канала/супергруппы.

Inputs: chat (required). Returns: object

leave_chatsB
Destructive

Выйти из N каналов/супергрупп одним вызовом.

Inputs: chat_ids (required), ctx, auto_floodwait_retry, max_total_wait_seconds. Returns: object

list_botsC
Read-onlyIdempotent

PM-боты в диалогах.

Inputs: limit, compact, archived, is_pinned. Returns: result

list_channelsA
Read-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_chatsA
Read-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_groupsC
Read-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_usersB
Read-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_usernameA
Read-onlyIdempotent

Найти entity по @username и вернуть инфу + id.

Inputs: username (required). Returns: id, type, phone, title, +6 more

restrict_participantA
Destructive

Ограничить права участника супергруппы (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_globalA
Read-onlyIdempotent

Глобальный поиск по юзерам/чатам/каналам по имени или @username.

Inputs: query (required), limit. Returns: result

search_messagesA
Read-onlyIdempotent

Поиск сообщений по тексту глобально или в чате.

Inputs: query (required), chat, limit, from_user. Returns: result

search_sticker_setsB
Read-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_chatA
Read-onlyIdempotent

Резюме последних N сообщений чата через LLM-вызов клиента.

Args: chat: id или @username. limit: 1-200 сообщений. instruction: дополнительная инструкция для модели (например, "сделай маркированный список", "выдели action items").

Если клиент не поддерживает sampling — возвращает сырые сообщения и просит юзера резюмировать самому.

Inputs: chat (required), limit, instruction. Returns: object

terminate_authorizationA
Destructive

Завершить чужую активную сессию по 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_audioA
Read-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

    B3.2/5.0

    Scored across 133 tools

    Disambiguation4/5

    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.

    Naming Consistency5/5

    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.

    Tool Count1/5

    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.

    Completeness5/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables 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
    • A
      license
      Not graded
      quality
      C
      maintenance
      A 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
    • F
      license
      Not graded
      quality
      D
      maintenance
      An MCP server that sends and receives Telegram messages to a fixed contact, and triggers claude.ai routines for automatic replies.
      -