MCP server for interacting with X (Twitter) API, enabling posting tweets, managing DMs, searching tweets, and managing user profiles across multiple accounts
The server defines 17 tools with properly structured schemas using schemars. All tools have names following verb_noun conventions (post_tweet, get_home_timeline, etc.). Descriptions are present for all tools (ranging 35-150 characters), which meets the 10-1024 character guideline. Input parameters are properly typed with JSON Schema and include descriptions. However, there are notable gaps: (1) Output schemas are not documented, we can see input params in src/params.rs but no corresponding response types or documentation of what each tool returns; (2) No error handling guidance in descriptions, tools don't explain what to do if a tweet is deleted, a user is not found, or a media upload fails; (3) Parameter descriptions lack actionable constraints, e.g., 'max 280 characters' is stated for text but not validated or constrained in schema; (4) Some tools accept ambiguous natural-language input (tweet_id accepting both '123456' AND 'https://x.com/user/status/123456') but no parsing logic or error guidance is visible; (5) No documentation of mutual exclusivity (media vs media_ids in post_tweet) in descriptions themselves, only as text notes. The tool set composition is strong, each tool does one thing, names are clear and distinct, and verb prefixes (post, get, search, like, reply, delete, follow) are appropriate. Authentication is handled server-side via config file (good security practice).
Block a user
Bookmark a tweet
Delete a tweet
Follow a user
Get all followers of the authenticated user (paginated automatically with safety cap)
Get all accounts the authenticated user is following (paginated automatically with safety cap)
Get the authenticated user's bookmarked tweets
Get direct messages for the authenticated user
Output schemas not documented. While input parameters are well-typed, there is no visible documentation of what each tool returns. LLMs cannot plan downstream calls or extract required fields (e.g., tweet_id from post_tweet) without knowing the response structure.
Error handling not documented in tool descriptions. Tools provide no guidance on what to do if a tweet is deleted, a user is not found, rate limits are hit, or media upload fails. Descriptions lack recovery hints like 'If user not found, try search_users() with a partial name.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 10 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 39 | - | v1 |
Get a paginated list of followers for the authenticated user
Get a paginated list of accounts the authenticated user is following
Get the authenticated user's home timeline (tweets from accounts they follow)
Get mentions timeline for the authenticated user
Get trending topics for a location
Get timeline of tweets posted by a specific user
Like a tweet
List all configured X accounts
Get profile information for the authenticated user
Get user profile information
Mute a user
Post multiple tweets as a thread to X
Post a tweet to X with optional media attachments
Reply to a tweet
Retweet a tweet
Search for tweets on X matching a query
Send a direct message to a conversation
Unblock a user
Remove a tweet from bookmarks
Unfollow a user
Unlike a tweet
Unmute a user
Remove a retweet
Update the authenticated user's profile (name, bio, location, website)
Update the authenticated user's profile banner image
Upload media (image, GIF, or video) to X and return media ID for use in tweets
Parameter constraints lack precision. 'max 280 characters' is mentioned in descriptions but not enforced in JSON Schema. 'max_results (1-100, default 20)' is stated textually rather than using JSON Schema minimum/maximum. LLMs cannot reliably enforce these constraints and will pass invalid values.
Mutually exclusive parameters (media vs media_ids in post_tweet, reply_to_tweet) are documented in description text but not enforced in schema. LLMs may pass both simultaneously, causing ambiguous failures.
Destructive operations (delete_tweet) lack confirmation or dry-run pattern. No description warns that this is irreversible or suggests calling get_tweet first to confirm the target.
Tool descriptions are brief (60-80 chars for many tools) and lack context on WHEN to use them. 'Like a tweet' does not explain when to call this vs retweet or reply. 'Get followers' does not hint that this paginates or requires authentication.
Ambiguous parameter: tweet_id accepts both IDs ('123456') and URLs ('https://x.com/user/status/123456') but no description explains parsing rules or error behavior if parsing fails.