Claude Code 基础分享III - MCP 和 Subagent
在上一篇内容中,我们叙述了Claude Code的上下文机制,包括了Slash Command、Skills和Context的使用方法。
本篇内容将深入探讨Claude Code的两个核心概念:MCP(Model Context Protocol) 和 Subagent。
- MCP是Agent和外部服务的通信协议,它定义了Agent如何与外部服务进行交互,如果对技术细节感兴趣,可以查阅官方文档。
- Subagent是Agent的子Agent,它可以在Agent中运行,可以访问Agent的上下文,可以与外部服务进行交互。总的而言Subagent就像一个由Agent委派任务的小兄弟,帮它完成一些任务。
虽然看起来Subagent和MCP都是全新的概念,但事实上它们实际的表现形式仍旧和上下文高度相关,它们都是为了扩展Agent的能力而设计的。
MCP
我们已经简述过MCP是什么,实际上如果仅仅是这么讲可能会比较抽象,让我们进入一些比较具体的场景:
场景1: 前端开发的小困境
如果你在web前端工作中,使用claude code完成编码工作,很快就会发现一些小困境,对于本场景是这样的:
- 你可以使用成型的ui组件快速的搭建起应用的界面,因为有项目原来的参考,且书写了很详细的代码规范,agent表现得很好。
- 很快,进入到集成阶段,在这个阶段,你的工作流变成了一遍一遍的从API FOX/Postman 总结接口的有效信息然后作为提示词输入给Agent
- 你不禁会想: 要是Agent能自己读取API FOX/Postman的文档,我们的工作流似乎会变得非常高效。
我们能处理这个场景吗?当然能,MCP就是为此而生的。它可以把远端或者本地的Service作为Agent的上下文,Agent可以读取这些上下文,从而完成一些任务。
我们用Apifox举例,如何将Apifox的文档作为Claude Code Agent的上下文,并让Agent在书写集成代码时参考这些文档。
- 首先我们需要找到这个服务是否有MCP Server
Apifox官方确实提供了Mcp,我们只要接入就可以了,文档在这里
- 接下来我们要在项目根目录放入一个
.mcp.json文件,用来告诉claude code 如何接入Apifox的mcp
{
"mcpServers": {
"API 文档": {
"command": "npx",
"args": [
"-y",
"apifox-mcp-server@latest",
"--project=<project-id>" 《=== 这里填入你的项目ID
],
"env": {
"APIFOX_ACCESS_TOKEN": "<access-token>" 《=== 这里填入你的access token (在账号设置-->API访问令牌中获取)
}
}
}
}
然后重新启动claude code。并输入
/mcp

看到这个API 文档显示connect时,即为链接成功。
你可以进一步点按回车,查看该MCP拥有那些能力,重新链接等

初次安装后你可以测试一下像这样:

Agent会向你询问,是否允许它访问API文档的MCP

随后经过一段思考它返回了它的想法
事实上像这样解决实际问题的MCP非常多,例如
- 链接到本地的数据库,帮助你进行数据查询和操作
- 通过外部服务访问获取框架最新的技术文档
- 连接到Gitlab/Github等代码仓库,帮助你进行Pr/Mr等操作
针对后端开发者,也可以关注一下如何书写MCP服务,下面两个SDK分别是php和golang的。 而我个人最喜欢的Laravel框架事实上已经有一套完整的集成方案由Laravel官方团队主导–Laravel/MCP。
如果你书写其他语言,比如NodeJs/Rust/Python等可以在这里找到对应的SDK 另外,我虽然没做调查,但是我觉得像nest/Django等框架应该也会像Laravel已经做好了集成Mcp的能力,可以到各自框架的社区寻找。
MCP 的运作方式
MCP 的运作方式大概就是这样
事实上,从你刚刚启动MCP,他就已经占用了你的一部分上下文窗口,且会一直占用下去。 这意味着如果你配置了太多的MCP,那么就会导致你会经常触发压缩,这有可能会导致模型的反馈不佳。 事实上在上下文窗口这一角度,SKILLS优势更大。
Subagent
Subagent的运作方式事实上更加简单。你可以理解成,进程又派生了一个子进程,去执行异步任务,等待它返回结果。
它的配置方式和SKILL差不多,也可以通过书写markdown文档来构造。
| 功能 | 用户位置 | 项目位置 | 本地位置 |
|---|---|---|---|
| Settings | ~/.claude/settings.json | .claude/settings.json | .claude/settings.local.json |
| Subagents | ~/.claude/agents/ | .claude/agents/ | — |
| MCP 服务器 | ~/.claude.json | .mcp.json | ~/.claude.json(每个项目) |
| Plugins | ~/.claude/settings.json | .claude/settings.json | .claude/settings.local.json |
| CLAUDE.md | ~/.claude/CLAUDE.md | CLAUDE.md 或 .claude/CLAUDE.md | CLAUDE.local.md |
你可以将SubAgent理解为一个带有额外人格文件的进程,它会独立于主进程运行,且可以独立于主进程的上下文窗口。
在Agent给它委派任务后,SubAgent会独立于主进程运行,且不占用任何主Agent的上下文窗口,通过这一机制,Anthropic宣城你可以实现理论上的(无限上下文窗口)
举个例子,你有一个十分复杂的项目等待探索,如果让主Agent浏览其项目文件,那么不仅浪费token,而且会占用大量的上下文窗口,甚至200K吃满都不够用。
如果你使用SubAgent,那么探索任务就可以交给负责探索的SubAgent,在子Agent浏览了很多文件后,将这些文件推理得到的结论返回给主Agent,从而节省了大量的上下文空间。
让我来举个例子:
代码审核这件事非常适合这个场景,这也是Anthropic官方提到底例子。
在这个场景中,SubAgent可以独立于主Agent运行,且不占用主Agent的上下文窗口,最重要的,由于没有之前的上下文,SubAgent可以更客观的审核代码。
我们把下面这个文件放在 .claude/agents/audit.md 中
---
name: code-reviewer
description: 审查代码质量与最佳实践
tools: Read, Glob, Grep
model: sonnet
---
你是一名代码审查员。当被调用时,分析代码并提供
关于质量、安全及最佳实践的具体、可执行反馈。
然后我们重启CC来加载它。并输入
/agents

通常来讲主Agent会自动调度这些子Agent进行任务处理,但是你也可以直接要求它,测试Subagent效果是这十分有效。
然后你就能观察到你的subagent开始工作了

最终,它的工作总结会交还给主Agent,并且由主Agent作为上下文再次推理给你结果:
