From 111ee2eea97ec7e1ee3c0f912e944bb54ca6addf Mon Sep 17 00:00:00 2001 From: djiang-jq Date: Sat, 31 Oct 2026 19:09:32 -0500 Subject: [PATCH] feat(lark-base): add the Lark Base REST MCP plugin Teams connect through the lark-base translator with a Lark app the admin registers, separate from the existing Lark docs plugin. Co-authored-by: Cursor --- .cursor-plugin/marketplace.json | 5 + README.md | 1 + .../lark-base/.cursor-plugin/plugin.json | 57 +++++++++++ third_party/lark-base/CHANGELOG.md | 9 ++ third_party/lark-base/LICENSE | 21 ++++ third_party/lark-base/README.md | 94 ++++++++++++++++++ third_party/lark-base/assets/logo.png | Bin 0 -> 8441 bytes third_party/lark-base/mcp.json | 12 +++ third_party/lark/README.md | 2 + 9 files changed, 201 insertions(+) create mode 100644 third_party/lark-base/.cursor-plugin/plugin.json create mode 100644 third_party/lark-base/CHANGELOG.md create mode 100644 third_party/lark-base/LICENSE create mode 100644 third_party/lark-base/README.md create mode 100644 third_party/lark-base/assets/logo.png create mode 100644 third_party/lark-base/mcp.json 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 0000000000000000000000000000000000000000..9c83d51064196de76a04d94c68c0268e160f9151 GIT binary patch literal 8441 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 cHv