Twitter/X MCP server powered by twikit — no API key needed, free forever
Three tools with clear verb-noun naming (send_tweet, get_tweet, get_tweet_replies). All have descriptions and input schemas with types. However, descriptions are terse (10-100 chars, below the 50-200 char LLM-optimized baseline), parameter descriptions lack detail on constraints/formats, and output schemas are not documented. send_tweet lacks error guidance for write failures. No tool annotations (readOnlyHint/destructiveHint). Parameter 'reply_to' and 'cursor' descriptions are minimal. Missing pagination details for get_tweet_replies despite mentioning 'next_cursor'. Overall: functional but underspecified for LLM reasoning.
Fetch a tweet by ID.
Fetch replies (comments) to a tweet (issue #94). Uses X's TweetDetail GraphQL endpoint via vendored twikit's `Client.get_tweet_by_id`, which populates `tweet.replies` as a paginated `Result[Tweet]`. One page per call; pass the returned `next_cursor` to fetch more.
Send a tweet. Optionally reply to a tweet by ID.
Tool descriptions are too brief (10-100 chars vs. 50-200 char baseline). 'Send a tweet' and 'Fetch a tweet by ID' lack context on when to use each tool, prerequisites, or what happens on error.
Parameter descriptions are minimal or missing detail. 'reply_to' says 'Optional tweet ID to reply to' but does not explain format (numeric string vs. URL), what happens if ID is invalid, or whether the tweet must exist.
Output schemas are not documented. LLMs cannot plan downstream calls or extract fields. What does send_tweet return? What fields does get_tweet_replies include in each reply object?
send_tweet lacks error handling guidance. No mention of what happens if text exceeds 280 chars, if reply_to ID is invalid, or if authentication fails. LLM has no recovery path.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). send_tweet is destructive (creates a public tweet) but LLM cannot detect this from metadata. get_tweet and get_tweet_replies are read-only but unmarked.