From bc318d8f352be237dd641dd037d0588767b4d836 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 21 Sep 2026 15:57:15 +0000 Subject: [PATCH] feat(lark): add Lark and Feishu remote MCP plugins Package the official hosted Lark Suite and Feishu MCP endpoints as marketplace plugins with OAuth discovered at connect time. Co-authored-by: Sam Sokolin --- .cursor-plugin/marketplace.json | 10 +++ README.md | 2 + third_party/feishu/.cursor-plugin/plugin.json | 32 +++++++++ third_party/feishu/CHANGELOG.md | 9 +++ third_party/feishu/LICENSE | 21 ++++++ third_party/feishu/README.md | 65 ++++++++++++++++++ third_party/feishu/assets/logo.png | Bin 0 -> 8441 bytes third_party/feishu/mcp.json | 8 +++ third_party/lark/.cursor-plugin/plugin.json | 33 +++++++++ third_party/lark/CHANGELOG.md | 9 +++ third_party/lark/LICENSE | 21 ++++++ third_party/lark/README.md | 65 ++++++++++++++++++ third_party/lark/assets/logo.png | Bin 0 -> 8441 bytes third_party/lark/mcp.json | 8 +++ 14 files changed, 283 insertions(+) create mode 100644 third_party/feishu/.cursor-plugin/plugin.json create mode 100644 third_party/feishu/CHANGELOG.md create mode 100644 third_party/feishu/LICENSE create mode 100644 third_party/feishu/README.md create mode 100644 third_party/feishu/assets/logo.png create mode 100644 third_party/feishu/mcp.json create mode 100644 third_party/lark/.cursor-plugin/plugin.json create mode 100644 third_party/lark/CHANGELOG.md create mode 100644 third_party/lark/LICENSE create mode 100644 third_party/lark/README.md create mode 100644 third_party/lark/assets/logo.png create mode 100644 third_party/lark/mcp.json diff --git a/.cursor-plugin/marketplace.json b/.cursor-plugin/marketplace.json index ed6afb06..a8c2498e 100644 --- a/.cursor-plugin/marketplace.json +++ b/.cursor-plugin/marketplace.json @@ -412,6 +412,16 @@ "name": "statsig", "source": "third_party/statsig", "description": "Inspect and manage feature gates, experiments, dynamic configs, and metrics." + }, + { + "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." } ] } diff --git a/README.md b/README.md index 21772a15..62114a9a 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,8 @@ Official Cursor plugins for popular developer tools, frameworks, and SaaS produc | `excalidraw` | [Excalidraw](third_party/excalidraw/) | Cursor | Integrations | Draw and export hand-drawn diagrams from chat. | | `google-cloud-bigquery` | [Google Cloud BigQuery](third_party/google-cloud-bigquery/) | Cursor | Integrations | Explore datasets and tables and run SQL queries. | | `statsig` | [Statsig](third_party/statsig/) | Cursor | Integrations | Inspect and manage feature gates, experiments, dynamic configs, and metrics. | +| `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. | 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/feishu/.cursor-plugin/plugin.json b/third_party/feishu/.cursor-plugin/plugin.json new file mode 100644 index 00000000..5745498a --- /dev/null +++ b/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/third_party/feishu/CHANGELOG.md b/third_party/feishu/CHANGELOG.md new file mode 100644 index 00000000..bc458bf3 --- /dev/null +++ b/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/third_party/feishu/LICENSE b/third_party/feishu/LICENSE new file mode 100644 index 00000000..ca2bba77 --- /dev/null +++ b/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/third_party/feishu/README.md b/third_party/feishu/README.md new file mode 100644 index 00000000..0884c3b7 --- /dev/null +++ b/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/third_party/feishu/assets/logo.png b/third_party/feishu/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9c83d51064196de76a04d94c68c0268e160f9151 GIT binary patch literal 8441 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 cHv