xactions
npm
v3.5.0
Published by nirholas — no publish provenance, so origin is unverified, but the source is public: the repository link below is self-declared yet readable, so you can inspect the code before adopting it.
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.
The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.
1. Threat score — 100 − 6.3 = 94. What the published surface and source actually contain:
| Points | What was found | Category |
|---|---|---|
| −6.3 | Untrusted input concatenated into a command sink MTC-SRC-009 | injection |
2. Client adoption risk — 94 − 11 = 83. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:
| Points | Adoption-risk factor |
|---|---|
| −10 | capability blast radius (critical) — client exposure if the model is manipulated |
| −1 | publisher verification (public source) — no provenance, but the source is public and inspectable |
Capability observations and info notes are shown under Findings but never scored.
Open any row's finding below for the file, line and evidence behind a deduction.
In the server's implementation (`src/scrapers/adapters/got-jsdom.js:206`): Evaluating strings as code is the most direct RCE primitive; if any tool input reaches it, the server executes attacker-chosen code. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const wrappedFn = new Function('window', 'document', 'navigator', ...args.map((_, i) => `__arg${i}`), `con
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/scrapers/adapters/got-jsdom.js
In the server's implementation (`src/plugins/manager.js:11`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: port { execSync } from 'child_process'; import { readPluginsConfig, writePluginsConfig, loadPlugin, loadAllPlugi
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/plugins/manager.js
In the server's implementation (`src/scheduler/scheduler.js:13`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: execFile, spawn } from 'child_process'; import fs from 'fs'; import fsp from 'fs/promises'; import path from 'path'; imp
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/scheduler/scheduler.js
Untrusted-input tools ([x_get_followers, x_get_following, x_get_tweets, x_download_video, x_get_explore, x_get_notifications, x_scrape_space, x_get_thread, x_rss_add, x_rss_check, x_rss_drafts, x_get_replies, x_get_hashtag, x_get_media, x_get_mentions, x_get_likes]) co-exist with external-action tools ([x_post_tweet, x_like, x_retweet, x_download_video, x_post_thread, x_create_poll, x_schedule_post, x_delete_tweet, x_reply, x_bookmark, x_monitor_reputation, x_stream_start, x_get_thread, x_best_time_to_post, x_generate_tweet, x_rewrite_tweet, x_history_get, x_optimize_tweet, x_suggest_hashtags, x_predict_performance, x_generate_variations, x_get_replies, x_get_likers, x_get_retweeters, x_get_quote_tweets, x_quote_tweet, x_detect_bots, x_track_engagement]). A prompt injection could cause unwanted external actions, though no direct sensitive-data leak path was found.
Evidence: untrusted [x_get_followers, x_get_following, x_get_tweets, x_download_video, x_get_explore, x_get_notifications, x_scrape_space, x_get_thread, x_rss_add, x_rss_
Fix: Require confirmation for state-changing/egress actions triggered after processing untrusted content.
Location: flow x_get_followers → x_post_tweet
In the server's implementation (`src/analytics/sentiment.js:248`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const response = await fetch('https://openrouter.ai/api/v1/chat/completions', { method: 'POST', headers: {
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/analytics/sentiment.js
In the server's implementation (`src/automation/controlPanel.js:767`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const res = await fetch('https://openrouter.ai/api/v1/chat/completions', { method: 'POST', hea
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/automation/controlPanel.js
In the server's implementation (`src/mcp/server.js:2786`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const response = await fetch('https://openrouter.ai/api/v1/chat/completions', { method: 'POST', headers
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/mcp/server.js
In the server's implementation (`src/notifications/notifier.js:203`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const response = await fetch(`https://api.telegram.org/bot${botToken}/sendMessage`, { method: 'POST', heade
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/notifications/notifier.js
In the server's implementation (`src/scrapers/twitter/http/guest.js:206`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const res = await this.#fetch( 'https://api.x.com/1.1/guest/activate.json', { method: 'POST',
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/scrapers/twitter/http/guest.js
In the server's implementation (`src/scraping/proxyManager.js:159`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: 10000); await fetch('https://httpbin.org/ip', { signal: controller.signal, // Note: fe
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/scraping/proxyManager.js
In the server's implementation (`src/shadowbanChecker.js:145`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: t typeaheadResp = await fetch( `https://x.com/i/api/1.1/search/typeahead.json?q=${username}&src=search_box&resul
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/shadowbanChecker.js
In the server's implementation (`src/workflows/actions.js:623`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const response = await fetch('https://openrouter.ai/api/v1/chat/completions', { method: 'POST', headers: {
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/workflows/actions.js
In the server's implementation (`src/plugins/manager.js:66`): A shell/process command assembled from concatenated or interpolated values is command injection when any part is attacker-influenced — the OWASP canonical RCE flow. Verify what reaches the interpolated value. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ocal) { try { execSync(`npm install ${name}`, { stdio: 'pipe', cwd: process.cwd() }); } catch (error) {
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/plugins/manager.js
Tool "x_like" takes a URL/host parameter "url" with no allowlist/pattern. An outbound-request tool with an unbounded destination enables SSRF and cloud-metadata access (e.g. 169.254.169.254).
Fix: Allowlist destinations or constrain the parameter; block private/link-local addresses server-side.
Location: tool x_like · inputSchema.properties.url
Tool "x_retweet" takes a URL/host parameter "url" with no allowlist/pattern. An outbound-request tool with an unbounded destination enables SSRF and cloud-metadata access (e.g. 169.254.169.254).
Fix: Allowlist destinations or constrain the parameter; block private/link-local addresses server-side.
Location: tool x_retweet · inputSchema.properties.url
Tool "x_delete_tweet" takes a URL/host parameter "url" with no allowlist/pattern. An outbound-request tool with an unbounded destination enables SSRF and cloud-metadata access (e.g. 169.254.169.254).
Fix: Allowlist destinations or constrain the parameter; block private/link-local addresses server-side.
Location: tool x_delete_tweet · inputSchema.properties.url
Tool "x_reply" takes a URL/host parameter "url" with no allowlist/pattern. An outbound-request tool with an unbounded destination enables SSRF and cloud-metadata access (e.g. 169.254.169.254).
Fix: Allowlist destinations or constrain the parameter; block private/link-local addresses server-side.
Location: tool x_reply · inputSchema.properties.url
Tool "x_bookmark" takes a URL/host parameter "url" with no allowlist/pattern. An outbound-request tool with an unbounded destination enables SSRF and cloud-metadata access (e.g. 169.254.169.254).
Fix: Allowlist destinations or constrain the parameter; block private/link-local addresses server-side.
Location: tool x_bookmark · inputSchema.properties.url
Tool "x_scrape_space" takes a URL/host parameter "url" with no allowlist/pattern. An outbound-request tool with an unbounded destination enables SSRF and cloud-metadata access (e.g. 169.254.169.254).
Fix: Allowlist destinations or constrain the parameter; block private/link-local addresses server-side.
Location: tool x_scrape_space · inputSchema.properties.url
Tool "x_get_thread" takes a URL/host parameter "url" with no allowlist/pattern. An outbound-request tool with an unbounded destination enables SSRF and cloud-metadata access (e.g. 169.254.169.254).
Fix: Allowlist destinations or constrain the parameter; block private/link-local addresses server-side.
Location: tool x_get_thread · inputSchema.properties.url
Tool "x_rss_add" takes a URL/host parameter "url" with no allowlist/pattern. An outbound-request tool with an unbounded destination enables SSRF and cloud-metadata access (e.g. 169.254.169.254).
Fix: Allowlist destinations or constrain the parameter; block private/link-local addresses server-side.
Location: tool x_rss_add · inputSchema.properties.url
In the server's implementation (`src/plugins/loader.js:120`): Loading a module chosen at runtime (from a variable) can pull in and run attacker-influenced code paths. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: ath)}`; mod = await import(resolved); } else { // Load as npm package — use createRequire to resolve from cwd
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server src/plugins/loader.js
Each tool and what it can reach — statically extracted from the published source.
x_download_videoingests untrusted inputnetwork egressx_get_repliesingests untrusted inputnetwork egressx_get_threadingests untrusted inputnetwork egressx_best_time_to_postnetwork egressx_bookmarknetwork egressx_create_pollnetwork egressx_delete_tweetnetwork egressx_detect_botsnetwork egressx_generate_tweetnetwork egressx_generate_variationsnetwork egressx_get_exploreingests untrusted inputx_get_followersingests untrusted inputx_get_followingingests untrusted inputx_get_hashtagingests untrusted inputx_get_likersnetwork egressx_get_likesingests untrusted inputx_get_mediaingests untrusted inputx_get_mentionsingests untrusted inputx_get_notificationsingests untrusted inputx_get_quote_tweetsnetwork egressx_get_retweetersnetwork egressx_get_tweetsingests untrusted inputx_history_getnetwork egressx_likenetwork egressx_monitor_reputationnetwork egressx_optimize_tweetnetwork egressx_post_threadnetwork egressx_post_tweetnetwork egressx_predict_performancenetwork egressx_quote_tweetnetwork egressx_replynetwork egressx_retweetnetwork egressx_rewrite_tweetnetwork egressx_rss_addingests untrusted inputx_rss_checkingests untrusted inputx_rss_draftsingests untrusted inputx_schedule_postnetwork egressx_scrape_spaceingests untrusted inputx_stream_startnetwork egressx_suggest_hashtagsnetwork egressx_track_engagementnetwork egressx_account_reportno sensitive capabilityx_analyze_sentimentno sensitive capabilityx_analyze_voiceno sensitive capabilityx_audience_insightsno sensitive capabilityx_audience_overlapno sensitive capabilityx_auto_commentno sensitive capabilityx_auto_followno sensitive capabilityx_auto_likeno sensitive capabilityx_auto_retweetno sensitive capabilityx_brand_monitorno sensitive capabilityx_bulk_executeno sensitive capabilityx_check_premiumno sensitive capabilityx_clear_bookmarksno sensitive capabilityx_compare_accountsno sensitive capabilityx_competitor_analysisno sensitive capabilityx_convert_formatno sensitive capabilityx_creator_analyticsno sensitive capabilityx_crm_searchno sensitive capabilityx_crm_segmentno sensitive capabilityx_crm_syncno sensitive capabilityx_crm_tagno sensitive capabilityx_crypto_analyzeno sensitive capabilityx_dataset_getno sensitive capabilityx_dataset_listno sensitive capabilityx_detect_unfollowersno sensitive capabilityx_diff_exportsno sensitive capabilityx_engagement_reportno sensitive capabilityx_evergreen_analyzeno sensitive capabilityx_export_accountno sensitive capabilityx_export_dmsno sensitive capabilityx_find_influencersno sensitive capabilityx_followno sensitive capabilityx_follow_engagersno sensitive capabilityx_follower_alertsno sensitive capabilityx_get_analyticsno sensitive capabilityx_get_blockedno sensitive capabilityx_get_bookmarksno sensitive capabilityx_get_conversationsno sensitive capabilityx_get_list_membersno sensitive capabilityx_get_listsno sensitive capabilityx_get_non_followersno sensitive capabilityx_get_post_analyticsno sensitive capabilityx_get_profileno sensitive capabilityx_get_recommendationsno sensitive capabilityx_get_settingsno sensitive capabilityx_get_spacesno sensitive capabilityx_get_trendsno sensitive capabilityx_graph_analyzeno sensitive capabilityx_graph_buildno sensitive capabilityx_graph_listno sensitive capabilityx_graph_recommendationsno sensitive capabilityx_grok_analyze_imageno sensitive capabilityx_grok_queryno sensitive capabilityx_grok_summarizeno sensitive capabilityx_growth_rateno sensitive capabilityx_history_snapshotno sensitive capabilityx_import_datano sensitive capabilityx_list_platformsno sensitive capabilityx_loginno sensitive capabilityx_migrate_accountno sensitive capabilityx_monitor_accountno sensitive capabilityx_monitor_keywordno sensitive capabilityx_mute_userno sensitive capabilityx_notify_sendno sensitive capabilityx_notify_testno sensitive capabilityx_persona_createno sensitive capabilityx_persona_deleteno sensitive capabilityx_persona_editno sensitive capabilityx_persona_listno sensitive capabilityx_persona_presetsno sensitive capabilityx_persona_runno sensitive capabilityx_persona_statusno sensitive capabilityx_publish_articleno sensitive capabilityx_reputation_reportno sensitive capabilityx_schedule_addno sensitive capabilityx_schedule_listno sensitive capabilityx_schedule_removeno sensitive capabilityx_search_tweetsno sensitive capabilityx_send_dmno sensitive capabilityx_smart_targetno sensitive capabilityx_smart_unfollowno sensitive capabilityx_space_joinno sensitive capabilityx_space_leaveno sensitive capabilityx_space_statusno sensitive capabilityx_space_transcriptno sensitive capabilityx_stream_historyno sensitive capabilityx_stream_listno sensitive capabilityx_stream_pauseno sensitive capabilityx_stream_resumeno sensitive capabilityx_stream_statusno sensitive capabilityx_stream_stopno sensitive capabilityx_summarize_threadno sensitive capabilityx_team_createno sensitive capabilityx_team_membersno sensitive capabilityx_toggle_protectedno sensitive capabilityx_unfollowno sensitive capabilityx_unfollow_allno sensitive capabilityx_unfollow_non_followersno sensitive capabilityx_unmute_userno sensitive capabilityx_update_profileno sensitive capabilityx_workflow_actionsno sensitive capabilityx_workflow_createno sensitive capabilityx_workflow_listno sensitive capabilityx_workflow_runno sensitive capabilityCross-tool combinations that form a data-exfiltration primitive (untrusted input → sensitive source → external sink).
Scan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.
| Version | Score | Findings | Engine | Scanned |
|---|---|---|---|---|
v3.5.0 latest |
B 83/100 | 22 | 1.13.0 | 2026-09-07 |
v3.4.5 |
B 83/100 | 22 | 1.12.1 | 2026-08-03 |
v3.4.4 |
B 83/100 | 22 | 1.12.1 | 2026-08-02 |
Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.
The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.
npx mcptrustchecker scan xactions --online
Independent packages implementing the same tool, scanned with the same engine. Compare all 2 side by side →
Agent IP: MCP server with patents search tools
MCP server for searching the Agent Almanac — the public catalog of 9,000+ Model Context Protocol servers. Find, install, and discover MCP servers from inside Claude Desktop, Cursor, Continue, Zed, or any MCP-aware agent.
Search agents & MCP servers by capability, with daily-observed pricing, liveness and market data.
Verified merchants accepting agentic payments on Lightning/L402/BOLT12/USDT — search, verify, pay.
Airframe MCP Client - Connect agents to Airframe's product intelligence
Amazon product search demand over time, with growth for any keyword. Free key at trendsmcp.ai