本文介绍在本机用cursor 接入飞书开放平台官方MCP(@larksuiteoapi/lark-mcp)的步骤。
官方仓库与文档:larksuite/lark-openapi-mcp;飞书说明:OpenAPI MCP 介绍。
1. 前置条件
1.1 安装 nvm(若尚未安装)
nvm用来在同一台机器上安装、切换多版本Node。在终端执行(以官方文档为准,以下为常见写法):
bash
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
安装完成后,把加载脚本写入shell 配置(zsh 用 ~/.zshrc,bash 用 ~/.bashrc):
bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
执行source ~/.zshrc(或重新打开终端),确认command -v nvm有输出。
1.2 安装 Node.js 20 并作为默认版本
@larksuiteoapi/lark-mcp要求Node ≥ 20 。建议用 nvm 安装20 LTS ,并设为默认,这样终端与GUI子进程里的node/npx都指向同一主版本。
bash
nvm install 20
nvm alias default 20
nvm use 20
node -v # 应显示 v20.x.x
which node
常用命令备忘:
bash
nvm ls # 查看本机已安装的 Node 版本
nvm use 20 # 当前 shell 切换到 20
nvm alias default 20 # 新开终端默认使用 20
1.3 安装@larksuiteoapi/lark-mcp
bash
npm install -g @larksuiteoapi/lark-mcp
lark-mcp --help
1.4 飞书开放平台应用
在飞书开放平台创建自建应用,拿到App ID 、App Secret ,并按需开通、审批 API 权限。如果你不清楚如何创建飞书应用可以参考:02.创建飞书应用,飞书应用中我开通的权限列表如下:
{
"scopes": {
"tenant": [
"aily:file:read",
"aily:file:write",
"aily:message:read",
"aily:message:write",
"application:application.app_message_stats.overview:readonly",
"application:application:self_manage",
"application:bot.menu:write",
"base:field:read",
"base:field:update",
"base:record:read",
"base:record:update",
"base:table:read",
"base:table:update",
"bitable:app",
"bitable:app:readonly",
"cardkit:card:write",
"contact:contact.base:readonly",
"contact:user.base:readonly",
"contact:user.employee_id:readonly",
"corehr:file:download",
"docs:doc",
"docs:doc:readonly",
"docs:document.comment:create",
"docs:document.comment:read",
"docs:document.comment:update",
"docs:document.comment:write_only",
"docs:document.content:read",
"docs:document.media:download",
"docs:document.media:upload",
"docs:document.subscription",
"docs:document.subscription:read",
"docs:document:copy",
"docs:document:export",
"docs:document:import",
"docx:document",
"docx:document.block:convert",
"docx:document:readonly",
"drive:drive",
"event:ip_list",
"im:chat",
"im:chat.access_event.bot_p2p_chat:read",
"im:chat.announcement:read",
"im:chat.announcement:write_only",
"im:chat.managers:write_only",
"im:chat.members:bot_access",
"im:chat.members:read",
"im:chat.members:write_only",
"im:chat.menu_tree:read",
"im:chat.menu_tree:write_only",
"im:chat.moderation:read",
"im:chat.tabs:read",
"im:chat.tabs:write_only",
"im:chat.top_notice:write_only",
"im:chat.widgets:read",
"im:chat.widgets:write_only",
"im:chat:create",
"im:chat:delete",
"im:chat:moderation:write_only",
"im:chat:operate_as_owner",
"im:chat:read",
"im:chat:readonly",
"im:chat:update",
"im:message",
"im:message.group_at_msg:readonly",
"im:message.group_msg",
"im:message.p2p_msg:readonly",
"im:message.pins:read",
"im:message.pins:write_only",
"im:message.reactions:read",
"im:message.reactions:write_only",
"im:message.urgent",
"im:message.urgent.status:write",
"im:message.urgent:phone",
"im:message.urgent:sms",
"im:message:readonly",
"im:message:recall",
"im:message:send_as_bot",
"im:message:send_multi_depts",
"im:message:send_multi_users",
"im:message:send_sys_msg",
"im:message:update",
"im:resource",
"im:tag:read",
"im:url_preview.update",
"sheets:spreadsheet",
"wiki:wiki",
"wiki:wiki:readonly"
],
"user": [
"aily:file:read",
"aily:file:write",
"base:app:copy",
"base:app:create",
"base:app:read",
"base:app:update",
"base:collaborator:create",
"base:collaborator:delete",
"base:collaborator:read",
"base:dashboard:copy",
"base:dashboard:read",
"base:field:create",
"base:field:delete",
"base:field:read",
"base:field:update",
"base:form:read",
"base:form:update",
"base:record:create",
"base:record:delete",
"base:record:read",
"base:record:retrieve",
"base:record:update",
"base:role:create",
"base:role:delete",
"base:role:read",
"base:role:update",
"base:table:create",
"base:table:delete",
"base:table:read",
"base:table:update",
"base:view:read",
"base:view:write_only",
"base:workflow:read",
"base:workflow:write",
"bitable:app",
"bitable:app:readonly",
"board:whiteboard:node:create",
"board:whiteboard:node:delete",
"board:whiteboard:node:read",
"board:whiteboard:node:update",
"calendar:calendar",
"calendar:calendar:readonly",
"docs:document.comment:create",
"docs:document.comment:read",
"docs:document.comment:update",
"docs:document.comment:write_only",
"docs:document.content:read",
"docs:document.media:upload",
"docs:document.subscription",
"docs:document.subscription:read",
"docs:document:copy",
"docs:document:import",
"docs:event.document_deleted:read",
"docs:event.document_edited:read",
"docs:event.document_opened:read",
"docs:event:subscribe",
"docs:permission.member",
"docs:permission.member:auth",
"docs:permission.member:create",
"docs:permission.member:delete",
"docs:permission.member:readonly",
"docs:permission.member:retrieve",
"docs:permission.member:transfer",
"docs:permission.member:update",
"docs:permission.setting",
"docs:permission.setting:read",
"docs:permission.setting:readonly",
"docs:permission.setting:write_only",
"docx:document",
"docx:document.block:convert",
"docx:document:create",
"docx:document:readonly",
"docx:document:write_only",
"drive:drive.metadata:readonly",
"drive:drive:version",
"drive:drive:version:readonly",
"drive:file.like:readonly",
"drive:file.meta.sec_label.read_only",
"drive:file:upload",
"drive:file:view_record:readonly",
"im:chat",
"im:chat.access_event.bot_p2p_chat:read",
"im:chat.announcement:read",
"im:chat.announcement:write_only",
"im:chat.managers:write_only",
"im:chat.members:read",
"im:chat.members:write_only",
"im:chat.moderation:read",
"im:chat.tabs:read",
"im:chat.tabs:write_only",
"im:chat.top_notice:write_only",
"im:chat:delete",
"im:chat:moderation:write_only",
"im:chat:read",
"im:chat:readonly",
"im:chat:update",
"im:message",
"im:message.pins:read",
"im:message.pins:write_only",
"im:message.reactions:read",
"im:message.reactions:write_only",
"im:message.urgent.status:write",
"im:message:readonly",
"im:message:recall",
"im:message:update",
"sheets:spreadsheet",
"sheets:spreadsheet.meta:read",
"sheets:spreadsheet.meta:write_only",
"sheets:spreadsheet:create",
"sheets:spreadsheet:readonly",
"slides:presentation:create",
"slides:presentation:read",
"slides:presentation:update",
"slides:presentation:write_only",
"space:document.event:read",
"space:document:delete",
"space:document:move",
"space:document:shortcut",
"space:folder:create",
"wiki:member:create",
"wiki:member:retrieve",
"wiki:member:update",
"wiki:node:copy",
"wiki:node:create",
"wiki:node:move",
"wiki:node:read",
"wiki:node:retrieve",
"wiki:node:update",
"wiki:setting:read",
"wiki:setting:write_only",
"wiki:space:read",
"wiki:space:retrieve",
"wiki:space:write_only",
"wiki:wiki",
"wiki:wiki:readonly"
]
}
}
2. 在cursor中配置飞书MCP
首先打开cursor配置

接下来选择Tools&MCP,并选择New MCP Server,因为我已经增加了lark-mcp,所以我这里已经有一个MCP在列表中。

2.1 应用身份
在上述New MPC Server打开的配置文件中,增加以下配置。在已默认使用 Node 20 的前提下,推荐直接用npx:
{
"mcpServers": {
"lark-mcp": {
"command": "npx",
"args": ["-y", "@larksuiteoapi/lark-mcp", "mcp"],
"env": {
"APP_ID": "<你的 App ID>",
"APP_SECRET": "<你的 App Secret>",
"LARK_DOMAIN": "https://open.feishu.cn"
}
}
}
}
国际版Lark将LARK_DOMAIN 改为https://open.larksuite.com。
2.2 用户身份与OAuth
你仍然需要在终端完成一次浏览器授权。默认Node 20后可直接用:
bash
npx -y @larksuiteoapi/lark-mcp login -a <App ID> -s '<App Secret>'
3. 使用
在完成了以上配置后,你可以直接把飞书文档链接粘贴到cursor agent对话框让它帮你读文档或者写文档啦。
4. 安全建议
- 不要把 App Secret 提交到 Git、贴到公开聊天。泄露后应在开放平台重置密钥。
mcp.json若含密钥,注意文件权限与备份范围。