An MCP server for interacting with Telegram via the Telethon client library. Allows reading messages, sending messages, managing chats, and downloading media.
The server provides 5 tools with clear verb-noun naming (get_*, send_, count_, download_). Tool descriptions are present and adequate (76-124 chars), exceeding the 10-char minimum but below the 194-char production baseline. Input schemas are visible and include type definitions and descriptions for all parameters. However, output schemas are undocumented, tools return free-form strings rather than structured objects, forcing LLMs to parse unstructured text. Error handling is minimal (only basic 'not found' checks in download_voice_message). The server lacks pagination support, result limits enforcement, and per-parameter constraint validation (enums, ranges). get_messages and get_chats lack explicit limit documentation in descriptions, risking large unvalidated result sets. No tool annotations (readOnlyHint/destructiveHint) despite clear risk distinctions between read (get_chats, get_messages, count_user_messages) and write (send_message, download_voice_message) operations.
Count messages from a specific user in a chat for today (UTC).
Download a voice/video/audio message by its ID. Returns the absolute path to the downloaded file.
Get list of Telegram dialogs (chats). Returns name, id, type, and unread count.
Get recent messages from a chat. chat_id can be numeric ID or @username.
Send a message to a chat. chat_id can be numeric ID or @username.
All tools return unstructured string responses instead of structured JSON objects. LLMs cannot reliably extract fields (message_ids, timestamps, user_ids, file paths) for downstream tool chaining or agent planning.
No output schema documentation. Tool return types are not declared, preventing LLMs from understanding what fields to expect and forcing unstructured text parsing.
Pagination and result limits are not enforced or documented. get_messages (default limit=20) and get_chats (default limit=50) could return large unvalidated result sets. No offset/cursor parameters for navigating large result sets.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 53 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 41 | - | v1 |
Missing tool annotations. send_message and download_voice_message are destructive/write operations but lack explicit destructiveHint. get_chats, get_messages, count_user_messages are read-only but lack readOnlyHint annotation.
Error handling provides no recovery guidance. download_voice_message returns 'Message X not found' and 'Message X has no media' with no suggestion for next steps or alternatives.
Parameter 'limit' lacks explicit min/max constraints and range documentation in descriptions. No validation prevents LLMs from passing unreasonable values (e.g., limit=9999).
chat_id parameter accepts both numeric IDs and @usernames, but this flexibility is not clearly explained in parameter descriptions. LLMs may not understand the dual-format acceptance.