4. 拓展能力 - Rules、Skills、MCP
我们已经实现了一个基本可用的 Agent 工具,但是在实际使用中,我们还会遇到如下问题
- 工具是硬编码的,如果我们需要连接 Github、线上数据源、Web Search,该怎么办?
- Agent 没有约束,经常如脱缰野马一般执行各种 bash 命令
- 规划是被动触发的,用户必须手动加 —plan 参数,如果 Agent 自己知道什么时候该规划就方便了
为了解决如上问题,我们可以引入 Rules、Skills、MCP、Plan-as-Tool 机制来解决。正如 Claude Code、OpenClaw 的 CLAUDE.MD、AGENTS.MD、.openclaw/skills和一系列 MCP 配置。
Rule,讲规矩的 Agent
Rule 是一个 markdown 文件,在初始化 Agent 的
4. 拓展能力 - Rules、Skills、MCP
时候,注入到它的 SystemPrompt 里。
比如一个 Claude code 的 CLAUDE.md 文件
## 项目概述
这是一个xxx项目
## 常用命令
### 安装依赖
```bash
npm install
```
### 开发模式运行
```bash
npm run dev
```
## 规则
- 禁止使用 `rm-rf /` 或类似危险命令
- 变量命名用小驼峰Rule 的本质
Rule 的本质是项目级别的 SystemPrompt 拓展。它的出现是为了解决,不同的项目、场景对 Agent 的要求不同。与其每次告诉 Agent 如何运行项目、使用哪种代码范式、不要犯哪些错误等,不如在项目中生成一个规则文件,塞到 SystemPrompt里,永久生效。
Skill - 一份可拓展的 Agent 行动指南
什么是 Skill ?
Skill 是一种声明式能力,可以是 Markdown、YAML 等文件。我们把这些文档交给 Agent 的上下文,Agent 读取这些 Markdown 后,在它自己的思考环节决定。
比如,我们让 Agent 构建当前项目,Agent 经过思考:“根据 deploy_skill.md 的建议,我下一步应该执行 npm run build。”
文档即能力
一个现代的 Skill 往往表现为一个 Markdown 文件。它通常包含两个关键维度:
- 语义描述
这是 Skill 的“说明书”。它用自然语言告诉 Agent:
- 这个技能叫什么? (例如:
web_search) - 它能解决什么问题? (例如:
当用户询问实时新闻时使用此工具) - 调用它需要什么参数? (例如:
query: 搜索关键词)
- 这个技能叫什么? (例如:
- 操作流(SOP)
这是 Skill 的“具体操作”,通常隐藏在 Markdown 的代码块中。
- 实现方式:可以是一系列推荐的 Bash 命令组合、 JavaScript、Python 代码,也可以是一个 API 请求 路径。
- 执行过程:当 Agent 决定使用某个 Skill 时,它会按照说明书提取参数,然后运行代码块中的逻辑,获取结果并反馈给大脑。
- 约束条件:哪些命令是禁止的。
Skill 的简单实现
通常来说,Agent 启动时会执行一个 “动态上下文拼接”。它会根据当前的 Task,把最相关的几个 Skill Markdown 直接拼接到当前的会话上下文中。
简单来说,我们可以在skill 文件夹中,读取所有的 Skill 文件,然后将 Skill 注入到 SystemPrompt 里。
import fs from "fs";
import path from "path";
const SKILL_DIR = path.join(__dirname, "..", "/.agent/skills");
/**
* 确保目录存在
*/
function ensureSkillDir(): void {
if (!fs.existsSync(SKILL_DIR)) {
fs.mkdirSync(SKILL_DIR, { recursive: true });
}
}
export function loadSkills(): string {
ensureSkillDir();
const files = fs.readdirSync(SKILL_DIR);
const mdFiles = files.filter((file) => file.endsWith(".md"));
if (mdFiles.length === 0) {
return "";
}
// 按文件名排序,确保加载顺序一致
mdFiles.sort();
const contents = mdFiles.map((file) => {
const filePath = path.join(SKILL_DIR, file);
return fs.readFileSync(filePath, "utf-8");
});
return `\n# Skill\n${contents.join("\n\n")}\n\n`;
}
MCP - 拓展 Agent 的可用工具
什么是 MCP?
在 1. Agent 核心实现 - Agent Loop 中,我们给 Agent 定义了读、写等核心工具,这些工具都硬编码在我们的代码里。如果我们的用户向要拓展工具呢?或者不同的项目,有不同的工具要求?这就要求我们的工具应该具有拓展能力,像插件一样,能够在核心工具之外不断拓展。
MCP (Model Context Protocol)是 Anthropic 提出的开放标准,定义了 LLM 和外部工具之间的通信协议。MCP 是为了打破信息孤岛而生的通用标准。
比如,你想让 Agent 读取你的 Google Drive 或是访问本地的 Postgres 数据库。你不需要在 Markdown 里教它怎么用 SQL 驱动,你只需要连接一个 Postgres MCP Server。
MCP 的实现
这一行就是整个 MCP 集成的核心。通过 MCP 加载的工具和基础工具有完全一致的 JSON Schema 格式。直接传递给 LLM,LLM 完全不知道这个工具是内置的还是 MCP 提供的。对 LLM 来说,工具就是工具。
const allTools = [...coreTools,...mcpTools]MCP 和 Skill 的区别
| 维度 | Skill (技能) | MCP (Model Context Protocol) |
|---|---|---|
| 定义 | 标准作业程序 (SOP)。它是一套经验、逻辑或复杂的命令组合。 | 连接协议。它是大模型与数据源/工具之间的“通用插座”。 |
| 表现形式 | 通常是你提到的 Markdown,包含提示词、示例和 Bash 命令。 | 结构化的 JSON-RPC 接口。有严格的服务器-客户端实现。 |
| 存在意义 | 解决“怎么做”的问题(思维模型)。 | 解决“怎么连”的问题(基础设施)。 |
| 执行逻辑 | 模仿与推理。Agent 读完 Markdown 后决定如何操作 Shell。 | 调用与响应。Agent 发出特定请求,MCP Server 返回特定数据。 |