Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

X (Twitter)

by Role1776version 0.1.1i★ –iRuns on your computer
Registry nameio.github.Role1776/mcp-x

Install

Overview

Description from the maker (original English)

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

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Runs on your computer
  • Transport: stdio
  • Category: Marketing & social media
  • You need to fill in: X_API_KEY, X_API_KEY_SECRET, X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRET, MEDIA_ROOT

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 1 of 1 passed
  • Runs on your computer with your user’s permissions (files, network, apps).
  • You fill in yourself: X_API_KEY, X_API_KEY_SECRET, X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRET, MEDIA_ROOT, MCP_TRANSPORT, MCP_NAME, MCP_PATH, SERVER_PORT, SERVER_READ_TIMEOUT, SERVER_WRITE_TIMEOUT, LOG_MODE, MAX_IDLE_CONNS_PER_HOST, X_DEBUG, POSTS_MAX_QUERIES, POSTS_MAX_USERNAMES, POSTS_MAX_IDS, POSTS_DEFAULT_RESULTS, POSTS_MAX_RESULTS, POSTS_DEFAULT_DAYS, POSTS_MAX_DAYS, POSTS_DEFAULT_TIMEOUT_MS, POSTS_MIN_TIMEOUT_MS, POSTS_MAX_TIMEOUT_MS, USERS_MAX_USERNAMES, USERS_MAX_IDS, USERS_DEFAULT_RESULTS, USERS_MAX_RESULTS, USERS_DEFAULT_TIMEOUT_MS, USERS_MIN_TIMEOUT_MS, USERS_MAX_TIMEOUT_MS, LISTS_DEFAULT_RESULTS, LISTS_MAX_RESULTS, LISTS_DEFAULT_TIMEOUT_MS, LISTS_MIN_TIMEOUT_MS, LISTS_MAX_TIMEOUT_MS, MEDIA_CHUNK_BYTES, MEDIA_POLL_INTERVAL_MS, MEDIA_DEFAULT_TIMEOUT_MS, MEDIA_MIN_TIMEOUT_MS, MEDIA_MAX_TIMEOUT_MS

Values marked secret are keys to your account. Never share them or paste them into a chat.

You need

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Download the maker’s .mcpb file

The link goes to the maker’s own file; we do not host or repackage it. Open the file and Claude Desktop installs it.

Run this in your terminal

claude mcp add x --env X_API_KEY=your-value --env X_API_KEY_SECRET=your-value --env X_ACCESS_TOKEN=your-value --env X_ACCESS_TOKEN_SECRET=your-value --env MEDIA_ROOT=your-value --env MCP_TRANSPORT=your-value --env MCP_NAME=your-value --env MCP_PATH=your-value --env SERVER_PORT=your-value --env SERVER_READ_TIMEOUT=your-value --env SERVER_WRITE_TIMEOUT=your-value --env LOG_MODE=your-value --env MAX_IDLE_CONNS_PER_HOST=your-value --env X_DEBUG=your-value --env POSTS_MAX_QUERIES=your-value --env POSTS_MAX_USERNAMES=your-value --env POSTS_MAX_IDS=your-value --env POSTS_DEFAULT_RESULTS=your-value --env POSTS_MAX_RESULTS=your-value --env POSTS_DEFAULT_DAYS=your-value --env POSTS_MAX_DAYS=your-value --env POSTS_DEFAULT_TIMEOUT_MS=your-value --env POSTS_MIN_TIMEOUT_MS=your-value --env POSTS_MAX_TIMEOUT_MS=your-value --env USERS_MAX_USERNAMES=your-value --env USERS_MAX_IDS=your-value --env USERS_DEFAULT_RESULTS=your-value --env USERS_MAX_RESULTS=your-value --env USERS_DEFAULT_TIMEOUT_MS=your-value --env USERS_MIN_TIMEOUT_MS=your-value --env USERS_MAX_TIMEOUT_MS=your-value --env LISTS_DEFAULT_RESULTS=your-value --env LISTS_MAX_RESULTS=your-value --env LISTS_DEFAULT_TIMEOUT_MS=your-value --env LISTS_MIN_TIMEOUT_MS=your-value --env LISTS_MAX_TIMEOUT_MS=your-value --env MEDIA_CHUNK_BYTES=your-value --env MEDIA_POLL_INTERVAL_MS=your-value --env MEDIA_DEFAULT_TIMEOUT_MS=your-value --env MEDIA_MIN_TIMEOUT_MS=your-value --env MEDIA_MAX_TIMEOUT_MS=your-value -- 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 -e MCP_TRANSPORT -e MCP_NAME -e MCP_PATH -e SERVER_PORT -e SERVER_READ_TIMEOUT -e SERVER_WRITE_TIMEOUT -e LOG_MODE -e MAX_IDLE_CONNS_PER_HOST -e X_DEBUG -e POSTS_MAX_QUERIES -e POSTS_MAX_USERNAMES -e POSTS_MAX_IDS -e POSTS_DEFAULT_RESULTS -e POSTS_MAX_RESULTS -e POSTS_DEFAULT_DAYS -e POSTS_MAX_DAYS -e POSTS_DEFAULT_TIMEOUT_MS -e POSTS_MIN_TIMEOUT_MS -e POSTS_MAX_TIMEOUT_MS -e USERS_MAX_USERNAMES -e USERS_MAX_IDS -e USERS_DEFAULT_RESULTS -e USERS_MAX_RESULTS -e USERS_DEFAULT_TIMEOUT_MS -e USERS_MIN_TIMEOUT_MS -e USERS_MAX_TIMEOUT_MS -e LISTS_DEFAULT_RESULTS -e LISTS_MAX_RESULTS -e LISTS_DEFAULT_TIMEOUT_MS -e LISTS_MIN_TIMEOUT_MS -e LISTS_MAX_TIMEOUT_MS -e MEDIA_CHUNK_BYTES -e MEDIA_POLL_INTERVAL_MS -e MEDIA_DEFAULT_TIMEOUT_MS -e MEDIA_MIN_TIMEOUT_MS -e MEDIA_MAX_TIMEOUT_MS ghcr.io/role1776/mcp-x:0.1.1

Fill in the empty values before running it.

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "x": {
      "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",
        "-e",
        "MCP_TRANSPORT",
        "-e",
        "MCP_NAME",
        "-e",
        "MCP_PATH",
        "-e",
        "SERVER_PORT",
        "-e",
        "SERVER_READ_TIMEOUT",
        "-e",
        "SERVER_WRITE_TIMEOUT",
        "-e",
        "LOG_MODE",
        "-e",
        "MAX_IDLE_CONNS_PER_HOST",
        "-e",
        "X_DEBUG",
        "-e",
        "POSTS_MAX_QUERIES",
        "-e",
        "POSTS_MAX_USERNAMES",
        "-e",
        "POSTS_MAX_IDS",
        "-e",
        "POSTS_DEFAULT_RESULTS",
        "-e",
        "POSTS_MAX_RESULTS",
        "-e",
        "POSTS_DEFAULT_DAYS",
        "-e",
        "POSTS_MAX_DAYS",
        "-e",
        "POSTS_DEFAULT_TIMEOUT_MS",
        "-e",
        "POSTS_MIN_TIMEOUT_MS",
        "-e",
        "POSTS_MAX_TIMEOUT_MS",
        "-e",
        "USERS_MAX_USERNAMES",
        "-e",
        "USERS_MAX_IDS",
        "-e",
        "USERS_DEFAULT_RESULTS",
        "-e",
        "USERS_MAX_RESULTS",
        "-e",
        "USERS_DEFAULT_TIMEOUT_MS",
        "-e",
        "USERS_MIN_TIMEOUT_MS",
        "-e",
        "USERS_MAX_TIMEOUT_MS",
        "-e",
        "LISTS_DEFAULT_RESULTS",
        "-e",
        "LISTS_MAX_RESULTS",
        "-e",
        "LISTS_DEFAULT_TIMEOUT_MS",
        "-e",
        "LISTS_MIN_TIMEOUT_MS",
        "-e",
        "LISTS_MAX_TIMEOUT_MS",
        "-e",
        "MEDIA_CHUNK_BYTES",
        "-e",
        "MEDIA_POLL_INTERVAL_MS",
        "-e",
        "MEDIA_DEFAULT_TIMEOUT_MS",
        "-e",
        "MEDIA_MIN_TIMEOUT_MS",
        "-e",
        "MEDIA_MAX_TIMEOUT_MS",
        "ghcr.io/role1776/mcp-x:0.1.1"
      ],
      "env": {
        "X_API_KEY": "your-value",
        "X_API_KEY_SECRET": "your-value",
        "X_ACCESS_TOKEN": "your-value",
        "X_ACCESS_TOKEN_SECRET": "your-value",
        "MEDIA_ROOT": "your-value",
        "MCP_TRANSPORT": "your-value",
        "MCP_NAME": "your-value",
        "MCP_PATH": "your-value",
        "SERVER_PORT": "your-value",
        "SERVER_READ_TIMEOUT": "your-value",
        "SERVER_WRITE_TIMEOUT": "your-value",
        "LOG_MODE": "your-value",
        "MAX_IDLE_CONNS_PER_HOST": "your-value",
        "X_DEBUG": "your-value",
        "POSTS_MAX_QUERIES": "your-value",
        "POSTS_MAX_USERNAMES": "your-value",
        "POSTS_MAX_IDS": "your-value",
        "POSTS_DEFAULT_RESULTS": "your-value",
        "POSTS_MAX_RESULTS": "your-value",
        "POSTS_DEFAULT_DAYS": "your-value",
        "POSTS_MAX_DAYS": "your-value",
        "POSTS_DEFAULT_TIMEOUT_MS": "your-value",
        "POSTS_MIN_TIMEOUT_MS": "your-value",
        "POSTS_MAX_TIMEOUT_MS": "your-value",
        "USERS_MAX_USERNAMES": "your-value",
        "USERS_MAX_IDS": "your-value",
        "USERS_DEFAULT_RESULTS": "your-value",
        "USERS_MAX_RESULTS": "your-value",
        "USERS_DEFAULT_TIMEOUT_MS": "your-value",
        "USERS_MIN_TIMEOUT_MS": "your-value",
        "USERS_MAX_TIMEOUT_MS": "your-value",
        "LISTS_DEFAULT_RESULTS": "your-value",
        "LISTS_MAX_RESULTS": "your-value",
        "LISTS_DEFAULT_TIMEOUT_MS": "your-value",
        "LISTS_MIN_TIMEOUT_MS": "your-value",
        "LISTS_MAX_TIMEOUT_MS": "your-value",
        "MEDIA_CHUNK_BYTES": "your-value",
        "MEDIA_POLL_INTERVAL_MS": "your-value",
        "MEDIA_DEFAULT_TIMEOUT_MS": "your-value",
        "MEDIA_MIN_TIMEOUT_MS": "your-value",
        "MEDIA_MAX_TIMEOUT_MS": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "x": {
      "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",
        "-e",
        "MCP_TRANSPORT",
        "-e",
        "MCP_NAME",
        "-e",
        "MCP_PATH",
        "-e",
        "SERVER_PORT",
        "-e",
        "SERVER_READ_TIMEOUT",
        "-e",
        "SERVER_WRITE_TIMEOUT",
        "-e",
        "LOG_MODE",
        "-e",
        "MAX_IDLE_CONNS_PER_HOST",
        "-e",
        "X_DEBUG",
        "-e",
        "POSTS_MAX_QUERIES",
        "-e",
        "POSTS_MAX_USERNAMES",
        "-e",
        "POSTS_MAX_IDS",
        "-e",
        "POSTS_DEFAULT_RESULTS",
        "-e",
        "POSTS_MAX_RESULTS",
        "-e",
        "POSTS_DEFAULT_DAYS",
        "-e",
        "POSTS_MAX_DAYS",
        "-e",
        "POSTS_DEFAULT_TIMEOUT_MS",
        "-e",
        "POSTS_MIN_TIMEOUT_MS",
        "-e",
        "POSTS_MAX_TIMEOUT_MS",
        "-e",
        "USERS_MAX_USERNAMES",
        "-e",
        "USERS_MAX_IDS",
        "-e",
        "USERS_DEFAULT_RESULTS",
        "-e",
        "USERS_MAX_RESULTS",
        "-e",
        "USERS_DEFAULT_TIMEOUT_MS",
        "-e",
        "USERS_MIN_TIMEOUT_MS",
        "-e",
        "USERS_MAX_TIMEOUT_MS",
        "-e",
        "LISTS_DEFAULT_RESULTS",
        "-e",
        "LISTS_MAX_RESULTS",
        "-e",
        "LISTS_DEFAULT_TIMEOUT_MS",
        "-e",
        "LISTS_MIN_TIMEOUT_MS",
        "-e",
        "LISTS_MAX_TIMEOUT_MS",
        "-e",
        "MEDIA_CHUNK_BYTES",
        "-e",
        "MEDIA_POLL_INTERVAL_MS",
        "-e",
        "MEDIA_DEFAULT_TIMEOUT_MS",
        "-e",
        "MEDIA_MIN_TIMEOUT_MS",
        "-e",
        "MEDIA_MAX_TIMEOUT_MS",
        "ghcr.io/role1776/mcp-x:0.1.1"
      ],
      "env": {
        "X_API_KEY": "your-value",
        "X_API_KEY_SECRET": "your-value",
        "X_ACCESS_TOKEN": "your-value",
        "X_ACCESS_TOKEN_SECRET": "your-value",
        "MEDIA_ROOT": "your-value",
        "MCP_TRANSPORT": "your-value",
        "MCP_NAME": "your-value",
        "MCP_PATH": "your-value",
        "SERVER_PORT": "your-value",
        "SERVER_READ_TIMEOUT": "your-value",
        "SERVER_WRITE_TIMEOUT": "your-value",
        "LOG_MODE": "your-value",
        "MAX_IDLE_CONNS_PER_HOST": "your-value",
        "X_DEBUG": "your-value",
        "POSTS_MAX_QUERIES": "your-value",
        "POSTS_MAX_USERNAMES": "your-value",
        "POSTS_MAX_IDS": "your-value",
        "POSTS_DEFAULT_RESULTS": "your-value",
        "POSTS_MAX_RESULTS": "your-value",
        "POSTS_DEFAULT_DAYS": "your-value",
        "POSTS_MAX_DAYS": "your-value",
        "POSTS_DEFAULT_TIMEOUT_MS": "your-value",
        "POSTS_MIN_TIMEOUT_MS": "your-value",
        "POSTS_MAX_TIMEOUT_MS": "your-value",
        "USERS_MAX_USERNAMES": "your-value",
        "USERS_MAX_IDS": "your-value",
        "USERS_DEFAULT_RESULTS": "your-value",
        "USERS_MAX_RESULTS": "your-value",
        "USERS_DEFAULT_TIMEOUT_MS": "your-value",
        "USERS_MIN_TIMEOUT_MS": "your-value",
        "USERS_MAX_TIMEOUT_MS": "your-value",
        "LISTS_DEFAULT_RESULTS": "your-value",
        "LISTS_MAX_RESULTS": "your-value",
        "LISTS_DEFAULT_TIMEOUT_MS": "your-value",
        "LISTS_MIN_TIMEOUT_MS": "your-value",
        "LISTS_MAX_TIMEOUT_MS": "your-value",
        "MEDIA_CHUNK_BYTES": "your-value",
        "MEDIA_POLL_INTERVAL_MS": "your-value",
        "MEDIA_DEFAULT_TIMEOUT_MS": "your-value",
        "MEDIA_MIN_TIMEOUT_MS": "your-value",
        "MEDIA_MAX_TIMEOUT_MS": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

This one runs on your computer, and ChatGPT can only connect to servers on the internet. Pick another app.

Your choice stays on this device in a cookie; no account needed.

Values you fill in

  • X_API_KEY secret required env
    OAuth 1.0a consumer key. developer.x.com -> your project -> your app -> Keys and tokens.
  • X_API_KEY_SECRET secret required env
    OAuth 1.0a consumer secret, issued together with X_API_KEY.
  • X_ACCESS_TOKEN secret required env
    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 secret required env
    User access token secret, issued together with X_ACCESS_TOKEN.
  • MEDIA_ROOT required env
    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 env
    stdio (client spawns the process) or http (streamable HTTP listener).
  • MCP_NAME env
    Server name reported in the MCP initialize handshake.
  • MCP_PATH env
    HTTP path the MCP endpoint is served on. Used only when MCP_TRANSPORT=http.
  • SERVER_PORT env
    TCP port to listen on. Used only when MCP_TRANSPORT=http.
  • SERVER_READ_TIMEOUT env
    HTTP read timeout as a Go duration. Used only when MCP_TRANSPORT=http.
  • SERVER_WRITE_TIMEOUT env
    HTTP write timeout as a Go duration. Used only when MCP_TRANSPORT=http.
  • LOG_MODE env
    local (text, debug) or prod (JSON, info). Logs go to stderr.
  • MAX_IDLE_CONNS_PER_HOST env
    Idle connections the outbound HTTP client keeps per host.
  • X_DEBUG env
    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 env
    Queries accepted in one x_posts_search or x_posts_count call.
  • POSTS_MAX_USERNAMES env
    Usernames accepted in one x_posts_by_user call.
  • POSTS_MAX_IDS env
    Post ids accepted in one x_posts_lookup call. The X API caps this at 100.
  • POSTS_DEFAULT_RESULTS env
    Posts returned per query when the call does not ask for a count. Every post returned is billed.
  • POSTS_MAX_RESULTS env
    Upper bound for posts per query. The X API caps this at 100.
  • POSTS_DEFAULT_DAYS env
    How far back post searches look when the call does not say, in days.
  • POSTS_MAX_DAYS env
    Furthest back a post search may look, in days. Recent search cannot exceed 7.
  • POSTS_DEFAULT_TIMEOUT_MS env
    Timeout for a posts call in milliseconds when the call does not request one.
  • POSTS_MIN_TIMEOUT_MS env
    Lowest timeout a posts call may request, in milliseconds.
  • POSTS_MAX_TIMEOUT_MS env
    Highest timeout a posts call may request, in milliseconds.
  • USERS_MAX_USERNAMES env
    Usernames accepted in one x_users_lookup call. The X API caps this at 100.
  • USERS_MAX_IDS env
    User ids accepted in one x_users_lookup call. The X API caps this at 100.
  • USERS_DEFAULT_RESULTS env
    Users returned per page when the call does not ask for a count.
  • USERS_MAX_RESULTS env
    Upper bound for users per page.
  • USERS_DEFAULT_TIMEOUT_MS env
    Timeout for a users call in milliseconds when the call does not request one.
  • USERS_MIN_TIMEOUT_MS env
    Lowest timeout a users call may request, in milliseconds.
  • USERS_MAX_TIMEOUT_MS env
    Highest timeout a users call may request, in milliseconds.
  • LISTS_DEFAULT_RESULTS env
    Items returned per list page when the call does not ask for a count.
  • LISTS_MAX_RESULTS env
    Upper bound for items per list page. The X API caps this at 100.
  • LISTS_DEFAULT_TIMEOUT_MS env
    Timeout for a lists call in milliseconds when the call does not request one.
  • LISTS_MIN_TIMEOUT_MS env
    Lowest timeout a lists call may request, in milliseconds.
  • LISTS_MAX_TIMEOUT_MS env
    Highest timeout a lists call may request, in milliseconds.
  • MEDIA_CHUNK_BYTES env
    Bytes per upload segment. The X APPEND endpoint caps a segment at 5 MB.
  • MEDIA_POLL_INTERVAL_MS env
    How often the upload status is polled while X transcodes a video, in milliseconds.
  • MEDIA_DEFAULT_TIMEOUT_MS env
    Timeout for a whole upload in milliseconds when the call does not request one.
  • MEDIA_MIN_TIMEOUT_MS env
    Lowest timeout an upload may request, in milliseconds.
  • MEDIA_MAX_TIMEOUT_MS env
    Highest timeout an upload may request, in milliseconds.

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Runs on your computer; the tool list appears in your AI app after you install it.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account Role1776, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • – Not applicable

    Endpoint responds

    This one runs on your computer; there is no internet endpoint

  • – Not applicable

    Sign-in with OAuth

    Runs on your computer and uses local settings instead

  • … Not checked yet

    No hidden instructions in tool descriptions

    Runs on your computer; we can only read tool lists from internet endpoints

Compared with others in Marketing & social mediai

  • More stars than 0% of the other 3564 servers in this category
  • Published to the registry more recently than 32% of the other 3564 servers in this category
  • Basic checks equal to or better than 100% of the other 3564 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is X (Twitter) safe?

It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

You need to fill in: X_API_KEY, X_API_KEY_SECRET, X_ACCESS_TOKEN, X_ACCESS_TOKEN_SECRET, MEDIA_ROOT

Does it run on my computer or in the cloud?

It runs on your computer. Your AI app starts it when needed, and data does not pass through the maker’s servers (unless it calls an online service itself).

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.1.1) reached the registry 2 months ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. You also need Docker, MCPB on your computer.

What can I use instead?

In the same category: MCP YouTube Transcript, Google Analytics MCP, BibiGPT YouTube Video Summarizer

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

An MCP server retrieving transcripts of YouTube videos

Runs on your computer★ 495MITUpdated 10 days ago
Install

GA4 MCP server for AI agents: schema discovery, server-side aggregation, analysis-ready defaults.

Runs on your computer★ 244MITUpdated 10 days ago
Install

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

mcp-x

An MCP server that gives an LLM the X (Twitter) API: read and search posts, manage users and lists, upload media, and publish — as the account whose keys it runs on.

Website · Costs · Credentials · Tools · Quick start · Configuration · Architecture · Contributing


What it is

mcp-x is a Model Context Protocol server written in Go. It exposes the X API v2 to any MCP-compatible client (Claude Desktop, IDE agents, custom LLM apps) as 42 tools covering posts, users, lists and media.

It authenticates with OAuth 1.0a user context, which means every call acts *as a real X account* — the one the four keys belong to. x_post_create publishes publicly. x_user_follow really follows. x_post_delete is irreversible. This is not a sandbox, and it is not free: see The X API costs money before you wire it into an agent.

Both transports the MCP SDK supports are available and expose the identical tool set:

  • stdio — the client launches the binary and talks over stdin/stdout (the default, ideal for desktop clients).
  • http — a long-running streamable HTTP server (useful for remote/shared deployments).

The X API costs money

[!WARNING]

There is no free tier any more. X retired the Free/Basic/Pro subscription tiers for new developers and moved to pay-per-use credits: you buy credits upfront in the Developer Console and every request deducts from the balance in real time. Legacy Basic ($200/mo) and Pro ($5,000/mo) subscriptions survive only for accounts that already had them; Enterprise starts around $42,000/mo. A new developer account today gets pay-per-use and nothing else.

Rates at the time of writing (official pricing — always re-check the Console, they have changed several times in 2026):

OperationPrice
Post read$0.005 per post returned
Owned read (your own posts, bookmarks, followers, likes, lists)$0.001 per resource
User read$0.010 per user returned
Likes / mutes / blocks read$0.001 per resource
Followers / following read$0.010 per resource
Publishing a post$0.015 per request
Publishing a post containing a URL$0.200 per request
Like / repost and other interactions$0.015 per request
List and bookmark writes$0.005–$0.010 per request

Two things follow from this, and both are baked into the server:

  • **Reads are charged per *resource returned*, not per request.** max_results: 100 on x_posts_search costs twenty times what max_results: 5 costs for the same query. Every read tool's description tells the model to ask for the smallest max_results that answers the question, and the batching tools (x_posts_lookup, x_users_lookup) tell it to batch rather than loop.
  • `x_posts_count` does not consume the post-read budget. It returns match counts bucketed by minute/hour/day for the same query syntax. Size a topic with x_posts_count first, then pay for x_posts_search.

X also deduplicates: the same resource fetched twice inside a 24-hour UTC window is billed once. And pay-per-use is capped at 3 million post reads per billing cycle — past that, only Enterprise.

When the money runs out the API answers with a distinct error, and the server maps it to a message that explicitly tells the model not to retry — see Errors.


Credentials

The server needs four OAuth 1.0a values, all from one X app:

X_API_KEY

X_API_KEY_SECRET X_ACCESS_TOKEN X_ACCESS_TOKEN_SECRET

The first pair identifies the *app*; the second pair identifies the *account acting through it*. mcp-x uses AuthenMethodOAuth1UserContext, not app-only bearer auth, because every write endpoint and every "me" endpoint (x_users_me, x_posts_home, x_bookmarks_list, mentions) requires a user context. There is no bearer-token mode.

Getting them — and the one step everybody gets wrong
  1. Go to developer.x.com → your project → your app.
  2. Open User authentication settings and set App permissions to Read and Write. Do this first.
  3. *Only then* go to Keys and tokens and generate the Access Token and Secret.

[!IMPORTANT]

An access token permanently keeps the permissions the app had at the moment it was generated. If you created the token while the app was Read-only and then flipped the app to Read and Write, the token is *still* read-only. Nothing about the app settings page will tell you this. Every write will fail with X's oauth1-permissions problem type, forever, until you go back to Keys and tokens and regenerate the Access Token and Secret.

This is the single most common setup failure with the X API, which is why the server checks for it at startup and refuses to start with:

`

the access token is read-only: set the app permissions to Read and Write

in the X Developer Console, then regenerate the Access Token and Secret

`

Regenerating the *API Key/Secret* is not the fix. Regenerate the Access Token and Secret.

Startup verification

Before registering a single tool, the server calls GET /2/users/me once (client.Bootstrap) with a 15-second deadline. This does three jobs:

  • proves the four keys are valid — bad keys fail the process, not the first tool call;
  • catches the read-only-token trap above;
  • caches the key owner's numeric user id, because every write endpoint is POST /2/users/:id/... and looking the id up per write would be another billed request.

A failure here is fatal by design. A server that starts and then fails every call is worse than one that does not start.

The cost of that choice is worth stating plainly: there is no way to try this server without a funded X developer account. No credentials means no startup, which means no tool list — /mcp and claude mcp list will show a failed connection and nothing else. To confirm an install short of that, run the binary with -version, and read the Tools section for what it would have exposed.

Keys are secrets

The four values are credentials for a live account with write access. Keep them in a file only you can read, pass it with -env, and never commit it — .env is gitignored, .env.example is the template. When running under an MCP client, the client's env block works too; it takes precedence over the .env file.


Tools

42 tools in four groups. Every tool carries MCP annotations: readOnlyHint on reads, destructiveHint on anything irreversible (x_post_delete, x_list_delete, unlike, unrepost, unfollow, member removal). Each returns a structured JSON payload matching its output schema; the SDK mirrors the same JSON into the text content block for clients that do not read structuredContent.

Every tool accepts an optional timeout_ms, clamped into the group's [MIN, MAX] window (see Limits).

Posts — reading
ToolDescription
`x_posts_search`Searches recent posts for several queries in parallel. Recent search reaches back 7 days only.
`x_posts_count`Counts matches per query bucketed by minute/hour/day. Does not spend post reads — use it to size a topic before searching.
`x_posts_lookup`Fetches up to 100 posts by id in one call.
`x_posts_by_user`Recent posts for several usernames, fetched in parallel.
`x_posts_mentions`Posts mentioning the key owner.
`x_posts_home`The key owner's home timeline.
`x_posts_quotes`Posts quoting a given post.
`x_posts_liked`Posts the key owner liked.
`x_bookmarks_list`The key owner's bookmarks.
`x_post_liked_by`Users who liked a given post.
`x_post_reposted_by`Users who reposted a given post.
x_posts_search
ParameterTypeDefaultNotes
queries[]string—Required. Run in parallel, capped at POSTS_MAX_QUERIES (5). ≤ 512 chars each.
max_resultsint10Posts per query, 1..100. Every one is billed.
sort_orderstring—recency (newest first) or relevancy (best match).
daysint7How far back, 1..7. The API cannot go further.
include_retweetsboolfalseWhen false the server appends -is:retweet to every query.
timeout_msint6415000Whole-call timeout, clamped to [2000, 60000].

Query operators go inside the query string:

OperatorMeaning
*space*AND
ORexplicit OR
-termNOT
( )grouping
from:user / to:userby author / by recipient
@user / #tagmentions / hashtags
"exact phrase"exact phrase
lang:enlanguage
is:retweet is:reply is:quote is:verifiedpost kind
has:media has:images has:videos has:linksattachments
url:example.comlinked domain
conversation_id:123one thread
x_posts_count
ParameterTypeDefaultNotes
queries[]string—Required. Same operators as x_posts_search.
granularitystringhourminute, hour or day.
daysint71..7, same window.
timeout_msint6415000Clamped to [2000, 60000].
x_posts_lookup
ParameterTypeDefaultNotes
ids[]string—Required. 1..100 post ids. Batch them; do not call once per id.
x_posts_by_user
ParameterTypeDefaultNotes
usernames[]string—Required. Without the @. Capped at POSTS_MAX_USERNAMES (5), fetched in parallel.
max_resultsint10Posts per user, 1..100.
exclude[]string—replies and/or retweets.
daysint71..7.
timeout_msint6415000Clamped to [2000, 60000].
Timeline tools

x_posts_mentions, x_posts_home, x_posts_liked and x_bookmarks_list share one shape: max_results (1..100), pagination_token, timeout_ms. x_posts_quotes, x_post_liked_by and x_post_reposted_by add a required id.

Pagination is explicit and manual: a response carries next_token, and you pass it back as pagination_token for the next page. The server never walks pages on its own — each page is billed, so that decision stays with the caller.

Posts — writing
ToolAnnotationDescription
`x_post_create`writePublishes a post. Public and billed ($0.015, or $0.20 with a link).

| `x_post_delete` | de

Only the beginning is shown; read the rest in the repo

Ask PopNx