Skip to content

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.

Changes · 2

5 tools: 2 change things and 3 only read.

Scanned Oct 21, 2026

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/sse

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "tweetsave_to_blog" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The description's first verb is "convert": a word for a change.

    What this check looks for

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".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The description's first verb is "convert": a word for a change.

      What this check looks for
    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/sse

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.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.