Claude Code SDKを使用すると、開発者はClaude Codeをプログラムでアプリケーションに統合できます。これにより、Claude Codeをサブプロセスとして実行し、Claudeの機能を活用したAIパワードのコーディングアシスタントやツールを構築する方法を提供します。

SDKは現在、コマンドライン使用をサポートしています。TypeScriptとPython SDKは近日公開予定です。

認証

Claude Code SDKを使用するには、専用のAPIキーを作成することをお勧めします:

  1. Anthropic ConsoleでAnthropic APIキーを作成します
  2. 次に、ANTHROPIC_API_KEY環境変数を設定します。このキーは安全に保存することをお勧めします(例:Githubのシークレットを使用)

基本的なSDKの使用方法

Claude Code SDKを使用すると、アプリケーションから非インタラクティブモードでClaude Codeを使用できます。基本的な例を以下に示します:

# 単一のプロンプトを実行して終了(プリントモード)
$ claude -p "フィボナッチ数を計算する関数を書いてください"

# パイプを使用して標準入力を提供
$ echo "このコードを説明して" | claude -p

# メタデータを含むJSON形式で出力
$ claude -p "hello world関数を生成して" --output-format json

# JSONの出力を到着次第ストリーミング
$ claude -p "Reactコンポーネントを構築して" --output-format stream-json

高度な使用方法

マルチターン会話

マルチターン会話では、会話を再開したり、最新のセッションから続行したりできます:

# 最新の会話を続行
$ 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 "あなたはシニアバックエンドエンジニアです。セキュリティ、パフォーマンス、保守性に焦点を当ててください。"

# 特定の要件を持つシステムプロンプト
$ claude -p "データベーススキーマを作成して" --system-prompt "あなたはデータベースアーキテクトです。PostgreSQLのベストプラクティスを使用し、適切なインデックス作成を含めてください。"

デフォルトのシステムプロンプトに指示を追加することもできます:

# システムプロンプトを追加(--printでのみ機能)
$ claude -p "REST APIを構築して" --append-system-prompt "コードを書いた後、必ず自分でコードレビューを行ってください。"

MCP設定

モデルコンテキストプロトコル(MCP)を使用すると、外部サーバーから追加のツールやリソースでClaude Codeを拡張できます。--mcp-configフラグを使用して、データベースアクセス、API統合、カスタムツールなどの特殊な機能を提供するMCPサーバーを読み込むことができます。

MCPサーバーを含むJSON設定ファイルを作成します:

{
  "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ツールは明示的に許可された場合にのみ使用されます。

カスタム権限プロンプトツール

オプションで、--permission-prompt-toolを使用して、ユーザーがモデルに特定のツールを呼び出す権限を付与するかどうかを確認するために使用するMCPツールを渡すことができます。モデルがツールを呼び出すと、次のことが起こります:

  1. まず権限設定をチェックします:すべてのsettings.jsonファイル、およびSDKに渡された--allowedTools--disallowedTools。これらのいずれかがツール呼び出しを許可または拒否する場合、ツール呼び出しを続行します
  2. それ以外の場合は、--permission-prompt-toolで提供したMCPツールを呼び出します

--permission-prompt-tool MCPツールにはツール名と入力が渡され、結果を含むJSON文字列化されたペイロードを返す必要があります。ペイロードは次のいずれかである必要があります:

// ツール呼び出しが許可される
{
  "behavior": "allow",
  "updatedInput": {...}, // 更新された入力、または元の入力をそのまま返す
}

// ツール呼び出しが拒否される
{
  "behavior": "deny",
  "message": "..." // 権限が拒否された理由を説明する人間が読める文字列
}

例えば、TypeScript MCP権限プロンプトツールの実装は次のようになります:

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を元の入力に設定します。例えば、ツールがファイル編集の差分をユーザーに表示し、手動で差分を編集できるようにする場合、権限プロンプトツールはその更新された編集を返す必要があります。
  • ペイロードはJSON文字列化する必要があります

利用可能なCLIオプション

SDKはClaude Codeで利用可能なすべてのCLIオプションを活用します。SDK使用のための主要なオプションは次のとおりです:

フラグ説明
--print, -p非インタラクティブモードで実行claude -p "クエリ"
--output-format出力形式を指定(textjsonstream-jsonclaude -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カンマ/スペース区切りの許可されたツールリスト(MCPツールを含む)claude --allowedTools "Bash(npm install),mcp__filesystem"
--disallowedToolsカンマ/スペース区切りの拒否されたツールリストclaude --disallowedTools "Bash(git commit),mcp__github"
--mcp-configJSONファイルからMCPサーバーを読み込むclaude --mcp-config servers.json
--permission-prompt-tool権限プロンプトを処理するMCPツール(--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",
  "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";
      cost_usd: float;
      duration_ms: float;
      duration_api_ms: float;
      is_error: boolean;
      num_turns: int;
      result: string;
      session_id: string;
    }

  // 最大ターン数に達した場合、最後のメッセージとして出力される
  | {
      type: "result";
      subtype: "error_max_turns";
      cost_usd: float;
      duration_ms: float;
      duration_api_ms: float;
      is_error: boolean;
      num_turns: int;
      session_id: string;
    }

  // 会話の開始時に最初のメッセージとして出力される
  | {
      type: "system";
      subtype: "init";
      session_id: string;
      tools: string[];
      mcp_servers: {
        name: string;
        status: string;
      }[];
    };

これらの型はまもなくJSONSchema互換形式で公開される予定です。このフォーマットの破壊的変更を伝えるために、メインのClaude Codeパッケージではセマンティックバージョニングを使用しています。

MessageMessageParamの型はAnthropic SDKで利用可能です。例えば、AnthropicのTypeScriptPythonのSDKを参照してください。

シンプルなスクリプト統合

#!/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 "CSVファイルを読み込むPython関数を書いて"
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を使用
$ 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出力形式を使用する

    # jqでJSONレスポンスを解析
    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を使用して、GitHubワークフロー内で直接自動コードレビュー、PR作成、課題トリアージ機能を提供します。

関連リソース