agentsclimarketplace

Telegram workflow

Skill sanjar-x/claudegram/skills/telegram-workflow

Правила и контекст работы с личным Telegram-аккаунтом пользователя через MCP-сервер claudegram. Загружается, когда пользователь просит читать чаты, искать сообщения, отвечать кому-то в Telegram, делать сводку непрочитанных, управлять диалогами, создавать чаты/каналы, модерировать группу, скачивать медиа, управлять контактами, или вообще обращается к Telegram-аккаунту.From its SKILL.md

Install
npx -y skills add sanjar-x/claudegram --skill telegram-workflow

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 3 stars3 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

12.5 KB, as published. Nobody here has run it

Работа с Telegram через claudegram

MCP-сервер claudegram даёт доступ к личному аккаунту пользователя через MTProto (не бот). 58 типизированных tools, разбитых по категориям.

Базовые принципы безопасности

  1. Никогда не отправляй сообщения без явного подтверждения. Намерение «составить черновик» ≠ намерение отправить. Покажи проект текста и жди слов вроде «отправь / шли / да».
  2. delete_message(revoke=True) — необратимо. Дефолт False (только у себя). Hook guard-delete требует подтверждения. Не передавай True без явного запроса юзера.
  3. Не помечай прочитанным автоматически. mark_read — только по явной просьбе. Иначе пользователь потеряет визуальные индикаторы непрочитанного.
  4. Деструктивные операции на чатах: kick_participant, ban_participant, delete_dialog, leave_chat, terminate_authorization, block_user — всегда показывай action + entity и жди "да".
  5. Markdown в send_message/edit_message. Если в тексте есть *, _, [, ], ~, \``, и это **не** разметка — передай parse_mode="none"`, иначе Telegram упадёт с ParseMode-error.
  6. Сессия — это пароль. Файл *.session в ${CLAUDE_PLUGIN_DATA} даёт полный доступ к аккаунту. Никогда не предлагай пересылать его, копировать в чат, коммитить.
  7. invoke_raw — крайний инструмент. Используй только если нет high-level tool. Можешь случайно изменить состояние аккаунта или нарваться на flood-wait.

Каталог инструментов

Все имена под префиксом mcp__plugin_claudegram_claudegram__. Сгруппированы по модулям.

Identity / Account (server/tools/identity/account.py)

ToolНазначение
get_meКто я залогинен
get_authorizationsСписок активных сессий аккаунта (другие устройства)
terminate_authorizationЗавершить чужую сессию (по hash)
update_profileИзменить имя/фамилию/био
set_onlineOnline/offline статус

Messaging (server/tools/messaging/{messages,history,pins,reactions}.py)

ToolНазначение
send_messageОтправить (parse_mode, reply_to, silent, link_preview, schedule_unix)
edit_messageОтредактировать своё
delete_messageУдалить (revoke=False default)
forward_messageПереслать (silent, drop_author)
get_historyПоследние N (offset_id, min_id, from_user, reverse)
search_messagesПоиск по тексту (chat, from_user)
mark_readПрочитано (max_id, clear_mentions)
pin_messageЗакрепить (notify, pm_oneside)
unpin_messageОткрепить одно или все
react_messageПоставить эмодзи-реакцию ("" чтобы снять)
send_dice🎲/🎯/🏀/⚽/🎰/🎳

Dialogs (server/tools/dialogs/{list_,folders,notify}.py)

ToolНазначение
list_chatsСписок диалогов (archived, only_unread, ignore_pinned)
get_draftsНесохранённые черновики
archive_dialog / unarchive_dialogАрхив
delete_dialogПокинуть/удалить
mute_dialog / unmute_dialogУведомления

Peers (server/tools/peers/{lookup,users,contacts}.py)

ToolНазначение
get_chat_infoМетаданные entity
resolve_username@username → entity + id
get_participantsУчастники (search, filter_admin/kicked/banned)
get_profile_photosМетаданные аватарок
block_user / unblock_user(Раз)блокировать
get_common_chatsОбщие чаты с юзером

Chats (server/tools/chats/{create,settings,members,invites,admin}.py)

ToolНазначение
create_groupОбычная группа с участниками
create_channelКанал (broadcast=True) или супергруппа (megagroup=True)
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 (server/tools/media/{files,download,attachments,stickers}.py)

ToolНазначение
download_mediaСкачать вложение из сообщения
download_profile_photoСкачать аватарку
send_fileОтправить файл (force_document, voice_note, video_note)
send_album2-10 фото/видео одной группой
send_locationКоординаты (live_period для live-локации)
send_contactВизитка
get_media_infoМетаданные медиа без скачивания

Contacts (server/tools/peers/contacts.py)

ToolНазначение
get_contactsВсе контакты
add_contactДобавить (с phone_privacy_exception)
delete_contactУдалить
search_globalГлобальный поиск юзеров/чатов/каналов

Content / Polls (server/tools/content/polls.py)

ToolНазначение
send_pollОпрос (anonymous, multiple_choice, quiz + correct_option_index)
vote_pollПроголосовать (option_indices)

Advanced / Raw API (server/tools/advanced/raw.py)

ToolНазначение
invoke_rawВызов любого MTProto-метода через telethon.tl.functions.<...>
get_input_peerПолучить InputPeer для использования в invoke_raw

Идентификация чатов

  • Параметр chat принимает: целочисленный id (напр. -1001234567890), @username, или просто username без @.
  • Если пользователь говорит «напиши Пете» — сначала найди Петю через search_global или resolve_username. Не угадывай id.
  • Перед действиями над незнакомым чатом покажи get_chat_info — пусть пользователь подтвердит, что это правильный собеседник.
  • В групповых чатах для forward_message/pin_message используй полный signed id (-100<chan_id> для супергрупп). dialog_brief.peer_id возвращает уже правильный формат.

Типичные сценарии

«Что пропустил?» → list_chats(only_unread=true) → для каждого get_history(limit=unread_count) → сгруппированная сводка. Не зови mark_read.

«Найди про X» → если упомянут чат — resolve_username → search_messages(query, chat). Иначе глобальный поиск или search_global.

«Ответь Y кому-то» → найди чат → составь черновик → покажи + получатель → жди «отправляй» → send_message(reply_to=...) если ответ на конкретное сообщение.

«Скачай это видео» → get_history найди message_id → get_media_info для проверки → download_media(chat, message_id, download_dir).

«Создай группу с Васей и Петей» → resolve_username для каждого → собери список id → create_group(title, users) → жди подтверждения title'а перед созданием.

«Кто админы канала?» → get_participants(chat, filter_admin=True).

«Замьють чат до утра» → mute_dialog(chat, mute_until_unix=<завтра 9:00 UTC>). Перед — спроси подтверждение времени.

«Переименуй чат в …» → get_chat_info показать текущее название → edit_chat_title(chat, new_title) после подтверждения.

«Лайкни последнее» → get_history(chat, limit=1) → react_message(chat, message_id, emoji='👍').

«Отправь голосовое» → send_file(chat, '/path/to/voice.ogg', voice_note=True). Если файл не .ogg — сначала convert через ffmpeg (предложи команду юзеру).

«Сделай опрос: «Куда обедать?» с вариантами «Sushi/Pizza/Burger»» → send_poll(chat, question, options, anonymous=True) после подтверждения.

«Что в админ-логе?» → get_admin_log(chat, limit=50).

Пагинация и лимиты

  • get_history / search_messages / get_participants / get_admin_log: limit обычно 1-200. Для больших объёмов — несколько вызовов с offset_id (для сообщений) или продвигайся по страницам.
  • Не запрашивай больше, чем нужно — каждый вызов = запрос к Telegram под лимитом FloodWait.

Ошибки

  • «Telegram-сессия не авторизована» → claudegram-auth (через ! claudegram-auth в Claude или uv run claudegram-auth в shell).
  • FloodWaitError: A wait of N seconds is required → подожди ровно N секунд (Telethon бросит FloodWaitError), не ретрай в цикле.
  • UsernameNotOccupiedError → нет такого @username. Перепроверь.
  • ChatAdminRequiredError → нужны права админа для операции (get_stats, kick, promote и т.п.).
  • UserNotParticipantError → юзер не в этом чате (для kick/promote).
  • MessageNotModifiedError при edit_message → новый текст идентичен старому.

Channel-режим

Если плагин запущен с enable_channel_mode=1 и --channels, входящие сообщения от allowlist'ed юзеров приходят в сессию как <channel source="claudegram"> теги. См. отдельный skill tg-channel-incoming для правил их обработки.

Keep looking

Skills are one crate of 627,801. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.