Twitter (X) data for agents: profiles, tweets, search, followers, lists. $0.0006 per call.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Your cheapxapi API key. Sign up at https://cheapxapi.com/signup ($1 promotional credit, no card).
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Get article. An article (long-form post) by its tweet ID.
Numeric tweet ID.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http mcp https://api.cheapxapi.com/mcp \ --header 'x-api-key: YOUR_X_API_KEY'
Headers
x-api-key (required): Your cheapxapi API key. Sign up at https://cheapxapi.com/signup ($1 promotional credit, no card).Get article. An article (long-form post) by its tweet ID.
| Argument | Type | Description |
|---|---|---|
| tweet_id* | string | Numeric tweet ID. |
{
"type": "object",
"required": [
"tweet_id"
],
"properties": {
"tweet_id": {
"type": "string",
"description": "Numeric tweet ID."
}
}
}Get community. Details of a community.
| Argument | Type | Description |
|---|---|---|
| community_id* | string | Numeric community ID. |
{
"type": "object",
"required": [
"community_id"
],
"properties": {
"community_id": {
"type": "string",
"description": "Numeric community ID."
}
}
}Get community members. Members of a community. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| community_id* | string | Numeric community ID. |
{
"type": "object",
"required": [
"community_id"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"community_id": {
"type": "string",
"description": "Numeric community ID."
}
}
}Get community moderators. Moderators of a community. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| community_id* | string | Numeric community ID. |
{
"type": "object",
"required": [
"community_id"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"community_id": {
"type": "string",
"description": "Numeric community ID."
}
}
}Search tweets across communities. Search tweets posted in any community. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| query* | string | Search query. |
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| queryType* | string | `Latest` or `Top`. |
{
"type": "object",
"required": [
"query",
"queryType"
],
"properties": {
"query": {
"type": "string",
"description": "Search query."
},
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"queryType": {
"enum": [
"Latest",
"Top"
],
"type": "string",
"default": "Latest",
"description": "`Latest` or `Top`."
}
}
}Get community tweets. Tweets posted in a community. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| community_id* | string | Numeric community ID. |
{
"type": "object",
"required": [
"community_id"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"community_id": {
"type": "string",
"description": "Numeric community ID."
}
}
}Get list followers. Followers of a list. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| list_id* | string | Numeric list ID. |
{
"type": "object",
"required": [
"list_id"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"list_id": {
"type": "string",
"description": "Numeric list ID."
}
}
}Get list members. Members of a list. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| list_id* | string | Numeric list ID. |
{
"type": "object",
"required": [
"list_id"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"list_id": {
"type": "string",
"description": "Numeric list ID."
}
}
}Get list tweets. Tweets from members of a list. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| listId* | string | Numeric list ID. |
| sinceTime | integer | Only items created at or after this Unix timestamp (seconds). |
| untilTime | integer | Only items created before this Unix timestamp (seconds). |
| includeReplies | boolean | Include replies (`true` / `false`). |
{
"type": "object",
"required": [
"listId"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"listId": {
"type": "string",
"description": "Numeric list ID."
},
"sinceTime": {
"type": "integer",
"description": "Only items created at or after this Unix timestamp (seconds)."
},
"untilTime": {
"type": "integer",
"description": "Only items created before this Unix timestamp (seconds)."
},
"includeReplies": {
"type": "boolean",
"default": true,
"description": "Include replies (`true` / `false`)."
}
}
}Get list timeline. Timeline of a list. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| listId* | string | Numeric list ID. |
{
"type": "object",
"required": [
"listId"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"listId": {
"type": "string",
"description": "Numeric list ID."
}
}
}Get trends. Trending topics for a location.
| Argument | Type | Description |
|---|---|---|
| count | integer | Number of trends to return. |
| woeid* | integer | Location WOEID, e.g. `1` for worldwide, `23424977` for the United States. |
{
"type": "object",
"required": [
"woeid"
],
"properties": {
"count": {
"type": "integer",
"description": "Number of trends to return."
},
"woeid": {
"type": "integer",
"description": "Location WOEID, e.g. `1` for worldwide, `23424977` for the United States."
}
}
}Advanced search. Search tweets with the X advanced search syntax, e.g. `from:NASA since:2026-01-01`. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| query* | string | Search query. |
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| queryType* | string | `Latest` or `Top`. |
{
"type": "object",
"required": [
"query",
"queryType"
],
"properties": {
"query": {
"type": "string",
"description": "Search query."
},
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"queryType": {
"enum": [
"Latest",
"Top"
],
"type": "string",
"default": "Latest",
"description": "`Latest` or `Top`."
}
}
}Get quote tweets. Tweets that quote a tweet. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| tweetId* | string | Numeric tweet ID. |
| sinceTime | integer | Only items created at or after this Unix timestamp (seconds). |
| untilTime | integer | Only items created before this Unix timestamp (seconds). |
| includeReplies | boolean | Include replies (`true` / `false`). |
{
"type": "object",
"required": [
"tweetId"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"tweetId": {
"type": "string",
"description": "Numeric tweet ID."
},
"sinceTime": {
"type": "integer",
"description": "Only items created at or after this Unix timestamp (seconds)."
},
"untilTime": {
"type": "integer",
"description": "Only items created before this Unix timestamp (seconds)."
},
"includeReplies": {
"type": "boolean",
"default": true,
"description": "Include replies (`true` / `false`)."
}
}
}Get tweet replies. Replies to a tweet. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| tweetId* | string | Numeric tweet ID. |
| sinceTime | integer | Only items created at or after this Unix timestamp (seconds). |
| untilTime | integer | Only items created before this Unix timestamp (seconds). |
{
"type": "object",
"required": [
"tweetId"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"tweetId": {
"type": "string",
"description": "Numeric tweet ID."
},
"sinceTime": {
"type": "integer",
"description": "Only items created at or after this Unix timestamp (seconds)."
},
"untilTime": {
"type": "integer",
"description": "Only items created before this Unix timestamp (seconds)."
}
}
}Get tweet replies (sortable). Replies to a tweet, with a choice of ordering via `queryType`. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| tweetId* | string | Numeric tweet ID. |
| queryType | string | Ordering: `Relevance` (default), `Latest` or `Likes`. |
{
"type": "object",
"required": [
"tweetId"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"tweetId": {
"type": "string",
"description": "Numeric tweet ID."
},
"queryType": {
"enum": [
"Relevance",
"Latest",
"Likes"
],
"type": "string",
"default": "Relevance",
"description": "Ordering: `Relevance` (default), `Latest` or `Likes`."
}
}
}Get retweeters. Users who retweeted a tweet. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| tweetId* | string | Numeric tweet ID. |
{
"type": "object",
"required": [
"tweetId"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"tweetId": {
"type": "string",
"description": "Numeric tweet ID."
}
}
}Get thread context. The conversation thread a tweet belongs to. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| tweetId* | string | Numeric tweet ID. |
{
"type": "object",
"required": [
"tweetId"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"tweetId": {
"type": "string",
"description": "Numeric tweet ID."
}
}
}Get tweet by ID. One tweet by its numeric ID. Exactly one ID per request.
| Argument | Type | Description |
|---|---|---|
| tweet_ids* | string | Exactly one numeric tweet ID per request. |
{
"type": "object",
"required": [
"tweet_ids"
],
"properties": {
"tweet_ids": {
"type": "string",
"description": "Exactly one numeric tweet ID per request."
}
}
}Get user 'about' details. Extra profile details of a user (account location, creation info, verification details).
| Argument | Type | Description |
|---|---|---|
| userName* | string | Screen name without the @, e.g. `NASA`. |
{
"type": "object",
"required": [
"userName"
],
"properties": {
"userName": {
"type": "string",
"description": "Screen name without the @, e.g. `NASA`."
}
}
}Get user's articles. Articles (long-form posts) published by a user. The list is inside `data.articles`. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| username* | string | Screen name without the @. |
{
"type": "object",
"required": [
"username"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"username": {
"type": "string",
"description": "Screen name without the @."
}
}
}Get users by IDs. Profiles of up to 20 users in one request.
| Argument | Type | Description |
|---|---|---|
| userIds* | string | 1 to 20 numeric user IDs separated by commas, e.g. `11348282,44196397`. |
{
"type": "object",
"required": [
"userIds"
],
"properties": {
"userIds": {
"type": "string",
"description": "1 to 20 numeric user IDs separated by commas, e.g. `11348282,44196397`."
}
}
}Check follow relationship. Whether two users follow each other.
| Argument | Type | Description |
|---|---|---|
| source_user_name* | string | Screen name of the first user. |
| target_user_name* | string | Screen name of the second user. |
{
"type": "object",
"required": [
"source_user_name",
"target_user_name"
],
"properties": {
"source_user_name": {
"type": "string",
"description": "Screen name of the first user."
},
"target_user_name": {
"type": "string",
"description": "Screen name of the second user."
}
}
}Get followers. Followers of a user with full profiles. Up to 100 per page. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| pageSize | integer | Items per page, 20 to 100 (default 100). Larger values are treated as 100, smaller as 20. |
| userName* | string | Screen name without the @, e.g. `NASA`. |
{
"type": "object",
"required": [
"userName"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"pageSize": {
"type": "integer",
"default": 100,
"description": "Items per page, 20 to 100 (default 100). Larger values are treated as 100, smaller as 20."
},
"userName": {
"type": "string",
"description": "Screen name without the @, e.g. `NASA`."
}
}
}Get follower IDs. Follower user IDs only, 200 per page. Pass either `userName` or `userId`. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| userId | string | Numeric user ID, e.g. `11348282`. |
| userName | string | Screen name without the @, e.g. `NASA`. |
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"userId": {
"type": "string",
"description": "Numeric user ID, e.g. `11348282`."
},
"userName": {
"type": "string",
"description": "Screen name without the @, e.g. `NASA`."
}
}
}Get followings. Accounts a user follows, with full profiles. Up to 100 per page. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| pageSize | integer | Items per page, 20 to 100 (default 100). Larger values are treated as 100, smaller as 20. |
| userName* | string | Screen name without the @, e.g. `NASA`. |
{
"type": "object",
"required": [
"userName"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"pageSize": {
"type": "integer",
"default": 100,
"description": "Items per page, 20 to 100 (default 100). Larger values are treated as 100, smaller as 20."
},
"userName": {
"type": "string",
"description": "Screen name without the @, e.g. `NASA`."
}
}
}Get user profile. Public profile of a user by screen name.
| Argument | Type | Description |
|---|---|---|
| userName* | string | Screen name without the @, e.g. `NASA`. |
{
"type": "object",
"required": [
"userName"
],
"properties": {
"userName": {
"type": "string",
"description": "Screen name without the @, e.g. `NASA`."
}
}
}Get user's latest tweets. Latest tweets of a user, newest first. The list is inside `data.tweets`. Pass either `userName` or `userId`. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| userId | string | Numeric user ID, e.g. `11348282`. |
| userName | string | Screen name without the @, e.g. `NASA`. |
| includeReplies | boolean | Include replies (`true` / `false`). |
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"userId": {
"type": "string",
"description": "Numeric user ID, e.g. `11348282`."
},
"userName": {
"type": "string",
"description": "Screen name without the @, e.g. `NASA`."
},
"includeReplies": {
"type": "boolean",
"default": false,
"description": "Include replies (`true` / `false`)."
}
}
}Get user mentions. Tweets that mention a user. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| userName* | string | Screen name without the @, e.g. `NASA`. |
| sinceTime | integer | Only items created at or after this Unix timestamp (seconds). |
| untilTime | integer | Only items created before this Unix timestamp (seconds). |
{
"type": "object",
"required": [
"userName"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"userName": {
"type": "string",
"description": "Screen name without the @, e.g. `NASA`."
},
"sinceTime": {
"type": "integer",
"description": "Only items created at or after this Unix timestamp (seconds)."
},
"untilTime": {
"type": "integer",
"description": "Only items created before this Unix timestamp (seconds)."
}
}
}Search users. Search users by keyword. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| query* | string | Search query. |
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"description": "Search query."
},
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
}
}
}Get user's tweet timeline. Tweet timeline of a user by numeric user ID. The list is inside `data.tweets`. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| userId | string | Numeric user ID, e.g. `11348282`. |
| includeReplies | boolean | Include replies (`true` / `false`). |
| includeParentTweet | boolean | Include the parent tweet of replies (`true` / `false`). |
{
"type": "object",
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"userId": {
"type": "string",
"description": "Numeric user ID, e.g. `11348282`."
},
"includeReplies": {
"type": "boolean",
"default": false,
"description": "Include replies (`true` / `false`)."
},
"includeParentTweet": {
"type": "boolean",
"default": false,
"description": "Include the parent tweet of replies (`true` / `false`)."
}
}
}Get verified followers. Verified followers of a user by numeric user ID. Paginated: use `cursor` / `next_cursor`.
| Argument | Type | Description |
|---|---|---|
| cursor | string | Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response. |
| user_id* | string | Numeric user ID, e.g. `11348282`. |
{
"type": "object",
"required": [
"user_id"
],
"properties": {
"cursor": {
"type": "string",
"description": "Pagination cursor. Leave empty for the first page, then pass `next_cursor` from the previous response."
},
"user_id": {
"type": "string",
"description": "Numeric user ID, e.g. `11348282`."
}
}
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 9, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.