@twitterapis/mcp 0.6.8 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +4 -3
- package/package.json +1 -1
- package/src/tools.js +47 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.7.0 (2026-08-11)
|
|
4
|
+
|
|
5
|
+
### Removed
|
|
6
|
+
|
|
7
|
+
- **`twitter_users_by_ids` removed from the tool list.** X refuses the batch `UsersByRestIds` lookup for the pooled cookie sessions this package's REST backend reads through (confirmed by instrumenting the request and verifying a token was actually attached before it was rejected, not just repeated 403s). The REST endpoint itself stays live and returns an honest `503 endpoint_unavailable` rather than being deleted, but a tool the model can call and always get a hard failure from is worse than no tool at all, so it is out of the catalog. Use `twitter_user_info_by_id` instead: same user object, one id per call. The catalog is now **61 tools: 40 reads and 21 write actions**.
|
|
8
|
+
|
|
9
|
+
## 0.6.9 (2026-08-10)
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **2 new tools for X's bookmark folders** (task #9): `twitter_bookmark_folders` (list your own bookmark folders, X's internal name: collections) and `twitter_bookmark_folder_timeline` (read the tweets inside one specific folder, by `folder_id`). Both require an authenticated session, same auth model as `twitter_bookmarks` and `twitter_bookmark_search`. `twitter_bookmark_folder_timeline` is cursor-paginated only; there is no count/page-size argument for this op. The catalog is now **62 tools: 41 reads and 21 write actions**.
|
|
14
|
+
|
|
3
15
|
## 0.6.8 (2026-08-10)
|
|
4
16
|
|
|
5
17
|
### Added
|
package/README.md
CHANGED
|
@@ -91,7 +91,7 @@ Restart Claude Desktop. The `twitter_*` tools appear in the tool picker.
|
|
|
91
91
|
|
|
92
92
|
## Tools
|
|
93
93
|
|
|
94
|
-
|
|
94
|
+
61 tools: 40 reads and 21 write actions. Most user endpoints accept `username` (handle without @) **or** `user_id` (`twitter_user_likes` and `twitter_user_tweets_complete` require `user_id`); tweet endpoints accept `id` **or** `url`; paginated endpoints return a `cursor` you pass back to get the next page. Two of the reads are free account/billing lookups (`twitter_account_me`, `twitter_account_payments`).
|
|
95
95
|
|
|
96
96
|
Public reads (search, profiles, tweets, followers, likes) work with just your API key. The **account-only** reads (bookmarks, DMs, home timeline, followers-you-know) and **all write actions** act AS an authenticated X account, so they need a session linked to your key first (returns HTTP 409 until then). Link a session either by registering your x.com cookies (`twitter_customer_session`) or by logging in with a username/password (`twitter_user_login`). Alternatively, pass **per-call inline credentials** on any of those tools (`auth_token` + `ct0`, with optional `proxy_url` / `user_agent`) to act AS that account for a single call without pre-registering a session, so one API key can act as many accounts. For write actions, set `proxy_url` to a residential proxy, since X soft-blocks writes that egress from datacenter IPs. Each write tool is annotated `readOnlyHint: false`; reversing actions (delete, unfollow, unlike, unretweet, unbookmark) are annotated `destructiveHint: true` so MCP clients can prompt before running them.
|
|
97
97
|
|
|
@@ -103,7 +103,6 @@ Public reads (search, profiles, tweets, followers, likes) work with just your AP
|
|
|
103
103
|
| `twitter_user_search` | Find user accounts by name or keyword |
|
|
104
104
|
| `twitter_user_info` | Full profile by handle (bio, counts, verification, location) |
|
|
105
105
|
| `twitter_user_info_by_id` | Full profile by numeric user id |
|
|
106
|
-
| `twitter_users_by_ids` | Up to 100 numeric user ids resolved to full profiles in one call |
|
|
107
106
|
| `twitter_user_about` | A user's structured About object (category, professional/business labels, verification + identity-verification flags, joined date, and X's 'About this account' transparency panel) |
|
|
108
107
|
| `twitter_user_affiliates` | Accounts affiliated with an organization profile |
|
|
109
108
|
| `twitter_check_follow_relationship` | Follow relationship between two user ids (who follows whom) |
|
|
@@ -129,6 +128,8 @@ Public reads (search, profiles, tweets, followers, likes) work with just your AP
|
|
|
129
128
|
| `twitter_blocking` | Accounts your authenticated account has blocked (your own list only) _(session)_ |
|
|
130
129
|
| `twitter_muting` | Accounts your authenticated account has muted (your own list only) _(session)_ |
|
|
131
130
|
| `twitter_bookmark_search` | Full-text search within your bookmarks _(session)_ |
|
|
131
|
+
| `twitter_bookmark_folders` | Your authenticated account's bookmark folders _(session)_ |
|
|
132
|
+
| `twitter_bookmark_folder_timeline` | Tweets inside one of your bookmark folders, by `folder_id` _(session)_ |
|
|
132
133
|
| `twitter_dm_list` | Your DM conversations (inbox), read-only _(session)_ |
|
|
133
134
|
| `twitter_dm_conversation` | Messages in one DM conversation, read-only _(session)_ |
|
|
134
135
|
| `twitter_trends` | Current top trends for a location (by `country` or `woeid`) |
|
|
@@ -255,7 +256,7 @@ Calls are billed to your twitterapis.com account. Almost every endpoint is $0.00
|
|
|
255
256
|
|
|
256
257
|
**Do I need an X (Twitter) developer account?** No. Get an API key at [twitterapis.com/signup](https://www.twitterapis.com/signup); there is no application or approval step.
|
|
257
258
|
|
|
258
|
-
**Is it read-only?** No.
|
|
259
|
+
**Is it read-only?** No. 40 read tools work with just your API key; 21 write actions (post, like, retweet, follow, DM, media upload, article create/edit/publish/delete) act as a linked X account or per-call inline credentials.
|
|
259
260
|
|
|
260
261
|
**Which clients are supported?** Claude Desktop, Cursor, Windsurf, and VS Code (Copilot agent mode), or any Model Context Protocol client.
|
|
261
262
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twitterapis/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Official MCP server for twitterapis.com, the Twitter/X API (search, users, followers, tweets, threads, lists, likes, bookmarks, DMs) plus write actions (post/like/retweet/follow) as native tools for Claude, Cursor, and any MCP client.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
package/src/tools.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// file in memory and fails if it does not match what is committed, so a hand edit
|
|
9
9
|
// here is caught rather than shipped.
|
|
10
10
|
//
|
|
11
|
-
// Catalog:
|
|
11
|
+
// Catalog: 61 tools (40 reads, 21 writes).
|
|
12
12
|
//
|
|
13
13
|
// Each tool maps 1:1 to a REST endpoint at https://api.twitterapis.com. Tool arg
|
|
14
14
|
// names map 1:1 to endpoint query params (every endpoint, including the POST
|
|
@@ -82,17 +82,6 @@ export const TOOLS = [
|
|
|
82
82
|
),
|
|
83
83
|
},
|
|
84
84
|
},
|
|
85
|
-
{
|
|
86
|
-
name: "twitter_users_by_ids",
|
|
87
|
-
path: "/twitter/users/by_ids",
|
|
88
|
-
description:
|
|
89
|
-
"Resolve up to 100 numeric user ids into full profiles in ONE call. Same user object as twitter_user_info_by_id, returned as a list. Use this whenever you hold several ids and would otherwise loop twitter_user_info_by_id, for example hydrating the authors of a batch of tweets. Ids that no longer resolve (suspended or deleted accounts) are omitted rather than returned as nulls; compare the requested and resolved counts in the response, or diff the returned ids against the ones you sent, to see which were dropped. Sending more than 100 ids is rejected rather than truncated, so a short list always means those accounts are gone, never that the request was clipped.",
|
|
90
|
-
shape: {
|
|
91
|
-
user_ids: z.string().describe(
|
|
92
|
-
"Comma-separated numeric Twitter/X user ids, up to 100 (e.g. '44196397,745273'). Duplicates are collapsed and billed once.",
|
|
93
|
-
),
|
|
94
|
-
},
|
|
95
|
-
},
|
|
96
85
|
{
|
|
97
86
|
name: "twitter_user_about",
|
|
98
87
|
path: "/twitter/user/user_about",
|
|
@@ -634,6 +623,52 @@ export const TOOLS = [
|
|
|
634
623
|
),
|
|
635
624
|
},
|
|
636
625
|
},
|
|
626
|
+
{
|
|
627
|
+
name: "twitter_bookmark_folders",
|
|
628
|
+
path: "/twitter/user/bookmark_folders",
|
|
629
|
+
description:
|
|
630
|
+
"List YOUR authenticated account's bookmark FOLDERS (X's internal name: collections), the named groups you can organize saved tweets into, separate from your flat bookmarks list (twitter_bookmarks). Requires an authenticated session behind your key. Returns each folder's id, name, and a cover image. Takes no arguments; your folders resolve from your session alone. Use twitter_bookmark_folder_timeline with a folder's id to read the tweets inside it.",
|
|
631
|
+
shape: {
|
|
632
|
+
auth_token: z.string().optional().describe(
|
|
633
|
+
"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.",
|
|
634
|
+
),
|
|
635
|
+
ct0: z.string().optional().describe(
|
|
636
|
+
"Optional. The account's ct0 cookie, paired with auth_token. Sent as the x-ct0 header.",
|
|
637
|
+
),
|
|
638
|
+
proxy_url: z.string().optional().describe(
|
|
639
|
+
"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.",
|
|
640
|
+
),
|
|
641
|
+
user_agent: z.string().optional().describe(
|
|
642
|
+
"Optional. User-Agent string to send for this session. Sent as the x-user-agent header.",
|
|
643
|
+
),
|
|
644
|
+
},
|
|
645
|
+
},
|
|
646
|
+
{
|
|
647
|
+
name: "twitter_bookmark_folder_timeline",
|
|
648
|
+
path: "/twitter/user/bookmark_folder_timeline",
|
|
649
|
+
description:
|
|
650
|
+
"Read the tweets inside ONE of your authenticated account's bookmark folders, identified by folder_id (from twitter_bookmark_folders). Requires an authenticated session behind your key. Cursor-paginated; there is no count/page-size argument for this op.",
|
|
651
|
+
shape: {
|
|
652
|
+
folder_id: z.string().describe(
|
|
653
|
+
"The bookmark folder's id, from twitter_bookmark_folders (e.g. '2073826456430592429').",
|
|
654
|
+
),
|
|
655
|
+
cursor: z.string().optional().describe(
|
|
656
|
+
"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.",
|
|
657
|
+
),
|
|
658
|
+
auth_token: z.string().optional().describe(
|
|
659
|
+
"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.",
|
|
660
|
+
),
|
|
661
|
+
ct0: z.string().optional().describe(
|
|
662
|
+
"Optional. The account's ct0 cookie, paired with auth_token. Sent as the x-ct0 header.",
|
|
663
|
+
),
|
|
664
|
+
proxy_url: z.string().optional().describe(
|
|
665
|
+
"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.",
|
|
666
|
+
),
|
|
667
|
+
user_agent: z.string().optional().describe(
|
|
668
|
+
"Optional. User-Agent string to send for this session. Sent as the x-user-agent header.",
|
|
669
|
+
),
|
|
670
|
+
},
|
|
671
|
+
},
|
|
637
672
|
{
|
|
638
673
|
name: "twitter_dm_list",
|
|
639
674
|
path: "/twitter/dm/list",
|