From 3f44ff568693588e1f315ac3e397f6d4e2e68474 Mon Sep 17 00:00:00 2001 From: Jason Ma Date: Wed, 9 Sep 2026 18:11:22 -0400 Subject: [PATCH 01/10] Add Teams and SharePoint third-party MCP plugins. Register the Microsoft Teams and SharePoint REST-MCP endpoints the same way Outlook is wired, so they can be installed from the marketplace. Co-authored-by: Cursor --- .cursor-plugin/marketplace.json | 10 +++++ README.md | 2 + .../sharepoint/.cursor-plugin/plugin.json | 33 +++++++++++++++ third_party/sharepoint/CHANGELOG.md | 8 ++++ third_party/sharepoint/LICENSE | 21 ++++++++++ third_party/sharepoint/README.md | 40 +++++++++++++++++++ third_party/sharepoint/assets/logo.svg | 1 + third_party/sharepoint/mcp.json | 8 ++++ third_party/teams/.cursor-plugin/plugin.json | 33 +++++++++++++++ third_party/teams/CHANGELOG.md | 8 ++++ third_party/teams/LICENSE | 21 ++++++++++ third_party/teams/README.md | 40 +++++++++++++++++++ third_party/teams/assets/logo.svg | 1 + third_party/teams/mcp.json | 8 ++++ 14 files changed, 234 insertions(+) create mode 100644 third_party/sharepoint/.cursor-plugin/plugin.json create mode 100644 third_party/sharepoint/CHANGELOG.md create mode 100644 third_party/sharepoint/LICENSE create mode 100644 third_party/sharepoint/README.md create mode 100644 third_party/sharepoint/assets/logo.svg create mode 100644 third_party/sharepoint/mcp.json create mode 100644 third_party/teams/.cursor-plugin/plugin.json create mode 100644 third_party/teams/CHANGELOG.md create mode 100644 third_party/teams/LICENSE create mode 100644 third_party/teams/README.md create mode 100644 third_party/teams/assets/logo.svg create mode 100644 third_party/teams/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 9cb30e8b9..54b616ac5 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -333,6 +333,16 @@ "source": "third_party/onedrive", "description": "Browse, search, and read Microsoft OneDrive files." }, + { + "name": "teams", + "source": "third_party/teams", + "description": "Search, read, and send Microsoft Teams chats and channel messages." + }, + { + "name": "sharepoint", + "source": "third_party/sharepoint", + "description": "Search SharePoint sites, browse document libraries, and read lists." + }, { "name": "x-ads", "source": "third_party/x-ads", diff --git a/README.md b/README.md index 32103e163..987fb92ca 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,8 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `x-ads` | [X Ads](third_party/x-ads/) | Cursor | Integrations | Manage ad campaigns, create ads, track conversions, and pull performance stats. | | `attio` | [Attio](third_party/attio/) | Cursor | Integrations | Search and update CRM records, lists, notes, and tasks. | | `hunter` | [Hunter](third_party/hunter/) | Cursor | Integrations | Find and verify emails, discover companies, and save leads. | +| `teams` | [Teams](third_party/teams/) | Cursor | Productivity | Search, read, and send Microsoft Teams chats and channel messages. | +| `sharepoint` | [SharePoint](third_party/sharepoint/) | Cursor | Productivity | Search SharePoint sites, browse document libraries, and read lists. | 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/sharepoint/.cursor-plugin/plugin.json b/third_party/sharepoint/.cursor-plugin/plugin.json new file mode 100644 index 000000000..b5effe74e --- /dev/null +++ b/third_party/sharepoint/.cursor-plugin/plugin.json @@ -0,0 +1,33 @@ +{ + "name": "sharepoint", + "displayName": "SharePoint", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.19.0", + "sand": "0.30.0" + }, + "description": "Search SharePoint sites, browse document libraries, and read lists.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://github.com/cursor/plugins/tree/main/third_party/sharepoint", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.svg", + "keywords": [ + "sharepoint", + "sites", + "microsoft", + "mcp", + "documents" + ], + "category": "productivity", + "tags": [ + "sharepoint", + "documents", + "mcp", + "microsoft-365" + ], + "mcpServers": "./mcp.json" +} diff --git a/third_party/sharepoint/CHANGELOG.md b/third_party/sharepoint/CHANGELOG.md new file mode 100644 index 000000000..368c90f5b --- /dev/null +++ b/third_party/sharepoint/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Logo: official Microsoft SharePoint product icon from Microsoft's Fluent brand icon CDN, on a padded white tile. +- Added the `sharepoint` MCP server pointing at `https://api.cursor.com/rest-mcp/sharepoint/mcp`. diff --git a/third_party/sharepoint/LICENSE b/third_party/sharepoint/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/sharepoint/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/sharepoint/README.md b/third_party/sharepoint/README.md new file mode 100644 index 000000000..985f89539 --- /dev/null +++ b/third_party/sharepoint/README.md @@ -0,0 +1,40 @@ +# SharePoint + +Cursor plugin that connects agents to [Microsoft SharePoint](https://www.microsoft.com/microsoft-365/sharepoint) through Cursor's remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Search sites, browse document libraries, and read list items in the signed-in Microsoft account. + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **SharePoint**. +3. Click **Install**, then complete the Microsoft sign-in prompt. + +Or run `/add-plugin sharepoint` in chat. + +## MCP + +```json +{ + "mcpServers": { + "sharepoint": { + "type": "http", + "url": "https://api.cursor.com/rest-mcp/sharepoint/mcp" + } + } +} +``` + +Auth is OAuth 2.0 against Microsoft (Entra ID). Cursor prompts for Microsoft sign-in when the plugin connects. + +## Docs + +- SharePoint API (Microsoft Graph): https://learn.microsoft.com/en-us/graph/api/resources/sharepoint +- Microsoft Graph overview: https://learn.microsoft.com/en-us/graph/overview + +Logo is the official Microsoft SharePoint product icon from Microsoft's Fluent brand icon CDN, placed on a white tile with padding so it reads well in the Cursor UI: +https://res-1.cdn.office.net/files/fabric-cdn-prod_20240411.001/assets/brand-icons/product/svg/sharepoint_48x1.svg + +## License + +MIT diff --git a/third_party/sharepoint/assets/logo.svg b/third_party/sharepoint/assets/logo.svg new file mode 100644 index 000000000..6700dbf7f --- /dev/null +++ b/third_party/sharepoint/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/third_party/sharepoint/mcp.json b/third_party/sharepoint/mcp.json new file mode 100644 index 000000000..5e3b1a4ca --- /dev/null +++ b/third_party/sharepoint/mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "sharepoint": { + "type": "http", + "url": "https://api.cursor.com/rest-mcp/sharepoint/mcp" + } + } +} diff --git a/third_party/teams/.cursor-plugin/plugin.json b/third_party/teams/.cursor-plugin/plugin.json new file mode 100644 index 000000000..cb78a4ca5 --- /dev/null +++ b/third_party/teams/.cursor-plugin/plugin.json @@ -0,0 +1,33 @@ +{ + "name": "teams", + "displayName": "Teams", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.19.0", + "sand": "0.30.0" + }, + "description": "Search, read, and send Microsoft Teams chats and channel messages.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://github.com/cursor/plugins/tree/main/third_party/teams", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.svg", + "keywords": [ + "teams", + "chat", + "microsoft", + "mcp", + "channels" + ], + "category": "productivity", + "tags": [ + "teams", + "chat", + "mcp", + "microsoft-365" + ], + "mcpServers": "./mcp.json" +} diff --git a/third_party/teams/CHANGELOG.md b/third_party/teams/CHANGELOG.md new file mode 100644 index 000000000..d0b979189 --- /dev/null +++ b/third_party/teams/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Logo: official Microsoft Teams product icon from Microsoft's Fluent brand icon CDN, on a padded white tile. +- Added the `teams` MCP server pointing at `https://api.cursor.com/rest-mcp/teams/mcp`. diff --git a/third_party/teams/LICENSE b/third_party/teams/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/teams/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/teams/README.md b/third_party/teams/README.md new file mode 100644 index 000000000..015b5db69 --- /dev/null +++ b/third_party/teams/README.md @@ -0,0 +1,40 @@ +# Teams + +Cursor plugin that connects agents to [Microsoft Teams](https://www.microsoft.com/microsoft-teams) through Cursor's remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Search chats and channel messages, read conversations, send messages, and react in the signed-in Microsoft account. + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **Teams**. +3. Click **Install**, then complete the Microsoft sign-in prompt. + +Or run `/add-plugin teams` in chat. + +## MCP + +```json +{ + "mcpServers": { + "teams": { + "type": "http", + "url": "https://api.cursor.com/rest-mcp/teams/mcp" + } + } +} +``` + +Auth is OAuth 2.0 against Microsoft (Entra ID). Cursor prompts for Microsoft sign-in when the plugin connects. A work or school account is required. Reading channel messages needs tenant admin consent before the plugin can connect. + +## Docs + +- Teams API (Microsoft Graph): https://learn.microsoft.com/en-us/graph/api/resources/teams-api-overview +- Microsoft Graph overview: https://learn.microsoft.com/en-us/graph/overview + +Logo is the official Microsoft Teams product icon from Microsoft's Fluent brand icon CDN, placed on a white tile with padding so it reads well in the Cursor UI: +https://res-1.cdn.office.net/files/fabric-cdn-prod_20240411.001/assets/brand-icons/product/svg/teams_48x1.svg + +## License + +MIT diff --git a/third_party/teams/assets/logo.svg b/third_party/teams/assets/logo.svg new file mode 100644 index 000000000..b9e62e31e --- /dev/null +++ b/third_party/teams/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/third_party/teams/mcp.json b/third_party/teams/mcp.json new file mode 100644 index 000000000..8c3264da5 --- /dev/null +++ b/third_party/teams/mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "teams": { + "type": "http", + "url": "https://api.cursor.com/rest-mcp/teams/mcp" + } + } +} From 413a0d5f0f2c7556e1d66bc5b59c1033e0606643 Mon Sep 17 00:00:00 2001 From: Jason Ma Date: Wed, 9 Sep 2026 22:50:16 -0400 Subject: [PATCH 02/10] Drop the SharePoint plugin from this change. Keep only the Teams REST-MCP plugin so SharePoint can land separately. Co-authored-by: Cursor --- .cursor-plugin/marketplace.json | 5 --- README.md | 1 - .../sharepoint/.cursor-plugin/plugin.json | 33 --------------- third_party/sharepoint/CHANGELOG.md | 8 ---- third_party/sharepoint/LICENSE | 21 ---------- third_party/sharepoint/README.md | 40 ------------------- third_party/sharepoint/assets/logo.svg | 1 - third_party/sharepoint/mcp.json | 8 ---- 8 files changed, 117 deletions(-) delete mode 100644 third_party/sharepoint/.cursor-plugin/plugin.json delete mode 100644 third_party/sharepoint/CHANGELOG.md delete mode 100644 third_party/sharepoint/LICENSE delete mode 100644 third_party/sharepoint/README.md delete mode 100644 third_party/sharepoint/assets/logo.svg delete mode 100644 third_party/sharepoint/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 54b616ac5..0055eab23 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -338,11 +338,6 @@ "source": "third_party/teams", "description": "Search, read, and send Microsoft Teams chats and channel messages." }, - { - "name": "sharepoint", - "source": "third_party/sharepoint", - "description": "Search SharePoint sites, browse document libraries, and read lists." - }, { "name": "x-ads", "source": "third_party/x-ads", diff --git a/README.md b/README.md index 987fb92ca..3838d7e2f 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,6 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `attio` | [Attio](third_party/attio/) | Cursor | Integrations | Search and update CRM records, lists, notes, and tasks. | | `hunter` | [Hunter](third_party/hunter/) | Cursor | Integrations | Find and verify emails, discover companies, and save leads. | | `teams` | [Teams](third_party/teams/) | Cursor | Productivity | Search, read, and send Microsoft Teams chats and channel messages. | -| `sharepoint` | [SharePoint](third_party/sharepoint/) | Cursor | Productivity | Search SharePoint sites, browse document libraries, and read lists. | 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/sharepoint/.cursor-plugin/plugin.json b/third_party/sharepoint/.cursor-plugin/plugin.json deleted file mode 100644 index b5effe74e..000000000 --- a/third_party/sharepoint/.cursor-plugin/plugin.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "sharepoint", - "displayName": "SharePoint", - "version": "1.0.0", - "minClientVersions": { - "cursor": "3.19.0", - "sand": "0.30.0" - }, - "description": "Search SharePoint sites, browse document libraries, and read lists.", - "author": { - "name": "Cursor", - "email": "plugins@cursor.com" - }, - "homepage": "https://github.com/cursor/plugins/tree/main/third_party/sharepoint", - "repository": "https://github.com/cursor/plugins", - "license": "MIT", - "logo": "assets/logo.svg", - "keywords": [ - "sharepoint", - "sites", - "microsoft", - "mcp", - "documents" - ], - "category": "productivity", - "tags": [ - "sharepoint", - "documents", - "mcp", - "microsoft-365" - ], - "mcpServers": "./mcp.json" -} diff --git a/third_party/sharepoint/CHANGELOG.md b/third_party/sharepoint/CHANGELOG.md deleted file mode 100644 index 368c90f5b..000000000 --- a/third_party/sharepoint/CHANGELOG.md +++ /dev/null @@ -1,8 +0,0 @@ -# Changelog - -All notable changes to this plugin will be documented here. - -## 1.0.0 — initial release - -- Logo: official Microsoft SharePoint product icon from Microsoft's Fluent brand icon CDN, on a padded white tile. -- Added the `sharepoint` MCP server pointing at `https://api.cursor.com/rest-mcp/sharepoint/mcp`. diff --git a/third_party/sharepoint/LICENSE b/third_party/sharepoint/LICENSE deleted file mode 100644 index ca2bba771..000000000 --- a/third_party/sharepoint/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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/sharepoint/README.md b/third_party/sharepoint/README.md deleted file mode 100644 index 985f89539..000000000 --- a/third_party/sharepoint/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# SharePoint - -Cursor plugin that connects agents to [Microsoft SharePoint](https://www.microsoft.com/microsoft-365/sharepoint) through Cursor's remote [Model Context Protocol](https://modelcontextprotocol.io/) server. - -Search sites, browse document libraries, and read list items in the signed-in Microsoft account. - -## Install - -1. Open **Cursor Settings → Plugins**. -2. Search for **SharePoint**. -3. Click **Install**, then complete the Microsoft sign-in prompt. - -Or run `/add-plugin sharepoint` in chat. - -## MCP - -```json -{ - "mcpServers": { - "sharepoint": { - "type": "http", - "url": "https://api.cursor.com/rest-mcp/sharepoint/mcp" - } - } -} -``` - -Auth is OAuth 2.0 against Microsoft (Entra ID). Cursor prompts for Microsoft sign-in when the plugin connects. - -## Docs - -- SharePoint API (Microsoft Graph): https://learn.microsoft.com/en-us/graph/api/resources/sharepoint -- Microsoft Graph overview: https://learn.microsoft.com/en-us/graph/overview - -Logo is the official Microsoft SharePoint product icon from Microsoft's Fluent brand icon CDN, placed on a white tile with padding so it reads well in the Cursor UI: -https://res-1.cdn.office.net/files/fabric-cdn-prod_20240411.001/assets/brand-icons/product/svg/sharepoint_48x1.svg - -## License - -MIT diff --git a/third_party/sharepoint/assets/logo.svg b/third_party/sharepoint/assets/logo.svg deleted file mode 100644 index 6700dbf7f..000000000 --- a/third_party/sharepoint/assets/logo.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/third_party/sharepoint/mcp.json b/third_party/sharepoint/mcp.json deleted file mode 100644 index 5e3b1a4ca..000000000 --- a/third_party/sharepoint/mcp.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "mcpServers": { - "sharepoint": { - "type": "http", - "url": "https://api.cursor.com/rest-mcp/sharepoint/mcp" - } - } -} From 5229aad76c37451561c5b81a9b5072ae1c549a5b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 10 Sep 2026 19:49:45 +0000 Subject: [PATCH 03/10] Add an empty Finance plugin that mirrors the Grok connector. The card has no skills or MCP server. It requires Grok Bot 0.49 and is never allowed in Cursor, so the backend can handle the connection itself. Co-authored-by: Alex Vandak Maloney --- .cursor-plugin/marketplace.json | 10 ++++++ README.md | 1 + schemas/marketplace.schema.json | 23 ++++++++++--- schemas/plugin.schema.json | 23 ++++++++++--- .../finance/.cursor-plugin/plugin.json | 34 +++++++++++++++++++ third_party/finance/CHANGELOG.md | 9 +++++ third_party/finance/LICENSE | 21 ++++++++++++ third_party/finance/README.md | 24 +++++++++++++ third_party/finance/assets/logo.svg | 13 +++++++ 9 files changed, 150 insertions(+), 8 deletions(-) create mode 100644 third_party/finance/.cursor-plugin/plugin.json create mode 100644 third_party/finance/CHANGELOG.md create mode 100644 third_party/finance/LICENSE create mode 100644 third_party/finance/README.md create mode 100644 third_party/finance/assets/logo.svg diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index e0839548e..9ce7dd99b 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -338,6 +338,16 @@ "source": "third_party/teams", "description": "Search, read, and send Microsoft Teams chats and channel messages." }, + { + "name": "finance", + "source": "third_party/finance", + "description": "Securely connect your accounts so Grok can help with questions about your spending, subscriptions, balances, and investments.", + "minClientVersions": { + "cursor": "never", + "grokbot": "0.49.0", + "sand": "0.49.0" + } + }, { "name": "x-ads", "source": "third_party/x-ads", diff --git a/README.md b/README.md index c239f8564..1e3394220 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `hunter` | [Hunter](third_party/hunter/) | Cursor | Integrations | Find and verify emails, discover companies, and save leads. | | `gamma` | [Gamma](third_party/gamma/) | Cursor | Integrations | Generate presentations, documents, and webpages. | | `teams` | [Teams](third_party/teams/) | Cursor | Productivity | Search, read, and send Microsoft Teams chats and channel messages. | +| `finance` | [Finance](third_party/finance/) | Cursor | Integrations | Securely connect your accounts so Grok can help with questions about your spending, subscriptions, balances, and investments. | Author values match each plugin’s `plugin.json` `author.name` (Cursor lists `plugins@cursor.com` in the manifest). ## Repository structure diff --git a/schemas/marketplace.schema.json b/schemas/marketplace.schema.json index a3ca579a0..8d69bb1c8 100644 --- a/schemas/marketplace.schema.json +++ b/schemas/marketplace.schema.json @@ -82,15 +82,30 @@ "minProperties": 1, "properties": { "cursor": { - "$ref": "#/$defs/semver", - "description": "Minimum Cursor version required to install the plugin (e.g. \"3.13.0\")." + "$ref": "#/$defs/clientVersionRequirement", + "description": "Minimum Cursor version required to install the plugin (e.g. \"3.13.0\"), or \"never\" to hide it from Cursor entirely." + }, + "grokbot": { + "$ref": "#/$defs/clientVersionRequirement", + "description": "Minimum Grok Bot version required to install the plugin (e.g. \"0.49.0\"), or \"never\" to hide it from Grok Bot entirely." + }, + "sand": { + "$ref": "#/$defs/clientVersionRequirement", + "description": "Deprecated client id for Grok Bot. Same meaning as grokbot." } }, "additionalProperties": { - "$ref": "#/$defs/semver", - "description": "Minimum version required for another client identifier." + "$ref": "#/$defs/clientVersionRequirement", + "description": "Minimum version required for another client identifier, or \"never\" to hide the plugin from that client." } }, + "clientVersionRequirement": { + "description": "A minimum semantic version, or the literal \"never\" when that client must not list or install the plugin.", + "oneOf": [ + { "$ref": "#/$defs/semver" }, + { "const": "never" } + ] + }, "semver": { "type": "string", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?$", diff --git a/schemas/plugin.schema.json b/schemas/plugin.schema.json index 51d4e3f15..02903d117 100644 --- a/schemas/plugin.schema.json +++ b/schemas/plugin.schema.json @@ -139,15 +139,30 @@ "minProperties": 1, "properties": { "cursor": { - "$ref": "#/$defs/semver", - "description": "Minimum Cursor version required to install the plugin (e.g. \"3.13.0\")." + "$ref": "#/$defs/clientVersionRequirement", + "description": "Minimum Cursor version required to install the plugin (e.g. \"3.13.0\"), or \"never\" to hide it from Cursor entirely." + }, + "grokbot": { + "$ref": "#/$defs/clientVersionRequirement", + "description": "Minimum Grok Bot version required to install the plugin (e.g. \"0.49.0\"), or \"never\" to hide it from Grok Bot entirely." + }, + "sand": { + "$ref": "#/$defs/clientVersionRequirement", + "description": "Deprecated client id for Grok Bot. Same meaning as grokbot." } }, "additionalProperties": { - "$ref": "#/$defs/semver", - "description": "Minimum version required for another client identifier." + "$ref": "#/$defs/clientVersionRequirement", + "description": "Minimum version required for another client identifier, or \"never\" to hide the plugin from that client." } }, + "clientVersionRequirement": { + "description": "A minimum semantic version, or the literal \"never\" when that client must not list or install the plugin.", + "oneOf": [ + { "$ref": "#/$defs/semver" }, + { "const": "never" } + ] + }, "semver": { "type": "string", "pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?$", diff --git a/third_party/finance/.cursor-plugin/plugin.json b/third_party/finance/.cursor-plugin/plugin.json new file mode 100644 index 000000000..08131ffaa --- /dev/null +++ b/third_party/finance/.cursor-plugin/plugin.json @@ -0,0 +1,34 @@ +{ + "name": "finance", + "displayName": "Finance", + "version": "1.0.0", + "minClientVersions": { + "cursor": "never", + "grokbot": "0.49.0", + "sand": "0.49.0" + }, + "description": "Securely connect your accounts so Grok can help with questions about your spending, subscriptions, balances, and investments.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://grok.com/connectors", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.svg", + "keywords": [ + "finance", + "accounts", + "spending", + "subscriptions", + "balances", + "investments", + "grok" + ], + "category": "integrations", + "tags": [ + "finance", + "accounts", + "grok" + ] +} diff --git a/third_party/finance/CHANGELOG.md b/third_party/finance/CHANGELOG.md new file mode 100644 index 000000000..9bda42072 --- /dev/null +++ b/third_party/finance/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added an empty Finance marketplace card that mirrors the Grok Finance connector. +- No skills and no connector are bundled. The Cursor backend handles this plugin. +- Requires Grok Bot 0.49 or newer, and is never allowed in Cursor. diff --git a/third_party/finance/LICENSE b/third_party/finance/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/finance/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/finance/README.md b/third_party/finance/README.md new file mode 100644 index 000000000..ca969fbf4 --- /dev/null +++ b/third_party/finance/README.md @@ -0,0 +1,24 @@ +# Finance + +Marketplace mirror of the Grok **Finance** connector. + +Securely connect your accounts so Grok can help with questions about your spending, subscriptions, balances, and investments. + +This plugin is empty on purpose. It has no skills and no connector of its own. The Cursor backend handles this plugin specially and talks to the Finance connector there. + +## Who can use it + +- Grok Bot **0.49** or newer. +- Not available in Cursor. Cursor must not list or install this plugin. + +## About this connector + +- **See your finances in chat.** Ask about balances, recent spending, subscriptions, and investments across linked accounts. +- **Your credentials stay private.** xAI does not store or view any bank account or password credentials. +- **Read-only access.** A financial connection is read-only, which means it can't be used to move money into or out of bank accounts. + +Third-party connectors are not built or maintained by xAI. Use caution when granting access to external services. Review the permissions before connecting. Usage is subject to the [xAI Privacy Policy](https://x.ai/legal/privacy-policy). + +## License + +MIT diff --git a/third_party/finance/assets/logo.svg b/third_party/finance/assets/logo.svg new file mode 100644 index 000000000..f1a362968 --- /dev/null +++ b/third_party/finance/assets/logo.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + From 36392841f16a1380163e46311b79be42e2c7578e Mon Sep 17 00:00:00 2001 From: Minu Palaniappan Date: Thu, 10 Sep 2026 13:14:47 -0700 Subject: [PATCH 04/10] feat(third_party): add Webull plugin --- .cursor-plugin/marketplace.json | 5 ++ README.md | 1 + third_party/webull/.cursor-plugin/plugin.json | 35 ++++++++++ third_party/webull/CHANGELOG.md | 9 +++ third_party/webull/LICENSE | 21 ++++++ third_party/webull/README.md | 60 ++++++++++++++++++ third_party/webull/assets/logo.png | Bin 0 -> 6600 bytes third_party/webull/mcp.json | 8 +++ 8 files changed, 139 insertions(+) create mode 100644 third_party/webull/.cursor-plugin/plugin.json create mode 100644 third_party/webull/CHANGELOG.md create mode 100644 third_party/webull/LICENSE create mode 100644 third_party/webull/README.md create mode 100644 third_party/webull/assets/logo.png create mode 100644 third_party/webull/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 9ce7dd99b..01be4f893 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -367,6 +367,11 @@ "name": "gamma", "source": "third_party/gamma", "description": "Generate presentations, documents, and webpages." + }, + { + "name": "webull", + "source": "third_party/webull", + "description": "View accounts, positions, orders, watchlists, and market data." } ] } diff --git a/README.md b/README.md index 1e3394220..4bde54600 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `gamma` | [Gamma](third_party/gamma/) | Cursor | Integrations | Generate presentations, documents, and webpages. | | `teams` | [Teams](third_party/teams/) | Cursor | Productivity | Search, read, and send Microsoft Teams chats and channel messages. | | `finance` | [Finance](third_party/finance/) | Cursor | Integrations | Securely connect your accounts so Grok can help with questions about your spending, subscriptions, balances, and investments. | +| `webull` | [Webull](third_party/webull/) | Cursor | Integrations | View accounts, positions, orders, watchlists, and market data. | 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/webull/.cursor-plugin/plugin.json b/third_party/webull/.cursor-plugin/plugin.json new file mode 100644 index 000000000..59fa82fa4 --- /dev/null +++ b/third_party/webull/.cursor-plugin/plugin.json @@ -0,0 +1,35 @@ +{ + "name": "webull", + "displayName": "Webull", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.13.0" + }, + "description": "View accounts, positions, orders, watchlists, and market data.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://developer.webull.com/apis/docs/AI-friendly-Resources/mcp/", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "webull", + "brokerage", + "trading", + "portfolio", + "quotes", + "watchlists", + "market data", + "mcp" + ], + "category": "integrations", + "tags": [ + "webull", + "finance", + "trading", + "mcp" + ], + "mcpServers": "./mcp.json" +} diff --git a/third_party/webull/CHANGELOG.md b/third_party/webull/CHANGELOG.md new file mode 100644 index 000000000..9997049a3 --- /dev/null +++ b/third_party/webull/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `webull` MCP server pointing at Webull's hosted Streamable HTTP endpoint (`https://api.webull.com/mcp`). +- Auth uses OAuth with Webull user login — no API key or client ID to configure. +- Logo: Webull's official mark, from the icon Webull publishes for its connector, on a 192×192 tile. diff --git a/third_party/webull/LICENSE b/third_party/webull/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/webull/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/webull/README.md b/third_party/webull/README.md new file mode 100644 index 000000000..f63f4e144 --- /dev/null +++ b/third_party/webull/README.md @@ -0,0 +1,60 @@ +# Webull + +Cursor plugin that connects agents to [Webull](https://developer.webull.com/apis/docs/AI-friendly-Resources/mcp/) through Webull's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +View accounts, positions, orders, watchlists, and market data. + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **Webull**. +3. Click **Install**, then complete the Webull sign-in prompt. + +Or run `/add-plugin webull` in chat. + +## MCP + +```json +{ + "mcpServers": { + "webull": { + "type": "http", + "url": "https://api.webull.com/mcp" + } + } +} +``` + +Auth is OAuth. Cursor prompts for Webull sign-in when the plugin connects — there is no client ID or personal access token to configure. + +## Before you connect + +You need a Webull account. During sign-in you choose which accounts and capability groups (account info, order query, market data, security master) to expose. + +## What agents can do + +| Category | Capabilities | +| --- | --- | +| Accounts | Balances, account list, and positions | +| Orders | Open orders, order history, and order detail | +| Market data | Stocks, crypto, futures, and event contracts: quotes, bars, ticks, rankings | +| Research | Company profiles, analyst ratings, filings, financial statements, and fund data | +| Watchlists | Create and manage watchlists | + +The hosted runtime is the source of truth for tool names and schemas. + +## Notes + +- The hosted server is read-only for trading: order placement, modification, and cancellation are only in Webull's local MCP server. +- Hong Kong accounts use a separate regional endpoint that this plugin does not configure. + +## Docs + +- Webull Cloud MCP: https://developer.webull.com/apis/docs/AI-friendly-Resources/mcp/ +- Server URL: https://api.webull.com/mcp + +Logo is Webull's official mark. + +## License + +MIT diff --git a/third_party/webull/assets/logo.png b/third_party/webull/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2d28680c6add420fa3d8c3f4a09c42fa9f185735 GIT binary patch literal 6600 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 literal 0 HcmV?d00001 diff --git a/third_party/webull/mcp.json b/third_party/webull/mcp.json new file mode 100644 index 000000000..9c8d94418 --- /dev/null +++ b/third_party/webull/mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "webull": { + "type": "http", + "url": "https://api.webull.com/mcp" + } + } +} From 06004ec1f02fb3b931ee7571f3d2d349fa3ec8a5 Mon Sep 17 00:00:00 2001 From: Minu Palaniappan Date: Thu, 10 Sep 2026 13:14:47 -0700 Subject: [PATCH 05/10] feat(third_party): add S&P Global plugin --- .cursor-plugin/marketplace.json | 5 ++ README.md | 1 + .../sp-global/.cursor-plugin/plugin.json | 35 ++++++++++ third_party/sp-global/CHANGELOG.md | 9 +++ third_party/sp-global/LICENSE | 21 ++++++ third_party/sp-global/README.md | 60 ++++++++++++++++++ third_party/sp-global/assets/logo.png | Bin 0 -> 630 bytes third_party/sp-global/mcp.json | 8 +++ 8 files changed, 139 insertions(+) create mode 100644 third_party/sp-global/.cursor-plugin/plugin.json create mode 100644 third_party/sp-global/CHANGELOG.md create mode 100644 third_party/sp-global/LICENSE create mode 100644 third_party/sp-global/README.md create mode 100644 third_party/sp-global/assets/logo.png create mode 100644 third_party/sp-global/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 01be4f893..e2908fa79 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -372,6 +372,11 @@ "name": "webull", "source": "third_party/webull", "description": "View accounts, positions, orders, watchlists, and market data." + }, + { + "name": "sp-global", + "source": "third_party/sp-global", + "description": "Query S&P Capital IQ financials, prices, and transcripts." } ] } diff --git a/README.md b/README.md index 4bde54600..b0068dee2 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `teams` | [Teams](third_party/teams/) | Cursor | Productivity | Search, read, and send Microsoft Teams chats and channel messages. | | `finance` | [Finance](third_party/finance/) | Cursor | Integrations | Securely connect your accounts so Grok can help with questions about your spending, subscriptions, balances, and investments. | | `webull` | [Webull](third_party/webull/) | Cursor | Integrations | View accounts, positions, orders, watchlists, and market data. | +| `sp-global` | [S&P Global](third_party/sp-global/) | Cursor | Integrations | Query S&P Capital IQ financials, prices, and transcripts. | 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/sp-global/.cursor-plugin/plugin.json b/third_party/sp-global/.cursor-plugin/plugin.json new file mode 100644 index 000000000..ee79402bb --- /dev/null +++ b/third_party/sp-global/.cursor-plugin/plugin.json @@ -0,0 +1,35 @@ +{ + "name": "sp-global", + "displayName": "S&P Global", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.13.0" + }, + "description": "Query S&P Capital IQ financials, prices, and transcripts.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://docs.kensho.com/llmreadyapi/overview", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "sp global", + "kensho", + "kfinance", + "capital iq", + "financials", + "market data", + "earnings transcripts", + "mcp" + ], + "category": "integrations", + "tags": [ + "s&p global", + "kensho", + "finance", + "mcp" + ], + "mcpServers": "./mcp.json" +} diff --git a/third_party/sp-global/CHANGELOG.md b/third_party/sp-global/CHANGELOG.md new file mode 100644 index 000000000..d46309737 --- /dev/null +++ b/third_party/sp-global/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `sp-global` MCP server pointing at S&P Global's hosted Streamable HTTP endpoint (`https://kfinance.kensho.com/integrations/mcp`). +- Auth uses OAuth with S&P Global user login — no API key or client ID to configure. +- Logo: S&P Global's official mark (black rule over red block), redrawn at 192×192 from the icon published on marketplace.spglobal.com. diff --git a/third_party/sp-global/LICENSE b/third_party/sp-global/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/sp-global/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/sp-global/README.md b/third_party/sp-global/README.md new file mode 100644 index 000000000..2858e27b7 --- /dev/null +++ b/third_party/sp-global/README.md @@ -0,0 +1,60 @@ +# S&P Global + +Cursor plugin that connects agents to [S&P Global](https://docs.kensho.com/llmreadyapi/overview) through S&P Global's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Query S&P Capital IQ financials, prices, and transcripts. + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **S&P Global**. +3. Click **Install**, then complete the S&P Global sign-in prompt. + +Or run `/add-plugin sp-global` in chat. + +## MCP + +```json +{ + "mcpServers": { + "sp-global": { + "type": "http", + "url": "https://kfinance.kensho.com/integrations/mcp" + } + } +} +``` + +Auth is OAuth. Cursor prompts for S&P Global sign-in when the plugin connects — there is no client ID or personal access token to configure. + +## Before you connect + +You need an active S&P Global Market Intelligence subscription or trial for the Kensho LLM-ready API. + +## What agents can do + +| Category | Capabilities | +| --- | --- | +| Companies | Resolve companies by ticker, ISIN, or CUSIP and read profiles | +| Financials | Statements and 200+ line items from S&P Capital IQ | +| Prices | Historical prices, volumes, market cap, and enterprise value | +| Research | Earnings call transcripts, business relationships, M&A, and estimates | + +The hosted runtime is the source of truth for tool names and schemas. + +## Notes + +- Tool calls run under the S&P Global entitlements of the user who authorizes the connection. +- Kensho also ships the open-source `kensho-kfinance` package for a local server; this plugin uses the hosted server only. + +## Docs + +- Kensho LLM-ready API: https://docs.kensho.com/llmreadyapi/overview +- kfinance on GitHub: https://github.com/kensho-technologies/kfinance +- Server URL: https://kfinance.kensho.com/integrations/mcp + +Logo is S&P Global's official mark (black rule over red block), redrawn at 192×192 from the icon published on marketplace.spglobal.com. + +## License + +MIT diff --git a/third_party/sp-global/assets/logo.png b/third_party/sp-global/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0c566f750684cfba36c6320c5de291b784a7fdb7 GIT binary patch literal 630 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE4M+yv$zf+;V6ydeaSW-L^Y+e0-opkw4363# z%x>0CIdk}p0DHp6a%PDfxe&$IXU@b3e7z;dV8+>C!Z<;V;S!6(ECvr@hD;^}Uxp<^ zU$D&n?*Yr__LC3rr#-7W#D>RHTdIHSvE^)HB+m14|M@?BG}Gw5caN?0z9rMd!5(sN m&z#BOXN=AvE`nFT;oi<9RJHi8&mmxXV(@hJb6Mw<&;$U0bgJ$E literal 0 HcmV?d00001 diff --git a/third_party/sp-global/mcp.json b/third_party/sp-global/mcp.json new file mode 100644 index 000000000..48ce41bc1 --- /dev/null +++ b/third_party/sp-global/mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "sp-global": { + "type": "http", + "url": "https://kfinance.kensho.com/integrations/mcp" + } + } +} From 005f18991539ac1a6038bf2528fbd8e5541a44d1 Mon Sep 17 00:00:00 2001 From: Minu Palaniappan Date: Thu, 10 Sep 2026 13:14:47 -0700 Subject: [PATCH 06/10] feat(third_party): add Interactive Brokers plugin --- .cursor-plugin/marketplace.json | 5 ++ README.md | 1 + .../.cursor-plugin/plugin.json | 35 ++++++++++ third_party/interactive-brokers/CHANGELOG.md | 9 +++ third_party/interactive-brokers/LICENSE | 21 ++++++ third_party/interactive-brokers/README.md | 60 ++++++++++++++++++ .../interactive-brokers/assets/logo.png | Bin 0 -> 9057 bytes third_party/interactive-brokers/mcp.json | 8 +++ 8 files changed, 139 insertions(+) create mode 100644 third_party/interactive-brokers/.cursor-plugin/plugin.json create mode 100644 third_party/interactive-brokers/CHANGELOG.md create mode 100644 third_party/interactive-brokers/LICENSE create mode 100644 third_party/interactive-brokers/README.md create mode 100644 third_party/interactive-brokers/assets/logo.png create mode 100644 third_party/interactive-brokers/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index e2908fa79..a9722f7dd 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -377,6 +377,11 @@ "name": "sp-global", "source": "third_party/sp-global", "description": "Query S&P Capital IQ financials, prices, and transcripts." + }, + { + "name": "interactive-brokers", + "source": "third_party/interactive-brokers", + "description": "Review positions, balances, P&L, and draft trade instructions." } ] } diff --git a/README.md b/README.md index b0068dee2..9dd9cd6f5 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `finance` | [Finance](third_party/finance/) | Cursor | Integrations | Securely connect your accounts so Grok can help with questions about your spending, subscriptions, balances, and investments. | | `webull` | [Webull](third_party/webull/) | Cursor | Integrations | View accounts, positions, orders, watchlists, and market data. | | `sp-global` | [S&P Global](third_party/sp-global/) | Cursor | Integrations | Query S&P Capital IQ financials, prices, and transcripts. | +| `interactive-brokers` | [Interactive Brokers](third_party/interactive-brokers/) | Cursor | Integrations | Review positions, balances, P&L, and draft trade instructions. | 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/interactive-brokers/.cursor-plugin/plugin.json b/third_party/interactive-brokers/.cursor-plugin/plugin.json new file mode 100644 index 000000000..1b068d64f --- /dev/null +++ b/third_party/interactive-brokers/.cursor-plugin/plugin.json @@ -0,0 +1,35 @@ +{ + "name": "interactive-brokers", + "displayName": "Interactive Brokers", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.13.0" + }, + "description": "Review positions, balances, P&L, and draft trade instructions.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://www.interactivebrokers.com/en/trading/ai-integrations.php", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "interactive brokers", + "ibkr", + "brokerage", + "trading", + "portfolio", + "positions", + "market data", + "mcp" + ], + "category": "integrations", + "tags": [ + "ibkr", + "finance", + "trading", + "mcp" + ], + "mcpServers": "./mcp.json" +} diff --git a/third_party/interactive-brokers/CHANGELOG.md b/third_party/interactive-brokers/CHANGELOG.md new file mode 100644 index 000000000..6bb30e270 --- /dev/null +++ b/third_party/interactive-brokers/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `interactive-brokers` MCP server pointing at Interactive Brokers's hosted Streamable HTTP endpoint (`https://api.ibkr.com/v1/api/mcp-public`). +- Auth uses OAuth with Interactive Brokers user login — no API key or client ID to configure. +- Logo: Interactive Brokers's official mark, from the icon Interactive Brokers publishes for its connector, on a 192×192 tile. diff --git a/third_party/interactive-brokers/LICENSE b/third_party/interactive-brokers/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/interactive-brokers/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/interactive-brokers/README.md b/third_party/interactive-brokers/README.md new file mode 100644 index 000000000..4ce4d9521 --- /dev/null +++ b/third_party/interactive-brokers/README.md @@ -0,0 +1,60 @@ +# Interactive Brokers + +Cursor plugin that connects agents to [Interactive Brokers](https://www.interactivebrokers.com/en/trading/ai-integrations.php) through Interactive Brokers's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Review positions, balances, P&L, and draft trade instructions. + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **Interactive Brokers**. +3. Click **Install**, then complete the Interactive Brokers sign-in prompt. + +Or run `/add-plugin interactive-brokers` in chat. + +## MCP + +```json +{ + "mcpServers": { + "interactive-brokers": { + "type": "http", + "url": "https://api.ibkr.com/v1/api/mcp-public" + } + } +} +``` + +Auth is OAuth. Cursor prompts for Interactive Brokers sign-in when the plugin connects — there is no client ID or personal access token to configure. + +## Before you connect + +You need an Interactive Brokers account. You authorize one specific account during sign-in. Not available to clients in India or Japan. + +## What agents can do + +| Category | Capabilities | +| --- | --- | +| Accounts | Balances, summaries, positions, and portfolio allocation | +| Activity | Orders, trades, and historical transactions | +| Market data | Price snapshots and history; contract search | +| Instructions | Draft trade instructions for review in IBKR's AI Instructions tab | + +The hosted runtime is the source of truth for tool names and schemas. + +## Notes + +- Trade instructions never become live orders automatically; you review and submit them inside an IBKR platform. +- IBKR recommends the `mcp-public` endpoint for custom clients; Grok's catalog lists `/mcp`, which shares the same authorization server. +- Revoke access from **Client Portal → Settings → Manage Third-Party Consents**. + +## Docs + +- IBKR AI integrations: https://www.interactivebrokers.com/en/trading/ai-integrations.php +- Server URL: https://api.ibkr.com/v1/api/mcp-public + +Logo is Interactive Brokers's official mark. + +## License + +MIT diff --git a/third_party/interactive-brokers/assets/logo.png b/third_party/interactive-brokers/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..41b7b5f57ee30fc736edc0a4196241a928502cdd GIT binary patch literal 9057 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 literal 0 HcmV?d00001 diff --git a/third_party/interactive-brokers/mcp.json b/third_party/interactive-brokers/mcp.json new file mode 100644 index 000000000..9160d5348 --- /dev/null +++ b/third_party/interactive-brokers/mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "interactive-brokers": { + "type": "http", + "url": "https://api.ibkr.com/v1/api/mcp-public" + } + } +} From daeb62290b05e6cf2a1f8ff08de5e7ff2f871675 Mon Sep 17 00:00:00 2001 From: Minu Palaniappan Date: Thu, 10 Sep 2026 13:14:48 -0700 Subject: [PATCH 07/10] feat(third_party): add Meltwater plugin --- .cursor-plugin/marketplace.json | 5 ++ README.md | 1 + .../meltwater/.cursor-plugin/plugin.json | 35 ++++++++++ third_party/meltwater/CHANGELOG.md | 9 +++ third_party/meltwater/LICENSE | 21 ++++++ third_party/meltwater/README.md | 60 ++++++++++++++++++ third_party/meltwater/assets/logo.png | Bin 0 -> 18265 bytes third_party/meltwater/mcp.json | 8 +++ 8 files changed, 139 insertions(+) create mode 100644 third_party/meltwater/.cursor-plugin/plugin.json create mode 100644 third_party/meltwater/CHANGELOG.md create mode 100644 third_party/meltwater/LICENSE create mode 100644 third_party/meltwater/README.md create mode 100644 third_party/meltwater/assets/logo.png create mode 100644 third_party/meltwater/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index a9722f7dd..edffac758 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -382,6 +382,11 @@ "name": "interactive-brokers", "source": "third_party/interactive-brokers", "description": "Review positions, balances, P&L, and draft trade instructions." + }, + { + "name": "meltwater", + "source": "third_party/meltwater", + "description": "Search media and social mentions and pull analytics." } ] } diff --git a/README.md b/README.md index 9dd9cd6f5..eaba16775 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `webull` | [Webull](third_party/webull/) | Cursor | Integrations | View accounts, positions, orders, watchlists, and market data. | | `sp-global` | [S&P Global](third_party/sp-global/) | Cursor | Integrations | Query S&P Capital IQ financials, prices, and transcripts. | | `interactive-brokers` | [Interactive Brokers](third_party/interactive-brokers/) | Cursor | Integrations | Review positions, balances, P&L, and draft trade instructions. | +| `meltwater` | [Meltwater](third_party/meltwater/) | Cursor | Integrations | Search media and social mentions and pull analytics. | 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/meltwater/.cursor-plugin/plugin.json b/third_party/meltwater/.cursor-plugin/plugin.json new file mode 100644 index 000000000..4a926181e --- /dev/null +++ b/third_party/meltwater/.cursor-plugin/plugin.json @@ -0,0 +1,35 @@ +{ + "name": "meltwater", + "displayName": "Meltwater", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.13.0" + }, + "description": "Search media and social mentions and pull analytics.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://developer.meltwater.com/guides/meltwater-mcp/overview", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "meltwater", + "media monitoring", + "pr", + "social listening", + "mentions", + "sentiment", + "saved searches", + "mcp" + ], + "category": "integrations", + "tags": [ + "meltwater", + "media", + "pr", + "mcp" + ], + "mcpServers": "./mcp.json" +} diff --git a/third_party/meltwater/CHANGELOG.md b/third_party/meltwater/CHANGELOG.md new file mode 100644 index 000000000..81440a306 --- /dev/null +++ b/third_party/meltwater/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `meltwater` MCP server pointing at Meltwater's hosted Streamable HTTP endpoint (`https://api.meltwater.com/v2/mcp`). +- Auth uses OAuth with Meltwater user login — no API key or client ID to configure. +- Logo: Meltwater's official mark, from the icon Meltwater publishes for its connector, on a 192×192 tile. diff --git a/third_party/meltwater/LICENSE b/third_party/meltwater/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/meltwater/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/meltwater/README.md b/third_party/meltwater/README.md new file mode 100644 index 000000000..b31da7400 --- /dev/null +++ b/third_party/meltwater/README.md @@ -0,0 +1,60 @@ +# Meltwater + +Cursor plugin that connects agents to [Meltwater](https://developer.meltwater.com/guides/meltwater-mcp/overview) through Meltwater's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Search media and social mentions and pull analytics. + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **Meltwater**. +3. Click **Install**, then complete the Meltwater sign-in prompt. + +Or run `/add-plugin meltwater` in chat. + +## MCP + +```json +{ + "mcpServers": { + "meltwater": { + "type": "http", + "url": "https://api.meltwater.com/v2/mcp" + } + } +} +``` + +Auth is OAuth. Cursor prompts for Meltwater sign-in when the plugin connects — there is no client ID or API token to configure. + +## Before you connect + +You need a Meltwater subscription that includes the Meltwater MCP package. Available tools depend on the products in your subscription. + +## What agents can do + +| Category | Capabilities | +| --- | --- | +| Your assets | Find saved searches and tags configured in Meltwater | +| Mentions | Retrieve news and social documents for a saved search | +| Analytics | Volume, sentiment, top sources, and themes | +| Queries | Generate a query when no saved search exists | + +The hosted runtime is the source of truth for tool names and schemas. + +## Notes + +- Meltwater's server advertises standard MCP OAuth with dynamic client registration; its public docs still describe API-key auth, but the OAuth flow is live. +- This is Meltwater MCP (`/v2/mcp`), not the higher-level Mira API endpoint at `/mcp`. + +## Docs + +- Meltwater MCP overview: https://developer.meltwater.com/guides/meltwater-mcp/overview +- Connecting: https://developer.meltwater.com/guides/meltwater-mcp/connecting +- Server URL: https://api.meltwater.com/v2/mcp + +Logo is Meltwater's official mark. + +## License + +MIT diff --git a/third_party/meltwater/assets/logo.png b/third_party/meltwater/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9538ead045e91102045eea3de5c3ebf65f4e19d0 GIT binary patch literal 18265 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≶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 BIAs6; literal 0 HcmV?d00001 diff --git a/third_party/meltwater/mcp.json b/third_party/meltwater/mcp.json new file mode 100644 index 000000000..8d77a11b6 --- /dev/null +++ b/third_party/meltwater/mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "meltwater": { + "type": "http", + "url": "https://api.meltwater.com/v2/mcp" + } + } +} From 97355a5b6dbabd68e48c0b0c6fbd7d8c74732207 Mon Sep 17 00:00:00 2001 From: Minu Palaniappan Date: Thu, 10 Sep 2026 13:14:48 -0700 Subject: [PATCH 08/10] feat(third_party): add Daloopa plugin --- .cursor-plugin/marketplace.json | 5 ++ README.md | 1 + .../daloopa/.cursor-plugin/plugin.json | 35 ++++++++++ third_party/daloopa/CHANGELOG.md | 9 +++ third_party/daloopa/LICENSE | 21 ++++++ third_party/daloopa/README.md | 61 ++++++++++++++++++ third_party/daloopa/assets/logo.png | Bin 0 -> 19473 bytes third_party/daloopa/mcp.json | 8 +++ 8 files changed, 140 insertions(+) create mode 100644 third_party/daloopa/.cursor-plugin/plugin.json create mode 100644 third_party/daloopa/CHANGELOG.md create mode 100644 third_party/daloopa/LICENSE create mode 100644 third_party/daloopa/README.md create mode 100644 third_party/daloopa/assets/logo.png create mode 100644 third_party/daloopa/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index edffac758..6d723b166 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -387,6 +387,11 @@ "name": "meltwater", "source": "third_party/meltwater", "description": "Search media and social mentions and pull analytics." + }, + { + "name": "daloopa", + "source": "third_party/daloopa", + "description": "Pull source-linked fundamentals, KPIs, filings, and prices." } ] } diff --git a/README.md b/README.md index eaba16775..e9fceb3e8 100644 --- a/README.md +++ b/README.md @@ -78,6 +78,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `sp-global` | [S&P Global](third_party/sp-global/) | Cursor | Integrations | Query S&P Capital IQ financials, prices, and transcripts. | | `interactive-brokers` | [Interactive Brokers](third_party/interactive-brokers/) | Cursor | Integrations | Review positions, balances, P&L, and draft trade instructions. | | `meltwater` | [Meltwater](third_party/meltwater/) | Cursor | Integrations | Search media and social mentions and pull analytics. | +| `daloopa` | [Daloopa](third_party/daloopa/) | Cursor | Integrations | Pull source-linked fundamentals, KPIs, filings, and prices. | 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/daloopa/.cursor-plugin/plugin.json b/third_party/daloopa/.cursor-plugin/plugin.json new file mode 100644 index 000000000..f19e040fd --- /dev/null +++ b/third_party/daloopa/.cursor-plugin/plugin.json @@ -0,0 +1,35 @@ +{ + "name": "daloopa", + "displayName": "Daloopa", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.13.0" + }, + "description": "Pull source-linked fundamentals, KPIs, filings, and prices.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://docs.daloopa.com/docs/daloopa-mcp", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "daloopa", + "fundamentals", + "kpis", + "sec filings", + "transcripts", + "equity research", + "financial data", + "mcp" + ], + "category": "integrations", + "tags": [ + "daloopa", + "finance", + "research", + "mcp" + ], + "mcpServers": "./mcp.json" +} diff --git a/third_party/daloopa/CHANGELOG.md b/third_party/daloopa/CHANGELOG.md new file mode 100644 index 000000000..c37403cc2 --- /dev/null +++ b/third_party/daloopa/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `daloopa` MCP server pointing at Daloopa's hosted Streamable HTTP endpoint (`https://mcp.daloopa.com/server/mcp`). +- Auth uses OAuth with Daloopa user login — no API key or client ID to configure. +- Logo: Daloopa's official mark, from the `daloopa` GitHub organization. diff --git a/third_party/daloopa/LICENSE b/third_party/daloopa/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/daloopa/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/daloopa/README.md b/third_party/daloopa/README.md new file mode 100644 index 000000000..40c17ee94 --- /dev/null +++ b/third_party/daloopa/README.md @@ -0,0 +1,61 @@ +# Daloopa + +Cursor plugin that connects agents to [Daloopa](https://docs.daloopa.com/docs/daloopa-mcp) through Daloopa's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Pull source-linked fundamentals, KPIs, filings, and prices. + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **Daloopa**. +3. Click **Install**, then complete the Daloopa sign-in prompt. + +Or run `/add-plugin daloopa` in chat. + +## MCP + +```json +{ + "mcpServers": { + "daloopa": { + "type": "http", + "url": "https://mcp.daloopa.com/server/mcp" + } + } +} +``` + +Auth is OAuth. Cursor prompts for Daloopa sign-in when the plugin connects — there is no client ID or personal access token to configure. + +## Before you connect + +You need a Daloopa account and subscription. Coverage is 6,000+ global tickers, and every data point links back to the source filing, presentation, or transcript. + +## What agents can do + +| Category | Capabilities | +| --- | --- | +| Companies | Find companies by ticker or name and discover their available series | +| Fundamentals | Quarterly and annual values for statements, segments, and KPIs, with source links | +| Documents | List, search, and read filings, transcripts, and presentations | +| Prices | Daily OHLCV history | +| Skills | Run Daloopa's pre-built analyses such as earnings reviews and comps | + +The hosted runtime is the source of truth for tool names and schemas. + +## Notes + +- Tool calls run under the Daloopa entitlements of the user who authorizes the connection. +- A separate docs server at `https://docs.daloopa.com/mcp` searches Daloopa's documentation and is not what this plugin connects to. + +## Docs + +- Daloopa MCP: https://docs.daloopa.com/docs/daloopa-mcp +- Client integrations: https://docs.daloopa.com/docs/mcp-integrations +- Server URL: https://mcp.daloopa.com/server/mcp + +Logo is Daloopa's official mark, from the `daloopa` GitHub organization. + +## License + +MIT diff --git a/third_party/daloopa/assets/logo.png b/third_party/daloopa/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2d547938f124534b7bf7f946031d46ce972e4544 GIT binary patch literal 19473 zcmd3OQ zumXVoPvk$q{to~EkU}5;$bT5S{}Yts;hF>h1OZZ_LaLrX*Le_u zY9lLS4nA%)v^|m-VnQR~J*1=3$ZRjzadd5!3&Wbl;5x&WtS^`XCQ+l|jWO7)#Zh{S zqTJFEVP;!2?S6eMkM3HKw4#$fQ@#7nuf0CE(|JC#zxggF(^*(cXD-P~vSQG_8ql2K zR{m?>3;H*qtAV`X;5@DnuOm{ z83KXLJ@N9~$xX4^p=MDDkHPpd6L$sI29g+K>5B`JkZph`$DZiOk5Mg@fi9Vc7ZL}i zf=-&l6$VZ_CJM5Jr?CmIjd$&Islu)o`|R=ee7;<4)VZj6X%&|)yBCkA&ASa9w{AF` zFl4b<+-!3_T1@A%Su6yj3PXyWkcwu2wMmkjD#3H)RLJRpCZ-FPBel-hwy|2fUfMde zt_1SAZ(05NyJmY6AsgxAjH75^}ExDb@*`S%YG`xUro+s-KT0v$+!il>BoEvty zi4&7klS7KF^(*!*Kx4bFyZ=iF@SWH9v1KW=P%{&Y3aM5m(=1A$9|S+B_)3w(FMJJh zepCe45UZ*(_cz)6bpJV+SUM44Icdchi+8YujPndb5{F{}myL6+GjgF(Q+|NLlOT!D zO-{ulADQ^w7CG|Wm#&{d6CCv2aJI*pPEt%&Ww#?W5jP28)&(A7w`1t}jMvd~x|iaC zC(uj=uo;0eQoanxn}OTZbWRXZuA%0H)u&e1Pd4fz<%$UjIwm#(MNaY8RKu5i?PCVuEq{{3(HKf&^R_PGp z)OMm%v7`NzbR5iX;?`bjr;9QHP9Icb@n@RZjB-ISNZ#yC(%z)3(*KIAxuG~i`<%)k)k#OM>R&{R&}JCApxw6shFA&zi{o6;G3VxB#^!eRLV=wATjAVX5}oS>rMo_ zpLbLBJ-=#}V`1;SXaFN>AmM=`Z(<&@8FgW6BthYNx%ANOhENA>D>T*^F&v&aFjSW2 z3Ic(LY#Dianiw4;!IG({Q2*8T+Dt2_QrZ+<`Um2ORC6n2N#ey8S?hQD=v!V`^Ml3Q7mtIqi-gO&B36n4}httjRh7e(R zGCg3^6TL0zZ&nd-nIdvJ*KcYOO1OPwy;fI0XNVF?XpnVN(I_u!ag(pr1PFjiBQz0Z zfDiSi@v~vn+uO7Vvp+86zIX4likBnF)Zz69c)QZ0(0DaP*Ma`%&QptdUTgEil zj?<{ce}W7n-+6>gV#HPe^0GuSESGiwj#7@@HS^M}1c~O3CH@+;D9QrKWvvOf)(D8S zS9~BL845bL_@Y05#LJhzf2ahrfWRL!iWGRQ+0m557nDyKSZbPVQp2zzv%XwL0W_V~7}Pc^5{xE!7JJEpE|<+`_vw6Z+Ca0}QcBOx&yGC> z-cL1OOI^Q9EP=kq+x2|s?`uC$NZUFwQcQ=jmsa|%Pkhu8C8$Al7X6^id^sHH-jJwt z#A^4&a$JD#6+?g@Rd(%oFlH#3W;4kmO)%mj0C_s;zmwQ>U6f~#TGmw3FlRThH}B_V zzH)bmJ9Si;BS)Nl9;?XC*sl76F(pTi=FkF3Q~!*%rtb5grnA2LVb1B+_wD(~i@4^F zmM62PU*ul%D5@#0o0ebn9|jfO^#w^+!g^3flo%dwA`mB7 zC$OBoM5Srj<#enC@L>|gUe7~yPR1c6bnU$GKDf9n9}NUy8SsC*C_2B8aKE2oVTMuQ z`~}qa_n|gAnGs1X2)+Cef_xC&ttXYq0%f_slGs6R3t|>dbxgIV;X zBc!c;)u7Jy7ZxIh!>D48^WA4n&neqvnT)tNxx3a%f*5NqGJ1+#qBUy(&cKr?5o2V;ZV`#};te155U>K$f$ni6fdYAu>7)o64}B#u3F2S@_0D)C`& zPPQz-D2aH3q6idmQWk3DuKKvI_xBXK9|^DJs%s;$k`U(>h|i@thtdjEq15Ws8VLth zHx!D3gcIeCq`kOi@4?NM&RUZJhdT%b-(xw=r|J#@zBQ)Iz_5t|=y3u}T_a8CggTz( zA&ZfIZwRlSPtElfbd^HwSW>BmgoNdWS6o(bsK(ZR0m4p{*$<7vCYnGhytbMQ_UyVI z$5^KYeyrsYCfQ6p_E|^*D4OxtUT37Sma$um$JozQhYNiPJx6OE3=^cnRvsnckZ13+ zd)(IX$f&)7(d$}_yV7Rg3jALO?-;xBqB0P0+rfXdww&m!YY0G324HqvlPsH9JIC;c zD14dDbGTfjhpSu+e66+(3cgMcu&>gQ_q(!~rc=im37pDe(|*%L z{vjZE&hiivi-V=sHJIFixZdJ&oka4@zMl*E{q;caD++`q4C{@NC$ov<+Dl~mc^Ic@ z-@P9m^!}0xRP+*RjDu!w)dSoYfnaxaSfLNltvTAbV=lT~W&V}HWjHXUCE|UlcN~9Z zVU62Y@*9mFD;DTG`V%qsMMJ8w$tFDshoJ+35{;18mUD3CVUh-bgd!D0j3Zw~F4q_y zuQViKintH0xGrU@RdC*3_ld%c4yA{dHHt?Fz5)twJw>5FuAeh^-+D}a-w@qNj#W~& zeuFF$mbFt46Os+>4jb6VV#@CIZ>OKYDCjOz2}7w^pnYLu57*?0O@*AM?OQY|_4ays zViD*2et;-aqK8HID5i0GXh;~w8XomfFkXn{Pm?=}MvV!g<)fZ7l8eKI5O@i`I41DB zd%wF5S9Pl$HZhHnes-cSw1yHXc|gaaGs(Gb$9tTfq7tyWBOCWbct_RdtU4CmUHX`( z=}Q|kRWiCmB85Pz{2}tOTdViM;wxeGyT1n4^0Ye8WxuDB`Af;}V>I*=@pCm2;D;qj zjTU3%$kLbg4xA%qL8)|)X8>PSvO*9BkTz4jcNE4Q=^tcNu4FEDi2eLHD%feV)B@)a z3dwj#O5oKH(8|^|+J<^v_nO!9(A7vMgf3GGwsHFn2Q5ca{7<_Ncr?PRMU%XhnqMp^ z2<+eK+gd0l2U~Eb5PZ8fcjiY8IJ{Py4&}Q%cbU5dU5%2#OtjcCO0mK^f-mnBn!k8J zB(Z21HI5K*q*f9OoWmh59)f`FTB@Ozsu6JCr{;P;Rvo3k6CG2~vxZB@aG~LM1IC#m zZVa=Z#d*n1#Ec_}^_o&OAgky=Bz3*0pZJ#E4n^GeoHQA-FW;cvl|}9!=ef&e01VA6 zcIwYeV|q_3PsjFr{D&PK27su3uz5$&WKNLq-|{OeBbe!8MrleBaHqNA$J#7VuR3w1}9S5?pVCp-{UW&ucFphpi>a3Q#`J9*w7F z{|svTJKiuj!Xgr>$ZGcQ4>?(22u{UqTQ8}n$*I}GnUY?=brT>QB`inU78~mj7lvM^ zi*E6RRdv|YXmw>dWr^niD%b(ra~_*}!tah>GY0JHbN@IZrSvm4v-6l}&?algmNiSx z78n+Txf;HYj+zq&O>&@RU_3!_I4ZIO!}kcI2BcG zJ}_I+n1%jwOu`eo)J0KM)Kt9LA=#?ducEDb?8a|^@GoJHl{oGoOR7`eJ;~JK&BW<8 z<4p-wxSUR2u_|HsIKH7c(p^a0BWpIRGiTML0Rj72v1$DbHuUfxAY5R3HAZHI6(Qc8 z1+W!26?6Lc-CiD28@?yK2#TbCY&~S75Y3q5IL{#^tOI-OWvO zZ!#()l|3#`W_mp8Op|9wT@KEh^$-1N z7bcr!WGNK>z26OWpD$PFBfQ1_iz`Jx)JA4pNs?0MmxsG>!`j4DVzn?x2S;>NO()mq zHa-oQMcYFa<#yQX2x==9P}fb*6?u+t@;tEAbV2~6K6-YfM!ulqGG3F1=}rt?*SMII z$>(P3CrI+NP3^6ezC$E4!;w!aGB1T9igfLi1Y#cf)WPxU_Ka)2X!f;a(;Q> z^R`7Sp}I1e_ss=F>R_O(=JMWR*Z*RKqq(I3Ybs;3gB(NZoZ-EOuu}eej;9WEt;L|M zL(SgCORatM8SbB$cqg}b%fUp(SODie&fp|AR_JifCo<_2&S6HR_C`rSi^QvZ*~3Sy z`^@v4P1JJJnVh%oI3O6YP-4m{exI9DF-aGG0Acst0#}3uLun4r)t&`6Ca1e!tBcp~ zbteJSTzHci)Omhkfb2UB+Vw}`$&zTHJL101R=HzSb;Mu0~JYx zY$@L&E!Sm%?JXi^x;{-(IFoKwl5UV8Kcgi=K z_M5F2*x+bG0I9vhZ1;!GtuO0SG5FA%G%|8x7&ambG#*eOrPSZlUK>1(0nw=fRc4Bd zO1l1XutL%J++~PN3u_T0sAO$K16g8Jt#F>1N&JK_yIK^B+C+-Re%qHYJ7`Lq>aEm2~E}DZ!E%A}lr1 z!y*aYlUdng!pl7)!rgKQ`cyMOjtRv9QES z;+9vPTk!YD;NOJqE2-+t&l3D9`2>5LH6i#!x%glMK$ib-%v@f#+$<}cw~0Ee!#;Aw z{hT~RHa%a;5MrH!_g7?%xN<9rnCI~!lbxNGOhqZEj}~;~d9y=%m^<;3V-s=)mBojW zlcUf6(fJ^3nb**(KSg}j3s|m0xcV5LL5k{z z7*^KW04|Y-l%r>lg^Vu-zE#uywsl_&bg5JCPP?SgYwWGdzd9MXgpRZadw zqob47;=XHDLlWS+>hE*2{?{jXU#NG^k^!q3+H`zhN~5kJ<-PJP#u-jm*t~HR0IeaS z10!A?ep7rbhn7l3qM3n7MuL(F@ol(GUDbSoK(LJW z7%|42D5sw?J~@xs__&Hf-ebmzcl6>LEWxST4+x%4US6XZ^X-!K^x4z%*f2W{iU-{o zuYiR@V;vlIz009-u(qAXmSV$|Fw_5*XC-MFgC?s9&BwAbQjS0lxYdIo2pHz~iN{n{ zQkS+Uhvj}&Asj>B5WEJ@bhcd1&}51qMefov>mOibCW-*3QZ%h}+I_;;IA_V_XN(8v)H@Hu(u z7G#OL04)pzBCPEh$Pg8uwR#~?o+lnFrG5?aK!;Q~Pdf9*`Y@epXVzR1hXK?Uu zygX67MbRW#HQVL!0BE@CQ7O&{U;4^Dy5eato2o9_1_syqp4b_0#?Z{&f7GIw6t?xX zqN8x$;7?le;JZHwuzhyoJW83>DV+!_X=Cw#Z$rG!KcZL!yw7)D9lnP2IKE!CV`ll` z=`dol1o)2EO}$>589Mn)DDF{YgY%L+{{EytPmSA$^(ruq#JQjei%m6dZpu5 z8d08gUwZ-qg0aXuHAtDZA{_eatOO!lB>Cz7uv_RkZIN>yfI)Ks!OG#34Fb2jtik7T zyE)qS@{E`B%e-@fDZ!-EV#rVJOF!vlaXwTU z==n|YRS{y3PMS*ceuRy)QK4gyFC7-yABbBOTsj2&obZgYc9A##WSYM;h*yPenT-; z7mJ9PBW@Vw@RLa@c2sN@)dY;mIk)`-A|3C>_KU?F=8U{w|!#&avw~Lp5#Ha|J z@r|_sLwtvXEIqz5AF@5%kGMgKn}3$Wl)qY%fR3_d5>tf9(zp^MT zK*n$Rt!oM&eY+Lsb3CjIAn}jL(v?POtfA+7zYBRm0}G8Neal`zMaC9)phqKtfd?B- zcBX+Guc96ojANc@Vb9H$FTVFwCuP6P0gDSoXZ1spb}zae#LqJ^6D>dkyh0a3a{+44 z6OskBVcve)bR5tY(NTKJBdaN^EA6NA`7|a-Rm0J>ZKxCf8sglf(0Z53oKAwgY>}}t zH<;}olvxyb>@*#tBi)8;nRmPavtEW;Sd*YYXi~dQ7?DcEicatacs=bxp)muEXYVx@0=u}Kke{zn%$1(~cp+Q#Wr1?u^-jfJhH=6}wl?|-9HpgdSECho2+ zHzR-TpZo{{xI$u>c-HNwZYc1+K}h7LbT`a%%i=2WR=dQP1;#wXi2h|Z=dGA^lCI{T zsV+TXvz(`9gBL8JQc}ad9k4aXOhyA1LG=#xnPefMClEiiEH^7`+Bxm?!u_J&sY;KS zBZW=no7x3(@7GlhVQWN*R5sQkxswQ} zsZJ)y*hxXn>nYjd4|@q}U{GH99<0GtXj@F$ymsf}&lQ1ds`Pbh-8RjX37oC<$}h!d zg7|PSm_pO&Y74;f$BDt2<$*_=%4Y)St?Usg$|PyE&DyeP%it2sz`5PpzOKUX!3tPM z8Zl-jqoJ#=p=l&QAS3b@<};HKG&%;q>yXu2Kp+iI-k0tS`eTub#NZj(C@u^5=K zU?uS+FK<-|Fh`=%@SMV`U_7?ipa3Qp!n@Q{GhnbZ4#2)Dnu#R$1*VlcqRecHspv4W zz<95g{&ss5z(*##ZWi3#lco%s;m59`e29g>^2DBNFnSOJsIIk5_Pil(QR7X_XK@=( zWQKi=Eq`*TbTSs`nur%|iV!trnTn?wx+RU>6SWYD}pG9cGN7ifAdjj0<@5GgKV9LybQTuT6r z>D4tVi(^=!AmFZ13y=LzyEY1iauynhM*5D5F$a$R(0ARRiwZ*hZJZPbr4VM!mfnuB|j)``7u{WtX%{BZy zv5J5E;$gLEYQP{a2O2CHE6C3#A)l2Mf{1TD+?W$qeo_WvMibp$(5(lkZv*~5 zpY->9vXhp+JPuSTUepo=#SMje)mb0xT(9vz;%%FZGHHF8fkaI(^{FEzoiX#mWc$4)g;?JR zt{#jt3d!D@Lgs6B?H{{;bi}VI4*>%!p9KogGKy7zU>=}A`?>lm>D2mMKG%mBC-LKE z=3KhzD}G}ib!6e~=q;TP#_8bc1d7=z5_ENWE7tm|qd5QGKp@gvco?F}pD$DP!U+|N zIX%TV2yzLzck8e}UwF&yDf`qMg|V8J-#wPj3r06sWoaJY?^wbxja~|TH~(N}-<+m( z$@iZC7y`_csXs0qF@&WPAdySqJ*o8aos%e#i;UQ?0&Im6?|3B)f{g$)hX1_%?^hTG z{yH0cn0=`tc2KI?QgC(CnqF{1AuaD-=!|hJv{f4Q)glNRD(|CgU`Ocjk)8fOBWnx# z(yM=T7s-EDxQjTv+_d=>VIhwxQB+dB7mXh-n|Dj8nloKxBVlKxh$GL!nm%67?cdxU z>QHbBF2x+QbYn~=ifNNAAD-970vL_ZWBe#`??$H-ey$nfS$!FYwdn|B2bpTlosCV# z3($Eza{`&^2>Xq2;HKKJ6n}QtKfzz?2TAha2g6pXP!#^!dxb=|GUB9h7X5jOZIid| zMd{xpe1&j2xjOWdz;Dq|13Ok!V~%++mdN<+27^=hJ!D&%bs!dw$=Di>sOwuH|1(XU zpaPoWf=fvO-LusDJd&{|%_1rfQ;Lc@%znPq90Py^Cxkc}&PIubI>mkM(AQkNzctxq z&I1(^ciQTCt0l4TxU#^5w3%h4#DIYm_YA}z{JV}arfKdOD?heaOi<#qhS%nObYnAB z+?cG%3`x>^$on$Q^N4O1sfL!Kn~KCpN|n}rf=!hd=?IkCjYR@(SJ7+U*AtFJB9)To zD|Z_LX6g6wUK&V_e{9mtp(Rn5+M~pP#vGV^US2r{@BBX7;UR$HqYYWX;g_>fM`+R_4HGSW^`JClTerpwgy7QWkV;zEFx^e$0%h9wHb9sIU8N^Cg#CJqVG4- zrPEyJ^>Gl1hAxO94_pdjn1;>X(?(Lgs}G%D{)lJRhBLA8V=d53ux|VAj}Ovqm7K+| zW1DzPw<+;G$Jq^m9gcxQxsy}$-AKZHoS(Z(EeL!!e>;=1%2@S|G?4U3YTB2&tK_L! zf#;^j1jDACMbe75e|T%AJHjR8X#NlH8YvaCmX!{&!zg-FJPz&GiT)r{ChRQurFi0y zALe?S+Ud{%u21g<)B5z*@z4I)*k;QR)KVAIK!YkKmU4ySxrWVu!R=_KZW1eh=W-HW zuCqxA$D@c|-h>;97bSDUT37q`D^^L4-dgUAl%4gD5rvx*QKG@I_jkeg)-%hKpkqxV zDn`2>mQY^Psi+$B!+doE6My~z@wH)XzkWwerGZqz8f6v~JmsL7oNLl6CddJN2iAZVCUpZ*9XR}$=#X7G_4egDDU_fGv z=eI5$K5H4I?!-wd$5{cOvKQJL=c{p_q}@m0I{h>=1a!2_n%E;GSfP)Mg&GY<&zeWs zHM-}bt!|;iFf><^y|nTL`0u2x@&6p6`13sL*k&;Esxj9#;@$_+0&(z$NmH8$Sjb&Y z{;c7niRYOuy7DJyqa<*lx+q}BEMAh`P5|Xx`W*f~X0fv57$n+w$%Wa1SPfEslhInJ zgu?dNB0gR0ShVMTLcBRDnr3Gg(`^5IdnfojhP=aAn{mcF0wUs&O@Ku+`>{sQGpnOh zQpSnC#1|`#nBu}U_Iy8EId(00#eWCBZOy?-0N_0=FMOtXs$Z$F{~}9~=-Tcx`g;6M z#7Yc&9E|^^%3!v-#=3C8q%VwTM4CTCR<(>v9E+;|5$gql+e4>BOd35UB6$pOKC{Qj ze?R1G!!+kpYtuwUKxFn|Lb<272{?M5Sjvz}>QtbaBkrd)#5wEhrNxYd$Xbmy`Y&1Q zVh6*ak~(g|gKBE)V7xU%Rue`J<_jjg*@th zs0F%5b!>9o-{+duIK#-#$L&HlDUuUu%>vZld?0x{2r9Mk^*dg z1%1O8IX#9?^m}7z&;gjqO=Riby=dd_a=_*B-_I9HBQFuFo21k(QJgM!Nrgb#sr^{DTSTNwAl_SR`3I)H1bB_OV1rQm{a+s`w56_zq zsn#|v>aQaZuK9i*vxr+VYr^91J(b0x&vygW=S7}12P=eunQN2Frj-AS?!B`x{7?wj zX4B5ZrHPqP9y9fYrL_KJE|Y1Dk=kWdN5x)E-rwB|J@9u+CZ;S3E4ZtuQT6?< zq<(p&EYc;c*BBu}3!4l!no^FlT{l2K15~E;!&r@!8qL5kMHlK2TIXcq+0Q)C-;allM;)K4_+KvDH#qXaTUu~nl_k7 zgss!4m4s?~6ng67lbG41N>X@>$8)O(*c+s?mlsK!Z!`h5{u_H@qL8{Ub3q%Y%~-vb-YFmJ<{UmG zOmm_ET8;Q4IEN{1{cu>+g2@<7E3BvlW*^_II4WG*<)E5Z!vTA2TLFov$8(2!B;WJx zLVriPL|t1Y)x`+}J&Cest@5d3%y+c)kL}+>> zfpR`mOPj}!12o1s)_6o!PNnZz(pvdkEx9>);NQ;nBuOuCiK*g!y>KfnJk^hF#*1TtHT3x)cR2GIo;a-GEi+u zJ}>HNf`I4Jmpd?Yon=hKvHwahj8ht}N9PUNs*;4i{*EnqPz+`-!kaY>(--iYkPqW) zs}v({eyulL-NOwsn%zmqKs9S{#HYd|dyUR)3LjXf%=|46=1LGN{+<|gR;Z27M?=k+tQ@cFo1FZ8^+%yr{aUE(rkM_9?3@ei>@ z>N66Zq)HM!Q#KTr#$eJ{GCEg*7!?IK{QMj@peeGeVW)=(?{_t2!M013Jr9@k-LA0V zdzgljten)PmSJ!!!Jf8Uj{fIvj}zeMTt&!|4x%Ir-br<$^HfVjtJ_rd=l^Nb0zm1Y zL1Je8drztGbsB7pNF6?87l)c2K8bZ4FNGpbYumLp?CS*?>$!IiKf&x#J&+Riq;v$Z zH&Uabgbv_3_D(FL6rRralw*pGsv(CRvD2lqntO!(`clXm1?Uc8h)gL`7 z>;|QYa|!@C!K#n`Xi&#W?7y26uZiW8HPbH zCVR2(2Q6Z8(f5mVlonDU4iGEtb@58!MaB(UH59YlRg91mO9v?;R^2Q>eAK2=AYN%2 z>-{_?weLCF@7<8WXU9-18VOZqrc&t>Qy+yVNfclQe1LH~tuc#v~}g9Tr!Sz}slg28%Treo+3AoXRa=lxl77Bo&s7%F>lPx9H;gCSlGM$yEXp+N&`nVJRx`-JCQ0@e*LZ$zQ!{A zvx$S>bIMR(+N7RYh=LXptG+*(pmYDv7r)gEiu5W-0TT8-IEk#;Le9i^a)*pnwi$2I zIpj&&eDRzzcpO$*h8TjNi6JqY`@GrJgd|2RY|&WbQXbO2rF)?mm{Jj0%1PdEpfQ=| z!WKp18SG}b7s!_w4K1*x#c)o65Hov2_V-WJUP9Mh1jKc&;J_ls0PEnHE-L0|&eJKA z@PfS0>~{d3&$ZjDx05-%QnErX#Iw{|A zBSq*QX%tp0C$kvPuND^}cI)eg$vV*I_5132dj_2yfk+=xL@Do$rs?QF#8mRO|;z#3LfD#yRJTN`9L zTXCoMpznLzMv3Q1JUhYswnYw+5vRz3uOyPtQaEulq>9yM@O*xbvdHyO>0iWxB(Xxi zxM93e&VLCuP2EtBvrH14$M_3WLGU%yY|K)j(k?$CaocBq0@w<0DD1#H|80M^4AwPtC@wtiMX z=w`h*=_~i+R*nQygvQ($IwZY;V6Z}Qgn<>eLl+E&gd;2kjul1DBunc0boiV}int+- z!`Eg%a6lpn!7+^Niu=oHR}HX`uSVPCB9d8UV$-`j;XxtryC5L&V>FVI`)}sKWu--g zc(h=@8Vw;e*ix!N8nFgK0$LFtoO<8jH20h%2AzBnX5H4J=RE_t_nOO*L=C zlchr%HM0lVe~_|Kz|v+t3$NX-L$?Hs)I8YJ2@%If06Z|=ASwn(--Xz)OlVxe=u56H zr&<)&FfiLn3QC&5z^d{E&(pY5T#vWNrc4VQrQqI3p(1j13J9w1dS|uB zZ*NcdEvIh=UfZ^lq1Y|HY#2QV^O2S^i)*@|nEwQo;2c5!W?-j!0bIJeg}>i1!B{uj z1{#_!2@@&4F#;E8ARz05cbqD@9#Mq|1X9>0JP5h6UcfK1-W%jCyfbnVKu7+Q_N4z; zHQw*T{L8sWrk>hG@gYmZ4|9}Q0GWG0Hq#NDAwi4-$adHs4I)k*wnv%zwIPz=t#jXf`V-JKTwdbJFt=H%&Yw~TZ`FVrYgv?xi0glx<% z2p)(y6;?Nj4M{RcJvKkq;rF!J3gi1jp}>zxCLK1#!X>A>T3Iug1x&?FKALV=wXnlp zh#HhT(#lDgUMs4Ff_yfpX#;Vr03?lR9x`}msNcrsAg^mWguU0h%uU~3 zHH0crp^8E9#2ax$8f0r@aYdb@#B$n*CR8A~OjA~$fA}H+zGwJ@KIw{Pn@;5PsaUf6 zky&QUoGdTzM_Lv6ZhRzm{w@<$0`Cj_YR6Dx?%Rj~u+_pFeFw|xW>eUd!8juv=J>#9 zEyu%Iq##3{w7|g&g#RMlj!YXciy<-+Bw@H6(w=Ly=no=Eg(KvAfq|AnyX+Y)_8(Xn zI?j8dRGPby%uuWci*Y}KxNWvJFq#M;yI|hSuz)3wRYKt=jnhoDHGRJ@+u}gF#(rJ` zIMPLDDn0#5De&RSACgnfF^yBq>G}UjoT{#E!kIf?;T#(HeqRTDgFj#H!J&j3AE`sZ zgMwbTRIEwSBD@P(^-lXFGT~{#luFmP0F$wtO_BHh*P*wH%~%wLC6ZrBFVFwxorC||)!a(V zYt5cd(Uch+=2K)yb(69BP$&UN}>i21Hi4yt}b?rsWxH)S8dbx?AW>|x+%So4!+#+--nxE1vrGGW(@sn9>Z_;zr-KOmvc?KDZefb_&7 zX?!7^2r!FrZTX)<+|&# z|CAHdqZm>!;e>*6KgNPmb23&N4`m_Zrq{HOuRUIeDuO2{jJ8V{0+}yms!;}ey9tKA z^Y=I3n@04d@{e>GP!i3Zf!{~Nn%wJ!zSH2sC!TkITep56n^U*Fj|0PHt+bDayt!bJf5gAXi7)o#0^IdbSX;@L{ZVrt1ysZrJW#8Ln5z` z3vBBC7sQ#!khX!W3gLsf6+&3G9&N++e;Dfdb-f&M>Z3Owvyu(Lp+!;R_809EYTivT zATB<4>*M#AZYAtrfeSo@I43t3%*(W7_ zTKBk7Tqw~w-R1L6Pa`FfD*?Iz-bR`QpgFgDW;4osfu%G*X=RxawCwuV~`wWp6YH ztkl?Cb;&5aPmK4V$R-mt@+gt7B-LY|glerdozPq3`h6}T2z;^|h0DbSto+Mxejdse z@c2&Q!+CY=>n)u-`{Yu8o?shMV>_aUCk;uaKhsK6+M#*1Ns+{>8f5d%W=PR63X|O>Yfog#~%sj7M-I$>L z*=^_={a)D5P|#6LF>13s|3S4|B4%@`Jl2x0er!7Yx}ZOI;co9hR$UZ$ZVapv8`V|n z#3}Q&`qL^&^E;_lIP&~o36}#vsM_3`x62TMMZB*xEk$B zRnDeNxEGF7(7x*mcYkbb72QdK&#k>_-nJXRn$Y_b48(UR|8GpSF!m|j_>|dm`Jt!Z z1hCQ+emDE6KdhKe{j$Ev3|br$?FS0M#O$7lk!aL3>#2xCU&`ErN5~bG#-I zkDD~C5`10t@t5h36@Nr%{i19$%6Y8cYk|SH@1(F9+foCuNv}Yx+OEyxx0YcjI+Um< zAs?-@x75~qZPC&;YmK8KnR%uS|NscFK zj1`I^;T}L+EDQ*iy__{xjJAINDg~kQqWJJI9?e2ubk?Sabd_ZmWeX z;>_E7#_}=7Y$h5#a-|r03-n)-#1W1loq-Ch#WN2&2lfTRro)<&M!rx?-Va0WglDFh z$gwa)XId8ORX_ma^(n?TRnD0)XxyZu`VO${9}-OJayg+OUl7S@vkrJiMd@mvz#CA8 zze6t|H=W;Wc+`iW=!tm;GoS-eSxfns#mxUT{mlqP*mYOpI2jd9Mr7SgB|QKa&>!FC`e_QkQkeVeW&~FZ z<>5Mbhq+Dfo|Gws{G%kB6AApDF1UD9J_Li4#YsneRM!-Gzb;Y|4tqi0qeLvbEXivX zFfpyPK{yf`yM*q$e57COd2BqntBIIH*5~Bjzb(1DzJ}+x}a0#%&^JO_*zolB#T}mS!LQwG#QB zuYVx)*{`6J|NR9Z7ni&J_&^sl9E^TFMA*-wz7!Yxpk8FSi_TK2a}~vO$k2Hq&$6qfZ30R_>|cr^dl32{+H+v?cmrXK zEJD!C`8Y%n+i|j1kv`glyi@Xj0wfFD^mUfZnqo0kVAf1wW>1(>|Le=|D(%oaBvuRi zI;Z=JEX*?n@~gr^BVB9Rb$jo;#pvIi8Mhd+;8+rPsw^9?Up^37?w(RuCpD*jtwbTmT&_iR%C{Tu9g(l;LQBHPk zZT6gB+%!L>7W7N7h?ANVgD_VNqhiW81vZHdgmX`%g%17H4rO@Hsi0TqlDluaqC-Ve zP14SUT{?yk4^S4fIqR8AmS>MR>54CBEenYwj>!DnYSBUut*2&l$~XPm{qr}r1OhtP zG^&eK+D+KYIB&3f7}rvF@{xPK`P`j5ZPg=5PX(IGv9pXMmev&mEbLU;dF16!esJ7x zKKW`+DC6veZXmFrN44;^t(|ugw(kmT zWC;dd3VJ=U;mMF{hvSeF9Wv9y*yhRqg<3biC75+UOe(J@M96*WH_H zU<%%Hqdq156*5;cici@+6f6Cv#gu;vY-9<<3!9?vm?eri2>f)oKp(hhR zDdR}OpJm_<{i-z5{kO(Xyz2Ttd&w@$A7;>mPnH`l{i9q)@PIUOX>&>&Qu!xhd#-`G z(I;1sPA)vfETWEQuyOmLU0!|e_M}sjFqsK~B_q`&l?>tpVDzO1>6wcf2Jd`q=yZ_* zfdV@MHvkIKNkfn>G6f((QV~G;hwesJ1n{0vFPwf^892Jfj)R_k^ybp2%Tfe3^TA;h zvn~pg%QNkgA7nW)B9A@wmKEtNQ|!w82P7nuQdqKAn?MIJ=`H^hZ09xD$N+-P3>;21 z5(8fuP2G9R`Q1818HyY=nN=|E%T!_kGlf|Z1}IxhZaaTT>JN86CDUv(agGc;Z6SCB zH(G^hmMLSXopY}MUVkG4NLuU>qr~aeIe6{)Teca{G2*42kj1=2G_kZJ-4)_(W?4{X zZgz|demT0Xk>!{eRgQ6n1fmTl^8kss(X&`+@k4I17E=LGU?T%a4BkX}rsn3G&e?iM z$B5-RtY>OEc7)hw#+))fP^OM^!&Ggi{+#oF_tHN}m_|vkOSPg|XEAD->2 z*12btjK1x;Ctvv3aLQ!nc~;%#A`T<1vvP=`aHY}2_|c|x!BDXsS7ZY<<3$bepB9rc zQ(!Q`I-zU%>0h3AO+uhHb(N40u zkxd^3MXB)>&5S83tY%Ua*ujPX5QYvL;ik07MZw@QMgj$PBz@+|KfL&YW0|xkBJ)2n zG?_``=#wys@{t+6Oa^wDuZ;cV>g(??VjXCPNo=8bnd$nF&eB}3MS+p5Se=#>*bo4M z(|7_!f1zUFIzMg8t3P<3ZGUtAkx{XG7|b3G=v=o=n&&Jk;4=4MG+y7(_}=H!e{tE( z4O!-Jv1Bz(h_P=EH>zg=2u7^NMJG_5V%Kv+(?>t5+GDY=*mngSaFKq7dUdmGmu zwk-n4?^5R7b=$=y5&GC&mJt-Sg;7k4E8-<%k&K`9O?$@dB`2SL?fiO{QI4`+jYzHt zhBLkNQiL+63Yu`m%4rI02mqmNGAV=c$b^F#VJu;sb=rY_dUf?!xgAx+6uSr)7RF)@ zXDg^r*N1jVLneFLS=W8}ZG$J_^r$b@df z8JIErhFHUbqkp(pEaEvB%Mlvy(g}vInKnGDE=6J;mp52vU2yZ~GZuRSIA!Yq6q!#0 z7?D(!a21Ltx|j-`0viHAA}V5xx-o*IBC~QBlJmt>=oHux077Ok8*<=9;@Mwcc>Kr%hXDZu zk90TS4>H5F+vr3iOtj4krZ@fmsYjmtry1!aD9KH!!QGHaIUZ#gp>D}5=oLEkiuF?= zqU%5gIIP73nuWkFlncny!KoN75u-7){m>p)UV7}o-`maz8yqJlD<9$O!K~rPvQmCz z`kW=#-t^#eFTQI=E0`of6c+Q<$vPt(gCX{m$zIGK6|+&4KEmQ7(uF zW!_5sAjbd*jsu^%{r4L3@PpTtCmBzXwQ&?O3YGCQZ;=WKRur2_C!P=gM->@0q4gv6SnNb6g5qet%`Bob)F@*$i4T^r(~z~6)thIWclGiVIt}&2RAP!48a9PWmtwuvkpk;x1Hp2@ z(A-MGv`Kpsr|dQM>XNwsjw`x$W}*Yc3u21VUGiuJI-9<(c}wb!IQHi==GPf^sVsji zs!)lsb*y0Vw!)^sx&TO-w+J3ISFTeN$-?Tj^;XQg@(GzUklQ-+mnd1ak1rz<8Qts<+%>q2Wl@ zOFr`0SP?2#NVJaxB@)NsMP`4y?3Uj@$ZEs}w~3x20WWSKyDCAHSyA}3dGzoC>$Ylh zPD}s-C1wyRtinXpSS&j2t1rE5X2%_eM59C-%FJ}w&%e6*o=>JPAs|tWNd+r9Y0zld zlM`0zLJ>(#6l#Ni*9}1OVw%k`UK>Md*bV)oX7v3}zL@aEG^ez4O{(#euNU0^$he1} zdCkY-#+xW|tEH0ChBGorHRe|o+Xg9Dtg@njxdBF|hD0%^BM!@;OS|1AxCeg^-4xh2 z2%RSLx=8TNk^<}43TyS<>CB+n6)+z+e-0$L9K)#rN7+6et2{V^Ox9lv@N) zJ7M(3dd(t$HWp>uNx4M;wG&2ftk*08Xk$^fos?SyP&;At#(K>nfHoFo+ex|q566>S U`6VZaEC2ui07*qoM6N<$f<5rzEC2ui literal 0 HcmV?d00001 diff --git a/third_party/daloopa/mcp.json b/third_party/daloopa/mcp.json new file mode 100644 index 000000000..35c9d26ca --- /dev/null +++ b/third_party/daloopa/mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "daloopa": { + "type": "http", + "url": "https://mcp.daloopa.com/server/mcp" + } + } +} From f4a966992f4de00e159109872a68394b316ec373 Mon Sep 17 00:00:00 2001 From: Minu Palaniappan Date: Thu, 10 Sep 2026 13:14:48 -0700 Subject: [PATCH 09/10] feat(third_party): add Excalidraw plugin --- .cursor-plugin/marketplace.json | 5 ++ README.md | 1 + .../excalidraw/.cursor-plugin/plugin.json | 35 +++++++++++ third_party/excalidraw/CHANGELOG.md | 9 +++ third_party/excalidraw/LICENSE | 21 +++++++ third_party/excalidraw/README.md | 58 ++++++++++++++++++ third_party/excalidraw/assets/logo.png | Bin 0 -> 8049 bytes third_party/excalidraw/mcp.json | 8 +++ 8 files changed, 137 insertions(+) create mode 100644 third_party/excalidraw/.cursor-plugin/plugin.json create mode 100644 third_party/excalidraw/CHANGELOG.md create mode 100644 third_party/excalidraw/LICENSE create mode 100644 third_party/excalidraw/README.md create mode 100644 third_party/excalidraw/assets/logo.png create mode 100644 third_party/excalidraw/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 6d723b166..5ff10ceb1 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -392,6 +392,11 @@ "name": "daloopa", "source": "third_party/daloopa", "description": "Pull source-linked fundamentals, KPIs, filings, and prices." + }, + { + "name": "excalidraw", + "source": "third_party/excalidraw", + "description": "Draw and export hand-drawn diagrams from chat." } ] } diff --git a/README.md b/README.md index e9fceb3e8..6cff83a32 100644 --- a/README.md +++ b/README.md @@ -79,6 +79,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `interactive-brokers` | [Interactive Brokers](third_party/interactive-brokers/) | Cursor | Integrations | Review positions, balances, P&L, and draft trade instructions. | | `meltwater` | [Meltwater](third_party/meltwater/) | Cursor | Integrations | Search media and social mentions and pull analytics. | | `daloopa` | [Daloopa](third_party/daloopa/) | Cursor | Integrations | Pull source-linked fundamentals, KPIs, filings, and prices. | +| `excalidraw` | [Excalidraw](third_party/excalidraw/) | Cursor | Integrations | Draw and export hand-drawn diagrams from chat. | 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/excalidraw/.cursor-plugin/plugin.json b/third_party/excalidraw/.cursor-plugin/plugin.json new file mode 100644 index 000000000..d9699ad1b --- /dev/null +++ b/third_party/excalidraw/.cursor-plugin/plugin.json @@ -0,0 +1,35 @@ +{ + "name": "excalidraw", + "displayName": "Excalidraw", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.13.0" + }, + "description": "Draw and export hand-drawn diagrams from chat.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://github.com/excalidraw/excalidraw-mcp", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "excalidraw", + "diagrams", + "whiteboard", + "sketch", + "flowchart", + "architecture", + "mcp apps", + "mcp" + ], + "category": "integrations", + "tags": [ + "excalidraw", + "diagrams", + "productivity", + "mcp" + ], + "mcpServers": "./mcp.json" +} diff --git a/third_party/excalidraw/CHANGELOG.md b/third_party/excalidraw/CHANGELOG.md new file mode 100644 index 000000000..88ed37b98 --- /dev/null +++ b/third_party/excalidraw/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `excalidraw` MCP server pointing at Excalidraw's hosted Streamable HTTP endpoint (`https://mcp.excalidraw.com/mcp`). +- No auth — the public server needs no credentials. +- Logo: Excalidraw's official mark, from the `excalidraw` GitHub organization. diff --git a/third_party/excalidraw/LICENSE b/third_party/excalidraw/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/excalidraw/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/excalidraw/README.md b/third_party/excalidraw/README.md new file mode 100644 index 000000000..6b5e04455 --- /dev/null +++ b/third_party/excalidraw/README.md @@ -0,0 +1,58 @@ +# Excalidraw + +Cursor plugin that connects agents to [Excalidraw](https://github.com/excalidraw/excalidraw-mcp) through Excalidraw's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Draw and export hand-drawn diagrams from chat. + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **Excalidraw**. +3. Click **Install**. + +Or run `/add-plugin excalidraw` in chat. + +## MCP + +```json +{ + "mcpServers": { + "excalidraw": { + "type": "http", + "url": "https://mcp.excalidraw.com/mcp" + } + } +} +``` + +No authentication is required; the server covers public repositories only. + +## Before you connect + +No account is needed. The hosted server renders diagrams as interactive MCP App views in clients that support them, and can export `.excalidraw` files anywhere. + +## What agents can do + +| Category | Capabilities | +| --- | --- | +| Draw | Create a diagram view from elements the agent describes | +| Export | Export the current drawing to an `.excalidraw` file | +| Checkpoints | Save and restore drawing checkpoints within a session | + +The hosted runtime is the source of truth for tool names and schemas. + +## Notes + +- This is the open-source Excalidraw MCP server. Excalidraw+ workspaces use a separate authenticated endpoint (`https://api.excalidraw.com/api/v1/mcp`) that this plugin does not configure. +- The bare origin `https://mcp.excalidraw.com` redirects to `/mcp`; the plugin uses the final URL. + +## Docs + +- excalidraw-mcp on GitHub: https://github.com/excalidraw/excalidraw-mcp +- Server URL: https://mcp.excalidraw.com/mcp + +Logo is Excalidraw's official mark, from the `excalidraw` GitHub organization. + +## License + +MIT diff --git a/third_party/excalidraw/assets/logo.png b/third_party/excalidraw/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..608b31bd912c3f17f5d90fbd41b47c18f7931f39 GIT binary patch literal 8049 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 MT0#L_D`ph*KNo{}-~a#s literal 0 HcmV?d00001 diff --git a/third_party/excalidraw/mcp.json b/third_party/excalidraw/mcp.json new file mode 100644 index 000000000..55f551ef8 --- /dev/null +++ b/third_party/excalidraw/mcp.json @@ -0,0 +1,8 @@ +{ + "mcpServers": { + "excalidraw": { + "type": "http", + "url": "https://mcp.excalidraw.com/mcp" + } + } +} From f5bdd6826fd0a0d9cbc4347134c3a74a200b9d9d Mon Sep 17 00:00:00 2001 From: lauren Date: Thu, 10 Sep 2026 18:17:03 -0700 Subject: [PATCH 10/10] fix(pstack): operator-neutral pronouns + in-chat status tick (#362) * fix(pstack): operator-neutral pronouns + in-chat status tick The autopilot playbooks and the multi-phase plan refer to the human operator as she, her, and herself. Replace each with the operator, or with they where the paragraph has no owner to confuse it with. The audit tick prompt in the plan skeleton now reads post a status message to the operator in chat instead of send the operator a status message, so a root posts status in the chat it runs in rather than to a named person or channel. Co-authored-by: lauren * chore(pstack): bump to 0.15.2 Co-authored-by: lauren --------- Co-authored-by: Cursor Agent --- pstack/.cursor-plugin/plugin.json | 2 +- pstack/skills/poteto-mode/SKILL.md | 2 +- pstack/skills/poteto-mode/playbooks/autopilot-full.md | 6 +++--- pstack/skills/poteto-mode/playbooks/autopilot-stack.md | 6 +++--- pstack/skills/poteto-mode/playbooks/multi-phase-plan.md | 6 +++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pstack/.cursor-plugin/plugin.json b/pstack/.cursor-plugin/plugin.json index 4b9eca388..19402321c 100644 --- a/pstack/.cursor-plugin/plugin.json +++ b/pstack/.cursor-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "pstack", "displayName": "pstack", - "version": "0.15.1", + "version": "0.15.2", "description": "if you want to go fast, go deep first. pstack helps you write less, but higher quality code. rigorous agent workflows you can parallelize with confidence.", "author": { "name": "Lauren Tan" diff --git a/pstack/skills/poteto-mode/SKILL.md b/pstack/skills/poteto-mode/SKILL.md index 2de0216e7..7559dea02 100644 --- a/pstack/skills/poteto-mode/SKILL.md +++ b/pstack/skills/poteto-mode/SKILL.md @@ -135,7 +135,7 @@ A large or cross-cutting effort (a migration across many call sites, an ambitiou - **Autonomous run.** A long task to drive to completion without stopping ("run until done", "/loop until X"). `playbooks/autonomous-run.md`. - **Orchestrate.** A standing project handed to one coordinator chat: multi-day, many stacked PRs, dozens to hundreds of subagents, minimal human turns ("run this whole project", "own this migration until it lands"). Distinct from Autonomous run, which drives one task to a predicate. Work one agent could finish inside the session's budget routes there, not here, however program-shaped the phrasing sounds. `playbooks/orchestrate.md`. - **Autopilot-full.** A queue of independent PRs run to merged with full autonomy. One owner per PR carries build through merge, and the root swarm-verifies each merge-ready head before its owner merges ("autopilot this queue", "full autopilot", one-owner-per-PR programs). `playbooks/autopilot-full.md`. -- **Autopilot-stack.** A queue of changes built and verified with full autonomy, delivered as one linear reviewed base-branch stack the operator lands herself ("autopilot-stack", "stack them, don't ship", "build the stack, I'll land it"). `playbooks/autopilot-stack.md`. +- **Autopilot-stack.** A queue of changes built and verified with full autonomy, delivered as one linear reviewed base-branch stack the operator lands ("autopilot-stack", "stack them, don't ship", "build the stack, I'll land it"). `playbooks/autopilot-stack.md`. - **Session pickup.** Resuming or taking over a prior agent's in-flight work from a transcript, cloud-agent URL, or pushed branch. `playbooks/session-pickup.md`. - **Pause safely.** Suspending in-flight work cleanly so it can be resumed, on an explicit pause, going offline, a Cursor restart, or imminent context compaction. The complement to Session pickup. Full steps: `playbooks/pause-safely.md`. - **Multi-phase or multi-PR plan.** Work that spans phases or stacked PRs. `playbooks/multi-phase-plan.md`. diff --git a/pstack/skills/poteto-mode/playbooks/autopilot-full.md b/pstack/skills/poteto-mode/playbooks/autopilot-full.md index 4aa1bb858..785325047 100644 --- a/pstack/skills/poteto-mode/playbooks/autopilot-full.md +++ b/pstack/skills/poteto-mode/playbooks/autopilot-full.md @@ -2,12 +2,12 @@ **You own the verdicts, never the PRs. One owner runs each PR from build to merge, and nothing merges without your clean swarm verdict.** For "autopilot this queue", "full autopilot", and one-owner-per-PR programs. Orchestrate runs a standing program whose coordinator lands verified work itself and whose workers never merge. Here each PR's owner carries the whole lifecycle through the merge, and the root keeps only verification, countersigns, and audits. -1. **Mark the operator's items and honor state-then-wait.** Items the operator names stay hers. She reviews and she clicks, and no owner merges one. When she asks for the protocol or the plan to be stated, deliver the statement and stop. Execution starts only on her explicit go. On that go, arm a `/goal` with the full program objective. The goal continues across turns until the queue is done. +1. **Mark the operator's items and honor state-then-wait.** Items the operator names stay with the operator. The operator reviews and clicks, and no owner merges one. When the operator asks for the protocol or the plan to be stated, deliver the statement and stop. Execution starts only on the operator's explicit go. On that go, arm a `/goal` with the full program objective. The goal continues across turns until the queue is done. 2. **Spawn one owner per PR with the full lifecycle and an early trail.** Resolve the forge once for the program. GitHub CLI (`gh`) is the default. If `command -v origin` succeeds and Origin can resolve the repository, use `origin pr ...` for PR create, edit, view, watch, and merge operations. Otherwise stay on `gh` and record the fallback. Never require Graphite (`gt`). One Cursor cloud agent per PR owns build, the first push, a ready PR, self-proof on the real artifact (the **prove-it-works** principle skill), skeptical Bugbot triage per `../references/bugbot-triage.md`, a slop-strip (the `deslop` skill from the `cursor-team-kit` plugin (`/deslop`)), `/no-comments` (the **no-comments** skill), a rebase onto current trunk, the babysit loop to green (`playbooks/babysit.md`), and the merge itself. Within about 15 minutes, every owner starts a `decisions.tsv` trail per the **show-me-your-work** skill, pushes its first branch snapshot, and opens the PR ready, never draft. Open the PR before self-proof so the URL, decisions, and checks form a durable trail. Keep `decisions.tsv` uncommitted and return it with the reports. The rebase always precedes babysit and never waits for drift or conflicts. The merge is the one step an owner may not take alone. Step 4 gates it. 3. **Run owners in true parallel and never stack.** Many owners at once when PRs are self-contained: one writer per branch, disjoint files, cross-PR drift absorbed by rebase. Only genuinely overlapping work serializes. Self-contained PRs branch straight off main, and sequenced work is merge-then-branch. One exception: an owner that must split a genuinely dependent change may hold a short private base-branch stack. 4. **Swarm-verify every merge-ready head before its merge.** At the owner's merge-ready head SHA, fan out parallel independent verifiers per the **swarm** skill and aggregate to one verdict. The lanes: re-run the gates at that SHA. Prove the load-bearing behavior live on the real surface the change touches (`control-cli` or `control-ui` from `cursor-team-kit` as the change demands). Audit the receipts and the diff, distrusting the PR body. **Regression lane against trunk.** Run the same load-bearing scenario on current trunk. If trunk does not have the feature, record that fact and gate the behavior the diff adds plus the end state the user waits for instead of pretending trunk can produce it. The live lane is the floor, and a verdict without it is not clean. No merge without the root's clean verdict. Findings go back to the owner for fix-forward, and the new head gets a fresh swarm and a fresh verdict. -5. **On a clean verdict the owner merges and takes the next item.** The owner merges only from a head freshly rebased onto trunk. The merge-ready report is made at a trunk-current head, and the swarm verdict pins that SHA. If trunk moves again before the merge, the patch-id rule in `playbooks/shipping.md` governs re-verification. A new head voids the verdict unless the patch-id is unchanged. The owner squash-merges its own PR through the resolved forge and picks up its next self-contained item from the queue. The operator's full-autonomy grant plus the root's clean verdict is the merge authorization that babysitting alone never has. Operator-named items stop at merge-ready and wait for her click. +5. **On a clean verdict the owner merges and takes the next item.** The owner merges only from a head freshly rebased onto trunk. The merge-ready report is made at a trunk-current head, and the swarm verdict pins that SHA. If trunk moves again before the merge, the patch-id rule in `playbooks/shipping.md` governs re-verification. A new head voids the verdict unless the patch-id is unchanged. The owner squash-merges its own PR through the resolved forge and picks up its next self-contained item from the queue. The operator's full-autonomy grant plus the root's clean verdict is the merge authorization that babysitting alone never has. Operator-named items stop at merge-ready and wait for the operator's click. 6. **Run the root layer.** A genuinely new raise of a pinned gate or budget value (a limit CI only lets tighten) needs your fresh countersign, granted only after verifier proof. Absorbing values that already landed on main is drift, not a raise. Run an audit tick over all owners roughly every 30 minutes. A local root arms each tick as a real terminal `/loop`. The loop uses a monitored-shell 30-minute sleep and emits an output-notification sentinel. A cloud root uses the existing cloud-sleeper wake chain instead. Never leave the cadence to memory or lossy completion notifications. At each tick, re-read this playbook from trunk with `git show origin/main:pstack/skills/poteto-mode/playbooks/autopilot-full.md`, then re-read the armed `/goal`. Audit the operation against both. Fix drift during that tick. Probe each owner with a generic liveness or status check, and collect the decision trails. Count only side effects as progress: commits, pushes, PR or check deltas, and store reports. Treat a lane that passes its expected runtime without a side effect as stuck. Stand it down and dispatch a replacement at once. Do not wait for a polite return. When merges batch, run a retro pass and a post-merge bot-comment sweep. -7. **Stand down instantly on the operator's stop.** Her hold or stand-down reaches every owner as a zero-writes order immediately. Owners hold their briefs until she releases them. +7. **Stand down instantly on the operator's stop.** The operator's hold or stand-down reaches every owner as a zero-writes order immediately. Owners hold their briefs until the operator releases them. **Reply:** the queue with each PR's owner, state, and head SHA. Each verdict and the swarm that produced it. What merged and what each owner took next. Countersigns granted and why. Open operator gates. Where the collected decision trails live. diff --git a/pstack/skills/poteto-mode/playbooks/autopilot-stack.md b/pstack/skills/poteto-mode/playbooks/autopilot-stack.md index b65afb587..f5b6e1df8 100644 --- a/pstack/skills/poteto-mode/playbooks/autopilot-stack.md +++ b/pstack/skills/poteto-mode/playbooks/autopilot-stack.md @@ -1,15 +1,15 @@ ### Autopilot-stack -**You own the stack, never the landing. Build and verify the queue with full autonomy, then hand the operator one linear base-branch stack she reviews and lands herself.** The sibling of **Autopilot-full**. +**You own the stack, never the landing. Build and verify the queue with full autonomy, then hand the operator one linear base-branch stack to review and land.** The sibling of **Autopilot-full**. 1. **Run the owner loop unchanged.** Resolve the forge once for the program. GitHub CLI (`gh`) is the default. If `command -v origin` succeeds and Origin can resolve the repository, use `origin pr ...` for PR create, edit, view, watch, and merge operations. Otherwise stay on `gh` and record the fallback. Never require Graphite (`gt`). One Cursor cloud agent per PR owns its change end to end: build, first push, a ready PR opened before self-proof, self-proof (gates, CI, receipts), skeptical Bugbot triage per `../references/bugbot-triage.md`, a slop-strip (the `deslop` skill from the `cursor-team-kit` plugin (`/deslop`)), `/no-comments` (the **no-comments** skill), and babysit to green per `playbooks/babysit.md`. Owners parallelize when the work is self-contained. Within about 15 minutes, every owner starts a `decisions.tsv` trail per the **show-me-your-work** skill, pushes its first branch snapshot, and opens the PR ready, never draft. Keep the trail uncommitted and return it in the report. 2. **Audit on the wake chain.** The root runs an audit tick roughly every 30 minutes. A local root arms each tick as a real terminal `/loop`. The loop uses a monitored-shell 30-minute sleep and emits an output-notification sentinel. A cloud root uses the existing cloud-sleeper wake chain instead. Never leave the cadence to memory or lossy completion notifications. At each tick, re-read this playbook from trunk with `git show origin/main:pstack/skills/poteto-mode/playbooks/autopilot-stack.md`, then re-read the armed `/goal`. Audit the operation against both. Fix drift during that tick. Probe each owner with a generic liveness or status check. Count only side effects as progress: commits, pushes, PR or check deltas, and store reports. Treat a lane that passes its expected runtime without a side effect as stuck. Stand it down and dispatch a replacement at once. Do not wait for a polite return. -3. **Hold the operator gates.** State-then-wait, so a request to state the plan is not a go. On her explicit go, arm a `/goal` with the full program objective. The goal continues across turns until the chain is done. On her stop, every owner takes an immediate zero-writes hold. +3. **Hold the operator gates.** State-then-wait, so a request to state the plan is not a go. On the operator's explicit go, arm a `/goal` with the full program objective. The goal continues across turns until the chain is done. On the operator's stop, every owner takes an immediate zero-writes hold. 4. **Verify at STACK-READY.** The owner reports STACK-READY with the exact head SHA. The root swarm-verifies that SHA, fan-out per the **swarm** skill: parallel independent verifiers re-running the gates at that SHA, a live runtime floor over the load-bearing behavior, and a receipts-and-diff audit that distrusts the PR body. The swarm aggregates to one verdict. Findings go back to the owner, and nothing enters the stack unverified. 5. **Append on a clean verdict, never ship.** No owner merges, arms auto-merge, or closes. A clean verdict appends the PR to the one linear base-branch stack, in verified order or an order the operator specified. 6. **Single writer on topology, parallel writers on builds.** Owners push only their own branches and report the tip, current base, and intended parent. The root is the only topology writer. To append a PR, fetch the intended parent, rebase the child branch onto that exact parent tip, push with `--force-with-lease` only after an `ls-remote` check, and set the PR base to the parent branch. Create it with `origin pr create --status open --base ` or `gh pr create --base ` according to the resolved forge. Retarget an existing PR with `origin pr edit --base ` or `gh pr edit --base `. Only the root PR targets trunk. Never submit or register the chain through `gt`. 7. **Absorb drift at the root, then re-verify what moved.** The root fetches current trunk and rebases the chain from bottom to top. When a rebase surfaces conflicts in an owner's files, that owner fixes its own slice and the root pushes the result. A rebase rewrites every SHA above it and voids verdicts at the old SHAs. Compare the stable `git patch-id` for each PR's base-to-head diff at its verdict SHA against its new base-to-head diff. An unchanged patch-id preserves the code verdict. Any changed patch goes back through step 4 before delivery. Re-run mergeability and CI after every rewritten push even when the patch-id is unchanged. The countersign rule is unchanged from Autopilot-full. A genuinely new pin raises a stop for the root's fresh countersign. Absorbing drift of landed values is not a raise. -8. **Deliver the chain.** The deliverable is one linear chain of verified PRs, reviewable bottom-up in the resolved forge, every link carrying its verifier verdict in the PR body or a comment. The operator reviews and lands it, with her own clicks or with merge-when-ready she arms herself. +8. **Deliver the chain.** The deliverable is one linear chain of verified PRs, reviewable bottom-up in the resolved forge, every link carrying its verifier verdict in the PR body or a comment. The operator reviews and lands it, with their own clicks or by arming merge-when-ready. **Choosing between the autopilots.** Autopilot-full when the PRs are independent and landing authority is granted. Autopilot-stack when the operator wants review before landing, the work is sequenced or coupled, or merge authority is withheld. diff --git a/pstack/skills/poteto-mode/playbooks/multi-phase-plan.md b/pstack/skills/poteto-mode/playbooks/multi-phase-plan.md index b7b19769f..1fd40dd3f 100644 --- a/pstack/skills/poteto-mode/playbooks/multi-phase-plan.md +++ b/pstack/skills/poteto-mode/playbooks/multi-phase-plan.md @@ -31,8 +31,8 @@ Tests alone are not sufficient verification. A PR is verified only when its unit ### Arm the program -- [ ] State the protocol and this plan to the operator, then stop. Start execution only on her explicit go. -- [ ] On her go, arm a `/goal` with this exact text. "" +- [ ] State the protocol and this plan to the operator, then stop. Start execution only on the operator's explicit go. +- [ ] On the operator's go, arm a `/goal` with this exact text. "" - [ ] Read these from trunk at program start. Re-read them at every tick. - [ ] `git show origin/main:pstack/skills/poteto-mode/playbooks/.md` - [ ] `git show origin/main:pstack/skills/swarm/SKILL.md` @@ -40,7 +40,7 @@ Tests alone are not sufficient verification. A PR is verified only when its unit - [ ] `git show origin/main:pstack/skills/poteto-mode/playbooks/opening-a-pr.md` - [ ] `git show origin/main:pstack/skills/` - [ ] Arm the 30-minute audit tick. In a local session, a real terminal `/loop`. In a cloud root, a cloud-sleeper wake chain. Never leave the cadence to memory. -- [ ] Use this tick prompt, verbatim. "Re-read the execution playbook from trunk and the armed /goal. Audit the operation against both and fix drift in this tick. Probe every active lane and judge progress by side effects only. Stand down a stuck lane and dispatch its replacement now. Then send the operator a status message, whether or not anything changed, with the queue table of PR, owner, state, and head SHA, the verdicts since the last tick, what merged, open operator gates, and blockers." +- [ ] Use this tick prompt, verbatim. "Re-read the execution playbook from trunk and the armed /goal. Audit the operation against both and fix drift in this tick. Probe every active lane and judge progress by side effects only. Stand down a stuck lane and dispatch its replacement now. Then post a status message to the operator in chat, whether or not anything changed, with the queue table of PR, owner, state, and head SHA, the verdicts since the last tick, what merged, open operator gates, and blockers." - [ ] On the operator's hold or stand-down, send every owner a zero-writes order at once. ### Spawn owners