Skip to main content
Glama
piyushgithub15

twitter-mcp

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-token header — required only for tool calls, not for list/initialize

  • Runtime: Node.js 20+, Express, @modelcontextprotocol/sdk

  • Docker: 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

POST

/mcp

MCP Streamable HTTP endpoint (tools)

GET

/health

Liveness probe

GET

/mcp

405 — not used in stateless mode

DELETE

/mcp

405 — no sessions to delete

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

Media / video posting requires media.write in addition to tweet.write. Re-authorize users after adding the scope so tokens include it.

Tools

Tool

Description

get_me

Authenticated user profile

get_user_by_username

User lookup by handle

get_user_by_id

User lookup by ID

get_tweet

Single tweet by ID

get_user_timeline

User's recent posts

get_user_mentions

Mentions timeline

search_recent_tweets

Recent search (last 7 days)

upload_media

Download a URL and upload image / GIF / video (returns media_id)

post_tweet

Create a post (optional reply / quote / media)

delete_tweet

Delete own post

like_tweet / unlike_tweet

Like management

retweet / undo_retweet

Retweet management

follow_user / unfollow_user

Follow management

Posting media

  1. Call upload_media with media_url (HTTP(S) URL). Type and category are detected from the file.

  2. Wait for { "media_id": "..." } (videos are processed before return).

  3. Call post_tweet with media_ids: ["<media_id>"] and optional text.

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

Build & run production:

npm run build
npm start

Environment variables:

Variable

Default

Description

PORT

3000

HTTP port

HOST

0.0.0.0

Bind address

Docker

# Build
docker build -t twitter-mcp .

# Run
docker run --rm -p 3000:3000 twitter-mcp

# Health check
curl http://localhost:3000/health

Example 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

  1. Stateless Streamable HTTP — each POST /mcp creates a new McpServer + StreamableHTTPServerTransport with sessionIdGenerator: undefined, then tears them down when the response finishes. Safe for horizontal scaling and containers.

  2. Per-request token isolationAsyncLocalStorage holds the optional access token for the duration of the request so concurrent calls never mix credentials. Missing tokens only fail when tools call getAccessToken().

  3. Twitter clienttwitter-api-v2 is constructed with the user access token and used as OAuth 2.0 user-context (Bearer).

License

MIT

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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 npm
    11
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Model 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.
    21
    13 npm
    8
    -
  • F
    license
    Not graded
    quality
    F
    maintenance
    A 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
    -
  • A
    license
    B
    quality
    D
    maintenance
    MCP server for interacting with the X platform (Twitter) via MCP clients like Claude, Cursor AI, and Windsurf AI.
    20
    8 npm
    6
    MIT