基于 Skill 与 MCP 的 Spring AI 应用落地:将业务 SOP 转化为 AI 能力
利用 Skill 和 MCP 协议将业务 SOP 转化为 AI 能力,结合 Spring AI 框架实现应用落地。探讨传统工具调用痛点,解析 MCP 统一连接标准与 Skill 任务工作流设计,展示两者在 Spring AI 中的协同实战。通过自动周报生成案例,演示从数据拉取到报告生成的完整流程,并提供分层架构设计与团队协作建议,助力构建可复用、标准化的 AI Agent 系统。

利用 Skill 和 MCP 协议将业务 SOP 转化为 AI 能力,结合 Spring AI 框架实现应用落地。探讨传统工具调用痛点,解析 MCP 统一连接标准与 Skill 任务工作流设计,展示两者在 Spring AI 中的协同实战。通过自动周报生成案例,演示从数据拉取到报告生成的完整流程,并提供分层架构设计与团队协作建议,助力构建可复用、标准化的 AI Agent 系统。

在大模型时代,Agent 已经从「会聊天的机器人」进化为「能完成复杂任务的数字员工」。要让 Agent 真正落地到业务场景,绕不开两个关键能力:接入外部世界,以及复用成熟的方法论与流程。
Anthropic 提出的 Model Context Protocol(MCP)和 Agent Skills(Skill)正是在这两点上分别发力:MCP 负责把模型接到各种工具和数据源上,而 Skill 负责把这些能力组织成可复用的任务工作流。
接下来我会从概念、架构、Spring AI 实战到工程实践,系统拆解 Skill 与 MCP 如何协同,帮助你构建真正可用的 AI Agent。

早期的 LLM 工具调用(如简单插件、函数调用)在工程实践中暴露出几个典型问题:
在这个背景下,MCP 和 Skill 分别瞄准了不同层级的痛点:MCP 标准化「怎么连工具」,Skill 规范化「怎么完成任务」。
Model Context Protocol(MCP)是一个开放协议,用于在模型和外部系统之间建立统一、可互操作的连接方式。可以把 MCP 想象成模型世界的通用「外设接口标准」,而不是某个具体的插件市场。
核心特征包括:
在工程实践中,MCP 常用于把以下系统暴露给模型使用:
一个典型 MCP 架构中,会有三类角色:
这样一来,模型不必关心「如何连数据库」,而只需要理解「有一个工具可以执行安全 SQL 查询」,从而实现能力解耦与可迁移。
Agent Skills(Skill)是一种面向任务的「AI 技能包」,每个 Skill 是一套围绕某类任务的可复用知识与流程。可以把 Skill 理解为:针对一个具体任务,打包好 prompt、步骤设计、工具调用策略与资源的组合。

一个典型 Skill 的结构大致包括:
SKILL.md)
MCP 解决的是「连什么」和「如何安全地连」,但不会告诉模型「在什么场景下先做什么再做什么」。Skill 则将这层业务任务逻辑显性化,让 Agent 可以像专业员工一样执行完整工作流。
一句话概括两者差异:

| 维度 | MCP | Skill |
|---|---|---|
| 关注层级 | 能力接入层(工具 / 数据) | 任务与工作流层(方法论 / SOP) |
| 核心职责 | 标准化「模型如何连接外部世界」 | 标准化「模型如何完成具体任务」 |
| 形式 | 协议 + Server 实现 | 技能包目录 + 文档 + Prompt + 代码 |
| 可移植性 | 跨模型、跨 Agent 框架,只要支持 MCP 客户端即可 | 同类任务可跨项目 / 团队复用,依赖 Skill 定义方式 |
| 开发者角色 | 偏基础设施 / 平台工程师 | 偏业务工程师 / Prompt 工程 / Domain Expert |
| 示例 | 暴露「执行 SQL 查询」「读取仓库文件」等工具 | 「生成季度业务分析报告」「编写品牌一致营销物料」等 |
| 主要价值 | 降低工具集成成本,提高安全性与统一性 | 提升任务完成质量与复用度,沉淀领域知识 |
从这张表可以看出,Skill 与 MCP 并不是竞争关系,而是分层协作的关系。
第一个实战先不引入 MCP,只用 Skill 展示如何把「写周报 / 数据分析报告」这种常见办公任务系统化。
目标:构建一个「报告生成 Skill」,输入是:一周业务数据 + 笔记 + 关键事件;输出是:结构化的周报。
典型需求包括:
伪示例结构(偏概念性):
reporting-skill/
├── SKILL.md
├── prompts/
│ ├── system.txt
│ └── report_template.md
├── scripts/
│ └── preprocess_data.py
└── examples/
└── weekly_report_example.md
SKILL.md 描述该 Skill 的用途、输入格式(如 JSON 数据 + 文本)、输出示例、以及对模型的指示。

逻辑可以被抽象为几个步骤:
report_template.md 帮助模型输出结构化报告,保持格式一致性。这种基于 Skill 的设计有几点明显优势:
第二个实战更贴近真实工程:报告不再手动喂数据,而是通过 MCP 直接从外部系统提取(如数据库 / API),再由 Skill 负责分析与写作。
这里选用 Spring AI 作为 Java / Spring 生态中的实现方式。
需求升级为:
换句话说:MCP 管「去哪拿数据」,Skill 管「拿到数据后怎么写好报告」。
先在服务端用 Spring AI 暴露一个 MCP 工具 getWeeklyMetrics,对接数据库或外部服务。
下面是一个简化、示意性的配置代码:
// 数据访问服务示例
@Service
public class AnalyticsService {
public WeeklyMetrics getWeeklyMetrics(LocalDate startDate, LocalDate endDate) {
// 这里通常会查询数据库或调用外部 API
WeeklyMetrics metrics = new WeeklyMetrics();
metrics.setStartDate(startDate);
metrics.setEndDate(endDate);
// 填充指标数据:pv/uv、转化率、收入等
return metrics;
}
public static class WeeklyMetrics {
private LocalDate startDate;
private LocalDate endDate;
// 这里省略各种业务指标字段的定义和 getter/setter
}
}
使用 Spring AI 的 MCP 支持把它暴露为 MCP 工具(示意):
@Configuration
public class McpConfig {
// 将业务方法包装为 MCP 工具
@Bean
public ToolCallbackProvider weeklyMetricsTools(AnalyticsService analyticsService) {
return MethodToolCallbackProvider.builder()
.toolObjects(new WeeklyMetricsTool(analyticsService))
.build();
}
// 包装类,方法会被暴露为 MCP 工具
public static class WeeklyMetricsTool {
private final AnalyticsService analyticsService;
public WeeklyMetricsTool(AnalyticsService analyticsService) {
this.analyticsService = analyticsService;
}
@Tool(name = "get_weekly_metrics", description = "获取指定日期范围内的核心业务指标")
public AnalyticsService.WeeklyMetrics getWeeklyMetrics(
@ToolParameter(description = "开始日期,格式 yyyy-MM-dd") String startDate,
@ToolParameter(description = "结束日期,格式 yyyy-MM-dd") String endDate) {
LocalDate start = LocalDate.parse(startDate);
LocalDate end = LocalDate.parse(endDate);
return analyticsService.getWeeklyMetrics(start, end);
}
}
}
这里利用 Spring AI 对 MCP 的封装,把带有 @Tool 注解的方法暴露为 MCP 工具,模型或 Agent 通过 MCP Client 即可发现并调用。
在客户端(消费 MCP 工具的一侧),可以使用 Spring AI 提供的 ChatClient,让模型在对话中调用 MCP 工具,然后结合 Skill 的提示完成报告生成。
伪示例代码:
@Service
public class WeeklyReportService {
private final ChatClient chatClient;
public WeeklyReportService(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
public String generateWeeklyReport(LocalDate startDate, LocalDate endDate) {
String systemPrompt = """
你是一名专业的数据分析师和业务顾问。
现在你需要根据提供的一周业务指标,生成一份结构化的运营周报。
周报结构应包括:本周整体概览、核心指标分析、亮点与问题、下周建议。
""";
String userPrompt = """
请根据本周的业务数据生成运营周报。
时间范围:{start} 到 {end}。
如果当前没有业务数据,请先调用工具获取一周的业务指标,再进行分析和写作。
""";
return chatClient.prompt()
.system(systemPrompt)
.user(userSpec -> userSpec
.text(userPrompt)
.param("start", startDate.toString())
.param("end", endDate.toString()))
// 告诉模型可以使用的工具(底层通过 MCP 暴露)
.tools(toolsSpec -> toolsSpec
.tool("get_weekly_metrics"))
.call()
.content();
}
}
在这个示例中:
get_weekly_metrics 暴露为工具。ChatClient 在对话中允许模型使用这个工具。systemPrompt 与整体对话设计中:它描述了如何撰写周报、报告结构和分析维度。如果你希望把 Skill 进一步模块化,可以将上面的 prompt 和模版抽到单独的 Skill 包中,再在 Spring 服务里简单引用。
这种组合带来的价值非常明显:
在实际系统里,可以按以下分层方式来接入 Skill 与 MCP:
这种分层的好处是:当你要接入新模型或替换 Agent 框架时,只要保持 MCP 和 Skill 层的契约,大部分能力可以直接迁移。
在团队内部,可以这样划分职责:
为了避免上下文爆炸,可以在 Skill 设计中采用「渐进披露」策略:
对于拥有大量 Skill 的大型系统,这是控制成本与提升稳定性的关键策略之一。
优先关注 MCP 与 Spring AI:
可以先从 Skill 着手:
建议从整体架构与治理角度规划:
MCP 和 Skill 代表了 Agent 工程化的两条主线:能力接入标准化和任务逻辑模块化。它们并不是要取代现有的开发方式,而是帮助开发者以更低成本复用工具与经验,让「为 AI 编程」更接近传统软件工程的可维护与可协作形态。
如果你想在自己的项目中落地这套范式,一个实际可行的路径是:
随着 Skill 与 MCP 生态的完善,未来「为 Agent 安装技能」「为企业构建通用 Agent 平台」会像今天接入微服务和消息队列一样自然,成为现代软件架构中的基础设施之一。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online