一问题引入:为什么 Agent 需要 MCP
这支 KodeKloud 课程的切入点很直接:LLM 本身只能生成文本、图像、音频这类输出,它不会天然替你订机票、查数据库、读浏览器控制台、对接 SaaS API。真正能“行动”的,是围绕 LLM 的 Agent;而 Agent 要行动,就必须知道有哪些外部能力可用、每个能力怎么调用、调用结果如何回到上下文里。
视频用“Flight GPT”作类比:用户说想从一个城市飞到另一个城市,理想系统不只是回答一句建议,而是能查询多个航班服务、结合偏好比较价格和座位、再把候选结果交给 LLM 决策。难点不在“模型会不会理解机票”,而在“模型如何可靠发现并调用订票系统”。
视频的核心判断可以概括为:MCP 不是另一个聊天协议,而是给 Agent 使用外部能力的一套发现、描述和调用约定。
如果没有 MCP,每接一个第三方平台,开发者都要给 Agent 单独写 API 适配、参数说明、错误处理、返回值解释。接口命名可能是 /api/flights、flights/list 或 listFlights,语义相同但形状不同;Agent 很难凭空知道哪个接口能完成当前任务。MCP 的价值就是把这些外部能力包装成可发现的 tools、resources 和 prompts,让客户端按统一方式询问服务器:“你能做什么?”
二核心概念:MCP 的三层角色
视频反复强调 MCP 是 client-server 架构。Agent 通常不是直接实现所有协议细节,而是通过内置 MCP client 连接一个或多个 MCP server。Cursor、Windsurf、Claude Code、Claude Desktop 这类工具往往已经内置 client;你要做的是配置 server,或者为自己的 Agent 写一个 client。
1. MCP Host:用户实际操作的地方
Host 可以是 IDE、桌面应用、聊天工具或你自己写的 Agent 应用。用户在这里发起请求,Host 负责协调 LLM、上下文和一组 MCP client。对用户而言,Host 是“AI 助手”;对工程师而言,它是运行工具调用循环的外壳。
2. MCP Client:和某个 Server 对话的协议端
Client 通常一对一连接 server,负责初始化、能力发现、工具调用、资源读取和 prompt 获取。视频后半段会手写 client,就是为了说明:即便没有 IDE 内置支持,你也能把 MCP 接进自己的 Agent。
3. MCP Server:把外部系统变成可调用能力
Server 可以本地运行,也可以远程托管。它暴露的不应该只是“API 文档”,而是 Agent 能理解和调用的能力集合:工具代表动作,资源代表可读数据,prompts 代表可复用提示模板。一个航班 MCP server 可以把航班查询、机场列表、订票偏好说明都以这些结构交给 client。
三协议底座:JSON-RPC 与 Transport
课程中间有一段很重要:MCP 的消息格式基于 JSON-RPC。JSON-RPC 本身很轻,只规定 request、response、method、params、id 这些基础结构,不规定数据必须通过什么通道传。MCP 在此之上定义了 client 与 server 如何初始化、列出能力、调用工具和读取资源。
这就解释了为什么 MCP 同时支持本地 stdio 和网络 HTTP。如果 server 跟 IDE 在同一台机器上,标准输入输出最简单:不用开端口,不用处理网络层,只要两个本地进程能互相读写文本流即可。如果 server 面向组织内多个用户或由供应商托管,HTTP 更适合治理、认证、部署和共享。
| 传输方式 | 适用场景 | 优点 | 风险或注意点 |
|---|---|---|---|
| stdio | 本地 IDE、Claude Code、Cursor 调试本机 server | 轻量、隔离、启动快;不用端口和反向代理 | 生命周期通常由 Host 管理,日志和错误输出要区分清楚 |
| HTTP | 组织内部共享 server、供应商托管 server、跨机器访问 | 便于认证、监控、限流和集中部署 | 需要处理安全边界、网络可用性、版本兼容和权限隔离 |
| WebSocket / 其他通道 | 更复杂的实时或双向场景 | 可以保留长连接和实时反馈 | 不是入门优先项,协议和基础设施复杂度更高 |
把 MCP 理解成“HTTP API 的替代品”会偏;更准确地说,它把 API 能力整理成 Agent 能发现、选择和调用的协议面。
四先用现成 Server:从配置开始理解调用链
视频采用“先学开车,再学造车”的顺序:先配置一个已有 MCP server,再亲手实现 server 和 client。配置阶段的重点不是写代码,而是理解 IDE 如何启动 server。以 Cursor 或类似工具为例,项目里会有 mcp.json,里面声明 server 名称、启动命令、参数、工作目录和必要环境变量。
{
"mcpServers": {
"flight-booking": {
"command": "uv",
"args": ["run", "python", "server.py"],
"cwd": "/path/to/flight-booking"
}
}
}
配置保存后,Host 会以 stdio 模式启动 server。刷新 MCP server 列表时,IDE 能看到这个 server 是否在线,并展示其 tools 与 resources。课程里的验证方式是让 Agent 查询 LAX 到 JFK 的航班;当 Agent 请求使用 flight booking tool 并得到航班列表,就说明 client-server 链路已经跑通。
这里最值得注意的是权限确认:当 AI 想调用工具时,Host 通常会提示用户批准。这一层交互不是多余的 UI,而是 Agent 工程里的安全边界。MCP 让能力可发现,但不等于所有能力都应自动执行。
五亲手构建 Server:Tools、Resources、Prompts
构建 server 时,课程把能力拆成三类。很多入门者只记住“tool calling”,但 MCP 的信息面比 tool 更完整。一个好 server 不只提供动作,还应该提供可读上下文和可复用的任务模板。
Tools:让 Agent 做动作
Tools 是最像传统 API 的部分,例如查询航班、按条件筛选航班、提交预订请求。工具定义应包含清晰名称、描述和参数 schema。名称要从 Agent 视角表达能力,而不是暴露内部 REST 路径。与其叫 api_flights_v2_get,不如叫 search_flights。
Resources:让 Agent 读数据
Resources 更适合稳定、可枚举、只读的数据,例如机场列表、舱位规则、供应商说明。视频演示里,配置成功后可以在 IDE 里看到可用的机场文件资源。资源的好处是减少“把所有资料塞进 prompt”的冲动,让 Agent 在需要时读取。
Prompts:把常用任务包装成模板
Prompts 是可复用的交互模板,比如“帮我找从 A 到 B 的经济舱航班,并优先考虑少转机”。它们不是替代用户输入,而是给 Host 或 Agent 一个更稳定的任务入口。对企业场景而言,这有助于把业务流程从临时 prompt 变成可维护资产。
| MCP 能力 | 它解决什么问题 | 航班示例 | 工程建议 |
|---|---|---|---|
| Tool | 执行动作或查询动态结果 | 按出发地、目的地、日期搜索航班 | 参数 schema 要严格,错误信息要给模型可恢复线索 |
| Resource | 提供只读上下文 | 机场代码、城市映射、舱位政策 | 适合稳定资料;避免把大段文档默认塞进上下文 |
| Prompt | 复用任务模式 | 商务出行、低价优先、家庭出行三种搜索模板 | 适合沉淀业务流程和团队最佳实践 |
六亲手构建 Client:当你要写自己的 Agent
大多数开发者一开始会使用内置 MCP client 的工具,但视频最后仍然讲了自定义 client,因为这是理解 MCP 边界的关键:如果你在做自己的 Agent 平台,不能假设用户一定在 Cursor 或 Claude Desktop 里工作。你需要在自己的应用里完成初始化、能力发现、工具选择和响应回填。
一个最小 client 的生命周期大致是:启动或连接 server,发送初始化消息,读取 server capabilities,向 LLM 展示可用工具,在模型选择某个 tool 后发起调用,再把结果作为上下文交回模型。这里真正复杂的地方不在 JSON 序列化,而在“调用结果如何影响下一步推理”。
// 伪代码:MCP client 的最小循环
connect(server)
capabilities = initializeAndListCapabilities()
tools = capabilities.tools
modelResponse = llm.ask(userMessage, tools)
if modelResponse.toolCall:
result = mcp.callTool(modelResponse.toolCall.name, modelResponse.toolCall.args)
finalAnswer = llm.askWithToolResult(userMessage, result)
这个循环解释了为什么 MCP 与普通 SDK 不同。SDK 面向人写代码;MCP 面向 Agent 运行时。它需要让模型理解工具何时可用、参数怎么填、失败后如何修正、结果是否足以回答用户。
七决策矩阵:什么时候该上 MCP
MCP 很热,但不应变成“所有集成都要 MCP”的条件反射。视频的实战路径更接近务实工程:本地学习可以先用 stdio server;组织共享能力再考虑 HTTP;如果只是一个脚本内部调用某个 API,普通 SDK 或 CLI 可能更简单。
| 需求 | 优先方案 | 为什么 | 不适合的情况 |
|---|---|---|---|
| 单个脚本自动化任务 | 普通 SDK / CLI | 调用方确定、流程固定,MCP 会增加运行时复杂度 | 多个 Agent 都要动态发现和复用同一能力 |
| IDE 内本地调试工具 | 本地 MCP server + stdio | 启动轻、权限边界清楚,适合开发者机器 | 需要跨团队集中审计和限流 |
| 企业共享内部能力 | 远程 MCP server + HTTP | 便于统一认证、治理、版本管理和观测 | 接口仍处于频繁试验期,契约不稳定 |
| 供应商希望 AI 工具接入产品 | 官方 MCP server | 把 API 能力以 Agent 友好的方式发布,减少社区适配碎片 | 没有清晰权限模型或 API 本身不适合自动执行 |
八实现时最容易踩的坑
把内部 API 名称直接暴露给模型
模型选择工具时依赖名称和描述。如果工具名只是内部路由或历史包袱,Agent 会更容易误选。MCP server 应该把外部能力重新整理成语义清晰的动作,而不是把 REST API 原样转成 tool 列表。
资源和工具混在一起
机场代码表、产品目录、配置说明这类稳定数据,不一定要做成 tool。把它们放进 resources,Agent 可以按需读取,调用日志也更清楚。工具更适合产生动态结果或改变外部状态。
忽略权限与确认
课程中的工具调用会要求用户批准,这是值得保留的设计。查询类 tool 可以低风险自动化,写入类、购买类、发送类动作应有更强确认。MCP 让能力标准化,不代表安全审查可以省略。
只做 server,不测试 client 行为
server 列出 tools 并不等于 Agent 会正确使用。真正的验收应包括端到端 prompt:用户提出自然语言任务,Agent 发现能力、选对工具、填对参数、处理结果,并在失败时能重试或解释限制。
九时间戳目录
| 时间 | 章节 | 你应该关注什么 |
|---|---|---|
| 00:00 | 课程目标 | 从零解释 MCP,随后使用现成 server,再构建 server 与 client。 |
| 00:50 | 为什么只靠 LLM 不够 | Flight GPT 示例说明模型生成文本和 Agent 执行动作之间的差距。 |
| 03:30 | API 混乱与工具发现问题 | 同一业务能力可能有多种接口命名,Agent 需要统一能力描述。 |
| 08:13 | MCP client-server 架构 | Host、client、server 的职责分离,以及 IDE/Claude Code 这类工具的位置。 |
| 13:50 | JSON-RPC 与 MCP 能力 | 理解 request/response 格式,以及 resources、prompts、tools 的作用。 |
| 16:30 | 使用现有 MCP server | 配置 mcp.json,通过 stdio 启动本地 server,并在 IDE 中验证 tools/resources。 |
| 23:00 | 构建 flight booking server | 为航班场景添加工具、资源和 prompts,并让 Root Code/IDE 使用。 |
| 33:00 | 构建 MCP client | 当你要开发自己的 Agent 时,需要自己实现连接、能力发现和工具调用循环。 |
| 39:00 | 总结与练习 | 用 lab 环境复现 server/client,继续扩展 prompts 和业务能力。 |
十推荐阅读路径
如果你已经理解这支视频,可以继续沿两条线深入:一条是 MCP 协议和工具治理,另一条是 Agent 工程中“什么时候用工具、什么时候用子智能体”的架构判断。