Twitter/X analysis without the token waste. Fetch tweets, download media. Works with Cursor, Claude, VS Code, Gemini & more. Zero config → tweetsave.org
TweetSave MCP demonstrates solid tool definition quality with consistent naming patterns, explicit Zod schemas for all tools, and generally clear descriptions. All 5 tools follow verb_noun naming (tweetsave_get_tweet, tweetsave_to_blog, etc.). All tools have input schemas with type definitions and parameter descriptions. However, descriptions vary significantly in quality and length, some exceed 500 characters (verbose for LLM decision-making), lack dependency hints, and include implementation notes that clutter the narrative. Output schemas are documented only in text form, not as formal JSON Schema definitions. Error handling provides recovery guidance but is basic. Tool composition is sound (each does one thing), though some tools have overlapping capabilities (get_tweet vs batch both fetch tweets).
Fetch multiple tweets at once (max 10). Useful for: - Collecting tweets from a list - Building a feed from multiple sources - Comparing multiple tweets Args: - urls (string[]): Array of tweet URLs or IDs (max 10) - response_format ('markdown' | 'json'): Output format (default: 'markdown')
Extract and list all media URLs from a tweet (photos, videos, GIFs). Useful for: - Downloading media files - Building galleries from tweets - Archiving visual content Args: - url (string): Tweet URL or tweet ID - media_type ('all' | 'photos' | 'videos'): Filter by media type (default: 'all') Returns: Array of media objects with: - URL - Type (photo/video/gif) - Dimensions (width × height) - Duration (for videos) - Alt text (for accessibility)
Fetch a tweet thread (multiple connected tweets by the same author). Note: Current implementation fetches the main tweet. Full thread crawling requires additional API access. Args: - url (string): URL or ID of any tweet in the thread - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Array of tweets in the thread with all content and media. Examples: - "Get the full thread from this tweet: https://x.com/user/status/123"
Fetch a single tweet with all its content including text, media (photos, videos, GIFs), polls, and engagement metrics. This tool retrieves tweet data from Twitter/X using the FxTwitter API. It returns the tweet content, author info, media URLs, and engagement stats. Args: - url (string): Tweet URL or tweet ID - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: Tweet data including: - Author info (name, username, avatar) - Tweet text - Media URLs (photos, videos) - Engagement (likes, retweets, replies, views) - Poll data (if applicable) - Quote tweet (if applicable) Examples: - "Get tweet from https://x.com/elonmusk/status/123456" - "Fetch this tweet: 123456789" Note: Does not fetch replies. Use tweetsave_to_blog for a complete blog post with formatting.
Verbose and implementation-focused descriptions exceed 500 characters, wasting LLM tokens and burying key decision criteria. E.g., tweetsave_get_tweet description spans ~400 chars with internal API details ('FxTwitter API') and implementation notes ('Does not fetch replies') that belong in dev docs, not LLM-facing copy.
Output schemas documented only as text descriptions (e.g., 'Returns: Tweet data including: Author info...') rather than formal JSON Schema objects. LLMs cannot programmatically parse text descriptions to extract structured responses; downstream tools requiring specific fields (e.g., author.username) cannot reliably reference them.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | <=2025-11-25 | v2 |
Convert a tweet into a formatted blog post with title, content, media, and metadata. This tool transforms a tweet into a readable blog post format, perfect for: - Archiving tweets - Creating content from threads - Generating blog posts from viral tweets Args: - url (string): Tweet URL or tweet ID - include_engagement (boolean): Include likes/retweets/etc. (default: true) - response_format ('markdown' | 'json'): Output format (default: 'markdown') Returns: BlogPost with: - Generated title from tweet content - Author info with avatar - Formatted content with media - Tags from hashtags - Read time estimate - Engagement summary - Source link Examples: - "Convert this tweet to a blog post: https://x.com/user/status/123" - "Make a blog from tweet 123456789"
Missing dependency hints and prerequisites. Description for tweetsave_get_thread states 'Full thread crawling requires additional API access' but does not guide the agent on what to do when full threads are unavailable. No guidance like 'If thread fetch fails, call tweetsave_get_tweet() for the main tweet instead.'
tweetsave_batch tool description incomplete. Lacks explanation of what happens on per-item failures (does the entire batch fail if one URL is invalid?), whether order is preserved, or what partial-failure behavior looks like. This forces the LLM to guess error handling semantics.
No explicit idempotency documentation. All tools are marked with idempotentHint: true, but descriptions do not state whether repeated calls with the same URL return cached results or fresh data. For tweet archival workflows, this matters, agents need to know if calling get_tweet twice costs two API calls or one.
Error handling in implementation returns generic recovery tips ('Make sure the URL is correct...') but does not distinguish error types (invalid URL vs. deleted tweet vs. private tweet vs. API rate limit). Agents cannot reason about whether to retry, ask the user, or try a different tool.
Tool naming uses prefix 'tweetsave_' consistently, which is good for branding but adds 10 characters to every call. For agents with many tools in context, this increases token overhead. Consider shorter names like 'get_tweet', 'to_blog', 'batch' if the server is namespaced separately, or accept the cost if this server operates in a large ecosystem.