{"name":"io.github.ihuzaifashoukat/x-use","slug":"ihuzaifashoukat-x-use","title":"x-use","description":"Browser-native AI agents for X (Twitter): multi-account, MCP-ready, no X API key required.","url":"https://mcp.market/server/ihuzaifashoukat-x-use","rating":null,"grade":"B","score":78,"certified":false,"status":"active","category":"scraping","tags":["scraping"],"presence":{"score":40,"stars":168,"forks":30,"downloads_week":48,"last_push_at":"2026-08-18T10:20:21.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"pypi","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/ihuzaifashoukat/x-use","website":null,"version":"2.4.1","remotes":[],"packages":[{"registryType":"pypi","identifier":"x-use-mcp","version":"2.4.1","transport":{"type":"stdio"},"environmentVariables":[{"description":"Optional. Only needed for server-side text generation ('auto' replies, composite draft tools, background automation). Interactive MCP use is keyless because the calling agent writes the text.","format":"string","isSecret":true,"name":"OPENAI_API_KEY"},{"description":"Optional. OpenAI-compatible endpoint, for example https://openrouter.ai/api/v1 or http://localhost:11434/v1 for Ollama. Defaults to api.openai.com.","format":"string","name":"OPENAI_BASE_URL"}]}],"tools":[{"name":"add_account","description":"Add 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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"add_proxy","description":"Add 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"approve_draft","description":"Execute 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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"cancel_queued_action","description":"Cancel a pending or failed queued action. Done, processing, and already-cancelled items cannot transition.","write_action":true,"price_micros":0,"input_schema":null},{"name":"draft_post_variations","description":"Generate `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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"engage","description":"Engage 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"generate_and_post","description":"Generate 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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_account","description":"Show one account's masked config (no cookies, no password, proxy credentials masked) plus cookie-file status. Read-only — never starts a browser.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_account_health","description":"Read-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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_draft","description":"Show one draft by id. Read-only.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_metrics","description":"Read recorded metrics for an account (counters + recent events). Read-only — never starts a browser.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_run_status","description":"Poll run_cycle handles. With `run_id` omitted, lists every run started since this server booted. Read-only.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_tweet","description":"Read-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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_accounts","description":"List configured accounts with secrets stripped (no cookies, no passwords, proxy credentials masked). Read-only — never starts a browser.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_drafts","description":"List 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_proxies","description":"List 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_queue","description":"List queued actions with their full payloads (exactly what will fire), plus per-status counts. Read-only — never starts a browser.","write_action":false,"price_micros":0,"input_schema":null},{"name":"post_tweet","description":"Post 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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"prepare_reply","description":"Read-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=...).","write_action":false,"price_micros":0,"input_schema":null},{"name":"process_queue","description":"Drain 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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"queue_engagement","description":"Queue 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"queue_post","description":"Schedule 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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"reject_draft","description":"Reject a pending draft so it can never be approved. Local status change only — nothing touches X.","write_action":false,"price_micros":0,"input_schema":null},{"name":"remove_account","description":"Remove 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.","write_action":true,"price_micros":0,"input_schema":null},{"name":"remove_proxy","description":"Remove 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).","write_action":true,"price_micros":0,"input_schema":null},{"name":"reply_to_tweet","description":"Reply 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).","write_action":false,"price_micros":0,"input_schema":null},{"name":"research_and_stage","description":"Search 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"run_cycle","description":"Run 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","write_action":true,"price_micros":0,"input_schema":null},{"name":"search_profile","description":"Read 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"search_tweets","description":"Search 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.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_account_active","description":"Enable or pause an account without deleting it. Pausing closes its warm browser session.","write_action":false,"price_micros":0,"input_schema":null},{"name":"test_proxy","description":"Probe 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","write_action":false,"price_micros":0,"input_schema":null},{"name":"update_account","description":"Partially 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.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":78,"grade":"B","scanned_at":"2026-09-24T21:42:24.889Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-24T21:42:24.922Z","components":{"code":{"score":25,"max":25,"notes":["82 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":12,"max":15,"notes":["last push 37 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"pypi","identifier":"x-use-mcp","version":"2.4.1","found":true,"weeklyDownloads":48,"license":"MIT","dependencyCount":15,"publishedAt":"2026-07-25T17:19:51.740633Z"}],"repo":{"found":true,"owner":"ihuzaifashoukat","repo":"x-use","archived":false,"pushedAt":"2026-08-18T10:20:21Z","stars":168,"forks":30,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/125597146?v=4","ownerCreatedAt":"2023-02-16T18:11:11Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/125597146?v=4&s=128","source":"github"},"presence":{"stars":168,"forks":30,"downloadsWeek":48,"license":"MIT","lastPushAt":"2026-08-18T10:20:21.000Z","score":40}}}},"grade_history":[],"reviews":[]}