Every tool takes a chat_id and returns what has already been archived — messages, pins, topics, statistics — with no write path and no live connection anywhere in the set. Search is scoped to one chat rather than across the archive, so finding a remark means knowing which conversation it was in, which is what list_chats and list_folders are for. That refresh_stats exists as its own tool tells you the global statistics are held rather than recomputed on every read.
A reader over an archived Telegram export: chats and folders, forum topics, messages by page or by date, keyword search and statistics.
- list_chats, which returns the archived chats with their ids, names and types — the ids every other tool needs — and list_folders for the Telegram chat folders.
- get_messages with a limit and offset, and get_messages_by_date for a single date in a chosen timezone.
- get_pinned_messages, and get_topics for a chat's forum threads.
- search_messages by keyword within one chat.
- get_chat_stats for a single chat, and refresh_stats to force a recalculation of the global archive statistics.
A Telegram archive on the host for it to read, since every tool reads what was already archived rather than fetching from Telegram. A chat_id for everything except the listing tools — list_chats is where those come from. The project is licensed GPL-3.0, which constrains how anything built on it may be redistributed.
One command plus a key — npx telegram-archive-mcp, then supply credentials
