MCP server for social media — fetch tweets, transcribe videos, extract frames, and download Instagram posts
The server has 31 tools with mostly adequate naming (verb-noun format) and present descriptions. However, there are critical gaps: (1) Input schemas are visible in the code but lack structured type definitions for many parameters, most inputs use simple z.string() or z.boolean() without proper constraints; (2) Many parameter descriptions are present but generic or lack actionable detail about formats, ranges, or dependencies; (3) Output schemas are not documented in the code, the tool returns formatted strings rather than structured objects, which forces LLMs to parse unstructured text; (4) Error handling is minimal, no recovery guidance, categorization, or actionable error messages visible in the tool definitions; (5) Sensitive operations (add_user_to_monitor, delete_filter_rule) lack confirmation patterns or permission checks; (6) Tool descriptions vary in quality, some are excellent (get_tweet with detailed transcription notes), others are one-liners (get_bookmarks: 'Fetch a user's bookmarked tweets'). Overall naming is strong (all tools follow verb_noun), but schema depth, output structure documentation, and error handling pull the score down to the 'C+' range.
Add a filter rule for tweet monitoring.
Add a Twitter/X user to monitoring for real-time tweet stream.
Check if one Twitter/X user follows another. Returns boolean result.
Delete a filter rule for tweet monitoring.
Extract markdown from a web page using Cloudflare's browser rendering. Optionally waits for JavaScript to execute.
Fetch a user's bookmarked tweets. Returns paginated list of bookmarked tweets.
Fetch tweets from a Twitter/X community. Returns paginated community tweets.
Output schemas not documented. Tools return formatted strings (e.g., formatTweetOutput) rather than structured JSON objects with typed fields. LLMs must parse unstructured text instead of navigating typed responses. This wastes tokens and increases hallucination risk.
Many parameter descriptions are generic or under 20 characters. Examples: 'Pagination cursor' (18 chars), 'Twitter username without @' (26 chars). Descriptions lack actionable format guidance (e.g., what format is a cursor? How is pagination triggered?).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Fetch all active filter rules for tweet monitoring.
Fetch an Instagram post/reel with media. Downloads photos and videos, and transcribes any video audio.
Fetch tweets from a Twitter/X list. Returns paginated tweets from list members.
Fetch list of users currently being monitored for tweets.
Fetch details about a Twitter/X Space (live audio room).
Fetch trending topics on Twitter/X. Returns list of trending hashtags and topics with tweet counts.
Fetch a tweet by URL. Returns tweet text, author info, metrics, and media. If the tweet contains a video, automatically transcribes the audio with segment-level timestamps AND per-token confidence — the output includes **Uncertainty zones** (spans where Whisper is guessing, with midpoint_s timestamps) and **Demonstrative phrases** ('visit our', 'this command', 'in the bio'). When those appear and matter to the user's question, follow up with `get_video_frames_at` using the midpoint_s values to verify visually. Also fetches quoted tweets, threads, and Twitter articles.
Fetch quote tweets for a Twitter/X tweet. Returns paginated list of tweets that quoted the original.
Fetch replies to a Twitter/X tweet. Returns paginated list of reply tweets with text and metrics.
Fetch replies to a Twitter/X tweet using v2 API. Returns paginated list with enhanced metadata.
Fetch users who retweeted a Twitter/X tweet. Returns paginated list of retweeting users.
Fetch detailed about/bio information for a Twitter/X user.
Fetch followers of a Twitter/X user. Returns up to 200 per page with profile info.
Fetch accounts a Twitter/X user follows. Returns up to 200 per page with profile info.
Fetch tweets where a user is mentioned. Returns paginated results with tweet text and metadata.
Fetch a Twitter/X user's profile by username. Returns bio, follower/following counts, tweet count, verification status, location, and website.
Fetch recent tweets from a Twitter/X user. Returns up to 20 tweets per page with text, metrics, and media. Use cursor for pagination.
Fetch verified followers of a Twitter/X user. Returns paginated list of verified accounts following the user.
Extract frames from a video at a specified frame rate. Downloads video and extracts frames at regular intervals.
Extract single frames from a video at specific timestamps. Downloads video and extracts frames at exact times (useful for verifying Whisper uncertainty zones).
Fetch transcript from a YouTube video. Returns captions if available, or transcribes audio with Whisper if captions unavailable.
Remove a Twitter/X user from monitoring.
Search Twitter/X for tweets matching a query. Returns paginated results with tweet text, metrics, and media.
Search for Twitter/X users by query. Returns paginated results with user profiles.
No input parameter validation or constraint schemas visible. Most parameters are z.string() or z.boolean() without min/max, regex patterns, or enum constraints. For example, 'fps' in get_video_frames has no bounds, LLMs could pass 0, negative, or 10000+ values causing API failures or timeouts.
No error handling or recovery guidance in tool definitions. The code shows no try-catch blocks with actionable error messages, no error categorization (retryable vs. user-fixable vs. fatal), and no recovery suggestions. LLMs receive raw API errors or generic failures with no next steps.
Destructive operations (add_user_to_monitor, remove_user_from_monitor, delete_filter_rule) lack confirmation or dry-run support. No permission checks visible. Agents can modify monitoring state or filter rules without explicit user confirmation, risking unintended side effects.
Inconsistent and varying description quality across tools. get_tweet is detailed (85+ chars with transcription behavior); get_bookmarks is minimal (35 chars: 'Fetch a user's bookmarked tweets'). This creates inconsistent LLM selection guidance and violates the pattern that descriptions should explain WHEN to use the tool.
Pagination is supported but the pagination interface is vague. Cursor parameter descriptions say 'Pagination cursor' without explaining: what does a cursor value look like? Is it opaque? Can the LLM construct one or must it come from a prior response? Should it be stored?
Tool naming inconsistency: get_tweet_replies_v2 uses version suffix. This signals multiple implementations of the same logical tool, LLMs must reason about which to use. Per pattern, avoid multiple tools doing the same thing differently. Either consolidate to one tool or make the distinction obvious in descriptions (e.g., 'Use _v2 for enhanced metadata including ...').
Transcription parameters (language, model) appear on multiple tools (get_tweet, get_youtube_transcript, get_instagram_post) but are not consistently described. The model parameter description includes a complex list of options and a note about '~/.media-mcp/models', this is implementation detail that should be hidden from the LLM interface.
No documentation of chaining constraints. For example, get_user_tweets returns tweets; downstream tools like get_video_frames need a video URL. The description doesn't explain: can all tweets have videos? How does the agent identify which tweets have extractable video?