twitter-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@twitter-mcppost a tweet saying "Hello world!""
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Twitter MCP Server
TypeScript Model Context Protocol server for the Twitter/X API v2.
Transport: Streamable HTTP (stateless)
Auth: OAuth user access token via the
access-tokenheader — required only for tool calls, not for list/initializeRuntime: Node.js 20+, Express,
@modelcontextprotocol/sdkDocker: multi-stage production image included
This server does not run the OAuth dance itself. Obtain a user access token from your OAuth 2.0 (or OAuth 1.0a user-context) flow and send it when invoking tools.
Endpoints
Method | Path | Description |
|
| MCP Streamable HTTP endpoint (tools) |
|
| Liveness probe |
|
|
|
|
|
|
Related MCP server: X.com MCP Server
Authentication
access-token is not required for protocol/list methods (initialize, tools/list, ping, etc.). It is required when calling a tool that hits the Twitter API.
POST /mcp HTTP/1.1
Host: localhost:3000
Content-Type: application/json
Accept: application/json, text/event-stream
access-token: <OAUTH_USER_ACCESS_TOKEN>Fallback (also accepted):
Authorization: Bearer <OAUTH_USER_ACCESS_TOKEN>If a tool is called without a token, the tool returns an error:
Missing access token. Tool calls require an OAuth user access token via the `access-token` header …Suggested OAuth 2.0 scopes for full tool coverage:
tweet.read tweet.write users.read follows.read follows.write media.write offline.accessMedia / video posting requires
media.writein addition totweet.write. Re-authorize users after adding the scope so tokens include it.
Tools
Tool | Description |
| Authenticated user profile |
| User lookup by handle |
| User lookup by ID |
| Single tweet by ID |
| User's recent posts |
| Mentions timeline |
| Recent search (last 7 days) |
| Download a URL and upload image / GIF / video (returns |
| Create a post (optional reply / quote / media) |
| Delete own post |
| Like management |
| Retweet management |
| Follow management |
Posting media
Call
upload_mediawithmedia_url(HTTP(S) URL). Type and category are detected from the file.Wait for
{ "media_id": "..." }(videos are processed before return).Call
post_tweetwithmedia_ids: ["<media_id>"]and optionaltext.
X post media (official limits):
Kind | Formats | Size | Per post |
Image | JPEG, PNG, WEBP | 5 MB each | up to 4 |
GIF | GIF | 15 MB (≤1280×1080, ≤350 frames) | 1 |
Video | H.264 MP4 or MOV, AAC audio | 0.5 s–20 min (125 min Premium); this server loads up to 512 MB | 1 |
Do not mix types. Audio (MP3 / WAV / M4A) is not supported — mux it into an MP4 first.
Local development
npm install
npm run dev
# → http://0.0.0.0:3000/mcpBuild & run production:
npm run build
npm startEnvironment variables:
Variable | Default | Description |
|
| HTTP port |
|
| Bind address |
Docker
# Build
docker build -t twitter-mcp .
# Run
docker run --rm -p 3000:3000 twitter-mcp
# Health check
curl http://localhost:3000/healthExample MCP initialize (curl)
No token needed for initialize / tools/list:
curl -sS http://localhost:3000/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-03-26",
"capabilities": {},
"clientInfo": { "name": "curl", "version": "1.0.0" }
}
}'Tool calls need the token:
curl -sS http://localhost:3000/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H 'access-token: YOUR_TOKEN' \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": { "name": "get_me", "arguments": {} }
}'Architecture notes
Stateless Streamable HTTP — each
POST /mcpcreates a newMcpServer+StreamableHTTPServerTransportwithsessionIdGenerator: undefined, then tears them down when the response finishes. Safe for horizontal scaling and containers.Per-request token isolation —
AsyncLocalStorageholds the optional access token for the duration of the request so concurrent calls never mix credentials. Missing tokens only fail when tools callgetAccessToken().Twitter client —
twitter-api-v2is constructed with the user access token and used as OAuth 2.0 user-context (Bearer).
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
Twitter/X read-only MCP server — 12 tools: search, users, tweets, followers, timelines, trends.
FastMCP server for posting formatted content to X (Twitter) — Tollbooth-monetized, DPYC-native
128 REST operations. 120 MCP routes; 119 JSON/text ops. OAuth 2.1. Not affiliated with X Corp.
MCP server for QPost — lets AI agents publish video and image posts to YouTube, TikTok, Instagram.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA Model Context Protocol server that enables AI models and applications to interact directly with Twitter/X, providing capabilities to create posts, reply to tweets, retrieve user data, and manage account actions.6 npm11MIT
- FlicenseAqualityDmaintenanceModel Context Protocol server that enables LLMs to interact with X.com (formerly Twitter) through OAuth 2.0 authentication, supporting major Post-related operations including reading, writing, searching, and managing posts, likes, retweets, and bookmarks.2113 npm8-

X API FastMCP Serverofficial
FlicenseNot gradedqualityFmaintenanceA local MCP server that exposes the X API (formerly Twitter API) as tools, enabling operations like posting, searching, user management, and more via natural language commands.856-- AlicenseBqualityDmaintenanceMCP server for interacting with the X platform (Twitter) via MCP clients like Claude, Cursor AI, and Windsurf AI.208 npm6MIT