Twitter / X (OAuth)

Live

OAUTH 2.0

SOCIAL

Communication

Twitter / X (OAuth) connects agents to posting, timelines, and engagement with a user-delegated grant, so an agent can act on behalf of the person who authorized it rather than as an app.

  • Per-user credentials: each call uses the actual user's token, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Twitter / X (OAuth)
agent · Acme Q3
Run
What are people saying about our launch?
S
twitteroauth_search_recent_tweets
118ms
Social agent
128 mentions in 24 hours, sentiment mostly positive. Two support complaints worth a reply.
Sources: 128 posts, last 24 hours
twitteroauth
128 mentions
18:29
Message Claude...

Tools your agent reaches for on Twitter / X, scoped per user.

CALL ANY TOOL
Post and reply, read timelines, manage lists and communities, and pull engagement data with a user-delegated OAuth grant rather than app-only access.
twitteroauth_activity_subscription_create
Create activity subscription
Creates a subscription for a single X activity event type, scoped to exactly one of a user (filter_user_id) or a keyword (filter_keyword) - Twitter rejects requests providing neither or both - delivered to a registered webhook. OAuth2 user-context tokens must hold the scope matching the requested event_type: dm.read for chat.* and dm.* events, like.read for like.* events, mute.read for mute.* events, block.read for block.* events, and tweet.read for all other event types. Mute and block subscriptions are actor-only.
Parameters
Name
Type
Required
Description
event_type
string
Required
Activity event type in dot notation
filter_direction
string
Optional
Optional direction filter for directional events. Not supported for mute.* or block.* events.
filter_keyword
string
Optional
Optional keyword filter
filter_user_id
string
Optional
User the subscription is scoped to. For mute.* and block.* events, this must be the authenticated source user.
tag
string
Optional
Optional caller-defined tag
webhook_id
string
Optional
Webhook to deliver the subscription events to
twitteroauth_activity_subscriptions_list
List activity subscriptions
twitteroauth_article_publish
Publish article
twitteroauth_blocked_users_get
Get blocked users
twitteroauth_bookmark_add
Add bookmark
twitteroauth_bookmark_remove
Remove bookmark
twitteroauth_communities_search
Search communities
twitteroauth_dm_block
Dm block
twitteroauth_dm_conversation_send
Send dm conversation
twitteroauth_dm_delete
Delete dm
twitteroauth_dm_event_get
Get dm event
twitteroauth_list_follow
List follow
twitteroauth_list_member_add
Add list member
twitteroauth_list_pin
List pin
twitteroauth_list_unpin
List unpin
twitteroauth_media_analytics_get
Get media analytics
twitteroauth_media_batch_lookup
Media batch lookup
twitteroauth_media_metadata_create
Create media metadata
twitteroauth_media_upload
Upload media
twitteroauth_media_upload_base64
Media upload base64
twitteroauth_post_delete
Delete post
twitteroauth_post_quotes_get
Get post quotes
twitteroauth_post_retweet
Post retweet
twitteroauth_recent_tweet_counts
Recent tweet counts
twitteroauth_reply_visibility_set
Set reply visibility
twitteroauth_space_posts_get
Get space posts
twitteroauth_user_bookmarks_by_folder_get
Get user bookmarks by folder
twitteroauth_user_lookup_by_username
User lookup by username
twitteroauth_user_owned_lists_get
Get user owned lists
twitteroauth_user_unfollow
User unfollow

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Twitter / X (OAuth) tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["twitteroauth"], toolNames: [
    "twitteroauth_activity_subscription_create",
    "twitteroauth_activity_subscriptions_list",
    "twitteroauth_article_publish"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Is the Salesforce sync healthy?" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["twitteroauth"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Which data sources are connected?" }],
  tools,
});

// Execute the tool call with the user's vaulted Twitter / X (OAuth) credential
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["twitteroauth"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Pull open Zendesk tickets created this week." }],
  tools,
});

// Tool call runs with the user's vaulted Twitter / X (OAuth) credential
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["twitteroauth"] }, pageSize: 100,
});

const agent = new Agent({
  name: "twitteroauth_agent",
  model: "gemini-2.5-pro",
  instruction: "Work with Twitter / X (OAuth) for the signed-in user.",
  tools,
});

await agent.run("What auth does the Shopify connector need?");
Try these prompts
Paste any prompt into your agent to get started.
Listening
Copy the prompt
Copied
What are people saying about our launch?
Copy the prompt
Copied
Find recent posts mentioning our competitor.
Copy the prompt
Copied
Show me the replies to this post.
Publishing
Copy the prompt
Copied
Draft and post an announcement thread.
Copy the prompt
Copied
Reply to this mention in our voice.
Copy the prompt
Copied
Schedule this post for tomorrow morning.
Audience
Copy the prompt
Copied
Who engaged most with our posts this week?
Copy the prompt
Copied
List the members of this community.
Copy the prompt
Copied
Add these accounts to my monitoring list.
SEE HOW AUTH WORKS
Your users authorize Twitter / X once. Their grant stays vaulted, every call is scope checked, and every post is logged.
1
Authorize
Your user connects
Twitter / X (OAuth)
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Twitter / X (OAuth)
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Twitter / X (OAuth)
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Twitter / X (OAuth)
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other connectors.
GTM and RevOps Teams
Competitive intelligence briefing agent
Scans Gong calls for competitor mentions, matches each one to its Notion battlecard, and DMs every affected rep a single Slack digest per cycle. Every call runs as the PMM who owns the briefing, never a shared bot.
GTM and RevOps Teams
Outbound prospecting agent
Searches Apollo for prospects matching your ICP, scores and ranks them, drafts personalized outreach in Gmail, and logs every send to Google Sheets. Mail goes out as the rep, not from a shared inbox.
Engineering Teams
Slack triage
Polls Slack for new messages, classifies bugs and support requests with a LangGraph router, files GitHub issues or Zendesk tickets, and confirms in the thread.
GTM and RevOps Teams
CRM AI agent
Reads the Granola transcript after every call, extracts next steps and updates the HubSpot record, drafts the follow-up in Gmail, and confirms in Slack, all on the rep's own delegated OAuth.
Test other agents
See the same per-user auth pattern across other connectors.
GTM
Competitive intelligence briefing agent
Scan Gong calls for competitor mentions, match each one to its Notion battlecard, and DM every affected rep a single Slack digest.
SALES
Outbound prospecting agent
Search Apollo for ICP matches, rank them, draft personalised Gmail outreach, and log every send to Google Sheets.
ENGINEERING
Slack triage agent
Classify new Slack messages as bugs or support requests, file the GitHub issue or Zendesk ticket, and reply in the thread.
GTM
CRM AI agent
Turn each Granola call transcript into a HubSpot record update, a drafted Gmail follow-up, and a Slack recap.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Twitter / X (OAuth) token looks fine in a demo. In production every action looks like one service account, and you cannot tell who wired a source or ran a query. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared token
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Twitter / X (OAuth) today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
How is this different from the bearer token connector?
OAuth is user-delegated, so the agent acts as the person who authorized it and reaches 92 tools including posting and engagement. Bearer token is app-only and reaches 44 read-oriented tools. Write actions need this one.
Do posts appear from the user's account?
Yes. The credential resolved at request time belongs to the authorizing user, so posts and replies carry their handle, not a shared bot.
Can I allow reading but block posting?
Yes. Scope the connection to the search and get tools; post, reply, and delete stay unavailable and the check runs before the API call.
How many tools are available?
92 across posts, timelines, users, lists, communities, and engagement. The page shows a representative 30.
How are grants isolated across customers?
Per tenant and per user in an encrypted vault, resolved at request time and never in LLM context.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""twitteroauth"": {
""url"": ""https://mcp.scalekit.com/twitteroauth"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.twitteroauth]
url = ""https://mcp.scalekit.com/twitteroauth""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""twitteroauth"": {
""url"": ""https://mcp.scalekit.com/twitteroauth"",
""type"": ""http""
}
}
}