在 IM 项目里落地 Skill + MCP:我给 V-IM RPO 做了一套可被 AI 直接调用的消息能力

最近在做 v-im-server-pro 时,我补了一套自己觉得很实用的能力:Skill + MCP

它不是那种"接个大模型聊聊天"的玩法,而是让 AI 真正能接入业务系统,调用项目里的消息能力,完成"找人、找群、发消息、发文件、发会议邀请"这一整套动作。

这篇文章主要分享一下,这套能力在 V-IM 项目里是怎么设计的、解决了什么问题,以及为什么我觉得这种方式,比单纯写提示词靠谱得多。


一、为什么 IM 项目特别适合做 MCP

很多业务系统接 AI,第一反应通常是:

  • 做个问答助手
  • 做个知识库
  • 给后台加个智能客服入口

这些当然都可以做,但对于 IM 项目来说,更自然的一条路其实是:

把聊天系统本身的能力开放给 AI 调用。

因为聊天系统最核心的能力,本来就是"把消息发给正确的人或群"。

举几个很典型的场景:

  • 给张三发一句提醒
  • 通知研发群晚上发版
  • 给系统消息发一段公告
  • 发一张活动海报到某个群
  • 创建一个会议并把邀请卡片发出去

这些需求,用户天然就会用自然语言表达。

如果 AI 能理解这句话,再直接调用系统能力完成动作,它的价值会比单纯"生成一段文案"高很多。

所以我在 v-im-server-pro 里做的这件事,本质上就是:

把 V-IM 的消息能力标准化成 MCP 工具,再用 Skill 约束 AI 的调用方式。


二、项目里是怎么落地的

当前项目结构里,和这件事最相关的是 v-im-server-mcp 模块。

这个模块的作用很明确:

把 V-IM 的聊天发送能力,包装成标准 MCP Server,对外暴露给支持 MCP 的客户端或者 Agent 使用。

从配置上看,它的默认地址是:

http://localhost:8080/vim/mcp

服务名是:

v-im-mcp-server

同时它不是一个随便暴露出来的"裸接口",而是带有比较清晰的业务约束,例如:

  • 消息发送默认需要 mcp.message.send
  • 文件上传默认需要 mcp.file.upload
  • 有每分钟调用限流
  • 有消息长度限制
  • 有文件名长度限制
  • 有目标解析候选数量限制

这一点我很看重,因为它意味着:
AI 不是直接绕过业务规则去操作系统,而是在现有权限和安全边界之内工作。


三、这套 MCP 提供了哪些能力

目前 V-IM 这层 MCP 已经覆盖了比较完整的消息操作链路:

  • resolve_chat_target
  • send_text_message
  • send_image_message
  • send_file_message
  • upload_file
  • create_upload_session
  • send_mail_notification
  • create_meeting_and_send_invite
  • invite_users_to_meeting

这几个工具组合起来,基本就能覆盖日常消息发送的大部分场景。

1. resolve_chat_target

这个工具很关键。

因为真实用户不会说:

请把这条消息发给 chatId=123456

用户更可能说:

给张三发一句话

通知研发群一下

给系统消息发一段祝福

所以第一步通常不是发消息,而是解析目标

这个工具会根据名称去解析单聊用户或群聊目标,支持:

  • friend / group
  • 昵称或群名
  • 精确匹配
  • 候选限制
  • 登录名、手机号后缀、部门等辅助过滤

也就是说,AI 可以先把"自然语言对象"转换成"系统里的真实目标"。

2. send_text_message

发送文本消息。

这是最基础、最常用的工具。

一般流程就是:

  1. 先解析目标
  2. 拿到 chatId
  3. 发送正文

3. send_image_message / send_file_message

发送图片和文件消息。

这里也体现出业务系统和 AI 调用之间的一个现实问题:

AI 拿到的不一定是系统可直接发送的资源。

比如图片可能只是一个远程链接,或者文件只是本地内容。

所以需要先通过上传能力转成系统可访问 URL,再继续发送。

4. 会议和邮件能力

这部分不是传统意义上的聊天消息,但它们和"沟通协作"高度相关,所以也一起放进了 MCP:

  • 创建会议并发邀请
  • 给会议追加邀请人
  • 发邮件通知

这会让 AI 的能力从"发一条消息",进一步延伸到"发起协作动作"。


四、为什么还要配一个 Skill

如果只有 MCP,其实还不够。

因为 MCP 只解决了一件事:

工具可以被调用

但另一个问题是:

AI 知不知道什么时候该调用哪个工具,顺序是什么,失败时怎么处理

这就是 Skill 的作用。

在这个项目里,我补了一个技能:

skills/v-im-send-message

它的本质不是代码,而是一套给 Agent 用的"执行策略"。

简单说,它是在教另一个 AI:

  • 用户说"给张三发消息"时,先不要乱猜 chatId
  • 私聊和群聊要先判断
  • 如果只给了名字,先走 resolve_chat_target
  • 如果要发图片或文件,先确认有没有可访问 URL
  • 如果解析结果不唯一,不要盲发
  • 成功后应该把哪些关键结果回报给用户

所以我一直觉得:

MCP 是能力层,Skill 是行为层。

两者结合起来,AI 才不是"能看到工具",而是"知道怎么稳妥地使用工具"。


五、这个 Skill 具体做了什么

当前这个 v-im-send-message 技能目录里,主要有三类文件。

1. SKILL.md

这是技能主说明。

这里面定义了:

  • 这个技能在什么场景下触发
  • 适合处理哪些消息操作
  • 标准发送流程是什么
  • 什么时候必须先解析
  • 什么时候不能直接发送
  • 输出结果时要同步哪些信息

它最核心的一条原则就是:

优先解析目标,不要自己猜 chatId

这句话听起来简单,但对稳定性影响很大。

因为很多发送错误,不是接口调用错了,而是目标识别错了。

2. agents/openai.yaml

这个文件是技能的元信息配置。

它声明了技能的显示名称、简介、默认提示,以及依赖的 MCP 服务。

也就是说,在支持技能系统的环境里,AI 能明确知道这个技能依赖的是哪个 MCP 服务。

3. references/调用参考.md

这是调用参考文档。

我把常用工具、关键参数、推荐调用顺序、返回结果解释都放进去了。

这样主技能文档不会太长,细节又可以按需查阅。

这种拆法我觉得很适合工程化场景:

  • 主文件负责策略
  • 参考文件负责细节
  • Agent 按需加载,减少上下文噪音

六、我为什么觉得这种方式比"写一段提示词"靠谱

很多人做 AI 接口时,会习惯这么干:

  1. 给模型一些接口说明
  2. 写一大段提示词
  3. 希望模型自己理解调用顺序和参数规则

这种方式在 Demo 阶段没问题,但一到业务场景,经常会出这些问题:

  • 该先解析目标的时候直接发了
  • 群聊和私聊判断错了
  • 资源 URL 不可访问
  • 候选目标不唯一时盲发
  • 成功结果没有提炼给用户,直接贴一坨 JSON

这些问题本质上不是模型不聪明,而是没有工程化约束

而 Skill + MCP 这套组合,解决的就是这个问题:

  • MCP 负责把能力标准化
  • Skill 负责把调用路径标准化
  • 权限、限流、审计在业务边界内兜底

这样 AI 的行为就会从"依赖灵感"变成"依赖流程"。

这件事在业务系统里非常重要。


七、这套设计在 IM 场景里有什么实际价值

如果从产品角度看,我觉得它至少带来三类价值。

1. 让自然语言直接映射为业务动作

用户说一句:

通知研发群今晚发版

AI 不再只是帮你润色这句话,而是可以真的:

  1. 找到研发群
  2. 组织消息内容
  3. 调用发送工具
  4. 返回发送结果

这一步非常关键,因为它把 AI 从"建议者"变成了"执行者"。

2. 降低系统能力对人工操作的依赖

原本很多动作,需要运营、客服、管理员手工点来点去完成。

现在这些动作,如果权限允许,就可以由 Agent 直接完成。

对于 IM、协作、通知类系统来说,这个方向会越来越有价值。

3. 给后续智能体协作留出接口

一旦 MCP 能力建起来,后面其实就不只是"发消息"了。

你还可以继续扩展:

  • 发审批提醒
  • 发会议通知
  • 发邮件
  • 发文件
  • 做跨插件协同动作

也就是说,MCP 不是一个孤立功能,它更像是 AI 接入整个业务系统的标准入口。


八、这次实践里,我最在意的几个点

1. 不要硬编码目标

发消息类操作里,最危险的不是"发失败",而是"发错人"。

所以目标解析必须是第一层能力,而不是调用方自己拼。

2. Skill 要写给 AI,不是写给人看

技能文档不是产品说明书,也不是 README。

它的目标只有一个:让另一个 Agent 稳定执行。

所以要写清楚:

  • 什么时候触发
  • 用什么顺序
  • 什么情况下停止
  • 返回结果怎么解释

3. MCP 不应该脱离业务权限体系

如果 AI 可以直接越过权限发消息,那这套系统就很危险。

所以我很认同当前项目里把 scope、限流、路径、上传约束都配置化的做法。


九、我对 Skill + MCP 在业务项目里的判断

如果只是做一个"能聊天"的 AI,我觉得没必要折腾这么多。

但如果你想让 AI 真正进入业务流程,变成可执行的助手,那 Skill + MCP 是一条很值得走的路。

尤其是在 IM 这种天然以"沟通动作"为核心的系统里,它比传统问答式接入更贴近真实价值。

因为最后真正重要的不是:

AI 会不会回答

而是:

AI 能不能把正确的消息,用正确的方式,发给正确的人

这才是业务系统真正关心的结果。


十、后面还可以怎么扩展

基于现在这套能力,我觉得后面还可以继续往下做:

  • 把更多插件能力 MCP 化
  • 做更完整的消息模板和发送策略
  • 补更细的审计日志和回执能力
  • 为不同角色做不同的技能集合
  • 让 Agent 不只发消息,还能串起会议、邮件、文件、通知全流程

如果这条路继续走下去,最终得到的不会只是"一个会聊天的 AI",而是:

一个真正能操作业务系统的智能执行层。


结语

这次在 v-im-server-pro 里做 Skill + MCP,我最大的感受是:

AI 接入业务系统,关键不是模型多强,而是接口有没有标准化、流程有没有被固化、边界有没有被收住。

MCP 提供能力,Skill 提供策略。

当两者真正结合起来,AI 才会从"看起来懂业务",变成"真的能做业务"。

如果你也在做 IM、协作、通知类系统,我很建议试试这个方向。它比单纯接一个聊天框,更接近业务落地。

相关推荐
四千岁2 小时前
WSL + OpenCode 最佳实践:环境一致、模型配置、GUI 远程使用
前端·javascript·后端
ssshooter2 小时前
Tauri 2 Linux 上 asset://localhost 访问返回 403 避坑指南
前端·后端·架构
book123_0_992 小时前
spring 跨域CORS Filter
java·后端·spring
空空潍2 小时前
Spring AI 实战教程(一)入门示例
java·后端·spring·ai
大阿明2 小时前
Go基础之环境搭建
开发语言·后端·golang
polaris06302 小时前
springboot接入deepseek深度求索 java
java·spring boot·后端
weixin_425023002 小时前
【Spring Boot 2.7 整合 WebSocket 完整实战】鉴权拦截+在线用户管理+定向消息推送
spring boot·后端·websocket
真实的菜2 小时前
Spring Boot 升级全攻略:从 2.2 到 2.7 再到 3.x
java·spring boot·后端
傲文博一2 小时前
在 Mac 上管理上千台服务器,我把低效操作拆成了 6 个可优化点
后端