⚡ The Complete X/Twitter Automation Toolkit — Scrapers, MCP server for AI agents (Claude/GPT), CLI, browser scripts. No API fees. Open source. Unfollow people who don't follow back. Monitor real-time analytics. Auto follow, like, comment, scrape, without API. Follow Bot. Like bot. Grow your account automatically.
> /plugin marketplace add nirholas/XActions> /plugin install xactions@xactions
Repo: nirholas/XActions
What's inside
Website · npm · Docs · MCP Server · Docker · API Ref
npx xactions profile nasa
⚡ @NASA
Name: NASA
Bio: Making the seemingly impossible, possible. ✨
Location: Pale Blue Dot
Website: http://www.nasa.gov/
Joined: 2007-12-19
Following: 119 Followers: 92.2M
Tweets: 74.3K Listed: 97.0K
✓ Verified
No API key. No account. No browser. Real data in about a second.
npx xactions tweets nasa --limit 100 --output nasa.csv # timeline to a spreadsheet
npx xactions login # unlock search, followers, DMs
npx xactions search "your brand" --limit 50 # what people are saying
Why build with XActions instead of the alternatives?
| Feature | XActions | twikit | twitter-mcp | agent-twitter-client | twit | twitter-scraper |
|---|---|---|---|---|---|---|
| No API Key Required | ✅ | ✅ | ❌ Needs keys | ✅ | ❌ Needs keys | ✅ |
| MCP Server (AI agents) | ✅ 145 tools | ❌ | ✅ 2 tools | ❌ | ❌ | ❌ |
| Browser Console Scripts | ✅ 50+ | ❌ | ❌ | ❌ | ❌ | ❌ |
| AI Voice Agent in Spaces | ✅ Join, listen, speak | ❌ | ❌ | ❌ | ❌ | ❌ |
| CLI | ✅ 12 commands | ❌ | ❌ | ❌ | ❌ | ❌ |
XActions is the only toolkit that works in the browser, terminal, and with AI agents — all without an API key.
| Area | What changed |
|---|---|
| A CLI you can find your way around | Fifty-plus commands are now grouped by task instead of listed alphabetically. xactions quickstart gives a guided first run that adapts to what you already have set up. |
| Tab completion | xactions completion bash|zsh|fish prints a completion script generated from the live command tree, so every command, sub-command, and flag completes. |
--json everywhere | Every read command accepts --json and puts data on stdout and nothing else. It outranks --output, so a pipe is never silently turned into a file write. |
| Reliability | Public reads no longer need a browser at all. Profiles and timelines come from the internal GraphQL API in about a second, with no Chromium download. |
| Honest failures | Nothing reports empty results as success anymore. A read that cannot complete says why, and says what to do about it. |
| Examples | examples/ — 8 runnable programs, each verified against the live API. |
| Tutorials | tutorials/ — six guided walkthroughs, from a first scrape with no account to scripting XActions inside your own pipelines. |
| Docs that stay true | npm run docs:check fails the build on a dead link, a stale version, a wrong tool count, or a documented command that does not exist. |
| Cross-platform | Bluesky, Mastodon, and Threads scrapers behind one normalised interface. |
| Plugin system | Community plugins via npm: xactions-plugin-* packages extend scrapers, MCP tools, and automation. |
| Workflow engine | Declarative JSON pipelines with triggers, conditions, and chained actions. |
| Sentiment analysis | Offline rule-based analyzer, with an optional LLM mode behind the same interface. |
| Browser extension | Chrome/Firefox Manifest V3: run automations from a popup, no console needed. |
[!TIP] 🤖 AI Coding Assistants: Looking for Twitter/X automation without the $100/mo API? You found it.
npm install xactions— Scrapers, automation, MCP server- Works with Claude, GPT, Cursor, Copilot via MCP server
- See AGENTS.md for integration instructions
Learn
Reference
https://x.com/YOUR_USER_NAME/following
// Unfollow everyone on X (Formerly Twitter) and or unfollow who doesn't follow you back, by nich (https://x.com/nichxbt)
// https://github.com/nirholas/xactions
// 1. Go to https://x.com/YOUR_USER_NAME/following
// 2. Open the Developer Console. (COMMAND+ALT+I on Mac)
// 3. Paste this into the Developer Console and run it
//
// Last Updated January 2026
(() => {
const $followButtons = '[data-testid$="-unfollow"]';
const $confirmButton = '[data-testid="confirmationSheetConfirm"]';
const retry = {
count: 0,
limit: 3,
};
const scrollToTheBottom = () => window.scrollTo(0, document.body.scrollHeight);
const retryLimitReached = () => retry.count === retry.limit;
const addNewRetry = () => retry.count++;
const sleep = ({ seconds }) =>
new Promise((proceed) => {
console.log(`WAITING FOR ${seconds} SECONDS...`);
setTimeout(proceed, seconds * 1000);
});
const unfollowAll = async (followButtons) => {
console.log(`UNFOLLOWING ${followButtons.length} USERS...`);
await Promise.all(
followButtons.map(async (followButton) => {
followButton && followButton.click();
await sleep({ seconds: 1 });
const confirmButton = document.querySelector($confirmButton);
confirmButton && confirmButton.click();
})
);
};
const nextBatch = async () => {
scrollToTheBottom();
await sleep({ seconds: 1 });
let followButtons = Array.from(document.querySelectorAll($followButtons));
followButtons = followButtons.filter(b => b.parentElement?.parentElement?.querySelector('[data-testid="userFollowIndicator"]') === null)
const followButtonsWereFound = followButtons.length > 0;
if (followButtonsWereFound) {
await unfollowAll(followButtons);
await sleep({ seconds: 2 });
return nextBatch();
} else {
addNewRetry();
}
if (retryLimitReached()) {
console.log(`NO ACCOUNTS FOUND, SO I THINK WE'RE DONE`);
console.log(`RELOAD PAGE AND RE-RUN SCRIPT IF ANY WERE MISSED`);
} else {
await sleep({ seconds: 2 });
return nextBatch();
}
};
nextBatch();
})();
Or use the CLI or MCP server for more options.
https://x.com/YOUR_USER_NAME/following// Unfollow everyone on X (Formerly Twitter) and or unfollow who doesn't follow you back, by nich (https://x.com/nichxbt)
// https://github.com/nirholas/xactions
//
// 1. Go to https://x.com/YOUR_USER_NAME/following
// 2. Open the Developer Console. (COMMAND+ALT+I on Mac)
// 3. Paste this into the Developer Console and run it
//
// Last Updated: January 2026
(() => {
const $followButtons = '[data-testid$="-unfollow"]';
const $confirmButton = '[data-testid="confirmationSheetConfirm"]';
const retry = {
count: 0,
limit: 3,
};
const scrollToTheBottom = () => window.scrollTo(0, document.body.scrollHeight);
const retryLimitReached = () => retry.count === retry.limit;
const addNewRetry = () => retry.count++;
const sleep = ({ seconds }) =>
new Promise((proceed) => {
console.log(`WAITING FOR ${seconds} SECONDS...`);
setTimeout(proceed, seconds * 1000);
});
const unfollowAll = async (followButtons) => {
console.log(`UNFOLLOWING ${followButtons.length} USERS...`);
await Promise.all(
followButtons.map(async (followButton) => {
followButton && followButton.click();
await sleep({ seconds: 1 });
const confirmButton = document.querySelector($confirmButton);
confirmButton && confirmButton.click();
})
);
};
const nextBatch = async () => {
scrollToTheBottom();
await sleep({ seconds: 1 });
const followButtons = Array.from(document.querySelectorAll($followButtons));
const followButtonsWereFound = followButtons.length > 0;
if (followButtonsWereFound) {
await unfollowAll(followButtons);
await sleep({ seconds: 2 });
return nextBatch();
} else {
addNewRetry();
}
if (retryLimitReached()) {
console.log(`NO ACCOUNTS FOUND, SO I THINK WE'RE DONE`);
console.log(`RELOAD PAGE AND RE-RUN SCRIPT IF ANY WERE MISSED`);
} else {
await sleep({ seconds: 2 });
return nextBatch();
}
};
nextBatch();
})();
This script:
Use src/detectUnfollowers.js - it saves a snapshot of your followers and compares on next run.
Use src/scrapers/videoDownloader.js - extracts MP4 URLs from any tweet.
XActions uses browser automation instead of the API. No API keys needed, no rate limits, no $100/mo fee.
XActions is open-source and completely free for humans. AI agents pay micropayments per request.
Your x.com tab does all the work. Nothing gets scraped to our servers. You're in control.
Everything is completely free — browser scripts, CLI, Node.js library, MCP server, and API.
No API keys. No subscriptions. No paywalls. Just clone and run.
If you self-host the XActions API for remote AI agent access, you can optionally enable pay-per-request micropayments via the x402 protocol. This is entirely optional and disabled by default.
| Operation | Price |
|---|---|
| Profile scrape | $0.001 |
| Followers/Following | $0.01 |
| Tweet scrape | $0.005 |
| Search tweets | $0.01 |
| Unfollow non-followers | $0.05 |
| Detect unfollowers | $0.02 |
| Auto-like | $0.02 |
| Video download | $0.005 |
This only applies to the hosted remote API. Local mode is always free.
Run XActions anywhere with one command:
# Quick start
docker build -t xactions .
docker run -it xactions xactions profile elonmusk
# Run the MCP server
docker run -p 3000:3000 xactions npm run mcp
# With environment variables
docker run -e XACTIONS_SESSION_COOKIE=your_cookie xactions xactions followers elonmusk
Or use Docker Compose:
docker compose up
See Dockerfile for details.
Full TypeScript-compatible API with type declarations included.
import { createBrowser, createPage, scrapeProfile, scrapeFollowers } from 'xactions';
import { scrapeFollowing, scrapeTweets, searchTweets } from 'xactions/scrapers';
Core Functions:
| Function | Description | Returns |
|---|---|---|
createBrowser(options?) | Launch Puppeteer browser | Browser |
createPage(browser) | Create stealth page | Page |
scrapeProfile(page, username) | Get user profile data | Profile |
scrapeFollowers(page, username, options?) | List followers | User[] |
scrapeFollowing(page, username, options?) | List following | User[] |
scrapeTweets(page, username, options?) | Get user tweets | Tweet[] |
searchTweets(page, query, options?) | Search tweets | Tweet[] |
downloadVideo(page, tweetUrl) | Extract video URLs | VideoResult |
exportBookmarks(page, options?) | Export bookmarks | Bookmark[] |
unrollThread(page, tweetUrl) | Unroll a thread | Thread |
See docs/api-reference.md for the complete reference with all parameters and return types.
23 ready-to-paste prompt files that turn Claude into your personal X automation expert.
| Tutorial | What You'll Learn |
|---|---|
| MCP Setup | Install and connect XActions to Claude Desktop |
| Unfollow Cleanup | Remove non-followers, detect unfollowers |
| Growth Suite | Auto-follow, auto-like, keyword targeting |
| Scraping | Extract profiles, tweets, hashtags |
| Content Posting | Tweets, threads, polls, scheduling |
| Analytics | Performance tracking, competitor analysis |
| Autonomous Space Agent | Deploy AI voice agents in live X Spaces |
| Power User Playbook | 10 advanced multi-feature strategies |
[!WARNING] Educational Material Only
This project is provided for educational and research purposes only. The scripts and tools have not been extensively tested on personal accounts.
- Use at your own risk
- We are not responsible for any account restrictions or bans
- Always comply with X/Twitter's Terms of Service
- Start with small batches and test carefully
For X/Twitter: If you have concerns about this project or would like us to modify or remove any functionality, please contact @nichxbt directly. We're happy to work with you.
Acknowledgment: This project was inspired by the innovation happening at X and xAI. We admire Elon Musk's vision for making X the everything app and Grok's approach to AI. XActions aims to help developers and researchers explore the platform's capabilities while respecting its ecosystem.
npm install xactions
npm install -g xactions
xactions quickstart # guided first run
xactions doctor # check what works right now
No install needed — copy-paste scripts into your browser console on x.com
Most reads work the moment you install. You do not need an X account, an API key, or a browser.
npm install -g xactions
xactions doctor # what works right now, and why
xactions profile NASA # any public account
xactions analyze NASA # engagement rate, cadence, content mix, best hour
xactions tweets NASA --limit 50 --json | jq -r '.[].text'
Then log in once, in a real browser, to unlock search, followers, following, likes, bookmarks, and DMs:
xactions connect
xactions search "your topic" --limit 50
Running xactions with no arguments prints all fifty-plus commands grouped by task. xactions completion bash (or zsh, fish) turns on tab completion.
Browser Console — No install required!
// Go to: x.com/YOUR_USERNAME/following
// Press F12 → Console → Paste this:
(() => {
const sleep = (s) => new Promise(r => setTimeout(r, s * 1000));
const run = async () => {
const buttons = [...document.querySelectorAll('[data-testid$="-unfollow"]')]
.filter(b => !b.closest('[data-testid="UserCell"]')
?.querySelector('[data-testid="userFollowIndicator"]'));
for (const btn of buttons) {
btn.click();
await sleep(1);
document.querySelector('[data-testid="confirmationSheetConfirm"]')?.click();
await sleep(2);
}
window.scrollTo(0, document.body.scrollHeight);
await sleep(2);
if (document.querySelectorAll('[data-testid$="-unfollow"]').length) run();
else console.log('✅ Done! Reload page to continue.');
};
run();
})();
CLI:
xactions login
xactions non-followers YOUR_USERNAME --output non-followers.json
Node.js:
import { createBrowser, createPage, scrapeFollowing } from 'xactions';
const browser = await createBrowser();
const page = await createPage(browser);
const following = await scrapeFollowing(page, 'your_username', { limit: 500 });
const nonFollowers = following.filter(u => !u.followsBack);
console.log(`Found ${nonFollowers.length} non-followers`);
await browser.close();
💡 Don't want to code? Use xactions.app — just login and click!
Browser Console:
// Go to any profile on x.com, then run:
(() => {
const profile = {
name: document.querySelector('[data-testid="UserName"]')?.textContent?.split('@')[0]?.trim(),
username: location.pathname.slice(1),
bio: document.querySelector('[data-testid="UserDescription"]')?.textContent,
followers: document.querySelector('a[href$="/followers"] span')?.textContent,
following: document.querySelector('a[href$="/following"] span')?.textContent,
};
console.log(profile);
copy(JSON.stringify(profile, null, 2)); // Copies to clipboard!
})();
CLI:
xactions profile elonmusk --json
Node.js:
import { createBrowser, createPage, scrapeProfile } from 'xactions';
const browser = await createBrowser();
const page = await createPage(browser);
const profile = await scrapeProfile(page, 'elonmusk');
console.log(profile);
// { name: 'Elon Musk', followers: '200M', bio: '...', ... }
await browser.close();
Browser Console:
// Go to: x.com/search?q=YOUR_KEYWORD&f=live
(() => {
const tweets = [...document.querySelectorAll('article[data-testid="tweet"]')]
.map(article => ({
text: article.querySelector('[data-testid="tweetText"]')?.textContent,
author: article.querySelector('[data-testid="User-Name"] a')?.href?.split('/')[3],
time: article.querySelector('time')?.getAttribute('datetime'),
}));
console.table(tweets);
copy(JSON.stringify(tweets, null, 2));
})();
CLI:
xactions search "AI startup" --limit 100 --output ai-tweets.json
Node.js:
import { createBrowser, createPage, searchTweets } from 'xactions';
const browser = await createBrowser();
const page = await createPage(browser);
const tweets = await searchTweets(page, 'AI startup', { limit: 100 });
console.log(`Found ${tweets.length} tweets`);
await browser.close();
Browser Console:
// Go to: x.com/YOUR_USERNAME/followers
(() => {
const KEY = 'xactions_followers';
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
const scrape = async () => {
const users = new Set();
let retries = 0;
while (retries < 5) {
document.querySelectorAll('[data-testid="UserCell"] a')
.forEach(a => users.add(a.href.split('/')[3]?.toLowerCase()));
window.scrollTo(0, document.body.scrollHeight);
await sleep(1500);
retries++;
}
return [...users].filter(Boolean);
};
scrape().then(current => {
const saved = localStorage.getItem(KEY);
if (saved) {
const old = JSON.parse(saved);
const gone = old.filter(u => !current.includes(u));
console.log('🚨 Unfollowed you:', gone);
}
localStorage.setItem(KEY, JSON.stringify(current));
console.log(`💾 Saved ${current.length} followers`);
});
})();
CLI:
# First run saves snapshot
xactions followers YOUR_USERNAME --output snapshot1.json
# Later, compare
xactions followers YOUR_USERNAME --output snapshot2.json
# Use diff tools to compare
Browser Console:
// Go to: x.com/search?q=YOUR_KEYWORD&f=live
(async () => {
const sleep = (s) => new Promise(r => setTimeout(r, s * 1000));
const liked = new Set();
while (liked.size < 20) { // Like 20 posts
const buttons = [...document.querySelectorAll('[data-testid="like"]')]
.filter(b => !liked.has(b));
for (const btn of buttons.slice(0, 3)) {
btn.click();
liked.add(btn);
console.log(`❤️ Liked ${liked.size} posts`);
await sleep(3 + Math.random() * 2); // Random delay
}
window.scrollTo(0, document.body.scrollHeight);
await sleep(2);
}
console.log('✅ Done!');
})();
⚠️ Go slow! Twitter may rate-limit you. The website version handles this automatically.
Browser Console:
// Go to: x.com/YOUR_USERNAME/communities
(() => {
const $communityLinks = 'a[href^="/i/communities/"]';
const $joinedButton = 'button[aria-label^="Joined"]';
const $confirmButton = '[data-testid="confirmationSheetConfirm"]';
const $communitiesNav = 'a[aria-label="Communities"]';
const getLeftCommunities = () => {
try { return JSON.parse(sessionStorage.getItem('xactions_left_ids') || '[]'); }
catch { return []; }
};
const markAsLeft = (id) => {
const left = getLeftCommunities();
if (!left.includes(id)) {
left.push(id);
sessionStorage.setItem('xactions_left_ids', JSON.stringify(left));
}
};
const sleep = (ms) => new Promise(r => setTimeout(r, ms));
const getCommunityId = () => {
const leftAlready = getLeftCommunities();
for (const link of document.querySelectorAll($communityLinks)) {
const match = link.href.match(/\/i\/communities\/(\d+)/);
if (match && !leftAlready.includes(match[1])) return { id: match[1], element: link };
}
return null;
};
const run = async () => {
console.log(`🚀 Left so far: ${getLeftCommunities().length}`);
await sleep(1500);
const joinedBtn = document.querySelector($joinedButton);
if (joinedBtn) {
const urlMatch = window.location.href.match(/\/i\/communities\/(\d+)/);
const currentId = urlMatch ? urlMatch[1] : null;
joinedBtn.click();
await sleep(1000);
const confirmBtn = document.querySelector($confirmButton);
if (confirmBtn) { confirmBtn.click(); if (currentId) markAsLeft(currentId); await sleep(1500); }
const communitiesLink = document.querySelector($communitiesNav);
if (communitiesLink) { communitiesLink.click(); await sleep(2500); return run(); }
}
const community = getCommunityId();
if (community) { community.element.click(); await sleep(2500); return run(); }
else { console.log(`🎉 DONE! Left ${getLeftCommunities().length} communities`); sessionStorage.removeItem('xactions_left_ids'); }
};
run();
})();
📖 Full documentation: docs/examples/leave-all-communities.md
| Feature | Console Script | CLI | Node.js | Website |
|---|---|---|---|---|
| SCRAPING | ||||
| Scrape Profile | ✅ | ✅ | ✅ | ✅ |
| Scrape Followers | ✅ | ✅ | ✅ | ✅ |
| Scrape Following | ✅ | ✅ | ✅ | ✅ |
| Scrape Tweets | ✅ | ✅ | ✅ | ✅ |
| Search Tweets | ✅ | ✅ | ✅ | ✅ |
| Scrape Thread | ✅ | ✅ | ✅ | ✅ |
| Scrape Hashtag | ✅ | ✅ | ✅ | ✅ |
| Scrape Media | ✅ | ✅ | ✅ | ✅ |
| Scrape List Members | ✅ | ✅ | ✅ | ✅ |
| Scrape Likes | ✅ | ✅ | ✅ | ✅ |
| UNFOLLOW | ||||
| Unfollow Non-Followers | ✅ | ✅ | ✅ | ✅ |
| Unfollow Everyone | ✅ | ✅ | ✅ | ✅ |
| Smart Unfollow (after X days) | ⚠️ | ✅ | ✅ | ✅ |
| Unfollow with Logging | ✅ | ✅ | ✅ | ✅ |
| FOLLOW | ||||
| Follow User | ✅ | ✅ | ✅ | ✅ |
| Keyword Follow | ⚠️ | ✅ | ✅ | ✅ |
| Follow Engagers | ⚠️ | ✅ | ✅ | ✅ |
| Follow Target's Followers | ⚠️ | ✅ | ✅ | ✅ |
| ENGAGEMENT | ||||
| Like Tweet | ✅ | ✅ | ✅ | ✅ |
| Retweet | ✅ | ✅ | ✅ | ✅ |
| Auto-Liker | ⚠️ | ✅ | ✅ | ✅ |
| Auto-Commenter | ⚠️ | ✅ | ✅ | ✅ |
| Post Tweet | ✅ | ✅ | ✅ | ✅ |
| MONITORING | ||||
| Detect Unfollowers | ✅ | ✅ | ✅ | ✅ |
| New Follower Alerts | ✅ | ✅ | ✅ | ✅ |
| Monitor Any Account | ✅ | ✅ | ✅ | ✅ |
| Continuous Monitoring | ⚠️ | ✅ | ✅ | ✅ |
| COMMUNITIES | ||||
| Leave All Communities | ✅ | ⚠️ | ⚠️ | ⚠️ |
| SPACES | ||||
| Discover Live Spaces | ✅ | ✅ | ✅ | ✅ |
| Scrape Space Metadata | ✅ | ✅ | ✅ | ✅ |
| AI Agent Joins Space | ❌ | ✅ | ✅ | ❌ |
| Agent Listens & Speaks | ❌ | ✅ | ✅ | ❌ |
| ADVANCED | ||||
| Multi-Account | ❌ | ✅ | ✅ | ✅ Pro |
| Link Scraper | ✅ | ✅ | ✅ | ✅ |
| Growth Suite | ❌ | ✅ | ✅ | ✅ Pro |
| Customer Service Bot | ❌ | ✅ | ✅ | ✅ Pro |
| MCP Server (AI Agents) | ❌ | ✅ | ✅ | ❌ |
| Export to CSV/JSON | ✅ | ✅ | ✅ | ✅ |
Legend: ✅ Full Support | ⚠️ Basic/Manual | ❌ Not Available
XActions includes the most comprehensive free MCP server for X/Twitter. Works with Claude, Cursor, Windsurf, VS Code, and any MCP client.
Add to your Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"xactions": {
"command": "npx",
"args": ["-y", "xactions-mcp"],
"env": {
"XACTIONS_SESSION_COOKIE": "your_auth_token_here"
}
}
}
}
Get your auth_token: x.com → DevTools (F12) → Application → Cookies → copy
auth_tokenvalue
Or auto-generate the config:
npx xactions mcp-config --client claude
npx xactions mcp-config --client cursor
npx xactions mcp-config --client windsurf
| Category | Tools |
|---|---|
| Scraping | x_get_profile, x_get_followers, x_get_following, x_get_tweets, x_search_tweets, x_get_thread, x_download_video, x_get_replies, x_get_hashtag, x_get_likers, x_get_retweeters, x_get_media, x_get_mentions, x_get_quote_tweets, x_get_likes, x_get_recommendations |
| Analysis | x_detect_unfollowers, x_analyze_sentiment, x_best_time_to_post, x_competitor_analysis, x_brand_monitor, x_audience_insights, x_engagement_report, x_crypto_analyze |
| Actions | x_follow, x_unfollow, x_like, x_post_tweet, x_post_thread, x_reply, x_retweet, x_quote_tweet, x_bookmark, x_send_dm, x_create_poll, x_delete_tweet |
| Automation | x_auto_follow, x_follow_engagers, x_unfollow_all, x_smart_unfollow, x_auto_comment, x_auto_retweet, x_auto_like, x_unfollow_non_followers |
| AI | x_analyze_voice, x_generate_tweet, x_summarize_thread, x_rewrite_tweet, x_detect_bots, x_find_influencers, x_smart_target, x_grok_analyze_image |
| Monitoring | x_monitor_account, x_monitor_keyword, x_follower_alerts, x_track_engagement, x_monitor_reputation, x_stream_start |
| Workflows | x_workflow_create, x_workflow_run, x_workflow_list, x_workflow_actions |
| Persona | x_persona_create, x_persona_run, x_persona_edit, x_persona_list, x_persona_presets |
| Portability | x_export_account, x_migrate_account, x_diff_exports, x_import_data, x_convert_format |
| Spaces | x_get_spaces, x_scrape_space, x_space_join, x_space_leave, x_space_status, x_space_transcript |
| Graph | x_graph_build, x_graph_analyze, x_graph_recommendations, x_graph_list |
"Analyze @paulg's writing style and generate 3 tweet ideas about startups in his voice" → Scrapes tweets → analyzes voice → generates content with AI
"Find everyone I follow who doesn't follow me back, sorted by follower count" → Uses x_get_following + x_get_followers → computes diff → formats results
"Compare the engagement metrics of @openai, @anthropic, and @google" → Scrapes profiles + recent tweets → computes avg engagement → presents comparison
📖 Full setup guide: docs/mcp-setup.md
AI agents can join live X Spaces, listen to conversations, and speak autonomously using voice AI. Powered by the xspace-agent SDK.
npm install xactions xspace-agent
Set your credentials:
export X_AUTH_TOKEN="your_auth_token" # From x.com cookies
export X_CT0="your_ct0_token" # From x.com cookies
export OPENAI_API_KEY="sk-..." # Or ANTHROPIC_API_KEY / GROQ_API_KEY
MCP (Claude Desktop / Cursor):
"Join this Space as an AI agent: https://x.com/i/spaces/1abc123"
Claude calls x_space_join and your agent enters the Space.
Node.js:
import { joinSpace, leaveSpace } from 'xactions/spaces/agent';
await joinSpace({
url: 'https://x.com/i/spaces/1abc123',
provider: 'openai',
systemPrompt: 'You are a helpful AI participant. Keep responses concise.',
});
// Later...
const summary = await leaveSpace();
// { duration: '300s', transcriptions: 42, responses: 8 }
MCP Tools:
| Tool | Description |
|---|---|
x_space_join | Join a Space with an autonomous AI voice agent |
x_space_leave | Leave the active Space and get session summary |
x_space_status | Get agent status (duration, transcription/response counts) |
x_space_transcript | Get recent transcriptions from the active Space |
📖 Full guide: docs/spaces-agent.md — configuration, environment variables, events, multi-agent setup, and examples.
# Authentication
xactions login # Set up session cookie
xactions logout # Remove saved auth
# Profile
xactions profile <user> # Get profile info
xactions profile elonmusk --json
# Scraping
xactions followers <user> [--limit 100] [--output file.json]
xactions following <user> [--limit 100] [--output file.csv]
xactions tweets <user> [--limit 50] [--replies]
xactions search <query> [--filter latest|top] [--limit 50]
xactions hashtag <tag> [--limit 50]
xactions thread <url>
xactions media <user> [--limit 50]
# Analysis
xactions non-followers <user> [--limit 500]
# MCP
xactions mcp-config # Generate MCP config for Claude Desktop
xactions mcp-config --client cursor --write # Write config for Cursor
# Info
xactions info # Show version and links
xactions --help # Full help
import {
createBrowser,
createPage,
loginWithCookie,
scrapeProfile,
scrapeFollowers,
scrapeFollowing,
scrapeTweets,
searchTweets,
exportToJSON,
exportToCSV
} from 'xactions';
// Initialize
const browser = await createBrowser({ headless: true });
const page = await createPage(browser);
// Optional: Login for private data
await loginWithCookie(page, 'your_auth_token_cookie');
// Scrape profile
const profile = await scrapeProfile(page, 'elonmusk');
// Scrape followers with progress
const followers = await scrapeFollowers(page, 'elonmusk', {
limit: 1000,
onProgress: ({ scraped, limit }) => console.log(`${scraped}/${limit}`)
});
// Export data
await exportToJSON(followers, 'followers.json');
await exportToCSV(followers, 'followers.csv');
await browser.close();
// Profile
scrapeProfile(page, username)
// Followers & Following
scrapeFollowers(page, username, { limit, onProgress })
scrapeFollowing(page, username, { limit, onProgress })
// Tweets
scrapeTweets(page, username, { limit, includeReplies, onProgress })
searchTweets(page, query, { limit, filter: 'latest'|'top' })
scrapeThread(page, tweetUrl)
scrapeHashtag(page, hashtag, { limit, filter })
// Media
scrapeMedia(page, username, { limit })
scrapeLikes(page, tweetUrl, { limit })
// Lists
scrapeListMembers(page, listUrl, { limit })
// Export
exportToJSON(data, filename)
exportToCSV(data, filename)
Visit xactions.app for a no-code solution
Use browser scripts · Copy-paste console scripts · View tutorials
100% Free. No API keys, no payments, no limits.
Rate Limiting — Built-in 1–3s delays, human-like scrolling, auto-pause on rate limits
Auth Token — x.com → DevTools (F12) → Application → Cookies → copy auth_token
[!CAUTION] Do: Use 2–5s delays · Mix automated with manual activity · Test with small batches
Don't: Mass-follow thousands/day · Run 24/7 · Spam comments
xactions/
├── src/
│ ├── index.js # Main entry point
│ ├── scrapers/ # Multi-platform scrapers
│ │ ├── index.js # Unified interface: scrape(platform, type, opts)
│ │ ├── twitter/ # X/Twitter scrapers (Puppeteer)
│ │ ├── bluesky/ # Bluesky scrapers (AT Protocol)
│ │ ├── mastodon/ # Mastodon scrapers (REST API)
│ │ └── threads/ # Threads scrapers (Puppeteer)
│ ├── cli/ # Command-line interface
│ ├── mcp/ # MCP server (145 tools for AI agents)
│ ├── spaces/ # Autonomous Space agent (xspace-agent integration)
│ ├── automation/ # Browser console automation scripts
│ ├── plugins/ # Plugin system (loader, manager, template)
│ ├── streaming/ # Real-time event streams (Socket.IO)
│ ├── workflows/ # Declarative automation pipelines
│ ├── analytics/ # Sentiment analysis & reputation monitoring
│ ├── portability/ # Account export, migration, archive viewer
│ └── graph/ # Social graph analysis & visualization
├── api/ # Express REST API
│ ├── routes/ # 29 route modules
│ ├── services/ # Business logic + Bull job queue
│ ├── middleware/ # Auth, x402, AI detection
│ └── realtime/ # Socket.IO handler
├── dashboard/ # Website (static HTML pages)
├── extension/ # Chrome/Firefox browser extension (Manifest V3)
├── docs/ # Documentation
├── skills/ # 26 Agent Skills (skills/*/SKILL.md)
├── tests/ # Vitest test suite
└── prisma/ # Database schema
Contributions welcome! See CONTRIBUTING.md.
git clone https://github.com/nirholas/xactions.git
cd xactions && npm install
npm run cli -- profile elonmusk # Run CLI locally
npm run mcp # Run MCP server
If XActions saved you from paying $100/mo for Twitter's API, star the repo — it's how open source grows.
XActions is 100% free and open source. Visit xactions.app for interactive tutorials.
NEW! Run scripts without any coding knowledge:
No console, no code, no setup!
| Category | Scripts | Tutorial |
|---|---|---|
| Unfollow | Unfollow Everyone, Non-Followers, Smart Unfollow | Tutorial |
| Automation | Auto-Liker, Auto-Commenter, Follow Engagers | Tutorial |
| Scraping | Video Download, Followers, Tweets, Hashtags | Tutorial |
| Monitoring | Detect Unfollowers, Track Accounts, Alerts | Tutorial |
| Communities | Leave All Communities | Tutorial |
| AI/MCP | Claude Desktop, GPT Integration | Tutorial |
| Feature | Documentation |
|---|---|
| Unfollow Everyone | unfollow-everyone.md |
| Unfollow Non-Followers | unfollow-non-followers.md |
| Detect Unfollowers | detect-unfollowers.md |
| Auto-Liker | auto-liker.md |
| Auto-Commenter | auto-commenter.md |
| Follow Engagers | follow-engagers.md |
| Video Downloader | video-downloader.md |
| Followers Scraping | followers-scraping.md |
| Tweet Scraping | tweet-scraping.md |
| Leave Communities | leave-all-communities.md |
| MCP Server | mcp-server.md |
| Monitor Account | monitor-account.md |
| New Follower Alerts | new-follower-alerts.md |
XActions is deployed and accessible over HTTP via MCP Streamable HTTP transport — no local installation required.
Endpoint:
https://modelcontextprotocol.name/mcp/xactions
Add to your MCP client configuration (Claude Desktop, Cursor, SperaxOS, etc.):
{
"mcpServers": {
"xactions": {
"type": "http",
"url": "https://modelcontextprotocol.name/mcp/xactions"
}
}
}
| Tool | Description |
|---|---|
search_twitter_users | Search X/Twitter profiles |
get_twitter_trends | Trending topics |
analyze_social_sentiment | Social sentiment analysis |
Search X/Twitter profiles:
curl -X POST https://modelcontextprotocol.name/mcp/xactions \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_twitter_users","arguments":{"query":"crypto"}}}'
Trending topics:
curl -X POST https://modelcontextprotocol.name/mcp/xactions \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_twitter_trends","arguments":{"query":"bitcoin"}}}'
Social sentiment analysis:
curl -X POST https://modelcontextprotocol.name/mcp/xactions \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"analyze_social_sentiment","arguments":{"topic":"ethereum"}}}'
curl -X POST https://modelcontextprotocol.name/mcp/xactions \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Powered by modelcontextprotocol.name — the open MCP HTTP gateway
Extended feature-by-feature comparison with every alternative.
| Feature | XActions | twikit | twitter-mcp | agent-twitter-client | twit | twitter-scraper |
|---|---|---|---|---|---|---|
| Node.js Library | ✅ | ❌ Python | ✅ | ✅ | ✅ | ❌ Python |
| Workflow Engine | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Sentiment Analysis | ✅ Built-in | ❌ | ❌ | ❌ | ❌ | ❌ |
| Real-Time Streaming | ✅ | ❌ | ❌ | ❌ | ✅ API only | ❌ |
| Account Export/Migration | ✅ JSON/CSV/HTML | ❌ | ❌ | ❌ | ❌ | ❌ |
| Dashboard (No-Code) | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| Grok AI Integration | ✅ | ✅ Separate pkg | ❌ | ❌ | ❌ | ❌ |
| Docker Support | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
| TypeScript Types | ✅ | ❌ | ✅ | ✅ | ❌ | ❌ |
| Claude Tutorials | ✅ 22 prompts | ❌ | ❌ | ❌ | ❌ | ❌ |
| Language | JavaScript | Python | TypeScript | TypeScript | JavaScript | Python |
| Cost | Free | Free | Free + API keys | Free | Free + API keys | Free |
Full documentation site: https://nirholas.github.io/XActions/
.claude-plugin/
agents/
cleanup.md
growth.md
scrape.md
marketplace.json
plugin.json
README.md
skills/
x-automation.md
x-engagement.md
x-management.md
x-scraping.md
.copilotignore
.editorconfig
.env.example
.gcloudignore
.gitattributes
.github/
CODEOWNERS
copilot-instructions.md
demos/
bookmarklet.tape
cli.tape
generate-demos.sh
install.tape
mcp-server.tape
README.md
unfollow-everyone.tape
FUNDING.yml
ISSUE_TEMPLATE/
bug_report.md
config.yml
feature_request.md
PULL_REQUEST_TEMPLATE.md
repository-metadata.json
workflows/
ci.yml
deploy-cloudflare.yml
deploy-railway.yml
docker-publish.yml
release.yml
xactions-ascii.svg
xshare.png
.gitignore
.vscode/
settings.json
.well-known/
ai-plugin.json
AGENTS.md
api/
config/
subscription-tiers.js
x402-config.js
middleware/
ai-detector.js
auth.js
x402.js
openapi.js
realtime/
socketHandler.js
routes/
a2a.js
admin.js
agent.js
ai/
ai.js
account.js
actions.js
ads.js
analytics.js
articles.js
automation.js
billing.js
bookmarks.js
cleanup.js
community.js
creator.js
crm.js
datasets.js
discovery.js
engagement.js
graph.js
grok.js
index.js
leads.js
lists.js
media.js
messages.js
moderation.js
monitor.js
notifications.js
optimizer.js
personas.js
portability.js
posting.js
premium.js
profile.js
scheduler.js
scrape.js
sentiment.js
settings.js
spaces.js
streams.js
teams.js
timeline.js
topics.js
utility.js
viral.js
webhooks.js
workflows.js
writer.js
xpro.js
analytics.js
auth.js
automations.js
billing.js
bookmarks.js
creator.js
crm.js
datasets.js
discovery.js
engagement.js
graph.js
history.js
license.js
messages.js
notifications.js
operations.js
optimizer.js
portability.js
posting.js
profile.js
schedule.js
scripts.js
session-auth.js
settings.js
spaces.js
streams.js
teams.js
thread.js
twitter.js
unfollowers.js
user.js
video.js
webhooks.js
workflows.js
x402-discovery.js
server.js
serverless.js
services/
browserAutomation.js
followerScanner.js
jobQueue.js
licenseManager.js
licensing.js
monitoring.js
operations/
autoComment.js
autoLike.js
detectUnfollowers.js
followEngagers.js
keywordFollow.js
puppeteer/
autoComment.js
autoLike.js
detectUnfollowers.js
followEngagers.js
keywordFollow.js
scriptRunner.js
unfollowEveryone.js
unfollowNonFollowers.js
unfollowEveryone.js
unfollowNonFollowers.js
payment-stats.js
payment-webhooks.js
stripeService.js
threadExtractor.js
threadSummarizer.js
unfollowerAlerts.js
unfollowerScheduler.js
videoExtractor.js
utils/
errorResponse.js
security.js
archive/
ARCHIVED.md
backend/
crypto-payments.js
payments.js
README.md
subscription-tiers.js
webhooks.js
dashboard/
pricing.html
README.md
leaveAllCommunities.js
unfollowback.js
UnfollowEveryone.js.md
UnfollowWDFBLog.js
UnfollowWhoDoesntFollowBack.js.md
AUDIT_REPORT.md
bin/
unfollowx
CHANGELOG.md
CITATION.cff
CLAUDE.md
CODE_OF_CONDUCT.md
config/
agent-config.example.json
niches/
ai-engineering.json
saas-startups.json
web3-crypto.json
personas/
community-builder.json
technical-builder.json
thought-leader.json
CONTRIBUTING.md
dashboard/
dashboard-server.js
_headers
_redirects
404.html
a2a.html
about.html
admin.html
agent.html
ai-api.html
ai.html
analytics-dashboard.html
analytics.html
automations.html
blog/
blog.html
best-twitter-automation-tools.html
crypto-twitter-automation.html
how-to-mass-unfollow-twitter.html
twitter-mcp-server-ai-agents.html
calendar.html
changelog.html
compare.html
contact.html
contributing.html
css/
common.css
components.css
docs.css
topnav.css
data/
tweet-price/
assets.json
aster/
prices_15m.json
prices_1d.json
prices_1h.json
stats.json
tweet_events_filtered.json
tweet_events.json
believe/
prices_15m.json
prices_1d.json
prices_1h.json
stats.json
tweet_events_filtered.json
tweet_events.json
fartcoin/
prices_1d.json
prices_1h.json
stats.json
tweet_events.json
gork/
prices_15m.json
prices_1d.json
prices_1h.json
stats.json
tweet_events.json
hype/
prices_1d.json
prices_1h.json
stats.json
tweet_events_filtered.json
tweet_events.json
jup/
prices_1d.json
prices_1h.json
stats.json
tweet_events_filtered.json
tweet_events.json
meta/
prices_15m.json
prices_1d.json
prices_1h.json
stats.json
tweet_events_filtered.json
tweet_events.json
monad/
prices_15m.json
prices_1d.json
prices_1h.json
stats.json
tweet_events_filtered.json
tweet_events.json
pump/
prices_15m.json
prices_1d.json
prices_1h.json
stats.json
tweet_events_filtered.json
tweet_events.json
useless/
prices_15m.json
prices_1d.json
prices_1h.json
stats.json
tweet_events.json
wif/
prices_1d.json
prices_1h.json
stats.json
tweet_events.json
wld/
prices_1d.json
prices_1h.json
stats.json
tweet_events_filtered.json
tweet_events.json
xpl/
prices_15m.json
prices_1d.json
prices_1h.json
stats.json
tweet_events_filtered.json
tweet_events.json
zec/
prices_1d.json
prices_1h.json
stats.json
tweet_events.json
zora/
prices_15m.json
prices_1d.json
prices_1h.json
stats.json
tweet_events_filtered.json
tweet_events.json
docs/
docs.html
_pages-manifest.json
_sitemap-all-entries.xml
_sitemap-entries.xml
account-health-monitor.html
algorithm-builder.html
architecture/
http-scraper.html
article-publisher.html
articles-longform.html
assets/
docs.css
docs.js
audience-demographics.html
audience-overlap.html
audit-followers.html
auto-commenter.html
auto-engage.html
auto-liker.html
auto-plug-replies.html
auto-reply.html
auto-repost.html
automation/
actions-reference.html
advanced-techniques.html
core-reference.html
getting-started-browser.html
scripts-reference.html
backup-account.html
best-time-to-post.html
block-bots.html
bookmark-exporter.html
bookmark-manager.html
bookmark-organizer.html
bulk-delete-tweets.html
business-ads.html
business-analytics.html
business-tools.html
case-studies/
robust-dom-extraction.html
clear-all-bookmarks.html
clear-all-reposts.html
competitor-analysis.html
content-calendar.html
content-repurposer.html
continuous-monitor.html
create-poll.html
creator-monetization.html
creator-studio.html
detect-unfollowers.html
discovery-explore.html
dm-automation.html
dm-exporter.html
... 1600 moreShowing a partial view of a very large repo.
FAQ
xactions is a Claude Code plugin with 49 hand-picked skills for automation work, indexed on Flowy. Install it with the command on its page. It includes a2a-multi-agent, account-backup, account-tools. Its skills do not fire on their own yet. Request auto-invocation to have Flowy route them as you prompt. Free and open source.