X (Twitter)

io.github.Role1776/mcp-x

Search, read and publish X posts and manage users, lists and media via the X API v2.

Connect this server

Add this to your MCP client config — claude_desktop_config.json (Claude Desktop) or .cursor/mcp.json (Cursor).Suits: Claude Desktop · Cursor.

{
  "mcpServers": {
    "mcp-x": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "ghcr.io/role1776/mcp-x:0.1.1"
      ],
      "env": {
        "X_API_KEY": "<your X_API_KEY>",
        "X_API_KEY_SECRET": "<your X_API_KEY_SECRET>",
        "X_ACCESS_TOKEN": "<your X_ACCESS_TOKEN>",
        "X_ACCESS_TOKEN_SECRET": "<your X_ACCESS_TOKEN_SECRET>",
        "MEDIA_ROOT": "<your MEDIA_ROOT>",
        "MCP_TRANSPORT": "stdio",
        "MCP_NAME": "mcp-x",
        "MCP_PATH": "/mcp",
        "SERVER_PORT": "8080",
        "SERVER_READ_TIMEOUT": "60s",
        "SERVER_WRITE_TIMEOUT": "60s",
        "LOG_MODE": "local",
        "MAX_IDLE_CONNS_PER_HOST": "100",
        "X_DEBUG": "false",
        "POSTS_MAX_QUERIES": "5",
        "POSTS_MAX_USERNAMES": "5",
        "POSTS_MAX_IDS": "100",
        "POSTS_DEFAULT_RESULTS": "10",
        "POSTS_MAX_RESULTS": "100",
        "POSTS_DEFAULT_DAYS": "7",
        "POSTS_MAX_DAYS": "7",
        "POSTS_DEFAULT_TIMEOUT_MS": "15000",
        "POSTS_MIN_TIMEOUT_MS": "2000",
        "POSTS_MAX_TIMEOUT_MS": "60000",
        "USERS_MAX_USERNAMES": "100",
        "USERS_MAX_IDS": "100",
        "USERS_DEFAULT_RESULTS": "100",
        "USERS_MAX_RESULTS": "1000",
        "USERS_DEFAULT_TIMEOUT_MS": "15000",
        "USERS_MIN_TIMEOUT_MS": "2000",
        "USERS_MAX_TIMEOUT_MS": "60000",
        "LISTS_DEFAULT_RESULTS": "25",
        "LISTS_MAX_RESULTS": "100",
        "LISTS_DEFAULT_TIMEOUT_MS": "15000",
        "LISTS_MIN_TIMEOUT_MS": "2000",
        "LISTS_MAX_TIMEOUT_MS": "60000",
        "MEDIA_CHUNK_BYTES": "4194304",
        "MEDIA_POLL_INTERVAL_MS": "2000",
        "MEDIA_DEFAULT_TIMEOUT_MS": "120000",
        "MEDIA_MIN_TIMEOUT_MS": "5000",
        "MEDIA_MAX_TIMEOUT_MS": "600000"
      }
    }
  }
}
Environment variables
  • X_API_KEYrequiredsecretOAuth 1.0a consumer key. developer.x.com -> your project -> your app -> Keys and tokens.
  • X_API_KEY_SECRETrequiredsecretOAuth 1.0a consumer secret, issued together with X_API_KEY.
  • X_ACCESS_TOKENrequiredsecretUser 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_SECRETrequiredsecretUser access token secret, issued together with X_ACCESS_TOKEN.
  • MEDIA_ROOTrequiredAbsolute 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_TRANSPORTstdio (client spawns the process) or http (streamable HTTP listener).
  • MCP_NAMEServer name reported in the MCP initialize handshake.
  • MCP_PATHHTTP path the MCP endpoint is served on. Used only when MCP_TRANSPORT=http.
  • SERVER_PORTTCP port to listen on. Used only when MCP_TRANSPORT=http.
  • SERVER_READ_TIMEOUTHTTP read timeout as a Go duration. Used only when MCP_TRANSPORT=http.
  • SERVER_WRITE_TIMEOUTHTTP write timeout as a Go duration. Used only when MCP_TRANSPORT=http.
  • LOG_MODElocal (text, debug) or prod (JSON, info). Logs go to stderr.
  • MAX_IDLE_CONNS_PER_HOSTIdle connections the outbound HTTP client keeps per host.
  • X_DEBUGLog the raw requests sent to the X API. Verbose; the output can contain request details, so keep it off outside debugging.
  • POSTS_MAX_QUERIESQueries accepted in one x_posts_search or x_posts_count call.
  • POSTS_MAX_USERNAMESUsernames accepted in one x_posts_by_user call.
  • POSTS_MAX_IDSPost ids accepted in one x_posts_lookup call. The X API caps this at 100.
  • POSTS_DEFAULT_RESULTSPosts returned per query when the call does not ask for a count. Every post returned is billed.
  • POSTS_MAX_RESULTSUpper bound for posts per query. The X API caps this at 100.
  • POSTS_DEFAULT_DAYSHow far back post searches look when the call does not say, in days.
  • POSTS_MAX_DAYSFurthest back a post search may look, in days. Recent search cannot exceed 7.
  • POSTS_DEFAULT_TIMEOUT_MSTimeout for a posts call in milliseconds when the call does not request one.
  • POSTS_MIN_TIMEOUT_MSLowest timeout a posts call may request, in milliseconds.
  • POSTS_MAX_TIMEOUT_MSHighest timeout a posts call may request, in milliseconds.
  • USERS_MAX_USERNAMESUsernames accepted in one x_users_lookup call. The X API caps this at 100.
  • USERS_MAX_IDSUser ids accepted in one x_users_lookup call. The X API caps this at 100.
  • USERS_DEFAULT_RESULTSUsers returned per page when the call does not ask for a count.
  • USERS_MAX_RESULTSUpper bound for users per page.
  • USERS_DEFAULT_TIMEOUT_MSTimeout for a users call in milliseconds when the call does not request one.
  • USERS_MIN_TIMEOUT_MSLowest timeout a users call may request, in milliseconds.
  • USERS_MAX_TIMEOUT_MSHighest timeout a users call may request, in milliseconds.
  • LISTS_DEFAULT_RESULTSItems returned per list page when the call does not ask for a count.
  • LISTS_MAX_RESULTSUpper bound for items per list page. The X API caps this at 100.
  • LISTS_DEFAULT_TIMEOUT_MSTimeout for a lists call in milliseconds when the call does not request one.
  • LISTS_MIN_TIMEOUT_MSLowest timeout a lists call may request, in milliseconds.
  • LISTS_MAX_TIMEOUT_MSHighest timeout a lists call may request, in milliseconds.
  • MEDIA_CHUNK_BYTESBytes per upload segment. The X APPEND endpoint caps a segment at 5 MB.
  • MEDIA_POLL_INTERVAL_MSHow often the upload status is polled while X transcodes a video, in milliseconds.
  • MEDIA_DEFAULT_TIMEOUT_MSTimeout for a whole upload in milliseconds when the call does not request one.
  • MEDIA_MIN_TIMEOUT_MSLowest timeout an upload may request, in milliseconds.
  • MEDIA_MAX_TIMEOUT_MSHighest timeout an upload may request, in milliseconds.

A starting point — check the repository for exact arguments and setup. Restart your client after editing the config.

Category
Developer Tools
Version
0.1.1
Registry
active
Published
9/9/2026
Browse all Developer Tools →

Add the badge to your site

Show visitors that X (Twitter) is listed here — it’s also the link we check for a free listing.

X (Twitter) — listed on Serverdex

HTML — for your website

<a href="https://serverdex.io/server/io-github-role1776-mcp-x?utm_source=badge"><img src="https://serverdex.io/brand/badge.svg" alt="X (Twitter) — listed on Serverdex" width="123" height="40" loading="lazy"></a>

Recommended. A dofollow link from your own domain is the one that counts for search engines, and it's the link we check for a free listing.

Markdown — for your README

[![X (Twitter) — listed on Serverdex](https://serverdex.io/brand/badge.svg)](https://serverdex.io/server/io-github-role1776-mcp-x?utm_source=badge)

Nice for visibility, but GitHub marks README links nofollow, so it doesn't pass authority. Use the HTML badge on your site as well.