AgentX
Skill DezXBT/AgentX
Drive X/Twitter from the CLI (read, post, DM, lists, communities, Grok, scheduling, analytics). Use when an agent needs to read or act on X/Twitter. Every command prints one JSON envelope.From its SKILL.md
npx -y skills add DezXBT/AgentXAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- reads credentialsReads from 4 credential sources: `TWITTER_AUTH_TOKEN` and 3 more.
- runs commandsInstructs the agent to run 3 commands, including `go build -o agentx ./cmd/agentx` and 2 more.
SKILL.md
6.4 KB, ~1.7k tokens by cl100k_base, as published. Nobody here has run it
agentx — X/Twitter agent control surface
agentx is a single Go binary. Every command prints one JSON envelope to stdout, so parse stdout as JSON and check .ok. Build: go build -o agentx ./cmd/agentx.
Envelope (always this shape)
{"ok":true,"schema_version":"1","data":<any>,"pagination":{"nextCursor":"…"},"rateLimit":{…}}
{"ok":false,"schema_version":"1","error":{"code":"…","message":"…"}}
Rules: check .ok first. List data → .data is an array + .pagination.nextCursor. Single object → .data is an object. On error read .error.code (machine) + .error.message (human). Exit code ≠0 on error. Output is compact single-line JSON by default (token-efficient); add --pretty only when a human reads it.
Setup (once)
agentx account add --name NAME --auth-token <auth_token> --ct0 <ct0>
Cookies come from a logged-in browser (auth_token + ct0). Env fallback: TWITTER_AUTH_TOKEN, TWITTER_CT0. Store: $AGENTX_HOME/accounts.json (default ~/.agentx, mode 0600). Multi-account: add several, pick with -a NAME. account login --name N --username U (pass via $TWITTER_PASSWORD) does user/pass→cookies but X blocks login from datacenter IPs — prefer cookies.
Global flags (may precede or follow the subcommand)
-a NAME account · -n N max items · --cursor C page cursor · --pretty human-readable JSON · --account/--count long forms.
IDs: any <id> also accepts a full tweet/list/community URL. Handles: with or without @.
Commands (one line each)
READ
feed [--latest] [-n N] [--cursor C] home timeline
search [--type Top|Latest] <query> search
user <handle> | user --id <id> profile
me own profile
posts <handle> [-n N] a user's tweets
media <handle|id> [-n N] user's photos/videos
tweet <id> single tweet (zero-auth FxTwitter fallback)
thread <id> tweet + replies
article <id> [--markdown] long-form X Article
analytics <id> metrics + engagement rate
likes <handle> | bookmarks | mentions tweet lists
followers <handle> | following <handle> user lists
retweeters <id> | likers <id> who RT'd/liked (likers: author-only by X)
list <id> | list members <id> List tweets / members
community posts <id> [--latest] | community info <id>
notifications [all|mentions|verified] | unread (alias: notif)
trends [woeid] | trends locations trending (Indonesia woeid=23424846)
scheduled | drafts your queued/draft tweets
settings your privacy settings
WRITE (state-changing; reversible ones noted)
post <text> [--media f [--alt txt]] [--thread] tweet (>280 → long-form, Premium)
reply <id> <text> [--media f] | quote <id> <text> [--media f]
poll <text> --option A --option B [--option C|D] [--duration MIN]
vote <id> <choice 1-4>
like/unlike retweet/unretweet bookmark/unbookmark delete <id>
pin/unpin <id> pin tweet to profile
bookmark <id> --folder <id> bookmark into folder
follow/unfollow mute/unmute block/unblock <handle>
edit <id> <text> Premium
draft <text> | draft delete <id>
schedule <unix|+30m|+2h|+1d> <text> | unschedule <id>
profile [--name N] [--bio B] [--location L] [--url U]
avatar <img> | banner <img>
settings [--protected b] [--dms-from all|following] [--discoverable-email b] [--geo b]
topic follow|unfollow <topic_id>
list create <name> [--desc T] [--private] | list delete <id>
list add|remove <listid> <handle|id> | list subscribe|unsubscribe <id>
community join|leave <id> | community create <name> (create is permanent)
bookmarks folder create <name> | delete <id> (Premium)
dm send <handle> <text> [--media f]
GROK (AI)
grok <prompt> text answer (live web search built in)
grok image <prompt> [--out file] generate image(s), download to file(s)
UTILITIES
download <id|url> [--out f] [--all] save tweet media / a direct URL
watch <mentions|search <q>> [--interval 60s] [--once] NDJSON stream of new tweets
account list|remove <n>|default [n]|check [n]
Pagination
List commands return .pagination.nextCursor. Pass it back via --cursor for the next page. -n N caps items in the response (note: the cursor still points past the full fetched page, so for exact paging use the cursor, not a tiny -n).
Error codes (.error.code)
not_authenticated bad/expired cookies · not_found · invalid_input · rate_limited (see .rateLimit) · query_id_error X rotated a GraphQL id → set AGENTX_QID_<Operation>=<id> env or update constants · network_error · api_error x.com rejected (message has detail) · account_error.
Gotchas
- Premium-gated (work only on X Premium accounts; routing is correct, x.com returns a clear error otherwise):
edit, note/long-formpost(>280),bookmarks folderwrites. - Account-eligibility:
community createneeds an eligible account. - likers: X returns the liker list only to the tweet's author; empty for others (retweeters is public).
- grok image: needs image-gen quota (free tier is limited/daily); errors clearly when the quota is spent.
- DM: only classic (unencrypted) DMs via
dm send/list/download. X's new XChat is end-to-end encrypted and out of scope (keys are device-only, non-extractable). - Rate limit:
.rateLimitcarriesx-rate-limit-*; back off whenremainingis low. AGENTX_UTLS=1sends a Chrome JA3 TLS fingerprint (HTTP/2) for stealth.- Writes are real and public — confirm intent before posting/following/etc.
Typical flows
- Read a user's latest:
agentx posts elonmusk -n 20 - Reply:
agentx reply <id> "nice"· Quote with image:agentx quote <id> "look" --media pic.jpg - Thread:
agentx post --thread "long text…"· Poll:agentx poll "Q?" --option A --option B - Schedule:
agentx schedule +2h "later"thenagentx scheduled - Ask Grok:
agentx grok "USD to IDR today?"· Image:agentx grok image "a dragon" --out d.png - Paginate:
agentx feed -n 40→ takenextCursor→agentx feed --cursor <c>
What ships with it: 51 files
1112.3 KB alongside SKILL.md, 1 of them executable
assets/
- logo.png845.8 KB
cmd/
- agentx/main.go54.0 KB
pkg/
- account/account.go2.0 KB
- account/store.go4.2 KB
- account/store_test.go1.8 KB
- agent/agent.go29.3 KB
- backends/fxtwitter/fxtwitter.go3.6 KB
- models/models.go2.8 KB
- transaction/animate.go605 B
- transaction/constants.go1.9 KB
- transaction/cubic.go1.3 KB
- transaction/mathutil.go2.0 KB
- transaction/parse.go2.7 KB
- transaction/provider.go3.5 KB
- transaction/testdata/home.html1.3 KB
- transaction/testdata/ondemand.jsruns67 B
- transaction/transaction.go5.9 KB
- transaction/transaction_test.go2.2 KB
- xclient/article_test.go5.2 KB
- xclient/bookmarkfolders.go2.5 KB
- xclient/client.go14.8 KB
- xclient/community.go4.5 KB
- xclient/constants.go6.9 KB
- xclient/dm.go5.3 KB
- xclient/dm_test.go1.1 KB
- xclient/drafts.go1.8 KB
- xclient/grok.go5.0 KB
- xclient/jsonutil.go1.5 KB
- xclient/lists.go2.5 KB
- xclient/login.go8.9 KB
- xclient/notifications.go4.5 KB
- xclient/parser.go16.3 KB
- xclient/parser_test.go4.1 KB
- xclient/polls.go3.4 KB
- xclient/profile.go901 B
- AGENTS.md2.8 KB
- .gitignore179 B
- go.mod452 B
- go.sum7.2 KB
- LICENSE1.0 KB
11 more files not listed here. See all 51 in the repository.