CS146S Week 2: The Anatomy of Coding Agents (MCP)
| 字段 | 内容 |
|---|---|
| 作者/整理 | 基于 Mihail Eric 授课内容整理 |
| 来源 | Stanford CS146S |
| 日期 | 2025年10月 |
从零构建 Coding Agent
什么是 Coding Agent
Coding Agent 是一种能够自主执行编程任务的 AI 系统。其核心组件包括:
- System Prompt:定义 Agent 的行为和指令
- User Prompt:用户的自定义请求
- Assistant Prompt:LLM 的响应
- Tool Set:Agent 可调用的工具集合
Coding Agent 的核心循环
一个 Coding Agent 的基本工作流程极其简单:
- 从终端读取用户输入,持续追加到对话历史
- 告知 LLM 可用的工具(Read_file、List_dir、Edit_file 等)
- LLM 在适当时机请求调用工具
- 离线执行工具调用并返回结果
- 重复上述过程直到任务完成
“秘密武器”:Claude Code 的设计哲学
深入分析 Claude Code 的底层设计,可以发现几个关键的工程决策:
- 前置 context 注入:使用小而精准的 prompt 进行 context 前置加载
- System reminders 无处不在:在 system prompt、user prompt、tool calls、tool results 中都插入
<system-reminder>标签,防止模型在长对话中偏离目标 - Command prefix extraction:从用户输入中提取命令前缀,实现快捷操作
- Subagent 派生:生成子 Agent 处理特定子任务,避免单个 context 过载
Context Drift 问题
在长对话中,LLM 容易“忘记”早期的指令和约束——这被称为 context drift。Claude Code 通过在对话的各个环节反复插入 system reminders 来对抗这一问题。这是一个经过工程验证的关键技巧。
本章小结
构建一个基础 Coding Agent 的技术门槛其实很低——核心就是 LLM + tool calling 的循环。但要构建一个可靠的 Coding Agent,需要大量的工程细节:context 管理、drift 防护、子任务分解等。
Model Context Protocol (MCP)
为什么需要 MCP
LLM 拥有广泛但静态的世界知识——只有在重训时才会更新。要构建真正自主的系统,需要可靠的方式向 LLM 注入动态数据(天气、股价、最新 API 文档等)。
RAG 和 tool calling 是目前最好的答案。但问题在于:
M \(×\) N 连接器问题
假设有 \(M\) 个 LLM 应用和 \(N\) 个第三方工具/API。在 MCP 之前,每个应用需要为每个工具编写独立的集成代码——包括认证、错误处理、速率限制等。这导致了 \(M \times N\) 个连接器的维护负担。
MCP 是什么
MCP(Model Context Protocol)是 Anthropic 于 2024 年 11 月推出的开放协议,为 LLM 提供了一种标准化的工具暴露格式。
MCP 的核心价值
MCP 将工具集成从 \(M \times N\) 降低到 \(M + N\):
- 不需要为每个工具重新实现认证、错误处理、速率限制
- 使用 JSON-RPC 强制执行一致的输出格式
- 从 Language Server Protocol (LSP) 扩展而来,但支持主动的(proactive)agentic workflow,而非 LSP 的纯反应式模式
MCP 架构详解
核心术语
- Host:宿主应用(如 Cursor、Claude Desktop)
- MCP Client:嵌入在 Host 中的库(为每个 Server 维护有状态的 session)
- MCP Server:轻量级的工具包装器(wrapper)
- Tool:可调用的函数(数据源、API 等)
工作流程
- Client 调用
tools/list向 MCP Server 查询:“你能做什么?” - Server 返回 JSON 描述每个工具(名称、摘要、JSON Schema)
- Host 将这些 JSON 注入模型的 context
- 用户 prompt 触发模型,模型输出结构化的 tool call
- MCP Server 执行调用,对话继续
传输层
MCP 提供两种传输机制:
- stdio:标准输入/输出,适用于本地进程通信
- SSE(Server-Sent Events):适用于远程服务通信
MCP 的局限性
当前 Agent 处理多工具的能力有限
- Agent 在面对大量工具时表现不佳——工具描述会快速消耗 context window
- API 设计需要面向 AI 原生(AI-native),而非沿用传统的刚性 API 设计
- 复杂的 API 参数和嵌套结构会显著降低工具调用的准确率
本章小结
MCP 是 AI 编程工具生态的重要基础设施,通过标准化的协议解决了 LLM 与外部工具集成的 \(M \times N\) 问题。理解 MCP 的架构(Host \(\rightarrow\) Client \(\rightarrow\) Server \(\rightarrow\) Tool)和通信流程是构建和使用 AI 编程工具的关键。
从协议到产品:MCP 为什么会成为分水岭
它解决的不只是连接问题,而是生态协作问题
Week 2 对 MCP 的介绍,很容易被误解为 “又一个 tool calling 协议”。但课程想强调的更深一层含义是:MCP 真正统一的是工具生态的协作边界,而不只是调用语法。 在没有 MCP 的世界里,每个 Agent 产品都要自己决定认证方式、工具描述格式、错误返回结构和会话状态管理;这使得工具作者和 Agent 产品方都不断重复造轮子。
MCP 之所以重要,是因为它把工具从项目私有实现变成了生态公共接口
- 对工具提供方来说,写一次 MCP Server,就能被多个 Host/IDE/Agent 复用;
- 对 Agent 产品来说,不必为每个工具单独适配 schema、错误格式与权限模型;
- 对用户来说,工具切换的成本显著下降,工作流可以跨产品迁移。
这和历史上的 LSP 很像。LSP 并没有发明 “补全” 或 “跳转定义”,但它统一了编辑器与语言服务之间的接口,于是整个生态的创新速度被抬高。MCP 对 Agent 工具生态扮演的是类似角色,只不过作用对象从 “编辑器能力” 变成了 “模型可调用的外部能力”。
真正困难的部分:协议统一后,设计责任才开始出现
协议统一并不意味着 Agent 就会自然用好工具。相反,接口一旦标准化,大家更容易看到另一个问题:很多现有 API 根本不是为模型使用而设计的。
AI-native API 设计不能简单照搬给人类开发者的 API
- 参数过多、嵌套太深、状态切换太隐式,会显著降低模型调用成功率;
- 返回结果如果缺少简洁摘要和明确错误原因,模型很难做后续决策;
- 工具如果不暴露权限边界和副作用说明,Agent 很容易做出高风险调用。
| 设计维度 | 传统 API 常见做法 | AI-native 工具更优做法 |
|---|---|---|
| 参数设计 | 参数多、结构深、默认值隐式 | 参数尽量扁平,必要信息显式给出 |
| 错误处理 | 面向工程师的长错误栈 | 提供可供模型恢复的结构化错误信息 |
| 副作用说明 | 依赖文档阅读理解 | 在工具 schema 中直接说明风险与影响范围 |
| 返回结果 | 原始 JSON/对象堆叠 | 同时提供摘要字段和机器可解析字段 |
本章小结
MCP 的意义不在于又多了一个协议,而在于它为 Agent 工具生态提供了公共接口。真正的下一步挑战,是让工具本身也从 “给人类开发者看的 API” 演化为 “给模型稳定调用的 AI-native API”。
实践视角:一个可维护 Coding Agent 的三层检查表
最容易被忽略的是会话和上下文治理
Week 2 前半部分用最小 Coding Agent 展示了 tool loop 的核心结构,后半部分再引入 MCP。把两部分放在一起看,会发现一个更实际的工程问题:一个能长期稳定工作的 Coding Agent,关键不只在于会不会调用工具,而在于怎么管理上下文、状态和失败恢复。
三层检查表
- 模型层:系统提示词是否清楚说明任务、边界和工具使用原则;
- 工具层:工具 schema 是否稳定、返回结果是否适合下一步推理;
- 会话层:上下文是否会膨胀、是否有 reminder、失败后如何恢复。
这也是为什么课程里会强调 context 前置加载、system reminders 和 subagent 分流。这些看似 “产品技巧” 的东西,实际上是在弥补当前模型在长期任务上的脆弱性。Agent 不是只要会调用工具就够了,它还必须能在长时间、多步骤、多文件的工作中保持目标一致性。
本章小结
如果把 Week 2 学到的内容真正带回工程实践,一个可靠的 Coding Agent 至少要同时过三道关:模型是否知道该做什么、工具是否适合模型调用、会话是否有足够的上下文治理能力。这三者缺一不可。
什么时候不该把问题简单归结为 “上一个 MCP Server”
Week 2 还有一个很值得保留的工程判断:不是所有集成问题都应该第一时间被包装成一个新的 MCP Server。协议标准化会降低接入成本,但它不会自动解决权限设计、任务切分和观测性问题。
MCP 不是系统设计的替代品
- 如果底层 API 本身不稳定,MCP 只会把不稳定更标准地暴露出来;
- 如果任务边界不清晰,模型即便能调用工具,也可能在错误的层面上自动化;
- 如果缺少日志、重试和回滚机制,协议统一反而可能放大错误传播范围。
这也是为什么课程一边讲协议,一边仍然强调 agent loop、context management 与产品约束。真正可靠的 Coding Agent,从来不是 “工具越多越好”,而是 “能在明确边界内稳定完成任务”。
总结与延伸
Week 2 深入了 Coding Agent 的技术内核。从手动构建一个最小化的 Coding Agent,到理解 MCP 协议如何将工具集成标准化,课程展示了 AI 编程工具“魔法”背后的工程实现。
总结表
| 主题 | Week 2 的核心结论 | 工程含义 |
|---|---|---|
| 最小 Agent Loop | LLM + tool call + observation 已能形成基本闭环 | 原理简单,但上下文与错误处理决定可用性 |
| Claude Code 经验 | reminder、context 预载、subagent 分流都很关键 | 产品设计直接影响模型稳定性 |
| MCP 协议 | 工具集成从 \(M × N\) 下降到 \(M + N\) | 生态创新可以从私有集成走向公共接口 |
| AI-native Tools | 协议统一后,工具设计本身成为瓶颈 | API 需要更扁平、可恢复、可解释 |
关键要点
- Coding Agent = LLM + Tool Calling 循环,核心简单但工程细节决定质量
- Claude Code 的关键设计:context 前置加载、system reminders 防 drift、subagent 分流
- MCP 将 \(M \times N\) 集成降为 \(M + N\),使用 JSON-RPC 标准化工具描述
- MCP 架构:Host \(\rightarrow\) Client \(\rightarrow\) Server \(\rightarrow\) Tool
- 当前局限:Agent 处理多工具能力有限,API 需要 AI-native 设计
拓展阅读
- MCP 官方文档:https://modelcontextprotocol.io
- Anthropic MCP 发布博客:https://www.anthropic.com/news/model-context-protocol
- JSON-RPC 2.0 规范:https://www.jsonrpc.org/specification
- Language Server Protocol:https://microsoft.github.io/language-server-protocol/