MCP-сервер аналитики Telegram-каналов. Даёт LLM-агенту (Claude Desktop, Claude Code и любому MCP-клиенту) инструменты для оценки каналов перед закупом рекламы.
Two tools with basic schemas and descriptions, but significant gaps in parameter documentation, output schema clarity, and error handling. Tool names lack action verbs (check_channel, compare_channels are descriptive but not verb-first). Descriptions are present but generic. Parameters have types but lack detailed constraints and validation guidance. No documented output schemas. Error handling is minimal, no recovery guidance or actionable error messages. The checker.py implementation shows basic logic but no structured error responses or input validation.
Оценить Telegram-канал перед закупом рекламы. Возвращает охват (медиана просмотров), долю живого охвата (%подписчиков), CPM от цены и вердикт-светофор 🟢/🟡/🔴 с обоснованием. channel — ссылка или @имя канала; price — цена за пост (₽); max_cpm — порог CPM (₽).
Сравнить несколько каналов и отсортировать по охвату (лучшие сверху). channels — список ссылок/@имён; price — общая цена для расчёта CPM (необязательно).
Tool names do not start with action verbs. 'check_channel' and 'compare_channels' are descriptive but should be 'analyze_channel' or 'evaluate_channel' and 'rank_channels' or 'compare_channels_by_reach'. LLMs infer intent from verb-first naming.
Output schemas are not documented. check_channel returns a dict with fields like 'median_views', 'reach_ratio', 'cpm', 'verdict', 'reasons', but the tool description does not specify these fields or their types. LLMs cannot plan downstream calls or extract data reliably.
Parameter descriptions lack constraints and validation rules. 'price' is nullable but no guidance on valid range (e.g., must be > 0). 'max_cpm' defaults to 500 but no explanation of units or typical range. 'channel' accepts 'ссылка или @имя' but no format specification or examples.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 40 | 2026-07-28+ | v2 |
Error handling is minimal and non-actionable. checker.py returns {'error': 'нет публичных постов с просмотрами'} but does not guide the LLM on recovery (e.g., 'Try a different channel or check if it is public'). No categorization of errors as retryable vs. fatal.
No input validation or sanitization. The 'channel' parameter is passed directly to fetch_channel() which constructs a URL. No checks for malicious input, path traversal, or invalid formats. LLMs can be tricked into passing injection payloads.