x-use MCP server
Browser-native AI agents for X (Twitter): multi-account, MCP-ready, no X API key required.
168 stars48 downloads/wk
Reviews
Write oneNobody has reviewed x-use yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
x-use tools (33, 11 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
add_accountAdd an account to config/accounts.json (validated, backed up, atomic). `cookie_file` is a path ON THIS MACHINE to an exported x.com cookies JSON; it is validated and copied to config/<account_id>_cookies.json. Cookie values never pass through the tool call. `persona` is freeform markdown describing the account's voice/engagement style (max 4000 chars).
add_proxyAdd a proxy URL to a named pool (created if new) in settings.json — validated, deduped, backed up, atomic. Credentials are masked in the response. Assign it to accounts via update_account(proxy="pool:<name>") or a direct URL.
approve_draftwrite actionExecute a pending draft created by a write tool. Runs the exact same execution path as direct mode (pacing, dedup, metrics). A draft can be approved exactly once; unknown or consumed ids return an error.
cancel_queued_actionwrite actionCancel a pending or failed queued action. Done, processing, and already-cancelled items cannot transition.
draft_post_variationswrite actionGenerate `count` distinct takes on a topic with the server-side LLM (persona-aware) and stage each as a post DRAFT. Nothing is posted — approve one, reject the rest. Requires the 'llm' block in settings.
engageEngage with tweets found via keyword search. `actions` is a subset of ["like", "retweet"] (default ["like"]); every candidate passes the analyzer relevance gate; `max_actions` is hard-capped by the account's per-run config caps. In draft mode (default) each planned action becomes an individually approvable draft and nothing executes.
generate_and_postwrite actionGenerate a post about `topic` with the configured LLM and post it. In draft mode (default) the generated text is stored in the draft's payload/preview so a human reviews the actual content before anything is posted.
get_accountShow one account's masked config (no cookies, no password, proxy credentials masked) plus cookie-file status. Read-only — never starts a browser.
get_account_healthRead-only health snapshot for one account: config presence, cookie-file validity, metrics counters, warm-session state, queue depth, pending drafts. Never starts a browser. A config that fails validation is REPORTED (config.valid=false with the error), not raised — surfacing that is the point of a health check.
get_draftShow one draft by id. Read-only.
get_metricsRead recorded metrics for an account (counters + recent events). Read-only — never starts a browser.
get_run_statuswrite actionPoll run_cycle handles. With `run_id` omitted, lists every run started since this server booted. Read-only.
get_tweetRead-only fetch of one tweet: text, author, public counts, typed media (photos + video posters) and the account's persona. With include_images=true (default) photos also attach as image content so a vision-capable client sees them; the envelope always carries URLs + alt text as the fallback. Nothing is posted; draft mode N/A.
list_accountsList configured accounts with secrets stripped (no cookies, no passwords, proxy credentials masked). Read-only — never starts a browser.
list_draftsList drafts, newest first. `status` filters to one of pending/approved/executed/failed/rejected; `account` filters by account id; `limit` caps the response (max 100). Read-only.
list_proxiesList proxy pools (size, masked members, rotation cursor), the global pool strategy, each account's assignment, and the global fallback proxy. Read-only — never starts a browser.
list_queueList queued actions with their full payloads (exactly what will fire), plus per-status counts. Read-only — never starts a browser.
post_tweetwrite actionPost a tweet from an account. `media` = local file paths; `community` = target community id. In draft mode (default) returns a draft for review and posts nothing; approve_draft(draft_id) executes it.
prepare_replyRead-only reply context: the tweet's text AND media (photos attach as image content so your model can see them), plus the account's keywords and persona — YOUR model writes the reply itself, no server-side LLM, nothing posted. Then pass your text to reply_to_tweet(text=...) or queue_engagement(action="reply", text=...).
process_queueDrain queued actions with jittered pacing and daily caps. THIS CALL IS THE APPROVAL GATE for queued work: items execute through the same pacing/dedup/metrics path as every other write action. With `account` omitted, every account with due items drains (each bounded by max_actions and its own daily caps).
queue_engagementQueue a like, retweet, or reply for paced execution. `action` is one of like/retweet/reply. reply requires `text` ("auto" scrapes the tweet and generates the reply NOW, so the stored payload is final). Nothing executes until process_queue is called.
queue_postwrite actionSchedule a post for paced execution. Pass `text` verbatim, or a `topic` to generate the text NOW with the configured LLM (the stored payload is final — list_queue shows exactly what will be posted). `not_before` is an optional ISO 8601 timestamp. Nothing executes until process_queue is called (or auto_drain, if enabled).
reject_draftReject a pending draft so it can never be approved. Local status change only — nothing touches X.
remove_accountwrite actionRemove an account from config/accounts.json. Requires confirm=true. Closes the account's warm session. The backup written during the mutation (config/backups/) is the recovery path; the cookie file is left on disk.
remove_proxywrite actionRemove a proxy URL from a pool. Requires confirm=true. The response lists accounts still assigned pool:<name> — emptying a referenced pool is allowed but reported (those accounts fall back to no proxy).
reply_to_tweetReply to a tweet. Pass explicit `text`, or "auto" to generate the reply with the LLM from the tweet's actual content (a read-only fetch is performed so the draft shows the real reply text). In draft mode (default) nothing is posted until approve_draft(draft_id).
research_and_stageSearch each keyword, keep relevant tweets (keyless heuristic), write a reply per tweet with the server-side LLM (persona-aware), and stage one reply DRAFT per tweet. Nothing is posted — review with list_drafts and approve selectively. Requires the 'llm' block in settings.
run_cyclewrite actionRun the legacy batch automation cycle in the background and return a run handle immediately (progress goes to the logs — this never silent-blocks). `account` limits the run to one account; `pipelines` is a comma-separated subset of: competitor_reposts, keyword_replies, keyword_retweets, likes, content_curation, community_engagement (mapped onto the account's ActionConfig enable flags for this run
search_profileRead recent posts from ONE X profile. `profile` takes a handle ("@nasa" or "nasa"), a profile URL, or a tweet URL (which resolves to its author). Read-only (draft mode does not apply — nothing is posted), but it reuses the account's browser session. `account` defaults to the first active configured account. Use this to watch specific people and competitors, and to re-read one of your own published
search_tweetsSearch recent X posts for a query string. Read-only (draft mode does not apply). Reuses the account's warm browser session. `account` defaults to the first active configured account. `include_images=true` additionally attaches the first photo of up to 5 tweets as image content (bounded); the per-tweet `media` URLs + alt text are always present.
set_account_activeEnable or pause an account without deleting it. Pausing closes its warm browser session.
test_proxyProbe a proxy with a throwaway browser: resolves the effective proxy (explicit proxy_url wins; otherwise the account's direct URL or pool:<name> assignment), opens an IP-echo page, and reports the egress IP + latency. The probe browser is throwaway and cookieless — never account cookies or the warm session pool — but startup performs an anonymous x.com/home load before the IP-echo fetch, so latenc
update_accountwrite actionPartially update an account. Only provided fields change (None = leave unchanged); pass an empty string to clear `proxy`. `persona` sets the freeform persona text; pass an empty string to clear it. `cookie_file` re-imports cookies like add_account. The account's warm browser session is closed, so the next action cold-starts on the new config.
Public scan report
scanner v0.1.9 · 2026-09-24 · same rubric, same numbers if you re-run it
- Code scan82 source files scanned25/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitystatic API keys via environment variables6/15
- Maintenancelast push 37 days ago12/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
What the publisher says
From the x-use repository's README, as published. We do not edit it. Read it on GitHub
x-use
<!-- mcp-name: io.github.ihuzaifashoukat/x-use -->
Browser-native AI agents for X (Twitter). Multi-account, MCP-ready, no X API key required.
x-use drives a real, stealth-hardened browser instead of the paid X API. It posts, replies, searches, and engages across as many accounts as you configure, writes content with your own LLM, and exposes everything as MCP tools, so Claude Desktop, Claude Code, Cursor, and other MCP clients can run your X presence directly.
The X API's pricing tiers put write access out of reach for exactly the people who want to automate a couple of accounts. x-use sidesteps the API entirely: if a logged-in browser can do it, an MCP client can ask for it. And because write actions go through a draft-approval step by default, an agent can prepare work all day while nothing reaches X until a human says yes.
x-use is the v2 relaunch of twitter-automation-ai. The repository was renamed; old URLs keep redirecting, and stars, forks, and issues came along intact.
Install
From PyPI (CLI and MCP server):
pip install x-use-mcpFor the full repo setup (presets, example configs, docs), the one-line installer clones the repo, installs x-use into its own virtual environment, and finishes with x-use doctor so you can see what is left to configure.
Windows (PowerShell):
iex "& { $(irm https://raw.githubusercontent.com/ihuzaifashoukat/x-use/main/install.ps1) }"macOS / Linux / Git Bash:
curl -fsSL https://raw.githubusercontent.com/ihuzaifashoukat/x-use/main/install.sh | bashOr the manual way:
git clone https://github.com/ihuzaifashoukat/x-use.git
cd x-use
pip install -e .Requires Python 3.10+ and Chrome. Any of these gives you the x-use command.
Automatic setup
Point any capable agent at this repository and it can install and configure x-use itself. SKILL.md at the root is the install-and-configure skill: it covers prerequisites, pip install, MCP client registration for Claude Desktop, Claude Code, Codex, Cursor, and Windsurf, the client restart, cookie-based account setup, keywords, and persona.
npx skills add ihuzaifashoukat/x-useOr paste the one-shot prompt in docs/SETUP_PROMPT.md into your client. Prefer to drive it yourself? Keep reading.
Set up
x-use init # interactive wizard: presets, account + cookie import, LLM keys
x-use doctor # verify browser/driver, cookies, LLM keys, proxiesThen connect your AI client. Paste this into claudedesktopconfig.json (Claude Desktop > Settings > Developer > Edit Config); the same command/args pair works for any MCP client that runs stdio servers:
{
"mcpServers": {
"x-use": {
"command": "x-use",
"args": ["mcp"]
}
}
}Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Install directly
claude mcp add x-use -- uvx x-use-mcp
x-use: common questions
- Is x-use MCP server safe?
- Mostly: it is graded B (78/100). Read the x-use safety report
- How do I install x-use?
- It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
- Does x-use need an API key?
- Yes. The registry entry asks for
OPENAI_API_KEY. - Is x-use maintained?
- The last commit was 38 days ago (2026-08-18). The latest release is v2.4.1.
- What can I use instead of x-use?
- Servers from other publishers that do the same job: Safari MCP server, mac-control-mcp server and Browser Gateway MCP server. Compare all x-use alternatives.
Alternatives to x-use
Same job from other publishers: the closest match first, then the best rated.
- SafariNative Safari browser automation for AI agents — 98 tools, zero Chrome overhead.not reviewedEstablishedC
- mac-control-mcpNative Swift macOS automation — 153 tools: AX, EventKit, voice, browser DOM, undo.not reviewedGrowingB
- Browser GatewayAI browser tools with Chrome CDP. Navigate, screenshot, interact. Multi-provider failover.not reviewedGrowingB
- NovadaSearch, extract, crawl, map, research, scrape 16 platforms, browser automation, proxy — one API key.not reviewedGrowingA
- PersonaeControl specific, already-open account-isolated Personae browser identities with MCP.not reviewedGrowingA