Skip to main content
Glama
doanbactam
by doanbactam

npm  ยท  Docs  ยท  MCP Server  ยท  Docker  ยท  API Ref


๐Ÿ† How XActions Compares

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)

โœ… 140+ 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.


Related MCP server: Twitter MCP Server

๐Ÿ†• What's New in v3.1.0

The biggest update since launch. 58,000+ lines of new code across 115 files.

Feature

What it does

Plugin System

Community plugins via npm โ€” xactions-plugin-* packages extend scrapers, MCP tools, and automation

Cross-Platform

Scrape Bluesky (AT Protocol), Mastodon (REST API), and Threads โ€” unified interface

Workflow Engine

Declarative JSON pipelines with triggers, conditions, and chained actions

Real-Time Streaming

Subscribe to live tweet/follower/mention events via Socket.IO

Sentiment Analysis

Built-in analyzer (works offline) + optional LLM mode โ€” reputation monitoring with alerts

Social Graph

Map account relationships, detect clusters, find bridge accounts, D3.js visualization

Account Portability

Export your entire Twitter life to JSON/CSV/HTML โ€” migration stubs for Bluesky & Mastodon

Browser Extension

Chrome/Firefox Manifest V3 โ€” run automations from a popup, no console needed

Dashboard Upgrade

Live automation controls, real-time monitoring, visual workflow builder, analytics page

15+ New Scripts

Engagement booster, shadowban checker, viral detector, thread composer, content calendar, and more

See CHANGELOG.md for full details.


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


๐Ÿ“– Table of Contents


  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


// 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.

  1. Go to https://x.com/YOUR_USER_NAME/following

  2. Open the Developer Console. (COMMAND+ALT+I on Mac)

  3. Paste the script into the Developer Console and run it

// 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:

  • Is completely free.

  • Doesn't try and get you to sign in or take your personal data.

  • Automates your web browser to make it click unfollow buttons, scroll down to reveal more, then do it again.

  • No tricks, all of the code is here so you can see exactly what it does.

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.


โœจ How It Works

โœจ How It Works

Your x.com tab does all the work. Nothing gets scraped to our servers. You're in control.


๐Ÿ’ฐ Pricing

๐Ÿ†“ 100% Free & Open Source

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.


๐ŸŽฏ Why XActions?


๐Ÿณ Docker

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.


๐Ÿ“– API Reference

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.


๐Ÿ“ Claude Tutorials

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

See all 23 tutorials โ†’


โš ๏ธ Disclaimer

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.


๐Ÿ“ฆ Installation

npm install xactions
npm install -g xactions
xactions --help

No install needed โ€” copy-paste scripts into your browser console on x.com


๐Ÿš€ Quick Start Examples

Example 1: Unfollow Non-Followers (30 seconds)

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();

Example 2: Scrape Any Profile

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();

Example 3: Search & Scrape Tweets

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();

Example 4: Detect Who Unfollowed You

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

Example 5: Auto-Like Posts by Keyword

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.


Example 6: Leave All Communities

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


๐Ÿ“‹ Complete Feature List

Feature Availability Matrix

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


๐Ÿค– MCP Server (AI Agents)

XActions includes the most comprehensive free MCP server for X/Twitter. Works with Claude, Cursor, Windsurf, VS Code, and any MCP client.

Quick Setup (30 seconds)

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_token value

Or auto-generate the config:

npx xactions mcp-config --client claude
npx xactions mcp-config --client cursor
npx xactions mcp-config --client windsurf

Available MCP Tools (140+)

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_generate_tweet, x_rewrite_tweet, x_summarize_thread, 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

Example Prompts

"Generate 3 tweet ideas about startups" โ†’ 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


๐ŸŽ™๏ธ Autonomous Space Agent

AI agents can join live X Spaces, listen to conversations, and speak autonomously using voice AI. Powered by the xspace-agent SDK.

What It Does

  1. Launches a headless browser and joins an X Space

  2. Transcribes other speakers in real time (Whisper STT)

  3. Generates intelligent responses with your chosen LLM (OpenAI, Claude, or Groq)

  4. Speaks responses back into the Space via text-to-speech (ElevenLabs, OpenAI, or browser)

  5. Handles turn-taking, context tracking, and graceful shutdown

Setup

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

Usage

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.


๐Ÿ’ป CLI Reference

# 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

๐Ÿ“š Node.js API

Quick Start

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();

All Scraper Functions

// 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)

๐Ÿ”’ Safety & Best Practices

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


๏ฟฝ Built With


๏ฟฝ๐Ÿ“ Project Structure

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 (140+ 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
โ”œโ”€โ”€ extension/            # Chrome/Firefox browser extension (Manifest V3)
โ”œโ”€โ”€ docs/                 # Documentation
โ”œโ”€โ”€ skills/               # 26 Agent Skills (skills/*/SKILL.md)
โ”œโ”€โ”€ tests/                # Vitest test suite
โ””โ”€โ”€ prisma/               # Database schema

๐Ÿค Contributing

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

โญ Star History

If XActions saved you from paying $100/mo for Twitter's API, star the repo โ€” it's how open source grows.


๐Ÿ“š Full Tutorial Library

All Documentation

Example Docs (Full Code)

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



๐ŸŒ Live HTTP Deployment

XActions is deployed and accessible over HTTP via MCP Streamable HTTP transport โ€” no local installation required.

Endpoint:

https://modelcontextprotocol.name/mcp/xactions

Connect from any MCP Client

Add to your MCP client configuration (Claude Desktop, Cursor, SperaxOS, etc.):

{
  "mcpServers": {
    "xactions": {
      "type": "http",
      "url": "https://modelcontextprotocol.name/mcp/xactions"
    }
  }
}

Available Tools (3)

Tool

Description

search_twitter_users

Search X/Twitter profiles

get_twitter_trends

Trending topics

analyze_social_sentiment

Social sentiment analysis

Example Requests

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"}}}'

List All Tools

curl -X POST https://modelcontextprotocol.name/mcp/xactions \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Also Available On

Powered by modelcontextprotocol.name โ€” the open MCP HTTP gateway


๐Ÿ† Full Comparison Matrix

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

A
license - permissive license
-
quality - not tested
C
maintenance

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    -
    quality
    D
    maintenance
    Enables AI agents to interact with Twitter/X through Playwright browser automation without requiring an official API key. It provides tools for posting content, searching tweets, reading feeds, and managing social interactions like follows and likes.
    2
    MIT
  • A
    license
    -
    quality
    C
    maintenance
    Enables AI assistants to access Twitter/X data including user profiles, tweets, search, and follower events via a set of MCP tools.
    MIT
  • A
    license
    -
    quality
    C
    maintenance
    Enables AI agents to fully automate X/Twitter interactions including searching, posting, engaging, and managing multiple accounts without paid API keys.
    MIT

View all related MCP servers

Related MCP Connectors

  • Connect any AI agent to 11+ social platforms: schedule, publish & track posts via hosted MCP.

  • X (formerly Twitter) posts, profiles, and search for AI agents. Free key, self-minted, no signup.

  • Hosted MCP with 91 agent tools: X, domains, SEO, Maps, Trends, Search, YouTube, TikTok, and more.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/doanbactam/XActions'

If you have feedback or need assistance with the MCP directory API, please join our Discord server