跳至主要內容
Agent SDK Python MCP Session Management API

Claude Agent SDK:Session 歷史記錄、MCP 控制與 Thinking 設定

Claude Agent SDK Python v0.1.36-0.1.48 新增 session 歷史查詢、執行時期 MCP 伺服器管理、型別化 task 訊息、thinking 設定與 effort 控制。

2026年3月6日 7 分鐘閱讀 作者:Claude World

Claude Agent SDK for Python 在 v0.1.36 至 v0.1.48 版本中推出了大量新功能。本文涵蓋重點:session 歷史查詢、執行時期 MCP 伺服器管理、型別化 task 訊息、thinking 設定,以及數個重要的 bug 修復。

所有程式碼範例皆假設已安裝 claude_agent_sdk v0.1.48 或更新版本。


Session 歷史記錄 (v0.1.46)

兩個新的頂層函式讓你可以讀取過去的 session 資料,無需直接存取原始的 JSONL transcript 檔案。兩者皆為同步的檔案系統操作,不需要執行中的 Claude 程序。

list_sessions()

回傳依最後修改時間排序的 SDKSessionInfo 物件清單。每個項目包含 session ID、顯示摘要、檔案大小、選填的自訂標題、第一個 prompt、git branch 和工作目錄。

from claude_agent_sdk import list_sessions

# All sessions for a specific project
sessions = list_sessions(directory="/path/to/project")

for s in sessions:
    print(f"{s.session_id}  {s.summary}  ({s.file_size} bytes)")

# All sessions across every project
all_sessions = list_sessions()

# Limit results and skip git worktree scanning
recent = list_sessions(
    directory="/path/to/project",
    limit=10,
    include_worktrees=False,
)

get_session_messages()

回傳某個 session 的完整訊息清單,以 SessionMessage 物件呈現。每則訊息帶有 type(“user” 或 “assistant”)、uuidsession_id,以及原始 Anthropic API message dict。

from claude_agent_sdk import get_session_messages

messages = get_session_messages(
    "550e8400-e29b-41d4-a716-446655440000",
    directory="/path/to/project",
)

for msg in messages:
    role = msg.type
    content = msg.message.get("content", "")
    print(f"[{role}] {content[:80]}...")

# Paginate through a long session
page = get_session_messages(
    "550e8400-e29b-41d4-a716-446655440000",
    limit=20,
    offset=40,
)

應用場景:建置管理儀表板、稽核日誌、session 重播介面,或彙整跨 session token 使用量的分析管線。


MCP 執行時期控制 (v0.1.46)

SDK 現在支援在 session 執行期間新增和移除 MCP 伺服器。ClaudeSDKClient 上的兩個新方法 — add_mcp_server()remove_mcp_server() — 讓你無需重新啟動對話即可變更可用的工具集。

現有的 toggle_mcp_server()reconnect_mcp_server() 方法作為補充,可啟用/停用或重新連線已設定的伺服器。

from claude_agent_sdk import ClaudeSDKClient, ClaudeAgentOptions

options = ClaudeAgentOptions(
    model="claude-sonnet-4-5",
    permission_mode="bypassPermissions",
)

async with ClaudeSDKClient(options) as client:
    await client.query("Analyze project structure")

    # Check which MCP servers are connected
    status = await client.get_mcp_status()
    for server in status["mcpServers"]:
        print(f"{server['name']}: {server['status']}")

    # Temporarily disable a server
    await client.toggle_mcp_server("heavy-analytics", enabled=False)
    await client.query("Quick task without analytics tools")

    # Re-enable it
    await client.toggle_mcp_server("heavy-analytics", enabled=True)

    # Reconnect a failed server
    for server in status["mcpServers"]:
        if server["status"] == "failed":
            await client.reconnect_mcp_server(server["name"])

McpServerStatus TypedDict 提供型別化的欄位存取:namestatus"connected""pending""failed""needs-auth""disabled" 之一)、選填的 errorconfigscopeserverInfotools

應用場景:自適應工具可用性。一個程式撰寫 agent 可以只在任務涉及資料庫工作時載入資料庫 MCP 伺服器,切換到前端任務時再移除 — 保持工具清單的精簡,減少 prompt 雜訊。


型別化 Task 訊息 (v0.1.46)

過去所有 task 生命週期事件都以通用的 SystemMessage 物件抵達,迫使你手動檢查 subtypedata 欄位。三個新的訊息子類別提供了結構化存取:

類別Subtype關鍵欄位
TaskStartedMessagetask_startedtask_id, description, session_id, task_type
TaskProgressMessagetask_progresstask_id, description, usage, last_tool_name
TaskNotificationMessagetask_notificationtask_id, status, summary, output_file

三者皆繼承自 SystemMessage,因此現有的 isinstance(msg, SystemMessage) 檢查仍然匹配。

from claude_agent_sdk import (
    ClaudeSDKClient,
    TaskStartedMessage,
    TaskProgressMessage,
    TaskNotificationMessage,
)

async with ClaudeSDKClient(options) as client:
    await client.query("Run the full test suite")

    async for msg in client.receive_messages():
        match msg:
            case TaskStartedMessage():
                print(f"Task {msg.task_id} started: {msg.description}")

            case TaskProgressMessage():
                tokens = msg.usage.input_tokens + msg.usage.output_tokens
                print(f"  Progress: {tokens} tokens, last tool: {msg.last_tool_name}")

            case TaskNotificationMessage():
                print(f"Task {msg.task_id} {msg.status}: {msg.summary}")
                if msg.status == "failed":
                    print(f"  Output: {msg.output_file}")

TaskNotificationStatus 是一個 Literal["completed", "failed", "stopped"] — 可用於完備的 match 檢查。

應用場景:建置即時顯示 task 狀態與 token 數量的進度介面,或對 task 完成/失敗事件做出反應的編排器。


ResultMessage stop_reason (v0.1.46)

ResultMessage 新增了 stop_reason 欄位(選填字串),告訴你對話回合結束的原因。搭配既有的 is_errornum_turnstotal_cost_usd 欄位,你可以完整了解查詢終止的方式與原因。

from claude_agent_sdk import ResultMessage

async for msg in client.receive_response():
    if isinstance(msg, ResultMessage):
        print(f"Stopped: {msg.stop_reason}")
        print(f"Turns: {msg.num_turns}, Cost: ${msg.total_cost_usd:.4f}")
        print(f"Error: {msg.is_error}")

Thinking 設定 (v0.1.36)

Extended thinking 現在有了正式的設定系統。ClaudeAgentOptions 上的 thinking 欄位取代了已棄用的 max_thinking_tokens,接受三種設定形式:

from claude_agent_sdk import (
    ClaudeAgentOptions,
    ThinkingConfigAdaptive,
    ThinkingConfigEnabled,
    ThinkingConfigDisabled,
    query,
)

# Adaptive: let the model decide when and how much to think
options_adaptive = ClaudeAgentOptions(
    model="claude-opus-4-6",
    thinking=ThinkingConfigAdaptive(type="adaptive"),
)

# Enabled with a specific token budget
options_budgeted = ClaudeAgentOptions(
    model="claude-opus-4-6",
    thinking=ThinkingConfigEnabled(type="enabled", budget_tokens=10000),
)

# Disabled entirely
options_fast = ClaudeAgentOptions(
    model="claude-sonnet-4-5",
    thinking=ThinkingConfigDisabled(type="disabled"),
)

Effort 控制

effort 欄位提供了一種更簡單的方式來控制思考深度,無需指定確切的 token 預算:

# Quick, low-effort response
options = ClaudeAgentOptions(
    model="claude-sonnet-4-5",
    effort="low",
)

# Maximum reasoning depth
options = ClaudeAgentOptions(
    model="claude-opus-4-6",
    effort="max",
)

有效值:"low""medium""high""max"effort 選項與 thinking 彼此獨立 — 你可以只用其中一個,也可以同時使用。


Hook 增強 (v0.1.46)

工具生命週期 hook 的輸入現在包含 agent_idagent_type 欄位。這對於多 agent 設定至關重要,因為多個 sub-agent 平行執行時,它們的工具生命週期 hook 會在同一控制通道上交錯出現。

這些欄位出現在 PreToolUseHookInputPostToolUseHookInputPostToolUseFailureHookInput 上:

  • agent_id — 當 hook 從 Task 衍生的 sub-agent 內部觸發時存在。這是在多個 agent 並行執行時,將工具呼叫歸屬到特定 sub-agent 的唯一可靠方式。
  • agent_type — agent 類型名稱(例如 “general-purpose”、“code-reviewer”)。在 sub-agent 內部與 agent_id 一起出現,或在以 --agent 啟動的 session 主執行緒上出現。
options = ClaudeAgentOptions(
    hooks={
        "PreToolUse": [
            HookMatcher(
                matcher="Edit",
                hooks=[HookCallback(callback=my_hook)],
            )
        ]
    }
)

async def my_hook(input_data):
    agent = input_data.get("agent_id", "main")
    agent_type = input_data.get("agent_type", "unknown")
    tool = input_data["tool_name"]
    print(f"[{agent_type}:{agent}] using {tool}")
    return {"decision": "approve"}

Bug 修復

這些版本中有三個值得注意的修復:

細粒度工具串流 (v0.1.48)include_partial_messages=True 沒有傳遞 input_json_delta 事件,因為 CLAUDE_CODE_ENABLE_FINE_GRAINED_TOOL_STREAMING 環境變數未在子程序中設定。此回歸影響了 v0.1.36 至 v0.1.47 版本中未啟用伺服器端功能旗標的使用者。

字串 prompt MCP 初始化 (v0.1.46) — 傳入純字串 prompt 會在 MCP 伺服器初始化完成前關閉 stdin,導致 MCP 伺服器無法註冊。此問題已修復。

未知訊息類型處理 (v0.1.40) — 無法辨識的 CLI 訊息類型(例如 rate_limit_event)會拋出 MessageParseError 而導致 session 崩潰。未知類型現在會被靜默跳過,使 SDK 能向前相容未來的 CLI 訊息新增。


升級路徑

這些變更皆為增量式。v0.1.36 至 v0.1.48 之間沒有引入破壞性變更。唯一的棄用項目是 max_thinking_tokens,改為使用 thinking 欄位 — 舊欄位仍然可用,但同時設定兩者時 thinking 優先。

pip install --upgrade claude-agent-sdk

這些版本中附帶的 Claude CLI 從 v2.1.42 更新至 v2.1.71。如果你透過 cli_path 固定特定的 CLI 版本,請確保至少為 v2.1.69 以獲得本文描述的完整功能集。