io. github. zezeron/ tweetsave-mcp
by zezeron · remote · local (npm) · no sign-in to list tools · v1.0.3 · published by GitHub user zezeron
Twitter/X analysis without token waste. Fetch tweets, download media. No API key.
5 tools: 2 change things and 3 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things2Claude Code: ask: see these tools
- Only reads3Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport sse tweetsave https://mcp.tweetsave.org/sseFindings
Matches of fixed checks, with the text they matched.
The server marks "tweetsave_to_blog" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The description's first verb is "convert": a word for a change.
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
5 tools
Changes things 2Claude Code: ask
tweetsave_extract_mediaExtract direct media URLs (photos, videos, GIFs) from a tweet.No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Description, as the server wrote it Extract direct media URLs (photos, videos, GIFs) from a tweet. Returns direct URLs that can be downloaded or embedded. Video URLs are the highest quality available. Args: - url (string): Tweet URL or tweet ID - media_type ('all' | 'photos' | 'videos'): Filter by media type (default: 'all') Returns: List of media items with: - type (photo/video/gif) - url (direct download URL) - dimensions (width/height) - duration (for videos) Examples: - "Get all media from this tweet: https://x.com/user/status/123" - "Extract video URLs from tweet 123456"
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
tweetsave_to_blogConvert a tweet into a formatted blog post with title, content, media, and metadata.1 finding
Why it is in this group
- The description's first verb is "convert": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
Findings
- Warn
The server marks "tweetsave_to_blog" read-only (readOnlyHint: true), and its own name, description or input give the class "write".
What this check looks forMatched text
annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The description's first verb is "convert": a word for a change.
Description, as the server wrote it 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"
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
Only reads 3Claude Code: allow
tweetsave_batchFetch multiple tweets at once (max 10).No findings
Why it is in this group
- The description's first verb is "fetch": a word for reading.
Description, as the server wrote it 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') Returns: Array of tweets or a combined feed in markdown format. Examples: - "Fetch these tweets: [url1, url2, url3]"
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
tweetsave_get_threadFetch a tweet thread (multiple connected tweets by the same author).No findings
Why it is in this group
- The name "tweetsave_get_thread" says "get": a word for reading.
Description, as the server wrote it 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"
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
tweetsave_get_tweetFetch a single tweet with all its content including text, media (photos, videos, GIFs), polls, and engagement metrics.No findings
Why it is in this group
- The name "tweetsave_get_tweet" says "get": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: true
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 1.0.3. Values in angle brackets are yours to fill in.
claude mcp add --transport sse tweetsave https://mcp.tweetsave.org/sseRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__tweetsave__tweetsave_get_tweet",
"mcp__tweetsave__tweetsave_get_thread",
"mcp__tweetsave__tweetsave_batch"
],
"ask": [
"mcp__tweetsave__tweetsave_to_blog",
"mcp__tweetsave__tweetsave_extract_media"
],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as tweetsave. Review it before you use it.
