MCP(模型上下文协议)提示通过将 AI 功能与结构化数据访问相结合,实现了工作流自动化。本文通过一个实际示例,演示了如何使用 MCP 的提示和资源模板来构建自动化。
本指南演示了 MCP 提示如何自动化重复性工作流。无论您是对 MCP 生态系统感兴趣,还是只想利用 AI 进行工作流自动化,您都将通过一个具体的膳食计划示例,学习如何构建实用的自动化。无需任何 MCP 经验——我们将在深入实现之前介绍基础知识。
问题所在:耗时的重复性任务
每个人都有一堆重复性任务,这些任务会侵蚀他们的工作时间。常见的例子包括应用代码审查反馈、生成周报、更新文档或创建样板代码。这些任务并不复杂——它们遵循可预测的模式——但它们繁琐且耗时。MCP 提示旨在帮助自动化这类工作。
MCP 提示提供的不仅仅是命令快捷方式。它们是构建工作流自动化的基础,将脚本的灵活性与现代 AI 系统的智能相结合。本文探讨了如何使用 MCP 的提示系统、资源模板和模块化服务器来构建自动化。我将通过我构建的一个膳食计划自动化来演示这些概念,但这些模式广泛适用于任何结构化的、重复性的工作流。
示例:自动化每周膳食计划
我需要解决一个反复出现的问题:按菜系统筹每周膳食,以有效管理食材。手动流程包括选择菜系、挑选菜品、列出食材、购物和整理食谱——这些重复步骤每周都花费大量时间。
于是我决定使用 MCP!通过自动化这些步骤,我可以将整个工作流简化为选择一个菜系,然后接收一份包含购物清单的完整膳食计划。(任何支持 MCP 提示的客户端应该都可以!)
选择一个提示
从下拉列表中选择一个菜系
完成! 系统会生成膳食计划、购物清单,甚至打印购物清单和食谱。
在这里,我们主要关注带有其提示和资源的食谱服务器。你可以在这里找到打印服务器的示例(它适用于特定的热敏打印机型号,但你可以轻松地将其更换为电子邮件、Notion 或任何其他输出方式)。分离服务器的优点在于你可以混合搭配不同的功能。
核心组件
让我们深入了解实现这一自动化的三个组件:提示、资源和补全。我将向你展示它们各自的概念性工作原理,然后我们将一起实现它们。
1. 资源模板
在 MCP 中,静态资源表示具有唯一 URI 的特定内容片段——例如 file://recipes/italian.md
或 file://recipes/mexican.md
。虽然这种方法很直接,但扩展性不佳。如果你有 20 种菜系的食谱,你就需要定义 20 个独立的资源,每个都有自己的 URI 和元数据。
资源模板通过带有参数的 URI 模式解决了这个问题,将静态资源定义转变为动态内容提供者。
例如,像 file://recipes/{cuisine}.md
这样的模板可能代表一组如下的资源:
file://recipes/italian.md
返回意大利菜食谱file://recipes/mexican.md
返回墨西哥菜食谱
这种模式不仅限于简单的筛选。你可以为以下场景创建模板:
- 分层数据:
file://docs/{category}/{topic}
- Git 仓库内容:
git://repo/{branch}/path/{file}
- 网络资源:
https://api.example.com/users/{userId}/data
- 查询参数:
https://example.com/{collection}?type={filter}
有关 URI 方案和资源模板的更多详细信息,请参阅 MCP 资源规范。
2. 补全
没人能记住确切的参数值。是 “italian”、“Italian” 还是 “it”?补全通过在用户输入时提供建议来弥合这一差距,创造出一种直观而非限制性的界面体验。
不同的 MCP 客户端以不同的方式呈现补全功能:
- VS Code 显示一个可筛选的下拉列表
- 命令行工具可能使用模糊匹配
- Web 界面可以提供丰富的预览
但底层数据来自你的服务器,确保所有客户端之间的一致性。
3. 提示:随上下文演变的命令
提示是进入自动化的入口点。它们定义了哪些命令可用,范围可以从简单的文本指令到丰富的、具有上下文感知能力的操作。
让我们看看提示如何演变以处理日益复杂的用例:
基本提示:静态指令
"Create a meal plan for a week"
这行得通,但很通用。AI 将根据其通用知识创建膳食计划。
添加参数:动态定制
"Create a meal plan for a week using {cuisine} cuisine"
现在用户可以指定意大利菜、墨西哥菜或任何其他菜系。提示会根据用户输入进行调整,但仍然依赖于 AI 对这些菜系的通用知识。
包含资源:你的数据
提示可以包含资源,以添加超出简单文本指令的上下文数据。当你需要 AI 使用你特定的上下文而不是通用知识来工作时,这一点至关重要。
在我的膳食计划示例中,我不想要通用的食谱——我希望 AI 使用**我**收集的、我确定自己喜欢的经过测试的食谱。复杂的提示通过将提示文本与嵌入式资源捆绑在一起,使这成为可能。
它的工作原理如下:
- 用户选择一个带参数的提示(例如,cuisine=“italian” 的 “plan-meals”)
- 服务器返回指令文本和资源引用
- 客户端决定如何处理资源——应用程序可能会选择使用嵌入或关键字搜索来选择数据子集,或者将原始数据直接传递给模型
- AI 接收上下文并生成响应
在我的例子中,VS Code 将整个资源附加到提示上,这对于这个用例非常有效。在计划意大利周时,AI 可以访问我所有的意大利食谱,确保它只推荐我真正有食谱的菜肴。
与简单提示的关键区别在于:AI 不再是响应“计划意大利餐”这样的请求并给出通用建议,而是基于你实际的食谱收藏、饮食偏好和限制进行工作。
我们一直使用的食谱资源是**嵌入式资源**,它们包含来自服务器的内联内容。根据 MCP 规范,提示还可以包含其他数据类型。
这使得我们能够实现超出基于文本的食谱的高级用例,例如带有截图的设计审查提示或语音转录服务。
构建食谱服务器
让我们实现一个完整的 MCP 服务器,将我们讨论过的所有概念整合在一起。我们将从服务器设置开始,然后实现每个功能。
先决条件
在深入代码之前,请确保你已具备:
- Node.js(v18 或更高版本)和 npm 已安装
- MCP SDK 已安装
npm install @modelcontextprotocol/sdk
- 一个兼容 MCP 且支持提示和资源的客户端,例如带有 MCP 扩展的 VS Code
在本教程中,我将使用 TypeScript SDK,但 MCP 也支持 Python 和其他语言。
服务器设置和功能
首先,让我们创建我们的 MCP 服务器
const server = new McpServer({
name: "favorite-recipes",
version: "1.0.0",
});
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch((error) => {
console.error("Server error:", error);
process.exit(1);
});
实现资源
接下来,让我们注册一个带有补全功能的资源模板。
server.registerResource(
"recipes",
new ResourceTemplate("file://recipes/{cuisine}", {
list: undefined,
complete: {
cuisine: (value) => {
return CUISINES.filter((cuisine) => cuisine.startsWith(value));
},
},
}),
{
title: "Cuisine-Specific Recipes",
description: "Traditional recipes organized by cuisine",
},
async (uri, variables, _extra) => {
const cuisine = variables.cuisine as string;
if (!CUISINES.includes(cuisine)) {
throw new Error(`Unknown cuisine: ${cuisine}`);
}
const content = formatRecipesAsMarkdown(cuisine);
return {
contents: [
{
uri: uri.href,
mimeType: "text/markdown",
text: content,
},
],
};
},
);
实现提示
最后,让我们注册提示,它也带有补全功能
server.registerPrompt(
"weekly-meal-planner",
{
title: "Weekly Meal Planner",
description:
"Create a weekly meal plan and grocery shopping list from cuisine-specific recipes",
argsSchema: {
cuisine: completable(z.string(), (value) => {
return CUISINES.filter((cuisine) => cuisine.startsWith(value));
}),
},
},
async ({ cuisine }) => {
const resourceUri = `file://recipes/${cuisine}`;
const recipeContent = formatRecipesAsMarkdown(cuisine);
return {
title: `Weekly Meal Planner - ${cuisine} Cuisine`,
description: `Weekly meal planner for ${cuisine} cuisine`,
messages: [
{
role: "user",
content: {
type: "text",
text: `Plan cooking for the week. I've attached the recipes from ${cuisine} cuisine.
Please create:
1. A 7-day meal plan using these recipes
2. An optimized grocery shopping list that minimizes waste by reusing ingredients across multiple recipes
3. Daily meal schedule with specific dishes for breakfast, lunch, and dinner
4. Preparation tips to make the week more efficient
5. Print Shopping list
Focus on ingredient overlap between recipes to reduce food waste.`,
},
},
{
role: "user",
content: {
type: "resource",
resource: {
uri: resourceUri,
mimeType: "text/markdown",
text: recipeContent,
},
},
},
],
};
},
);
亲手运行
请遵循 VS Code 的文档来设置服务器。在 VS Code 中设置好服务器后,你可以查看其状态、调试正在发生的情况,并快速迭代你的自动化。
在 VS Code 中设置好服务器后,在聊天中输入“/”并选择该提示。
扩展你的自动化
MCP 提示开启了激动人心的自动化可能性:
- 提示链:按顺序执行多个提示(计划膳食 → 生成购物清单 → 下单采购)
- 动态提示:根据可用资源或一年中的不同时间进行调整
- 跨服务器工作流:协调多个 MCP 服务器以实现复杂的自动化
- 外部触发器:通过 webhook 或计划任务激活提示
在膳食计划中展示的模式适用于许多领域:
- 了解你代码库的文档生成
- 能够访问你数据源的报告创建
- 理解你项目结构的开发工作流
- 具有完整上下文的客户支持自动化
关键要点
- MCP 提示可以包含动态资源,为 AI 提供任务的完整上下文
- 资源模板实现了可扩展的内容服务,无需重复
- 模块化服务器架构让你能够混合和匹配各种功能
总结
这个膳食计划自动化最初只是源于一个简单的愿望:避免每周重写购物清单。它最终演变成一个完整的系统,只需点击几下就能处理膳食计划、购物清单和食谱打印。
MCP 提示提供了自动化重复性任务的实用工具。模块化架构意味着你可以从小处着手——也许只是自动化你工作流的一部分——并根据需要进行扩展。无论你是自动化文档、报告还是膳食计划,模式都保持不变:识别重复性任务,构建专注的自动化,让系统处理繁琐的部分。