{"id":"62a59551-0fd4-4138-a2ce-7d68b64c9150","slug":"mcp-nirholas-xactions","name":"xactions","description":"XActions - The Complete X/Twitter Automation Toolkit. Scrapers, MCP server for AI agents, CLI, and browser scripts. No API required. Open source by @nichxbt. Don't Panic.","canonicalUrl":"https://xpersona.co/mcp/mcp-nirholas-xactions","sourceUrl":"https://github.com/nirholas/XActions","homepage":"https://xactions.app","source":"GITHUB_MCP","vendor":{"slug":"xactions","label":"Xactions","url":"https://xactions.app"},"protocols":["MCP"],"capabilities":["xactions","twitter","x","twitter-automation","twitter-bot","twitter-scraper","twitter-unfollow","twitter-growth","mass-unfollow","unfollow-tool","twitter-tools","social-media-automation","twitter-api-alternative","puppeteer","twitter-manager","follower-management","twitter-cleanup","auto-follow","auto-like","twitter-analytics","mcp","model-context-protocol","ai-agent","claude","gpt","chatgpt","saas","hypefury-alternative","tweethunter-alternative","free-twitter-api","twitter-without-api","bulk-unfollow","who-unfollowed-me","twitter-followers-tracker","download-twitter-video","twitter-thread-saver","twitter-bookmark-export","vibe-coding","no-code-twitter","thought-leader","algorithm-training","x-algorithm","cli"],"trustScore":null,"trustConfidence":"unknown","artifactCount":0,"benchmarkCount":0,"lastRelease":"3.1.0","freshnessAt":"2026-02-25T02:31:20.432Z","freshnessLabel":"Feb 25, 2026","securityReviewed":true,"openapiReady":false,"stats":[{"label":"Trust score","value":"Unknown"},{"label":"Compatibility","value":"MCP"},{"label":"Freshness","value":"Feb 25, 2026"},{"label":"Vendor","value":"Xactions"},{"label":"Artifacts","value":"0"},{"label":"Benchmarks","value":"0"},{"label":"Last release","value":"3.1.0"}],"factsPreview":[{"factKey":"vendor","category":"vendor","label":"Vendor","value":"Xactions","href":"https://xactions.app","sourceUrl":"https://xactions.app","sourceType":"profile","confidence":"medium","observedAt":"2026-02-25T02:31:21.659Z","isPublic":true},{"factKey":"protocols","category":"compatibility","label":"Protocol compatibility","value":"MCP","href":"https://xpersona.co/api/v1/agents/mcp-nirholas-xactions/contract","sourceUrl":"https://xpersona.co/api/v1/agents/mcp-nirholas-xactions/contract","sourceType":"contract","confidence":"medium","observedAt":"2026-02-25T02:31:21.659Z","isPublic":true},{"factKey":"traction","category":"adoption","label":"Adoption signal","value":"76 GitHub stars","href":"https://github.com/nirholas/XActions","sourceUrl":"https://github.com/nirholas/XActions","sourceType":"profile","confidence":"medium","observedAt":"2026-02-25T02:31:21.659Z","isPublic":true},{"factKey":"handshake_status","category":"security","label":"Handshake status","value":"UNKNOWN","href":"https://xpersona.co/api/v1/agents/mcp-nirholas-xactions/trust","sourceUrl":"https://xpersona.co/api/v1/agents/mcp-nirholas-xactions/trust","sourceType":"trust","confidence":"medium","observedAt":null,"isPublic":true}],"highlights":["76 GitHub stars","Trust evidence available"],"agentCard":{"name":"xactions","description":"XActions - The Complete X/Twitter Automation Toolkit. Scrapers, MCP server for AI agents, CLI, and browser scripts. No API required. Open source by @nichxbt. Don't Panic.","source":"GITHUB_MCP","sourceId":"github-mcp:759567420","homepage":"https://xactions.app","repository":"https://github.com/nirholas/XActions","documentation":"https://xpersona.co/mcp/mcp-nirholas-xactions/agent/mcp-nirholas-xactions","protocols":["MCP"],"capabilities":["xactions","twitter","x","twitter-automation","twitter-bot","twitter-scraper","twitter-unfollow","twitter-growth","mass-unfollow","unfollow-tool","twitter-tools","social-media-automation","twitter-api-alternative","puppeteer","twitter-manager","follower-management","twitter-cleanup","auto-follow","auto-like","twitter-analytics","mcp","model-context-protocol","ai-agent","claude","gpt","chatgpt","saas","hypefury-alternative","tweethunter-alternative","free-twitter-api","twitter-without-api","bulk-unfollow","who-unfollowed-me","twitter-followers-tracker","download-twitter-video","twitter-thread-saver","twitter-bookmark-export","vibe-coding","no-code-twitter","thought-leader","algorithm-training","x-algorithm","cli"],"languages":["typescript"],"install":{"command":"git clone https://github.com/nirholas/XActions.git","ecosystem":"git"},"examples":[{"kind":"example","language":"js","snippet":"// Unfollow everyone on X (Formerly Twitter) and or unfollow who doesn't follow you back, by nich (https://x.com/nichxbt)\n// https://github.com/nirholas/xactions\n// 1. Go to https://x.com/YOUR_USER_NAME/following\n// 2. Open the Developer Console. (COMMAND+ALT+I on Mac)\n// 3. Paste this into the Developer Console and run it\n//\n// Last Updated January 2026\n(() => {\n  const $followButtons = '[data-testid$=\"-unfollow\"]';\n  const $confirmButton = '[data-testid=\"confirmationSheetConfirm\"]';\n\n  const retry = {\n    count: 0,\n    limit: 3,\n  };\n\n  const scrollToTheBottom = () => window.scrollTo(0, document.body.scrollHeight);\n  const retryLimitReached = () => retry.count === retry.limit;\n  const addNewRetry = () => retry.count++;\n\n  const sleep = ({ seconds }) =>\n    new Promise((proceed) => {\n      console.log(`WAITING FOR ${seconds} SECONDS...`);\n      setTimeout(proceed, seconds * 1000);\n    });\n\n  const unfollowAll = async (followButtons) => {\n    console.log(`UNFOLLOWING ${followButtons.length} USERS...`);\n    await Promise.all(\n      followButtons.map(async (followButton) => {\n        followButton && followButton.click();\n        await sleep({ seconds: 1 });\n        const confirmButton = document.querySelector($confirmButton);\n        confirmButton && confirmButton.click();\n      })\n    );\n  };\n\n  const nextBatch = async () => {\n    scrollToTheBottom();\n    await sleep({ seconds: 1 });\n\n    let followButtons = Array.from(document.querySelectorAll($followButtons));\n    followButtons = followButtons.filter(b => b.parentElement?.parentElement?.querySelector('[data-testid=\"userFollowIndicator\"]') === null)\n    const followButtonsWereFound = followButtons.length > 0;\n\n    if (followButtonsWereFound) {\n      await unfollowAll(followButtons);\n      await sleep({ seconds: 2 });\n      return nextBatch();\n    } else {\n      addNewRetry();\n    }\n\n    if (retryLimitReached()) {\n      console.log(`NO ACCOUNTS FOUND, SO I THINK WE'RE DONE`);\n      console.log(`RELOAD PAGE AND RE-RUN"},{"kind":"example","language":"js","snippet":"// Unfollow everyone on X (Formerly Twitter) and or unfollow who doesn't follow you back, by nich (https://x.com/nichxbt)\n// https://github.com/nirholas/xactions\n//\n// 1. Go to https://x.com/YOUR_USER_NAME/following\n// 2. Open the Developer Console. (COMMAND+ALT+I on Mac)\n// 3. Paste this into the Developer Console and run it\n//\n// Last Updated: January 2026\n(() => {\n  const $followButtons = '[data-testid$=\"-unfollow\"]';\n  const $confirmButton = '[data-testid=\"confirmationSheetConfirm\"]';\n\n  const retry = {\n    count: 0,\n    limit: 3,\n  };\n\n  const scrollToTheBottom = () => window.scrollTo(0, document.body.scrollHeight);\n  const retryLimitReached = () => retry.count === retry.limit;\n  const addNewRetry = () => retry.count++;\n\n  const sleep = ({ seconds }) =>\n    new Promise((proceed) => {\n      console.log(`WAITING FOR ${seconds} SECONDS...`);\n      setTimeout(proceed, seconds * 1000);\n    });\n\n  const unfollowAll = async (followButtons) => {\n    console.log(`UNFOLLOWING ${followButtons.length} USERS...`);\n    await Promise.all(\n      followButtons.map(async (followButton) => {\n        followButton && followButton.click();\n        await sleep({ seconds: 1 });\n        const confirmButton = document.querySelector($confirmButton);\n        confirmButton && confirmButton.click();\n      })\n    );\n  };\n\n  const nextBatch = async () => {\n    scrollToTheBottom();\n    await sleep({ seconds: 1 });\n\n    const followButtons = Array.from(document.querySelectorAll($followButtons));\n    const followButtonsWereFound = followButtons.length > 0;\n\n    if (followButtonsWereFound) {\n      await unfollowAll(followButtons);\n      await sleep({ seconds: 2 });\n      return nextBatch();\n    } else {\n      addNewRetry();\n    }\n\n    if (retryLimitReached()) {\n      console.log(`NO ACCOUNTS FOUND, SO I THINK WE'RE DONE`);\n      console.log(`RELOAD PAGE AND RE-RUN SCRIPT IF ANY WERE MISSED`);\n    } else {\n      await sleep({ seconds: 2 });\n      return nextBatch();\n    }\n  };\n\n  nextBatch();\n})()"}]}}