Claude Code Plugins

Community-maintained marketplace

Feedback

集成飞书/Feishu 服务,操作多维表格、文档、消息、群组等。当用户提到飞书、Feishu、Lark 或需要操作飞书相关功能时使用。

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name lark-mcp
description 集成飞书/Feishu 服务,操作多维表格、文档、消息、群组等。当用户提到飞书、Feishu、Lark 或需要操作飞书相关功能时使用。

Lark MCP (飞书集成)

⚠️ 必读:前5条关键规则 + 重要经验

重要经验:使用用户身份创建资源

# ⭐ 关键:使用 useUAT: true 创建用户可访问的资源
useUAT: true   # ✅ 用户身份 - 创建者=当前用户,您可以直接访问
useUAT: false  # ❌ 租户身份 - 创建者=飞书助手,您无法直接访问

经验总结(来自实际测试):

  1. Bitable 创建权限问题 - 使用 useUAT: false 创建的 Base,创建者是"飞书助手",当前用户无法访问
  2. 外部邮箱权限限制 - 通过 API 添加外部邮箱权限会失败(错误码 1063001)
  3. 解决方案 - 使用 useUAT: true 创建资源,创建者自动获得 full_access 权限
  4. 文档权限 - 同样适用,使用用户身份创建文档

1. 服务器名称必须精确

✅ mcp__lark-mcp__tool_name
❌ mcp__lark_mcp__ (错误:下划线)
❌ lark-mcp__ (错误:缺少前缀)

2. 嵌套参数结构

path:           # URL路径参数(必需)
  app_token: ...
  table_id: ...
params:         # URL查询参数(可选)
  user_id_type: "open_id"
data:           # 请求体(可选)
  fields: {...}
useUAT: false   # 默认使用租户token

3. 消息 content 必须是字符串

❌ content: {"text": "hello"}
✅ content: '{"text": "hello"}'

4. 过滤条件 value 必须是数组

❌ value: "已完成"
✅ value: ["已完成"]

5. ID 类型不能混淆

open_id   - 用户ID(推荐)
chat_id   - 群聊ID
app_token - 表格应用ID
table_id  - 表格ID
record_id - 记录ID

快速开始

示例1:查询多维表格记录

工具: mcp__lark-mcp__bitable_v1_appTableRecord_search
path:
  app_token: "your_app_token"  # 需要替换为实际的 Base 应用 ID(从 URL 获取)
  table_id: "your_table_id"    # 需要替换为实际的表格 ID(从 URL 获取)
params:
  page_size: 20
data:
  filter:
    conjunction: "and"
    conditions:
      - field_name: "状态"
        operator: "is"
        value: ["已完成"]

示例2:发送文本消息到群组

工具: mcp__lark-mcp__im_v1_message_create
data:
  receive_id: "oc_xxxxx"  # 需要替换为实际的群组 chat_id
  msg_type: "text"
  content: '{"text": "消息内容"}'
params:
  receive_id_type: "chat_id"

示例3:搜索文档

工具: mcp__lark-mcp__docx_builtin_search
data:
  search_key: "关键词"
  count: 10
useUAT: true

工具分类

多维表格 (Bitable)

  • bitable_v1_app_create - 创建 Base 应用
  • bitable_v1_appTable_list - 列出所有表格
  • bitable_v1_appTable_create - 创建新表格
  • bitable_v1_appTableField_list - 获取字段列表
  • bitable_v1_appTableRecord_search - 查询记录
  • bitable_v1_appTableRecord_create - 创建记录
  • bitable_v1_appTableRecord_update - 更新记录

详细指南:reference/bitable.md

消息 (Messages)

  • im_v1_message_create - 发送消息
  • im_v1_message_list - 获取聊天历史
  • im_v1_chat_create - 创建群组
  • im_v1_chat_list - 获取群组列表
  • im_v1_chatMembers_get - 获取群成员

详细指南:reference/messages.md

文档 (Documents)

  • docx_builtin_search - 搜索文档
  • docx_builtin_import - 导入文档
  • docx_v1_document_rawContent - 获取文档内容

详细指南:reference/documents.md

群组 (Groups)

  • im_v1_chat_create - 创建群组
  • im_v1_chatMembers_get - 获取成员列表
  • im_v1_chat_list - 获取群组列表

详细指南:reference/groups.md

权限 (Permissions)

  • drive_v1_permissionMember_create - 添加协作者权限

详细指南:reference/permissions.md

联系人 (Contacts)

  • contact_v3_user_batchGetId - 通过邮箱/手机号获取用户ID

Wiki (知识库)

  • wiki_v1_node_search - 搜索 Wiki 节点
  • wiki_v2_space_getNode - 获取节点信息

认证说明

Token 类型

  • useUAT: true - 用户访问令牌(用户操作)
  • useUAT: false - 租户访问令牌(后台操作,默认)

获取 ID

从 URL 获取:

https://xxx.feishu.cn/base/appxxxxx?table=tblxxxxx
                         ↑app_token    ↑table_id

获取用户 open_id:

工具: mcp__lark-mcp__contact_v3_user_batchGetId
data:
  emails: ["user@example.com"]  # 需要替换为实际的用户邮箱
params:
  user_id_type: "open_id"

user_id_type 参数

始终使用 "open_id"(最通用,推荐)。

可选值:"open_id" | "union_id" | "user_id"

核心工作流

工作流1:创建多维表格并添加记录(用户可访问版本)

任务进度:
- [ ] 步骤1: 创建 Base 应用(⭐ useUAT: true)
- [ ] 步骤2: 创建表格和字段
- [ ] 步骤3: 插入记录
- [ ] 步骤4: 验证数据

步骤1: 创建 Base 应用

工具: mcp__lark-mcp__bitable_v1_app_create
data:
  name: "项目管理"  # 可以修改为您需要的名称
  time_zone: "Asia/Shanghai"
useUAT: true  # ⭐ 重要:使用用户身份,确保您可以直接访问

步骤2: 创建表格和字段

工具: mcp__lark-mcp__bitable_v1_appTable_create
path:
  app_token: "bascnxxxxxx"  # 需要替换为步骤1返回的实际 app_token
data:
  table:
    name: "表格名称"
    default_view_name: "默认视图"
    fields:
      - field_name: "姓名"
        ui_type: "Text"
      - field_name: "年龄"
        ui_type: "Number"
      - field_name: "状态"
        ui_type: "SingleSelect"
        property:
          options:
            - name: "进行中"
            - name: "已完成"

注意: 创建成功后,响应中会返回 table_id,保存它用于下一步。

步骤3: 插入记录

工具: mcp__lark-mcp__bitable_v1_appTableRecord_create
path:
  app_token: "bascnxxxxxx"  # 需要替换为步骤1返回的实际值
  table_id: "tblxxxxxx"     # 需要替换为步骤2返回的实际值
data:
  fields:
    姓名: "张三"
    年龄: 25
    状态: "进行中"

步骤4: 验证数据

工具: mcp__lark-mcp__bitable_v1_appTableRecord_search
path:
  app_token: "bascnxxxxxx"  # 需要替换为实际的 app_token
  table_id: "tblxxxxxx"     # 需要替换为实际的 table_id
params:
  page_size: 10

工作流2:查询表格并发送消息

任务进度:
- [ ] 步骤1: 查询表格数据
- [ ] 步骤2: 处理查询结果
- [ ] 步骤3: 构造消息
- [ ] 步骤4: 发送到群组

步骤1: 查询数据

工具: mcp__lark-mcp__bitable_v1_appTableRecord_search
path:
  app_token: "bascnxxxxxx"  # 需要替换为实际的 app_token
  table_id: "tblxxxxxx"     # 需要替换为实际的 table_id
params:
  page_size: 10
data:
  filter:
    conjunction: "and"
    conditions:
      - field_name: "状态"
        operator: "is"
        value: ["待处理"]

步骤2: 处理查询结果

查询成功后,响应中包含 data.items 数组,每项包含记录的 fields

# 响应结构示例
data:
  items:
    - record_id: "recxxxx"
      fields:
        任务名称: "完成文档"
        状态: "待处理"

步骤3: 构造消息

根据查询结果构造消息内容:

# 示例:构造文本消息
message = "找到 " + items.length + " 个待处理任务:\n"
for each item in items:
  message += "- " + item.fields["任务名称"] + "\n"

步骤4: 发送消息

工具: mcp__lark-mcp__im_v1_message_create
data:
  receive_id: "oc_xxxxx"  # 需要替换为实际的群组 chat_id
  msg_type: "text"
  content: '{"text": "处理结果:..."}'
params:
  receive_id_type: "chat_id"

工作流3:搜索文档并获取内容

任务进度:
- [ ] 步骤1: 搜索文档
- [ ] 步骤2: 获取 document_id
- [ ] 步骤3: 提取文档内容
- [ ] 步骤4: 处理文本

步骤1: 搜索

工具: mcp__lark-mcp__docx_builtin_search
data:
  search_key: "项目报告"
  count: 10
useUAT: true

步骤2: 获取 document_id

搜索成功后,从响应中提取第一个文档的 document_id

# 响应结构示例
data:
  items:
    - document_id: "doxcnxxxxxx"  # ← 保存这个
      title: "项目报告"
      ...

步骤3: 获取内容

工具: mcp__lark-mcp__docx_v1_document_rawContent
path:
  document_id: "doxcnxxxxxx"  # 需要替换为步骤2获取的实际 document_id
params:
  lang: 0
useUAT: true

常见错误排查

错误1: "tool not found"

原因: 服务器名称拼写错误 解决: 确保使用 mcp__lark-mcp__ 前缀(注意连字符)

错误2: "invalid request"

原因: 参数嵌套错误 解决: 检查 path/params/data 层级,path 参数通常必需

错误3: "field not found"

原因: 字段名错误或 ID 类型错误 解决:

  • 确认 field_name 与表格字段名完全一致
  • 确认使用正确的 ID 类型(app_token vs table_id)

错误4: "permission denied"

原因: 权限不足或 token 类型错误 解决:

  • 检查应用是否有该资源的访问权限
  • 用户操作使用 useUAT: true
  • 后台操作使用 useUAT: false

错误5: 消息发送失败

原因: content 格式错误或 receive_id_type 错误 解决:

  • content 必须是 JSON 字符串,不是对象
  • 发送到群组使用 receive_id_type: "chat_id"
  • 发送到用户使用 receive_id_type: "open_id"

参数校验清单

使用前检查:

  • 服务器名称:mcp__lark-mcp__tool_name
  • path 参数必需且正确(app_token, table_id, record_id 等)
  • content 是 JSON 字符串(消息相关)
  • value 是数组(过滤条件)
  • 枚举值精确匹配(user_id_type, operator 等)
  • ID 类型正确(open_id vs chat_id vs app_token)
  • useUAT 设置正确(用户 true,后台 false)

实践中遇到的问题

问题1: 创建的 Base 无法访问

现象:

  • 使用 useUAT: false 创建 Base 应用
  • 创建者显示为"飞书助手"
  • 当前用户无法直接访问,权限受限

解决方案:

useUAT: true   # ✅ 用户身份 - 创建者=当前用户,可直接访问
useUAT: false  # ❌ 租户身份 - 需要额外设置权限

问题2: API 添加权限失败

现象:

  • 通过 drive_v1_permissionMember_create 添加邮箱权限
  • 错误码:1063001 (Invalid parameter)
  • 无法通过 API 授予外部用户访问权限

根本原因:

  • 租户身份创建的资源,API 权限添加有限制
  • 外部邮箱权限可能不支持通过 API 操作

最佳实践:

  • 优先使用用户身份(useUAT: true)创建资源
  • 创建者自动获得 full_access 权限
  • 避免后续复杂的权限配置

问题3: 字段类型不匹配

现象:

  • Bitable 查询时 "field not found"
  • 使用了错误的字段 ID 类型

解决方案:

# 从 URL 获取正确的 ID(appxxxxx 和 tblxxxxx 是需要替换的占位符)
https://xxx.feishu.cn/base/appxxxxx?table=tblxxxxx
                         ↑app_token    ↑table_id

# 查询前先获取字段列表确认字段名
工具: mcp__lark-mcp__bitable_v1_appTableField_list

问题4: 群主身份问题

现象:

  • 使用 useUAT: true 创建群组
  • 创建者仍显示为应用机器人(app_id)
  • 消息发送者 sender_type 为 "app",不是 "user"

根本原因:

  • useUAT: true 只是使用用户权限/令牌操作
  • 系统记录的"创建者"始终是应用本身
  • 这是飞书 API 的设计机制

解决方案:

# 必须明确指定 owner_id
工具: mcp__lark-mcp__im_v1_chat_create
data:
  owner_id: "ou_xxxxx"  # 指定用户为群主
  user_id_list: ["ou_xxxxx"]

注意: 不指定 owner_id 时,群主默认为应用机器人。

参考文档