博客 • AI / Agent

Claude Code 爲什麼越來越像真正的 AI Agent?從 Tool Use、MCP、Session、Permission 到 JSON Workflow 全面解析

Claude Code 像 Agent,是因爲一次會話把三份 JSON 綁在一起:可恢復的對話、每次 Tool Use 都要過的權限,以及啓動時讀入的 MCP。恢復用 --resume,權限寫在 settings.json,工具來自 .mcp.json。缺任何一份,恢復出來的都不是同一次工作。

工具循環本身已經寫在 Coding Agent 如何工作。各家 Harness 的差別寫在 Harness 大戰。本篇只拆 Claude Code:會話恢復什麼、權限模式何時變、MCP 何時重新讀,以及你該自己留下哪份工作流 JSON。

本文將介紹:

先記住這一點:恢復會話不等於恢復啓動參數。對話和部分權限模式會回來,--mcp-config 不會。下面按「會話 → 權限 → MCP → 你的工作流 JSON」拆開。

會話恢復什麼,不恢復什麼

會話是綁在項目目錄上的對話。官方說明見 管理會話。記錄持續寫到本機,所以退出之後還能回來。

入口 恢復什麼 權限模式
claude --continue 當前目錄最近一次交互會話的完整對話,含工具調用和結果 終端裏不帶 -p 時,按官方表恢復;bypassPermissions 和 plan 不會原樣回來
claude --resume <name> 按名字直接恢復那一次會話 名字唯一時直接進入;重名則打開選擇器,選擇器不恢復當時的權限模式
claude -p --resume 非交互恢復,適合腳本 按一次新的 claude -p 來決定模式。會話結束在 plan,且滿足官方四個條件時,纔回到 plan

恢復時還會帶上當時的模型,以及仍有效的目標和未過期的計劃任務。後臺 Bash 不會回來。

轉錄默認是 JSONL,路徑在 ~/.claude/projects/ 下面、按工作目錄轉成的文件夾裏。官方寫明格式會變,不要把它當成你的穩定契約。你要穩定的字段,自己另寫一份 JSON。

權限模式跟着會話走

模式不是寫在提示詞裏的。會話中可以用 Shift+Tab 在 default、acceptEdits、plan 之間切。啓動時用 --permission-mode,長期默認寫在 權限模式 文檔裏的 permissions.defaultMode。聊天裏要求模型換模式,不會改這次會話的閘門。

一次會話的權限默認值和規則。deny 先於 ask,ask 先於 allow。
{
  "permissions": {
    "defaultMode": "default",
    "allow": ["Bash(npm test *)"],
    "ask": ["Bash(git push *)"],
    "deny": ["Read(./.env)", "Read(./.env.*)"]
  }
}

規則順序見 Claude Code 權限。更具體的 allow 蓋不過已經命中的 deny。

怎麼恢復 權限模式
終端 --continue 或按唯一名字 --resume,且不帶 -p 恢復會話結束時的模式,例外:bypassPermissions 和 plan 會回到新會話該用的模式。auto 只在賬號仍滿足條件時恢復。
啓動時的選擇器,或名字對上多個會話 不恢復存下來的模式,按這次啓動新會話的模式開始。
/resume 不恢復目標會話存的模式,沿用你當前這次會話的模式。

規則怎麼落到審批隊列和拒絕回寫,見 權限控制怎麼接。本篇只說明模式是會話狀態,規則文件在恢復時重讀。

MCP 在會話啓動時讀入

項目級服務器寫在倉庫根的 .mcp.json,會話啓動時讀取。改完文件要退出再開一次會話。說明見 連接 MCP。第一次看到項目級服務器會要求批准,克隆下來的倉庫不能未經同意就在你機器上起進程。

項目級 MCP。服務器名會變成工具名前綴。
{
  "mcpServers": {
    "docs": {
      "type": "http",
      "url": "https://code.claude.com/docs/mcp"
    }
  }
}

工具全名以 mcp__docs__ 這類前綴出現。權限規則按這個全名匹配,不要只寫服務器裏的短名。

你自己的工作流 JSON

轉錄 JSONL 不穩定。下面這份是你的應用契約,用來記住下次恢復該傳什麼。它不是 Claude Code 的請求體,也不會被 CLI 自動讀取。

一次可恢復的工作流記錄。resume 數組是你下次要補上的參數。
{
  "name": "auth-refactor",
  "cwd": "/repo/app",
  "permission_mode": "default",
  "settings": ".claude/settings.json",
  "mcp_config": ".mcp.json",
  "resume": ["--resume", "auth-refactor"],
  "last_tool": {
    "name": "mcp__docs__search",
    "decision": "allow"
  }
}

name 用 claude -n 或 /rename 設過的名字,方便 --resume 按名字找。cwd 必須是當時的項目目錄,會話存在按目錄劃分的存儲裏。

  1. 1
    先對上會話

    name 用來 --resume,cwd 用來決定去哪個項目目錄找轉錄。目錄不對,同名會話也找不到。

  2. 2
    再對齊權限模式

    把 permission_mode 抄進恢復命令的 --permission-mode。選擇器和 /resume 不會幫你恢復舊模式。

  3. 3
    最後補上 MCP

    mcp_config 指向倉庫裏的文件時,啓動會重讀。若當時靠的是命令行文件,把路徑放進 --mcp-config。

一輪 Tool Use 怎麼改這三份文檔

一輪不是再寫一段提示詞。順序是固定的。

  1. 1
    讀入

    會話載入已有對話,並重讀 settings.json 與 .mcp.json。命令行 MCP 只有你這次傳了纔在。

  2. 2
    提出調用

    模型給出 tool_use:工具全名和 input。MCP 工具帶服務器前綴。

  3. 3
    過權限

    按 deny、ask、allow 判定。deny 不執行。ask 停下來等人。allow 才調用工具。

  4. 4
    寫回

    結果追加進會話轉錄。你的工作流 JSON 只更新 last_tool,不要把整段轉錄複製進去。

這樣下次恢復時,你知道上次停在哪個工具、當時的模式,以及 MCP 配置從哪個文件讀。轉錄本身仍由 Claude Code 保存。

和另外兩篇怎麼分工

Coding Agent 如何工作 Harness 大戰 本篇
回答的問題 工具循環一般怎麼轉 各家外殼差在哪 Claude Code 一次會話恢復時,三份 JSON 各管什麼
不要在這裏找 又一篇工具調用綜述 又一張產品對比表 把 JSONL 轉錄當成穩定 API 來解析

在 JSONNote 裏檢查工作流 JSON

  1. 1
    格式化

    用 JSON 格式化 打開 settings.json 和工作流記錄。註釋和尾逗號會讓 Claude Code 在下次啓動報 Settings Error。

  2. 2
    校驗工作流記錄

    把下面的 Schema 貼進 JSON Schema。缺 name、cwd 或 permission_mode 不在枚舉裏,都先改再拿去恢復。

  3. 3
    對比權限規則

    改 deny / allow 前後用 JSON Diff 看一條 deny 有沒有被挪進 allow。這種變化比會話名字更值得人看。

工作流記錄的 JSON Schema。permission_mode 用官方模式名。
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "additionalProperties": false,
  "required": ["name", "cwd", "permission_mode", "settings", "mcp_config"],
  "properties": {
    "name": { "type": "string", "minLength": 1 },
    "cwd": { "type": "string", "minLength": 1 },
    "permission_mode": {
      "enum": ["default", "acceptEdits", "plan", "auto", "dontAsk", "bypassPermissions"]
    },
    "settings": { "type": "string", "minLength": 1 },
    "mcp_config": { "type": "string", "minLength": 1 },
    "resume": { "type": "array", "items": { "type": "string" } },
    "last_tool": {
      "type": "object",
      "required": ["name", "decision"],
      "properties": {
        "name": { "type": "string" },
        "decision": { "enum": ["allow", "deny", "ask"] }
      }
    }
  }
}

常見問題

resume 之後 MCP 服務器還在嗎?

寫在 .mcp.json 或 ~/.claude.json 裏的會在啓動時重讀。只通過 --mcp-config 傳入的不會自動回來,恢復時要再傳。

權限模式會不會和對話一起恢復?

不一定。終端裏不帶 -p 的 --continue 或唯一名字的 --resume,會按官方表恢復,但 bypassPermissions 和 plan 不會原樣回來。選擇器和 /resume 用的是當前這次啓動的模式。

能不能解析 ~/.claude/projects 裏的 JSONL 來做工作流?

不要。官方把轉錄格式當成會變的內部文件。你要穩定的字段,另寫本篇這份工作流 JSON,只記名字、目錄、模式、配置路徑和上一筆工具決定。

在對話裏讓模型切換權限模式有用嗎?

沒用。模式由 Shift+Tab、--permission-mode 或 settings 裏的 defaultMode 決定,不由提示詞決定。

這和審批隊列是同一件事嗎?

不是。本篇的 permission_mode 是這一次會話的閘門。隊列、拒絕回寫和 tool_use_id 見權限控制那篇。兩邊都要有:模式決定會不會問你,隊列決定問了之後怎麼落盤。

總結

Claude Code 像 Agent,是因爲會話把對話、權限模式和 MCP 工具綁成一次可恢復的工作。恢復對話不等於恢復啓動參數。轉錄 JSONL 留給 CLI,你自己留一份工作流 JSON。

直接結論:用名字和目錄定位會話;權限模式在選擇器和 /resume 裏要顯式再傳;--mcp-config 每次恢復都要再帶上。

下一步:先校驗工作流記錄,再按裏面的 resume 參數打開會話。

返回博客