An MCP Server to interact with X/Twitter besides the official API.
X/Twitter MCP Server
A Model Context Protocol (MCP) server that provides unofficial X/Twitter API access through browser automation using Playwright. This server enables AI agents and applications to interact with X/Twitter programmatically for content creation, scraping, and social media automation.
๐ Features
Content Creation & Interaction
- Tweet & Thread Posting: Post single tweets or multi-tweet threads with media support
- Post Interactions: Like, unlike, retweet, unretweet, bookmark, quote tweet, and reply to posts
- Comment Management: Like, unlike, reply to, and edit comments
- Media Support: Upload and attach images, videos, and GIFs to tweets
Content Scraping & Analysis
- Timeline Scraping: Extract posts from "For You" and "Following" timelines
- Profile Scraping: Get comprehensive user profile data and recent posts
- Search Functionality: Advanced search with filters for viral content, specific users, and date ranges
- Comment Scraping: Extract comments and replies from specific posts
- Trending Topics: Retrieve current trending topics and hashtags
MCP Integration
- Dual Transport Support: Works with both stdio and HTTP/SSE transports
- Tool-based Interface: 20+ tools available for AI agents to interact with X/Twitter
- Structured Responses: JSON-formatted responses with comprehensive metadata
- Error Handling: Robust error handling with descriptive error messages
๐ Prerequisites
- Node.js 18+
- Valid X/Twitter account credentials
- Docker (optional, for containerized deployment)
Quick Start
- Add this configuration to your Claude Desktop config file:
Windows: %APPDATA%\Claude\claude_desktop_config.json
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"x-mcp": {
"command": "npx",
"args": ["-y", "@barresider/x-mcp"],
"env": {
"TWITTER_USERNAME": "your_twitter_username",
"TWITTER_PASSWORD": "your_twitter_password"
}
}
}
}
With proxy (optional):
{
"mcpServers": {
"x-mcp": {
"command": "npx",
"args": ["-y", "@barresider/x-mcp"],
"env": {
"TWITTER_USERNAME": "your_twitter_username",
"TWITTER_PASSWORD": "your_twitter_password",
"PROXY_URL": "http://proxy-server:port"
}
}
}
}
- Restart Claude Desktop
That's it! Claude can now interact with X/Twitter through 25+ powerful tools including:
tweet
: Post a new tweet with optional mediathread
: Post a multi-tweet threadsearch_twitter
: Search for tweets with advanced filtersscrape_profile
: Get comprehensive user profile datascrape_timeline
: Extract posts from timelineslike_post
,retweet_post
,bookmark_post
: Interact with posts- And many more for comprehensive X/Twitter automation
Example Usage
Try asking Claude:
- "Can you post a tweet saying 'Hello from Claude!'"
- "Can you search for tweets about Claude AI?"
- "Can you scrape Elon Musk's profile and show me his latest 5 tweets?"
- "Can you post a thread about the benefits of AI?"
๐ ๏ธ Installation
Local Development Installation
- Clone the repository:
git clone <repository-url>
cd x-mcp
- Install dependencies:
npm install
- Build the project:
npm run build
Docker Installation
- Build the Docker image:
docker build -t x-mcp .
- Or use Docker Compose:
docker-compose --profile mcp up --build
โ๏ธ Configuration
Environment Variables
Create a .env
file in the project root:
# Required: X/Twitter credentials
TWITTER_USERNAME=your_username
TWITTER_PASSWORD=your_password
# Optional: Proxy configuration
PROXY_URL=http://proxy-server:port # Full proxy URL (supports http/https)
# or with authentication
PROXY_URL=http://username:password@proxy-server:port
# or separately
PROXY_URL=http://proxy-server:port
PROXY_USERNAME=proxy_username # Optional: separate username
PROXY_PASSWORD=proxy_password # Optional: separate password
# Optional: MCP server configuration
MCP_TRANSPORT=stdio # Options: stdio, sse, http
MCP_PORT=3000 # Port for HTTP/SSE transport
# Optional: Directory for authentication state (default: playwright/.auth)
AUTH_DIR=playwright/.auth
Authentication Setup
- (Optional) Create authentication directory or set
AUTH_DIR
environment variable:
export AUTH_DIR=/path/to/auth/dir
mkdir -p "${AUTH_DIR:-playwright/.auth}"
- Login to X/Twitter (stores session for reuse):
npm run cli login
# or
node dist/cli.js login
๐ง Available MCP Tools
The server provides 25+ tools for comprehensive X/Twitter interaction:
Authentication & Setup
login
- Authenticate with X/Twitter
Content Creation
tweet
- Post a single tweet with optional mediathread
- Post a multi-tweet threadreply_to_post
- Reply to a specific postquote_tweet
- Quote tweet with additional text
Post Interactions
like_post
/unlike_post
- Like/unlike postsretweet_post
/unretweet_post
- Retweet/unretweet postsbookmark_post
/unbookmark_post
- Bookmark management
Comment Interactions
like_comment_by_id
/unlike_comment_by_id
- Like/unlike commentsreply_to_comment_by_id
- Reply to commentsreplace_comment_by_id
- Edit comments (if supported)
Content Scraping
scrape_posts
- Scrape posts from current pagescrape_profile
- Get user profile and recent postsscrape_comments
- Extract comments from postsscrape_timeline
- Scrape For You/Following timelinesscrape_trending
- Get trending topicssearch_twitter
- General search functionalitysearch_viral
- Search for viral content with minimum engagement
๐ Data Structures
TwitterPost
interface TwitterPost {
postId: string;
author: TwitterUser;
content: string;
timestamp: Date;
media: TwitterMedia[];
metrics: PostMetrics;
engagementRate: number;
isRetweet?: boolean;
retweetedFrom?: TwitterUser;
quotedPost?: TwitterPost;
url: string;
}
TwitterProfile
interface TwitterProfile extends TwitterUser {
bannerUrl?: string;
bio?: string;
location?: string;
website?: string;
joinedDate?: Date;
followingCount: number;
followersCount: number;
postsCount: number;
isFollowing?: boolean;
isFollowedBy?: boolean;
latestPosts?: TwitterPost[];
}
PostMetrics
interface PostMetrics {
likesCount: number;
retweetsCount: number;
quotesCount: number;
repliesCount: number;
impressionsCount: number;
bookmarksCount: number;
}
๐ Security & Best Practices
Rate Limiting
- Implement delays between requests to avoid rate limiting
- Use reasonable limits for scraping operations
- Monitor for rate limit responses
Authentication
- Store credentials securely in environment variables
- Session data is stored in the directory specified by the
AUTH_DIR
environment variable (defaultplaywright/.auth/
) - Regular re-authentication may be required
Error Handling
- All operations include comprehensive error handling
- Descriptive error messages for troubleshooting
- Graceful degradation for missing elements
Proxy Configuration
- Supports HTTP/HTTPS proxies for all browser connections
- Configure via
PROXY_URL
environment variable - Supports authentication with username/password
- Useful for:
- Rotating IP addresses to avoid rate limits
- Accessing X/Twitter from restricted networks
- Adding an extra layer of anonymity
- Example formats:
- Basic:
http://proxy-server:port
- With auth:
http://username:password@proxy-server:port
- Separate auth: Use
PROXY_USERNAME
andPROXY_PASSWORD
- Basic:
๐ณ Docker Deployment
Using Docker Compose
# Start the MCP server
docker-compose --profile mcp up
# With environment variables
TWITTER_USERNAME=your_username TWITTER_PASSWORD=your_password docker-compose --profile mcp up
Custom Docker Run
docker run -d \
--name x-mcp \
-e TWITTER_USERNAME=your_username \
-e TWITTER_PASSWORD=your_password \
-e PROXY_URL=http://proxy-server:port \
-e MCP_TRANSPORT=sse \
-e MCP_PORT=3000 \
-p 3000:3000 \
x-mcp
๐ ๏ธ Development
Project Structure
src/
โโโ mcp.ts # Main MCP server implementation
โโโ cli.ts # Command line interface
โโโ types.ts # TypeScript type definitions
โโโ utils.ts # Utility functions
โโโ behaviors/ # User interaction behaviors
โ โโโ login.ts # Authentication logic
โ โโโ interact-with-post.ts # Post interaction functions
โ โโโ interact-with-comment.ts # Comment interaction functions
โ โโโ upload-media.ts # Media upload functionality
โโโ scrapers/ # Data scraping modules
โโโ index.ts # Scraper exports
โโโ post-scraper.ts # Post scraping logic
โโโ profile-scraper.ts # Profile scraping logic
โโโ comment-scraper.ts # Comment scraping logic
โโโ search-scraper.ts # Search functionality
โโโ timeline-scraper.ts # Timeline scraping
โโโ utils.ts # Scraping utilities
Building and Testing
# Build TypeScript
npm run build
# Run MCP server
npm run mcp
# Run CLI commands
npm run cli <command>
๐ค Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
Guidelines
- Follow TypeScript best practices
- Add comprehensive error handling
- Update type definitions for new features
- Test with real X/Twitter interactions
- Document new functionality
โ ๏ธ Disclaimers
- This is an unofficial tool using browser automation
- X/Twitter's terms of service apply
- Use responsibly and respect rate limits
- UI changes may require updates to selectors
- Not affiliated with X/Twitter
๐ License
[License information here]
๐ Troubleshooting
Common Issues
Authentication Failures
- Verify credentials in
.env
file - Try logging in again with
npm run cli login
- Check for 2FA requirements
Element Not Found Errors
- X/Twitter may have updated their UI
- Clear browser cache and re-authenticate
- Check for element selector updates
Rate Limiting
- Reduce request frequency
- Add delays between operations
- Use smaller batch sizes
Container Issues
- Ensure proper environment variables
- Check port availability
- Verify Docker network configuration
For more help, please open an issue on the project repository.