Skip to main content
Glama
Jing-yilin

TwitterAPI MCP Server

by Jing-yilin
README.md
# TwitterAPI MCP Server

A Model Context Protocol (MCP) server that provides access to Twitter data through the [TwitterAPI.io](https://twitterapi.io/) service. This server enables Claude and other MCP clients to interact with Twitter's ecosystem without requiring Twitter developer account approval.

> **Attribution**: This project is a fork of [kinhunt/twitterapi-mcp](https://github.com/kinhunt/twitterapi-mcp) with bug fixes and improvements to match the official TwitterAPI.io documentation.

## Features

- **User Information**: Get detailed user profiles, followers, and following lists
- **Tweet Operations**: Search tweets, get tweet details, replies, and user timelines
- **Search Capabilities**: Advanced search for both tweets and users
- **Write Actions**: Post tweets and interact with content (requires login)
- **Pagination Support**: All list endpoints support cursor-based pagination
- **Enterprise Ready**: Proxy support and robust error handling
- **No Twitter Auth**: Uses TwitterAPI.io which doesn't require Twitter developer approval

## Installation

### Quick Start with npx (Recommended)

```bash
npx twitterapi-mcp-server
```

### Global Installation

```bash
npm install -g twitterapi-mcp-server
```

### Local Installation

```bash
npm install twitterapi-mcp-server
```

## Configuration

### Getting an API Key

1. Visit [TwitterAPI.io](https://twitterapi.io/)
2. Create an account and log in
3. Get your API key from the dashboard
4. The API key format looks like: `new1_xxxxxxxxxxxxxxxxxxxxx`

### Environment Variables

| Variable | Required | Description |
|----------|----------|-------------|
| `TWITTERAPI_API_KEY` | Yes | Your TwitterAPI.io API key |
| `PROXY_URL` | No | Proxy URL for enterprise environments |
| `HTTP_PROXY` | No | Alternative proxy configuration |
| `HTTPS_PROXY` | No | Alternative proxy configuration |

## MCP Client Configuration

### Claude Desktop

Add this to your Claude Desktop configuration file:

**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`

**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "twitterapi": {
      "command": "npx",
      "args": ["-y", "twitterapi-mcp-server"],
      "env": {
        "TWITTERAPI_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

### Claude Desktop with Proxy

```json
{
  "mcpServers": {
    "twitterapi": {
      "command": "npx",
      "args": ["-y", "twitterapi-mcp-server"],
      "env": {
        "TWITTERAPI_API_KEY": "your_api_key_here",
        "PROXY_URL": "http://proxy.company.com:8080"
      }
    }
  }
}
```

### Cursor IDE

Add to your Cursor MCP settings (`.cursor/mcp.json`):

```json
{
  "mcpServers": {
    "twitterapi": {
      "command": "npx",
      "args": ["-y", "twitterapi-mcp-server"],
      "env": {
        "TWITTERAPI_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

### Claude Code

Add to your Claude Code MCP settings (`~/.claude/settings.json`):

```json
{
  "mcpServers": {
    "twitterapi": {
      "command": "npx",
      "args": ["-y", "twitterapi-mcp-server"],
      "env": {
        "TWITTERAPI_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

### Using with Node directly

If you prefer to run with Node directly instead of npx:

```json
{
  "mcpServers": {
    "twitterapi": {
      "command": "node",
      "args": ["/path/to/twitterapi-mcp-server/build/index.js"],
      "env": {
        "TWITTERAPI_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

## Available Tools

### User Information

| Tool | Description | Required Params | Optional Params |
|------|-------------|-----------------|-----------------|
| `get_user_by_username` | Get user details by username | `username` | - |
| `get_user_by_id` | Get user details by user ID | `user_id` | - |
| `get_user_followers` | Get user's followers (200/page) | `username` | `cursor`, `pageSize` |
| `get_user_following` | Get users someone follows (200/page) | `username` | `cursor`, `pageSize` |
| `search_users` | Search for users by keyword | `query` | `cursor` |

### Tweet Operations

| Tool | Description | Required Params | Optional Params |
|------|-------------|-----------------|-----------------|
| `get_user_tweets` | Get tweets from a user (20/page) | `username` or `userId` | `cursor`, `includeReplies` |
| `search_tweets` | Search tweets by keywords | `query` | `queryType` (Latest/Top), `cursor` |
| `get_tweet_by_id` | Get tweets by IDs | `tweet_ids` (array) | - |
| `get_tweet_replies` | Get replies to a tweet (20/page) | `tweetId` | `cursor`, `sinceTime`, `untilTime` |

### Write Actions (Requires Login)

| Tool | Description | Required Params | Optional Params |
|------|-------------|-----------------|-----------------|
| `login_user` | Login to Twitter account | `user_name`, `email`, `password`, `proxy` | `totp_secret` |
| `create_tweet` | Post new tweets | `tweet_text`, `proxy` | `reply_to_tweet_id`, `attachment_url`, `media_ids` |

## Examples

### Get User Information

```typescript
// Get user by username
await get_user_by_username({ username: "elonmusk" })

// Get user followers with pagination
await get_user_followers({
  username: "elonmusk",
  pageSize: 100
})

// Get next page using cursor
await get_user_followers({
  username: "elonmusk",
  cursor: "next_cursor_from_previous_response"
})
```

### Search and Retrieve Tweets

```typescript
// Search latest tweets
await search_tweets({
  query: "artificial intelligence",
  queryType: "Latest"
})

// Search top/popular tweets
await search_tweets({
  query: "OpenAI",
  queryType: "Top"
})

// Advanced search with operators
await search_tweets({
  query: "AI from:elonmusk since:2024-01-01"
})

// Get user's recent tweets
await get_user_tweets({ username: "openai" })

// Get user's tweets including replies
await get_user_tweets({
  username: "openai",
  includeReplies: true
})

// Get specific tweets by IDs
await get_tweet_by_id({
  tweet_ids: ["1234567890123456789", "9876543210987654321"]
})

// Get replies to a tweet
await get_tweet_replies({
  tweetId: "1234567890123456789"
})
```

### Create Content (Requires Login)

```typescript
// Login first (requires residential proxy)
await login_user({
  user_name: "your_username",
  email: "your_email@example.com",
  password: "your_password",
  proxy: "http://user:pass@proxy:port"
})

// Post a tweet
await create_tweet({
  tweet_text: "Hello from MCP!",
  proxy: "http://user:pass@proxy:port"
})

// Reply to a tweet
await create_tweet({
  tweet_text: "Great point!",
  reply_to_tweet_id: "1234567890123456789",
  proxy: "http://user:pass@proxy:port"
})
```

## Pagination

All list endpoints return paginated results with cursor-based navigation:

```json
{
  "data": [...],
  "has_next_page": true,
  "next_cursor": "cursor_string_for_next_page"
}
```

To get the next page, pass the `next_cursor` value as the `cursor` parameter in your next request.

## API Pricing

TwitterAPI.io offers pay-as-you-go pricing:

| Operation | Price |
|-----------|-------|
| Tweets | $0.15 per 1,000 |
| User profiles | $0.18 per 1,000 |
| Followers/Following | $0.15 per 1,000 |
| Login | $0.003 per call |
| Create tweet | $0.003 per call |

- Minimum charge: $0.00015 per request
- No monthly fees
- Free trial credits available
- Discounted rates for students and research institutions

## Development

### Building from Source

```bash
git clone https://github.com/Jing-yilin/twitterapi-mcp-server.git
cd twitterapi-mcp-server
npm install
npm run build
```

### Running Tests

```bash
# Using bun
bun test

# Or with npm (requires bun installed)
npm test
```

### Testing the Server Manually

```bash
# Set your API key
export TWITTERAPI_API_KEY="your_api_key"

# Test tools list
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}' | node build/index.js

# Test a tool call
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "get_user_by_username", "arguments": {"username": "elonmusk"}}}' | node build/index.js
```

## Project Structure

```
twitterapi-mcp-server/
├── src/
│   ├── index.ts           # Main server implementation
│   ├── index.test.ts      # Unit tests
│   └── integration.test.ts # Integration tests
├── build/                  # Compiled JavaScript
├── package.json
├── tsconfig.json
└── README.md
```

## Error Handling

The server handles common errors:

| Error | Cause | Solution |
|-------|-------|----------|
| 401 Unauthorized | Invalid API key | Check your `TWITTERAPI_API_KEY` |
| 402 Payment Required | Insufficient credits | Add credits at TwitterAPI.io dashboard |
| 429 Rate Limited | Too many requests | Wait and retry, or reduce request rate |
| 400 Bad Request | Invalid parameters | Check parameter names and formats |

## Security Considerations

- Store API keys as environment variables, never in code
- Login credentials are used only for authentication, not stored persistently
- All API requests use HTTPS
- Proxy support available for enterprise security requirements
- The `login_cookie` from login is stored in memory only for the session

## Troubleshooting

### "Unauthorized" error
- Verify your API key is correct
- Check that `TWITTERAPI_API_KEY` environment variable is set

### "Credits not enough" error
- Add credits to your TwitterAPI.io account
- Check your usage at the dashboard

### Server not starting
- Ensure Node.js >= 18.0.0 is installed
- Run `npm run build` to compile TypeScript
- Check for error messages in stderr

### Proxy issues
- Verify proxy URL format: `http://user:pass@host:port`
- Test proxy connectivity independently
- For HTTPS proxies, use `HTTPS_PROXY` variable

## Contributing

1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

## Support

- **API Documentation**: [docs.twitterapi.io](https://docs.twitterapi.io/)
- **Issues**: [GitHub Issues](https://github.com/Jing-yilin/twitterapi-mcp-server/issues)
- **TwitterAPI.io Support**: [twitterapi.io](https://twitterapi.io/)

## Acknowledgments

- Originally forked from [kinhunt/twitterapi-mcp](https://github.com/kinhunt/twitterapi-mcp)
- Built on [TwitterAPI.io](https://twitterapi.io/) service
- Uses the [Model Context Protocol](https://modelcontextprotocol.io/)
- Part of the growing MCP ecosystem

---

**Note**: This is an unofficial MCP server for TwitterAPI.io. Make sure to comply with Twitter's Terms of Service when using this tool.

TDQS

B3.4/5.0

Scored across 11 tools

Disambiguation5/5

Every tool has a clearly distinct purpose with no ambiguity. Each targets a specific resource (tweet, user) and action (create, get, search, login), making it easy for an agent to select the correct tool. For example, get_user_by_id and get_user_by_username are clearly differentiated by the identifier type.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern with snake_case throughout, such as create_tweet, get_tweet_by_id, and search_users. This predictability enhances usability and reduces confusion for agents.

Tool Count5/5

With 11 tools, the count is well-scoped for a Twitter API server, covering core operations like posting, retrieving, and searching tweets and users, plus authentication. Each tool earns its place without being overwhelming or insufficient.

Completeness4/5

The tool set provides strong coverage for read operations (get, search) and a key write action (create_tweet), with authentication handled via login_user. However, it lacks update and delete operations for tweets or user interactions (e.g., like, retweet, follow), which are common in Twitter workflows, leaving minor gaps.

Maintenance

ActivityInactive
ResponsivenessNo issues