X (Twitter) MCP Server
by role1776io.github.Role1776/mcp-xv0.1.1
Search, read and publish X posts and manage users, lists and media via the X API v2.
context tax
queued
security
queued
cold start
queued
freshness
Active30d ago
Install X (Twitter) MCP server
Install in Claude Code
claude mcp add x-role1776 -e X_API_KEY='<x-api-key>' -e X_API_KEY_SECRET='<x-api-key-secret>' -e X_ACCESS_TOKEN='<x-access-token>' -e X_ACCESS_TOKEN_SECRET='<x-access-token-secret>' -e MEDIA_ROOT='<media-root>' -- docker run -i --rm -e X_API_KEY -e X_API_KEY_SECRET -e X_ACCESS_TOKEN -e X_ACCESS_TOKEN_SECRET -e MEDIA_ROOT ghcr.io/role1776/mcp-x:0.1.1Install in Cursor
{
"mcpServers": {
"x-role1776": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"X_API_KEY",
"-e",
"X_API_KEY_SECRET",
"-e",
"X_ACCESS_TOKEN",
"-e",
"X_ACCESS_TOKEN_SECRET",
"-e",
"MEDIA_ROOT",
"ghcr.io/role1776/mcp-x:0.1.1"
],
"env": {
"X_API_KEY": "<x-api-key>",
"X_API_KEY_SECRET": "<x-api-key-secret>",
"X_ACCESS_TOKEN": "<x-access-token>",
"X_ACCESS_TOKEN_SECRET": "<x-access-token-secret>",
"MEDIA_ROOT": "<media-root>"
}
}
}
}Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project).
Install in Claude Desktop
{
"mcpServers": {
"x-role1776": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"X_API_KEY",
"-e",
"X_API_KEY_SECRET",
"-e",
"X_ACCESS_TOKEN",
"-e",
"X_ACCESS_TOKEN_SECRET",
"-e",
"MEDIA_ROOT",
"ghcr.io/role1776/mcp-x:0.1.1"
],
"env": {
"X_API_KEY": "<x-api-key>",
"X_API_KEY_SECRET": "<x-api-key-secret>",
"X_ACCESS_TOKEN": "<x-access-token>",
"X_ACCESS_TOKEN_SECRET": "<x-access-token-secret>",
"MEDIA_ROOT": "<media-root>"
}
}
}
}Settings → Developer → Edit Config (claude_desktop_config.json), then restart.
Install in VS Code
{
"servers": {
"x-role1776": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"X_API_KEY",
"-e",
"X_API_KEY_SECRET",
"-e",
"X_ACCESS_TOKEN",
"-e",
"X_ACCESS_TOKEN_SECRET",
"-e",
"MEDIA_ROOT",
"ghcr.io/role1776/mcp-x:0.1.1"
],
"env": {
"X_API_KEY": "<x-api-key>",
"X_API_KEY_SECRET": "<x-api-key-secret>",
"X_ACCESS_TOKEN": "<x-access-token>",
"X_ACCESS_TOKEN_SECRET": "<x-access-token-secret>",
"MEDIA_ROOT": "<media-root>"
}
}
}
}Add to .vscode/mcp.json in your workspace.
Install in Windsurf
{
"mcpServers": {
"x-role1776": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"X_API_KEY",
"-e",
"X_API_KEY_SECRET",
"-e",
"X_ACCESS_TOKEN",
"-e",
"X_ACCESS_TOKEN_SECRET",
"-e",
"MEDIA_ROOT",
"ghcr.io/role1776/mcp-x:0.1.1"
],
"env": {
"X_API_KEY": "<x-api-key>",
"X_API_KEY_SECRET": "<x-api-key-secret>",
"X_ACCESS_TOKEN": "<x-access-token>",
"X_ACCESS_TOKEN_SECRET": "<x-access-token-secret>",
"MEDIA_ROOT": "<media-root>"
}
}
}
}Add to ~/.codeium/windsurf/mcp_config.json.
Configuration
| Variable | Required | Secret | Description |
|---|---|---|---|
| X_API_KEY | yes | yes | OAuth 1.0a consumer key. developer.x.com -> your project -> your app -> Keys and tokens. |
| X_API_KEY_SECRET | yes | yes | OAuth 1.0a consumer secret, issued together with X_API_KEY. |
| X_ACCESS_TOKEN | yes | yes | User access token. Set the app permissions to Read and Write BEFORE generating it: a token keeps the permissions it was created with, and a read-only one fails every write until it is regenerated. |
| X_ACCESS_TOKEN_SECRET | yes | yes | User access token secret, issued together with X_ACCESS_TOKEN. |
| MEDIA_ROOT | yes | — | Absolute path to an existing directory - the only one x_media_upload may read files from. Anything outside it is refused, symlinks included. Checked at startup. |
| MCP_TRANSPORT | — | — | stdio (client spawns the process) or http (streamable HTTP listener). |
| MCP_NAME | — | — | Server name reported in the MCP initialize handshake. |
| MCP_PATH | — | — | HTTP path the MCP endpoint is served on. Used only when MCP_TRANSPORT=http. |
| SERVER_PORT | — | — | TCP port to listen on. Used only when MCP_TRANSPORT=http. |
| SERVER_READ_TIMEOUT | — | — | HTTP read timeout as a Go duration. Used only when MCP_TRANSPORT=http. |
| SERVER_WRITE_TIMEOUT | — | — | HTTP write timeout as a Go duration. Used only when MCP_TRANSPORT=http. |
| LOG_MODE | — | — | local (text, debug) or prod (JSON, info). Logs go to stderr. |
| MAX_IDLE_CONNS_PER_HOST | — | — | Idle connections the outbound HTTP client keeps per host. |
| X_DEBUG | — | — | Log the raw requests sent to the X API. Verbose; the output can contain request details, so keep it off outside debugging. |
| POSTS_MAX_QUERIES | — | — | Queries accepted in one x_posts_search or x_posts_count call. |
| POSTS_MAX_USERNAMES | — | — | Usernames accepted in one x_posts_by_user call. |
| POSTS_MAX_IDS | — | — | Post ids accepted in one x_posts_lookup call. The X API caps this at 100. |
| POSTS_DEFAULT_RESULTS | — | — | Posts returned per query when the call does not ask for a count. Every post returned is billed. |
| POSTS_MAX_RESULTS | — | — | Upper bound for posts per query. The X API caps this at 100. |
| POSTS_DEFAULT_DAYS | — | — | How far back post searches look when the call does not say, in days. |
| POSTS_MAX_DAYS | — | — | Furthest back a post search may look, in days. Recent search cannot exceed 7. |
| POSTS_DEFAULT_TIMEOUT_MS | — | — | Timeout for a posts call in milliseconds when the call does not request one. |
| POSTS_MIN_TIMEOUT_MS | — | — | Lowest timeout a posts call may request, in milliseconds. |
| POSTS_MAX_TIMEOUT_MS | — | — | Highest timeout a posts call may request, in milliseconds. |
| USERS_MAX_USERNAMES | — | — | Usernames accepted in one x_users_lookup call. The X API caps this at 100. |
| USERS_MAX_IDS | — | — | User ids accepted in one x_users_lookup call. The X API caps this at 100. |
| USERS_DEFAULT_RESULTS | — | — | Users returned per page when the call does not ask for a count. |
| USERS_MAX_RESULTS | — | — | Upper bound for users per page. |
| USERS_DEFAULT_TIMEOUT_MS | — | — | Timeout for a users call in milliseconds when the call does not request one. |
| USERS_MIN_TIMEOUT_MS | — | — | Lowest timeout a users call may request, in milliseconds. |
| USERS_MAX_TIMEOUT_MS | — | — | Highest timeout a users call may request, in milliseconds. |
| LISTS_DEFAULT_RESULTS | — | — | Items returned per list page when the call does not ask for a count. |
| LISTS_MAX_RESULTS | — | — | Upper bound for items per list page. The X API caps this at 100. |
| LISTS_DEFAULT_TIMEOUT_MS | — | — | Timeout for a lists call in milliseconds when the call does not request one. |
| LISTS_MIN_TIMEOUT_MS | — | — | Lowest timeout a lists call may request, in milliseconds. |
| LISTS_MAX_TIMEOUT_MS | — | — | Highest timeout a lists call may request, in milliseconds. |
| MEDIA_CHUNK_BYTES | — | — | Bytes per upload segment. The X APPEND endpoint caps a segment at 5 MB. |
| MEDIA_POLL_INTERVAL_MS | — | — | How often the upload status is polled while X transcodes a video, in milliseconds. |
| MEDIA_DEFAULT_TIMEOUT_MS | — | — | Timeout for a whole upload in milliseconds when the call does not request one. |
| MEDIA_MIN_TIMEOUT_MS | — | — | Lowest timeout an upload may request, in milliseconds. |
| MEDIA_MAX_TIMEOUT_MS | — | — | Highest timeout an upload may request, in milliseconds. |
Freshness
Active — last maintenance signal 30d ago. The newest of the signals below sets the band.
Last commit (default branch)
2026-09-10 · 30d ago · GitHub
Latest release
2026-09-09 · 31d ago · GitHub · v0.1.1
Package published
no data · npm/PyPI
Registry entry updated
2026-09-09 · 31d ago · official registry · v0.1.1
FAQ
›How do I install the X (Twitter) MCP server in Claude Code?
Run: claude mcp add x-role1776 -e X_API_KEY='<x-api-key>' -e X_API_KEY_SECRET='<x-api-key-secret>' -e X_ACCESS_TOKEN='<x-access-token>' -e X_ACCESS_TOKEN_SECRET='<x-access-token-secret>' -e MEDIA_ROOT='<media-root>' -- docker run -i --rm -e X_API_KEY -e X_API_KEY_SECRET -e X_ACCESS_TOKEN -e X_ACCESS_TOKEN_SECRET -e MEDIA_ROOT ghcr.io/role1776/mcp-x:0.1.1. For Cursor, VS Code, Claude Desktop and Windsurf, use the install tabs above.
›Does X (Twitter) require an API key?
Yes. It expects X_API_KEY, X_API_KEY_SECRET, X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRET, MEDIA_ROOT, of which 4 are secrets.
›Can I use X (Twitter) as a remote (hosted) MCP server?
No hosted endpoint is published; it runs locally over stdio.
›Is X (Twitter) in the official MCP registry?
Yes, as io.github.Role1776/mcp-x.
Alternatives to X (Twitter)
Other social media MCP servers.