TwitterAPIs
NPM · @TWITTERAPIS/MCP · SCANNED SEP 21
Official MCP server for twitterapis.com. Read and write Twitter/X: search, users, tweets, DMs.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 31 of 95 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency45
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 2 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability68
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 24921 tokens (~251/item across 99 items; 99 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management50
- Stability observed for 15 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 13 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 100 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
How do I install the TwitterAPIs MCP server?
TwitterAPIs runs locally as an npm package, launched with npx -y @twitterapis/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @twitterapis/mcp
claude mcp add twitterapis-twitterapis-mcp -- npx -y @twitterapis/mcp
{
"mcpServers": {
"twitterapis-twitterapis-mcp": {
"command": "npx",
"args": [
"-y",
"@twitterapis/mcp"
]
}
}
} {
"servers": {
"twitterapis-twitterapis-mcp": {
"command": "npx",
"args": [
"-y",
"@twitterapis/mcp"
]
}
}
} codex mcp add twitterapis-twitterapis-mcp -- npx -y @twitterapis/mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"twitterapis-twitterapis-mcp": {
"type": "local",
"command": [
"npx",
"-y",
"@twitterapis/mcp"
],
"enabled": true
}
}
} openclaw mcp add twitterapis-twitterapis-mcp --command npx --arg -y --arg @twitterapis/mcp
mcp_servers:
twitterapis-twitterapis-mcp:
command: "npx"
args: ["-y", "@twitterapis/mcp"] {
"McpServers": {
"twitterapis-twitterapis-mcp": {
"Transport": "stdio",
"Command": "npx",
"Arguments": [
"-y",
"@twitterapis/mcp"
]
}
}
} assistant mcp add twitterapis-twitterapis-mcp -t stdio -c npx -a -y @twitterapis/mcp
{
"mcpServers": {
"twitterapis-twitterapis-mcp": {
"command": "npx",
"args": [
"-y",
"@twitterapis/mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 21 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.
- 19 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 40 to 43. That category is still filling its 30-day observation window: 12 days of observed history at the previous scan, 13 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 33 to 37. That category is still filling its 30-day observation window: 10 days of observed history at the previous scan, 11 at this one. The score rises as the window fills, whether or not the server changes.
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 27 to 30. That category is still filling its 30-day observation window: 8 days of observed history at the previous scan, 9 at this one. The score rises as the window fills, whether or not the server changes.
- 14 Sept 26 +3
- Stability: unverified → 0.27 ▲ functional
- 7 Sept 26 +15
- Malware scan: unverified → pass ▲ security
- 6 Sept 26 +16
- Malware scan: pass → unverified ▼ security
- Injection markers: unverified → pass ▲ security
- First check of Judged manipulation: pass security
- Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
- Tool coverage: unverified → 100 ▲ functional
- MCP protocol: unverified → pass ▲ functional
- First check of Schema quality: fail functional
- First check of Schema quality: excellent functional
- First check of Schema quality: fail functional
- First check of Destructive annotations: 100 functional
- First check of Tool coverage: 100 functional
- Package version: 0.6.4 → 0.9.8 functional
- 26 Aug 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 21 Sept 2026 · Analysed npm/@twitterapis/mcp@0.9.8
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 95 packages
| Packages resolved | 95 |
|---|---|
| Stale | 31 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
twitter_media_status ~357
Check whether an uploaded media_id has finished processing on X, before you attach it to a tweet. Video, GIF and large uploads are processed ASYNCHRONOUSLY: twitter_media_upload returns a media_id immediately, but attaching it via twitter_create_tweet FAILS until X reports state 'succeeded'. Poll this until then. Returns media_id, state ('pending', 'in_progress', 'succeeded' or 'failed'), check_after_secs (how long X asks you to wait before polling again, honour it rather than tight-looping), progress_percent, and an error object when state is 'failed'. Reads through YOUR OWN registered account session, the same one that performed the upload, so register first with twitter_customer_session or twitter_user_login, or pass auth_token/ct0 for this call. This is a READ: no daily write cap applies.
| Name | Type | Req | Description |
|---|---|---|---|
| auth_token | string | – | Optional. The account's auth_token cookie, to act AS that account for this call (must be paired with ct0). Sent as the x-auth-token header; never placed in the URL. |
| ct0 | string | – | Optional. The account's ct0 cookie, paired with auth_token. Sent as the x-ct0 header. |
| media_id | string | yes | Numeric media id returned by twitter_media_upload, e.g. '1234567890123456789'. |
| proxy_url | string | – | Optional. Residential proxy URL to egress this call through. Recommended for writes: X soft-blocks writes from datacenter IPs as automated. Sent as the x-proxy-url header. |
| user_agent | string | – | Optional. User-Agent string to send for this session. Sent as the x-user-agent header. |
No output schema declared.
No examples provided.
twitter_media_upload ~264
Upload an image to X and get a media_id to attach to a tweet via twitter_create_tweet's media_ids. Provide media_data as base64-encoded image bytes. Acts as your registered account session (register first with twitter_customer_session or twitter_user_login, or pass auth_token/ct0 for this call). Returns ok and the media_id. Only base64 image data is supported over this tool's JSON transport.
| Name | Type | Req | Description |
|---|---|---|---|
| auth_token | string | – | Optional. The account's auth_token cookie, to act AS that account for this call (must be paired with ct0). Sent as the x-auth-token header; never placed in the URL. |
| ct0 | string | – | Optional. The account's ct0 cookie, paired with auth_token. Sent as the x-ct0 header. |
| media_data | string | yes | Base64-encoded image bytes to upload. Sent in the JSON request body. |
| proxy_url | string | – | Optional. Residential proxy URL to egress this call through. Recommended for writes: X soft-blocks writes from datacenter IPs as automated. Sent as the x-proxy-url header. |
| user_agent | string | – | Optional. User-Agent string to send for this session. Sent as the x-user-agent header. |
No output schema declared.
No examples provided.
twitter_monitor_account_health ~98
Account-wide monitoring rollup in ONE call, distinct from twitter_monitor_health (which needs an id and reports one monitor's cursor): service status ('operational' or 'degraded'), active/paused/total counts across every monitor you own, and pending/delivered/failed delivery counts from the last 24 hours. Takes no arguments. A key with zero monitors gets zeroed counts back, never an error. Free per call.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
twitter_monitor_create ~422
Start watching an X account for new posts. Every new post from that handle is HMAC-signed and delivered to your registered webhook(s) on a shared poll interval (see twitter_monitor_webhook_create to register a delivery URL first). Free: monitor creation is account administration, not a metered read. Returns the new monitor's id, plus its normalized handle, status, and poll_interval_ms.
| Name | Type | Req | Description |
|---|---|---|---|
| domain_filter | string | – | Optional. A bare hostname ('example.com') or a full URL ('https://example.com/blog') to restrict delivery to only the new posts that link to that host or a subdomain of it (e.g. 'example.com' matches… |
| handle | string | yes | The X username to watch, without the leading @ (e.g. 'elonmusk'). |
| include_replies | string | – | Optional boolean. true delivers the account's replies as well as its own posts, which is the default and what every monitor has always done; false holds replies back and delivers only the account's o… |
| webhook_ids | string | – | Optional. Comma-separated webhook id(s) from twitter_monitor_webhook_create to restrict this monitor's deliveries to. Omit to deliver to every active webhook on the account (the default). |
No output schema declared.
No examples provided.
twitter_monitor_delete ~75
Stop and remove a monitor by id. Irreversible: create a new monitor with twitter_monitor_create if you want to watch that handle again. Delivery history referencing this monitor is retained, not cascade-deleted. Free per call.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The monitor's id, from twitter_monitor_create or twitter_monitor_list. |
No output schema declared.
No examples provided.
twitter_monitor_deliveries ~110
List your most recent monitor delivery events across every monitor, most recent first: id, monitor_id, tweet_id, status, tweet_created_at, and the real measured latency (detected_lag_ms, from X's own post timestamp to enqueue; delivery_lag_ms, the separate queue-to-webhook-POST time; total_lag_ms). Free per call.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max delivery events to return, 1 to 200. Defaults to 50 when omitted. |
No output schema declared.
No examples provided.
twitter_monitor_health ~72
Read one monitor's current status, degradation flag, poll interval, possibly-missed-event count, and cursor position (last_tweet_id, last_poll_at), for building your own health dashboard. Free per call.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The monitor's id, from twitter_monitor_create or twitter_monitor_list. |
No output schema declared.
No examples provided.
twitter_monitor_list ~59
List every monitor on your account: id, subject (its from:<handle> query), kind, status ('active' or 'paused'), degraded flag, events_possibly_missed, webhook_ids restriction, and created_at. Takes no arguments.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
twitter_monitor_update ~351
Partially update an existing monitor: pause or resume it via status, change which webhooks receive its events via webhook_ids, change or clear its domain_filter, or any combination in the same call (applied atomically). Resuming a paused monitor re-runs the same capacity and per-account cap checks as creating a new one, since it adds load back to the shared pool. Free per call. All three fields are optional; omit any of them to leave that part unchanged.
| Name | Type | Req | Description |
|---|---|---|---|
| domain_filter | string|null | – | Optional. A bare hostname or full URL to restrict delivery to, same shape and normalization as twitter_monitor_create's domain_filter. Pass an empty string (or null) to clear an existing filter back… |
| id | string | yes | The monitor's id, from twitter_monitor_create or twitter_monitor_list. |
| include_replies | string | – | Optional boolean. true delivers the account's replies as well as its own posts, false holds replies back and delivers only its own posts. Omit the field entirely to leave it unchanged. Same boolean-o… |
| status | string | – | 'paused' to pause the monitor, 'active' to resume it. Omit to leave status unchanged. |
| webhook_ids | string | – | Optional. Comma-separated webhook id(s) to restrict delivery to. Pass an empty string to clear the restriction back to 'deliver to every active webhook'. Omit entirely to leave it unchanged. |
No output schema declared.
No examples provided.
twitter_monitor_webhook_create ~120
Register an HTTPS endpoint to receive signed monitor events. The HMAC signing secret is returned ONLY in this response, store it immediately: it cannot be retrieved again, and it is what you use to verify the X-TwitterAPIs-Signature header on every delivery. Free per call.
| Name | Type | Req | Description |
|---|---|---|---|
| url | string | yes | Your https delivery endpoint, e.g. 'https://example.com/webhooks/twitterapis'. Private, loopback, link-local, and metadata IPs are refused, re-checked at every delivery, not just at registration. |
No output schema declared.
No examples provided.
twitter_monitor_webhook_delete ~96
Soft-delete a webhook by id: it stops receiving deliveries immediately and disappears from twitter_monitor_webhook_list, but delivery history referencing it is retained rather than cascade-deleted. Irreversible from the caller's side (register a new webhook with twitter_monitor_webhook_create to resume delivery). Free per call.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The webhook's id, from twitter_monitor_webhook_create or twitter_monitor_webhook_list. |
No output schema declared.
No examples provided.
twitter_monitor_webhook_list ~69
List every webhook registered on your account: id, url, status ('active' delivers, 'disabled' means the endpoint returned a 410 Gone and needs re-registering to reactivate), and created_at. The signing secret is never returned here, only at creation. Takes no arguments.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
twitter_monitor_webhook_redrive ~289
Replay deliveries that dead-lettered while your endpoint was down. A delivery is dead-lettered after it fails all 8 attempts across 21 minutes, so an outage longer than that window loses those events; this re-queues them with a full retry budget, oldest first. Bounded by default so a recovered endpoint is not flooded: max_age_hours defaults to 24 and limit to 100. Returns requeued and skipped_permanent. A delivery that died for a permanent reason, a 410 Gone, a deleted webhook, or a URL egress refused, is not replayed, because it would fail the same way and spend the budget again. Replayed events carry the same signature and payload as the original, so make your handler idempotent on the event id if a duplicate would matter. Returns 409 if the webhook is disabled, which happens after your endpoint answers 410 Gone: re-register it first. Free per call.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The webhook's id, from twitter_monitor_webhook_create or twitter_monitor_webhook_list. |
| limit | integer | – | Optional. Most deliveries to replay in one call, 1 to 1000, oldest first. Defaults to 100. |
| max_age_hours | integer | – | Optional. How far back to look for dead-lettered deliveries, 1 to 168 hours. Defaults to 24. |
No output schema declared.
No examples provided.
twitter_monitor_webhook_test ~125
Send one HMAC-signed test event to this webhook's URL right now and return the outcome synchronously: delivered (true if your endpoint returned a 2xx within the delivery timeout), status_code, and error. Unlike a real monitor event, a test send is never queued, retried, or dead-lettered, it is a one-shot diagnostic to confirm your endpoint and signature verification both work before relying on the webhook. Free per call.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The webhook's id, from twitter_monitor_webhook_create or twitter_monitor_webhook_list. |
No output schema declared.
No examples provided.
twitter_muting ~362
List the accounts YOUR authenticated account has MUTED, as full user objects, cursor-paginated. Muting hides an account's posts from your timeline without blocking it, so this is a different list from twitter_blocking and an account can appear in one and not the other. Requires an authenticated session behind your key. There is no user_id argument: X provides no way to read another account's mute list. An empty users array means you mute nobody, never a silent failure.
| Name | Type | Req | Description |
|---|---|---|---|
| auth_token | string | – | Optional. The account's auth_token cookie, to act AS that account for this call (must be paired with ct0). Sent as the x-auth-token header; never placed in the URL. |
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| ct0 | string | – | Optional. The account's ct0 cookie, paired with auth_token. Sent as the x-ct0 header. |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| proxy_url | string | – | Optional. Residential proxy URL to egress this call through. Recommended for writes: X soft-blocks writes from datacenter IPs as automated. Sent as the x-proxy-url header. |
| user_agent | string | – | Optional. User-Agent string to send for this session. Sent as the x-user-agent header. |
No output schema declared.
No examples provided.
twitter_retweet ~257
Retweet a tweet AS your authenticated account. Provide the tweet id or url. Requires write capability behind your key. Reverse with twitter_unretweet.
| Name | Type | Req | Description |
|---|---|---|---|
| auth_token | string | – | Optional. The account's auth_token cookie, to act AS that account for this call (must be paired with ct0). Sent as the x-auth-token header; never placed in the URL. |
| ct0 | string | – | Optional. The account's ct0 cookie, paired with auth_token. Sent as the x-ct0 header. |
| id | string | – | Tweet/post numeric id (e.g. "1789012345678901234"). Provide exactly one of id or url. |
| proxy_url | string | – | Optional. Residential proxy URL to egress this call through. Recommended for writes: X soft-blocks writes from datacenter IPs as automated. Sent as the x-proxy-url header. |
| url | string | – | Full tweet URL, e.g. "https://x.com/elonmusk/status/1789012345678901234". Provide exactly one of id or url. |
| user_agent | string | – | Optional. User-Agent string to send for this session. Sent as the x-user-agent header. |
No output schema declared.
No examples provided.
twitter_spaces_info ~247
Get metadata and the participant roster for one X Space by id, live or ended: title, lifecycle state (Scheduled, NotStarted, Running or Ended), host, topics, scheduled and actual start/end times, peak live listener count, replay view count, and the admin, speaker and listener rosters. Returns metadata only, NOT the Space audio. Note that X does not retain the per-person listener roster once a Space ends, so listeners comes back empty for an ended Space while total_live_listeners and total_replay_watched still reflect the real audience. All timestamps are millisecond-epoch numbers.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | The Space id: the trailing token of a x.com/i/spaces/<id> URL, e.g. '1RKZzjkoYRAKB'. A '/peek' suffix on the URL is not part of the id. |
| with_listeners | string | – | Optional. Include the listener roster. Defaults to true. X drops this roster once a Space ends, so it is empty for an ended Space regardless of this flag. |
| with_replays | string | – | Optional. Include replay availability and related metadata. Defaults to true. |
No output schema declared.
No examples provided.
twitter_trends ~208
Get the current top trends for a location. With no location parameter, returns Worldwide (WOEID 1, X's own default). Pass country (an ISO code or country name, e.g. 'US' or 'Japan') or a numeric woeid from twitter_trends_locations; woeid wins when both are given. Returns the resolved location, the as_of / created_at timestamps, and the ranked trends list. Use count to truncate the list. A location X will not serve returns a 400.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Truncate the returned trends list to at most this many. Omit to return X's full list for the location. |
| country | string | – | Country name or ISO code to get trends for, e.g. 'US' or 'Japan'. Resolved against the trends locations list. Omit for Worldwide. |
| woeid | string | – | Numeric WOEID from twitter_trends_locations. Takes precedence over country when both are supplied. |
No output schema declared.
No examples provided.
twitter_trends_locations ~60
List every location X publishes trends for, each with the numeric WOEID to pass back to twitter_trends as woeid. Takes no parameters. Use this to resolve a country or city to its WOEID before requesting trends for that place.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
twitter_tweet_detail ~145
Get the full detail of a single tweet: text, author profile, post timestamp, like/retweet/reply/quote counts, attached media, referenced quoted tweet, and parent reply context. Use this to inspect a specific tweet before fetching its replies or thread. Accepts either the tweet id or its full URL.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | – | Tweet/post numeric id (e.g. "1789012345678901234"). Provide exactly one of id or url. |
| url | string | – | Full tweet URL, e.g. "https://x.com/elonmusk/status/1789012345678901234". Provide exactly one of id or url. |
No output schema declared.
No examples provided.
twitter_tweet_quotes ~547
List the tweets that QUOTE a specific tweet, cursor-paginated as full tweet objects, so you get the commentary people attached rather than just a number. Different from twitter_tweet_retweeters (a plain retweet carries no text) and from twitter_tweet_replies (a reply is not a quote). IMPORTANT, state this to the user whenever you report a number from it: this endpoint is SEARCH-BACKED, because X exposes no dedicated quote-tweets operation, so it runs the query quoted_tweet_id:<id> against X's search index. The returned 'count' is therefore how many quotes THIS SEARCH returned, never the tweet's true total; the authoritative total is 'quote_count' on the tweet object from twitter_tweet_detail, and the two WILL differ because of index lag and because deleted, protected, suspended and region-withheld quotes are absent from search. Every response carries 'source' (always "search"), 'search_query' (the exact query sent), and 'quote_matched' (how many returned tweets demonstrably quote the requested id). quote_matched equal to count means every row is genuine; quote_matched 0 on a NON-EMPTY page means X stopped honouring the operator and the rows are junk, so discard that page rather than reporting it.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Max quote tweets to request for this page. Defaults to 20 and is clamped to 1-100 by the underlying search, so a larger number returns at most 100 rather than erroring. |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call. |
| id | string | – | Tweet/post numeric id (e.g. "1789012345678901234"). Provide exactly one of id or url. |
| product | string | – | Search ordering. 'Latest' (default) is reverse-chronological and cheap. 'Top' is X's ranked ordering and is materially slower upstream. Any other value falls back to Latest rather than changing what… |
| strict | string | – | Set true to DROP every returned row that does not demonstrably quote the requested tweet, instead of only counting them in quote_matched. Default false, because X does not embed the quoted original o… |
| url | string | – | Full tweet URL, e.g. "https://x.com/elonmusk/status/1789012345678901234". Provide exactly one of id or url. |
No output schema declared.
No examples provided.
twitter_tweet_replies ~163
Get replies to a specific tweet. Returns each reply tweet with author, text, and metrics. Paginate with cursor to load more. Use this to read the conversation under a tweet, gauge sentiment, or find notable responses.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| id | string | – | Tweet/post numeric id (e.g. "1789012345678901234"). Provide exactly one of id or url. |
| url | string | – | Full tweet URL, e.g. "https://x.com/elonmusk/status/1789012345678901234". Provide exactly one of id or url. |
No output schema declared.
No examples provided.
twitter_tweet_retweeters ~233
List the accounts that retweeted a specific tweet. Returns profile data for each retweeter. Paginate with cursor. Useful for finding who amplified a piece of content or mapping a tweet's distribution network.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| id | string | – | Tweet/post numeric id (e.g. "1789012345678901234"). Provide exactly one of id or url. |
| url | string | – | Full tweet URL, e.g. "https://x.com/elonmusk/status/1789012345678901234". Provide exactly one of id or url. |
No output schema declared.
No examples provided.
twitter_tweet_thread ~157
Get all tweets in a thread: the connected chain of tweets posted by the SAME author in sequence (a tweetstorm or numbered thread). Pass any tweet id/url from the thread and the API returns the full ordered sequence in a single call. Does NOT return replies from other users, use twitter_tweet_replies for that. Accepts either the tweet id or its full URL.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | – | Tweet/post numeric id (e.g. "1789012345678901234"). Provide exactly one of id or url. |
| url | string | – | Full tweet URL, e.g. "https://x.com/elonmusk/status/1789012345678901234". Provide exactly one of id or url. |
No output schema declared.
No examples provided.
twitter_unbookmark_tweet ~253
Remove a tweet from YOUR authenticated account's bookmarks. Provide the tweet id or url. Requires write capability behind your key.
| Name | Type | Req | Description |
|---|---|---|---|
| auth_token | string | – | Optional. The account's auth_token cookie, to act AS that account for this call (must be paired with ct0). Sent as the x-auth-token header; never placed in the URL. |
| ct0 | string | – | Optional. The account's ct0 cookie, paired with auth_token. Sent as the x-ct0 header. |
| id | string | – | Tweet/post numeric id (e.g. "1789012345678901234"). Provide exactly one of id or url. |
| proxy_url | string | – | Optional. Residential proxy URL to egress this call through. Recommended for writes: X soft-blocks writes from datacenter IPs as automated. Sent as the x-proxy-url header. |
| url | string | – | Full tweet URL, e.g. "https://x.com/elonmusk/status/1789012345678901234". Provide exactly one of id or url. |
| user_agent | string | – | Optional. User-Agent string to send for this session. Sent as the x-user-agent header. |
No output schema declared.
No examples provided.
twitter_unfavorite_tweet ~258
Remove a like (unfavorite) from a tweet AS your authenticated account. Provide the tweet id or url. Requires write capability behind your key.
| Name | Type | Req | Description |
|---|---|---|---|
| auth_token | string | – | Optional. The account's auth_token cookie, to act AS that account for this call (must be paired with ct0). Sent as the x-auth-token header; never placed in the URL. |
| ct0 | string | – | Optional. The account's ct0 cookie, paired with auth_token. Sent as the x-ct0 header. |
| id | string | – | Tweet/post numeric id (e.g. "1789012345678901234"). Provide exactly one of id or url. |
| proxy_url | string | – | Optional. Residential proxy URL to egress this call through. Recommended for writes: X soft-blocks writes from datacenter IPs as automated. Sent as the x-proxy-url header. |
| url | string | – | Full tweet URL, e.g. "https://x.com/elonmusk/status/1789012345678901234". Provide exactly one of id or url. |
| user_agent | string | – | Optional. User-Agent string to send for this session. Sent as the x-user-agent header. |
No output schema declared.
No examples provided.
twitter_unfollow_user ~195
Unfollow a user AS your authenticated account, by numeric user_id. Requires write capability behind your key.
| Name | Type | Req | Description |
|---|---|---|---|
| auth_token | string | – | Optional. The account's auth_token cookie, to act AS that account for this call (must be paired with ct0). Sent as the x-auth-token header; never placed in the URL. |
| ct0 | string | – | Optional. The account's ct0 cookie, paired with auth_token. Sent as the x-ct0 header. |
| proxy_url | string | – | Optional. Residential proxy URL to egress this call through. Recommended for writes: X soft-blocks writes from datacenter IPs as automated. Sent as the x-proxy-url header. |
| user_agent | string | – | Optional. User-Agent string to send for this session. Sent as the x-user-agent header. |
| user_id | string | yes | Numeric user id of the account to unfollow. |
No output schema declared.
No examples provided.
twitter_unretweet ~251
Undo a retweet AS your authenticated account. Provide the tweet id or url. Requires write capability behind your key.
| Name | Type | Req | Description |
|---|---|---|---|
| auth_token | string | – | Optional. The account's auth_token cookie, to act AS that account for this call (must be paired with ct0). Sent as the x-auth-token header; never placed in the URL. |
| ct0 | string | – | Optional. The account's ct0 cookie, paired with auth_token. Sent as the x-ct0 header. |
| id | string | – | Tweet/post numeric id (e.g. "1789012345678901234"). Provide exactly one of id or url. |
| proxy_url | string | – | Optional. Residential proxy URL to egress this call through. Recommended for writes: X soft-blocks writes from datacenter IPs as automated. Sent as the x-proxy-url header. |
| url | string | – | Full tweet URL, e.g. "https://x.com/elonmusk/status/1789012345678901234". Provide exactly one of id or url. |
| user_agent | string | – | Optional. User-Agent string to send for this session. Sent as the x-user-agent header. |
No output schema declared.
No examples provided.
twitter_user_about ~171
Get a user's full 'About' object: the structured profile facts X surfaces beyond the bio, including account category and professional/business labels, verification and identity-verification flags, joined date, location and linked website, follower/following counts, and X's 'About this account' transparency panel (the account's country, how the account was created, and its username-change history). Provide a username or a user_id. Use this to enrich a profile beyond what twitter_user_info returns.
| Name | Type | Req | Description |
|---|---|---|---|
| user_id | string | – | Numeric Twitter/X user id (e.g. "44196397"). Provide exactly one of username or user_id. |
| username | string | – | Twitter/X handle WITHOUT the leading @ (e.g. "elonmusk", "openai"). Provide exactly one of username or user_id. |
No output schema declared.
No examples provided.
twitter_user_affiliates ~265
List the affiliated accounts of an organization profile (the smaller accounts X displays under a company's 'Affiliated' badge, e.g. employees or sub-brands). Provide a username or user_id. Returns profile data per affiliate plus a pagination cursor. Returns empty for accounts with no affiliations.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| team | string | – | Optional team/sub-group name to filter affiliates by, when the org exposes named teams. |
| user_id | string | – | Numeric Twitter/X user id (e.g. "44196397"). Provide exactly one of username or user_id. |
| username | string | – | Twitter/X handle WITHOUT the leading @ (e.g. "elonmusk", "openai"). Provide exactly one of username or user_id. |
No output schema declared.
No examples provided.
twitter_user_followers ~231
List the accounts that follow a given user. Returns profile data for each follower (username, display name, bio, follower count). Paginate with cursor for large audiences. Useful for audience analysis, finding who follows a brand or influencer.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| user_id | string | – | Numeric Twitter/X user id (e.g. "44196397"). Provide exactly one of username or user_id. |
| username | string | – | Twitter/X handle WITHOUT the leading @ (e.g. "elonmusk", "openai"). Provide exactly one of username or user_id. |
No output schema declared.
No examples provided.
twitter_user_followers_v2 ~235
List a user's followers using the v2 response shape (richer profile fields and more reliable cursoring for large audiences). Same inputs as twitter_user_followers; prefer this when you need the fuller v2 payload or are paging deep follower lists.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| user_id | string | – | Numeric Twitter/X user id (e.g. "44196397"). Provide exactly one of username or user_id. |
| username | string | – | Twitter/X handle WITHOUT the leading @ (e.g. "elonmusk", "openai"). Provide exactly one of username or user_id. |
No output schema declared.
No examples provided.
twitter_user_following ~222
List the accounts that a given user follows. Returns profile data for each account followed. Paginate with cursor. Useful for mapping a user's information sources, influencer networks, or competitor monitoring lists.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| user_id | string | – | Numeric Twitter/X user id (e.g. "44196397"). Provide exactly one of username or user_id. |
| username | string | – | Twitter/X handle WITHOUT the leading @ (e.g. "elonmusk", "openai"). Provide exactly one of username or user_id. |
No output schema declared.
No examples provided.
twitter_user_following_v2 ~234
List the accounts a user follows using the v2 response shape (richer profile fields and more reliable cursoring). Same inputs as twitter_user_following; prefer this when you need the fuller v2 payload or are paging deep following lists.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| user_id | string | – | Numeric Twitter/X user id (e.g. "44196397"). Provide exactly one of username or user_id. |
| username | string | – | Twitter/X handle WITHOUT the leading @ (e.g. "elonmusk", "openai"). Provide exactly one of username or user_id. |
No output schema declared.
No examples provided.
twitter_user_info ~95
Get a user's complete public profile by their @handle: display name, bio, follower count, following count, verification status, location, website, account creation date, and pinned tweet. Use this before fetching tweets or followers to confirm the account exists and resolve the numeric user_id.
| Name | Type | Req | Description |
|---|---|---|---|
| username | string | yes | Twitter/X handle WITHOUT the leading @ (e.g. 'elonmusk', 'openai', 'sama'). |
No output schema declared.
No examples provided.
twitter_user_info_by_id ~93
Get a user's complete public profile by their numeric user id. Identical response to twitter_user_info. Use this when you already have a user_id from a previous API response and want to avoid a handle lookup.
| Name | Type | Req | Description |
|---|---|---|---|
| user_id | string | yes | Numeric Twitter/X user id (e.g. '44196397' for @elonmusk). Found in responses from other tools as user_id or author_id. |
No output schema declared.
No examples provided.
twitter_user_likes ~231
Get the tweets a user has liked (their public Likes tab), most recent first. Returns each liked tweet with author and metrics, plus a pagination cursor. Use this to infer interests or find content a user has endorsed. Returns empty if the account hides its likes. Requires the numeric user_id (resolve a handle first with twitter_user_info).
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| user_id | string | yes | Numeric Twitter/X user id (e.g. '44196397'). Required: this endpoint does not accept a username. Resolve a handle to a user_id first with twitter_user_info. |
No output schema declared.
No examples provided.
twitter_user_login ~343
Log in to X with a username and password (plus totp_secret if the account has 2FA) and store the resulting session against your API key, so the authenticated-account reads and the write tools then act as that account. On success returns { ok, username, message }; it does NOT return the session cookies (auth_token/ct0 are minted and kept server-side, never sent back). Typical failures: bad_credentials (401), two_factor_required (400, add totp_secret), captcha_required (422), acid_challenge (409, confirm the login from the account then retry). This handles real account credentials; never log or echo the values you pass.
| Name | Type | Req | Description |
|---|---|---|---|
| password | string | yes | The X account password. |
| proxy_url | string | – | Optional. HTTP or SOCKS proxy URL to perform the login through, e.g. 'http://user:pass@host:port'. Stored with the session and reused for its later requests. Omit to log in directly from the service'… |
| totp_secret | string | – | The account's base32 two-factor (TOTP) secret. Required only when the account has 2FA enabled. |
| user_agent | string | – | Optional. Browser User-Agent to mint and use the session with. Defaults to a current Chrome UA. Keep it consistent with the environment the account normally signs in from; a mismatch between the UA a… |
| username | string | yes | The X account username/handle (without the leading @). Some accounts also accept the login email here. |
No output schema declared.
No examples provided.
twitter_user_media ~231
Get the images and videos a user has posted. Returns media-containing tweets with URLs to the media files, dimensions, and type (photo/video/animated_gif). Paginate with cursor. Use this to pull a user's visual content history.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| user_id | string | – | Numeric Twitter/X user id (e.g. "44196397"). Provide exactly one of username or user_id. |
| username | string | – | Twitter/X handle WITHOUT the leading @ (e.g. "elonmusk", "openai"). Provide exactly one of username or user_id. |
No output schema declared.
No examples provided.
twitter_user_mentions ~213
Get recent public tweets that mention (@ tag) a user. Searches for tweets directed at the username using the to: operator. Returns matching tweets with author info and metrics. Paginate with cursor. Use this to monitor brand mentions, replies directed at an account, or public conversations about a person.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| username | string | yes | Twitter/X handle WITHOUT the leading @ of the user to find mentions for (e.g. 'openai' to find tweets mentioning @openai). |
No output schema declared.
No examples provided.
twitter_user_search ~209
Search for Twitter/X user accounts by name, keyword, or topic. Returns matching profiles (username, display name, bio, follower count, verification status) with a pagination cursor. Use this to discover accounts in a niche, find brand handles, or locate a person when you only know their name.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| query | string | yes | Name, keyword, or topic to search accounts for. Examples: 'OpenAI', 'AI researcher', 'tech founder'. |
No output schema declared.
No examples provided.
twitter_user_status ~190
Check whether a Twitter/X account is alive, suspended, or deleted. Returns a status field that is one of 'alive', 'suspended', 'not_found', or 'unavailable', plus the numeric id when the account is alive and X's own reason when it gives one. Use this instead of twitter_user_info when the QUESTION is whether the account still exists: user info answers a suspended account, a deleted account, and a handle that never existed all the same way, so it cannot tell a ban from a typo. Every outcome here is a successful response, so read the status field rather than treating a suspension as an error. A protected (private) account counts as alive, since protection is a visibility setting and not an account state.
| Name | Type | Req | Description |
|---|---|---|---|
| userName | string | yes | Twitter/X handle WITHOUT the leading @ (e.g. 'elonmusk', 'openai', 'sama'). |
No output schema declared.
No examples provided.
twitter_user_tweets ~326
Get a user's recent posting timeline. IMPORTANT: this endpoint does NOT filter server-side, so the response routinely includes retweets and replies alongside original posts. Every item carries is_retweet, is_reply and is_quote booleans, so filter client-side on those flags if you need originals only, and read author.username rather than assuming every item was written by the requested user (a retweet's retweeted_tweet holds the original author). Returns tweet text, id, timestamp, and engagement metrics. Paginate with cursor to go further back. To pull a back-catalogue in bulk with fewer round-trips, use twitter_user_tweets_complete (which is also cursor-paged, not one-shot).
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| user_id | string | – | Numeric Twitter/X user id (e.g. "44196397"). Provide exactly one of username or user_id. |
| username | string | – | Twitter/X handle WITHOUT the leading @ (e.g. "elonmusk", "openai"). Provide exactly one of username or user_id. |
No output schema declared.
No examples provided.
twitter_user_tweets_and_replies ~277
Get a user's full activity timeline: their original tweets AND replies to others. Useful for understanding how someone engages with a community, not just what they post. Paginate with cursor. Items carry is_retweet, is_reply and is_quote booleans; filter on those if you need a specific subset. Note that twitter_user_tweets does NOT filter replies or retweets out either, so on many accounts the two endpoints return overlapping or identical pages.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| user_id | string | – | Numeric Twitter/X user id (e.g. "44196397"). Provide exactly one of username or user_id. |
| username | string | – | Twitter/X handle WITHOUT the leading @ (e.g. "elonmusk", "openai"). Provide exactly one of username or user_id. |
No output schema declared.
No examples provided.
twitter_user_tweets_complete ~407
Get a large batch of a user's tweet history in one call, auto-paginating server-side across upstream pages. Heavier than twitter_user_tweets; use it to pull a back-catalogue with fewer round-trips. Returns { count, next_cursor, has_more, tweets }. IMPORTANT, this does NOT guarantee the whole history in one call: next_cursor is the completion signal, NOT count. A non-null next_cursor means the history is TRUNCATED and more remains, so call this tool again with cursor set to that value, and repeat until next_cursor is null (has_more is the same signal as a boolean). Each call is bounded by BOTH max and a server-side wall-clock budget, so a response can be truncated even when it returned fewer tweets than you asked for, which is why count must never be used to decide whether you are done. Requires the numeric user_id (resolve a handle first with twitter_user_info). Billed a flat $0.0024 per call regardless of how many tweets come back, so fewer, larger calls are cheaper than many small ones.
| Name | Type | Req | Description |
|---|---|---|---|
| cursor | string | – | Resume point from a previous response's next_cursor. Omit on the first call. Pass it back to continue collecting where the last call stopped, and keep repeating while next_cursor is non-null. |
| max | integer | – | Target number of tweets to collect in this call. Defaults to 200 when omitted. This is a MINIMUM target, not a hard cap: pages arrive in whole chunks, so a response may contain up to one page (<=100)… |
| user_id | string | yes | Numeric Twitter/X user id. Required: this endpoint does not accept a username. Resolve a handle to a user_id first with twitter_user_info. |
No output schema declared.
No examples provided.
twitter_user_verified_followers ~220
List a user's followers who have a verified account (checkmark). Filters the follower list to verified accounts only, useful for identifying notable or institutional followers. Paginate with cursor.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Requested page size, capped at 200. Advisory only for this endpoint: X's own search backend typically returns around 13 to 20 tweets per page regardless of the value requested here, an upstream limit… |
| cursor | string | – | Opaque pagination cursor from a previous response's next_cursor field. Omit on the first call; pass on subsequent calls to fetch the next page. |
| user_id | string | – | Numeric Twitter/X user id (e.g. "44196397"). Provide exactly one of username or user_id. |
| username | string | – | Twitter/X handle WITHOUT the leading @ (e.g. "elonmusk", "openai"). Provide exactly one of username or user_id. |
No output schema declared.
No examples provided.
twitter_x_user_stream_add_user ~91
Compat drop-in for twitter_monitor_create using an x_user_stream-shaped request/response envelope: watch an X account for new posts, translated onto the same underlying monitor system. Free per call. Prefer twitter_monitor_create for new integrations; this exists for migrating an existing x_user_stream-shaped integration without a rewrite.
| Name | Type | Req | Description |
|---|---|---|---|
| x_user_name | string | yes | The X username to watch, without the @. |
No output schema declared.
No examples provided.
twitter_x_user_stream_list_users ~84
Compat drop-in for twitter_monitor_list using an x_user_stream-shaped envelope: list every account you are currently tweet-monitoring. Honest field mapping, not fabricated: x_user_id is always null (this API stores no numeric Twitter user id) and is_monitor_profile is always 0 (profile-change monitoring is not a capability this API has). Free per call.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
twitter_x_user_stream_remove_user ~72
Compat drop-in for twitter_monitor_delete using an x_user_stream-shaped envelope: stop watching an account. Irreversible. Free per call.
| Name | Type | Req | Description |
|---|---|---|---|
| id_for_user | string | yes | The monitor id, from twitter_x_user_stream_list_users. Same value as a twitter_monitor_* tool's monitor id. |
No output schema declared.
No examples provided.
What is the TwitterAPIs MCP server?
TwitterAPIs is an MCP server listed in the public MCP registry as io.github.TwitterAPIs/twitterapis-mcp. Official MCP server for twitterapis.com. Read and write Twitter/X: search, users, tweets, DMs. This page covers its npm package (@twitterapis/mcp).
Is the TwitterAPIs MCP server safe to use?
TwitterAPIs scores 76 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 21 September 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the TwitterAPIs MCP server expose?
TwitterAPIs exposes 99 tools: twitter_advanced_search, twitter_user_search, twitter_user_info, twitter_user_info_by_id, twitter_user_status, and 94 more. Their descriptions and schemas cost roughly 24,793 tokens of context every time the server is loaded.
Is the TwitterAPIs MCP server still maintained?
TwitterAPIs is still listed as active in the MCP registry. We last reached this channel on 21 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the TwitterAPIs MCP server under?
TwitterAPIs declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.