Skip to main content
Glama
Polsia-Inc

twitter-read

by Polsia-Inc
README.md
# Twitter Read MCP Server

<!-- mcp-name: twitter-read -->

An MCP (Model Context Protocol) server for reading Twitter/X engagement data and metrics. Enables AI agents to measure tweet performance, track mentions, analyze replies, and search tweets with engagement metrics.

## Features

- **Get Tweet Metrics**: Fetch likes, retweets, replies, quotes, bookmarks, and impressions for any tweet
- **Get Mentions**: Retrieve recent @mentions with engagement data
- **Get Replies**: Access all replies to a specific tweet with metrics
- **Search Tweets**: Search Twitter with engagement metrics included
- **Built-in Rate Limiting**: Enforces Twitter API limits (500 requests per 15 minutes)
- **OAuth 2.0 Support**: Compatible with Twitter API v2 authentication

## Installation

### Prerequisites

- Node.js 18 or higher
- Twitter API credentials (Bearer Token or API Key + Secret)

### From Source

```bash
git clone <repository-url>
cd twitter-read-mcp
npm install
npm run build
```

### From npm (future)

```bash
npm install -g @polsia/twitter-read-mcp
```

## Configuration

### Twitter API Credentials

You need Twitter API access. Get credentials from [Twitter Developer Portal](https://developer.twitter.com/):

1. Create a Twitter Developer account
2. Create a new App
3. Generate credentials

### Environment Variables

Create a `.env` file or set environment variables:

```bash
# Option 1: Bearer Token (recommended for read-only access)
TWITTER_BEARER_TOKEN=your_bearer_token_here

# Option 2: API Key + Secret (for OAuth 2.0)
TWITTER_API_KEY=your_api_key_here
TWITTER_API_SECRET=your_api_secret_here
```

**Note**: Bearer token is simpler for read-only operations. API Key + Secret is required for user-context operations like getting your own mentions.

### MCP Configuration

Add to your MCP settings file (e.g., Claude Desktop config):

```json
{
  "mcpServers": {
    "twitter-read": {
      "command": "twitter-read-mcp",
      "env": {
        "TWITTER_BEARER_TOKEN": "your_bearer_token_here"
      }
    }
  }
}
```

Or if installed from source:

```json
{
  "mcpServers": {
    "twitter-read": {
      "command": "node",
      "args": ["/path/to/twitter-read-mcp/build/index.js"],
      "env": {
        "TWITTER_BEARER_TOKEN": "your_bearer_token_here"
      }
    }
  }
}
```

## Usage

### Available Tools

#### 1. `get_tweet_metrics`

Get engagement metrics for a specific tweet.

**Parameters:**
- `tweet_id` (required): The ID of the tweet

**Returns:**
```json
{
  "tweet_id": "1234567890",
  "text": "Tweet content here",
  "created_at": "2026-01-25T00:00:00.000Z",
  "author_id": "1234567890",
  "metrics": {
    "likes": 42,
    "retweets": 8,
    "replies": 5,
    "quotes": 2,
    "bookmarks": 10,
    "impressions": 5000
  },
  "requestsRemaining": 498
}
```

**Example:**
```
Get metrics for tweet 1882163408476512603
```

#### 2. `get_mentions`

Get recent @mentions of your account.

**Parameters:**
- `since_date` (optional): ISO 8601 date (e.g., "2026-01-20T00:00:00Z")
- `max_results` (optional): Number of mentions to return (5-100, default: 10)

**Returns:**
```json
{
  "mentions": [
    {
      "tweet_id": "1234567890",
      "text": "@yourhandle great work!",
      "created_at": "2026-01-25T00:00:00.000Z",
      "author_id": "9876543210",
      "metrics": {
        "likes": 5,
        "retweets": 1,
        "replies": 0,
        "quotes": 0
      }
    }
  ],
  "count": 1,
  "requestsRemaining": 497
}
```

**Example:**
```
Show me mentions from the last 24 hours
```

#### 3. `get_replies`

Get all replies to a specific tweet.

**Parameters:**
- `tweet_id` (required): The ID of the tweet
- `max_results` (optional): Number of replies to return (5-100, default: 10)

**Returns:**
```json
{
  "replies": [
    {
      "tweet_id": "1234567891",
      "text": "This is a reply",
      "created_at": "2026-01-25T01:00:00.000Z",
      "author_id": "9876543210",
      "metrics": {
        "likes": 2,
        "retweets": 0,
        "replies": 1,
        "quotes": 0
      }
    }
  ],
  "count": 1,
  "requestsRemaining": 496
}
```

**Example:**
```
Get all replies to tweet 1882163408476512603
```

#### 4. `search_tweets`

Search for tweets matching a query with engagement metrics.

**Parameters:**
- `query` (required): Search query (supports [Twitter search operators](https://developer.twitter.com/en/docs/twitter-api/tweets/search/integrate/build-a-query))
- `max_results` (optional): Number of tweets to return (10-100, default: 10)
- `start_time` (optional): ISO 8601 date for earliest tweet

**Returns:**
```json
{
  "tweets": [
    {
      "tweet_id": "1234567890",
      "text": "Tweet matching your query",
      "created_at": "2026-01-25T00:00:00.000Z",
      "author_id": "1234567890",
      "metrics": {
        "likes": 100,
        "retweets": 20,
        "replies": 10,
        "quotes": 5
      }
    }
  ],
  "count": 1,
  "query": "from:polsiaHQ",
  "requestsRemaining": 495
}
```

**Example:**
```
Search for tweets from @polsiaHQ in the last week
```

## Rate Limiting

The server enforces Twitter API v2 rate limits:
- **500 requests per 15-minute window**
- Each tool response includes `requestsRemaining` field
- Requests beyond the limit return a rate limit error

## Development

### Building

```bash
npm run build
```

### Watch Mode

```bash
npm run watch
```

### Testing Locally

Run the MCP server directly:

```bash
export TWITTER_BEARER_TOKEN=your_token
npm run dev
```

The server communicates via stdio, so you'll need an MCP client to interact with it.

## Architecture

- **Language**: TypeScript
- **MCP SDK**: `@modelcontextprotocol/sdk` v1.x
- **Twitter Client**: `twitter-api-v2` for Twitter API v2
- **Transport**: stdio (standard MCP transport)
- **Authentication**: Bearer Token or OAuth 2.0 PKCE

## Error Handling

All tools return structured error responses:

```json
{
  "error": "Error message",
  "code": "ERROR_CODE",
  "requestsRemaining": 499
}
```

Common errors:
- `Rate limit exceeded`: Too many requests in 15-minute window
- `Missing Twitter API credentials`: Environment variables not set
- `Invalid tweet ID`: Tweet doesn't exist or is private
- `Search query too complex`: Simplify your search query

## Contributing

This project is part of the Polsia ecosystem. Contributions are welcome!

1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Submit a pull request

## Roadmap

- [ ] OAuth 2.0 PKCE flow for user authentication
- [ ] Caching layer for frequently accessed tweets
- [ ] Batch operations for multiple tweets
- [ ] Historical data fetching (7-day window)
- [ ] User profile metrics
- [ ] List management tools

## License

MIT License - See LICENSE file for details

## Support

- **Documentation**: [Twitter API v2 Docs](https://developer.twitter.com/en/docs/twitter-api)
- **MCP Specification**: [Model Context Protocol](https://modelcontextprotocol.io/)
- **Issues**: Report bugs and feature requests on GitHub

## Credits

Built by Polsia for measuring marketing performance on Twitter/X. Powered by the Model Context Protocol from Anthropic.

TDQS

A3.8/5.0

Scored across 4 tools

Disambiguation5/5

Each tool targets a distinct operation: mentions, replies, metrics, and search. No overlap in purpose, and descriptions clearly differentiate them.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (get_mentions, get_replies, get_tweet_metrics, search_tweets), making the naming predictable and easy to understand.

Tool Count5/5

Four tools is appropriate for a read-only Twitter server, covering the main data retrieval needs without being too sparse or excessive.

Completeness4/5

The tool set covers mentions, replies, metrics, and search, but lacks a tool to fetch the text of a specific tweet directly (metrics-only tool assumes you already have the tweet). This is a minor gap for a read server.

Maintenance

ActivityInactive
ResponsivenessNo issues