원클릭으로
clawbird
X/Twitter integration — post, reply, search, like, unlike, delete, follow, DMs, mentions, and media via the official X API v2
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
X/Twitter integration — post, reply, search, like, unlike, delete, follow, DMs, mentions, and media via the official X API v2
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | clawbird |
| description | X/Twitter integration — post, reply, search, like, unlike, delete, follow, DMs, mentions, and media via the official X API v2 |
| homepage | https://github.com/xonder/clawbird |
| metadata | {"openclaw":{"emoji":"🐦","requires":{"plugins":["clawbird"],"env":["X_API_KEY","X_API_SECRET","X_ACCESS_TOKEN","X_ACCESS_SECRET"]},"primaryEnv":"X_API_KEY","install":[{"id":"npm","kind":"node","package":"@xonder/clawbird","label":"Install clawbird plugin (npm)"}]}} |
You have access to 15 tools for interacting with X (Twitter) via the official X API v2. All tools return JSON with results, estimated API cost, and rate limit information.
This plugin authenticates to the X API using OAuth 1.0a User Context for write operations (posting, liking, following, DMs) and optionally a Bearer Token for read-only operations (search, user lookup).
Where credentials come from: You must generate them at the X Developer Portal:
How credentials are stored: Credentials are configured in OpenClaw's plugin config at plugins.entries.clawbird.config in ~/.openclaw/openclaw.json. They are never written to disk by the plugin itself. Fallback: environment variables X_API_KEY, X_API_SECRET, X_ACCESS_TOKEN, X_ACCESS_SECRET, X_BEARER_TOKEN.
No credentials are hardcoded or bundled. The plugin will return a clear error if credentials are missing.
All network requests go exclusively to the official X API v2. No other hosts are contacted (except user-provided image URLs when using mediaUrl).
| Endpoint | Method | Tool(s) | Data Sent |
|---|---|---|---|
https://api.x.com/2/tweets | POST | x_post_tweet, x_post_thread, x_reply_tweet | Tweet text, reply/media metadata |
https://api.x.com/2/tweets/:id | GET | x_get_tweet | Tweet ID |
https://api.x.com/2/tweets/:id | DELETE | x_delete_tweet | Tweet ID |
https://api.x.com/2/tweets/search/recent | GET | x_search_tweets | Search query string |
https://api.x.com/2/media/upload | POST | x_post_tweet, x_reply_tweet (with mediaUrl) | Base64-encoded image data |
https://api.x.com/2/users/me | GET | x_like_tweet, x_unlike_tweet, x_get_mentions, x_follow_user | (auth headers only) |
https://api.x.com/2/users/by/username/:username | GET | x_get_user_profile, x_send_dm, x_follow_user | Username |
https://api.x.com/2/users/:id/likes | POST | x_like_tweet | Tweet ID |
https://api.x.com/2/users/:id/likes/:tweet_id | DELETE | x_unlike_tweet | Tweet ID |
https://api.x.com/2/users/:id/mentions | GET | x_get_mentions | User ID, pagination params |
https://api.x.com/2/users/:id/following | POST | x_follow_user | Target user ID |
https://api.x.com/2/dm_conversations/with/:id/messages | POST | x_send_dm | Message text, recipient ID |
https://api.x.com/2/dm_conversations/with/:id/dm_events | GET | x_get_dms (filtered) | Participant ID |
https://api.x.com/2/dm_events | GET | x_get_dms (all) | Pagination params |
api.x.com (official X API) plus any user-provided image URLs when mediaUrl is used. No other domains are contacted.clawbird-interactions.jsonl) is the only file written. Images from local file paths are read when mediaUrl points to a local file.Clawbird is open-source (MIT) at https://github.com/xonder/clawbird. All source code is auditable. The plugin:
api.x.com (plus user-provided image URLs)@xdevplatform/xdk SDK and @sinclair/typeboxnpm testThe following tools modify remote state on your X account:
| Tool | Action | Reversible? |
|---|---|---|
| x_post_tweet | Posts a tweet (optionally with image) | Use x_delete_tweet |
| x_post_thread | Posts multiple tweets | Use x_delete_tweet per tweet |
| x_reply_tweet | Posts a reply (optionally with image) | Use x_delete_tweet |
| x_like_tweet | Likes a tweet | Use x_unlike_tweet |
| x_unlike_tweet | Removes a like | Re-like with x_like_tweet |
| x_delete_tweet | Deletes a tweet | Cannot undo |
| x_follow_user | Follows a user | Unfollow manually |
| x_send_dm | Sends a direct message | Cannot unsend |
All write actions are logged to clawbird-interactions.jsonl and can be reviewed via x_get_interaction_log.
Recommendation: If running autonomously, consider requiring explicit user confirmation before write actions by configuring agent-level tool policies. Read-only tools (x_get_tweet, x_search_tweets, x_get_user_profile, x_get_mentions, x_get_dms, x_get_cost_summary, x_get_interaction_log) are safe for autonomous use.
rateLimit field on every response: { remaining, limit, resetsAt }{ rateLimited: true, retryAfterSeconds, resetsAt }rateLimited: true, wait the indicated seconds before retryingx_post_tweet — Post a tweet, optionally with an image.
text (required): Tweet content (max 280 chars)mediaUrl (optional): Image URL or local file path to attach (supports jpg, png, webp, bmp, tiff){ id, text, url, mediaIds?, estimatedCost }x_post_thread — Post a multi-tweet thread.
tweets (required): Array of tweet texts (posted in order, each as a reply to the previous){ threadId, tweetCount, tweets: [{ id, text, url }], estimatedCost }x_reply_tweet — Reply to an existing tweet, optionally with an image.
tweetId (required): Tweet ID or full URL (e.g. https://x.com/user/status/123456)text (required): Reply content (max 280 chars)mediaUrl (optional): Image URL or local file path to attach{ id, text, url, inReplyTo, mediaIds?, estimatedCost }x_delete_tweet — Delete a tweet you posted.
tweetId (required): Tweet ID or full URL{ deleted, tweetId, estimatedCost }x_like_tweet — Like a tweet.
tweetId (required): Tweet ID or full URL{ liked, tweetId, estimatedCost }x_unlike_tweet — Unlike a previously liked tweet.
tweetId (required): Tweet ID or full URL{ unliked, tweetId, estimatedCost }x_follow_user — Follow a user.
username (required): Username to follow (with or without @){ following, user: { id, username }, estimatedCost }x_get_tweet — Get a single tweet by ID or URL.
tweetId (required): Tweet ID or full URL (e.g. https://x.com/user/status/123456){ id, text, authorId, createdAt, metrics, conversationId, lang, url, author, rateLimit, estimatedCost }x_search_tweets — Search recent tweets (last 7 days).
query (required): Search query — supports X operators like from:user, #hashtag, "exact phrase", -exclude, lang:enmaxResults (optional): 10–100, default 10{ query, resultCount, tweets: [...], rateLimit, estimatedCost }x_get_user_profile — Get a user's profile.
username (required): Username with or without @{ id, name, username, description, followersCount, followingCount, tweetCount, verified, profileImageUrl, url, createdAt, location, profileUrl, rateLimit, estimatedCost }x_get_mentions — Get recent mentions of the authenticated account.
maxResults (optional): 5–100, default 10{ resultCount, mentions: [...], rateLimit, estimatedCost }x_send_dm — Send a direct message to a user.
username (required): Recipient's username (with or without @)text (required): Message content{ sent, eventId, conversationId, recipient: { id, username }, estimatedCost }x_get_dms — Get recent direct messages.
username (optional): Filter DMs to a specific user's conversationmaxResults (optional): 1–100, default 10{ resultCount, messages: [...], rateLimit, estimatedCost }x_get_interaction_log — Get log of all write actions performed this session.
limit (optional): Max number of recent entries to return (default: all){ totalEntries, returned, logFile, entries: [{ timestamp, action, summary, details }] }Use this to review what has already been done and avoid duplicating actions.
x_get_cost_summary — Get cumulative API cost for this session.
{ totalCost, breakdown: { [action]: { calls, totalCost } } }mediaUrl with a URL or local file path to attach an imagefrom:username to search a specific user's tweets#hashtag for hashtag search"exact phrase" for exact matches#AI from:openai -is:retweet lang:en-is:retweet to filter out retweetsEvery tool response includes an estimatedCost field. Approximate costs:
Use x_get_cost_summary to check cumulative session spend before expensive operations.
All tools return errors as { error: "message", details?: ... }. Common issues:
{ rateLimited: true, retryAfterSeconds, resetsAt }, wait before retrying