From 5fbaaa88889a2027e483598125d852ec0d76f13c Mon Sep 17 00:00:00 2001 From: djiang-jq Date: Tue, 10 Nov 2026 12:30:58 -0800 Subject: [PATCH 1/5] remove(third_party): remove Jobber plugin Co-authored-by: Cursor --- .cursor-plugin/marketplace.json | 5 -- README.md | 1 - third_party/jobber/.cursor-plugin/plugin.json | 56 -------------- third_party/jobber/CHANGELOG.md | 9 --- third_party/jobber/LICENSE | 21 ------ third_party/jobber/README.md | 69 ------------------ third_party/jobber/assets/logo.png | Bin 14668 -> 0 bytes third_party/jobber/mcp.json | 12 --- 8 files changed, 173 deletions(-) delete mode 100644 third_party/jobber/.cursor-plugin/plugin.json delete mode 100644 third_party/jobber/CHANGELOG.md delete mode 100644 third_party/jobber/LICENSE delete mode 100644 third_party/jobber/README.md delete mode 100644 third_party/jobber/assets/logo.png delete mode 100644 third_party/jobber/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index b8fdf4b576..63a19413c6 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -618,11 +618,6 @@ "sand": "0.49.0" } }, - { - "name": "jobber", - "source": "third_party/jobber", - "description": "Work with clients, requests, quotes, jobs, visits, and invoices." - }, { "name": "databricks-genie", "source": "third_party/databricks-genie", diff --git a/README.md b/README.md index 62354c3e3b..eccfcf2337 100644 --- a/README.md +++ b/README.md @@ -113,7 +113,6 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `tiktok-for-business` | [TikTok for Business](third_party/tiktok-for-business/) | Cursor | Integrations | Manage TikTok ad campaigns, ad groups, ads, audiences, creatives, and reports. | | `gusto` | [Gusto](third_party/gusto/) | Cursor | Integrations | Work with payroll, employees, contractors, time off, and reports. | | `gopuff` | [Gopuff](third_party/gopuff/) | Cursor | Integrations | Shop Gopuff from Grok Bot through Gopuff's official MCP server. Sign in with your Gopuff account; Gopuff handles the sign-in, and your searches, carts, and orders go to Gopuff under that account, so any order you place is charged and delivered like a normal Gopuff order. | -| `jobber` | [Jobber](third_party/jobber/) | Cursor | Integrations | Work with clients, requests, quotes, jobs, visits, and invoices. | | `databricks-genie` | [Databricks Genie](third_party/databricks-genie/) | Cursor | Integrations | Ask Databricks Genie questions about your workspace's data in plain language. | | `lark` | [Lark](third_party/lark/) | Cursor | Integrations | Search, create, and update Lark Suite docs, and read Lark messages and groups. | | `lark-base` | [Lark Base](third_party/lark-base/) | Cursor | Integrations | Read and update tables, fields, views, and records in Lark Base. | diff --git a/third_party/jobber/.cursor-plugin/plugin.json b/third_party/jobber/.cursor-plugin/plugin.json deleted file mode 100644 index 072e901603..0000000000 --- a/third_party/jobber/.cursor-plugin/plugin.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "name": "jobber", - "displayName": "Jobber", - "version": "1.0.0", - "minClientVersions": { - "cursor": "3.13.0" - }, - "description": "Work with clients, requests, quotes, jobs, visits, and invoices.", - "author": { - "name": "Cursor", - "email": "plugins@cursor.com" - }, - "homepage": "https://www.getjobber.com/", - "repository": "https://github.com/cursor/plugins", - "license": "MIT", - "logo": "assets/logo.png", - "keywords": [ - "jobber", - "field service", - "home service", - "clients", - "requests", - "quotes", - "jobs", - "visits", - "invoices", - "scheduling", - "mcp" - ], - "category": "integrations", - "tags": [ - "jobber", - "field service", - "mcp" - ], - "variables": { - "type": "object", - "properties": { - "CLIENT_ID": { - "type": "string", - "title": "Jobber Client ID", - "description": "Client ID from your app in the Jobber Developer Center." - }, - "CLIENT_SECRET": { - "type": "string", - "title": "Jobber Client Secret", - "description": "Client Secret from the same Jobber Developer Center app." - } - }, - "required": [ - "CLIENT_ID", - "CLIENT_SECRET" - ] - }, - "mcpServers": "./mcp.json" -} diff --git a/third_party/jobber/CHANGELOG.md b/third_party/jobber/CHANGELOG.md deleted file mode 100644 index a7c03cd940..0000000000 --- a/third_party/jobber/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -All notable changes to this plugin will be documented here. - -## 1.0.0 — initial release - -- Logo: Jobber's official mark, provided by Jobber. -- Added the `jobber` MCP server pointing at `https://mcp.getjobber.com/mcp`. -- Declared `CLIENT_ID` and `CLIENT_SECRET` plugin variables and forwarded them through MCP auth, since Jobber requires manual OAuth client registration. diff --git a/third_party/jobber/LICENSE b/third_party/jobber/LICENSE deleted file mode 100644 index ca2bba771c..0000000000 --- a/third_party/jobber/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/jobber/README.md b/third_party/jobber/README.md deleted file mode 100644 index c2eddf75c6..0000000000 --- a/third_party/jobber/README.md +++ /dev/null @@ -1,69 +0,0 @@ -# Jobber - -Cursor plugin that connects agents to [Jobber](https://www.getjobber.com/) through Jobber's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. - -Look up and manage clients, requests, and quotes, and read jobs, visits, and invoices in the signed-in Jobber account. - -## Install - -1. Open **Cursor Settings → Plugins**. -2. Search for **Jobber**. -3. Click **Install**, then set the Client ID and Client Secret (below) and complete the Jobber sign-in prompt. - -Or run `/add-plugin jobber` in chat. - -## MCP - -```json -{ - "mcpServers": { - "jobber": { - "type": "http", - "url": "https://mcp.getjobber.com/mcp", - "auth": { - "CLIENT_ID": "${CLIENT_ID}", - "CLIENT_SECRET": "${CLIENT_SECRET}" - } - } - } -} -``` - -## Setup - -Jobber's OAuth server does not support Dynamic Client Registration and authenticates clients with a secret, so a Jobber app has to be registered before anyone can connect. - -1. Sign in to the [Jobber Developer Center](https://developer.getjobber.com/) and create an app. -2. Register both redirect URIs on that app: - - Desktop: `http://localhost:8787/callback` - - Web and Cloud Agents: `https://www.cursor.com/agents/mcp/oauth/callback` -3. Grant the MCP scopes the connection should have (listed below), then copy the app's **Client ID** and **Client Secret**. -4. In **Dashboard → Plugins → Configure**, set **Jobber Client ID** and **Jobber Client Secret** from that app. -5. Complete the Jobber OAuth login when Cursor prompts. - -On a team marketplace an admin can set the credentials once for everyone; each member still completes their own Jobber OAuth login, so tool calls run with that member's Jobber permissions. - -## What agents can do - -| Area | Scopes | -| --- | --- | -| Clients | `mcp:read_clients`, `mcp:write_clients` | -| Requests | `mcp:read_requests`, `mcp:write_requests` | -| Quotes | `mcp:read_quotes`, `mcp:write_quotes` | -| Jobs | `mcp:read_jobs` | -| Invoices | `mcp:read_invoices` | -| Visits | `mcp:read_visits` | - -Jobs, invoices, and visits are read-only. The hosted runtime is the source of truth for tool names and schemas. - -## Docs - -- Jobber: https://www.getjobber.com/ -- Jobber Developer Center: https://developer.getjobber.com/ -- Server URL: https://mcp.getjobber.com/mcp - -Logo is Jobber's official mark, provided by Jobber. - -## License - -MIT diff --git a/third_party/jobber/assets/logo.png b/third_party/jobber/assets/logo.png deleted file mode 100644 index bf4a1cc4d18b2a8845d4359620a0cf3da50ac591..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14668 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 j>)(lCe>=stKEOUOe Date: Tue, 10 Nov 2026 12:37:34 -0800 Subject: [PATCH 2/5] remove(third_party): remove Framer plugin Co-authored-by: Cursor --- .cursor-plugin/marketplace.json | 5 -- README.md | 1 - third_party/framer/.cursor-plugin/plugin.json | 34 ----------- third_party/framer/CHANGELOG.md | 9 --- third_party/framer/LICENSE | 21 ------- third_party/framer/README.md | 56 ------------------ third_party/framer/assets/logo.png | Bin 886 -> 0 bytes third_party/framer/mcp.json | 9 --- 8 files changed, 135 deletions(-) delete mode 100644 third_party/framer/.cursor-plugin/plugin.json delete mode 100644 third_party/framer/CHANGELOG.md delete mode 100644 third_party/framer/LICENSE delete mode 100644 third_party/framer/README.md delete mode 100644 third_party/framer/assets/logo.png delete mode 100644 third_party/framer/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index b8fdf4b576..f007524ae4 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -643,11 +643,6 @@ "source": "third_party/feishu", "description": "Search, create, and update Feishu docs, and read Feishu messages and groups." }, - { - "name": "framer", - "source": "third_party/framer", - "description": "Design, build, and edit your Framer sites, pages, and CMS content." - }, { "name": "vanta", "source": "third_party/vanta", diff --git a/README.md b/README.md index 62354c3e3b..97414ae226 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,6 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `lark` | [Lark](third_party/lark/) | Cursor | Integrations | Search, create, and update Lark Suite docs, and read Lark messages and groups. | | `lark-base` | [Lark Base](third_party/lark-base/) | Cursor | Integrations | Read and update tables, fields, views, and records in Lark Base. | | `feishu` | [Feishu](third_party/feishu/) | Cursor | Integrations | Search, create, and update Feishu docs, and read Feishu messages and groups. | -| `framer` | [Framer](third_party/framer/) | Cursor | Integrations | Design, build, and edit your Framer sites, pages, and CMS content. | | `vanta` | [Vanta](third_party/vanta/) | Cursor | Integrations | Query and remediate compliance tests, controls, frameworks, risks, and vulnerabilities in Vanta. | | `ringcentral-phone` | [RingCentral Phone](third_party/ringcentral-phone/) | Cursor | Integrations | Read call activity, AI call notes, SMS, voicemail, and fax, and send SMS. | | `ringcentral-chat` | [RingCentral Chat](third_party/ringcentral-chat/) | Cursor | Integrations | Read team chats and posts, send messages, and manage teams, tasks, and notes. | diff --git a/third_party/framer/.cursor-plugin/plugin.json b/third_party/framer/.cursor-plugin/plugin.json deleted file mode 100644 index 2a815b2c4f..0000000000 --- a/third_party/framer/.cursor-plugin/plugin.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "framer", - "displayName": "Framer", - "version": "1.0.0", - "minClientVersions": { - "cursor": "3.13.0" - }, - "description": "Design, build, and edit your Framer sites, pages, and CMS content.", - "author": { - "name": "Cursor", - "email": "plugins@cursor.com" - }, - "homepage": "https://www.framer.com", - "repository": "https://github.com/cursor/plugins", - "license": "MIT", - "logo": "assets/logo.png", - "keywords": [ - "framer", - "website", - "design", - "cms", - "no-code", - "mcp" - ], - "category": "integrations", - "tags": [ - "framer", - "design", - "website", - "cms", - "mcp" - ], - "mcpServers": "./mcp.json" -} diff --git a/third_party/framer/CHANGELOG.md b/third_party/framer/CHANGELOG.md deleted file mode 100644 index 04b028ea34..0000000000 --- a/third_party/framer/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -All notable changes to this plugin will be documented here. - -## 1.0.0 — initial release - -- Added the `framer` MCP server pointing at Framer's hosted Streamable HTTP endpoint (`https://mcp.framer.com/mcp`), with `"placement": "server"` so Grok Bot connects through Cursor's hosted path. -- Auth uses MCP OAuth with Framer account login, Dynamic Client Registration, and PKCE — no API token, client secret, or custom header to configure. -- Logo: Framer's official black logo mark, from `https://misc.framerstatic.com/logo-black.svg` (Framer B.V.). diff --git a/third_party/framer/LICENSE b/third_party/framer/LICENSE deleted file mode 100644 index ca2bba771c..0000000000 --- a/third_party/framer/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/framer/README.md b/third_party/framer/README.md deleted file mode 100644 index b963dc2fac..0000000000 --- a/third_party/framer/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Framer - -Cursor plugin that connects agents to [Framer](https://www.framer.com) through Framer's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. - -Give the agent a Framer project URL and ask for what you want, such as a new section on a page, a layout or copy change, or an update to your CMS content. - -Framer's own plugin repository: https://github.com/framer/agent-plugins - -## Install - -1. Open **Cursor Settings → Plugins**. -2. Search for **Framer**. -3. Click **Install**, then complete the Framer sign-in prompt. - -Or run `/add-plugin framer` in chat. - -## MCP - -```json -{ - "mcpServers": { - "framer": { - "type": "http", - "url": "https://mcp.framer.com/mcp", - "placement": "server" - } - } -} -``` - -Auth is MCP OAuth (Bearer). Cursor discovers the authorization server when the plugin connects and prompts for Framer login. Framer supports Dynamic Client Registration with PKCE, so there is no API token, client ID, client secret, or custom header to configure. - -## Before you connect - -You need a Framer account with access to the projects you want the agent to work on. Unauthenticated requests to the server are rejected until that login completes. - -## Notes - -- Tool calls run as the Framer user who authorizes the connection and cannot exceed that user's permissions. -- The agent can change and publish your sites. Review changes in the Framer editor before publishing. -- What the agent reads from or changes in your projects goes through Framer's servers, under the [Framer Privacy Statement](https://www.framer.com/legal/privacy-statement/). -- OAuth metadata is discovered at connect time (protected resource `https://mcp.framer.com/.well-known/oauth-protected-resource/mcp`, authorization server `https://api.framer.com/auth/oauth`, scope `mcp:project`). -- Framer's client registration accepts `http://localhost` and `https` return addresses only. `"placement": "server"` makes Grok Bot connect through Cursor's hosted `https` callback. -- The hosted runtime is the source of truth for tool names and schemas; tools are listed after sign-in. - -## Docs - -- Framer: https://www.framer.com -- Framer agent plugins: https://github.com/framer/agent-plugins -- Server URL: https://mcp.framer.com/mcp - -Logo is Framer's official black logo mark, from `https://misc.framerstatic.com/logo-black.svg` (Framer B.V.). - -## License - -MIT diff --git a/third_party/framer/assets/logo.png b/third_party/framer/assets/logo.png deleted file mode 100644 index cdcbf1b8873b8af1c07b6347a7002b6eae13cd9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 886 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE2}s`E_d5Vcu_bxCyDOf}ON+8qJJlbL5 z!fk3GeHZ31wzfshGy}>B8?%c@t;+udG-B#m`GAZS%T$4iLpOT?6(<4^#m(CLMga)msg^G+3Q*R^`2GW4UtZ2vFg~NNJ$} z>tHjL19-R(;~VJE38hL7p?y ztD`%3dsA+2d;IanC*|2U#e<_Bw{1GVv}qb|>U}TSvr?z*rexhRnNq82YMP<(+eK^j z-GFbkSHib0eDgSCQJnM5=@-400yQjJC6BXb z$}XT0EGzZ$HGVT~ioFr=t;VXr)A{D@mxpiirt&YBer`Ht@2q)qE(Ux{vD& Date: Tue, 10 Nov 2026 20:22:35 -0800 Subject: [PATCH 3/5] feat(third_party): add the Canva plugin Connect agents to Canva's hosted MCP server at https://mcp.canva.com/mcp over OAuth. Co-authored-by: Cursor --- .cursor-plugin/marketplace.json | 5 ++ README.md | 1 + third_party/canva/.cursor-plugin/plugin.json | 35 +++++++++ third_party/canva/CHANGELOG.md | 9 +++ third_party/canva/LICENSE | 21 +++++ third_party/canva/README.md | 77 +++++++++++++++++++ third_party/canva/assets/logo.png | Bin 0 -> 34112 bytes third_party/canva/mcp.json | 9 +++ 8 files changed, 157 insertions(+) create mode 100644 third_party/canva/.cursor-plugin/plugin.json create mode 100644 third_party/canva/CHANGELOG.md create mode 100644 third_party/canva/LICENSE create mode 100644 third_party/canva/README.md create mode 100644 third_party/canva/assets/logo.png create mode 100644 third_party/canva/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index fb29412d4e..ba402580e8 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -702,6 +702,11 @@ "name": "metricool", "source": "third_party/metricool", "description": "Plan and publish social posts, pull metrics and reports, and manage inbox, reviews, and ads across your Metricool brands." + }, + { + "name": "canva", + "source": "third_party/canva", + "description": "Generate, edit, resize, and export Canva designs, and manage assets, folders, brand templates, and comments." } ] } diff --git a/README.md b/README.md index 4afaabbd79..8f1ad43faf 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `fitmetrics` | [FitMetrics](third_party/fitmetrics/) | Cursor | Integrations | Review Trainerize clients and check-ins, and update macros, messages, and programs. | | `mixpanel` | [Mixpanel](third_party/mixpanel/) | Cursor | Integrations | Query events, funnels, flows, and retention in Mixpanel, and manage dashboards, cohorts, experiments, and feature flags. | | `metricool` | [Metricool](third_party/metricool/) | Cursor | Integrations | Plan and publish social posts, pull metrics and reports, and manage inbox, reviews, and ads across your Metricool brands. | +| `canva` | [Canva](third_party/canva/) | Cursor | Integrations | Generate, edit, resize, and export Canva designs, and manage assets, folders, brand templates, and comments. | 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/canva/.cursor-plugin/plugin.json b/third_party/canva/.cursor-plugin/plugin.json new file mode 100644 index 0000000000..3d4aaf5398 --- /dev/null +++ b/third_party/canva/.cursor-plugin/plugin.json @@ -0,0 +1,35 @@ +{ + "name": "canva", + "displayName": "Canva", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.13.0" + }, + "description": "Generate, edit, resize, and export Canva designs, and manage assets, folders, brand templates, and comments.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://www.canva.dev/docs/apps/mcp/", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "canva", + "design", + "graphics", + "presentations", + "brand templates", + "assets", + "export", + "mcp" + ], + "category": "integrations", + "tags": [ + "canva", + "design", + "marketing", + "mcp" + ], + "mcpServers": "./mcp.json" +} diff --git a/third_party/canva/CHANGELOG.md b/third_party/canva/CHANGELOG.md new file mode 100644 index 0000000000..ae6594734b --- /dev/null +++ b/third_party/canva/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `canva` MCP server pointing at Canva's hosted Streamable HTTP endpoint (`https://mcp.canva.com/mcp`). +- Auth uses OAuth with Canva user login (authorization code + PKCE, dynamic client registration, Client ID Metadata Documents) — no API key, client ID, or Developer Portal app to configure. +- Logo: Canva's official mark, the 180×180 web app icon published on canva.dev. diff --git a/third_party/canva/LICENSE b/third_party/canva/LICENSE new file mode 100644 index 0000000000..ca2bba771c --- /dev/null +++ b/third_party/canva/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/canva/README.md b/third_party/canva/README.md new file mode 100644 index 0000000000..a6728f04bc --- /dev/null +++ b/third_party/canva/README.md @@ -0,0 +1,77 @@ +# Canva + +Cursor plugin that connects agents to [Canva](https://www.canva.com) through Canva's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Generate and edit designs, search your design library, upload and organize assets, work with brand kits and templates, and export to PDF, PNG, JPG, PPTX, or MP4 from chat. + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **Canva**. +3. Click **Install**, then complete the Canva sign-in prompt. + +Or run `/add-plugin canva` in chat. + +In Grok Bot, open **Settings → Plugins**, install **Canva**, and complete the same Canva sign-in. + +## MCP + +```json +{ + "mcpServers": { + "canva": { + "type": "http", + "url": "https://mcp.canva.com/mcp", + "placement": "server" + } + } +} +``` + +Auth is OAuth. `https://mcp.canva.com` is its own authorization server and advertises dynamic client registration and Client ID Metadata Documents, with the authorization code flow and PKCE (S256), so there is no API key, client ID, or client secret to configure. Cursor or Grok Bot prompts for Canva sign-in when the plugin connects. + +Canva also runs an MCP endpoint at `https://api.canva.com/connect/v1/mcp` for apps that bring their own client ID and secret from the [Developer Portal](https://www.canva.com/developers/). This plugin packages the connector endpoint instead, so no Developer Portal app is needed. + +`"placement": "server"` makes Grok Bot dial the server through the hosted MCP path. + +## Before you connect + +You need a Canva account. Every user signs in individually with their own account — Canva stores designs, assets, and permissions per user and does not support organization-level or service-account auth for MCP. Core features work on the Free plan; some capabilities need Canva Pro or above. See [Canva pricing](https://www.canva.com/pricing/). + +## What agents can do + +| Category | Capabilities | +| --- | --- | +| Designs | Search designs and folders, read pages, content, and presenter notes, generate designs from a prompt, create, copy, and merge designs | +| Editing | Apply edits through editing transactions and read design thumbnails | +| Images | Generate images, remove backgrounds, and separate image layers | +| Exports | Export designs as PDF, PNG, JPG, PPTX, or MP4, and resize designs for other channels (resize needs Pro) | +| Assets | Upload assets from a URL and browse your uploads | +| Folders | Create and search folders, list their items, and move items between them | +| Brand | Search brand templates, list brand kits, create designs from a template, and draft and publish templates (Pro and above) | +| Autofill | Autofill designs and brand templates from a dataset (Pro and above) | +| Comments | Read comments and replies, comment on a design, and reply | +| Imports | Import a design from a URL | + +Pro and above is required for resizing, autofill, brand kits, and brand templates. The hosted runtime is the source of truth for tool names and schemas. See [Canva's MCP tool reference](https://www.canva.dev/docs/apps/mcp/tools/) for the full list, rate limits, and plan availability. + +## Notes + +- The connection grants access similar to signing in to Canva directly. Tools can create, edit, and delete content in your Canva account, and comments are visible to everyone with access to the design. Confirm the design before letting the agent edit or comment. +- Available operations match your own Canva permissions. Editing tools only work on designs and assets you can already edit. +- Design generation and image generation are asynchronous. The agent polls the returned job and should surface the design's edit link when it finishes. +- Exports on the Free plan are standard quality. Designs containing premium elements can fail to export with `license_required` until the elements are licensed. +- Revoke access by disconnecting the plugin or from your Canva account settings. + +## Docs + +- Canva MCP overview: https://www.canva.dev/docs/apps/mcp/ +- Tools and rate limits: https://www.canva.dev/docs/apps/mcp/tools/ +- Access and permissions: https://www.canva.dev/docs/apps/mcp/access/ +- Server URL: https://mcp.canva.com/mcp + +Logo is Canva's official mark, from the 180×180 web app icon published on canva.dev. + +## License + +MIT diff --git a/third_party/canva/assets/logo.png b/third_party/canva/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d43d0f8ba5d1b44c7f9c999ee6b31c924cb74efe GIT binary patch literal 34112 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 Date: Tue, 10 Nov 2026 21:00:37 -0800 Subject: [PATCH 4/5] Revert "feat(third_party): add the Canva plugin" --- .cursor-plugin/marketplace.json | 5 -- README.md | 1 - third_party/canva/.cursor-plugin/plugin.json | 35 --------- third_party/canva/CHANGELOG.md | 9 --- third_party/canva/LICENSE | 21 ----- third_party/canva/README.md | 77 ------------------- third_party/canva/assets/logo.png | Bin 34112 -> 0 bytes third_party/canva/mcp.json | 9 --- 8 files changed, 157 deletions(-) delete mode 100644 third_party/canva/.cursor-plugin/plugin.json delete mode 100644 third_party/canva/CHANGELOG.md delete mode 100644 third_party/canva/LICENSE delete mode 100644 third_party/canva/README.md delete mode 100644 third_party/canva/assets/logo.png delete mode 100644 third_party/canva/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index ba402580e8..fb29412d4e 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -702,11 +702,6 @@ "name": "metricool", "source": "third_party/metricool", "description": "Plan and publish social posts, pull metrics and reports, and manage inbox, reviews, and ads across your Metricool brands." - }, - { - "name": "canva", - "source": "third_party/canva", - "description": "Generate, edit, resize, and export Canva designs, and manage assets, folders, brand templates, and comments." } ] } diff --git a/README.md b/README.md index 8f1ad43faf..4afaabbd79 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,6 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `fitmetrics` | [FitMetrics](third_party/fitmetrics/) | Cursor | Integrations | Review Trainerize clients and check-ins, and update macros, messages, and programs. | | `mixpanel` | [Mixpanel](third_party/mixpanel/) | Cursor | Integrations | Query events, funnels, flows, and retention in Mixpanel, and manage dashboards, cohorts, experiments, and feature flags. | | `metricool` | [Metricool](third_party/metricool/) | Cursor | Integrations | Plan and publish social posts, pull metrics and reports, and manage inbox, reviews, and ads across your Metricool brands. | -| `canva` | [Canva](third_party/canva/) | Cursor | Integrations | Generate, edit, resize, and export Canva designs, and manage assets, folders, brand templates, and comments. | 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/canva/.cursor-plugin/plugin.json b/third_party/canva/.cursor-plugin/plugin.json deleted file mode 100644 index 3d4aaf5398..0000000000 --- a/third_party/canva/.cursor-plugin/plugin.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "canva", - "displayName": "Canva", - "version": "1.0.0", - "minClientVersions": { - "cursor": "3.13.0" - }, - "description": "Generate, edit, resize, and export Canva designs, and manage assets, folders, brand templates, and comments.", - "author": { - "name": "Cursor", - "email": "plugins@cursor.com" - }, - "homepage": "https://www.canva.dev/docs/apps/mcp/", - "repository": "https://github.com/cursor/plugins", - "license": "MIT", - "logo": "assets/logo.png", - "keywords": [ - "canva", - "design", - "graphics", - "presentations", - "brand templates", - "assets", - "export", - "mcp" - ], - "category": "integrations", - "tags": [ - "canva", - "design", - "marketing", - "mcp" - ], - "mcpServers": "./mcp.json" -} diff --git a/third_party/canva/CHANGELOG.md b/third_party/canva/CHANGELOG.md deleted file mode 100644 index ae6594734b..0000000000 --- a/third_party/canva/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# Changelog - -All notable changes to this plugin will be documented here. - -## 1.0.0 — initial release - -- Added the `canva` MCP server pointing at Canva's hosted Streamable HTTP endpoint (`https://mcp.canva.com/mcp`). -- Auth uses OAuth with Canva user login (authorization code + PKCE, dynamic client registration, Client ID Metadata Documents) — no API key, client ID, or Developer Portal app to configure. -- Logo: Canva's official mark, the 180×180 web app icon published on canva.dev. diff --git a/third_party/canva/LICENSE b/third_party/canva/LICENSE deleted file mode 100644 index ca2bba771c..0000000000 --- a/third_party/canva/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/canva/README.md b/third_party/canva/README.md deleted file mode 100644 index a6728f04bc..0000000000 --- a/third_party/canva/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# Canva - -Cursor plugin that connects agents to [Canva](https://www.canva.com) through Canva's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. - -Generate and edit designs, search your design library, upload and organize assets, work with brand kits and templates, and export to PDF, PNG, JPG, PPTX, or MP4 from chat. - -## Install - -1. Open **Cursor Settings → Plugins**. -2. Search for **Canva**. -3. Click **Install**, then complete the Canva sign-in prompt. - -Or run `/add-plugin canva` in chat. - -In Grok Bot, open **Settings → Plugins**, install **Canva**, and complete the same Canva sign-in. - -## MCP - -```json -{ - "mcpServers": { - "canva": { - "type": "http", - "url": "https://mcp.canva.com/mcp", - "placement": "server" - } - } -} -``` - -Auth is OAuth. `https://mcp.canva.com` is its own authorization server and advertises dynamic client registration and Client ID Metadata Documents, with the authorization code flow and PKCE (S256), so there is no API key, client ID, or client secret to configure. Cursor or Grok Bot prompts for Canva sign-in when the plugin connects. - -Canva also runs an MCP endpoint at `https://api.canva.com/connect/v1/mcp` for apps that bring their own client ID and secret from the [Developer Portal](https://www.canva.com/developers/). This plugin packages the connector endpoint instead, so no Developer Portal app is needed. - -`"placement": "server"` makes Grok Bot dial the server through the hosted MCP path. - -## Before you connect - -You need a Canva account. Every user signs in individually with their own account — Canva stores designs, assets, and permissions per user and does not support organization-level or service-account auth for MCP. Core features work on the Free plan; some capabilities need Canva Pro or above. See [Canva pricing](https://www.canva.com/pricing/). - -## What agents can do - -| Category | Capabilities | -| --- | --- | -| Designs | Search designs and folders, read pages, content, and presenter notes, generate designs from a prompt, create, copy, and merge designs | -| Editing | Apply edits through editing transactions and read design thumbnails | -| Images | Generate images, remove backgrounds, and separate image layers | -| Exports | Export designs as PDF, PNG, JPG, PPTX, or MP4, and resize designs for other channels (resize needs Pro) | -| Assets | Upload assets from a URL and browse your uploads | -| Folders | Create and search folders, list their items, and move items between them | -| Brand | Search brand templates, list brand kits, create designs from a template, and draft and publish templates (Pro and above) | -| Autofill | Autofill designs and brand templates from a dataset (Pro and above) | -| Comments | Read comments and replies, comment on a design, and reply | -| Imports | Import a design from a URL | - -Pro and above is required for resizing, autofill, brand kits, and brand templates. The hosted runtime is the source of truth for tool names and schemas. See [Canva's MCP tool reference](https://www.canva.dev/docs/apps/mcp/tools/) for the full list, rate limits, and plan availability. - -## Notes - -- The connection grants access similar to signing in to Canva directly. Tools can create, edit, and delete content in your Canva account, and comments are visible to everyone with access to the design. Confirm the design before letting the agent edit or comment. -- Available operations match your own Canva permissions. Editing tools only work on designs and assets you can already edit. -- Design generation and image generation are asynchronous. The agent polls the returned job and should surface the design's edit link when it finishes. -- Exports on the Free plan are standard quality. Designs containing premium elements can fail to export with `license_required` until the elements are licensed. -- Revoke access by disconnecting the plugin or from your Canva account settings. - -## Docs - -- Canva MCP overview: https://www.canva.dev/docs/apps/mcp/ -- Tools and rate limits: https://www.canva.dev/docs/apps/mcp/tools/ -- Access and permissions: https://www.canva.dev/docs/apps/mcp/access/ -- Server URL: https://mcp.canva.com/mcp - -Logo is Canva's official mark, from the 180×180 web app icon published on canva.dev. - -## License - -MIT diff --git a/third_party/canva/assets/logo.png b/third_party/canva/assets/logo.png deleted file mode 100644 index d43d0f8ba5d1b44c7f9c999ee6b31c924cb74efe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34112 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 Date: Wed, 11 Nov 2026 00:07:15 -0800 Subject: [PATCH 5/5] feat(third_party): add the Eight Sleep plugin Connect agents to Eight Sleep's hosted MCP server at https://public-api.8slp.net/mcp over OAuth. Co-authored-by: Cursor --- .cursor-plugin/marketplace.json | 5 ++ README.md | 1 + .../eight-sleep/.cursor-plugin/plugin.json | 36 ++++++++ third_party/eight-sleep/CHANGELOG.md | 9 ++ third_party/eight-sleep/LICENSE | 21 +++++ third_party/eight-sleep/README.md | 82 ++++++++++++++++++ third_party/eight-sleep/assets/logo.png | Bin 0 -> 7438 bytes third_party/eight-sleep/mcp.json | 9 ++ 8 files changed, 163 insertions(+) create mode 100644 third_party/eight-sleep/.cursor-plugin/plugin.json create mode 100644 third_party/eight-sleep/CHANGELOG.md create mode 100644 third_party/eight-sleep/LICENSE create mode 100644 third_party/eight-sleep/README.md create mode 100644 third_party/eight-sleep/assets/logo.png create mode 100644 third_party/eight-sleep/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index fb29412d4e..19da8e1423 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -702,6 +702,11 @@ "name": "metricool", "source": "third_party/metricool", "description": "Plan and publish social posts, pull metrics and reports, and manage inbox, reviews, and ads across your Metricool brands." + }, + { + "name": "eight-sleep", + "source": "third_party/eight-sleep", + "description": "Connect your Eight Sleep account to see your sleep scores, stages and heart metrics, check your Pod's status and temperature settings, and manage your alarms and your side of the Pod, with your approval for each change." } ] } diff --git a/README.md b/README.md index 4afaabbd79..ccfa6c688a 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `fitmetrics` | [FitMetrics](third_party/fitmetrics/) | Cursor | Integrations | Review Trainerize clients and check-ins, and update macros, messages, and programs. | | `mixpanel` | [Mixpanel](third_party/mixpanel/) | Cursor | Integrations | Query events, funnels, flows, and retention in Mixpanel, and manage dashboards, cohorts, experiments, and feature flags. | | `metricool` | [Metricool](third_party/metricool/) | Cursor | Integrations | Plan and publish social posts, pull metrics and reports, and manage inbox, reviews, and ads across your Metricool brands. | +| `eight-sleep` | [Eight Sleep](third_party/eight-sleep/) | Cursor | Integrations | Connect your Eight Sleep account to see your sleep scores, stages and heart metrics, check your Pod's status and temperature settings, and manage your alarms and your side of the Pod, with your approval for each change. | 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/eight-sleep/.cursor-plugin/plugin.json b/third_party/eight-sleep/.cursor-plugin/plugin.json new file mode 100644 index 0000000000..112eb78eb5 --- /dev/null +++ b/third_party/eight-sleep/.cursor-plugin/plugin.json @@ -0,0 +1,36 @@ +{ + "name": "eight-sleep", + "displayName": "Eight Sleep", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.13.0" + }, + "description": "Connect your Eight Sleep account to see your sleep scores, stages and heart metrics, check your Pod's status and temperature settings, and manage your alarms and your side of the Pod, with your approval for each change.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://public-api.8slp.net/connectors", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "eight sleep", + "sleep", + "pod", + "sleep tracking", + "hrv", + "heart rate", + "temperature", + "alarms", + "mcp" + ], + "category": "integrations", + "tags": [ + "eight-sleep", + "sleep", + "health", + "mcp" + ], + "mcpServers": "./mcp.json" +} diff --git a/third_party/eight-sleep/CHANGELOG.md b/third_party/eight-sleep/CHANGELOG.md new file mode 100644 index 0000000000..0235768106 --- /dev/null +++ b/third_party/eight-sleep/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `eight-sleep` MCP server pointing at Eight Sleep's hosted Streamable HTTP endpoint (`https://public-api.8slp.net/mcp`). +- Auth uses OAuth with Eight Sleep user login (authorization code + PKCE, dynamic client registration, scopes `read_sleep`, `read_device`, and `write_device`) — no API key or client ID to configure. +- Logo: Eight Sleep's official "8" mark, the 180×180 web app icon published on eightsleep.com. diff --git a/third_party/eight-sleep/LICENSE b/third_party/eight-sleep/LICENSE new file mode 100644 index 0000000000..ca2bba771c --- /dev/null +++ b/third_party/eight-sleep/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/eight-sleep/README.md b/third_party/eight-sleep/README.md new file mode 100644 index 0000000000..face15bf40 --- /dev/null +++ b/third_party/eight-sleep/README.md @@ -0,0 +1,82 @@ +# Eight Sleep + +Cursor plugin that connects agents to [Eight Sleep](https://www.eightsleep.com) through Eight Sleep's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Read your sleep scores, stages and heart metrics, check your Pod's status and temperature settings, and manage your alarms and your side of the Pod. Every change is confirmed with you first. + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **Eight Sleep**. +3. Click **Install**, then complete the Eight Sleep sign-in prompt and allow the access you want to grant. + +Or run `/add-plugin eight-sleep` in chat. + +In Grok Bot, open **Settings → Plugins**, install **Eight Sleep**, and complete the same Eight Sleep sign-in. + +## MCP + +```json +{ + "mcpServers": { + "eight-sleep": { + "type": "http", + "url": "https://public-api.8slp.net/mcp", + "placement": "server" + } + } +} +``` + +Auth is OAuth. Eight Sleep uses the authorization code flow with PKCE (S256) and dynamic client registration against `https://auth-api.8slp.net`, so there is no API key or client ID to configure. Cursor or Grok Bot prompts for Eight Sleep sign-in when the plugin connects, and each user signs in with their own account. + +`"placement": "server"` makes Grok Bot dial the server through the hosted MCP path. + +## Before you connect + +You need an Eight Sleep account and a Pod. Alarms and the temperature schedule also need an active Eight Sleep membership, and alarms need your timezone set in the app. + +## Scopes + +Access is split into three scopes, and the agent only gets the ones you grant: + +| Scope | Grants | +| --- | --- | +| `read_sleep` | Sleep days and sleep sessions | +| `read_device` | Pod status, temperature settings, and alarms | +| `write_device` | "Control your device": change your alarms, power, temperature, and schedule | + +A connection made before `write_device` existed can only read. To allow changes, disconnect Eight Sleep in your agent and connect it again, allowing "control your device" when asked. + +## What agents can do + +| Category | Tools | +| --- | --- | +| Sleep | `get_sleep_days`, `get_sleep_sessions`, `get_sleep_session` | +| Pod | `get_device_status`, `get_temperature_settings` | +| Alarms | `list_alarms`, `create_alarm`, `update_alarm`, `delete_alarm` | +| Changes | `set_pod_power`, `set_temperature`, `update_temperature_schedule` | + +The hosted runtime is the source of truth for tool names and schemas. See the [Eight Sleep connector docs](https://public-api.8slp.net/connectors) for details. + +## Notes + +- Write tools only touch your own account and your own side of the bed, never your partner's. The server instructs the agent to confirm each change with you first, and each change reports what it did and how to undo it. +- Temperatures use the app's dial, from -10 (coolest) to +10 (warmest). +- Power, temperature, and schedule changes need an online Pod, meaning one that has reported in during the last 10 minutes. On a Pod 6 or later, the cover on your side must also be connected. Nothing changes while away mode is on. Alarm changes work offline and reach the Pod when it reconnects. +- The connector cannot stop or snooze a ringing alarm, toggle Autopilot or away mode, move the base, or cancel a therapy session. +- Everything returned is a measurement or setting from your account. No tool diagnoses, treats, or offers medical guidance. +- Rate limits: 60 calls per minute per connection, plus a cap of 10 change requests every 5 minutes and 50 per day. +- Revoke access from **Data Sharing** in the Eight Sleep app's settings, or by disconnecting the plugin. Revocation takes effect within five minutes. + +## Docs + +- Eight Sleep connector: https://public-api.8slp.net/connectors +- Server URL: https://public-api.8slp.net/mcp +- Support: support@eightsleep.com + +Logo is Eight Sleep's official "8" mark, from the 180×180 web app icon published on eightsleep.com. + +## License + +MIT diff --git a/third_party/eight-sleep/assets/logo.png b/third_party/eight-sleep/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..851414d4b4fca00ae65fccc6c72e9cb7712eba50 GIT binary patch literal 7438 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 literal 0 HcmV?d00001 diff --git a/third_party/eight-sleep/mcp.json b/third_party/eight-sleep/mcp.json new file mode 100644 index 0000000000..5b5e68f964 --- /dev/null +++ b/third_party/eight-sleep/mcp.json @@ -0,0 +1,9 @@ +{ + "mcpServers": { + "eight-sleep": { + "type": "http", + "url": "https://public-api.8slp.net/mcp", + "placement": "server" + } + } +}