An MCP server for X/Twitter that uses the real browser API, not the developer API
Two tools present with basic naming and minimal descriptions. search_by_text and get_conversation_messages follow action-verb convention (search_, get_), but descriptions are functional but terse (59 and 67 chars respectively). Both tools have input schemas with typed parameters and defaults, but lack detailed descriptions explaining WHEN to use each tool, WHAT distinguishes them, or error guidance. Output schemas are undocumented, the LLM cannot predict what fields will be returned. No error classification or recovery guidance. The TwitterDMSearch class implementation shows proper field resolution (extracting sender/recipient user objects), but the tool interface doesn't expose this richness or explain it to the LLM. Parameters have types but lack format/constraint documentation. Searches are case-insensitive internally, but this affordance is not mentioned in descriptions. No pagination guidance despite the 'limit' parameter suggesting large result sets. Tool composition is reasonable (search vs get_conversation are distinct concerns), but parameter naming lacks clarity, 'query' could be more specific ('text_query' or 'search_text') to avoid ambiguity with other search dimensions like sender_id or conversation_id that the internal class supports but are not exposed as tool parameters.
Get all messages from a specific conversation.
Search for messages containing specific text.
Terse tool descriptions lack LLM-optimized guidance. 'Search for messages containing specific text' (59 chars) and 'Get all messages from a specific conversation' (67 chars) do not explain WHEN to use each tool, WHAT distinguishes them, or how they differ from the internal search() method that accepts multiple filter parameters (sender_id, recipient_id, etc.). Descriptions should state: (1) What the tool does, (2) When to use it vs similar tools, (3) What structure is returned, (4) Any prerequisites.
Output schemas are not documented. Neither tool specifies what fields the LLM should expect in the response (e.g., does search_by_text return message objects with 'id', 'text', 'sender', 'recipient', 'time'? What nested structure?). The TwitterDMSearch class constructs rich message_data with sender/recipient user objects, but the tool interface doesn't advertise this. LLMs cannot predict or plan downstream operations without documented output structure.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 49 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 52 | - | v1 |
No error handling or recovery guidance. The tools make no mention of how they fail (invalid conversation_id, empty results, malformed query) or what the LLM should do next (retry, try a different search, ask the user). Error responses should be actionable: 'Conversation "xyz" not found. Available conversations: [list]. Try get_conversation_messages with one of these IDs.'
Parameter descriptions lack specificity and constraints. 'query' (in search_by_text) could be more specific ('search_text' or 'text_query'); the description doesn't clarify that it's case-insensitive or what format is expected. 'limit' is not described (expected range? default=10 is shown but no min/max stated). Descriptions should include format, range, and allowed values.
Exposed tool set is a subset of the TwitterDMSearch class capabilities. The class supports filtering by sender_id and recipient_id (via search_by_username and get_user_stats methods), but these parameters are not exposed as tool parameters. This forces LLMs to use the generic search_by_text and then filter results client-side, wasting tokens and risking misses if the LLM doesn't iterate. Consider exposing sender and recipient filters as optional tool parameters to enable precise queries.
No pagination or result-limiting guidance. Both tools accept a 'limit' parameter (default=10), but there's no indication of whether the tool will return exactly 'limit' results, up to 'limit', or all results if fewer exist. No mention of next_cursor or offset for iterating large result sets. If a conversation has hundreds of messages, the LLM cannot efficiently paginate.