用了半年Claude Code,我拆开了它的三层架构和工具调用循环的7步轨迹——然后自己写了一个MCP Server

46 阅读8分钟

Claude Code 深度拆解:Agent 循环与 MCP 扩展

Claude Code 不是一个"会聊天的终端"——是 Agent Loop(思考→决策→调工具→执行→观察→再思考)的工程实现。这篇文章从代码层面拆解它的三层架构:Agent Loop 核心层(system prompt 驱动的 7 步工具调用轨迹)、31 个内置工具层(文件操作/搜索/执行/Web/代码智能五大类)、MCP 扩展层(40 行代码写一个图片生成 Server,Claude Code 直接调用)。读完你不只会用 CC,还能自己扩展它。

阅读约 18 分钟 | 系列第 8/14 篇


⚠️ 时效性提示:本文基于 2026 年 7 月的技术状态撰写。大模型版本迭代迅速(通常 3-6 个月一次大版本更新),文中涉及的模型名称、API 端点及性能基准数据请以各厂商最新公告为准。建议重点关注文章中的架构原理与设计决策——这些内容具有更长的时效性。

一、模型运行时、Agent 与模型的关系

这是初学者最容易混淆的三层概念。

三层架构

┌─────────────────────────────────────────────────────────┐
│                     Agent(智能体)                       │
│   Claude Code / Cursor / Copilot / 自建 Agent             │
│   "大脑的额叶"——决策层                                    │
│   职责:接收任务 → 拆解步骤 → 决定调什么工具 → 分析结果    │
├─────────────────────────────────────────────────────────┤
│                 模型运行时(Model Runtime)               │
│   Ollama / vLLM / llama.cpp / PyTorch / diffusers        │
│   "大脑的神经元"——执行层                                   │
│   职责:接收文本请求 → 运行模型推理 → 返回推理结果         │
├─────────────────────────────────────────────────────────┤
│                    模型(Model)                          │
│   Qwen / DeepSeek / FLUX / SD 3.5 ...                   │
│   "大脑存储的知识"——知识层                                 │
│   职责:权重文件(.gguf / .safetensors),网络结构定义       │
└─────────────────────────────────────────────────────────┘

关键认知

Ollama 不是 Agent。
Ollama 是模型运行时——它只负责"收文本 → 模型计算 → 返回文本"。

Claude Code 是 Agent。
它调用的模型运行时可以是 DeepSeek 远程 API、可以是 Ollama 本地服务、
可以是 OpenAI API——Agent 不关心运行时是谁,只关心它能收到文本回复。

模型是纯粹的数据 + 结构定义,不包含任何执行逻辑。
没有运行时加载,模型文件只是一堆字节。

常见 Agent 形态

Agent底层模型(可换)工具调用适用场景
Claude CodeClaude / DeepSeek(可换)Bash, Read, Edit, MCP命令行编程助手
CursorGPT / Claude / 自定义代码编辑、终端、LSPIDE 内编程助手
GitHub CopilotGPT / Claude代码补全、Chat、AgentIDE 内编程助手
自建 Agent任意(OpenAI 兼容即可)自定义工具集特定业务场景

二、Claude Code 深度拆解

2.1 启动时做了什么

用户执行 claude
    │
    ▼
┌─────────────────────────────────────────┐
│ 1. 读取配置                              │
│    - settings.json(用户权限、MCP 服务器) │
│    - CLAUDE.md(项目指令)               │
│    - .claude/ 目录(Memory、Corrections) │
│    - 环境变量(API key、代理配置等)       │
├─────────────────────────────────────────┤
│ 2. 建立与模型的连接                       │
│    - 根据配置 base_url + api_key          │
│    - 验证连接可用性                        │
├─────────────────────────────────────────┤
│ 3. 加载 MCP 服务器                       │
│    - 启动配置中列出的 MCP 子进程           │
│    - 获取各 MCP 提供的工具列表             │
│    - 将工具定义注册到 Agent 的工具集       │
├─────────────────────────────────────────┤
│ 4. 构建系统提示词(System Prompt)         │
│    - 注入项目指令(CLAUDE.md 内容)        │
│    - 注入 Memory(当前项目的记忆文件)      │
│    - 注入可用工具列表及使用说明            │
│    - 注入行为约束规则                     │
├─────────────────────────────────────────┤
│ 5. 等待用户输入                           │
└─────────────────────────────────────────┘

2.2 每次对话做了什么

用户输入消息
    
    
┌─────────────────────────────────────────┐
 1. 组装请求体                            
    system:    系统提示词(含工具定义)      
    messages:  对话历史(经过上下文管理)    
    tools:     可用工具列表(JSON Schema)  
├─────────────────────────────────────────┤
 2. 发送 POST 请求至模型 API               
    POST /v1/chat/completions             
    Body: { model, messages, tools, ... } 
├─────────────────────────────────────────┤
 3. 接收模型响应                           
    情况 A:返回纯文本  展示给用户,结束    
    情况 B:返回工具调用  进入工具循环      
└─────────────────────────────────────────┘

2.3 工具调用循环(Agent 的核心机制)

模型回复:"我需要执行 read_file 来查看代码"
    │
    ▼
┌──────────────────────────────────────────────┐
│  模型返回结构化工具调用:                       │
│  {                                           │
│    "tool_calls": [{                          │
│      "function": {                           │
│        "name": "read_file",                   │
│        "arguments": {"file_path": "/a/b.py"}  │
│      }                                       │
│    }]                                        │
│  }                                           │
├──────────────────────────────────────────────┤
│  1. Claude Code 收到这个 JSON                 │
│  2. 检查权限:该工具是否需要用户批准?          │
│  3. 执行工具(如:读取文件)                   │
│  4. 将工具执行结果作为新消息追加到对话历史:      │
│     {"role": "tool", "content": "文件内容..."} │
│  5. 再次调用模型(带上工具结果)               │
│  6. 模型基于结果继续推理 → 可能再调工具或回复文字 │
│  7. 循环直到模型回复纯文本(不再调工具)         │
└──────────────────────────────────────────────┘

一个典型的对话轨迹

[user] "帮我修复 test.py 中的 bug"
    ↓
[model] "我先看看 test.py 的内容" → tool_call: Read("test.py")
    ↓
[tool] "文件内容是:def foo():\n    return 1/0"
    ↓
[model] "找到了,是除零错误" → tool_call: Edit("test.py", ...)
    ↓
[tool] "文件已修改"
    ↓
[model] "已修复。将 `1/0` 改为 `1/1`,现在运行测试验证一下?"
    ↓
[model] → tool_call: Bash("python -m pytest test.py")
    ↓
[tool] "测试通过"
    ↓
[model] "测试全部通过,修复完成。"

2.4 上下文管理

每次调用模型都需要携带对话历史。当对话历史超出模型的上下文窗口时:

机制作用
上下文压缩(Compaction)将早前的内容压缩为摘要,释放上下文空间
Memory 系统将关键事实持久化到磁盘,跨会话保留
CLAUDE.md 注入项目指令始终在 System Prompt 中,不随对话增长而丢失
子 Agent 隔离子 Agent 有独立上下文,完成后只返回结果

三、MCP 协议 — 扩展能力的标准接口

3.1 MCP 的工作原理

┌──────────────────┐     MCP 协议      ┌──────────────────┐
│   Claude Code     │ ←─────────────→ │   MCP Server      │
│   (MCP Client)   │   JSON-RPC       │   (独立进程)       │
│                   │   over stdio/SSE │                   │
│                   │                  │                   │
│ "帮我搜索数据库"   │  ① 列出可用工具    │  PostgreSQL MCP    │
│                   │  ② 调用工具       │  → 执行 SQL 查询   │
│                   │  ③ 返回结果       │                   │
└──────────────────┘                  └──────────────────┘

MCP 的两种通信模式

stdio 模式(标准输入输出):               SSE 模式(Server-Sent Events):
                                         
Claude Code ──启动子进程──→ MCP Server    Claude Code ──HTTP 长连接──→ MCP Server
     └── JSON 通过 stdin/stdout ──┘            └── JSON 通过 HTTP ────────┘
适合:本地工具、单用户                  适合:远程工具、多用户共享

3.2 MCP 配置示例

{
  "mcpServers": {
    "chrome-devtools": {
      "command": "npx",
      "args": ["-y", "@anthropic/mcp-server-chrome-devtools"]
    },
    "context7": {
      "command": "npx",
      "args": ["-y", "@context7/mcp-server"]
    },
    "custom-image-gen": {
      "command": "python",
      "args": ["D:/tools/image_mcp_server.py"]
    }
  }
}

四、如何扩展 Claude Code 的能力

4.1 更换对话模型

Claude Code 通过 base_url + api_key 连接对话模型。只要目标模型支持 OpenAI 兼容的 /v1/chat/completions 端点且支持 Tool Calling,即可替换:

export ANTHROPIC_BASE_URL="https://api.deepseek.com"
export ANTHROPIC_API_KEY="sk-xxxxxxxx"

注意:不是所有模型都支持 Tool Calling。如果模型不支持工具调用,Agent 的核心循环就无法运作——模型只能回复文字,不会触发工具执行。

4.2 通过 MCP 接入图片生成能力

Claude Code 本身是文本 Agent,不能直接生成图片。但通过 MCP,可以接入图片生成能力:

# image_gen_mcp_server.py — 一个最简单的图片生成 MCP Server
import json, sys
from openai import OpenAI

client = OpenAI(base_url="https://api.siliconflow.cn/v1", api_key="sk-xxx")

def handle_request(request):
    # 本示例使用同步 IO 简化演示,生产环境建议使用 asyncio 处理并发请求
    req = json.loads(request)
    method = req.get("method")

    if method == "tools/list":
        return json.dumps({
            "tools": [{
                "name": "generate_image",
                "description": "根据文字描述生成图片,返回图片URL",
                "inputSchema": {
                    "type": "object",
                    "properties": {
                        "prompt": {"type": "string", "description": "图片描述"}
                    },
                    "required": ["prompt"]
                }
            }]
        })

    elif method == "tools/call":
        args = req["params"]["arguments"]
        resp = client.images.generate(
            model="black-forest-labs/FLUX.1-dev",
            prompt=args["prompt"], size="1024x1024"
        )
        return json.dumps({
            "content": [{"type": "text", "text": f"图片已生成:{resp.data[0].url}"}]
        })

for line in sys.stdin:
    response = handle_request(line)
    sys.stdout.write(response + "\n")
    sys.stdout.flush()

配置后,在 Claude Code 中说出"帮我生成一张猫的图片",Agent 会:

  1. 判断需要调用 generate_image 工具
  2. 提取 Prompt = "猫的图片"
  3. 执行 MCP 工具 → 调 SiliconFlow API → 返回图片 URL
  4. 将 URL 展示给你

4.3 通过 MCP 接入的能力类型

MCP Server 类型赋予的能力
文件系统浏览/编辑本地文件
数据库 (PostgreSQL/MySQL/SQLite)执行 SQL 查询、查看表结构
浏览器 (Playwright/Puppeteer)打开网页、截图、点击、填表
搜索引擎 (Brave/Google)网络搜索
代码仓库 (GitHub/GitLab)创建 Issue、提交 PR、搜索代码
知识库 (Context7)查询最新框架文档
图片生成远程调图片 API
自定义业务任何能封装成 API 的企业内部系统

核心要点回顾

  1. **三层架构(模型→运行时→Agent)**是理解"谁负责什么"的基础框架——Ollama 是运行时不是 Agent
  2. Agent 的核心 = 工具调用循环——模型返回 JSON 工具调用 → 执行 → 结果回传 → 再次推理 → 循环直到返回纯文本
  3. MCP 是 Agent 能力的标准扩展接口——stdio 适合本地工具,SSE 适合远程服务
  4. 只要模型支持 Tool Calling + OpenAI 兼容端点,就可以替换 Claude Code 的底层模型
  5. 通过 MCP,文本 Agent 可以接入图片生成、数据库查询、浏览器操作等任意能力——突破了"文本模型只能聊天"的限制

系列回顾

本文是《AI 应用开发完全指南》系列的最后一篇。8 篇系列覆盖:

1 篇:AI 应用开发全景 — LLM 原理 + 模型选型 + MCP/Skills/Hooks
第 2 篇:RAG 从入门到工程落地 — 切分/Embedding/评估/CRAG/代码走读
第 3 篇:Agent 的本质 — ReAct 循环 + FC vs MCP + 代码走读
第 4 篇:AI 工程化实践 — 安全/成本/可观测性/部署/PrismAI 全景
第 5 篇:AI 图片生成完全指南 — 扩散模型 + DiT 架构
第 6 篇:精确控制与视频生成 — LoRA/ControlNet/IP-Adapter + 视频
第 7 篇:大模型部署实战 — 远程 API + 本地部署 + KV Cache
第 8 篇:Claude Code 深度拆解(本文)— Agent 循环 + MCP 扩展
深度 1:RAG 核心组件深度剖析 — 嵌入模型与向量数据库
深度 2:Agent 工具体系与选型指南

Claude Code 的三层架构——Agent Loop 做决策、内置工具做执行、MCP 做扩展——每一层都是可复用的设计模式。收藏这篇,下次面试被问"你用过什么 AI 开发工具"时,不只说"用过",还能画出它的架构图和工具调用循环的 7 步轨迹。

上一篇:《大模型部署实战》 | 下一篇:《AI工程化实践与PrismAI全景》(文本AI线收束篇) 系列合集掘金AI合集