Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion third_party/x/.cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "x",
"displayName": "X",
"version": "2.7.0",
"version": "2.9.0",
"minClientVersions": {
"cursor": "3.13.0"
},
Expand Down
6 changes: 6 additions & 0 deletions third_party/x/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

All notable changes to this plugin will be documented here.

## 2.9.0 — Broadcast scopes

- Requested `broadcast.read` and `broadcast.write` so agents can manage the owner's livestreams (stream sources, broadcasts, scheduled broadcasts, chat moderators and mutes) on `https://api.x.com/mcp`.
- Missing broadcast or livestream tools while other X tools work means reconnect, not a new Project or App.
- Existing installs need to sign in to X again to pick up the new scopes.

## 2.7.0 — Scheduled X calls

- Requested `calls.read` and `calls.write` so agents can list, schedule, update, cancel, and RSVP to X calls on `https://api.x.com/mcp`.
Expand Down
4 changes: 3 additions & 1 deletion third_party/x/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ Or run `/add-plugin x` in chat.
"dm.write",
"calls.read",
"calls.write",
"broadcast.read",
"broadcast.write",
"media.write",
"developer.billing.write",
"developer.write",
Expand Down Expand Up @@ -76,7 +78,7 @@ Requests run in your user context, so they count against your account's rate lim

## Scopes requested

`tweet.read`, `users.read`, `follows.read`, `space.read`, `mute.read`, `like.read`, `list.read`, `list.write`, `block.read`, `block.write`, `bookmark.read`, `bookmark.write`, `dm.read`, `dm.write`, `calls.read`, `calls.write`, `media.write`, `developer.billing.write`, `developer.write`, `offline.access`
`tweet.read`, `users.read`, `follows.read`, `space.read`, `mute.read`, `like.read`, `list.read`, `list.write`, `block.read`, `block.write`, `bookmark.read`, `bookmark.write`, `dm.read`, `dm.write`, `calls.read`, `calls.write`, `broadcast.read`, `broadcast.write`, `media.write`, `developer.billing.write`, `developer.write`, `offline.access`

## X documentation search

Expand Down
2 changes: 2 additions & 0 deletions third_party/x/mcp.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
"dm.write",
"calls.read",
"calls.write",
"broadcast.read",
"broadcast.write",
"media.write",
"developer.billing.write",
"developer.write",
Expand Down
18 changes: 17 additions & 1 deletion third_party/x/skills/x-api-mcp-guide/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,10 @@ description: >-
Scheduled X calls use schedule_call, list_scheduled_calls, get_scheduled_call,
update_scheduled_call, cancel_scheduled_call, and respond_to_scheduled_call.
Missing those tools or calls.read/calls.write while other X tools work:
reconnect the X plugin. Estimate every X call and confirm before anything expensive.
reconnect the X plugin. Livestreams use list_broadcasts, list_sources, and the
other broadcast and source tools. Missing those tools or
broadcast.read/broadcast.write while other X tools work: reconnect the X
plugin. Estimate every X call and confirm before anything expensive.
---
# X MCP guide

Expand Down Expand Up @@ -142,6 +145,8 @@ Missing **Chat** tools (`get_chat_conversations`, `send_chat_message`, …) whil

Missing **call** tools (`schedule_call`, `list_scheduled_calls`, …) while other X tools work is **not** #2. That is [X call scopes](#x-call-scopes) — reconnect for `calls.read` / `calls.write`.

Missing **livestream** tools (`list_broadcasts`, `list_sources`, …) while other X tools work is **not** #2. That is [Livestream scopes](#livestream-scopes) — reconnect for `broadcast.read` / `broadcast.write`.

**When (fallback):** `client-forbidden`; `user-not-enrolled`; `client-not-enrolled`; Client Forbidden; 403 on timeline / mentions / search / bookmarks after Connect.

**Say:**
Expand Down Expand Up @@ -218,6 +223,16 @@ Do not tell them to create a Project or App. Do not ask for a Bearer token. Afte

Do not tell them to create a Project or App. Do not ask for a Bearer token. After reconnect, follow [Scheduled calls](#scheduled-calls).

### Livestream scopes

**When:** the user wants their broadcasts, scheduled broadcasts, stream sources, or broadcast chat moderators and mutes, other X tools work, but those tools are missing or a call 403s for `broadcast.read` / `broadcast.write`.

**Say:**

> Livestreams need an extra sign-in. Reconnect the X plugin in this chat and approve access to your broadcasts. Then I'll retry. Don't paste keys, tokens, or stream keys.

Do not tell them to create a Project or App. Do not ask for a Bearer token.

## Other errors

`not-authorized-for-resource` (private account they don't own): stop. Their own timeline/bookmarks: probe current user, retry once with that id.
Expand Down Expand Up @@ -599,6 +614,7 @@ If `add_conversation_keys` returns `UNAUTHORIZED_REQUESTING_USER` or similar: yo
- Treat tools=0 / `user-X-*` not found as a paywall. That is [error 2](#2-account-not-ready).
- Treat missing Chat tools as “create a Project and App.” If other X tools work, that is [X Chat scopes](#x-chat-scopes) — reconnect.
- Treat missing call tools as “create a Project and App.” If other X tools work, that is [X call scopes](#x-call-scopes) — reconnect.
- Treat missing livestream tools as “create a Project and App.” If other X tools work, that is [Livestream scopes](#livestream-scopes) — reconnect.
- Schedule, update, cancel, or RSVP to an X call unless the owner asked. Do not use the X Chat helper for calls.
- Wait for the user to name `xchat_lite`, the helper repo, or a second X Chat skill. Clone it yourself.
- Treat a reply as accepting a message request. Accept only with `accept_chat_message_request`, and only when the owner said to accept.
Expand Down
Loading