Lark MCP - 飞书全场景 Function Call AI 助手 🚀
一个基于飞书(Lark)的全场景 MCP Function Call AI Agent ,实现大模型通过飞书进行函数调用和消息处理。
欢迎 star ⭐和 fork
项目地址👉https://github.com/cv-cat/LarkAgentX
无需配置飞书机器人,你的飞书账号即是 AI 助手。
只需定义函数和注释,你的飞书机器人会自动根据场景调用。
项目概述 🌟
Lark MCP 是一个现代化的 Python 应用程序,能够:
- 📊 逆向飞书 Protobuf 格式传输的 Websockets 和 API ,监听并记录消息
- 🤖 提供自定义函数供大模型调用
- 🔄 实现基于 MCP (Model Context Protocol) 的函数调用框架
- 💾 使用 SQLAlchemy 将消息存储到 MySQL 数据库
效果图🧸
图 1: 后台日志
图 2: 聊天数据库查询
图 3: 天气查询
图 4: 简单注册函数,只需定义函数和注释
✨ 功能特点
- 函数注册机制: 简单直观的函数注册装饰器
- 消息自动处理: 记录所有接收到的消息(私聊和群聊)
- 异步处理: 采用 async/await 模式进行异步通信
- 数据持久化: 使用 SQLAlchemy 将消息存储在 MySQL 数据库中
- 灵活配置: 通过环境变量进行配置
- 容器化部署: 支持 Docker 快速部署
- 智能函数调用: AI 会根据用户输入的文字自动分析并调用最匹配的函数,开发者只需添加函数及其注释描述
📦 当前支持的函数
项目目前内置了以下函数供大模型调用:
| 函数名 | 描述 |
|---|---|
tell_joke |
讲一个随机笑话 |
get_time |
获取当前时间 |
roll_dice |
掷一个指定面数的骰子 |
make_todo_list |
从逗号分隔的任务创建待办清单 |
translate_to_chinese |
将英文单词翻译成中文 |
countdown |
创建一个从指定数字开始的倒计时 |
random_color |
生成一个随机的十六进制颜色代码 |
fortune |
抽取一个随机运势 |
count_daily_speakers |
获取今天发言的人数统计 |
get_top_speaker_today |
获取今天发言最多的用户 |
send_message |
给指定用户发送消息 |
list_tools |
列出所有可用的工具及其描述 |
你可以通过在飞书中输入触发指令后跟要执行的操作来调用这些功能,例如: /run 讲个笑话
📂 项目结构
project/
├── app/ # 应用程序模块
│ ├── api/ # API 相关模块
│ │ ├── auth.py # 认证模块
│ │ └── lark_client.py # 飞书客户端
│ ├── config/ # 配置模块
│ │ └── settings.py # 应用配置
│ ├── core/ # 核心业务逻辑
│ │ ├── mcp_server.py # MCP 服务器
│ │ └── message_service.py # 消息处理服务
│ ├── db/ # 数据库相关
│ │ ├── models.py # 数据模型
│ │ └── session.py # 数据库会话管理
│ └── utils/ # 工具函数
├── builder/ # 请求构建器
├── static/ # 静态资源
│ ├── resource/ # 图片资源
│ ├── proto_pb2.py # 协议定义
│ └── lark_decrypt.js # 飞书解密工具
├── .env # 环境变量
├── main.py # 应用入口
└── Dockerfile # Docker 配置
🛠️ 自定义函数开发
在 app/core/mcp_server.py 文件中,您可以使用 @register_tool 装饰器添加您自己的自定义函数:
@register_tool(name="tell_joke", description="讲一个随机笑话")
def tell_joke() -> str:
jokes = [
"为什么程序员都喜欢黑色?因为他们不喜欢 bug 光。",
"Python 和蛇有什么共同点?一旦缠上你就放不下了。",
"为什么 Java 开发者很少被邀去派对?因为他们总是抛出异常。",
]
return random.choice(jokes)
@register_tool(name="send_message", description="给指定用户发送消息 {user:用户名称 content:消息内容}")
def send_message(user: str, content: str) -> str:
"""给指定用户发送私信"""
lark_client = LarkClient(get_auth())
# ... 实现逻辑 ...
return f"成功向 {user} 发送了私信: '{content}'"
重要: 只需添加函数和对应的描述,AI 会根据用户的文字自动分析并调用最匹配的函数,无需手动实现函数匹配逻辑。
🧸关于我
正在实习的一名研二学生,有问题欢迎加群或者加 V 交流,联络方式在 github 上哈,感谢 star⭐