From f203cd913852556853de18db6e84c7758f4ed4d3 Mon Sep 17 00:00:00 2001 From: Asad Salman Date: Tue, 22 Sep 2026 14:56:39 -0400 Subject: [PATCH 1/9] Add X Money plugin for Grok Bot --- .cursor-plugin/marketplace.json | 5 ++ README.md | 1 + .../x-money/.cursor-plugin/plugin.json | 41 ++++++++++ third_party/x-money/CHANGELOG.md | 10 +++ third_party/x-money/LICENSE | 21 +++++ third_party/x-money/README.md | 76 ++++++++++++++++++ third_party/x-money/assets/logo.png | Bin 0 -> 27423 bytes third_party/x-money/mcp.json | 9 +++ 8 files changed, 163 insertions(+) create mode 100644 third_party/x-money/.cursor-plugin/plugin.json create mode 100644 third_party/x-money/CHANGELOG.md create mode 100644 third_party/x-money/LICENSE create mode 100644 third_party/x-money/README.md create mode 100644 third_party/x-money/assets/logo.png create mode 100644 third_party/x-money/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 84709029..f9709c68 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -437,6 +437,11 @@ "name": "coinbase", "source": "third_party/coinbase", "description": "Check balances, get quotes, and preview or place trades." + }, + { + "name": "x-money", + "source": "third_party/x-money", + "description": "Check balances, review transactions, send and request money on X, and pay online with a single-use virtual card." } ] } diff --git a/README.md b/README.md index 6bac0060..81665890 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `statsig` | [Statsig](third_party/statsig/) | Cursor | Integrations | Inspect and manage feature gates, experiments, dynamic configs, and metrics. | | `robinhood` | [Robinhood](third_party/robinhood/) | Cursor | Integrations | View portfolios, positions, orders, watchlists, and market data, and trade in a Robinhood Agentic account. | | `coinbase` | [Coinbase](third_party/coinbase/) | Cursor | Integrations | Check balances, get quotes, and preview or place trades. | +| `x-money` | [X Money](third_party/x-money/) | Cursor | Integrations | Check balances, review transactions, send and request money on X, and pay online with a single-use virtual card. | Author values match each plugin’s `plugin.json` `author.name` (Cursor lists `plugins@cursor.com` in the manifest). ## Repository structure diff --git a/third_party/x-money/.cursor-plugin/plugin.json b/third_party/x-money/.cursor-plugin/plugin.json new file mode 100644 index 00000000..292a8de3 --- /dev/null +++ b/third_party/x-money/.cursor-plugin/plugin.json @@ -0,0 +1,41 @@ +{ + "name": "x-money", + "displayName": "X Money", + "version": "1.0.0", + "minClientVersions": { + "cursor": "never", + "grokbot": "0.52.0", + "sand": "0.52.0" + }, + "description": "Check balances, review transactions, send and request money on X, and pay online with a single-use virtual card.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://github.com/cursor/plugins/tree/main/third_party/x-money", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "x money", + "xmoney", + "x", + "payments", + "balance", + "transactions", + "send money", + "p2p", + "virtual card", + "wallet", + "finance", + "mcp" + ], + "category": "integrations", + "tags": [ + "x-money", + "payments", + "finance", + "mcp" + ], + "mcpServers": "./mcp.json" +} diff --git a/third_party/x-money/CHANGELOG.md b/third_party/x-money/CHANGELOG.md new file mode 100644 index 00000000..56ddf6b8 --- /dev/null +++ b/third_party/x-money/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `x-money` MCP server pointing at X Money's hosted Streamable HTTP endpoint (`https://mcp.money.x.com/mcp`), declared `placement: "server"` because the OAuth grant and tool calls live on the Cursor backend. +- Auth is OAuth 2.1 with PKCE. The Cursor backend is a registered confidential client of X Money, so the plugin ships no client ID, secret, or variables. Consent is a connection code approved with a passkey in the X app. +- Grok Bot only (`grokbot` / `sand` 0.52.0 or newer, `cursor: "never"`). +- Logo: X Money's official mark. diff --git a/third_party/x-money/LICENSE b/third_party/x-money/LICENSE new file mode 100644 index 00000000..ca2bba77 --- /dev/null +++ b/third_party/x-money/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Cursor + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/third_party/x-money/README.md b/third_party/x-money/README.md new file mode 100644 index 00000000..b4cd863a --- /dev/null +++ b/third_party/x-money/README.md @@ -0,0 +1,76 @@ +# X Money + +Grok Bot plugin that connects agents to [X Money](https://x.com/i/money) through X Money's hosted [Model Context Protocol](https://modelcontextprotocol.io/) server at `https://mcp.money.x.com/mcp`. + +Check balances, review transactions, send and request money on X, and pay online with a single-use virtual card. + +## Who can use it + +- Grok Bot **0.52** or newer. +- An active X Money account. X Money is available to eligible customers in the United States. +- Not available in Cursor. Cursor must not list or install this plugin. + +## Install + +1. Open **Grok Bot → Plugins**. +2. Search for **X Money**. +3. Click **Install**, then complete the X Money connection when prompted. + +Or ask the agent to connect your X Money account. + +## MCP + +```json +{ + "mcpServers": { + "x-money": { + "type": "http", + "url": "https://mcp.money.x.com/mcp", + "placement": "server" + } + } +} +``` + +## Connecting + +Auth is OAuth 2.1 with PKCE. There is no client ID, API key, or token to paste. The Cursor backend is a registered confidential client of X Money and completes the sign-in on your behalf. + +1. Grok Bot opens the X Money consent page in a browser. +2. The page shows a connection code and a QR code. +3. Open the code in the X app and approve it with your passkey. +4. The page redirects back to Grok Bot and the connection completes. + +Access tokens expire after 15 minutes and refresh automatically. Tokens are stored encrypted on the Cursor backend and never reach the agent, the chat, or your device. You can revoke the connection at any time from **X → Money → Settings → Connections**. + +## What agents can do + +| Tool | What it does | +| --- | --- | +| `get_balance` | Available balance of your main, secondary, and joint accounts | +| `get_transactions` | Your transaction history, newest first, with optional filters | +| `send_money` | Send money from your X Money balance to another X user by @handle or user id | +| `request_money` | Ask another X user to pay you through X Money | +| `get_card_details` | Create a single-use virtual card for one online purchase at one merchant | + +The hosted server is the source of truth for tool names and schemas. + +## Notes + +- Payments and cards created through this server are live and move real money. +- Every action passes the same X Money checks as the app. X Money also enforces agent spending limits on top of your account limits. A refused action returns a message for the agent to relay and is not retried. +- Higher-risk transfers, such as bank transfers and large payments, are not available to agents and stay behind verification in the X app. +- Each virtual card works for exactly one merchant and one purchase. Card details are returned to the agent to complete checkout and are not shown in chat. +- The agent never sees your X Money password, passkey, or bank credentials. + +## Docs + +- X Money: https://x.com/i/money +- Manage connected agents: https://x.com/i/money/settings/connections +- Server URL: https://mcp.money.x.com/mcp + +Logo is X Money's official mark. + +## License + +MIT diff --git a/third_party/x-money/assets/logo.png b/third_party/x-money/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4b61a82c37483908b403fb59794289fd6092f6f4 GIT binary patch literal 27423 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 literal 0 HcmV?d00001 diff --git a/third_party/x-money/mcp.json b/third_party/x-money/mcp.json new file mode 100644 index 00000000..80cd737b --- /dev/null +++ b/third_party/x-money/mcp.json @@ -0,0 +1,9 @@ +{ + "mcpServers": { + "x-money": { + "type": "http", + "url": "https://mcp.money.x.com/mcp", + "placement": "server" + } + } +} From 156fec780912ed7a67e6df0eb4949d71ef528363 Mon Sep 17 00:00:00 2001 From: Asad Salman Date: Tue, 22 Sep 2026 14:57:56 -0400 Subject: [PATCH 2/9] Set X Money plugin homepage --- third_party/x-money/.cursor-plugin/plugin.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/x-money/.cursor-plugin/plugin.json b/third_party/x-money/.cursor-plugin/plugin.json index 292a8de3..8dbe063f 100644 --- a/third_party/x-money/.cursor-plugin/plugin.json +++ b/third_party/x-money/.cursor-plugin/plugin.json @@ -12,7 +12,7 @@ "name": "Cursor", "email": "plugins@cursor.com" }, - "homepage": "https://github.com/cursor/plugins/tree/main/third_party/x-money", + "homepage": "http://money.x.com/", "repository": "https://github.com/cursor/plugins", "license": "MIT", "logo": "assets/logo.png", From 15cae9c21306e38dcc07bef011c5b423eff8d7bf Mon Sep 17 00:00:00 2001 From: Asad Salman Date: Tue, 22 Sep 2026 14:58:07 -0400 Subject: [PATCH 3/9] Point homepage at x.com/i/money --- third_party/x-money/.cursor-plugin/plugin.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/x-money/.cursor-plugin/plugin.json b/third_party/x-money/.cursor-plugin/plugin.json index 8dbe063f..bd98d70c 100644 --- a/third_party/x-money/.cursor-plugin/plugin.json +++ b/third_party/x-money/.cursor-plugin/plugin.json @@ -12,7 +12,7 @@ "name": "Cursor", "email": "plugins@cursor.com" }, - "homepage": "http://money.x.com/", + "homepage": "https://x.com/i/money", "repository": "https://github.com/cursor/plugins", "license": "MIT", "logo": "assets/logo.png", From a55557c98f8fd8bfd94278f46e878944cf95d761 Mon Sep 17 00:00:00 2001 From: Asad Salman Date: Tue, 22 Sep 2026 15:02:11 -0400 Subject: [PATCH 4/9] Add X Money guide skill --- .../x-money/.cursor-plugin/plugin.json | 3 +- third_party/x-money/CHANGELOG.md | 1 + third_party/x-money/README.md | 17 ++- .../x-money/skills/x-money-guide/SKILL.md | 122 ++++++++++++++++++ 4 files changed, 135 insertions(+), 8 deletions(-) create mode 100644 third_party/x-money/skills/x-money-guide/SKILL.md diff --git a/third_party/x-money/.cursor-plugin/plugin.json b/third_party/x-money/.cursor-plugin/plugin.json index bd98d70c..ddcae575 100644 --- a/third_party/x-money/.cursor-plugin/plugin.json +++ b/third_party/x-money/.cursor-plugin/plugin.json @@ -37,5 +37,6 @@ "finance", "mcp" ], - "mcpServers": "./mcp.json" + "mcpServers": "./mcp.json", + "skills": "./skills/" } diff --git a/third_party/x-money/CHANGELOG.md b/third_party/x-money/CHANGELOG.md index 56ddf6b8..19671295 100644 --- a/third_party/x-money/CHANGELOG.md +++ b/third_party/x-money/CHANGELOG.md @@ -6,5 +6,6 @@ All notable changes to this plugin will be documented here. - Added the `x-money` MCP server pointing at X Money's hosted Streamable HTTP endpoint (`https://mcp.money.x.com/mcp`), declared `placement: "server"` because the OAuth grant and tool calls live on the Cursor backend. - Auth is OAuth 2.1 with PKCE. The Cursor backend is a registered confidential client of X Money, so the plugin ships no client ID, secret, or variables. Consent is a connection code approved with a passkey in the X app. +- Added the X Money guide skill: how the connection-code and passkey flow works, how to guide a user through connect, reconnect, and revoke at `x.com/i/money/settings/connections`, what each refusal means, and the approval rule for actions that move money. - Grok Bot only (`grokbot` / `sand` 0.52.0 or newer, `cursor: "never"`). - Logo: X Money's official mark. diff --git a/third_party/x-money/README.md b/third_party/x-money/README.md index b4cd863a..4401780f 100644 --- a/third_party/x-money/README.md +++ b/third_party/x-money/README.md @@ -45,15 +45,18 @@ Access tokens expire after 15 minutes and refresh automatically. Tokens are stor ## What agents can do -| Tool | What it does | +| Category | Capabilities | | --- | --- | -| `get_balance` | Available balance of your main, secondary, and joint accounts | -| `get_transactions` | Your transaction history, newest first, with optional filters | -| `send_money` | Send money from your X Money balance to another X user by @handle or user id | -| `request_money` | Ask another X user to pay you through X Money | -| `get_card_details` | Create a single-use virtual card for one online purchase at one merchant | +| Balances | Available balance of your main, secondary, and joint accounts | +| Transactions | Your transaction history, newest first, with optional filters | +| Payments | Send money from your X Money balance to another X user, or ask another X user to pay you | +| Cards | Create a single-use virtual card for one online purchase at one merchant | -The hosted server is the source of truth for tool names and schemas. +The hosted server is the source of truth for the available actions. X Money enables actions per account, so the set can differ between users. + +## Skill + +`skills/x-money-guide/SKILL.md` tells the agent how the connection works, how to guide a user through connect, reconnect, and revoke (**X → Money → Settings → Connections**), what each refusal means, and that every action that moves money needs a fresh approval. ## Notes diff --git a/third_party/x-money/skills/x-money-guide/SKILL.md b/third_party/x-money/skills/x-money-guide/SKILL.md new file mode 100644 index 00000000..1779de23 --- /dev/null +++ b/third_party/x-money/skills/x-money-guide/SKILL.md @@ -0,0 +1,122 @@ +--- +name: X Money guide +description: >- + Read this before the first X Money action in a session and again on any + X Money error, refusal, or missing capability. Covers how the connection + works (connection code plus passkey in the X app), how to walk the user + through connect, reconnect, and revoke at x.com/i/money/settings/connections, + what each refusal means, and the approval rule for any action that moves + money or creates a card. +--- + +# X Money guide + +This plugin uses the **X Money MCP** at `https://mcp.money.x.com/mcp`. The user connects once. The Cursor backend holds the tokens and refreshes them. The agent never sees tokens, card numbers in chat, passwords, or passkeys. + +Discover the available actions from the server's tool list. The server is the source of truth for what the user can do and for every schema. Do not assume an action exists because it is mentioned here. + +## Approval rule + +Sending money, requesting money, and creating a virtual card move real money. Before each such call, ask the user for approval with a `SendToUser` widget that states the exact action in one sentence: amount, recipient or merchant, and purpose. Call the tool only after the user picks Approve. Never batch approvals. Never infer approval from an earlier message. + +A tool result with `outcome: "refused"` is final. Relay its `message` to the user in plain words. Do not retry a refused call and do not change the amount to get around it. + +## How the connection works + +1. The user taps **Connect** on the X Money plugin in Grok Bot. +2. A browser opens the X Money consent page. It shows a **connection code** and a QR code. +3. The user opens the code in the **X app** on the account that owns the X Money account, then approves with their **passkey**. +4. The consent page detects the approval and returns to Grok Bot. The connection is complete. + +The connection code expires after **5 minutes**. Access tokens live 15 minutes and refresh automatically. The connection stays valid until the user revokes it or it goes unused for 45 days. + +## Connections screen + +`https://x.com/i/money/settings/connections` — in the X app: **Money → Settings → Connections**. + +Send the user here to: + +- see which agents are connected to X Money, +- revoke Grok Bot's access, +- confirm that a connection they just approved is listed. + +Revoking on this screen ends the connection immediately. The next Grok Bot call fails with an auth error and the user must connect again. + +## Troubleshooting + +Match the situation, say the quoted line in your own voice, then give the one next step. Do not explain OAuth, tokens, or backend internals. + +### Not connected, or auth error on a call + +Signals: no X Money tools in the tool list, `401`, `invalid_token`, `grant has been revoked`, `refresh token has expired`, `refresh token does not exist`. + +> Your X Money connection is not active. Open the X Money plugin in Grok Bot and tap Connect, then approve the connection code in the X app with your passkey. + +If the user says they did not revoke anything, still reconnect. A revoked or expired connection cannot be restored any other way. + +### Connection code expired + +Signal: the consent page says the code expired, or the user waited more than 5 minutes. + +> The connection code expired. Tap Connect again in Grok Bot to get a new code, then approve it in the X app within 5 minutes. + +### Code rejected in the X app + +Signal: the X app says the code is invalid. + +Ask which X account they are signed into. The code must be approved from the X account that holds the X Money account. If it is the right account, tell them to restart from Connect. Codes are single-use and tied to one connection attempt. + +### Passkey step fails + +Signal: the X app cannot complete the passkey challenge. + +> Approving an agent connection needs a passkey on your X account. Set one up in X → Settings → Security, then approve the connection again. + +### New connections not accepted + +Signal: `new customer connections are not currently accepted`. + +> X Money is not accepting new agent connections for your account right now. This is a staged rollout, not a problem with your account. Try again later. + +Do not suggest workarounds. + +### Action missing or "not ready for you yet" + +Signals: an action the user asks for has no matching tool while other X Money tools work, or a call returns `This X Money MCP tool isn't ready for you yet.` + +> That X Money action is not enabled for your account yet. + +Offer the actions that are present. Do not tell the user to reinstall or reconnect; the tool set is decided per account by X Money. + +### User has no X Money account + +Signal: the consent page or the X app says the user cannot use X Money, or the user says they never set it up. + +> X Money is available to eligible customers in the United States. Set up X Money in the X app first, then connect it here. + +## Refusals when sending or requesting money + +Relay the `message` from the result. Common ones and what to add: + +| Message contains | Add | +| --- | --- | +| `verify this payment in the X Money app` | The user can send it themselves in the X app. Agents cannot complete verification steps. | +| `sending limits` or `Too many transfers` | Agent payments have their own daily caps on top of the account limits. Try again later or pay in the X app. | +| `balance is too low` | Check the balance and suggest a smaller amount, or adding funds in the X app. | +| `No X user named` | Confirm the @handle. Handles change; a numeric user id is more stable. | +| `only accepts money from people they follow` | Nothing to fix from here. | +| `could not confirm` | Do not send again. Tell the user to check the transaction in the X app. | +| `Agents can't move money for this account right now` | Agent payments are switched off for this account. Pay in the X app. | + +## Virtual cards + +- One card is valid for one merchant and one purchase. Never reuse a card or split a purchase across cards. +- A result that says the daily card count or spend is used up includes `limits_reset_at`. Tell the user when limits reset. Do not create another card. +- Card details go straight into the merchant checkout. Never print the card number, CVC, or expiry in chat. + +## What not to do + +- Never ask the user for an X Money password, passkey, card number, or bank login. +- Never ask the user to paste a token or code into chat. +- Never retry a `401`, a refusal, or a limits result unchanged. +- Never move money without a fresh approval for that exact action. From bab183fe1020da4a957f37e46864610b1cae967d Mon Sep 17 00:00:00 2001 From: Asad Salman Date: Tue, 22 Sep 2026 15:06:10 -0400 Subject: [PATCH 5/9] Rework X Money guide from server source --- third_party/x-money/README.md | 35 ++-- .../x-money/skills/x-money-guide/SKILL.md | 150 ++++++++++++------ 2 files changed, 119 insertions(+), 66 deletions(-) diff --git a/third_party/x-money/README.md b/third_party/x-money/README.md index 4401780f..e73f9a16 100644 --- a/third_party/x-money/README.md +++ b/third_party/x-money/README.md @@ -34,36 +34,39 @@ Or ask the agent to connect your X Money account. ## Connecting -Auth is OAuth 2.1 with PKCE. There is no client ID, API key, or token to paste. The Cursor backend is a registered confidential client of X Money and completes the sign-in on your behalf. +Auth is OAuth. There is no client ID, API key, or token to paste. Cursor completes the sign-in on your behalf. -1. Grok Bot opens the X Money consent page in a browser. -2. The page shows a connection code and a QR code. -3. Open the code in the X app and approve it with your passkey. -4. The page redirects back to Grok Bot and the connection completes. +1. Grok Bot opens the **Connect Grok Bot to X Money** page in a browser. It shows a connection code and a QR code. +2. Enter the code in the X Money app, or scan the QR code, and approve with your passkey. +3. The page confirms the connection and Grok Bot picks it up on its own. -Access tokens expire after 15 minutes and refresh automatically. Tokens are stored encrypted on the Cursor backend and never reach the agent, the chat, or your device. You can revoke the connection at any time from **X → Money → Settings → Connections**. +The code is valid for about 5 minutes. You can revoke the connection at any time from **X → Money → Settings → Connections**. ## What agents can do | Category | Capabilities | | --- | --- | -| Balances | Available balance of your main, secondary, and joint accounts | -| Transactions | Your transaction history, newest first, with optional filters | -| Payments | Send money from your X Money balance to another X user, or ask another X user to pay you | -| Cards | Create a single-use virtual card for one online purchase at one merchant | +| Balances | Available balance of your X Money accounts | +| Transactions | Your transaction history, with optional filters | +| Payments | Send money to another X user, or ask another X user to pay you | +| Purchases | Pay a merchant online with an X Money virtual card | -The hosted server is the source of truth for the available actions. X Money enables actions per account, so the set can differ between users. +X Money decides which actions are available for each account, so the set can differ between users. + +## Approval + +Every action that moves money is confirmed with you first. Before sending money, requesting money, or paying a merchant, the agent shows an Approve / Cancel prompt that states exactly who, how much, and what for. Nothing happens until you approve, and each action needs its own approval. X Money also enforces this on its side and refuses any such call that was not approved. ## Skill -`skills/x-money-guide/SKILL.md` tells the agent how the connection works, how to guide a user through connect, reconnect, and revoke (**X → Money → Settings → Connections**), what each refusal means, and that every action that moves money needs a fresh approval. +`skills/x-money-guide/SKILL.md` gives the agent the approval rule above, the connection flow, how to guide you through connect, reconnect, and revoke, and what each X Money failure message means. ## Notes -- Payments and cards created through this server are live and move real money. -- Every action passes the same X Money checks as the app. X Money also enforces agent spending limits on top of your account limits. A refused action returns a message for the agent to relay and is not retried. -- Higher-risk transfers, such as bank transfers and large payments, are not available to agents and stay behind verification in the X app. -- Each virtual card works for exactly one merchant and one purchase. Card details are returned to the agent to complete checkout and are not shown in chat. +- Payments and purchases made through this plugin are live and move real money. +- Every action passes the same X Money checks as the app, plus separate limits for agents. When X Money refuses an action, the agent relays the reason and does not retry. +- Higher-risk transfers stay in the X app and are not available to agents. +- Card details used for a purchase go straight to the merchant checkout and are never shown in chat. - The agent never sees your X Money password, passkey, or bank credentials. ## Docs diff --git a/third_party/x-money/skills/x-money-guide/SKILL.md b/third_party/x-money/skills/x-money-guide/SKILL.md index 1779de23..6fbbe0d2 100644 --- a/third_party/x-money/skills/x-money-guide/SKILL.md +++ b/third_party/x-money/skills/x-money-guide/SKILL.md @@ -2,33 +2,39 @@ name: X Money guide description: >- Read this before the first X Money action in a session and again on any - X Money error, refusal, or missing capability. Covers how the connection - works (connection code plus passkey in the X app), how to walk the user - through connect, reconnect, and revoke at x.com/i/money/settings/connections, - what each refusal means, and the approval rule for any action that moves - money or creates a card. + X Money error, refusal, or missing capability. Covers the approval rule for + every action that moves money (always ask, every time, no exceptions), how + the connection works (connection code plus passkey in the X app), how to + guide the user through connect, reconnect, and revoke at + x.com/i/money/settings/connections, and what each failure message means. --- # X Money guide -This plugin uses the **X Money MCP** at `https://mcp.money.x.com/mcp`. The user connects once. The Cursor backend holds the tokens and refreshes them. The agent never sees tokens, card numbers in chat, passwords, or passkeys. +This plugin connects the agent to the user's X Money account through the **X Money MCP** at `https://mcp.money.x.com/mcp`. The user connects once in Grok Bot. From then on the Cursor backend holds the connection and the agent calls X Money on the user's behalf. -Discover the available actions from the server's tool list. The server is the source of truth for what the user can do and for every schema. Do not assume an action exists because it is mentioned here. +Discover what the user can do from the server's tool list. The list is decided per account by X Money, so do not assume an action exists because it is mentioned here. Every result carries a `message` written for the user. Relay it in your own words instead of describing internals. -## Approval rule +## Always confirm before moving money -Sending money, requesting money, and creating a virtual card move real money. Before each such call, ask the user for approval with a `SendToUser` widget that states the exact action in one sentence: amount, recipient or merchant, and purpose. Call the tool only after the user picks Approve. Never batch approvals. Never infer approval from an earlier message. +Some actions move real money or create a way to spend it: sending money, requesting money, and paying a merchant. For each one: -A tool result with `outcome: "refused"` is final. Relay its `message` to the user in plain words. Do not retry a refused call and do not change the amount to get around it. +1. **Ask first, every time.** Send a `SendToUser` widget with **Approve** and **Cancel**. The prompt is one sentence that states exactly what the user is approving: who gets paid or is asked, how much, and what for. For a purchase: the item, the merchant, and the total. Put the breakdown (items, shipping, tax, fees) in the help text. If the amount is an estimate, say so. +2. **Wait for the answer.** Call the tool only after the user picks Approve. If they pick Cancel, or do not answer, do nothing and say so. +3. **Approve one action at a time.** Never batch several payments under one approval. Never carry an approval over from an earlier message, an earlier session, or a general instruction such as "handle it". +4. **Re-ask when anything changes.** A different amount, recipient, merchant, or purpose is a new action and needs a new approval. +5. **Never fake it.** Every money-moving tool has an approval input. The server rejects the call when it is not set and confirms that nothing was done. Set it only after a real Approve in this conversation. + +Ask for balances and transactions freely. Those are read-only. ## How the connection works 1. The user taps **Connect** on the X Money plugin in Grok Bot. -2. A browser opens the X Money consent page. It shows a **connection code** and a QR code. -3. The user opens the code in the **X app** on the account that owns the X Money account, then approves with their **passkey**. -4. The consent page detects the approval and returns to Grok Bot. The connection is complete. +2. A page titled **Connect Grok Bot to X Money** opens. It shows a **connection code** and a QR code. +3. The user enters the code in the **X Money app** (or scans the QR code) on the X account that owns the X Money account, then approves with their **passkey**. +4. The page shows **Connected. You can return to Grok Bot.** and the connection completes on its own. -The connection code expires after **5 minutes**. Access tokens live 15 minutes and refresh automatically. The connection stays valid until the user revokes it or it goes unused for 45 days. +The code is valid for about 5 minutes. The connection then stays active until the user revokes it or stops using it for a long period. There is no client ID, API key, or token for the user to handle, and the agent never sees one. ## Connections screen @@ -36,87 +42,131 @@ The connection code expires after **5 minutes**. Access tokens live 15 minutes a Send the user here to: -- see which agents are connected to X Money, +- see which agents are connected to X Money and what each one can do, - revoke Grok Bot's access, - confirm that a connection they just approved is listed. -Revoking on this screen ends the connection immediately. The next Grok Bot call fails with an auth error and the user must connect again. +Revoking ends the connection at once. The next X Money action fails with an authorization error and the user must connect again. ## Troubleshooting -Match the situation, say the quoted line in your own voice, then give the one next step. Do not explain OAuth, tokens, or backend internals. +Match the situation, say the quoted line in your own voice, then give the one next step. Do not explain OAuth, tokens, grants, or the backend. + +### Not connected, or authorization error on a call + +Signals: X Money shows as needing authorization, no X Money tools are listed, or a call fails with `401` or `invalid bearer token`. -### Not connected, or auth error on a call +> Your X Money connection is not active. Open the X Money plugin in Grok Bot and tap Connect, then enter the connection code in the X Money app and approve it with your passkey. -Signals: no X Money tools in the tool list, `401`, `invalid_token`, `grant has been revoked`, `refresh token has expired`, `refresh token does not exist`. +If the user says they did not revoke anything, still reconnect. There is no other way to restore a connection. -> Your X Money connection is not active. Open the X Money plugin in Grok Bot and tap Connect, then approve the connection code in the X app with your passkey. +### "This code has expired. Start again from Grok Bot." -If the user says they did not revoke anything, still reconnect. A revoked or expired connection cannot be restored any other way. +The consent page says this after about 5 minutes. -### Connection code expired +> The connection code expired. Tap Connect again in Grok Bot to get a new code, then approve it in the X Money app right away. -Signal: the consent page says the code expired, or the user waited more than 5 minutes. +### "This connection was not approved." -> The connection code expired. Tap Connect again in Grok Bot to get a new code, then approve it in the X app within 5 minutes. +The user declined in the X Money app. -### Code rejected in the X app +> The connection was declined. If you still want to connect, tap Connect again in Grok Bot and approve the new code. -Signal: the X app says the code is invalid. +### "The connection code is invalid, expired, or already used." -Ask which X account they are signed into. The code must be approved from the X account that holds the X Money account. If it is the right account, tell them to restart from Connect. Codes are single-use and tied to one connection attempt. +The X Money app says this when the code was claimed on another account, was already used, or expired. + +Ask which X account they are signed into in the X Money app. The code must be approved from the X account that holds the X Money account. Each code works once. Tell them to start again from Connect. ### Passkey step fails -Signal: the X app cannot complete the passkey challenge. +The X Money app cannot complete the passkey challenge. > Approving an agent connection needs a passkey on your X account. Set one up in X → Settings → Security, then approve the connection again. -### New connections not accepted +### "New customer connections are not currently accepted." -Signal: `new customer connections are not currently accepted`. +The connection was approved but X Money did not activate it. This is a staged rollout, not an account problem. -> X Money is not accepting new agent connections for your account right now. This is a staged rollout, not a problem with your account. Try again later. +> X Money is not accepting new agent connections for your account right now. Try again later. Do not suggest workarounds. -### Action missing or "not ready for you yet" +### "Something went wrong. Refresh this page to try again." or "Something went wrong. Try again." + +A transient error on the consent page. -Signals: an action the user asks for has no matching tool while other X Money tools work, or a call returns `This X Money MCP tool isn't ready for you yet.` +> Refresh the page. If it fails again, tap Connect in Grok Bot to start over. + +### "This X Money MCP tool isn't ready for you yet." or an action is missing + +X Money enables actions per account. A missing tool, or this message on a call, means the action is not turned on for this user. > That X Money action is not enabled for your account yet. -Offer the actions that are present. Do not tell the user to reinstall or reconnect; the tool set is decided per account by X Money. +Offer the actions that are present. Do not tell the user to reinstall or reconnect. + +### "Not authorized to call tool" + +The user's role on the account does not allow this action, for example a member of a joint account. + +> Your X Money account does not allow that action from here. You can do it in the X Money app. + +### "MCP is not enabled" + +X Money has paused agent access for everyone. + +> X Money is temporarily unavailable to agents. Try again later. ### User has no X Money account -Signal: the consent page or the X app says the user cannot use X Money, or the user says they never set it up. +The consent page or the X Money app says the user cannot use X Money, or the user says they never set it up. > X Money is available to eligible customers in the United States. Set up X Money in the X app first, then connect it here. -## Refusals when sending or requesting money +## Reading payment results + +Every send or request returns an `outcome` and a `message`. -Relay the `message` from the result. Common ones and what to add: +| Outcome | Meaning | What to do | +| --- | --- | --- | +| `completed` | The money moved, or the request reached the other person | Relay the message | +| `pending` | X Money is reviewing it, or the other person has to act | Relay the message. Do not send again. The user can watch it in the X Money app | +| `refused` | X Money did not make it | Relay the message. **Never retry a refusal** and never change the amount to get around it | + +Common refusal messages and what to add: | Message contains | Add | | --- | --- | -| `verify this payment in the X Money app` | The user can send it themselves in the X app. Agents cannot complete verification steps. | -| `sending limits` or `Too many transfers` | Agent payments have their own daily caps on top of the account limits. Try again later or pay in the X app. | -| `balance is too low` | Check the balance and suggest a smaller amount, or adding funds in the X app. | -| `No X user named` | Confirm the @handle. Handles change; a numeric user id is more stable. | +| `verify this payment in the X Money app` | Agents cannot complete verification. The user can send it themselves in the X app. | +| `per-payment limit for agents` or `Agents can't move money for this account` | Agent payments have their own limits. The user can do this in the X Money app. | +| `sending limits` or `Too many transfers` | Try again later or pay in the X Money app. | +| `balance is too low` | Check the balance and offer a smaller amount, or adding funds in the X app. | +| `No X user named` | Confirm the @handle. Handles change; a numeric X user id is more stable. | +| `isn't on X Money yet` | The other person has to set up X Money before they can be paid or asked. | +| `own X account` | Pick another X user. | | `only accepts money from people they follow` | Nothing to fix from here. | -| `could not confirm` | Do not send again. Tell the user to check the transaction in the X app. | -| `Agents can't move money for this account right now` | Agent payments are switched off for this account. Pay in the X app. | +| `different currencies` or `can't receive` or `can't send` | Nothing to fix from here. Pay in the X Money app. | +| `X Money did not allow this payment` | X Money blocked it and gives no further reason. Do not retry. | + +Two results are not outcomes but errors, and both matter: + +- **`X Money could not process this right now; try again later`** — a transient failure. Nothing moved. Tell the user. Retry once later only if they still want it, with a fresh approval. +- **`X Money accepted this payment but could not confirm it. Do not send it again`** — the payment may have gone through. **Never send it again.** Tell the user to check the transaction in the X Money app. + +When you retry the very same payment after a network failure, reuse the same idempotency key so X Money never makes it twice. A reused key returns the earlier result and says so. -## Virtual cards +## Purchases with a card -- One card is valid for one merchant and one purchase. Never reuse a card or split a purchase across cards. -- A result that says the daily card count or spend is used up includes `limits_reset_at`. Tell the user when limits reset. Do not create another card. -- Card details go straight into the merchant checkout. Never print the card number, CVC, or expiry in chat. +- Approve the purchase itself: item, merchant, and total. The card X Money issues is not what the user approves. +- If the result says **no card was created** because a daily limit is reached, it names when limits reset. Tell the user and stop. Do not try again today. +- `failed to create card, try again` is transient. One retry is fine, with the same approval. +- Card details go straight into the merchant checkout. Never print the card number, CVC, or expiry in chat, and never store them. -## What not to do +## Never - Never ask the user for an X Money password, passkey, card number, or bank login. - Never ask the user to paste a token or code into chat. -- Never retry a `401`, a refusal, or a limits result unchanged. -- Never move money without a fresh approval for that exact action. +- Never move money, request money, or create a card without a fresh approval for that exact action. +- Never retry a refusal, an unconfirmed payment, or a limit result. +- Never explain tokens, grants, or the backend. Name the situation and the next step. From dcd2269592c6ce37ab4f0540a17aa65714a62c6d Mon Sep 17 00:00:00 2001 From: Asad Salman Date: Tue, 22 Sep 2026 15:06:24 -0400 Subject: [PATCH 6/9] Drop single-use from plugin description --- .cursor-plugin/marketplace.json | 2 +- README.md | 2 +- third_party/x-money/.cursor-plugin/plugin.json | 2 +- third_party/x-money/README.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index f9709c68..c78028b5 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -441,7 +441,7 @@ { "name": "x-money", "source": "third_party/x-money", - "description": "Check balances, review transactions, send and request money on X, and pay online with a single-use virtual card." + "description": "Check balances, review transactions, send and request money on X, and pay online with an X Money virtual card." } ] } diff --git a/README.md b/README.md index 81665890..52b6d68b 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `statsig` | [Statsig](third_party/statsig/) | Cursor | Integrations | Inspect and manage feature gates, experiments, dynamic configs, and metrics. | | `robinhood` | [Robinhood](third_party/robinhood/) | Cursor | Integrations | View portfolios, positions, orders, watchlists, and market data, and trade in a Robinhood Agentic account. | | `coinbase` | [Coinbase](third_party/coinbase/) | Cursor | Integrations | Check balances, get quotes, and preview or place trades. | -| `x-money` | [X Money](third_party/x-money/) | Cursor | Integrations | Check balances, review transactions, send and request money on X, and pay online with a single-use virtual card. | +| `x-money` | [X Money](third_party/x-money/) | Cursor | Integrations | Check balances, review transactions, send and request money on X, and pay online with an X Money virtual card. | Author values match each plugin’s `plugin.json` `author.name` (Cursor lists `plugins@cursor.com` in the manifest). ## Repository structure diff --git a/third_party/x-money/.cursor-plugin/plugin.json b/third_party/x-money/.cursor-plugin/plugin.json index ddcae575..5597d3cc 100644 --- a/third_party/x-money/.cursor-plugin/plugin.json +++ b/third_party/x-money/.cursor-plugin/plugin.json @@ -7,7 +7,7 @@ "grokbot": "0.52.0", "sand": "0.52.0" }, - "description": "Check balances, review transactions, send and request money on X, and pay online with a single-use virtual card.", + "description": "Check balances, review transactions, send and request money on X, and pay online with an X Money virtual card.", "author": { "name": "Cursor", "email": "plugins@cursor.com" diff --git a/third_party/x-money/README.md b/third_party/x-money/README.md index e73f9a16..adab8176 100644 --- a/third_party/x-money/README.md +++ b/third_party/x-money/README.md @@ -2,7 +2,7 @@ Grok Bot plugin that connects agents to [X Money](https://x.com/i/money) through X Money's hosted [Model Context Protocol](https://modelcontextprotocol.io/) server at `https://mcp.money.x.com/mcp`. -Check balances, review transactions, send and request money on X, and pay online with a single-use virtual card. +Check balances, review transactions, send and request money on X, and pay online with an X Money virtual card. ## Who can use it From 23b57468d14fa9cdfe8a78b77ce934f3ea13645e Mon Sep 17 00:00:00 2001 From: Asad Salman Date: Tue, 22 Sep 2026 15:10:50 -0400 Subject: [PATCH 7/9] Update X Money plugin description --- .cursor-plugin/marketplace.json | 2 +- README.md | 2 +- third_party/x-money/.cursor-plugin/plugin.json | 2 +- third_party/x-money/README.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index c78028b5..4119d58f 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -441,7 +441,7 @@ { "name": "x-money", "source": "third_party/x-money", - "description": "Check balances, review transactions, send and request money on X, and pay online with an X Money virtual card." + "description": "Use your X Money Card, send money to users on X, manage your finances, view your balance and browse through your transaction history." } ] } diff --git a/README.md b/README.md index 52b6d68b..5d50cd1c 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `statsig` | [Statsig](third_party/statsig/) | Cursor | Integrations | Inspect and manage feature gates, experiments, dynamic configs, and metrics. | | `robinhood` | [Robinhood](third_party/robinhood/) | Cursor | Integrations | View portfolios, positions, orders, watchlists, and market data, and trade in a Robinhood Agentic account. | | `coinbase` | [Coinbase](third_party/coinbase/) | Cursor | Integrations | Check balances, get quotes, and preview or place trades. | -| `x-money` | [X Money](third_party/x-money/) | Cursor | Integrations | Check balances, review transactions, send and request money on X, and pay online with an X Money virtual card. | +| `x-money` | [X Money](third_party/x-money/) | Cursor | Integrations | Use your X Money Card, send money to users on X, manage your finances, view your balance and browse through your transaction history. | Author values match each plugin’s `plugin.json` `author.name` (Cursor lists `plugins@cursor.com` in the manifest). ## Repository structure diff --git a/third_party/x-money/.cursor-plugin/plugin.json b/third_party/x-money/.cursor-plugin/plugin.json index 5597d3cc..212d990b 100644 --- a/third_party/x-money/.cursor-plugin/plugin.json +++ b/third_party/x-money/.cursor-plugin/plugin.json @@ -7,7 +7,7 @@ "grokbot": "0.52.0", "sand": "0.52.0" }, - "description": "Check balances, review transactions, send and request money on X, and pay online with an X Money virtual card.", + "description": "Use your X Money Card, send money to users on X, manage your finances, view your balance and browse through your transaction history.", "author": { "name": "Cursor", "email": "plugins@cursor.com" diff --git a/third_party/x-money/README.md b/third_party/x-money/README.md index adab8176..69d6fb0b 100644 --- a/third_party/x-money/README.md +++ b/third_party/x-money/README.md @@ -2,7 +2,7 @@ Grok Bot plugin that connects agents to [X Money](https://x.com/i/money) through X Money's hosted [Model Context Protocol](https://modelcontextprotocol.io/) server at `https://mcp.money.x.com/mcp`. -Check balances, review transactions, send and request money on X, and pay online with an X Money virtual card. +Use your X Money Card, send money to users on X, manage your finances, view your balance and browse through your transaction history. ## Who can use it From f3ed2f379fa79385038d36102d546c2d3cce449a Mon Sep 17 00:00:00 2001 From: Asad Salman Date: Tue, 22 Sep 2026 15:13:17 -0400 Subject: [PATCH 8/9] Remove backend mentions from skill --- third_party/x-money/skills/x-money-guide/SKILL.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/third_party/x-money/skills/x-money-guide/SKILL.md b/third_party/x-money/skills/x-money-guide/SKILL.md index 6fbbe0d2..a40a4512 100644 --- a/third_party/x-money/skills/x-money-guide/SKILL.md +++ b/third_party/x-money/skills/x-money-guide/SKILL.md @@ -11,7 +11,7 @@ description: >- # X Money guide -This plugin connects the agent to the user's X Money account through the **X Money MCP** at `https://mcp.money.x.com/mcp`. The user connects once in Grok Bot. From then on the Cursor backend holds the connection and the agent calls X Money on the user's behalf. +This plugin connects the agent to the user's X Money account through the **X Money MCP** at `https://mcp.money.x.com/mcp`. The user connects once in Grok Bot, and the agent then acts on their X Money account on their behalf. Discover what the user can do from the server's tool list. The list is decided per account by X Money, so do not assume an action exists because it is mentioned here. Every result carries a `message` written for the user. Relay it in your own words instead of describing internals. @@ -50,7 +50,7 @@ Revoking ends the connection at once. The next X Money action fails with an auth ## Troubleshooting -Match the situation, say the quoted line in your own voice, then give the one next step. Do not explain OAuth, tokens, grants, or the backend. +Match the situation, say the quoted line in your own voice, then give the one next step. Do not explain OAuth, tokens, or how the connection works internally. ### Not connected, or authorization error on a call @@ -169,4 +169,4 @@ When you retry the very same payment after a network failure, reuse the same ide - Never ask the user to paste a token or code into chat. - Never move money, request money, or create a card without a fresh approval for that exact action. - Never retry a refusal, an unconfirmed payment, or a limit result. -- Never explain tokens, grants, or the backend. Name the situation and the next step. +- Never explain tokens or how the connection works internally. Name the situation and the next step. From 142e5e74435465991805612bcfc3f32127e15b4a Mon Sep 17 00:00:00 2001 From: Asad Salman Date: Tue, 22 Sep 2026 15:35:09 -0400 Subject: [PATCH 9/9] Gate x-money marketplace entry to Grok Bot --- .cursor-plugin/marketplace.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 4119d58f..5278c154 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -441,7 +441,12 @@ { "name": "x-money", "source": "third_party/x-money", - "description": "Use your X Money Card, send money to users on X, manage your finances, view your balance and browse through your transaction history." + "description": "Use your X Money Card, send money to users on X, manage your finances, view your balance and browse through your transaction history.", + "minClientVersions": { + "cursor": "never", + "grokbot": "0.52.0", + "sand": "0.52.0" + } } ] }