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

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

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

Claude Code SDK поддерживает несколько методов аутентификации:

API-ключ Anthropic

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

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

Учетные данные сторонних API

SDK также поддерживает сторонних поставщиков API:

  • Amazon Bedrock: Установите переменную окружения CLAUDE_CODE_USE_BEDROCK=1 и настройте учетные данные AWS
  • Google Vertex AI: Установите переменную окружения CLAUDE_CODE_USE_VERTEX=1 и настройте учетные данные Google Cloud

Для подробных инструкций по настройке сторонних поставщиков см. документацию Amazon Bedrock и Google Vertex AI.

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

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

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

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

# Выполнить один запрос и выйти (режим печати)
$ claude -p "Напиши функцию для вычисления чисел Фибоначчи"

# Использование pipe для предоставления stdin
$ echo "Объясни этот код" | claude -p

# Вывод в формате JSON с метаданными
$ claude -p "Сгенерируй функцию hello world" --output-format json

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

TypeScript

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

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

const messages: SDKMessage[] = [];

for await (const message of query({
  prompt: "Напиши хайку о foo.py",
  abortController: new AbortController(),
  options: {
    maxTurns: 3,
  },
})) {
  messages.push(message);
}

console.log(messages);

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

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

Python

Python SDK доступен как 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="Напиши хайку о foo.py",
        options=ClaudeCodeOptions(max_turns=3)
    ):
        messages.append(message)
    
    print(messages)

anyio.run(main)

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

from claude_code_sdk import query, ClaudeCodeOptions
from pathlib import Path

options = ClaudeCodeOptions(
    max_turns=3,
    system_prompt="Ты полезный помощник",
    cwd=Path("/path/to/project"),  # Может быть строкой или Path
    allowed_tools=["Read", "Write", "Bash"],
    permission_mode="acceptEdits"
)

async for message in query(prompt="Привет", options=options):
    print(message)

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

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

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

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

# Продолжить самый последний разговор
$ claude --continue

# Продолжить и предоставить новый запрос
$ claude --continue "Теперь отрефактори это для лучшей производительности"

# Возобновить конкретный разговор по ID сессии
$ claude --resume 550e8400-e29b-41d4-a716-446655440000

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

# Продолжить в режиме печати (неинтерактивный)
$ claude -p --continue "Добавь обработку ошибок"

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

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

# Переопределить системный запрос (работает только с --print)
$ claude -p "Создай REST API" --system-prompt "Ты старший backend-инженер. Сосредоточься на безопасности, производительности и поддерживаемости."

# Системный запрос с конкретными требованиями
$ claude -p "Создай схему базы данных" --system-prompt "Ты архитектор баз данных. Используй лучшие практики PostgreSQL и включи правильную индексацию."

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

# Добавить системный запрос (работает только с --print)
$ claude -p "Создай REST API" --append-system-prompt "После написания кода обязательно проведи код-ревью самостоятельно."

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

Model Context Protocol (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 "Перечисли все файлы в проекте" --mcp-config mcp-servers.json

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

# Используй MCP-инструмент для обработки запросов разрешений в неинтерактивном режиме
$ claude -p "Разверни приложение" \
  --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-строковый payload с результатом. Payload должен быть одним из:

// вызов инструмента разрешен
{
  "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",
  'Симулировать проверку разрешений - одобрить, если входные данные содержат "allow", иначе отклонить',
  {
    tool_name: z.string().describe("Инструмент, запрашивающий разрешение"),
    input: z.object({}).passthrough().describe("Входные данные для инструмента"),
  },
  async ({ tool_name, input }) => {
    return {
      content: [
        {
          type: "text",
          text: JSON.stringify(
            JSON.stringify(input).includes("allow")
              ? {
                  behavior: "allow",
                  updatedInput: input,
                }
              : {
                  behavior: "deny",
                  message: "Разрешение отклонено тестовым инструментом approval_prompt",
                }
          ),
        },
      ],
    };
  }
);

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

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

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

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

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

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

ФлагОписаниеПример
--print, -pЗапуск в неинтерактивном режимеclaude -p "запрос"
--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 "Пользовательская инструкция"
--append-system-promptДобавить к системному запросу (только с --print)claude --append-system-prompt "Пользовательская инструкция"
--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 "Объясни файл src/components/Header.tsx"
# Вывод: Это React-компонент, показывающий...

JSON-вывод

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

$ claude -p "Как работает слой данных?" --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": "Текст ответа здесь...",
  "session_id": "abc123"
}

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

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

$ claude -p "Создай приложение" --output-format stream-json

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

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

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

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

  // Пользовательское сообщение
  | {
      type: "user";
      message: MessageParam; // из Anthropic SDK
      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 доступны в Anthropic SDK. Например, см. Anthropic TypeScript и Python SDK.

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

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

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

Входной текст может быть предоставлен как аргумент:

$ claude -p "Объясни этот код"

Или входной текст может быть передан через stdin:

$ echo "Объясни этот код" | claude -p

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

Поток сообщений, предоставляемый через stdin, где каждое сообщение представляет пользовательский ход. Это позволяет несколько ходов разговора без перезапуска бинарного файла claude и позволяет предоставлять руководство модели во время обработки запроса.

Каждое сообщение является JSON-объектом ‘Пользовательское сообщение’, следующим тому же формату, что и схема выходных сообщений. Сообщения форматируются с использованием формата jsonl, где каждая строка ввода является полным JSON-объектом. Потоковый JSON-ввод требует -p и --output-format stream-json.

В настоящее время это ограничено только текстовыми пользовательскими сообщениями.

$ echo '{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Объясни этот код"}]}}' | claude -p --output-format=stream-json --input-format=stream-json --verbose

Примеры

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

#!/bin/bash

# Простая функция для запуска Claude и проверки кода выхода
run_claude() {
    local prompt="$1"
    local output_format="${2:-text}"

    if claude -p "$prompt" --output-format "$output_format"; then
        echo "Успех!"
    else
        echo "Ошибка: Claude завершился с кодом выхода $?" >&2
        return 1
    fi
}

# Примеры использования
run_claude "Напиши Python-функцию для чтения CSV-файлов"
run_claude "Оптимизируй этот запрос к базе данных" "json"

Обработка файлов с Claude

# Обработать файл через Claude
$ cat mycode.py | claude -p "Проверь этот код на баги"

# Обработать несколько файлов
$ for file in *.js; do
    echo "Обрабатываю $file..."
    claude -p "Добавь JSDoc-комментарии к этому файлу:" < "$file" > "${file}.documented"
done

# Использовать Claude в pipeline
$ grep -l "TODO" *.py | while read file; do
    claude -p "Исправь все TODO-элементы в этом файле" < "$file"
done

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

# Начать сессию и захватить ID сессии
$ claude -p "Инициализируй новый проект" --output-format json | jq -r '.session_id' > session.txt

# Продолжить с той же сессией
$ claude -p --resume "$(cat session.txt)" "Добавь юнит-тесты"

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

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

    # Парсить JSON-ответ с jq
    result=$(claude -p "Сгенерируй код" --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 "Произошла ошибка:" >&2
        cat error.log >&2
        exit 1
    fi
    
  3. Используйте управление сессиями для поддержания контекста в многоходовых разговорах

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

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

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

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

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