Telegram MCP Server для Claude Code: пошаговый гайд

Telegram MCP Server для Claude Code: пошаговый гайд

У меня есть AI-агент, который 24/7 сидит в Telegram, читает мои чаты, отвечает на сообщения и управляет контактами. Всё это — через MCP Server, который оборачивает Telethon в набор инструментов для Claude Code. Покажу, как это устроено и как собрать такой сервер самому.

Зачем MCP для Telegram

MCP (Model Context Protocol) — это стандарт, по которому AI-модели могут вызывать внешние инструменты. Claude Code поддерживает MCP из коробки: ты описываешь сервер, и модель получает доступ к его функциям как к обычным tools.

Telegram через MCP — это возможность для Claude Code:

Читать историю сообщений в любом чате
Отправлять сообщения и ответы
Искать по чатам (full-text search)
Получать информацию о контактах и группах
Реагировать на сообщения, пересылать, удалять

Это не бот-API. Это userbot через Telethon — MTProto клиент, который работает от имени реального аккаунта. Бот-API слишком ограничен: не видит историю чужих сообщений, не может искать по чатам, не имеет доступа к приватным группам, куда не добавлен.

Архитектура: Telethon + FastMCP

Стек простой:

Telethon — Python-библиотека для MTProto. Подключается к Telegram как обычный клиент
FastMCP — фреймворк для создания MCP серверов на Python. Минимальный boilerplate
nest_asyncio — критически важен. Без него async код внутри MCP вызовов падает с "event loop already running"

Базовая структура:

from mcp.server.fastmcp import FastMCP
from telethon import TelegramClient
import nest_asyncio
import asyncio

nest_asyncio.apply()

mcp = FastMCP("telegram")
client = TelegramClient("session", api_id, api_hash)

@mcp.tool()
async def get_messages(chat_id: int, limit: int = 10):
    """Get recent messages from a chat."""
    messages = []
    async for msg in client.iter_messages(chat_id, limit=limit):
        messages.append({
            "id": msg.id,
            "text": msg.message,  # НЕ msg.text!
            "date": str(msg.date),
            "sender": msg.sender_id
        })
    return messages

Ключевой момент: msg.message, а не msg.text. Это неочевидно и стоило мне несколько часов дебага. msg.text возвращает None в некоторых контекстах (например, при работе через GetRepliesRequest), а msg.message всегда содержит текст.

Ключевые операции

Мой MCP server для Telegram реализует 92 метода. Но для старта достаточно 5-7 основных:

get_messages(chat_id, limit) — получить последние N сообщений из чата
send_message(chat_id, text) — отправить сообщение
search_messages(chat_id, query) — полнотекстовый поиск
list_chats(chat_type) — список чатов (groups, channels, users)
get_message_context(chat_id, message_id) — контекст вокруг конкретного сообщения
execute_code(code) — выполнить произвольный Python с доступом к client

Последний — самый мощный. По сути, это escape hatch: если нужна операция, которую ты не реализовал как отдельный tool, Claude Code может написать и выполнить Python код прямо внутри MCP сервера, с полным доступом к Telethon client.

Async паттерны: обязательно nest_asyncio

Главная ловушка — event loop. Telethon использует asyncio. MCP server тоже работает в asyncio event loop. Когда Claude Code вызывает MCP tool, ты уже внутри running loop — и asyncio.run() или client.loop.run_until_complete() падают с ошибкой.

Решение:

import nest_asyncio
nest_asyncio.apply()
import asyncio

async def main():
    msgs = []
    async for msg in client.iter_messages(chat_id, limit=50):
        msgs.append(msg.message or '[media]')
    return msgs

result = asyncio.get_event_loop().run_until_complete(main())

Этот паттерн — nest_asyncio.apply() в начале + asyncio.get_event_loop().run_until_complete() для вызовов — работает надёжно. Не пытайся использовать await на top level или client.loop.run_until_complete() — оба сломаются.

Подводные камни

За месяцы работы с Telegram MCP я собрал коллекцию граблей:

ChannelPrivateError — возникает при попытке отправить сообщение в группу, где у аккаунта нет доступа. Причём читать из канала через GetRepliesRequest можно, а писать — нет. Это разные уровни доступа в Telegram API

sender = None — в групповых чатах, где аккаунт не является участником, профили отправителей недоступны. msg.sender_id может быть None. Обрабатывай gracefully, не пытайся ретраить

execute_code timeout — если запускаешь код через execute_code, ставь жёсткий лимит. Любой цикл больше 10 итераций с API вызовами внутри — разбивай на батчи. Я использую правило: максимум 10 операций за один execute_code вызов

FloodWait — Telegram агрессивно рейтлимитит. Если отправить 20 сообщений подряд — получишь FloodWaitError с задержкой до нескольких минут. Добавь asyncio.sleep(1) между отправками

Session string vs session file — для сервера используй session string (client.session.save() в base64). Session файл привязан к filesystem и не переносится между контейнерами

Мой use case: server-agent

Я использую Telegram MCP как основной интерфейс для AI-агента, который крутится 24/7 на VPS. Архитектура: Claude Code запускается в Docker контейнере, подключается к Telegram через MCP, и обрабатывает входящие сообщения.

Что агент умеет через Telegram MCP:

Отвечать на DM от меня — как персональный ассистент
Мониторить каналы — парсить посты, собирать данные
Отвечать в обсуждениях моего канала — в моём голосе, используя digital twin prompt
Запускать cron-задачи — еженедельные отчёты, проверки

Telegram MCP оказался удобнее, чем бот-API или webhook: полный доступ к истории, поиск, управление чатами — всё, что умеет обычный клиент.

Как подключить к Claude Code

В .mcp.json проекта (или глобально в ~/.claude/mcp.json):

{
  "mcpServers": {
    "telegram": {
      "command": "python",
      "args": ["/path/to/telegram_mcp_server.py"],
      "env": {
        "TELEGRAM_API_ID": "your_api_id",
        "TELEGRAM_API_HASH": "your_api_hash",
        "TELEGRAM_SESSION_STRING": "your_session_string"
      }
    }
  }
}

После запуска Claude Code увидит Telegram tools в списке доступных и сможет вызывать их как обычные функции.

Открытый код: telegram-mcp на GitHub. Есть несколько реализаций, мой вариант основан на Telethon с расширенным набором методов.

Telegram MCP — это мб самый полезный MCP server, который можно собрать. Telegram уже и так центр коммуникации для многих, а подключив его к Claude Code, ты получаешь AI-агента с полным доступом к твоему мессенджеру.


Подписывайся на Telegram — @danokhlopkov