先别急着在项目里堆“Skill”“MCP”这些名词。最近后台收到不少读者留言,说自己把提示词模板收藏了几十份,也试过给 AI 编程工具配置规则,但代码生成质量时好时坏,换了新项目后又不知道怎么复用,甚至分不清“Skill”和“MCP”到底谁解决谁的问题。
这篇文章不打算只做名词解释。我会从工程落地的角度,把“提示词、规则、Skill、MCP”这 4 个容易混淆的概念一次性讲透,再带大家完成一套可控的部署演示:
- 理解 4 个概念的本质与分工;
- 在真实项目里编写高效的提示词与规则;
- 安装并验证一个 Skill 示例;
- 从零跑通一个 MCP Server;
- 解决新手最常见的概念混淆与配置报错。
无论你是后端开发者、前端开发者,还是刚开始接触 AI 编程工具的产品技术同学,都可以把这篇文章当作一份工具型入门手册。
1. 背景与核心概念
1.1 为什么突然冒出这么多 AI 工程名词
过去一年,AI 编程工具从“单轮问答插件”进化成了“能操作终端、读写文件、调用外部服务的智能体”。工具变复杂后,大家发现只靠一句“帮我写个登录功能”已经不够用了。为了让 AI 稳定地产出高质量代码,社区和厂商分别提出了不同的治理手段。
于是你会看到这些词频繁出现:
- 提示词(Prompt):你发给 AI 的指令文本;
- 规则(Rules):项目内固定的约束说明,通常以文件形式存在;
- Skill:一套封装好的能力包,包含提示词、脚本、说明文档,供 AI 加载执行;
- MCP(Model Context Protocol,模型上下文协议):AI 模型与外部数据、工具之间的标准通信协议。
这几个词很容易被混为一谈,是因为它们都会被“以文本文件的形式”写进工程目录,也都会影响 AI 后续的生成行为。但从定位上看,它们的抽象层级完全不同。
1.2 四个概念的关系定位
先打一个通俗的比方。
- 提示词:相当于你给临时工布置任务时说的话。
- 规则:相当于公司墙上贴的“员工手册”,任何人进来都要遵守。
- Skill:相当于一个“岗位作业指导书”,它告诉你这类任务有哪些步骤、用到哪些脚本、按什么顺序产出。
- MCP:相当于“标准接口插座”,让员工能安全地调用外部系统(数据库、设计稿、第三方 API),而不是把账号密码全都写在纸条上。
如果放到一个 AI 编程工具的会话里理解:
启动项目 → 读取项目规则 → 用户输入提示词任务 → AI 判断需要 Skill 执行子任务 → Skill 内部通过 MCP 调用外部工具 → 汇总结果生成代码所以不要问“规则和 MCP 哪个更强”,它们是不同层次的东西。规则是“约束条件”,Skill 是“能力封装”,MCP 是“沟通协议”。
1.3 为什么新手容易学“歪”
我在交流群里看到不少初学者花了大量时间研究“如何写出完美提示词”,结果进入真实项目后发现:AI 还是经常改错文件、编造 API、不遵守项目风格。
其根本原因是:提示词只对当前会话起作用,规则只约束代码风格和全局禁忌,而真正让 AI 掌握“完成某类任务的完整方法论”的是 Skill,真正让它安全访问外部数据的则是 MCP。
一套可复用的 AI 工程配置,应该同时包含这四层。只学一层,效果一定打折。
2. 环境准备与版本说明
2.1 最小的实验环境
本文的演示会覆盖“规则文件 + Skill + MCP Server”,由于不同 AI 编程工具对这几项的支持程度不同,这里我们不绑定某一个商业产品,而是以一个通用工程环境演示。
你需要准备的基础环境如下:
| 环境项 | 建议配置 |
|---|---|
| 操作系统 | Windows 10/11、macOS 或 Linux 均可 |
| Node.js | 18.0 以上,MCP Server 示例需要 |
| Python | 3.9 以上,部分 MCP SDK 示例需要 |
| 开发工具 | VS Code / Cursor 或你常用的 IDE |
| AI 编程工具 | Claude Code、Codex CLI 或支持规则/Skill机制的同类工具 |
版本说明:不同版本对 Skill 和 MCP 的配置格式可能存在差异。本文演示的是通用思路,实际配置时请以你所用工具的官方文档为准。
2.2 示例项目结构
为了演示方便,我预先规划好这样的目录:
ai-engineering-demo/ ├── .ai/ │ ├── rules.md │ └── skills/ │ └── code-review/ │ └── SKILL.md ├── mcp-server/ │ ├── package.json │ └── index.js ├── src/ │ └── demo.ts └── README.md这个结构本身也符合实际工程习惯:提示词不散落在聊天记录里,规则放在统一目录,Skill 按目录管理,MCP Server 独立成包。
3. 提示词与规则:先打好工程地基
3.1 提示词工程的三个层次
先说提示词。很多人把提示词理解为“一句精心设计的咒语”,但工程化的提示词应该至少包含三个层次:
- 角色与目标:你希望 AI 扮演什么角色,本次任务的成功标准是什么。
- 上下文与约束:项目用的是什么技术栈,哪些文件不能改,性能和安全要求是什么。
- 输出格式与验证:代码的风格、接口签名、自测要求。
下面是一个针对“新增 API 接口”的提示词示例:
你是一个熟悉 NestJS 的后端工程师。 任务:在 src/modules/user 下新增一个“根据用户 ID 查询详情”的接口。 约束: 1. 使用 TypeScript 编写。 2. 遵循项目内已有的 DTO 校验风格。 3. 不要修改数据库表结构。 4. 查询不到用户时返回 404,错误信息统一为中文。 输出要求: 1. 先列出需要新增/修改的文件清单。 2. 再给出完整代码。 3. 最后给出 curl 测试命令。这种写法的优势在于:AI 的执行路径会变得很清晰,不会一上来就改数据库迁移文件或写出风格不一致的代码。
3.2 规则的定位与常见文件格式
规则文件通常被 AI 编程工具自动读取,作为每次交互的默认约束。比如 Claude Code 中常见的CLAUDE.md,以及许多团队使用的.cursorrules、AGENTS.md,本质上都扮演了规则文件的角色。
规则文件建议写这些内容:
- 项目的技术栈和目录结构;
- 强制代码风格与命名规范;
- 禁止事项(如禁止直接改数据库、禁止删除未跟踪文件);
- 测试要求。
这里给出一份规则文件示例:
# 项目规则(.ai/rules.md) ## 技术栈 - 前端:Vue 3 + TypeScript - 后端:Node.js + Fastify - 数据库:PostgreSQL,ORM 使用 Prisma ## 代码风格 - 组件命名:PascalCase - 函数命名:camelCase - 常量命名:UPPER_SNAKE_CASE - CSS 类名使用 BEM 风格 - 所有新增文件必须写文件头注释 ## 工作流要求 - 修改已有文件前,先输出 diff 概要,经确认后再写入。 - 涉及数据库变更,必须先提供迁移脚本,不允许直接修改线上数据表。 - 每次完成后运行 `npm run lint` 和 `npm run test`,并修复新增报错。 ## 禁止事项 - 禁止在代码中写死密钥。 - 禁止引入“能用简单函数解决就不引入”的第三方依赖。 - 禁止删除其他业务模块文件。3.3 实际项目中提示词和规则如何配合
切回一个日常场景。假设你正在某个老项目里增加功能,项目里已经存在“旧代码不能伤筋动骨”的隐性要求,但 AI 并不知道这一点。
最好的做法是:把这些约束写进规则文件,让 AI 在每次决策前都能感知,从而避免“每次都要在对话里重复输入一大段前缀”的窘境。
使用方式大致是:
用户:帮我修复登录接口的 500 错误。 AI 内部行为: 1. 读取 .ai/rules.md,了解项目技术栈和修改要求。 2. 搜索 src 下与 authentication 相关文件。 3. 定位异常日志并修复,运行测试验证。这就是“提示词负责个性化任务,规则负责通用约束”的协作逻辑。
4. Skill 到底是什么?写一个可复用的 Code Review Skill
4.1 Skill 的结构与工作方式
Skill 在 AI 编程工具中通常被设计为一个目录,里面包含一份SKILL.md说明文件,以及可选的脚本、模板、参考文档。当 AI 判断当前任务需要某个 Skill 时,会主动加载该目录,并按说明执行。
Skill 和普通提示词的本质区别在于:
| 对比项 | 普通提示词 | Skill |
|---|---|---|
| 存放位置 | 聊天/会话 | 工程目录,独立文件 |
| 作用范围 | 单次对话 | 可复用 |
| 可执行性 | 纯文本指令 | 可绑定脚本、命令、示例 |
| 稳定性 | 换会话即丢失 | 版本管理 |
4.2 动手写一个 Code Review Skill
下面我们来写一个最小可用版本的 Code Review Skill。
先创建目录:
mkdir -p .ai/skills/code-review然后创建SKILL.md文件:
# Code Review Skill ## 用途 当用户要求 review 代码、检查代码质量或提交前自查时,加载本 Skill。 ## 触发条件 - 用户说“帮我 review 一下代码” - 用户说“检查这个文件有没有问题” - 提交 PR 之前执行自查 ## 执行步骤 ### 1. 收集变更文件 运行以下命令获取本次变更文件列表: ```bash git diff --name-only只关注本次变更文件,不要 review 无关历史代码。
2. 检查规则文件
先读取项目根目录下的规则文件(如 .ai/rules.md、AGENTS.md),确认以下规范:
- 命名风格是否统一
- 是否引入不必要的依赖
- 注释与文档是否完整
3. 逐文件分析
针对每个变更文件,重点检查:
- 是否存在 bug 隐患(空指针、数组越界、异步未 await)
- 是否有安全风险(SQL 注入、XSS、敏感信息泄露)
- 是否有性能问题(循环内查询数据库、重复计算)
- 是否符合项目现有设计模式
4. 输出审查报告
报告格式统一为 markdown 表格:
| 文件 | 风险等级 | 问题描述 | 修改建议 | 质量等级:
- P0:必须修复后才能合并
- P1:建议修复
- P2:可选优化
5. 给出修复代码
对于 P0 和 P1 问题,必须给出可执行的修改建议。
注意事项
- 不要修改原始代码,除非用户明确要求“直接修复”。
- 如果发现规则文件与代码冲突,先报告冲突,不要擅自选择一方。
### 4.3 在对话中触发 Skill 当配置完成后,在 AI 编程工具中触发方式类似: ```text 用户:帮我 review 一下当前分支的代码,尤其看看用户模块的改动。 AI:检测到 code-review 技能,正在按 SKILL.md 执行。为了让 AI 更主动地加载 Skill,还可以在会话开头补充一句:
请使用 code-review 技能完成本次代码审查。这样会降低 AI 在“判断是否加载 Skill”这一步的试错成本。
不同工具对 Skill 的触发机制存在差异,有的工具还支持子代理调用、自定义斜杠命令等。使用前务必阅读工具文档。
5. MCP 是什么?部署一个真实的 MCP Server
5.1 MCP 解决的问题
MCP 是 Anthropic 在 2024 年提出的开放协议,全称是 Model Context Protocol。它的目标非常明确:为 AI 模型连接外部数据与工具提供一套统一的标准。
在 MCP 出现之前,每个 AI 工具接入外部 API 时都走私有实现,流程也不同,维护成本高。比如让 AI 查数据库,有的工具通过插件,有的通过函数调用,代码无法跨平台复用。
MCP 出现后,架构变成了三层:
AI 应用(Host) │ ▼ MCP 客户端(Client) │ ▼ MCP 服务器(Server) │ ├── 暴露工具(Tools) ├── 暴露资源(Resources) └── 暴露提示词(Prompts)简单说:MCP Server 是一个本地或远程服务,通过标准协议向 AI 暴露一系列能力,AI 不需要知道这些能力底层是怎么实现的。
5.2 从一个最简单的 MCP Server 开始
下面我们用 Node.js + TypeScript 来写一个本地 MCP Server,提供“查询天气”这样的工具函数。先说清楚:这里不接入真实天气 API,目的是演示协议与消息格式。
先初始化项目:
mkdir mcp-server cd mcp-server npm init -y npm install @modelcontextprotocol/sdk npm install -D typescript @types/node tsx创建tsconfig.json:
{ "compilerOptions": { "target": "ES2022", "module": "NodeNext", "moduleResolution": "NodeNext", "outDir": "./dist", "rootDir": "./src", "strict": true }, "include": ["src/**/*"] }创建src/index.ts:
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; import { z } from "zod"; // 创建 MCP Server 实例 const server = new McpServer({ name: "weather-demo", version: "1.0.0", }); // 注册一个工具:get_weather server.tool( "get_weather", "根据城市名称查询天气信息", { city: z.string().describe("城市名称,例如:武汉"), }, async ({ city }) => { // 这里仅做演示,实际项目可替换为真实天气 API 调用 const mockWeather = { city, temperature: 24, condition: "晴", humidity: 45, }; return { content: [ { type: "text", text: JSON.stringify(mockWeather, null, 2), }, ], }; } ); // 使用 stdio 作为传输层 const transport = new StdioServerTransport(); await server.connect(transport);回到项目根目录,安装 tsx 并启动服务器:
cd mcp-server npx tsx src/index.ts如果终端没有报错,说明 MCP Server 已经在标准输入输出上等待请求了。这个服务本身不会输出日志,因为 stdio 通道被协议占用。
5.3 在支持 MCP 的客户端中接入
接下来回到你的 AI 编程工具(如 Claude Desktop、Claude Code、Cursor 等)。不同客户端接入方式不同,但核心都包括两步:
- 在客户端配置中添加 MCP Server 地址;
- 让 AI 通过配置的 MCP Server 来调用工具。
以 Claude Desktop 的claude_desktop_config.json为例(路径因系统而异):
{ "mcpServers": { "weather-demo": { "command": "npx", "args": ["tsx", "src/index.ts"], "cwd": "/你本地的/mcp-server 目录" } } }配置完成后,AI 再遇到“帮我查一下武汉天气”这样的请求时,AI 会判断是否需要调用 MCP 工具,然后输入城市名,最终拿到 Server 返回的 JSON 数据。
5.4 MCP 与“普通函数调用”有什么区别
很多第一次接触 MCP 的读者会问:这不就是一个函数调用吗?
思路确实相似,但工程形态不同:
- 普通函数调用:AI 直接执行代码,代码必须存在于当前项目进程内。
- MCP 调用:AI 通过标准协议访问一个“独立运行的服务”,该服务可以属于其他团队,可以运行在远程,也可以暴露数据库、网盘、设计稿等资源。
所以 MCP 的价值主要体现在团队协作和生态复用上。A 团队开发好一个 MCP Server,B、C 团队只要在客户端配置协议地址,就能让 AI 复用这套能力,不需要关心内部实现。
5.5 用 MCP 增强 Rule 与 Skill 的能力边界
回到文章标题的完整链路,MCP 让 Skill 不再局限于“文本指导”,而能真正调用外部系统。
典型场景:
- 前端设计稿转代码:Skill 负责拆解“如何把设计稿转换成组件代码”的流程,MCP 负责从 Figma 拉取设计稿数据。
- 前端组件代码生成:Skill 负责定义组件输出规范,MCP 负责根据设计稿还原 UI 的布局参数。
类似地,在实际开发中,业务团队可以通过 MCP Server 把内部接口暴露给 AI,让 AI 在遵守安全规范的前提下做数据查询、代码生成、格式转换等工作。
6. 从提示词到 MCP:完整链路演示
为了进一步说明四种配置如何协同,我们模拟一个“用户模块 API 代码生成与检查”任务。
6.1 场景设定
项目背景:
- 后端使用 Fastify + Prisma。
- 前端使用 Vue 3。
- 本次任务:新增一个“查询用户列表”接口,并完成代码自查。
6.2 链路执行过程
- AI 启动后读取规则文件
.ai/rules.md,知道使用 Fastify + Prisma。 - 用户发出提示词:
新增一个分页查询用户列表的 API,要求包含模糊搜索用户名,并返回用户基础信息。 - AI 判断需要参考
code-reviewSkill 的规范,先整理文件修改清单,再生成代码。 - AI 需要确认数据库表是 user 表,通过 MCP Server 的
query_schema工具查看表结构。 - AI 根据 Schema 生成 Prisma 查询代码,并补充 DTO 校验。
- AI 运行测试并调用 code-review Skill 自查。
6.3 配置组合的收益
可以看到,单靠“提示词”无法保证 AI 知道项目规范,单靠 MCP 也无法让 AI 学会“业务模块怎么组织”。
只有四者配合,AI 才能从“会写代码”变成“按团队规范写代码”。
7. 常见问题与排查思路
7.1 Skill 没生效怎么办
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| AI 没有按 SKILL.md 执行 | SKILL.md 不在约定目录中 | 确认目录和文件名是否正确 |
| 触发器不准确 | 触发条件写得过于模糊 | 在提示词中显式要求使用 Skill |
| 加载后没执行脚本 | Skill 依赖的工具未安装 | 在 SKILL.md 中补充依赖检查步骤 |
7.2 MCP Server 连不上
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 提示无法连接 MCP Server | 路径或启动命令配置错误 | 手动在终端运行启动命令,观察报错 |
| MCP 工具列表为空 | Server 启动成功但没注册任何 tool/resource | 检查代码中是否调用了 server.tool() |
| 调用工具超时 | 外部 API 请求阻塞时间过长 | 在工具实现中加入超时和 try/catch |
| stdio 模式下日志混乱 | 把 console.log 输出到了 stdout | 改用 stderr 输出日志,stdout 专用于协议 |
7.3 规则文件和 Skill 产生矛盾怎么办
一个典型场景是:规则文件要求“所有新增接口都需要鉴权”,但某个 Skill 生成的代码没有加鉴权。此时应如何处理?
建议按以下顺序排查:
- 先确认规则文件优先级更高,提示 AI 以规则文件为准。
- 修改 Skill 的 SKILL.md,在步骤中加入“读取项目规则”的环节。
- 在规则文件中增加一条“如与本项目规则冲突,必须先询问用户再继续”。
实践下来,第三种处理方式最稳妥,因为 AI 工程领域没有“万能的绝对规则”。
8. 最佳实践与工程建议
8.1 提示词管理规范
不要把提示词长期贴在聊天记录里。建议沉淀到文档或工程配置中:
- 项目级通用约束 → 放入规则文件;
- 可复用的任务方法论 → 做成 Skill;
- 个性化临时任务 → 写对话提示词。
8.2 Skill 设计原则
- 单一职责:一个 Skill 只解决一类任务,不要写“万能 Skill”。
- 步骤明确:写清前置条件、执行流程、输出格式。
- 自检优先:让 Skill 先运行检查命令,再产出结果。
- 版本管理:Skill 是目录文件,可以纳入 Git 管理,形成团队知识库。
8.3 MCP Server 安全边界
- 最小授权:MCP Server 只暴露必要的数据操作,不要放一个“直连数据库”且允许任意 DDL 的工具。
- 传输安全:调用远程 MCP Server 时使用认证和 HTTPS。
- 敏感数据脱敏:返回给 AI 的数据如果包含个人信息或密钥,必须先过滤,避免 AI 在生成代码时把这些内容写进注释或日志。
- 沙箱隔离:在本地开发和测试阶段,优先使用测试数据库。
8.4 建立团队 AI 工程资产库
如果团队已经深度使用 AI 编程工具,建议建立以下资产库:
docs/ ├── prompts/ │ ├── 需求分析.md │ ├── 接口开发.md │ └── 缺陷修复.md ├── skills/ │ ├── code-review/ │ └── frontend-component/ └── mcp/ └── 内部服务文档.md长期下来,这套资产库会变成一个“组织级 AI 工作台”。每一次成功实践都可以沉淀为可复用的规则或 Skill,而不是停留在个人聊天窗口里。
9. 总结与下一步学习路线
到这里,我们已经把提示词、规则、Skill、MCP 这四类 AI 工程组件的定位、使用方法和协作方式完整梳理了一遍。
从实操角度,建议按以下顺序逐步深入:
- 先优化你自己的提示词写法,保证单次任务的可控性。
- 把项目中反复出现的约束写进规则文件,减少重复劳动。
- 把某类高频任务沉淀成 Skill,比如 Code Review、API 开发,让 AI 按固定步骤执行。
- 学习 MCP 协议,尝试用 SDK 开发自己的内部工具 Server,再把它们接入 Skill 的执行步骤。
最后再强调两点:
- AI 工程工具并不是某一款软件的专利。Claude Code、Codex CLI、Cursor 等工具都开始支持类似的机制,但底层思路一致。因此,理解概念和设计结构,比死记某个工具的配置格式更有价值。
- 不要一上来就追求搭建“复杂智能体系统”。从规则文件开始,到 Skill,再到 MCP,每一步都能切切实实提升开发效率。
如果这篇文章对你理解提示词、规则、Skill 和 MCP 有帮助,建议先收藏,等实际配置时再对照查阅。如果你在本地部署 MCP Server 的过程中遇到报错,欢迎在评论区带上你的环境信息交流,我会按常见问题类别持续更新排查方案。