MCP server for interacting with Telegram via the mtcute library
Three tools with complete input schemas and descriptions. Naming follows verb_noun pattern (iter_*, send_*). Descriptions are adequate (40-80 chars) but lack context on when to use each tool or what happens on error. Parameters are well-typed with enums for peer types and filter values. Output schemas are documented via Zod but not exposed in tool definitions, LLMs cannot see what fields to expect. Error handling uses toolError() utility but provides no recovery guidance. Missing: output schema documentation in tool registration, parameter constraints (e.g., limit bounds), and idempotency hints for send_text.
Iterate over Telegram dialogs
Iterate over Telegram messages
Send Telegram message
Output schemas not documented in tool definitions. LLMs cannot see what fields iter_dialogs, iter_messages, and send_text return. Zod schemas exist in code (DialogSchema, MessageSchema) but are not exposed via tool registration.
send_text lacks idempotency or confirmation semantics. A destructive write tool (sends messages) should declare idempotentHint or support dry-run. Agents may retry on ambiguous failures, causing duplicate messages.
Error responses use toolError() which returns only error.message as text. No recovery guidance (e.g., 'Try search_dialogs() first' or 'Invalid peer type'). LLMs cannot self-correct.
Parameter 'limit' lacks bounds documentation. No min/max specified for iter_dialogs and iter_messages. LLMs may pass absurd values (limit=999999) causing timeouts or API errors.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2025-06-18+ | v2 |
Tool descriptions are generic and lack context on when to use each. 'Iterate over Telegram dialogs' does not explain: What is a dialog? When should I call this vs iter_messages? What does it return? Descriptions should be 50-200 chars with actionable context.