From a89d684f796252a055669d5893d9db3d4e686d77 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 22 Oct 2026 01:11:59 +0000 Subject: [PATCH] Sync plugins-main to cursor/plugins f2bad52 (190d287..f2bad52) Co-authored-by: omegamaster --- plugins-main/.cursor-plugin/marketplace.json | 20 +++++ plugins-main/README.md | 4 + .../.cursor-plugin/plugin.json | 60 +++++++++++++++ .../databricks-genie-one/CHANGELOG.md | 14 ++++ .../third_party/databricks-genie-one/LICENSE | 21 +++++ .../databricks-genie-one/README.md | 72 ++++++++++++++++++ .../databricks-genie-one/assets/logo.png | Bin 0 -> 4953 bytes .../third_party/databricks-genie-one/mcp.json | 13 ++++ .../feishu/.cursor-plugin/plugin.json | 32 ++++++++ plugins-main/third_party/feishu/CHANGELOG.md | 9 +++ plugins-main/third_party/feishu/LICENSE | 21 +++++ plugins-main/third_party/feishu/README.md | 65 ++++++++++++++++ .../third_party/feishu/assets/logo.png | Bin 0 -> 8441 bytes plugins-main/third_party/feishu/mcp.json | 8 ++ .../framer/.cursor-plugin/plugin.json | 34 +++++++++ plugins-main/third_party/framer/CHANGELOG.md | 9 +++ plugins-main/third_party/framer/LICENSE | 21 +++++ plugins-main/third_party/framer/README.md | 56 ++++++++++++++ .../third_party/framer/assets/logo.png | Bin 0 -> 886 bytes plugins-main/third_party/framer/mcp.json | 9 +++ .../.cursor-plugin/plugin.json | 25 +++++- .../google-cloud-bigquery/CHANGELOG.md | 4 + .../google-cloud-bigquery/README.md | 17 ++++- .../google-cloud-bigquery/mcp.json | 6 +- .../lark/.cursor-plugin/plugin.json | 33 ++++++++ plugins-main/third_party/lark/CHANGELOG.md | 9 +++ plugins-main/third_party/lark/LICENSE | 21 +++++ plugins-main/third_party/lark/README.md | 65 ++++++++++++++++ plugins-main/third_party/lark/assets/logo.png | Bin 0 -> 8441 bytes plugins-main/third_party/lark/mcp.json | 8 ++ 30 files changed, 651 insertions(+), 5 deletions(-) create mode 100644 plugins-main/third_party/databricks-genie-one/.cursor-plugin/plugin.json create mode 100644 plugins-main/third_party/databricks-genie-one/CHANGELOG.md create mode 100644 plugins-main/third_party/databricks-genie-one/LICENSE create mode 100644 plugins-main/third_party/databricks-genie-one/README.md create mode 100644 plugins-main/third_party/databricks-genie-one/assets/logo.png create mode 100644 plugins-main/third_party/databricks-genie-one/mcp.json create mode 100644 plugins-main/third_party/feishu/.cursor-plugin/plugin.json create mode 100644 plugins-main/third_party/feishu/CHANGELOG.md create mode 100644 plugins-main/third_party/feishu/LICENSE create mode 100644 plugins-main/third_party/feishu/README.md create mode 100644 plugins-main/third_party/feishu/assets/logo.png create mode 100644 plugins-main/third_party/feishu/mcp.json create mode 100644 plugins-main/third_party/framer/.cursor-plugin/plugin.json create mode 100644 plugins-main/third_party/framer/CHANGELOG.md create mode 100644 plugins-main/third_party/framer/LICENSE create mode 100644 plugins-main/third_party/framer/README.md create mode 100644 plugins-main/third_party/framer/assets/logo.png create mode 100644 plugins-main/third_party/framer/mcp.json create mode 100644 plugins-main/third_party/lark/.cursor-plugin/plugin.json create mode 100644 plugins-main/third_party/lark/CHANGELOG.md create mode 100644 plugins-main/third_party/lark/LICENSE create mode 100644 plugins-main/third_party/lark/README.md create mode 100644 plugins-main/third_party/lark/assets/logo.png create mode 100644 plugins-main/third_party/lark/mcp.json diff --git a/plugins-main/.cursor-plugin/marketplace.json b/plugins-main/.cursor-plugin/marketplace.json index f1e01ff..61c11c0 100644 --- a/plugins-main/.cursor-plugin/marketplace.json +++ b/plugins-main/.cursor-plugin/marketplace.json @@ -597,6 +597,26 @@ "name": "jobber", "source": "third_party/jobber", "description": "Work with clients, requests, quotes, jobs, visits, and invoices." + }, + { + "name": "databricks-genie-one", + "source": "third_party/databricks-genie-one", + "description": "Ask Databricks Genie questions about your workspace's data in plain language." + }, + { + "name": "lark", + "source": "third_party/lark", + "description": "Search, create, and update Lark Suite docs, and read Lark messages and groups." + }, + { + "name": "feishu", + "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." } ] } diff --git a/plugins-main/README.md b/plugins-main/README.md index cdcc7ac..ba44ad6 100644 --- a/plugins-main/README.md +++ b/plugins-main/README.md @@ -109,6 +109,10 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `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-one` | [Databricks Genie One](third_party/databricks-genie-one/) | 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. | +| `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. | Author values match each plugin’s `plugin.json` `author.name` (Cursor lists `plugins@cursor.com` in the manifest). ## Repository structure diff --git a/plugins-main/third_party/databricks-genie-one/.cursor-plugin/plugin.json b/plugins-main/third_party/databricks-genie-one/.cursor-plugin/plugin.json new file mode 100644 index 0000000..4371307 --- /dev/null +++ b/plugins-main/third_party/databricks-genie-one/.cursor-plugin/plugin.json @@ -0,0 +1,60 @@ +{ + "name": "databricks-genie-one", + "displayName": "Databricks Genie One", + "version": "1.0.1", + "minClientVersions": { + "cursor": "3.19.0" + }, + "description": "Ask Databricks Genie questions about your workspace's data in plain language.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://github.com/cursor/plugins/tree/main/third_party/databricks-genie-one", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "databricks", + "genie", + "genie one", + "data", + "analytics", + "sql", + "lakehouse", + "mcp" + ], + "category": "integrations", + "tags": [ + "databricks", + "data", + "analytics", + "mcp" + ], + "variables": { + "type": "object", + "additionalProperties": false, + "required": [ + "DATABRICKS_HOST", + "CLIENT_ID" + ], + "properties": { + "DATABRICKS_HOST": { + "type": "string", + "title": "Workspace hostname", + "description": "For example, dbc-a1b2c3d4-e5f6.cloud.databricks.com" + }, + "CLIENT_ID": { + "type": "string", + "title": "Client ID" + }, + "CLIENT_SECRET": { + "type": "string", + "title": "Client secret", + "writeOnly": true, + "format": "password" + } + } + }, + "mcpServers": "./mcp.json" +} diff --git a/plugins-main/third_party/databricks-genie-one/CHANGELOG.md b/plugins-main/third_party/databricks-genie-one/CHANGELOG.md new file mode 100644 index 0000000..796051b --- /dev/null +++ b/plugins-main/third_party/databricks-genie-one/CHANGELOG.md @@ -0,0 +1,14 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.1 — Genie icon + +- Logo: replaced the Databricks mark with Databricks' official Genie icon from https://www.databricks.com/sites/default/files/2026-05/icon-genie.svg, rendered at 192×192 on a transparent background. No server or client-version changes. + +## 1.0.0 — initial release + +- Added the `databricks-genie-one` MCP server pointing at `https://${DATABRICKS_HOST}/ai-gateway/mcp-services/system.ai.genie_one_mcp`. +- Declared `DATABRICKS_HOST`, `CLIENT_ID`, and optional `CLIENT_SECRET` plugin variables for the team's Databricks OAuth app connection, since Databricks has no dynamic client registration. +- Requests the `ai-gateway` and `offline_access` scopes. +- Logo: Databricks' official mark, from the `databricks` GitHub organization. diff --git a/plugins-main/third_party/databricks-genie-one/LICENSE b/plugins-main/third_party/databricks-genie-one/LICENSE new file mode 100644 index 0000000..ca2bba7 --- /dev/null +++ b/plugins-main/third_party/databricks-genie-one/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/plugins-main/third_party/databricks-genie-one/README.md b/plugins-main/third_party/databricks-genie-one/README.md new file mode 100644 index 0000000..2c827a0 --- /dev/null +++ b/plugins-main/third_party/databricks-genie-one/README.md @@ -0,0 +1,72 @@ +# Databricks Genie One + +Cursor plugin that connects agents to [Databricks Genie](https://www.databricks.com/product/business-intelligence/genie) through the Genie One [Model Context Protocol](https://modelcontextprotocol.io/) server on your Databricks workspace. + +Agents ask Genie questions about your workspace's data in plain language, and Genie answers from the data the signed-in user can read. + +## Install + +1. A Databricks account admin creates an OAuth app connection (see [Team setup](#team-setup)). +2. A Cursor team admin opens **Cursor Settings → Plugins**, searches for **Databricks Genie One**, installs it for the team, and enters the workspace hostname and client. +3. Each member signs in to Databricks when Cursor prompts them. + +Or run `/add-plugin databricks-genie-one` in chat. + +## MCP + +The plugin points at your workspace's Genie One endpoint: + +```json +{ + "mcpServers": { + "databricks-genie-one": { + "type": "http", + "url": "https://${DATABRICKS_HOST}/ai-gateway/mcp-services/system.ai.genie_one_mcp", + "auth": { + "CLIENT_ID": "${CLIENT_ID}", + "CLIENT_SECRET": "${CLIENT_SECRET:-}", + "scopes": ["ai-gateway", "offline_access"] + } + } + } +} +``` + +## Team setup + +Databricks does not support dynamic client registration, so each team brings its own OAuth app connection. + +### 1. Create an OAuth app connection in Databricks + +A Databricks account admin opens the account console, goes to **Settings → App connections**, and adds a connection with these redirect URIs: + +- `https://www.cursor.com/agents/mcp/oauth/callback` +- `http://127.0.0.1:8787/callback` + +Generating a client secret is optional. Without one, the connection is a public client. + +### 2. Enter the connection in Cursor + +A Cursor team admin fills in: + +| Field | Value | +| --- | --- | +| `DATABRICKS_HOST` | Bare workspace hostname, for example `dbc-a1b2c3d4-e5f6.cloud.databricks.com`. Leave out `https://`, any path, and any port. | +| `CLIENT_ID` | Client ID of the app connection. | +| `CLIENT_SECRET` | Optional. Client secret of the app connection, if it has one. Stored encrypted and never shown back. | + +### 3. Members sign in + +Each member signs in to Databricks with their own account. Genie answers only from data that account can read. + +## Docs + +- Databricks Genie: https://docs.databricks.com/aws/en/genie/ +- Databricks OAuth app connections: https://docs.databricks.com/aws/en/integrations/enable-disable-oauth +- Model Context Protocol: https://modelcontextprotocol.io + +Logo is Databricks' official Genie icon, from databricks.com. + +## License + +MIT diff --git a/plugins-main/third_party/databricks-genie-one/assets/logo.png b/plugins-main/third_party/databricks-genie-one/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..7737bdee187be50fb803e72eacdeb69ab8a41288 GIT binary patch literal 4953 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 O06lHE7DmG^@_zucylh$k literal 0 HcmV?d00001 diff --git a/plugins-main/third_party/databricks-genie-one/mcp.json b/plugins-main/third_party/databricks-genie-one/mcp.json new file mode 100644 index 0000000..9469cd7 --- /dev/null +++ b/plugins-main/third_party/databricks-genie-one/mcp.json @@ -0,0 +1,13 @@ +{ + "mcpServers": { + "databricks-genie-one": { + "type": "http", + "url": "https://${DATABRICKS_HOST}/ai-gateway/mcp-services/system.ai.genie_one_mcp", + "auth": { + "CLIENT_ID": "${CLIENT_ID}", + "CLIENT_SECRET": "${CLIENT_SECRET:-}", + "scopes": ["ai-gateway", "offline_access"] + } + } + } +} diff --git a/plugins-main/third_party/feishu/.cursor-plugin/plugin.json b/plugins-main/third_party/feishu/.cursor-plugin/plugin.json new file mode 100644 index 0000000..5745498 --- /dev/null +++ b/plugins-main/third_party/feishu/.cursor-plugin/plugin.json @@ -0,0 +1,32 @@ +{ + "name": "feishu", + "displayName": "Feishu", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.13.0" + }, + "description": "Search, create, and update Feishu docs, and read Feishu messages and groups.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/mcp_integration/mcp_introduction", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "feishu", + "docs", + "im", + "messages", + "mcp" + ], + "category": "integrations", + "tags": [ + "feishu", + "docs", + "messaging", + "mcp" + ], + "mcpServers": "./mcp.json" +} diff --git a/plugins-main/third_party/feishu/CHANGELOG.md b/plugins-main/third_party/feishu/CHANGELOG.md new file mode 100644 index 0000000..bc458bf --- /dev/null +++ b/plugins-main/third_party/feishu/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `feishu` MCP server pointing at Feishu's hosted Streamable HTTP endpoint (`https://mcp.feishu.cn/mcp`). +- Auth uses MCP OAuth with Feishu user login and Dynamic Client Registration — no API token, client secret, or custom header to configure. +- Logo: the official Lark/Feishu bird mark, from the `larksuite` GitHub organization (Lark Technologies Pte. Ltd.). Feishu uses the same bird as Lark. diff --git a/plugins-main/third_party/feishu/LICENSE b/plugins-main/third_party/feishu/LICENSE new file mode 100644 index 0000000..ca2bba7 --- /dev/null +++ b/plugins-main/third_party/feishu/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/plugins-main/third_party/feishu/README.md b/plugins-main/third_party/feishu/README.md new file mode 100644 index 0000000..0884c3b --- /dev/null +++ b/plugins-main/third_party/feishu/README.md @@ -0,0 +1,65 @@ +# Feishu + +Cursor plugin that connects agents to [Feishu](https://www.feishu.cn) (飞书, the China product) through Feishu's official remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Search, create, fetch, and update Feishu docs, work with doc comments and files, and read Feishu IM groups and messages in the signed-in Feishu account. + +Official MCP introduction: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/mcp_integration/mcp_introduction + +## Install + +1. Open **Cursor Settings → Plugins**. +2. Search for **Feishu**. +3. Click **Install**, then complete the Feishu sign-in prompt. + +Or run `/add-plugin feishu` in chat. + +Accounts on international Lark Suite should install the separate [Lark](../lark/) plugin instead. This plugin talks only to `mcp.feishu.cn`. + +## MCP + +```json +{ + "mcpServers": { + "feishu": { + "type": "http", + "url": "https://mcp.feishu.cn/mcp" + } + } +} +``` + +Auth is MCP OAuth (Bearer). Cursor discovers the authorization server when the plugin connects and prompts for Feishu login. Feishu supports Dynamic Client Registration, so there is no API token, client ID, client secret, or custom header to configure. + +## Before you connect + +You need a Feishu account. Unauthenticated requests to the server are rejected until that login completes. + +## What agents can do + +| Category | Capabilities | +| --- | --- | +| Docs | Search, create, fetch, and update docs; doc comments; list docs | +| IM | Search groups, list group members, get and search messages, read a thread, and check read status | +| People and files | Look up the signed-in user, search users, and fetch files | + +The China server advertises the same tool surface as international Lark, including `fetch-file-v2`, `get-user`, `search-user`, `list-docs-v2`, `search-groups`, `get-group-members`, `get-thread-messages`, and `get-read-status`, plus doc search/create/fetch/update, doc comments, and message get/search. The `offline_access` scope is advertised so the connection can refresh. The hosted runtime is the source of truth for tool names and schemas. + +## Notes + +- Tool calls run as the Feishu user who authorizes the connection and cannot exceed that user's permissions. +- This plugin points only at Feishu's official hosted endpoint. It does not wrap the local `@larksuiteoapi/lark-mcp` stdio server, and it does not take an app id, app secret, user access token, or `X-Lark-MCP-*` header. +- Feishu hosts the server itself. OAuth uses the authorization server at `https://accounts.feishu.cn/mcp` and dynamic client registration at `https://open.feishu.cn/open-apis/app/v1/dcr`. +- International Lark Suite is a separate plugin (`lark`) pointing at `https://mcp.larksuite.com/mcp`. +- Revoke access at any time from your Feishu account. + +## Docs + +- Feishu MCP introduction: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/mcp_integration/mcp_introduction +- Server URL: https://mcp.feishu.cn/mcp + +Logo is the official Lark/Feishu bird mark, from the `larksuite` GitHub organization (Lark Technologies Pte. Ltd.). Feishu uses the same bird as Lark. + +## License + +MIT diff --git a/plugins-main/third_party/feishu/assets/logo.png b/plugins-main/third_party/feishu/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9c83d51064196de76a04d94c68c0268e160f9151 GIT binary patch literal 8441 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 cHvOf}ON+8qJJlbL5 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 cHv