telegram-mcp
# telegram-mcp (движок)
Read-only MCP-читалка своей Telegram (self-host, Telethon). Открытый движок — актив бренда [aiaiai](https://getaiaiai.ru). Session живёт на устройстве (keychain), наружу не уходит. v1 = читалка; write-методы не выставлены.
Дизайн и решения — в umbrella-репо `telegram-mcp-hosted` (`docs/decisions.md`, `architecture.md`, `build-plan.md`).
## Раскладка
```
telegram_mcp/
server.py # entrypoint: FastMCP + авто-дискавери tools/
_app.py # единый FastMCP-инстанс (mcp)
config.py # app-креды (BYO env/.env; broker позже)
qr_render.py # ASCII-QR полублоками (обкатан в спайке) ✅
session_store.py # SessionStore: keychain+Fernet — интерфейс (impl = T2)
client.py # get_client() -> авторизованный TelegramClient — интерфейс (impl = T3)
auth.py # QR-login + 2FA — интерфейс (impl = T4)
tools/
_base.py # mcp, get_client, общие хелперы — единая точка импорта
*.py # по тулу на файл, саморегистрация через @mcp.tool (стабы T5–T12)
```
## Контракт для авторов тулзов (Wave 1, T5–T12)
- Файл тула начинается с `from telegram_mcp.tools._base import mcp, get_client`.
- Регистрация — `@mcp.tool` (FastMCP берёт сигнатуру+докстринг в схему). Центрального списка НЕТ — добавил файл, тул появился (авто-дискавери).
- В Telegram — **только** через `await get_client()`.
- **read-only**: только `get_*`/`iter_*`/`download_*`. Ни одного write-вызова.
- Возвращай JSON-сериализуемое (dict/list), не объекты Telethon.
- Трогаешь **только свой файл**. Не редактируешь `pyproject`, `server.py`, `_base.py`, `_app.py` (нужна общая утилита/зависимость → флаг в интеграцию T16). Свой git worktree.
## Установка (self-host)
```bash
# 1. поставить как CLI (uv сам тянет нужный python ≥3.10)
uv tool install git+https://github.com/expremiental/telegram-mcp
# 2. залогиниться — отсканировать QR своим Telegram
# (app-креды берутся с брокера автоматически, ничего на my.telegram.org создавать не надо)
telegram-mcp login
# 3. подключить в Claude Code / Cursor
claude mcp add -s user telegram-mcp -- telegram-mcp serve
```
Перезапусти хост → спрашивай обычным языком: «сделай дайджест непрочитанного», «найди чат с …», «что писали в … за сегодня».
- **read-only** — выставлены только read-тулзы; ничего не отправляет/не меняет.
- **session шифрованная в keychain, машину не покидает.** Сброс: `telegram-mcp logout`.
- BYO-креды (advanced): `TELEGRAM_API_ID`/`TELEGRAM_API_HASH` в окружении переопределяют брокер.
## Dev
```bash
uv venv --python 3.12 .venv && uv pip install -e . --python .venv
.venv/bin/telegram-mcp serve # сервер (stdio) · login / logout — онбординг
```
Требует Python ≥3.10 (FastMCP).
TDQS
Scored across 10 tools
Each tool targets a specific Telegram resource and action: account info, unread digest, media download, chat search, message history, chat list, participants, pinned messages, entity resolution, and in-chat search. Potential overlaps (e.g., find_chat vs resolve_chat) are differentiated by search vs exact match, and get_history vs search_in_chat by unfiltered retrieval vs text query.
All tool names follow a consistent verb_noun snake_case pattern (get_me, digest_unread, download_media, find_chat, get_history, list_chats, get_participants, get_pinned, resolve_chat, search_in_chat). The verbs are varied but appropriate to each action, and there are no style mixes or camelCase deviations.
With 10 tools, the set is well-scoped for a Telegram read-only/digest MCP server. Each tool covers a distinct need without unnecessary redundancy, and the count is within the ideal 3-15 range.
The server covers the core read-only workflow: account info, listing chats, unread digests, history, search, media download, participants, pinned messages, and entity resolution. Minor gaps exist, such as no direct tool for getting a single message by ID or detailed user/chat profiles, but these are easily worked around with existing tools.