Twitch MCP has 12 tools with consistent naming (verb_noun pattern: get-, create-, update-, send-, search-) and complete input schemas using Zod. However, descriptions are generic and lack LLM-optimization guidance. Most tool descriptions are 30-60 chars, below the 50-200 char baseline for A+ tools. Parameter descriptions exist but are minimal (e.g., 'The ID of the broadcaster' without context on when/why to use). Output schemas are not documented, responses are formatted as text blobs rather than structured objects, forcing LLMs to parse unstructured output. Error handling is minimal (generic 'Failed to retrieve' messages). No tool annotations (readOnlyHint/destructiveHint) despite clear WRITE vs READ_ONLY risk levels. Missing idempotency guidance for write operations.
Check authentication status with Twitch
Manually trigger Twitch authentication
Create a poll on a Twitch channel
End a poll on a Twitch channel
Get information about the authenticated Twitch user
Get information about a poll on a Twitch channel
Get current live streams by game ID or user login
Output schemas not documented. Tools return text blobs (e.g., 'Found 3 streams:\n\n...') instead of structured JSON. LLMs cannot extract typed fields for downstream tool chaining.
Tool descriptions are generic and under 50 chars (baseline 50-200). E.g., 'Check authentication status with Twitch' lacks context on when to call vs authenticate, or what the response contains.
No tool annotations (readOnlyHint/destructiveHint). WRITE tools (update-channel, send-chat-message, create-poll, end-poll) lack explicit destructiveHint, preventing agents from understanding irreversibility.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Get information about the most popular games on Twitch
Get information about a Twitch user by login name
Search for Twitch channels by name
Send a chat message to a Twitch channel
Update a Twitch channel's information (title, game, language, etc.)
Error handling is minimal. Generic 'Failed to retrieve' messages do not guide LLM recovery. No actionable error messages (e.g., 'User not found. Try search_channels() with a partial name').
Parameter descriptions lack format/constraint guidance. E.g., 'broadcaster_id' has no hint that it's a Twitch numeric ID, not a username. 'tags' array has no length/content constraints.