
A Model Context Protocol (MCP) server for interacting with Twitter (X) via AI tools. This server allows you to fetch tweets, post tweets, search Twitter, manage followers, and more, all through natural language commands in AI Tools.
Features
- Fetch user profiles, followers, and following lists.
- Post, delete, and favorite tweets.
- Search Twitter for tweets and trends.
- Manage bookmarks and timelines.
- Built-in rate limit handling for the Twitter API.
- Uses Twitter API v2 with proper authentication (API keys and tokens), avoiding the username/password hack to minimize the risk of account suspensions.
- Provides a complete implementation of Twitter API v2 endpoints for user management, tweet management, timelines, and search functionality.
Prerequisites
- Python 3.10 or higher: Ensure Python is installed on your system.
- Twitter Developer Account: You need API credentials (API Key, API Secret, Access Token, Access Token Secret, and Bearer Token) from the Twitter Developer Portal.
- Optional: Claude Desktop: Download and install the Claude Desktop app from the Anthropic website.
- Optional: Node.js (for MCP integration): Required for running MCP servers in Claude Desktop.
- A package manager like
uv or pip for Python dependencies.
Installation
Option 1: Installing via Smithery (Recommended)
To install X (Twitter) MCP server for Claude Desktop automatically via Smithery:
npx -y @smithery/cli install @rafaljanicki/x-twitter-mcp-server --client claude
Option 2: Install from PyPI
The easiest way to install x-twitter-mcp is via PyPI:
pip install x-twitter-mcp
Option 3: Install from Source
If you prefer to install from the source repository:
Clone the Repository:
git clone https://github.com/rafaljanicki/x-twitter-mcp-server.git
cd x-twitter-mcp-server
Set Up a Virtual Environment (optional but recommended):
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
Install Dependencies:
Using uv (recommended, as the project uses uv.lock):
uv sync
Alternatively, using pip:
pip install .
Configure Environment Variables:
- Create a
.env file in the project root (you can copy .env.example if provided).
- Add your Twitter API credentials:
TWITTER_API_KEY=your_api_key
TWITTER_API_SECRET=your_api_secret
TWITTER_ACCESS_TOKEN=your_access_token
TWITTER_ACCESS_TOKEN_SECRET=your_access_token_secret
TWITTER_BEARER_TOKEN=your_bearer_token
- To use bookmark tools (
get_bookmarks, delete_all_bookmarks), also add an OAuth 2.0 user access token:TWITTER_OAUTH2_USER_ACCESS_TOKEN=your_oauth2_user_token
See Obtaining an OAuth 2.0 User Token below.
Obtaining an OAuth 2.0 User Token
The bookmark endpoints (GET /2/users/:id/bookmarks, DELETE /2/users/:id/bookmarks/:tweet_id) require OAuth 2.0 User Context — they reject both app-only bearer tokens and OAuth 1.0a. You need to perform the PKCE authorization flow once to obtain a user-scoped token.
Steps
In the Twitter Developer Portal, open your app → Settings → User authentication settings and enable OAuth 2.0. Set a callback URL (e.g. https://localhost/).
Run the PKCE flow using Tweepy:
import tweepy
handler = tweepy.OAuth2UserHandler(
client_id="YOUR_CLIENT_ID", # OAuth 2.0 Client ID (from Developer Portal)
redirect_uri="https://localhost/",
scope=["bookmark.read", "bookmark.write", "users.read", "offline.access"],
client_secret="YOUR_CLIENT_SECRET", # Optional for public clients
)
print(handler.get_authorization_url())
# Open the URL, authorize, copy the redirected URL, then:
redirected_url = input("Paste redirected URL: ")
token = handler.fetch_token(redirected_url)
print(token["access_token"])
- Set the resulting token as
TWITTER_OAUTH2_USER_ACCESS_TOKEN in your environment or .env file.
Running the Server
Preferred transport is Streamable HTTP. Use one of the following:
Recommended: Streamable HTTP (Docker/Smithery)
Run the server as an HTTP service with Streamable HTTP and SSE endpoints.
Build the Docker image:
docker build -t x-twitter-mcp .
Run the container (Smithery uses PORT; default here is 8081):
docker run -p 8081:8081 -e PORT=8081 x-twitter-mcp
Endpoints:
- Streamable HTTP (JSON-RPC over HTTP):
POST http://localhost:8081/mcp
- SSE (Server-Sent Events):
GET http://localhost:8081/sse
Pass config per-request (recommended in Smithery) via base64-encoded config query parameter. Example config JSON:
{"twitterApiKey":"...","twitterApiSecret":"...","twitterAccessToken":"...","twitterAccessTokenSecret":"...","twitterBearerToken":"..."}
Encode and call initialize:
CONFIG_B64=$(printf '%s' '{"twitterApiKey":"YOUR_KEY","twitterApiSecret":"YOUR_SECRET","twitterAccessToken":"YOUR_TOKEN","twitterAccessTokenSecret":"YOUR_TOKEN_SECRET","twitterBearerToken":"YOUR_BEARER"}' | base64)
curl -sS -X POST "http://localhost:8081/mcp?config=${CONFIG_B64}" \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":"1","method":"initialize","params":{"capabilities":{}}}'
Notes:
- A
POST / will return 404; use /mcp for Streamable HTTP and /sse for SSE.
- When deployed via Smithery,
smithery.yaml is configured for runtime: container and startCommand.type: http.
Streamable HTTP (Local, no Docker)
Run the ASGI server directly.
If installed from PyPI:
python -m x_twitter_mcp.http_server
If installed from source with uv:
uv run python -m x_twitter_mcp.http_server
Endpoints and config passing are the same as above.
Legacy STDIO (CLI Script)
The project also exposes a STDIO CLI script x-twitter-mcp-server for desktop clients that expect STDIO.
If installed from PyPI:
x-twitter-mcp-server
If installed from source with uv:
uv run x-twitter-mcp-server
Using with Claude Desktop
To use this MCP server with Claude Desktop, you need to configure Claude to connect to the server. Follow these steps:
Step 1: Install Node.js
Claude Desktop uses Node.js to run MCP servers. If you don't have Node.js installed:
- Download and install Node.js from nodejs.org.
- Verify installation:
node --version
Step 2: Locate Claude Desktop Configuration
Claude Desktop uses a claude_desktop_config.json file to configure MCP servers.
- Windows:
%APPDATA%\Claude\claude_desktop_config.json
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
If the file doesn't exist, create it.
Edit claude_desktop_config.json to include the x-twitter-mcp server. Replace /path/to/x-twitter-mcp-server with the actual path to your project directory (if installed from source) or the path to your Python executable (if installed from PyPI).
If installed from PyPI:
{
"mcpServers": {
"x-twitter-mcp": {
"command": "x-twitter-mcp-server",
"args": [],
"env": {
"PYTHONUNBUFFERED": "1",
"TWITTER_API_KEY": "your_api_key",
"TWITTER_API_SECRET": "your_api_secret",
"TWITTER_ACCESS_TOKEN": "your_access_token",
"TWITTER_ACCESS_TOKEN_SECRET": "your_access_token_secret",
"TWITTER_BEARER_TOKEN": "your_bearer_token",
"TWITTER_OAUTH2_USER_ACCESS_TOKEN": "your_oauth2_user_token"
}
}
}
}
If installed from source with uv:
{
"mcpServers": {
"x-twitter-mcp": {
"command": "uv",
"args": [
"--directory",
"/path/to/x-twitter-mcp-server",
"run",
"x-twitter-mcp-server"
],
"env": {
"PYTHONUNBUFFERED": "1"
}
}
}
}
"command": "x-twitter-mcp-server": Uses the CLI script directly if installed from PyPI.
"env": If installed from PyPI, you may need to provide environment variables directly in the config (since there's no .env file). If installed from source, the .env file will be used.
"env": {"PYTHONUNBUFFERED": "1"}: Ensures output is unbuffered for better logging in Claude.
Step 4: Restart Claude Desktop
- Quit Claude Desktop completely.
- Reopen Claude Desktop to load the new configuration.
Step 5: Verify Connection
- Open Claude Desktop.
- Look for a hammer or connector icon in the input area (bottom right corner). This indicates MCP tools are available.
- Click the icon to see the available tools from
x-twitter-mcp, such as post_tweet, search_twitter, get_user_profile, etc.
Step 6: Test with Claude
You can now interact with Twitter using natural language in Claude Desktop. Here are some example prompts:
Fetch a User Profile:
Get the Twitter profile for user ID 123456.
Claude will call the get_user_profile tool and return the user's details.
Post a Tweet:
Post a tweet saying "Hello from Claude Desktop! #MCP"
Claude will use the post_tweet tool to post the tweet and confirm the action.
Search Twitter:
Search Twitter for recent tweets about AI.
Claude will invoke the search_twitter tool and return relevant tweets.
Get Trends:
What are the current trending topics on Twitter?
Claude will use the get_trends tool to fetch trending topics.
When prompted, grant Claude permission to use the MCP tools for the chat session.
OpenClaw Companion Workflow
This MCP server is best when an MCP client should call Twitter API v2 tools directly. If the workflow runs in OpenClaw and needs plugin install metadata, endpoint discovery, monitor alerts, webhooks, giveaway draws, media upload or download workflows, direct messages, follower export, or approval-gated post and reply actions, use TweetClaw as a separate OpenClaw plugin and pass reviewed tweet IDs or URLs between the tools.
See OpenClaw Companion Workflow for a command flow that keeps credentials separate and avoids duplicate write actions.
Below is a list of all tools provided by the x-twitter-mcp server, along with example executions in Claude Desktop using natural language prompts.
get_user_profile
get_user_by_screen_name
get_user_by_id
get_user_followers
get_user_following
get_user_followers_you_know
get_user_subscriptions
vote_on_poll
delete_bookmark
delete_all_bookmarks
get_bookmarks
get_timeline
get_latest_timeline
get_trends
get_user_mentions
Troubleshooting
Contributing
Contributions are welcome! Please open an issue or submit a pull request on the GitHub repository.
License
This project is licensed under the MIT License. See the LICENSE file for details.
Author