diff --git a/.claude-plugin/.upstream-base b/.claude-plugin/.upstream-base index df1d185ce3..e0747a8c5f 100644 --- a/.claude-plugin/.upstream-base +++ b/.claude-plugin/.upstream-base @@ -1 +1 @@ -de8ee15dd1194627d21eb5fcd41cb1873208dabb +5866df557357d005b3c0c9d3da0d9e739b4bdde3 diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index b8fdf4b576..19da8e1423 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", @@ -643,11 +638,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", @@ -712,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/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/framer/LICENSE b/third_party/eight-sleep/LICENSE similarity index 100% rename from third_party/framer/LICENSE rename to third_party/eight-sleep/LICENSE 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 0000000000..851414d4b4 Binary files /dev/null and b/third_party/eight-sleep/assets/logo.png differ diff --git a/third_party/framer/mcp.json b/third_party/eight-sleep/mcp.json similarity index 54% rename from third_party/framer/mcp.json rename to third_party/eight-sleep/mcp.json index 6bb11c4357..5b5e68f964 100644 --- a/third_party/framer/mcp.json +++ b/third_party/eight-sleep/mcp.json @@ -1,8 +1,8 @@ { "mcpServers": { - "framer": { + "eight-sleep": { "type": "http", - "url": "https://mcp.framer.com/mcp", + "url": "https://public-api.8slp.net/mcp", "placement": "server" } } 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/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 cdcbf1b887..0000000000 Binary files a/third_party/framer/assets/logo.png and /dev/null differ 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 bf4a1cc4d1..0000000000 Binary files a/third_party/jobber/assets/logo.png and /dev/null differ diff --git a/third_party/jobber/mcp.json b/third_party/jobber/mcp.json deleted file mode 100644 index 6b796335d1..0000000000 --- a/third_party/jobber/mcp.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "mcpServers": { - "jobber": { - "type": "http", - "url": "https://mcp.getjobber.com/mcp", - "auth": { - "CLIENT_ID": "${CLIENT_ID}", - "CLIENT_SECRET": "${CLIENT_SECRET}" - } - } - } -}