loading…
Search for a command to run...
loading…
Enables AI assistants to interact with Enterprise WeChat (WeCom) using natural language to manage meetings, book rooms, and search contacts. It supports multipl
Enables AI assistants to interact with Enterprise WeChat (WeCom) using natural language to manage meetings, book rooms, and search contacts. It supports multiple AI models and provides intelligent contact matching via Pinyin.
基于 Laravel + MCP 协议构建的企业微信 AI 助手。用户通过自然语言指令,由 AI 自动识别意图并调用企业微信 API 完成操作。
"帮我明天下午3点和张三开个需求评审会" → AI 自动搜索联系人 → 创建会议 → 返回会议信息
| 分类 | Tool | 说明 |
|---|---|---|
| 会议 | CreateMeetingTool | 创建在线视频会议 |
| QueryMeetingsTool | 查询会议列表 | |
| GetMeetingInfoTool | 获取会议详情 | |
| UpdateMeetingTool | 修改会议 | |
| CancelMeetingTool | 取消会议 | |
| 日程 | CreateCalendarTool | 创建日历(私人/公共/企业) |
| QueryCalendarsTool | 查询日历列表 | |
| CreateScheduleTool | 创建日程,多日历时自动推荐 | |
| QuerySchedulesTool | 查询日程列表 | |
| GetScheduleDetailTool | 获取日程详情 | |
| CancelScheduleTool | 取消日程 | |
| 会议室 | QueryMeetingRoomsTool | 查询会议室列表 |
| BookMeetingRoomTool | 预定会议室 | |
| QueryRoomBookingsTool | 查询预定记录 | |
| CancelRoomBookingTool | 取消预定 | |
| 群聊 | CreateGroupChatTool | 创建群聊 |
| UpdateGroupChatTool | 修改群聊(改名/换群主/增减成员) | |
| GetGroupChatTool | 获取群聊详情 | |
| QueryGroupChatsTool | 查询我创建/参与的群聊 | |
| SendGroupMessageTool | 推送消息到群聊(支持 @成员) | |
| 联系人 | SearchContactsTool | 搜索内部联系人(拼音四级匹配) |
| 外部联系人 | SearchExternalContactsTool | 搜索外部联系人/客户(拼音四级匹配 + 备注名) |
| ListExternalContactsTool | 列出外部联系人,支持按员工和时间范围筛选 | |
| 记忆 | SaveMemoryTool | 保存用户偏好/习惯 |
| DeleteMemoryTool | 删除记忆 | |
| 个性化 | SetProfileTool | 设置 AI 名字/人设/欢迎语等 |
| GetProfileTool | 查看当前个性化配置 | |
| 定时任务 | CreateOnetimeTaskTool | 创建一次性定时任务("30分钟后提醒我") |
| CreateRecurringTaskTool | 创建周期性定时任务(每天/工作日/每周/每月) | |
| QueryScheduledTasksTool | 查询定时任务列表 | |
| CancelScheduledTaskTool | 取消定时任务 | |
| 文档 | CreateDocumentTool | 创建在线文档/表格/智能表格 |
| GetDocumentInfoTool | 获取文档基础信息 | |
| ShareDocumentTool | 获取文档分享链接 | |
| RenameDocumentTool | 重命名文档 | |
| DeleteDocumentTool | 删除文档 | |
| GetDocumentContentTool | 读取文档内容(提取为纯文本) | |
| UpdateDocumentContentTool | 编辑文档内容(追加/替换/插入) |
基于企微会话内容存档,每日自动分析员工聊天记录,提取结构化工作洞察并生成日报推送。
分层知识架构:
Layer 2: 用户日报(每人每天一份,推送给用户)
Layer 1: 对话摘要(每对话对每天一条,AI 分析压缩)
Layer 0: 原始聊天记录(外部 MySQL,按需回溯)
5 类洞察提取:
| 类型 | 说明 | 示例 |
|---|---|---|
| 待办事项 | 对话中的任务分配和工作请求 | "帮我看一下登录Bug" |
| 重要决策 | 双方达成一致的结论 | "就用方案B吧" |
| 关键时间节点 | 提到的截止日期 | "周五前提测" |
| 未回复检测 | 工作问题未得到回应 | 问了接口文档位置没回复 |
| 工作总结 | 对话核心内容概要 | 今日主要讨论了上线计划 |
待办生命周期管理:
open → completed(对话中确认完成)
open → expired(超期未完成)→ reminded(日报提醒)
reminded → completed / ignored / open(用户回复操作)
使用方式:
php artisan chat:analyze-daily # 分析昨天的聊天记录
php artisan chat:analyze-daily --date=2026-03-15 # 分析指定日期
php artisan chat:analyze-daily --backfill # 冷启动,回溯分析近 N 天
php artisan chat:push-reports # 推送日报给员工
php artisan chat:push-reports --force # 强制推送(忽略推送日限制)
git clone https://github.com/bangbangda/wecommcp.git
cd wecom-mcp
composer install
cp .env.example .env
php artisan key:generate
php artisan migrate
编辑 .env,选择一个 AI 驱动:
# 方式一:Ollama 本地模型(无需 API Key)
AI_DRIVER=ollama
OLLAMA_BASE_URL=http://localhost:11434/v1
OLLAMA_MODEL=qwen3:8b
# 方式二:Claude
AI_DRIVER=anthropic
ANTHROPIC_API_KEY=sk-ant-xxx
# 方式三:OpenAI
AI_DRIVER=openai
OPENAI_API_KEY=sk-xxx
# 方式四:DeepSeek
AI_DRIVER=deepseek
DEEPSEEK_API_KEY=sk-xxx
在企业微信管理后台创建自建应用,获取以下信息填入 .env:
WECOM_CORP_ID=your_corp_id
WECOM_AGENT_SECRET=your_agent_secret
WECOM_AGENT_ID=your_agent_id
WECOM_AGENT_TOKEN=your_callback_token
WECOM_AGENT_AES_KEY=your_callback_aes_key
# 通讯录同步(可选)
WECOM_CONTACT_SECRET=your_contact_secret
如果需要使用聊天记录智能分析功能,配置外部聊天记录数据库连接:
CHAT_RECORDS_DB_HOST=127.0.0.1
CHAT_RECORDS_DB_PORT=3306
CHAT_RECORDS_DB_DATABASE=chat_records
CHAT_RECORDS_DB_USERNAME=root
CHAT_RECORDS_DB_PASSWORD=
初始化分析配置:
php artisan db:seed --class=ChatAnalysisConfigSeeder
php artisan wecom:sync-contacts # 同步内部通讯录
php artisan wecom:sync-external-contacts # 同步外部联系人
php artisan chat
输入自然语言指令即可:
You: 帮我明天下午两点和张三开个项目评审会
AI: 我来帮你创建会议。先搜索一下"张三"...
找到联系人张三(产品部)。
已创建会议「项目评审会」:
- 时间:明天 14:00-15:00
- 参会人:张三
- 会议链接:https://meeting.tencent.com/xxx
用户(语音/文字)
|
v
+-------------+ +------------------+ +-----------------+
| 接入层 | --> | AI 编排层 | --> | MCP Tool 执行层 |
| 企微回调 | | AiDriver | | 企微 API 调用 |
| CLI 入口 | <-- | + Tool Use | <-- | 结果返回 |
+-------------+ +------------------+ +-----------------+
|
+-------+-------+
| | |
Ollama Claude OpenAI ...
+-----------------------------------------------------+
| 聊天记录智能分析(异步) |
| 外部 MySQL → 采集 → AI 分析 → 洞察管理 → 日报推送 |
+-----------------------------------------------------+
核心设计原则:
enter_chat 事件触发欢迎语dispatch()->delay(),周期性任务用 Scheduler 每分钟检查app/
├── Ai/ # AI 驱动抽象层
│ ├── Contracts/AiDriver.php # 驱动接口
│ ├── Drivers/ # AnthropicDriver, OpenAiCompatibleDriver
│ ├── Dto/ # AiResponse, ToolCall
│ └── AiManager.php # Laravel Manager 工厂
├── Mcp/
│ ├── Servers/WecomServer.php # MCP Server 入口
│ └── Tools/ # 38 个 MCP Tool
├── Models/ # Eloquent 模型
├── Services/
│ ├── ChatService.php # AI 对话编排(tool 循环)
│ ├── ContactsService.php # 内部联系人拼音匹配
│ ├── ExternalContactService.php # 外部联系人管理
│ ├── UserProfileService.php # 用户个性化 Profile
│ ├── ScheduledTaskService.php # 定时任务调度
│ └── ChatAnalysis/ # 聊天记录智能分析
│ ├── ChatAnalysisService.php # 主编排器
│ ├── MessageCollector.php # 消息采集
│ ├── ConversationAnalyzer.php # Phase 1 对话级 AI 分析
│ ├── ReportGenerator.php # Phase 2 日报生成
│ ├── InsightManager.php # 洞察生命周期管理
│ └── AnalysisConfigService.php # 配置管理
├── Wecom/ # 企微 API 客户端
├── Jobs/ # Queue Jobs
└── Console/Commands/ # CLI 命令
config/ai.php # AI 驱动配置
config/database.php # 数据库配置(含外部聊天记录库)
skills/ # Claude Code Skills
docs/ # 设计文档
php artisan chat # 交互式对话
php artisan test # 运行测试
php artisan wecom:sync-contacts # 同步内部通讯录
php artisan wecom:sync-external-contacts # 同步外部联系人
php artisan chat:analyze-daily # 分析昨日聊天记录
php artisan chat:push-reports # 推送日报
php artisan mcp:start wecom # 启动 MCP Server
# 切换 AI 驱动
AI_DRIVER=anthropic php artisan chat
AI_DRIVER=deepseek php artisan chat
config/ai.php 的 drivers 中添加配置AiManager 中添加 createXxxDriver() 返回 OpenAiCompatibleDriverAiDriver 接口.env 中添加对应环境变量Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"wecom-mcp": {
"command": "npx",
"args": []
}
}
}