Das Claude Code SDK ermöglicht Entwicklern, Claude Code programmgesteuert in ihre Anwendungen zu integrieren. Es ermöglicht die Ausführung von Claude Code als Unterprozess und bietet eine Möglichkeit, KI-gestützte Coding-Assistenten und Tools zu erstellen, die die Fähigkeiten von Claude nutzen.

Das SDK ist für die Verwendung in der Kommandozeile, TypeScript und Python verfügbar.

Authentifizierung

Um das Claude Code SDK zu verwenden, empfehlen wir die Erstellung eines dedizierten API-Schlüssels:

  1. Erstellen Sie einen Anthropic API-Schlüssel in der Anthropic Console
  2. Setzen Sie dann die Umgebungsvariable ANTHROPIC_API_KEY. Wir empfehlen, diesen Schlüssel sicher zu speichern (z.B. mit einem Github Secret)

Grundlegende SDK-Nutzung

Das Claude Code SDK ermöglicht die Verwendung von Claude Code im nicht-interaktiven Modus aus Ihren Anwendungen heraus.

Kommandozeile

Hier sind einige grundlegende Beispiele für das Kommandozeilen-SDK:

# Führe eine einzelne Anfrage aus und beende (Print-Modus)
$ claude -p "Write a function to calculate Fibonacci numbers"

# Verwendung einer Pipe zur Bereitstellung von stdin
$ echo "Explain this code" | claude -p

# Ausgabe im JSON-Format mit Metadaten
$ claude -p "Generate a hello world function" --output-format json

# Stream JSON-Ausgabe, sobald sie eintrifft
$ claude -p "Build a React component" --output-format stream-json

TypeScript

Das TypeScript SDK ist im Haupt-Paket @anthropic-ai/claude-code auf NPM enthalten:

import { query, type SDKMessage } from "@anthropic-ai/claude-code";

const messages: SDKMessage[] = [];

for await (const message of query({
  prompt: "Write a haiku about foo.py",
  abortController: new AbortController(),
  options: {
    maxTurns: 3,
  },
})) {
  messages.push(message);
}

console.log(messages);

Das TypeScript SDK akzeptiert alle Argumente, die vom Kommandozeilen-SDK unterstützt werden, sowie:

ArgumentBeschreibungStandard
abortControllerAbort-Controllernew AbortController()
cwdAktuelles Arbeitsverzeichnisprocess.cwd()
executableWelche JavaScript-Laufzeit verwendet werden sollnode bei Ausführung mit Node.js, bun bei Ausführung mit Bun
executableArgsArgumente, die an die ausführbare Datei übergeben werden[]
pathToClaudeCodeExecutablePfad zur Claude Code ausführbaren DateiAusführbare Datei, die mit @anthropic-ai/claude-code geliefert wird

Python

Das Python SDK ist als claude-code-sdk auf PyPI verfügbar:

pip install claude-code-sdk

Voraussetzungen:

  • Python 3.10+
  • Node.js
  • Claude Code CLI: npm install -g @anthropic-ai/claude-code

Grundlegende Verwendung:

import anyio
from claude_code_sdk import query, ClaudeCodeOptions, Message

async def main():
    messages: list[Message] = []
    
    async for message in query(
        prompt="Write a haiku about foo.py",
        options=ClaudeCodeOptions(max_turns=3)
    ):
        messages.append(message)
    
    print(messages)

anyio.run(main)

Das Python SDK akzeptiert alle Argumente, die vom Kommandozeilen-SDK über die Klasse ClaudeCodeOptions unterstützt werden:

from claude_code_sdk import query, ClaudeCodeOptions
from pathlib import Path

options = ClaudeCodeOptions(
    max_turns=3,
    system_prompt="You are a helpful assistant",
    cwd=Path("/path/to/project"),  # Kann ein String oder Path sein
    allowed_tools=["Read", "Write", "Bash"],
    permission_mode="acceptEdits"
)

async for message in query(prompt="Hello", options=options):
    print(message)

Erweiterte Nutzung

Die folgende Dokumentation verwendet das Kommandozeilen-SDK als Beispiel, kann aber auch mit den TypeScript- und Python-SDKs verwendet werden.

Mehrstufige Konversationen

Für mehrstufige Konversationen können Sie Konversationen fortsetzen oder von der letzten Sitzung aus weitermachen:

# Die letzte Konversation fortsetzen
$ claude --continue

# Fortsetzen und eine neue Anfrage stellen
$ claude --continue "Now refactor this for better performance"

# Eine bestimmte Konversation anhand der Sitzungs-ID fortsetzen
$ claude --resume 550e8400-e29b-41d4-a716-446655440000

# Im Print-Modus fortsetzen (nicht-interaktiv)
$ claude -p --resume 550e8400-e29b-41d4-a716-446655440000 "Update the tests"

# Im Print-Modus fortsetzen (nicht-interaktiv)
$ claude -p --continue "Add error handling"

Benutzerdefinierte System-Prompts

Sie können benutzerdefinierte System-Prompts bereitstellen, um Claudes Verhalten zu steuern:

# System-Prompt überschreiben (funktioniert nur mit --print)
$ claude -p "Build a REST API" --system-prompt "You are a senior backend engineer. Focus on security, performance, and maintainability."

# System-Prompt mit spezifischen Anforderungen
$ claude -p "Create a database schema" --system-prompt "You are a database architect. Use PostgreSQL best practices and include proper indexing."

Sie können auch Anweisungen an den Standard-System-Prompt anhängen:

# System-Prompt anhängen (funktioniert nur mit --print)
$ claude -p "Build a REST API" --append-system-prompt "After writing code, be sure to code review yourself."

MCP-Konfiguration

Das Model Context Protocol (MCP) ermöglicht es Ihnen, Claude Code mit zusätzlichen Tools und Ressourcen von externen Servern zu erweitern. Mit dem Flag --mcp-config können Sie MCP-Server laden, die spezialisierte Funktionen wie Datenbankzugriff, API-Integrationen oder benutzerdefinierte Tools bereitstellen.

Erstellen Sie eine JSON-Konfigurationsdatei mit Ihren MCP-Servern:

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/path/to/allowed/files"
      ]
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_TOKEN": "your-github-token"
      }
    }
  }
}

Dann verwenden Sie es mit Claude Code:

# MCP-Server aus der Konfiguration laden
$ claude -p "List all files in the project" --mcp-config mcp-servers.json

# Wichtig: MCP-Tools müssen explizit mit --allowedTools erlaubt werden
# MCP-Tools folgen dem Format: mcp__$serverName__$toolName
$ claude -p "Search for TODO comments" \
  --mcp-config mcp-servers.json \
  --allowedTools "mcp__filesystem__read_file,mcp__filesystem__list_directory"

# Ein MCP-Tool für die Behandlung von Berechtigungsaufforderungen im nicht-interaktiven Modus verwenden
$ claude -p "Deploy the application" \
  --mcp-config mcp-servers.json \
  --allowedTools "mcp__permissions__approve" \
  --permission-prompt-tool mcp__permissions__approve

Bei der Verwendung von MCP-Tools müssen Sie diese explizit mit dem Flag --allowedTools erlauben. MCP-Tool-Namen folgen dem Muster mcp__<serverName>__<toolName>, wobei:

  • serverName der Schlüssel aus Ihrer MCP-Konfigurationsdatei ist
  • toolName das spezifische Tool ist, das von diesem Server bereitgestellt wird

Diese Sicherheitsmaßnahme stellt sicher, dass MCP-Tools nur verwendet werden, wenn sie ausdrücklich erlaubt sind.

Wenn Sie nur den Servernamen angeben (d.h. mcp__<serverName>), werden alle Tools von diesem Server erlaubt.

Glob-Muster (z.B. mcp__go*) werden nicht unterstützt.

Benutzerdefiniertes Berechtigungsaufforderungs-Tool

Optional können Sie --permission-prompt-tool verwenden, um ein MCP-Tool zu übergeben, das wir verwenden, um zu prüfen, ob der Benutzer dem Modell die Erlaubnis erteilt, ein bestimmtes Tool aufzurufen. Wenn das Modell ein Tool aufruft, geschieht Folgendes:

  1. Wir prüfen zuerst die Berechtigungseinstellungen: alle settings.json-Dateien sowie --allowedTools und --disallowedTools, die an das SDK übergeben wurden; wenn eine dieser Einstellungen den Tool-Aufruf erlaubt oder verweigert, fahren wir mit dem Tool-Aufruf fort
  2. Andernfalls rufen wir das MCP-Tool auf, das Sie in --permission-prompt-tool angegeben haben

Das MCP-Tool --permission-prompt-tool erhält den Tool-Namen und die Eingabe und muss eine JSON-stringifizierte Nutzlast mit dem Ergebnis zurückgeben. Die Nutzlast muss eine der folgenden sein:

// Tool-Aufruf ist erlaubt
{
  "behavior": "allow",
  "updatedInput": {...}, // aktualisierte Eingabe oder einfach die ursprüngliche Eingabe zurückgeben
}

// Tool-Aufruf wird verweigert
{
  "behavior": "deny",
  "message": "..." // menschenlesbarer String, der erklärt, warum die Berechtigung verweigert wurde
}

Eine TypeScript-MCP-Berechtigungsaufforderungs-Tool-Implementierung könnte beispielsweise so aussehen:

const server = new McpServer({
  name: "Test permission prompt MCP Server",
  version: "0.0.1",
});

server.tool(
  "approval_prompt",
  'Simulate a permission check - approve if the input contains "allow", otherwise deny',
  {
    tool_name: z.string().describe("The tool requesting permission"),
    input: z.object({}).passthrough().describe("The input for the tool"),
  },
  async ({ tool_name, input }) => {
    return {
      content: [
        {
          type: "text",
          text: JSON.stringify(
            JSON.stringify(input).includes("allow")
              ? {
                  behavior: "allow",
                  updatedInput: input,
                }
              : {
                  behavior: "deny",
                  message: "Permission denied by test approval_prompt tool",
                }
          ),
        },
      ],
    };
  }
);

Um dieses Tool zu verwenden, fügen Sie Ihren MCP-Server hinzu (z.B. mit --mcp-config) und rufen Sie dann das SDK wie folgt auf:

claude -p "..." \
  --permission-prompt-tool mcp__test-server__approval_prompt \
  --mcp-config my-config.json

Nutzungshinweise:

  • Verwenden Sie updatedInput, um dem Modell mitzuteilen, dass die Berechtigungsaufforderung seine Eingabe verändert hat; andernfalls setzen Sie updatedInput auf die ursprüngliche Eingabe, wie im obigen Beispiel. Wenn das Tool beispielsweise dem Benutzer einen Datei-Bearbeitungs-Diff anzeigt und ihm erlaubt, den Diff manuell zu bearbeiten, sollte das Berechtigungsaufforderungs-Tool diese aktualisierte Bearbeitung zurückgeben.
  • Die Nutzlast muss JSON-stringifiziert sein

Verfügbare CLI-Optionen

Das SDK nutzt alle CLI-Optionen, die in Claude Code verfügbar sind. Hier sind die wichtigsten für die SDK-Nutzung:

FlagBeschreibungBeispiel
--print, -pIm nicht-interaktiven Modus ausführenclaude -p "query"
--output-formatAusgabeformat angeben (text, json, stream-json)claude -p --output-format json
--resume, -rEine Konversation anhand der Sitzungs-ID fortsetzenclaude --resume abc123
--continue, -cDie letzte Konversation fortsetzenclaude --continue
--verboseAusführliche Protokollierung aktivierenclaude --verbose
--max-turnsAgentische Durchgänge im nicht-interaktiven Modus begrenzenclaude --max-turns 3
--system-promptSystem-Prompt überschreiben (nur mit --print)claude --system-prompt "Custom instruction"
--append-system-promptAn System-Prompt anhängen (nur mit --print)claude --append-system-prompt "Custom instruction"
--allowedToolsLeerzeichen-getrennte Liste erlaubter Tools, oder

String mit Komma-getrennter Liste erlaubter Tools
claude --allowedTools mcp__slack mcp__filesystem

claude --allowedTools "Bash(npm install),mcp__filesystem"
--disallowedToolsLeerzeichen-getrennte Liste verweigerte Tools, oder

String mit Komma-getrennter Liste verweigerter Tools
claude --disallowedTools mcp__splunk mcp__github

claude --disallowedTools "Bash(git commit),mcp__github"
--mcp-configMCP-Server aus einer JSON-Datei ladenclaude --mcp-config servers.json
--permission-prompt-toolMCP-Tool für die Behandlung von Berechtigungsaufforderungen (nur mit --print)claude --permission-prompt-tool mcp__auth__prompt

Eine vollständige Liste der CLI-Optionen und Funktionen finden Sie in der CLI-Nutzungsdokumentation.

Ausgabeformate

Das SDK unterstützt mehrere Ausgabeformate:

Textausgabe (Standard)

Gibt nur den Antworttext zurück:

$ claude -p "Explain file src/components/Header.tsx"
# Ausgabe: This is a React component showing...

JSON-Ausgabe

Gibt strukturierte Daten einschließlich Metadaten zurück:

$ claude -p "How does the data layer work?" --output-format json

Antwortformat:

{
  "type": "result",
  "subtype": "success",
  "total_cost_usd": 0.003,
  "is_error": false,
  "duration_ms": 1234,
  "duration_api_ms": 800,
  "num_turns": 6,
  "result": "The response text here...",
  "session_id": "abc123"
}

Streaming JSON-Ausgabe

Streamt jede Nachricht, sobald sie empfangen wird:

$ claude -p "Build an application" --output-format stream-json

Jede Konversation beginnt mit einer initialen init-Systemnachricht, gefolgt von einer Liste von Benutzer- und Assistentennachrichten, gefolgt von einer abschließenden result-Systemnachricht mit Statistiken. Jede Nachricht wird als separates JSON-Objekt ausgegeben.

Nachrichtenschema

Nachrichten, die von der JSON-API zurückgegeben werden, sind streng typisiert gemäß dem folgenden Schema:

type SDKMessage =
  // Eine Assistentennachricht
  | {
      type: "assistant";
      message: Message; // aus Anthropic SDK
      session_id: string;
    }

  // Eine Benutzernachricht
  | {
      type: "user";
      message: MessageParam; // aus Anthropic SDK
      session_id: string;
    }

  // Wird als letzte Nachricht ausgegeben
  | {
      type: "result";
      subtype: "success";
      duration_ms: float;
      duration_api_ms: float;
      is_error: boolean;
      num_turns: int;
      result: string;
      session_id: string;
      total_cost_usd: float;
    }

  // Wird als letzte Nachricht ausgegeben, wenn wir die maximale Anzahl von Durchgängen erreicht haben
  | {
      type: "result";
      subtype: "error_max_turns" | "error_during_execution";
      duration_ms: float;
      duration_api_ms: float;
      is_error: boolean;
      num_turns: int;
      session_id: string;
      total_cost_usd: float;
    }

  // Wird als erste Nachricht zu Beginn einer Konversation ausgegeben
  | {
      type: "system";
      subtype: "init";
      apiKeySource: string;
      cwd: string;
      session_id: string;
      tools: string[];
      mcp_servers: {
        name: string;
        status: string;
      }[];
      model: string;
      permissionMode: "default" | "acceptEdits" | "bypassPermissions" | "plan";
    };

Wir werden diese Typen bald in einem JSONSchema-kompatiblen Format veröffentlichen. Wir verwenden semantische Versionierung für das Haupt-Claude-Code-Paket, um Breaking Changes in diesem Format zu kommunizieren.

Die Typen Message und MessageParam sind in Anthropic SDKs verfügbar. Siehe zum Beispiel die Anthropic TypeScript und Python SDKs.

Beispiele

Einfache Skriptintegration

#!/bin/bash

# Einfache Funktion zum Ausführen von Claude und Überprüfen des Exit-Codes
run_claude() {
    local prompt="$1"
    local output_format="${2:-text}"

    if claude -p "$prompt" --output-format "$output_format"; then
        echo "Success!"
    else
        echo "Error: Claude failed with exit code $?" >&2
        return 1
    fi
}

# Verwendungsbeispiele
run_claude "Write a Python function to read CSV files"
run_claude "Optimize this database query" "json"

Dateien mit Claude verarbeiten

# Eine Datei durch Claude verarbeiten
$ cat mycode.py | claude -p "Review this code for bugs"

# Mehrere Dateien verarbeiten
$ for file in *.js; do
    echo "Processing $file..."
    claude -p "Add JSDoc comments to this file:" < "$file" > "${file}.documented"
done

# Claude in einer Pipeline verwenden
$ grep -l "TODO" *.py | while read file; do
    claude -p "Fix all TODO items in this file" < "$file"
done

Sitzungsverwaltung

# Eine Sitzung starten und die Sitzungs-ID erfassen
$ claude -p "Initialize a new project" --output-format json | jq -r '.session_id' > session.txt

# Mit derselben Sitzung fortfahren
$ claude -p --resume "$(cat session.txt)" "Add unit tests"

Best Practices

  1. Verwenden Sie das JSON-Ausgabeformat für die programmatische Analyse von Antworten:

    # JSON-Antwort mit jq analysieren
    result=$(claude -p "Generate code" --output-format json)
    code=$(echo "$result" | jq -r '.result')
    cost=$(echo "$result" | jq -r '.cost_usd')
    
  2. Behandeln Sie Fehler elegant - überprüfen Sie Exit-Codes und stderr:

    if ! claude -p "$prompt" 2>error.log; then
        echo "Error occurred:" >&2
        cat error.log >&2
        exit 1
    fi
    
  3. Verwenden Sie Sitzungsverwaltung für die Aufrechterhaltung des Kontexts in mehrstufigen Konversationen

  4. Berücksichtigen Sie Timeouts für lang laufende Operationen:

    timeout 300 claude -p "$complex_prompt" || echo "Timed out after 5 minutes"
    
  5. Respektieren Sie Rate-Limits bei mehreren Anfragen, indem Sie Verzögerungen zwischen den Aufrufen einfügen

Reale Anwendungen

Das Claude Code SDK ermöglicht leistungsstarke Integrationen in Ihren Entwicklungsworkflow. Ein bemerkenswertes Beispiel sind die Claude Code GitHub Actions, die das SDK verwenden, um automatisierte Code-Reviews, PR-Erstellung und Issue-Triage-Funktionen direkt in Ihrem GitHub-Workflow bereitzustellen.

Verwandte Ressourcen