Skills、Agents和MCP服务器如何在Claude Code中协同工作
你可能遇到过这个困境: 你把整个代码库粘贴到AI聊天中,添加一个详细的提示,然后得到的是......毫无用处的回答。更糟糕的是,模型开始幻想出不存在的函数名,因为它在50,000个token之前就失去了追踪。
这就是上下文窗口问题。这也是为什么向LLM扔更多代码并不能让它变得更聪明。
Claude Code以不同的方式解决这个问题。不是通过拥有更大的上下文窗口(虽然这也有帮助),而是通过智能地利用它拥有的空间。它通过三样东西的协同工作来实现: skills、子代理和MCP服务器。
让我展示这些部分如何组合在一起。一旦你理解了这一点,你就会停止与AI对抗,开始与它协作。
上下文窗口问题
这是我花了一段时间才内化的东西: LLM实际上并不会像你预期的那样"记住"长对话的开头。上下文窗口更像是一个聚光灯而不是一个文件柜。随着你添加更多token,更早的内容得到的注意力就越少。粘贴100,000个token的代码,模型在读到你的问题时基本上已经在略读了。
这解释了很多令人沮丧的AI行为。模型一开始看起来很聪明,然后就变得困惑了。它忘记了你之前告诉它的事情。它幻想出它"读过"但显然没有记住的文件中的细节。
修复方法不是更大的上下文窗口。修复方法是不需要更大的上下文窗口。
Claude Code实际上是如何思考的
Claude Code是一个代理。这听起来很高级,但它只是意味着它可以规划、执行、观察结果并迭代。当你要求它"修复我项目中失败的测试"时,它不会试图一次理解你的整个代码库。相反,它按照聚焦的步骤工作:
- 读取项目结构以了解什么在哪里
- 运行测试以查看实际失败的是什么
- 查看具体失败的测试及其测试的代码
- 进行修复
- 再次运行测试
- 如果仍然有问题,尝试其他方法
每个步骤只使用它需要的上下文。代理维护着它所学到的工作摘要,而不是它看到的一切的原始日志。这就是Claude Code如何能在复杂的bug上迭代20次而不会耗尽上下文空间。
把它想象成你实际调试东西的方式。你不会把整个代码库都记在脑子里。你专注于一个区域,形成假设,测试它,然后调整。Claude Code的工作方式也是一样的。
子代理 - 真正的游戏规则改变者
这就是变得真正有趣的地方。Claude Code可以生成子代理。
子代理是一个独立的Claude实例,拥有自己干净的上下文窗口。你可以让Claude Code启动一个子代理,给它一个聚焦的任务,让它独立工作,然后获取它发现的摘要。子代理的完整上下文永远不会污染你的主对话。
这非常重要。不是让一个代理试图掌握所有东西:
你: "分析这个代码库的安全问题、性能问题和测试覆盖率"
主代理生成子代理:
├── 子代理1: 安全分析(自己的上下文,读取安全相关文件)
├── 子代理2: 性能审查(自己的上下文,聚焦热点路径)
└── 子代理3: 测试覆盖率(自己的上下文,检查测试文件)
每个子代理向主代理返回摘要
主代理将所有内容综合成一个回复
每个子代理可以读取数千行代码。但主代理只接收它们的压缩发现。你的主上下文保持干净,同时仍能获得跨多个领域的深入分析。
把它想象成委托给初级开发者。你不需要读他们审查的每一行代码。你需要他们的结论和他们发现的任何警示信号。子代理的工作方式完全相同。
如何实际使用子代理
你可以明确要求Claude Code生成子代理:
- "生成一个子代理来深入分析认证模块"
- "使用子代理来审查所有数据库查询的N+1问题"
- "让一个子代理浏览测试文件并报告覆盖率差距"
子代理获得自己的全新上下文,完成深度工作,然后返回摘要。你的主对话不会因为所有原始分析而膨胀。
这对大型代码库特别强大。Claude Code不会在分析到一半时失去追踪,你可以获得真正可扩展的聚焦分析。
Skills的作用
所以Claude Code可以分解任务、生成子代理并按聚焦步骤工作。但它如何知道怎样做好特定的事情?这就是skills发挥作用的地方。
Skills是Claude在处理特定类型任务之前读取的打包指令。当你要求Claude Code创建PowerPoint演示文稿时,它首先读取/mnt/skills/public/pptx/SKILL.md中的skill文件。这个文件包含最佳实践、常见陷阱和实际有效的确切代码模式。
一个skill通常包括:
- 一个带有详细指令的
SKILL.md文件 - 代码模板和示例
- 已知的限制和解决方法
- 输出格式规范
关键的洞察是skills按需加载。当你在调试Python时,Claude不会浪费上下文窗口空间在PowerPoint指令上。它在需要时加载相关skill,用于任务,然后继续前进。
这与工具不同。工具是Claude调用以获取数据的函数,如web_search或bash_tool。Skills是改变Claude处理问题方式的知识包。这个区别很重要,因为工具会在系统提示中消耗token(更多工具 = 更少的代码空间),而skills只在相关时加载。
| 方面 | 工具 | Skills |
|---|---|---|
| 工作方式 | 调用函数,获取结果 | 加载指令,修改行为 |
| Token成本 | 始终存在于上下文中 | 按需加载 |
| 最适合 | 离散操作(API调用,文件操作) | 复杂工作流(文档创建) |
子代理也可以加载skills。分析安全性的子代理可以加载安全特定的skills,而这些指令不会弄乱你的主对话。
迭代循环
你会不断看到的一种模式是迭代循环。Claude Code生成某些东西,检查它是否有效,然后修复问题直到正确为止。
1. 生成代码
2. 运行它(或lint它,或做类型检查)
3. 看看它是否工作
4. 如果不行,分析错误并重试
5. 重复直到通过
这就是为什么Claude Code可以修复单次提示会遗漏的bug。它不仅仅是生成代码然后祈祷。它测试自己的工作并回应真实的反馈。
当Claude Code创建一个React组件然后运行开发服务器检查错误时,它在使用这个循环。当它编写一个函数并运行测试来验证它是否工作时,也是同样的事情。生成和验证步骤协同工作。
这也解释了为什么Claude Code有时候比你预期的要花更长时间。它不是慢。它是彻底的。它在运行你的测试,检查类型错误,并迭代直到一切真正工作。
MCP服务器 - 连接到外部系统
到目前为止,我们讨论了Claude Code如何思考(代理步骤,子代理)以及它知道什么(skills)。但是连接到外部系统呢?这就是MCP发挥作用的地方。
Model Context Protocol是Claude Code与数据库、GitHub、文件系统、CI/CD管道以及几乎任何其他东西通信的方式。把MCP想象成AI的USB-C: 一个让任何兼容的AI系统连接到任何兼容服务的标准接口。
MCP服务器公开三种类型的功能:
工具 - Claude可以调用的函数,如查询数据库或创建拉取请求
资源 - Claude可以读取的数据源,如文件内容或数据库模式
提示 - 用于常见交互的可重用模板
对于Web开发,最有用的MCP服务器包括:
- 文件系统服务器 - 在你的项目中读写文件(为安全进行沙箱隔离)
- GitHub服务器 - 管理代码仓库、PR、问题和工作流
- 数据库服务器 - 通过自然语言查询PostgreSQL、MySQL、SQLite
以下是一个简单MCP服务器在TypeScript中的样子:
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
const server = new McpServer({
name: 'code-analyzer',
version: '1.0.0'
});
server.registerTool(
'analyze_complexity',
{
description: 'Analyze cyclomatic complexity of a file',
inputSchema: { filePath: { type: 'string' } }
},
async ({ filePath }) => {
const result = await analyzeFile(filePath);
return { content: [{ type: 'text', text: JSON.stringify(result) }] };
}
);
const transport = new StdioServerTransport();
await server.connect(transport);
MCP服务器的强大之处在于它们如何与子代理配合工作。子代理可以通过MCP查询数据库,分析数千行数据,只返回相关发现。原始数据永远不会接触你的主上下文。
综合运用
让我们通过一个真实的例子来说明。你问Claude Code: "审查这个PR并检查数据库迁移是否安全。"
以下是实际发生的事情:
- 主代理加载代码审查的相关skills
- 它生成一个子代理来深入分析PR变更
- 那个子代理调用GitHub MCP服务器来获取PR详情
- 另一个子代理通过MCP读取迁移文件并查询当前数据库模式
- 子代理返回聚焦摘要: "迁移添加索引,看起来安全"或"警告: 这会删除一个仍在引用的列"
- 主代理将子代理的发现综合成清晰的回复
注意繁重的工作发生在拥有自己上下文的子代理中。主代理编排和总结。你的对话保持干净,同时获得深入的分析。
为什么这对你的工作流程很重要
理解这个架构会改变你使用Claude Code的方式:
你停止与上下文窗口对抗。 一旦你意识到子代理单独处理深度分析,你就会停止试图把整个代码库粘贴到主对话中。让子代理做繁重的阅读工作。
你明确使用子代理处理大任务。 不是希望Claude Code自己想明白,而是告诉它: "使用子代理分析支付模块"或"为安全、性能和测试审查各生成子代理。"你在与架构配合而不是对抗。
你理解为什么某些任务比其他的效果更好。 可以委托给子代理的任务扩展性很好。需要在一个上下文中持续来回的任务更快地达到限制。
你信任迭代循环。 修复bug时,让Claude迭代。它通常会通过实际运行代码和观察失败来发现你没有预料到的问题。不要在第一次尝试后就打断它。
实用提示
对大任务明确要求子代理。 "生成一个子代理来审查认证系统"比希望Claude Code自己想出需要委托要好得多。
让Claude先读取skills。 如果你在创建文档或使用特定文件格式,Claude在开始之前先读取相关skill文件时表现更好。
为重复性集成连接MCP服务器。 不要把数据库输出或GitHub PR详情复制粘贴到你的提示中,连接相关的MCP服务器。Claude会精确地获取它需要的内容。
在构建自定义工具之前检查生态系统。 MCP生态系统已增长到超过5,000个社区服务器,涵盖Stripe、Cloudflare、CI系统和大多数你想集成的服务。可能已经有人构建了你需要的东西。
当它出错时提供反馈。 当Claude Code产生错误结果时,告诉它哪里出了问题。迭代循环也适用于你的反馈。
更大的图景
MCP最近被捐赠给了Linux基金会,OpenAI、Google和Microsoft作为支持成员加入。这表明该协议正在成为行业标准基础设施,而不仅仅是Anthropic的东西。
子代理(在独立上下文中并行工作)、skills(按需加载的领域专业知识)和MCP服务器(与外部系统的干净连接)的组合代表了现代AI编码助手实际工作的方式。这不是魔法。这是用良好的架构解决真实的约束。
子代理模式尤其值得深入理解。它是AI在大型代码库上崩溃和可扩展之间的区别。当你要求Claude Code分析某些大型内容时,它不是把所有东西塞进一个上下文然后祈祷。它委托给聚焦的子代理,每个都有干净的上下文,然后综合它们的发现。
理解这些部分帮助你与系统配合而不是对抗。你会获得更好的结果,遇到更少的阻碍,并知道什么时候信任AI,什么时候手动接管。


