§15.10

Claude Agent SDK for TypeScript: Your First Agent

Install @anthropic-ai/claude-agent-sdk, stream an agent that edits real files, gate its tools, and read the final result message.

published 06 Sept 2026 checked against docs 06 Sept 2026 4 min in Building with the API Markdown

On this page5 sections
  1. 1. Install
  2. 2. Set the key
  3. 3. Write the agent
  4. 4. Run it
  5. 5. Read the result

The Claude Agent SDK is the Claude Code harness as a library — the agent loop, built-in Read/Edit/Bash/Glob/Grep tools, permissions and context management, called from your own script. It is a different package from the Anthropic API SDK.

1. Install

Node.js 18 or later.

npm init -y
npm pkg set type=module
npm install @anthropic-ai/claude-agent-sdk
npm install --save-dev tsx

What it does: "type": "module" lets your script use top-level await, and tsx runs TypeScript directly with no build step. The SDK ships a native Claude Code binary through npm optional dependencies — an install that skips them (npm ci --omit=optional) gets no binary, so reinstall without the flag or point pathToClaudeCodeExecutable at a native install. In an existing CommonJS project, name the script agent.mts instead.

2. Set the key

export ANTHROPIC_API_KEY=your-api-key
$env:ANTHROPIC_API_KEY = "your-api-key"

What it does: authenticates the agent. The SDK reads the variable from the process environment and does not load .env files on its own.

3. Write the agent

agent.ts:

import { query } from "@anthropic-ai/claude-agent-sdk";

for await (const message of query({
  prompt: "Review utils.ts for bugs that would cause crashes. Fix any issues you find.",
  options: {
    allowedTools: ["Read", "Edit", "Glob"],
    permissionMode: "acceptEdits",
  },
})) {
  if (message.type === "assistant" && message.message?.content) {
    for (const block of message.message.content) {
      if ("text" in block) console.log(block.text);
      else if ("name" in block) console.log(`Tool: ${block.name}`);
    }
  } else if (message.type === "result") {
    console.log(`Done: ${message.subtype}`);
  }
}

What it does: query() returns an async generator of messages, so for await streams Claude’s reasoning, each tool call, and finally the outcome. allowedTools pre-approves those three tools; anything else falls through to permissionMode.

4. Run it

npx tsx agent.ts

What it does: executes the loop against the current directory and its subdirectories. Check the file on disk afterwards — a changed file is the only proof that matters.

5. Read the result

The result message is the one to log or persist. On subtype: "success" it carries result (the final text), plus num_turns, duration_ms, is_error, session_id and total_cost_usd. Treat total_cost_usd as a client-side estimate computed from a bundled price table, not a billing statement.

Other options worth knowing: systemPrompt, maxTurns, cwd, model, and mcpServers to hand the agent external tools.


Next: the same agent in Python or run Claude Code headless in CI.

← All Building with the API plates · Search all guides

↑↓ move↵ openalt+↵ copy first command

Keyboard

⌘/ctrl+K or /
Search all guides
alt+↵
In search: copy the guide's first command
j / k
Move through a list of guides
c
On a guide: copy its first command
t
Toggle light / dark
?
This list