Server has 4 tools with clear verb-based names (list_, read_, mark_) and reasonable descriptions (100-150 chars). Input schemas are present with typed parameters and descriptions. However, parameter descriptions lack detail on constraints, formats, and error recovery. Output schemas are documented via struct tags but lack explicit documentation in tool definitions. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Error handling is basic, no recovery guidance or actionable error messages visible in handlers.
List Telegram broadcast channels that currently have unread messages, with their unread counts.
Mark all unread Telegram broadcast channels as read in one call.
Mark all messages in a specific Telegram broadcast channel as read.
Read the unread messages of a Telegram channel, newest first. Reading does not mark them as read.
Missing tool annotations for risk levels. Tools are marked READ_ONLY or WRITE in metadata but not declared via readOnlyHint/destructiveHint in mcp.Tool definitions. LLMs cannot infer safety constraints from names alone.
Parameter 'channel' accepts both @username and numeric ID but lacks format/constraint documentation. Description says 'as returned by list_unread_channels' but does not specify valid formats, length limits, or character restrictions. LLMs may pass invalid values.
Error handling returns raw error strings (e.g. 'channel is required', 'channel not found in dialogs') with no recovery guidance. LLMs cannot determine if error is retryable, user-fixable, or fatal. No suggestions for next steps.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
Output schemas documented via struct tags (jsonschema) but not explicitly in mcp.Tool definitions. Tool definitions lack InputSchema and OutputSchema fields. LLMs must infer output structure from handler code, not from tool metadata.
Parameter 'limit' in read_channel_unread lacks bounds. Description says 'default 50' but does not specify min/max values. Unbounded integers let LLMs pass absurd values (e.g. limit=999999) that may timeout or exhaust resources.