diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index 74bf22bdd..d7d2a96dd 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -628,6 +628,11 @@ "source": "third_party/lark", "description": "Search, create, and update Lark Suite docs, and read Lark messages and groups." }, + { + "name": "lark-base", + "source": "third_party/lark-base", + "description": "Read and update tables, fields, views, and records in Lark Base." + }, { "name": "feishu", "source": "third_party/feishu", diff --git a/README.md b/README.md index bec1cbfd3..d2ac28d9d 100644 --- a/README.md +++ b/README.md @@ -115,6 +115,7 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `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. | +| `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. | diff --git a/third_party/lark-base/.cursor-plugin/plugin.json b/third_party/lark-base/.cursor-plugin/plugin.json new file mode 100644 index 000000000..f43cba77f --- /dev/null +++ b/third_party/lark-base/.cursor-plugin/plugin.json @@ -0,0 +1,57 @@ +{ + "name": "lark-base", + "displayName": "Lark Base", + "version": "1.0.0", + "minClientVersions": { + "cursor": "3.19.0" + }, + "description": "Read and update tables, fields, views, and records in Lark Base.", + "author": { + "name": "Cursor", + "email": "plugins@cursor.com" + }, + "homepage": "https://www.larksuite.com/product/base", + "repository": "https://github.com/cursor/plugins", + "license": "MIT", + "logo": "assets/logo.png", + "keywords": [ + "lark", + "lark base", + "lark suite", + "bitable", + "base", + "tables", + "records", + "mcp" + ], + "category": "integrations", + "tags": [ + "lark", + "base", + "bitable", + "mcp" + ], + "variables": { + "type": "object", + "additionalProperties": false, + "required": [ + "CLIENT_ID", + "CLIENT_SECRET" + ], + "properties": { + "CLIENT_ID": { + "type": "string", + "title": "App ID", + "description": "App ID of the Lark custom app your team created. Every member signs in under it." + }, + "CLIENT_SECRET": { + "type": "string", + "title": "App Secret", + "description": "App Secret of that Lark app. Stored encrypted and never sent to members' machines.", + "writeOnly": true, + "format": "password" + } + } + }, + "mcpServers": "./mcp.json" +} diff --git a/third_party/lark-base/CHANGELOG.md b/third_party/lark-base/CHANGELOG.md new file mode 100644 index 000000000..7bc52405f --- /dev/null +++ b/third_party/lark-base/CHANGELOG.md @@ -0,0 +1,9 @@ +# Changelog + +All notable changes to this plugin will be documented here. + +## 1.0.0 — initial release + +- Added the `lark-base` MCP server pointing at `https://api.cursor.com/rest-mcp/lark-base/mcp`. +- Declared required `CLIENT_ID` (App ID) and `CLIENT_SECRET` (App Secret) team variables. A team admin sets one Lark app that every member signs in under. Requires Cursor 3.19.0 or later. +- Logo: Lark's official bird mark, from the `larksuite` GitHub organization (Lark Technologies Pte. Ltd.). diff --git a/third_party/lark-base/LICENSE b/third_party/lark-base/LICENSE new file mode 100644 index 000000000..ca2bba771 --- /dev/null +++ b/third_party/lark-base/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/lark-base/README.md b/third_party/lark-base/README.md new file mode 100644 index 000000000..1a10c1416 --- /dev/null +++ b/third_party/lark-base/README.md @@ -0,0 +1,94 @@ +# Lark Base + +Cursor plugin that connects agents to [Lark Base](https://www.larksuite.com/product/base) (Bitable) through Cursor's remote [Model Context Protocol](https://modelcontextprotocol.io/) server. + +Read a Base's tables, fields, views, and records, and create or update tables, fields, and records in the signed-in Lark account. + +Docs and messages stay on the separate [Lark](../lark/) plugin, which fronts Lark's own MCP server. This plugin talks only to international Lark Suite (`larksuite.com`). + +## Install + +1. A team admin opens **Cursor Settings → Plugins**, searches for **Lark Base**, and installs it for the team. +2. The admin enters the team's Lark app (see [Team setup](#team-setup)). +3. Each member signs in to Lark when Cursor prompts them. + +Or run `/add-plugin lark-base` in chat. + +Requires Cursor 3.19.0 or later. + +## MCP + +```json +{ + "mcpServers": { + "lark-base": { + "type": "http", + "url": "https://api.cursor.com/rest-mcp/lark-base/mcp", + "auth": { + "CLIENT_ID": "${CLIENT_ID}", + "CLIENT_SECRET": "${CLIENT_SECRET}" + } + } + } +} +``` + +Auth is OAuth. Cursor prompts each member for Lark sign-in under the team's app. Token exchange and refresh run on Cursor's backend. The App Secret is stored encrypted and is never sent to members' machines. + +## Team setup + +Cursor registers no Lark app. A team admin creates one custom app and enters its credentials once. Every member then signs in to their own Lark account under that app. + +### 1. Create a Lark app + +In the [Lark developer console](https://open.larksuite.com/app), create a custom app, then: + +1. Add the `bitable:app` and `offline_access` permissions. +2. Turn on refreshing user access tokens in the app's security settings. Without that, Lark issues no refresh token and every grant lasts about two hours. +3. Register these redirect URLs: + - `https://www.cursor.com/agents/mcp/oauth/callback` + - `http://localhost:8787/callback` + - `https://www.cursor.com/bot/mcp/oauth/callback` +4. Publish an app version. + +### 2. Enter the app in Cursor + +Only a team admin can save these. Both fields are required: + +| Field | Value | +| --- | --- | +| `CLIENT_ID` | The app's **App ID**. | +| `CLIENT_SECRET` | The app's **App Secret**. Stored encrypted and never shown back on plugin listings. | + +### 3. Members sign in + +Each member signs in to Lark with their own account. A member can only open a Base that account can already open. + +## What agents can do + +| Category | Tools | +| --- | --- | +| Read | `get_base`, `list_tables`, `list_fields`, `list_views`, `search_records`, `get_records` | +| Write | `create_records`, `update_records`, `create_table`, `create_field` | +| Destructive | `delete_records` | + +`delete_records` cannot be undone through the API. The hosted runtime is the source of truth for tool names and schemas. + +## Notes + +- Pass an `app_token` or a Lark Base link whose path contains `/base/{app_token}` (for example `https://.larksuite.com/base/`). A wiki link names a wiki node, so the server refuses it. +- Calls run as the signed-in Lark user and cannot exceed that user's Base permissions, or the `bitable:app` scope on the team's app. +- Changing the App ID or App Secret signs members out. They reconnect once. + +## Docs + +- Lark Base: https://www.larksuite.com/product/base +- Bitable overview: https://open.larksuite.com/document/server-docs/docs/bitable-v1/bitable-overview +- Obtain an OAuth code: https://open.larksuite.com/document/authentication-management/access-token/obtain-oauth-code +- Server URL: https://api.cursor.com/rest-mcp/lark-base/mcp + +Logo is Lark's official bird mark, from the `larksuite` GitHub organization (Lark Technologies Pte. Ltd.). + +## License + +MIT diff --git a/third_party/lark-base/assets/logo.png b/third_party/lark-base/assets/logo.png new file mode 100644 index 000000000..9c83d5106 Binary files /dev/null and b/third_party/lark-base/assets/logo.png differ diff --git a/third_party/lark-base/mcp.json b/third_party/lark-base/mcp.json new file mode 100644 index 000000000..f05379125 --- /dev/null +++ b/third_party/lark-base/mcp.json @@ -0,0 +1,12 @@ +{ + "mcpServers": { + "lark-base": { + "type": "http", + "url": "https://api.cursor.com/rest-mcp/lark-base/mcp", + "auth": { + "CLIENT_ID": "${CLIENT_ID}", + "CLIENT_SECRET": "${CLIENT_SECRET}" + } + } + } +} diff --git a/third_party/lark/README.md b/third_party/lark/README.md index 016e010b3..b3a45cd69 100644 --- a/third_party/lark/README.md +++ b/third_party/lark/README.md @@ -16,6 +16,8 @@ Or run `/add-plugin lark` in chat. Accounts on China-region Feishu should install the separate [Feishu](../feishu/) plugin instead. This plugin talks only to `mcp.larksuite.com`. +Lark Base (Bitable) is the separate [Lark Base](../lark-base/) plugin. + ## MCP ```json