Skip to main content
Glama
OpenTweet MCP Server

OpenTweet MCP Server

Official
by opentweetio

OpenTweet MCP Server

npm version License: MIT

Post, schedule, and thread on X (Twitter), Bluesky and LinkedIn from Claude, Cursor, ChatGPT, Windsurf, or any MCP client. 44 tools covering posts, threads, cross-posting, scheduling, CSV import, long-form Articles, an evergreen queue, analytics, AI media generation, DM campaigns, and multi-account management.

No X developer account, no OAuth app setup, no pay-per-call API billing. OpenTweet owns the X connection; your agent gets simple tools.

Nothing to install. Point your MCP client at the hosted Streamable HTTP endpoint:

https://mcp.opentweet.io/mcp

Claude Code, one command:

claude mcp add --transport http opentweet \
  https://mcp.opentweet.io/mcp \
  --header "Authorization: Bearer ot_your_api_key"

Or any MCP client config (Claude, Cursor, Windsurf, ChatGPT connectors):

{
  "mcpServers": {
    "opentweet": {
      "type": "streamable-http",
      "url": "https://mcp.opentweet.io/mcp",
      "headers": { "Authorization": "Bearer ot_your_api_key" }
    }
  }
}

Get your API key (prefix ot_) at opentweet.io/developer. Connect your X account once in the dashboard; the key covers everything else.

Related MCP server: Spectre

Other install options

Claude Desktop extension (one click)

Download the .mcpb extension from opentweet.io/claude-desktop and double-click it. Your API key is stored in the OS keychain.

To build a bundle from this repo:

cd mcp-server
npm run build:mcpb

That compiles TypeScript, installs production dependencies only, and writes opentweet-<package.json version>.mcpb. Bump the version in both package.json and manifest.json before building, otherwise the output overwrites the bundle already in the repo. The tool list in manifest.json is what Claude Desktop shows before install, so keep it in step with the tools the server registers.

Local via npm

npx -y @opentweet/mcp-server install   # interactive installer, detects your client

Or add manually:

{
  "mcpServers": {
    "opentweet": {
      "command": "npx",
      "args": ["-y", "@opentweet/mcp-server"],
      "env": { "OPENTWEET_API_KEY": "ot_your_api_key" }
    }
  }
}

Config file locations:

  • Claude Desktop: ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)

  • Cursor: ~/.cursor/mcp.json

  • Windsurf: ~/.codeium/windsurf/mcp_config.json

The 44 tools

Tweets and threads create_tweet, create_thread, list_tweets, get_tweet, update_tweet, delete_tweet, publish_tweet, schedule_tweet, batch_schedule (up to 50 at once), import_csv (AI writes a post per row, scheduled from the row's date and time), repurpose_tweet

create_tweet and create_thread take an optional platforms array. Pass ["x", "bluesky", "linkedin"] to publish the same content to all three networks in one call, or ["linkedin"] to post to LinkedIn only. LinkedIn posts go to the connected personal profile, and a thread goes to LinkedIn as one post. An explicit list is always honoured exactly.

Leaving platforms out is not the same as pinning the post to X. An unspecified post follows the account's auto cross-post setting: when that is on, it goes to every connected network. Call list_platforms first if you need to know where an unspecified post will land. It separates what an unspecified post is attempted on from the subset that will actually land, and separates connected from usable, so a network whose authorisation expired shows as needing a reconnect instead of looking healthy. Either way the response carries a per-network result so you can see what published, failed, or was skipped.

Media and AI generation upload_media, generate_image, generate_video

Analytics and insights get_analytics, get_top_posts, get_profile_growth, get_best_times, analyze_best_times, get_content_gaps, search_inspiration

Account and cross-posting get_account, list_accounts (multi-account: pass x_account_id to any tool), list_platforms (what an unspecified post targets, the auto cross-post setting, and which networks can publish right now)

Evergreen queue get_evergreen_settings, update_evergreen_settings, list_evergreen_posts, get_evergreen_post, add_to_evergreen, update_evergreen_post, remove_from_evergreen, get_evergreen_history

Articles (long-form X posts) create_article, get_article, list_articles, update_article, delete_article, publish_article

DM campaigns (Advanced and Agency plans) dm_campaign_create, dm_campaign_list, dm_campaign_report, dm_leads_list, dm_lead_approve, dm_inbox_list

Plus MCP resources (account status, scheduled queue) and built-in prompts.

Example prompts

  • "Write 3 tweets about TypeScript tips and schedule them across this week at my best posting times."

  • "Turn this blog post into a thread and schedule it for tomorrow 9am."

  • "What were my top 5 tweets this month? Add the best one to my evergreen queue."

  • "Check my posting streak and content gaps, then draft tweets to fill them."

How it compares

X's official MCP server (XMCP) exposes the raw X API and can post, but it requires an X developer account, OAuth app credentials, and pay-per-use API billing, and it has no scheduling. OpenTweet is the managed publishing layer: flat pricing from $19.99/month, scheduling, threads, evergreen recycling, and analytics included. Full comparison: opentweet.io/mcp/post-to-x.

License

MIT

Available Tools

30 tools
opentweet_add_to_evergreenA
Destructive

Add a post to the evergreen queue pool. Either add an existing post by ID or create a new evergreen post with text content.

Inputs: text, post_id, category, is_thread, +4 more.

opentweet_analyze_best_timesA
Idempotent

Trigger a fresh analysis of the user's best posting times by pulling their last ~100 tweets from X (with engagement metrics) and computing an engagement-weighted heatmap. Uses owned-read X API calls (cheap under 2026 X pricing). Cooldown: once per 24 hours.

Inputs: x_account_id.

opentweet_batch_scheduleB
DestructiveIdempotent

Schedule multiple tweets at once. Each tweet must already exist as a draft. Provide an array of post IDs with their scheduled dates.

Inputs: schedules (required), community_id, x_account_id, share_with_followers.

opentweet_create_threadA
Destructive

Create a Twitter/X thread (multiple connected tweets posted as a chain).

Inputs: tweets (required), category, publish_now, auto_retweet, +3 more.

opentweet_create_tweetC
Destructive

Create a tweet. Can save as draft, schedule for a specific time, or publish immediately to X.

Inputs: text (required), category, media_urls, publish_now, +4 more.

opentweet_delete_tweetA
DestructiveIdempotent

Permanently delete a tweet. This cannot be undone. If the tweet was published to X, it will also be deleted from X by default.

Inputs: id (required), delete_from_x.

opentweet_generate_imageA

Generate an AI image from a text prompt using Grok Imagine (xAI). Returns a permanent URL ready to use in tweets via media_urls. Requires XAI_API_KEY to be configured on the server.

Inputs: prompt (required), resolution, aspect_ratio.

opentweet_generate_videoA

Generate an AI video from a text prompt using Grok Imagine (xAI). Video generation is async — this tool starts the job AND polls until complete (up to 5 minutes). Returns the final video URL ready to use in tweets. Requires XAI_API_KEY to be configured on the server.

Inputs: prompt (required), duration, resolution, aspect_ratio.

opentweet_get_accountA
Read-only

Get your OpenTweet account status including subscription plan, daily posting limits, post counts, and connected X accounts.

Inputs: no named parameters.

opentweet_get_analyticsB
Read-only

Get your posting analytics including stats, streaks, trends, category breakdown, and recent activity. Use type parameter to get specific analytics.

Inputs: type, period, sort_by, x_account_id.

opentweet_get_best_timesA
Read-only

Get the best times to post on X based on the user's actual published tweets weighted by engagement (likes, retweets, replies, bookmarks, impressions). Returns a 7×24 day-of-week × hour heatmap, the top 5 windows, and AI-generated insights. If no analysis exists yet, falls back to a frequency-only summary and prompts the user to run analyze.

Inputs: x_account_id.

opentweet_get_content_gapsA
Read-only

Returns the user's content gaps: topics they engage with as a reader on X (likes) but rarely post about themselves, plus AI-generated post hook suggestions for those gaps.

Inputs: x_account_id.

opentweet_get_evergreen_historyA
Read-only

View the publishing history of evergreen posts. Shows clones that were automatically created and posted from the evergreen pool.

Inputs: page, limit, source_id, x_account_id.

opentweet_get_evergreen_postA
Read-only

Get full details of a specific evergreen post including its recent publishing history.

Inputs: id (required).

opentweet_get_evergreen_settingsA
Read-only

Get your evergreen queue settings and pool statistics. Shows whether the queue is enabled, posting frequency, cooldown, and pool size limits.

Inputs: x_account_id.

opentweet_get_profile_growthA
Read-only

Get the user's X profile growth: follower deltas (7/30/90 days), 7d engagement totals, and avg engagement rate. Replaces X Premium+ analytics for OpenTweet users.

Inputs: days, x_account_id.

opentweet_get_top_postsA
Read-only

Get your top-performing tweets ranked by engagement (or other metric). Returns the user's actual best-performing posts with metrics, useful for repurposing or studying what works.

Inputs: days, sort, limit, x_account_id, +1 more.

opentweet_get_tweetA
Read-only

Get full details of a specific tweet by its ID.

Inputs: id (required).

opentweet_list_accountsA
Read-only

List your connected X/Twitter accounts. Use the returned account IDs with x_account_id parameter in other tools to target a specific account.

Inputs: no named parameters.

opentweet_list_evergreen_postsA
Read-only

List posts in your evergreen pool. Shows all source posts that will be automatically reposted on rotation.

Inputs: page, limit, paused, x_account_id.

opentweet_list_tweetsA
Read-only

List your tweets with optional filtering by status. Returns paginated results.

Inputs: page, limit, status, x_account_id.

opentweet_publish_tweetA
Destructive

Publish an existing draft or scheduled tweet immediately to X/Twitter. Requires an active subscription and X account connection.

Inputs: id (required).

opentweet_remove_from_evergreenA
DestructiveIdempotent

Remove a post from the evergreen pool. The post is converted back to a regular draft, not deleted.

Inputs: id (required).

opentweet_repurpose_tweetA
Destructive

Repurpose an existing tweet with AI, transforming it into your own voice. Saves the result as a draft by default.

Inputs: tweet_text (required), tone, instructions, tweet_author, +2 more.

opentweet_schedule_tweetA
DestructiveIdempotent

Schedule an existing draft tweet for a specific date and time. The post must be a draft (not already posted or an evergreen source).

Inputs: id (required), scheduled_date (required).

opentweet_search_inspirationA
Read-only

Search X/Twitter for high-performing tweets to find content inspiration. Returns tweets with engagement metrics. Use filters to narrow results.

Inputs: query (required), lang, has_media, min_likes, +3 more.

opentweet_update_evergreen_postB
DestructiveIdempotent

Update an evergreen post's cooldown period or pause/unpause it.

Inputs: id (required), paused, cooldown_days.

opentweet_update_evergreen_settingsA
DestructiveIdempotent

Update evergreen queue settings. Control whether the queue is active, how many posts per day, posting times, and default cooldown period.

Inputs: enabled, posting_times, posts_per_day, default_cooldown_days.

opentweet_update_tweetA
DestructiveIdempotent

Update an existing tweet. Can change text, category, schedule, or media. Cannot edit already-posted tweets.

Inputs: id (required), text, category, is_thread, +6 more.

opentweet_upload_mediaA
Destructive

Upload an image or video file to use in tweets. Returns a URL that can be passed to create_tweet or update_tweet in the media_urls field. Supported formats: JPG, PNG, GIF, WebP (max 5MB), MP4, MOV (max 20MB).

Inputs: file_path (required).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 30 tools

    Disambiguation5/5

    Each tool targets a distinct function with clear descriptions; potential overlap between get_best_times and analyze_best_times is resolved by descriptions (one fetches existing, the other triggers analysis).

    Naming Consistency5/5

    All tools follow a consistent 'opentweet_verb_noun' snake_case pattern, making it predictable for an agent to infer purpose from names.

    Tool Count4/5

    30 tools is above the typical well-scoped range, but each serves a unique purpose in tweet management, scheduling, evergreen content, analytics, media, and AI features. Slightly heavy but still reasonable.

    Completeness5/5

    The tool set covers full tweet lifecycle (CRUD, scheduling, publishing), evergreen replay, analytics, media upload, AI generation, inspiration search, and profile growth—no obvious gaps for the domain.

    Maintenance

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables AI agents to fully automate X/Twitter interactions including searching, posting, engaging, and managing multiple accounts without paid API keys.
      MIT
    • A
      license
      A
      quality
      D
      maintenance
      Enables Twitter/X marketing automation, including tweet search, account analysis, trending topics, and optional AI-generated tweets and scheduling.
      6
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Provides 19+ tools for AI agents to interact with X/Twitter, including search, posting, analysis, and monitoring capabilities.
      17 npm
      3
      MIT