SDK Claude Code позволяет разработчикам программно интегрировать Claude Code в свои приложения. Он позволяет запускать Claude Code как подпроцесс, предоставляя способ создания помощников по программированию и инструментов на базе ИИ, использующих возможности Claude.

SDK доступен для использования в командной строке, TypeScript и Python.

Аутентификация

Для использования SDK Claude Code мы рекомендуем создать выделенный API-ключ:

  1. Создайте API-ключ Anthropic в Консоли Anthropic
  2. Затем установите переменную окружения ANTHROPIC_API_KEY. Мы рекомендуем хранить этот ключ безопасно (например, используя секрет Github)

Базовое использование SDK

SDK Claude Code позволяет использовать Claude Code в неинтерактивном режиме из ваших приложений.

Командная строка

Вот несколько базовых примеров для SDK командной строки:

# Выполнить один запрос и выйти (режим печати)
$ claude -p "Write a function to calculate Fibonacci numbers"

# Использование канала для предоставления stdin
$ echo "Explain this code" | claude -p

# Вывод в формате JSON с метаданными
$ claude -p "Generate a hello world function" --output-format json

# Потоковый вывод JSON по мере поступления
$ claude -p "Build a React component" --output-format stream-json

TypeScript

SDK для TypeScript включен в основной пакет @anthropic-ai/claude-code на NPM:

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);

SDK для TypeScript принимает все аргументы, поддерживаемые SDK командной строки, а также:

АргументОписаниеПо умолчанию
abortControllerКонтроллер прерыванияnew AbortController()
cwdТекущий рабочий каталогprocess.cwd()
executableКакую среду выполнения JavaScript использоватьnode при запуске с Node.js, bun при запуске с Bun
executableArgsАргументы для передачи исполняемому файлу[]
pathToClaudeCodeExecutableПуть к исполняемому файлу Claude CodeИсполняемый файл, поставляемый с @anthropic-ai/claude-code

Python

SDK для Python доступен как claude-code-sdk на PyPI:

pip install claude-code-sdk

Предварительные требования:

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

Базовое использование:

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)

SDK для Python принимает все аргументы, поддерживаемые SDK командной строки, через класс ClaudeCodeOptions:

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"),  # Может быть строкой или Path
    allowed_tools=["Read", "Write", "Bash"],
    permission_mode="acceptEdits"
)

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

Расширенное использование

Документация ниже использует SDK командной строки в качестве примера, но также может использоваться с SDK для TypeScript и Python.

Многоходовые разговоры

Для многоходовых разговоров вы можете возобновить беседы или продолжить с последней сессии:

# Продолжить самую последнюю беседу
$ claude --continue

# Продолжить и предоставить новый запрос
$ claude --continue "Now refactor this for better performance"

# Возобновить определенную беседу по ID сессии
$ claude --resume 550e8400-e29b-41d4-a716-446655440000

# Возобновить в режиме печати (неинтерактивном)
$ claude -p --resume 550e8400-e29b-41d4-a716-446655440000 "Update the tests"

# Продолжить в режиме печати (неинтерактивном)
$ claude -p --continue "Add error handling"

Пользовательские системные промпты

Вы можете предоставить пользовательские системные промпты для управления поведением Claude:

# Переопределить системный промпт (работает только с --print)
$ claude -p "Build a REST API" --system-prompt "You are a senior backend engineer. Focus on security, performance, and maintainability."

# Системный промпт с конкретными требованиями
$ claude -p "Create a database schema" --system-prompt "You are a database architect. Use PostgreSQL best practices and include proper indexing."

Вы также можете добавить инструкции к системному промпту по умолчанию:

# Добавить к системному промпту (работает только с --print)
$ claude -p "Build a REST API" --append-system-prompt "After writing code, be sure to code review yourself."

Конфигурация MCP

Протокол контекста модели (MCP) позволяет расширить Claude Code дополнительными инструментами и ресурсами с внешних серверов. Используя флаг --mcp-config, вы можете загрузить MCP-серверы, которые предоставляют специализированные возможности, такие как доступ к базам данных, интеграции API или пользовательские инструменты.

Создайте JSON-файл конфигурации с вашими MCP-серверами:

{
  "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"
      }
    }
  }
}

Затем используйте его с Claude Code:

# Загрузить MCP-серверы из конфигурации
$ claude -p "List all files in the project" --mcp-config mcp-servers.json

# Важно: MCP-инструменты должны быть явно разрешены с помощью --allowedTools
# MCP-инструменты следуют формату: mcp__$serverName__$toolName
$ claude -p "Search for TODO comments" \
  --mcp-config mcp-servers.json \
  --allowedTools "mcp__filesystem__read_file,mcp__filesystem__list_directory"

# Использовать MCP-инструмент для обработки запросов разрешений в неинтерактивном режиме
$ claude -p "Deploy the application" \
  --mcp-config mcp-servers.json \
  --allowedTools "mcp__permissions__approve" \
  --permission-prompt-tool mcp__permissions__approve

При использовании MCP-инструментов вы должны явно разрешить их с помощью флага --allowedTools. Имена MCP-инструментов следуют шаблону mcp__<serverName>__<toolName>, где:

  • serverName - ключ из вашего файла конфигурации MCP
  • toolName - конкретный инструмент, предоставляемый этим сервером

Эта мера безопасности гарантирует, что MCP-инструменты используются только при явном разрешении.

Если вы указываете только имя сервера (т.е. mcp__<serverName>), будут разрешены все инструменты с этого сервера.

Шаблоны glob (например, mcp__go*) не поддерживаются.

Пользовательский инструмент запроса разрешений

Опционально используйте --permission-prompt-tool для передачи MCP-инструмента, который мы будем использовать для проверки, предоставляет ли пользователь модели разрешения на вызов определенного инструмента. Когда модель вызывает инструмент, происходит следующее:

  1. Сначала мы проверяем настройки разрешений: все файлы settings.json, а также --allowedTools и --disallowedTools, переданные в SDK; если одна из этих настроек разрешает или запрещает вызов инструмента, мы продолжаем с вызовом инструмента
  2. В противном случае мы вызываем MCP-инструмент, который вы указали в --permission-prompt-tool

MCP-инструменту --permission-prompt-tool передается имя инструмента и входные данные, и он должен вернуть полезную нагрузку в формате JSON-строки с результатом. Полезная нагрузка должна быть одной из:

// вызов инструмента разрешен
{
  "behavior": "allow",
  "updatedInput": {...}, // обновленные входные данные или просто возврат исходных входных данных
}

// вызов инструмента запрещен
{
  "behavior": "deny",
  "message": "..." // читаемая человеком строка, объясняющая, почему разрешение было отклонено
}

Например, реализация MCP-инструмента запроса разрешений на TypeScript может выглядеть так:

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",
                }
          ),
        },
      ],
    };
  }
);

Чтобы использовать этот инструмент, добавьте свой MCP-сервер (например, с помощью --mcp-config), затем вызовите SDK следующим образом:

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

Примечания по использованию:

  • Используйте updatedInput, чтобы сообщить модели, что запрос разрешения изменил входные данные; в противном случае установите updatedInput на исходные входные данные, как в примере выше. Например, если инструмент показывает пользователю diff изменений файла и позволяет им вручную редактировать diff, инструмент запроса разрешений должен вернуть это обновленное изменение.
  • Полезная нагрузка должна быть в формате JSON-строки

Доступные опции CLI

SDK использует все опции CLI, доступные в Claude Code. Вот ключевые опции для использования SDK:

ФлагОписаниеПример
--print, -pЗапуск в неинтерактивном режимеclaude -p "query"
--output-formatУказать формат вывода (text, json, stream-json)claude -p --output-format json
--resume, -rВозобновить беседу по ID сессииclaude --resume abc123
--continue, -cПродолжить самую последнюю беседуclaude --continue
--verboseВключить подробное логированиеclaude --verbose
--max-turnsОграничить агентские ходы в неинтерактивном режимеclaude --max-turns 3
--system-promptПереопределить системный промпт (только с --print)claude --system-prompt "Custom instruction"
--append-system-promptДобавить к системному промпту (только с --print)claude --append-system-prompt "Custom instruction"
--allowedToolsСписок разрешенных инструментов через пробел, или

строка со списком разрешенных инструментов через запятую
claude --allowedTools mcp__slack mcp__filesystem

claude --allowedTools "Bash(npm install),mcp__filesystem"
--disallowedToolsСписок запрещенных инструментов через пробел, или

строка со списком запрещенных инструментов через запятую
claude --disallowedTools mcp__splunk mcp__github

claude --disallowedTools "Bash(git commit),mcp__github"
--mcp-configЗагрузить MCP-серверы из JSON-файлаclaude --mcp-config servers.json
--permission-prompt-toolMCP-инструмент для обработки запросов разрешений (только с --print)claude --permission-prompt-tool mcp__auth__prompt

Полный список опций CLI и функций см. в документации Использование CLI.

Форматы вывода

SDK поддерживает несколько форматов вывода:

Текстовый вывод (по умолчанию)

Возвращает только текст ответа:

$ claude -p "Explain file src/components/Header.tsx"
# Вывод: This is a React component showing...

Вывод JSON

Возвращает структурированные данные, включая метаданные:

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

Формат ответа:

{
  "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"
}

Потоковый вывод JSON

Передает каждое сообщение по мере его получения:

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

Каждый разговор начинается с начального системного сообщения init, за которым следует список сообщений пользователя и ассистента, а затем финальное системное сообщение result со статистикой. Каждое сообщение выводится как отдельный объект JSON.

Схема сообщений

Сообщения, возвращаемые из JSON API, строго типизированы в соответствии со следующей схемой:

type SDKMessage =
  // Сообщение ассистента
  | {
      type: "assistant";
      message: Message; // из SDK Anthropic
      session_id: string;
    }

  // Сообщение пользователя
  | {
      type: "user";
      message: MessageParam; // из SDK Anthropic
      session_id: string;
    }

  // Выводится как последнее сообщение
  | {
      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;
    }

  // Выводится как последнее сообщение, когда мы достигли максимального количества ходов
  | {
      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;
    }

  // Выводится как первое сообщение в начале разговора
  | {
      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";
    };

Скоро мы опубликуем эти типы в формате, совместимом с JSONSchema. Мы используем семантическое версионирование для основного пакета Claude Code, чтобы сообщать о критических изменениях в этом формате.

Типы Message и MessageParam доступны в SDK Anthropic. Например, см. SDK Anthropic для TypeScript и Python.

Примеры

Простая интеграция скриптов

#!/bin/bash

# Простая функция для запуска Claude и проверки кода выхода
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
}

# Примеры использования
run_claude "Write a Python function to read CSV files"
run_claude "Optimize this database query" "json"

Обработка файлов с помощью Claude

# Обработать файл через Claude
$ cat mycode.py | claude -p "Review this code for bugs"

# Обработать несколько файлов
$ for file in *.js; do
    echo "Processing $file..."
    claude -p "Add JSDoc comments to this file:" < "$file" > "${file}.documented"
done

# Использовать Claude в конвейере
$ grep -l "TODO" *.py | while read file; do
    claude -p "Fix all TODO items in this file" < "$file"
done

Управление сессиями

# Начать сессию и захватить ID сессии
$ claude -p "Initialize a new project" --output-format json | jq -r '.session_id' > session.txt

# Продолжить с той же сессией
$ claude -p --resume "$(cat session.txt)" "Add unit tests"

Лучшие практики

  1. Используйте формат вывода JSON для программного разбора ответов:

    # Разбор JSON-ответа с помощью jq
    result=$(claude -p "Generate code" --output-format json)
    code=$(echo "$result" | jq -r '.result')
    cost=$(echo "$result" | jq -r '.cost_usd')
    
  2. Обрабатывайте ошибки корректно - проверяйте коды выхода и stderr:

    if ! claude -p "$prompt" 2>error.log; then
        echo "Error occurred:" >&2
        cat error.log >&2
        exit 1
    fi
    
  3. Используйте управление сессиями для поддержания контекста в многоходовых разговорах

  4. Рассмотрите тайм-ауты для долго выполняющихся операций:

    timeout 300 claude -p "$complex_prompt" || echo "Timed out after 5 minutes"
    
  5. Соблюдайте ограничения скорости при выполнении нескольких запросов, добавляя задержки между вызовами

Реальные приложения

SDK Claude Code позволяет создавать мощные интеграции с вашим рабочим процессом разработки. Один из заметных примеров - GitHub Actions для Claude Code, который использует SDK для предоставления автоматизированного обзора кода, создания PR и сортировки проблем непосредственно в вашем рабочем процессе GitHub.

Связанные ресурсы