SDK references
TypeScript SDK
TypeScript SDK 这一页讲的,就是 TypeScript SDK 这件事在 Claude Code 里到底怎么用。
页面信息
这页不是官方原文,而是顺着官方文档结构做的中文解释版。命令、参数、配置名这些硬东西尽量保留,解释部分则尽量讲成人能照着做的话。
如果你碰到特别敏感的配置、权限或企业环境差异,最好顺手点上面的“查看原始文档”再核一遍。
这一页先讲明白
这页主要讲 TypeScript SDK:Complete API reference for the TypeScript Agent SDK, including all functions, types, and interfaces.
你可以把它当成"SDK references"这块里专门管这一摊事的说明书。
你可以把"TypeScript SDK"理解成 SDK references 这一栏里的一把专门工具。这页不是让你背书,而是教你什么时候该把这把工具拿出来。
原文这页大多会按 Installation、Functions、query()、Parameters 这些环节往下讲。
翻成人话,大概就是:createSdkMcpServer()
第一,先别一上来全开全配。先按最小一步试通,确认没跑偏,再继续往下加。
第二,命令、配置名、参数名这些硬东西尽量保留原样。人话解释是帮你听懂,不是帮你改关键字。
第三,照着原文这几个环节挨个过:Installation -> Functions -> query() -> Parameters。像下地先看水路、再试机器、再正式开干,一步一步最稳。
原页关键片段:Installation
真到动手的时候了,下面这条直接敲一遍,看它回什么。
npm install @anthropic-ai/claude-agent-sdk 原页关键片段:query()
先看下面这块原始片段,等会儿再回头看解释会顺得多。
function query({
prompt,
options
}: {
prompt: string | AsyncIterable<SDKUserMessage>;
options?: Options;
}): Query; 原页关键片段:startup() 1
这一段要真抓重点,通常就抓下面这块原文。
function startup(params?: {
options?: Options;
initializeTimeoutMs?: number;
}): Promise<WarmQuery>; 原页关键片段:startup() 2
先别急着往下翻,下面这条命令跑完,心里才有底。
import { startup } from "@anthropic-ai/claude-agent-sdk";
// Pay startup cost upfront
const warm = await startup({ options: { maxTurns: 3 } });
// Later, when a prompt is ready, this is immediate
for await (const message of warm.query("What files are here?")) {
console.log(message);
} 原页关键片段:tool() 1
先看下面这块原始片段,等会儿再回头看解释会顺得多。
function tool<Schema extends AnyZodRawShape>(
name: string,
description: string,
inputSchema: Schema,
handler: (args: InferShape<Schema>, extra: unknown) => Promise<CallToolResult>,
extras?: { annotations?: ToolAnnotations }
): SdkMcpToolDefinition<Schema>; 原页关键片段:tool() 2
这一段不是只让你理解意思,下面这条命令就是现在要跑的。
import { tool } from "@anthropic-ai/claude-agent-sdk";
import { z } from "zod";
const searchTool = tool(
"search",
"Search the web",
{ query: z.string() },
async ({ query }) => {
return { content: [{ type: "text", text: `Results for: ${query}` }] };
},
{ annotations: { readOnlyHint: true, openWorldHint: true } }
); 原页关键片段:createSdkMcpServer()
下面这块是这一段最值钱的原文样板,先对着看一眼。
function createSdkMcpServer(options: {
name: string;
version?: string;
tools?: Array<SdkMcpToolDefinition<any>>;
}): McpSdkServerConfigWithInstance; 原页关键片段:listSessions() 1
这一段要真抓重点,通常就抓下面这块原文。
function listSessions(options?: ListSessionsOptions): Promise<SDKSessionInfo[]>; 原页关键片段:listSessions() 2
先别急着往下翻,下面这条命令跑完,心里才有底。
import { listSessions } from "@anthropic-ai/claude-agent-sdk";
const sessions = await listSessions({ dir: "/path/to/project", limit: 10 });
for (const session of sessions) {
console.log(`${session.summary} (${session.sessionId})`);
} 原页关键片段:getSessionMessages() 1
"getSessionMessages()"这一段里最要紧的原始写法在下面,先看它怎么落地。
function getSessionMessages(
sessionId: string,
options?: GetSessionMessagesOptions
): Promise<SessionMessage[]>; 原页关键片段:getSessionMessages() 2
看到这里,别光点头,下面这条命令先跑起来再说。
import { listSessions, getSessionMessages } from "@anthropic-ai/claude-agent-sdk";
const [latest] = await listSessions({ dir: "/path/to/project", limit: 1 });
if (latest) {
const messages = await getSessionMessages(latest.sessionId, {
dir: "/path/to/project",
limit: 20
});
for (const msg of messages) {
console.log(`[${msg.type}] ${msg.uuid}`);
}
} 原页关键片段:getSessionInfo()
"getSessionInfo()"这一段里最要紧的原始写法在下面,先看它怎么落地。
function getSessionInfo(
sessionId: string,
options?: GetSessionInfoOptions
): Promise<SDKSessionInfo | undefined>; Documentation Index
这里不是让你背"Documentation Index"这个词,而是让你看它真干活时怎么使。
Installation
这里主要是在交代"Installation"这一块会碰到哪些事。
Installation
真到动手的时候了,下面这条直接敲一遍,看它回什么。
npm install @anthropic-ai/claude-agent-sdk Functions
这一块主要是在说"Functions"真到手上该怎么用,哪里最容易踩坑。
query()
别把这段只当成标题看,它其实是在给"query()"划边界。
query()
先看下面这块原始片段,等会儿再回头看解释会顺得多。
function query({
prompt,
options
}: {
prompt: string | AsyncIterable<SDKUserMessage>;
options?: Options;
}): Query; startup()
这一段主要是在把"startup()"讲实,不是只摆个标题给你看。
看这段时要特别盯工具和权限边界,别为了省事一把全开。
startup() 1
这一段要真抓重点,通常就抓下面这块原文。
function startup(params?: {
options?: Options;
initializeTimeoutMs?: number;
}): Promise<WarmQuery>; startup() 2
先别急着往下翻,下面这条命令跑完,心里才有底。
import { startup } from "@anthropic-ai/claude-agent-sdk";
// Pay startup cost upfront
const warm = await startup({ options: { maxTurns: 3 } });
// Later, when a prompt is ready, this is immediate
for await (const message of warm.query("What files are here?")) {
console.log(message);
} tool()
看到这里,就把"tool()"当成一件真要上手的活来看。
看这段时要特别盯工具和权限边界,别为了省事一把全开。
tool() 1
先看下面这块原始片段,等会儿再回头看解释会顺得多。
function tool<Schema extends AnyZodRawShape>(
name: string,
description: string,
inputSchema: Schema,
handler: (args: InferShape<Schema>, extra: unknown) => Promise<CallToolResult>,
extras?: { annotations?: ToolAnnotations }
): SdkMcpToolDefinition<Schema>; tool() 2
这一段不是只让你理解意思,下面这条命令就是现在要跑的。
import { tool } from "@anthropic-ai/claude-agent-sdk";
import { z } from "zod";
const searchTool = tool(
"search",
"Search the web",
{ query: z.string() },
async ({ query }) => {
return { content: [{ type: "text", text: `Results for: ${query}` }] };
},
{ annotations: { readOnlyHint: true, openWorldHint: true } }
); createSdkMcpServer()
这里不是让你背"createSdkMcpServer()"这个词,而是让你看它真干活时怎么使。
如果你打算把外接能力往里挂,这里提到的 hooks、MCP、skills、memory 都要分清各自负责哪一摊。
createSdkMcpServer()
下面这块是这一段最值钱的原文样板,先对着看一眼。
function createSdkMcpServer(options: {
name: string;
version?: string;
tools?: Array<SdkMcpToolDefinition<any>>;
}): McpSdkServerConfigWithInstance; listSessions()
这一段主要是在把"listSessions()"讲实,不是只摆个标题给你看。
这里还牵扯作用域,意思就是这条规则到底管当前项目、你个人,还是只管这一趟会话。
listSessions() 1
这一段要真抓重点,通常就抓下面这块原文。
function listSessions(options?: ListSessionsOptions): Promise<SDKSessionInfo[]>; listSessions() 2
先别急着往下翻,下面这条命令跑完,心里才有底。
import { listSessions } from "@anthropic-ai/claude-agent-sdk";
const sessions = await listSessions({ dir: "/path/to/project", limit: 10 });
for (const session of sessions) {
console.log(`${session.summary} (${session.sessionId})`);
} getSessionMessages()
这一块主要是在说"getSessionMessages()"真到手上该怎么用,哪里最容易踩坑。
这里还牵扯作用域,意思就是这条规则到底管当前项目、你个人,还是只管这一趟会话。
getSessionMessages() 1
"getSessionMessages()"这一段里最要紧的原始写法在下面,先看它怎么落地。
function getSessionMessages(
sessionId: string,
options?: GetSessionMessagesOptions
): Promise<SessionMessage[]>; getSessionMessages() 2
看到这里,别光点头,下面这条命令先跑起来再说。
import { listSessions, getSessionMessages } from "@anthropic-ai/claude-agent-sdk";
const [latest] = await listSessions({ dir: "/path/to/project", limit: 1 });
if (latest) {
const messages = await getSessionMessages(latest.sessionId, {
dir: "/path/to/project",
limit: 20
});
for (const msg of messages) {
console.log(`[${msg.type}] ${msg.uuid}`);
}
} getSessionInfo()
这一块主要是在说"getSessionInfo()"真到手上该怎么用,哪里最容易踩坑。
这里还牵扯作用域,意思就是这条规则到底管当前项目、你个人,还是只管这一趟会话。
getSessionInfo()
"getSessionInfo()"这一段里最要紧的原始写法在下面,先看它怎么落地。
function getSessionInfo(
sessionId: string,
options?: GetSessionInfoOptions
): Promise<SDKSessionInfo | undefined>; renameSession()
这一块主要是在说"renameSession()"真到手上该怎么用,哪里最容易踩坑。
这里还牵扯作用域,意思就是这条规则到底管当前项目、你个人,还是只管这一趟会话。
renameSession()
"renameSession()"这一段里最要紧的原始写法在下面,先看它怎么落地。
function renameSession(
sessionId: string,
title: string,
options?: SessionMutationOptions
): Promise<void>; tagSession()
这一块主要是在说"tagSession()"真到手上该怎么用,哪里最容易踩坑。
这里还牵扯作用域,意思就是这条规则到底管当前项目、你个人,还是只管这一趟会话。
tagSession()
"tagSession()"这一段里最要紧的原始写法在下面,先看它怎么落地。
function tagSession(
sessionId: string,
tag: string | null,
options?: SessionMutationOptions
): Promise<void>; resolveSettings()
这里不是让你背"resolveSettings()"这个词,而是让你看它真干活时怎么使。
这里还牵扯作用域,意思就是这条规则到底管当前项目、你个人,还是只管这一趟会话。
resolveSettings() 1
下面这块是这一段最值钱的原文样板,先对着看一眼。
function resolveSettings(
options?: ResolveSettingsOptions
): Promise<ResolvedSettings>; resolveSettings() 2
真到动手的时候了,下面这条直接敲一遍,看它回什么。
import { resolveSettings } from "@anthropic-ai/claude-agent-sdk";
const { effective, provenance } = await resolveSettings({
cwd: "/path/to/project",
settingSources: ["user", "project", "local"],
});
console.log(`Cleanup period: ${effective.cleanupPeriodDays} days`);
console.log(`Set by: ${provenance.cleanupPeriodDays?.source}`); Types
这一块主要是在说"Types"真到手上该怎么用,哪里最容易踩坑。
Options
这一段主要是在把"Options"讲实,不是只摆个标题给你看。
看这段时要特别盯工具和权限边界,别为了省事一把全开。
Options
这一段要真抓重点,通常就抓下面这块原文。
const result = query({
prompt: "Analyze this code",
options: {
env: {
...process.env,
API_TIMEOUT_MS: "120000",
CLAUDE_CODE_MAX_RETRIES: "2",
CLAUDE_ASYNC_AGENT_STALL_TIMEOUT_MS: "120000",
},
},
}); Query object
这一块主要是在说"Query object"真到手上该怎么用,哪里最容易踩坑。
这里还牵扯作用域,意思就是这条规则到底管当前项目、你个人,还是只管这一趟会话。
Query object 1
"Query object"这一段里最要紧的原始写法在下面,先看它怎么落地。
interface Query extends AsyncGenerator<SDKMessage, void> {
interrupt(): Promise<void>;
rewindFiles(
userMessageId: string,
options?: { dryRun?: boolean }
): Promise<RewindFilesResult>;
setPermissionMode(mode: PermissionMode): Promise<void>;
setModel(model?: string): Promise<void>;
setMaxThinkingTokens(maxThinkingTokens: number | null): Promise<void>;
applyFlagSettings(settings: { [K in keyof Settings]?: Settings[K] | null }): Promise<void>;
initializationResult(): Promise<SDKControlInitializeResponse>;
supportedCommands(): Promise<SlashCommand[]>;
supportedModels(): Promise<ModelInfo[]>;
supportedAgents(): Promise<AgentInfo[]>;
mcpServerStatus(): Promise<McpServerStatus[]>;
accountInfo(): Promise<AccountInfo>;
reconnectMcpServer(serverName: string): Promise<void>;
toggleMcpServer(serverName: string, enabled: boolean): Promise<void>;
setMcpServers(servers: Record<string, McpServerConfig>): Promise<McpSetServersResult>;
streamInput(stream: AsyncIterable<SDKUserMessage>): Promise<void>;
stopTask(taskId: string): Promise<void>;
close(): void;
} Query object 2
看到这里,别光点头,下面这条命令先跑起来再说。
const q = query({ prompt: messageStream });
// Override the model for the rest of the session
await q.applyFlagSettings({ model: "claude-opus-4-6" });
// Later: clear the override and fall back to lower-precedence settings
await q.applyFlagSettings({ model: null }); WarmQuery
这一块主要是在说"WarmQuery"真到手上该怎么用,哪里最容易踩坑。
看这段时要特别盯工具和权限边界,别为了省事一把全开。
WarmQuery
"WarmQuery"这一段里最要紧的原始写法在下面,先看它怎么落地。
interface WarmQuery extends AsyncDisposable {
query(prompt: string | AsyncIterable<SDKUserMessage>): Query;
close(): void;
} SDKControlInitializeResponse
这一段主要是在把"SDKControlInitializeResponse"讲实,不是只摆个标题给你看。
这里还牵扯作用域,意思就是这条规则到底管当前项目、你个人,还是只管这一趟会话。
SDKControlInitializeResponse
这一段要真抓重点,通常就抓下面这块原文。
type SDKControlInitializeResponse = {
commands: SlashCommand[];
agents: AgentInfo[];
output_style: string;
available_output_styles: string[];
models: ModelInfo[];
account: AccountInfo;
fast_mode_state?: "off" | "cooldown" | "on";
}; AgentDefinition
这一段主要是在把"AgentDefinition"讲实,不是只摆个标题给你看。
AgentDefinition
这一段要真抓重点,通常就抓下面这块原文。
type AgentDefinition = {
description: string;
tools?: string[];
disallowedTools?: string[];
prompt: string;
model?: string;
mcpServers?: AgentMcpServerSpec[];
skills?: string[];
initialPrompt?: string;
maxTurns?: number;
background?: boolean;
memory?: "user" | "project" | "local";
effort?: "low" | "medium" | "high" | "xhigh" | "max" | number;
permissionMode?: PermissionMode;
criticalSystemReminder_EXPERIMENTAL?: string;
}; AgentMcpServerSpec
这一块主要是在说"AgentMcpServerSpec"真到手上该怎么用,哪里最容易踩坑。
如果你打算把外接能力往里挂,这里提到的 hooks、MCP、skills、memory 都要分清各自负责哪一摊。
AgentMcpServerSpec
"AgentMcpServerSpec"这一段里最要紧的原始写法在下面,先看它怎么落地。
type AgentMcpServerSpec = string | Record<string, McpServerConfigForProcessTransport>; SettingSource
看到这里,就把"SettingSource"当成一件真要上手的活来看。
这里还牵扯作用域,意思就是这条规则到底管当前项目、你个人,还是只管这一趟会话。
SettingSource 1
先看下面这块原始片段,等会儿再回头看解释会顺得多。
type SettingSource = "user" | "project" | "local"; SettingSource 2
这一步不用你自己动手配什么,把下面这句话交出去就行。
// Do not load user, project, or local settings from disk
const result = query({
prompt: "Analyze this code",
options: { settingSources: [] }
}); SettingSource 3
先看下面这块原始片段,等会儿再回头看解释会顺得多。
const result = query({
prompt: "Analyze this code",
options: {
settingSources: ["user", "project", "local"] // Load all settings
}
}); SettingSource 4
这一段说完,最后还得写到配置里才算真的生效。
// Load only project settings, ignore user and local
const result = query({
prompt: "Run CI checks",
options: {
settingSources: ["project"] // Only .claude/settings.json
}
}); PermissionMode
这里不是让你背"PermissionMode"这个词,而是让你看它真干活时怎么使。
PermissionMode
下面这块是这一段最值钱的原文样板,先对着看一眼。
type PermissionMode =
| "default" // Standard permission behavior
| "acceptEdits" // Auto-accept file edits
| "bypassPermissions" // Bypass all permission checks
| "plan" // Planning mode - read-only tools only
| "dontAsk" // Don't prompt for permissions, deny if not pre-approved
| "auto"; // Use a model classifier to approve or deny each tool call CanUseTool
这一块主要是在说"CanUseTool"真到手上该怎么用,哪里最容易踩坑。
看这段时要特别盯工具和权限边界,别为了省事一把全开。
CanUseTool
"CanUseTool"这一段里最要紧的原始写法在下面,先看它怎么落地。
type CanUseTool = (
toolName: string,
input: Record<string, unknown>,
options: {
signal: AbortSignal;
suggestions?: PermissionUpdate[];
blockedPath?: string;
decisionReason?: string;
toolUseID: string;
agentID?: string;
}
) => Promise<PermissionResult>; PermissionResult
这一段主要是在把"PermissionResult"讲实,不是只摆个标题给你看。
看这段时要特别盯工具和权限边界,别为了省事一把全开。
PermissionResult
这一段要真抓重点,通常就抓下面这块原文。
type PermissionResult =
| {
behavior: "allow";
updatedInput?: Record<string, unknown>;
updatedPermissions?: PermissionUpdate[];
toolUseID?: string;
}
| {
behavior: "deny";
message: string;
interrupt?: boolean;
toolUseID?: string;
}; ToolConfig
这一段主要是在把"ToolConfig"讲实,不是只摆个标题给你看。
看这段时要特别盯工具和权限边界,别为了省事一把全开。
ToolConfig
这一段要真抓重点,通常就抓下面这块原文。
type ToolConfig = {
askUserQuestion?: {
previewFormat?: "markdown" | "html";
};
}; McpServerConfig
这一块主要是在说"McpServerConfig"真到手上该怎么用,哪里最容易踩坑。
如果你打算把外接能力往里挂,这里提到的 hooks、MCP、skills、memory 都要分清各自负责哪一摊。
McpServerConfig 1
"McpServerConfig"这一段里最要紧的原始写法在下面,先看它怎么落地。
type McpServerConfig =
| McpStdioServerConfig
| McpSSEServerConfig
| McpHttpServerConfig
| McpSdkServerConfigWithInstance; McpServerConfig 2
"McpServerConfig"这一段里最要紧的原始写法在下面,先看它怎么落地。
type McpStdioServerConfig = {
type?: "stdio";
command: string;
args?: string[];
env?: Record<string, string>;
}; McpServerConfig 3
"McpServerConfig"这一段里最要紧的原始写法在下面,先看它怎么落地。
type McpSSEServerConfig = {
type: "sse";
url: string;
headers?: Record<string, string>;
}; McpServerConfig 4
"McpServerConfig"这一段里最要紧的原始写法在下面,先看它怎么落地。
type McpHttpServerConfig = {
type: "http";
url: string;
headers?: Record<string, string>;
}; SdkPluginConfig
看到这里,就把"SdkPluginConfig"当成一件真要上手的活来看。
SdkPluginConfig 1
先看下面这块原始片段,等会儿再回头看解释会顺得多。
type SdkPluginConfig = {
type: "local";
path: string;
}; SdkPluginConfig 2
先看下面这块原始片段,等会儿再回头看解释会顺得多。
plugins: [
{ type: "local", path: "./my-plugin" },
{ type: "local", path: "/absolute/path/to/plugin" }
]; Message Types
这里不是让你背"Message Types"这个词,而是让你看它真干活时怎么使。
SDKMessage
看到这里,就把"SDKMessage"当成一件真要上手的活来看。
SDKMessage
先看下面这块原始片段,等会儿再回头看解释会顺得多。
type SDKMessage =
| SDKAssistantMessage
| SDKUserMessage
| SDKUserMessageReplay
| SDKResultMessage
| SDKSystemMessage
| SDKPartialAssistantMessage
| SDKCompactBoundaryMessage
| SDKStatusMessage
| SDKLocalCommandOutputMessage
| SDKHookStartedMessage
| SDKHookProgressMessage
| SDKHookResponseMessage
| SDKPluginInstallMessage
| SDKToolProgressMessage
| SDKAuthStatusMessage
| SDKTaskNotificationMessage
| SDKTaskStartedMessage
| SDKTaskProgressMessage
| SDKTaskUpdatedMessage
| SDKFilesPersistedEvent
| SDKToolUseSummaryMessage
| SDKRateLimitEvent
| SDKPermissionDeniedMessage
| SDKPromptSuggestionMessage; SDKAssistantMessage
这一块主要是在说"SDKAssistantMessage"真到手上该怎么用,哪里最容易踩坑。
看这段时要特别盯工具和权限边界,别为了省事一把全开。
SDKAssistantMessage
"SDKAssistantMessage"这一段里最要紧的原始写法在下面,先看它怎么落地。
type SDKAssistantMessage = {
type: "assistant";
uuid: UUID;
session_id: string;
message: BetaMessage; // From Anthropic SDK
parent_tool_use_id: string | null;
error?: SDKAssistantMessageError;
}; SDKUserMessage
这里不是让你背"SDKUserMessage"这个词,而是让你看它真干活时怎么使。
这里还牵扯作用域,意思就是这条规则到底管当前项目、你个人,还是只管这一趟会话。
SDKUserMessage
下面这块是这一段最值钱的原文样板,先对着看一眼。
type SDKUserMessage = {
type: "user";
uuid?: UUID;
session_id: string;
message: MessageParam; // From Anthropic SDK
parent_tool_use_id: string | null;
isSynthetic?: boolean;
shouldQuery?: boolean;
tool_use_result?: unknown;
origin?: SDKMessageOrigin;
}; 照着做一遍
如果你不想来回翻,就先照这几步顺着做。
每做完一步就看一下结果,再决定要不要继续往下。
第 1 步:Installation
真到动手的时候了,下面这条直接敲一遍,看它回什么。
npm install @anthropic-ai/claude-agent-sdk 第 2 步:query()
先看下面这块原始片段,等会儿再回头看解释会顺得多。
function query({
prompt,
options
}: {
prompt: string | AsyncIterable<SDKUserMessage>;
options?: Options;
}): Query; 第 3 步:startup() 1
这一段要真抓重点,通常就抓下面这块原文。
function startup(params?: {
options?: Options;
initializeTimeoutMs?: number;
}): Promise<WarmQuery>; 第 4 步:startup() 2
先别急着往下翻,下面这条命令跑完,心里才有底。
import { startup } from "@anthropic-ai/claude-agent-sdk";
// Pay startup cost upfront
const warm = await startup({ options: { maxTurns: 3 } });
// Later, when a prompt is ready, this is immediate
for await (const message of warm.query("What files are here?")) {
console.log(message);
} 一眼看懂这一页
先把这页到底在讲什么看明白,再去碰具体命令和配置,最不容易绕晕。
TypeScript SDK
|
v
这是 SDK references 里的一摊要紧活
|
v
先弄懂,再下手 文末提醒
这站会按官方 docs 的导航和内容变化继续重生成,原站加页、删页、改页时,这里会跟着更新。
人话解释会尽量顺着原页往下讲,但命令、参数名、配置名这些硬东西还是保留原样,免得你抄过去跑不起来。