Skip to main content
Glama
AdvisorPPC X Organic

AdvisorPPC X Organic

AdvisorPPC X Organic

Policy-safe organic X (Twitter) for MCP clients — Claude Code, Cursor, Grok, VS Code, or any Streamable HTTP host.

This is the posting / community-management connector. Ads live in atmosphere-ai/advisorppc-x-ads. Official XMCP at https://api.x.com/mcp is a 140–200 endpoint dump that bills per call; this package is a curated operator set (composites, confirm flags, skills).

Website · Tasks · Reverse-engineering · MCP v2 notes · Scheduler

What you get

Layer

Detail

Protocol

MCP 2026-07-28 (SDK v2 @modelcontextprotocol/server)

Transports

stdio (local) and Streamable HTTP POST /mcp

UI

MCP Apps dashboard + scheduler (ui://advisorppc/x-organic/dashboard, …/scheduler)

API

https://api.x.com/2 with OAuth2 user-context Bearer

Safety

Never invent copy; confirm=true on live-fire; media failure stops; no bulk DMs

Scheduler

AdvisorPPC queue (X has none). HTTP auto-starts the worker. Import @advisorppc/x-organic/schedule in the backend.

Related MCP server: x-mcp

Tools (40)

Read: x_organic_get_me · x_organic_lookup_user · x_organic_lookup_users · x_organic_search_users · x_organic_get_post · x_organic_lookup_posts · x_organic_user_posts · x_organic_my_timeline · x_organic_mentions · x_organic_search_recent · x_organic_list_replies · x_organic_get_quote_tweets · x_organic_liked_posts · x_organic_list_bookmarks

Write posts: x_organic_create_post · x_organic_reply · x_organic_quote · x_organic_repost · x_organic_unrepost · x_organic_delete_post · x_organic_create_thread · x_organic_hide_reply

Share: x_organic_like · x_organic_unlike · x_organic_bookmark · x_organic_unbookmark

Media: x_organic_upload_media (images + chunked tweet_video / dm_video, never amplify_video) · x_organic_reply_with_media

Inbox: x_organic_list_dm_events · x_organic_list_dm_conversation · x_organic_send_dm · x_organic_inbox_summary

Scheduler / agents: x_organic_scheduler_setup · x_organic_scheduler_status · x_organic_scheduler_settings · x_organic_schedule_list · x_organic_schedule_create · x_organic_schedule_cancel · x_organic_agents_list · x_organic_agent_set

Install

git clone https://github.com/atmosphere-ai/advisorppc-x-organic
cd advisorppc-x-organic
npm install
cp .env.example .env   # set X_ACCESS_TOKEN
npm run build

Token: an X developer app with user-context OAuth 2.0 PKCE. Scopes:

tweet.read tweet.write users.read
dm.read dm.write
like.write bookmark.read bookmark.write
tweet.moderate.write media.write
follows.read offline.access

Auth URL https://x.com/i/oauth2/authorize, token URL https://api.x.com/2/oauth2/token. PKCE S256; X rejects client_secret_post. Always include offline.access or the token dies in ~2 hours.

Claude Code / Cursor (stdio)

{
  "mcpServers": {
    "advisorppc-x-organic": {
      "command": "node",
      "args": ["/absolute/path/to/advisorppc-x-organic/dist/index.js"],
      "env": { "X_ACCESS_TOKEN": "…" }
    }
  }
}

Or the plugin path: claude plugin marketplace add atmosphere-ai/advisorppc-x-organic then install advisorppc-x-organic@advisorppc.

Streamable HTTP

npm run start:http
# POST http://127.0.0.1:3333/mcp
# Authorization: Bearer <token>  (overrides env)

Grok web custom connector: server URL of your hosted /mcp, PKCE, scopes as above.

Grok Build CLI

[mcp_servers.advisorppc-x-organic]
command = "node"
args = ["/absolute/path/to/dist/index.js"]

[mcp_servers.advisorppc-x-organic.env]
X_ACCESS_TOKEN = "…"

Safety

Action

Default

To override

Post / reply / quote / thread / repost

refused

confirm=true after the user named the copy

DM send

refused

confirm=true to one named recipient

Delete / hide

refused

confirm=true after the user named the post/reply

Failed media

stop

never attach a substitute

Invented copy, handle, or media

forbidden

user supplies it

Schedule

AdvisorPPC queue

x_organic_scheduler_setup then schedule_create (confirm=true). HTTP worker auto-starts.

Pay-per-use (as of 2026): $0.015 per plain post, **$0.20 if the text contains a link**. Tool descriptions tell the model to warn before posting links.

Self-serve replies: on pay-per-use / Basic / Pro, replies to someone else only succeed if they @mentioned you or quoted you. Threading your own posts is the intended create_thread path. Quote-posting is Enterprise-only on those plans.

Skills (bundled)

Skill

When to use

getting-connected

Auth, tokens, first get_me

x-organic-operator

Playbooks (publish thread, triage mentions, answer inbox)

mcp-building

How this server is built on MCP v2

mcp-apps

Inline dashboard / ui:// resources

Scheduler (built-in)

X cannot natively schedule. Call x_organic_scheduler_setup once — it starts the worker and returns paste-ready configs for Claude, ChatGPT, Cursor, Grok, and the AdvisorPPC backend (import { createScheduler } from "@advisorppc/x-organic/schedule").

Agents: publish_queue (fires due jobs), mention_digest / inbox_digest (snapshots + optional webhook, never auto-reply), health. Details: docs/SCHEDULER.md.

Develop

npm test
npm run typecheck
npm run dev          # stdio
npm run dev:http

What this is not

  • Not Ads, pixels, audiences, or campaigns — that is atmosphere-ai/advisorppc-x-ads.

  • Not a 1:1 clone of X’s official XMCP at https://api.x.com/mcp.

  • Not a native X scheduler. The built-in queue is AdvisorPPC's.

  • Not a Google Ads connector — that is advisorppc-org/advisorppc-plugin → https://mcp.advisorppc.com/claude.

License

MIT for this repository. The AdvisorPPC name and hosted service remain Advisor Media.

Available Tools

40 tools
x_organic_agent_setEnable or configure an agentA

Turn an agent on/off and set every_ms. Live agents (if any) need confirm=true. mention_digest / inbox_digest never send replies or DMs.

Inputs: agent_id (required), confirm, enabled, every_ms.

x_organic_agents_listList scheduler agentsA
Read-only

Built-in agents: publish_queue, mention_digest, inbox_digest, health. Digests never auto-reply; they snapshot and optionally POST webhook_url for Claude/ChatGPT/AdvisorPPC.

Inputs: no named parameters.

x_organic_bookmarkBookmark a postC

POST /2/users/:id/bookmarks. Scope bookmark.write.

Inputs: post_id (required).

x_organic_create_postCreate postA

POST /2/tweets. Use only the copy/media the user supplied — never invent text or handles. Requires confirm=true after an explicit named ask. X API pay-per-use (as of 2026): ~$0.015 per plain post, ~$0.20 per post that contains a link. Warn the user before posting links. X API has no native schedule. Use AdvisorPPC x_organic_schedule_* tools — never invent a publish time outside the job store. Up to 4 photos, 1 GIF, or 1 video via media_ids from x_organic_upload_media.

Inputs: text, confirm, media_ids, reply_settings.

x_organic_create_threadCreate threadA

Composite: publish the first post, then chain the rest as replies (in_reply_to of the previous). Use only the array of copy the user supplied — never invent posts. Requires confirm=true once for the whole thread. If a later post fails, STOP and return what already went up. X API pay-per-use (as of 2026): ~$0.015 per plain post, ~$0.20 per post that contains a link. Warn the user before posting links. X API has no native schedule. Use AdvisorPPC x_organic_schedule_* tools — never invent a publish time outside the job store.

Inputs: posts (required), confirm, reply_settings.

x_organic_delete_postDelete postA
Destructive

DELETE /2/tweets/:id. You can only delete posts you authored. Requires confirm=true after the user named the exact post. Destructive and irreversible.

Inputs: post_id (required), confirm.

x_organic_get_meGet authenticated userA
Read-only

GET /2/users/me — the user on this OAuth2 token. Call first when you need user id for timeline, likes, bookmarks, or mentions. Never invent a handle.

Inputs: no named parameters.

x_organic_get_postGet one postA
Read-only

GET /2/tweets/:id with public metrics, author, media, and referenced posts.

Inputs: post_id (required).

x_organic_get_quote_tweetsQuote tweets of a postC
Read-only

GET /2/tweets/:id/quote_tweets. Quote creation on self-serve is Enterprise-only; reading quotes is not.

Inputs: post_id (required), max_results, pagination_token.

x_organic_hide_replyHide or unhide a replyA

PUT /2/tweets/:id/hidden. Only works for replies on a conversation you own. Requires confirm=true. Scope tweet.moderate.write. hidden=true hides, false unhides.

Inputs: hidden (required), reply_id (required), confirm.

x_organic_inbox_summaryInbox summaryA
Read-only

Composite: fetch recent DM events and group by conversation with the last message. Use this to triage inbox, then x_organic_list_dm_conversation + x_organic_send_dm (confirm) to answer. Do not auto-reply.

Inputs: max_results, max_conversations.

x_organic_likeLike a postA

POST /2/users/:id/likes. Reversible. Scope like.write. Do not mass-like.

Inputs: post_id (required).

x_organic_liked_postsLiked postsB
Read-only

GET /2/users/:id/liked_tweets. Defaults to the authenticated user.

Inputs: user_id, max_results, pagination_token.

x_organic_list_bookmarksList bookmarksB
Read-only

GET /2/users/:id/bookmarks for the authenticated user. Scope bookmark.read.

Inputs: max_results, pagination_token.

x_organic_list_dm_conversationRead a DM conversationA
Read-only

GET /2/dm_conversations/:id/dm_events. Pass a conversation id from inbox_summary or list_dm_events. Scope dm.read.

Inputs: dm_conversation_id (required), max_results, pagination_token.

x_organic_list_dm_eventsList DM eventsB
Read-only

GET /2/dm_events (MessageCreate). One page of inbox events with sender expansion. Scope dm.read. Do not dump DMs into public posts.

Inputs: max_results, dm_event_fields, pagination_token.

x_organic_list_repliesList replies to a postA
Read-only

Recent-search composite: conversation_id:{post_id} is:reply. Use this to triage comments. Billed per matching post. Then reply with x_organic_reply (confirm required; self-serve only if they summoned you).

Inputs: post_id (required), max_results, pagination_token.

x_organic_lookup_postsLookup postsB
Read-only

GET /2/tweets?ids=… up to 100 ids the user named.

Inputs: post_ids (required).

x_organic_lookup_userLookup one userA
Read-only

Look up a user by username (without inventing @handles) or by numeric id. Uses GET /2/users/by/username/:username or GET /2/users/:id.

Inputs: user_id, username.

x_organic_lookup_usersLookup usersA
Read-only

Batch lookup. Pass usernames XOR ids (comma-separated v2). Never invent handles.

Inputs: user_ids, usernames.

x_organic_mentionsMentionsB
Read-only

GET /2/users/:id/mentions for the authenticated user (or a named user_id you manage).

Inputs: user_id, max_results, pagination_token.

x_organic_my_timelineHome timelineA
Read-only

GET /2/users/:id/timelines/reverse_chronological for the authenticated user (home feed). Billed per read.

Inputs: max_results, pagination_token.

x_organic_quoteQuote a postA

POST /2/tweets with quote_tweet_id. Requires confirm=true. Quote-posting is Enterprise-only on self-serve/pay-per-use as of 2026-09 — expect 403 on those plans. Never invent post text, DM copy, handles, or media. Use only what the user supplied. X API pay-per-use (2026): ~$0.015/post, ~$0.20 if the text contains a link. Warn before posting links.

Inputs: quote_tweet_id (required), text, confirm, media_ids.

x_organic_replyReply to a postA

POST /2/tweets as a reply (in_reply_to_tweet_id). Requires confirm=true. Do not invent copy. Do not spam-reply. Self-serve / pay-per-use: replies to someone else only succeed if they @mentioned you or quoted you. Enterprise is unrestricted. Self-replies (your own thread) are the intended thread mechanism. X API pay-per-use (2026): ~$0.015/post, ~$0.20 if the text contains a link. Warn before posting links.

Inputs: in_reply_to_tweet_id (required), text, confirm, media_ids.

x_organic_reply_with_mediaReply with mediaA

Composite: upload media (if given) then reply. If upload fails, STOP — do not post a text-only substitute. Requires confirm=true. Self-serve / pay-per-use: replies to someone else only succeed if they @mentioned you or quoted you. Enterprise is unrestricted. Self-replies (your own thread) are the intended thread mechanism. X API pay-per-use (2026): ~$0.015/post, ~$0.20 if the text contains a link. Warn before posting links.

Inputs: in_reply_to_tweet_id (required), text, media, confirm, +2 more.

x_organic_repostRepostA

POST /2/users/:id/retweets. Requires confirm=true after the user named the post to repost.

Inputs: post_id (required), confirm.

x_organic_schedule_cancelCancel, pause, or resume a jobA
Destructive

Cancel (terminal), pause, or resume a named job id. confirm=true after the user named the job.

Inputs: job_id (required), action, confirm.

x_organic_schedule_createSchedule a jobA

Enqueue a future organic action on AdvisorPPC's queue (X cannot natively schedule). tool must be allowlisted. arguments must be the user-supplied copy/ids — never invent text. confirm=true after they named the time and the copy. Enables publish_queue so the worker will fire it. Kinds: once (run_at ISO), every (every_ms), cron (5-field).

Inputs: kind (required), tool (required), arguments (required), cron, +6 more.

x_organic_schedule_listList scheduled jobsA
Read-only

List AdvisorPPC queue jobs (not X native). Filter by status.

Inputs: status.

x_organic_scheduler_settingsScheduler settingsB

Get or patch timezone, digest webhook_url (Claude/ChatGPT/AdvisorPPC callback), tick_ms, public_url.

Inputs: tick_ms, timezone, public_url, webhook_url.

x_organic_scheduler_setupAuto-setup schedulerA

Self-configure the AdvisorPPC scheduler for Claude, ChatGPT, Cursor, Grok, raw HTTP, or the AdvisorPPC backend. Starts the in-process worker, writes the job store, returns paste-ready MCP snippets. Does not invent posts.

Inputs: vendor, timezone, public_url, webhook_url.

x_organic_scheduler_statusScheduler statusA
Read-only

AdvisorPPC's own job queue (X API has no native schedule). Shows worker, agents, upcoming jobs, last runs. HTTP mode starts the worker by itself.

Inputs: no named parameters.

x_organic_search_recentRecent searchA
Read-only

GET /2/tweets/search/recent (last 7 days). Query must be the user's. Billed per matching post. Do not run unbounded brand-watch loops.

Inputs: query (required), end_time, since_id, until_id, +3 more.

x_organic_search_usersSearch usersB
Read-only

GET /2/users/search. Query must be what the user asked to find — do not invent people to follow.

Inputs: query (required), max_results, pagination_token.

x_organic_send_dmSend a Direct MessageA

Send one DM to a named recipient (participant_id or username) or an existing dm_conversation_id. Requires confirm=true after an explicit named ask. Never invent copy. One recipient — no bulk unsolicited DMs. Optional media_id from x_organic_upload_media with destination=dm. Do not spam-reply and do not send bulk unsolicited DMs. One named conversation at a time.

Inputs: text, confirm, media_id, username, +2 more.

x_organic_unbookmarkRemove bookmarkD

DELETE /2/users/:id/bookmarks/:tweet_id.

Inputs: post_id (required).

x_organic_unlikeUnlike a postB

DELETE /2/users/:id/likes/:tweet_id.

Inputs: post_id (required).

x_organic_unrepostUndo repostB
Destructive

DELETE /2/users/:id/retweets/:tweet_id. Requires confirm=true.

Inputs: post_id (required), confirm.

x_organic_upload_mediaUpload mediaA

Upload an image or video for an organic post (tweet_image / tweet_gif / tweet_video) or a DM (dm_*). Images use simple upload; video and files >5MB use v2 chunked INIT/APPEND/FINALIZE and poll STATUS. Never amplify_video (ads). Provide exactly one of media_url or media. If the intended media failed to upload or process, STOP. Do not substitute a still, a source image, or a pre-existing library asset.

Inputs: media, media_url, destination.

x_organic_user_postsUser post timelineA
Read-only

GET /2/users/:id/tweets. Pass user_id from lookup/me. exclude=replies,retweets optional.

Inputs: exclude, user_id, max_results, pagination_token.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.1/5.0

    Scored across 40 tools

    Disambiguation4/5

    Most tools map to distinct X API resources and actions (create_post, reply, quote, repost, like, bookmark, etc.). A few overlapping utilities exist — list_dm_events vs inbox_summary both fetch recent DM events, and schedule_list vs scheduler_status both surface queue state — but descriptions clarify their intent.

    Naming Consistency4/5

    Uniform x_organic_ prefix with mostly verb_noun structure (create_post, send_dm, lookup_user, schedule_cancel). Some deviations exist — user_posts, mentions, my_timeline, liked_posts — but they are readable and don't break the pattern.

    Tool Count2/5

    40 tools is well beyond the heavy threshold. While the server covers posting, scheduling, DMs, media, and agents, the sheer count makes tool selection cumbersome and suggests scope creep that could have been consolidated (e.g., merging reply variants or DM listing helpers).

    Completeness4/5

    The toolkit covers the full organic X lifecycle: creation, engagement, reading, media upload, scheduling, agent monitoring, and DMs. Notable gaps are follow/unfollow management and follower/analytics endpoints, but the stated organic-purpose surface is largely complete.

    Maintenance

    ActivityNo data
    ResponsivenessSyncing

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Provides programmatic X (Twitter) engagement via MCP, offering 24 tools for search, timelines, notifications, bookmarks, profiles, and tweet actions through a headless browser.
      MIT
    • F
      license
      Not graded
      quality
      C
      maintenance
      Enables MCP-based interaction with the X (Twitter) API v2, supporting reads like timeline, mentions, and search, and writes through a two-step draft-and-confirm process that ensures human-visible previews before any public post.
      -
    • A
      license
      A
      quality
      B
      maintenance
      Enables MCP clients to interact with the X (Twitter) API v2 through 41 typed tools for reading, searching, engaging, publishing, and managing content, with policy-based access control and session credit budgets to prevent overspending.
      41
      54 npm
      1
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI agents to post, schedule, thread, delete, and analyze social media posts across platforms like X, Bluesky, LinkedIn, and Instagram through a single MCP interface.
      107 npm
      MIT