博客 • 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。
本文將介紹:
- 會話恢復帶上什麼、帶不上什麼
- 權限模式是會話狀態,規則在 settings 裏
- MCP 在會話啓動時讀入,命令行配置不會自動回來
- 一份你自己的工作流 JSON,用來下次按同樣的參數恢復
- 一輪 Tool Use 按什麼順序改這三份文檔
先記住這一點:恢復會話不等於恢復啓動參數。對話和部分權限模式會回來,--mcp-config 不會。下面按「會話 → 權限 → MCP → 你的工作流 JSON」拆開。
會話恢復什麼,不恢復什麼
會話是綁在項目目錄上的對話。官方說明見 管理會話。記錄持續寫到本機,所以退出之後還能回來。
| 入口 | 恢復什麼 | 權限模式 |
|---|---|---|
claude --continue |
當前目錄最近一次交互會話的完整對話,含工具調用和結果 | 終端裏不帶 -p 時,按官方表恢復;bypassPermissions 和 plan 不會原樣回來 |
claude --resume <name> |
按名字直接恢復那一次會話 | 名字唯一時直接進入;重名則打開選擇器,選擇器不恢復當時的權限模式 |
claude -p --resume |
非交互恢復,適合腳本 | 按一次新的 claude -p 來決定模式。會話結束在 plan,且滿足官方四個條件時,纔回到 plan |
恢復時還會帶上當時的模型,以及仍有效的目標和未過期的計劃任務。後臺 Bash 不會回來。
- 會回來:對話歷史、當時的模型(模型已下線或被 availableModels 攔住時除外)、用 --agent 啓動的 agent 定義。兩邊目錄都找不到該 agent 時,退回默認工具並給出警告。
- 不會自動回來:
--mcp-config、--settings、--add-dir,以及會話中途用 /add-dir 加的目錄。這些要在恢復命令裏再傳一次。 - 寫在
settings.json和 settings.local.json 裏的配置會在啓動時重讀,不用再傳。
轉錄默認是 JSONL,路徑在 ~/.claude/projects/ 下面、按工作目錄轉成的文件夾裏。官方寫明格式會變,不要把它當成你的穩定契約。你要穩定的字段,自己另寫一份 JSON。
權限模式跟着會話走
模式不是寫在提示詞裏的。會話中可以用 Shift+Tab 在 default、acceptEdits、plan 之間切。啓動時用 --permission-mode,長期默認寫在 權限模式 文檔裏的 permissions.defaultMode。聊天裏要求模型換模式,不會改這次會話的閘門。
{
"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。第一次看到項目級服務器會要求批准,克隆下來的倉庫不能未經同意就在你機器上起進程。
{
"mcpServers": {
"docs": {
"type": "http",
"url": "https://code.claude.com/docs/mcp"
}
}
}
- 項目範圍:
.mcp.json,克隆倉庫的人共用。要先批准。 - 本機範圍:
~/.claude.json。local 只對你、只對當前項目;user 只對你、所有項目。 - 命令行
--mcp-config只在這一次啓動生效。恢復會話時不會自動帶上,要再傳。
工具全名以 mcp__docs__ 這類前綴出現。權限規則按這個全名匹配,不要只寫服務器裏的短名。
你自己的工作流 JSON
轉錄 JSONL 不穩定。下面這份是你的應用契約,用來記住下次恢復該傳什麼。它不是 Claude Code 的請求體,也不會被 CLI 自動讀取。
{
"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
先對上會話
name用來 --resume,cwd用來決定去哪個項目目錄找轉錄。目錄不對,同名會話也找不到。 -
2
再對齊權限模式
把
permission_mode抄進恢復命令的--permission-mode。選擇器和 /resume 不會幫你恢復舊模式。 -
3
最後補上 MCP
mcp_config指向倉庫裏的文件時,啓動會重讀。若當時靠的是命令行文件,把路徑放進--mcp-config。
一輪 Tool Use 怎麼改這三份文檔
一輪不是再寫一段提示詞。順序是固定的。
-
1
讀入
會話載入已有對話,並重讀 settings.json 與 .mcp.json。命令行 MCP 只有你這次傳了纔在。
-
2
提出調用
模型給出 tool_use:工具全名和 input。MCP 工具帶服務器前綴。
-
3
過權限
按 deny、ask、allow 判定。deny 不執行。ask 停下來等人。allow 才調用工具。
-
4
寫回
結果追加進會話轉錄。你的工作流 JSON 只更新
last_tool,不要把整段轉錄複製進去。
這樣下次恢復時,你知道上次停在哪個工具、當時的模式,以及 MCP 配置從哪個文件讀。轉錄本身仍由 Claude Code 保存。
和另外兩篇怎麼分工
| Coding Agent 如何工作 | Harness 大戰 | 本篇 | |
|---|---|---|---|
| 回答的問題 | 工具循環一般怎麼轉 | 各家外殼差在哪 | Claude Code 一次會話恢復時,三份 JSON 各管什麼 |
| 不要在這裏找 | 又一篇工具調用綜述 | 又一張產品對比表 | 把 JSONL 轉錄當成穩定 API 來解析 |
在 JSONNote 裏檢查工作流 JSON
-
1
格式化
用 JSON 格式化 打開 settings.json 和工作流記錄。註釋和尾逗號會讓 Claude Code 在下次啓動報 Settings Error。
-
2
校驗工作流記錄
把下面的 Schema 貼進 JSON Schema。缺 name、cwd 或 permission_mode 不在枚舉裏,都先改再拿去恢復。
-
3
對比權限規則
改 deny / allow 前後用 JSON Diff 看一條
deny有沒有被挪進allow。這種變化比會話名字更值得人看。
{
"$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 參數打開會話。