Claude Code SDK for Ruby

Unofficial Ruby SDK for Claude Code. See the Claude Code SDK documentation for more information.

Installation

Add this line to your application's Gemfile:

gem 'claude_code'

And then execute:

bundle install

Or install it yourself as:

gem install claude_code

Prerequisites:

  • Ruby 3.0+
  • Node.js
  • Claude Code: npm install -g @anthropic-ai/claude-code

Quick Start

require 'claude_code'

# Simple query
ClaudeCode.query(prompt: "What is 2 + 2?").each do |message|
  puts message
end

Usage

Authentication

First, set your API key:

export ANTHROPIC_API_KEY='your-api-key-here'

Or for Amazon Bedrock:

export CLAUDE_CODE_USE_BEDROCK=1
export AWS_ACCESS_KEY_ID='your-access-key'
export AWS_SECRET_ACCESS_KEY='your-secret-key'  
export AWS_REGION='us-west-2'

Or for Google Vertex AI:

export CLAUDE_CODE_USE_VERTEX=1
export GOOGLE_APPLICATION_CREDENTIALS='path/to/service-account.json'
export GOOGLE_CLOUD_PROJECT='your-project-id'

Basic Query

require 'claude_code'

# Simple query
ClaudeCode.query(prompt: "Hello Claude").each do |message|
  if message.is_a?(ClaudeCode::AssistantMessage)
    message.content.each do |block|
      if block.is_a?(ClaudeCode::TextBlock)
        puts block.text
      end
    end
  end
end

# With options
options = ClaudeCode::ClaudeCodeOptions.new(
  system_prompt: "You are a helpful assistant",
  max_turns: 1
)

ClaudeCode.query(prompt: "Tell me a joke", options: options).each do |message|
  puts message
end

Conversation Resuming

# Continue the most recent conversation
ClaudeCode.continue_conversation("What did we just discuss?").each do |message|
  # Process messages...
end

# Resume a specific conversation by session ID
session_id = "550e8400-e29b-41d4-a716-446655440000"
ClaudeCode.resume_conversation(session_id, "Continue our discussion").each do |message|
  # Process messages...
end

# Continue with options
options = ClaudeCode::ClaudeCodeOptions.new(max_turns: 2)
ClaudeCode.continue_conversation("Add more details", options: options)

Streaming JSON Input

For multi-turn conversations without restarting the CLI, use streaming JSON input:

# Create multiple user messages for a conversation
messages = [
  ClaudeCode::JSONLHelpers.create_user_message("Hello! I'm working on a Ruby project."),
  ClaudeCode::JSONLHelpers.create_user_message("Can you help me understand modules?"),
  ClaudeCode::JSONLHelpers.create_user_message("Show me a practical example.")
]

# Process all messages in a single streaming session
ClaudeCode.stream_json_query(messages) do |message|
  case message
  when ClaudeCode::AssistantMessage
    message.content.each do |block|
      puts block.text if block.is_a?(ClaudeCode::TextBlock)
    end
  when ClaudeCode::ResultMessage
    puts "Cost: $#{message.total_cost_usd}"
  end
end

# Manual JSONL format (equivalent to CLI)
custom_messages = [
  {
    'type' => 'user',
    'message' => {
      'role' => 'user',
      'content' => [{'type' => 'text', 'text' => 'Explain this code'}]
    }
  }
]

ClaudeCode.stream_json_query(custom_messages)

Using Tools

options = ClaudeCode::ClaudeCodeOptions.new(
  allowed_tools: ["Read", "Write", "Bash"],
  permission_mode: 'acceptEdits'  # auto-accept file edits
)

ClaudeCode.query(
  prompt: "Create a hello.rb file",
  options: options
).each do |message|
  # Process tool use and results
end

Working Directory

options = ClaudeCode::ClaudeCodeOptions.new(
  cwd: "/path/to/project"
)

API Reference

Core Methods

ClaudeCode.query(prompt:, options: nil, cli_path: nil, mcp_servers: {})

Main function for querying Claude.

Parameters:

  • prompt (String): The prompt to send to Claude
  • options (ClaudeCodeOptions): Optional configuration
  • cli_path (String): Optional path to Claude CLI binary
  • mcp_servers (Hash): Optional MCP server configurations

Returns: Enumerator of response messages

ClaudeCode.continue_conversation(prompt = nil, options: nil, cli_path: nil, mcp_servers: {})

Continue the most recent conversation.

Parameters:

  • prompt (String): Optional new prompt to add
  • options (ClaudeCodeOptions): Optional configuration
  • cli_path (String): Optional path to Claude CLI binary
  • mcp_servers (Hash): Optional MCP server configurations

Returns: Enumerator of response messages

ClaudeCode.resume_conversation(session_id, prompt = nil, options: nil, cli_path: nil, mcp_servers: {})

Resume a specific conversation by session ID.

Parameters:

  • session_id (String): The session ID to resume
  • prompt (String): Optional new prompt to add
  • options (ClaudeCodeOptions): Optional configuration
  • cli_path (String): Optional path to Claude CLI binary
  • mcp_servers (Hash): Optional MCP server configurations

Returns: Enumerator of response messages

ClaudeCode.stream_query(prompt:, options: nil, cli_path: nil, mcp_servers: {}, &block)

Stream query responses with auto-formatting or custom block handling.

ClaudeCode.stream_json_query(messages, options: nil, cli_path: nil, mcp_servers: {})

Send multiple messages via streaming JSON input (JSONL format). This allows multiple turns of conversation without re-launching the Claude binary.

Parameters:

  • messages (Array): Array of JSONL message objects
  • options (ClaudeCodeOptions): Optional configuration (automatically sets input_format: 'stream-json')
  • cli_path (String): Optional path to Claude CLI binary
  • mcp_servers (Hash): Optional MCP server configurations

Returns: Enumerator of response messages

ClaudeCode.quick_mcp_query(prompt, server_name:, server_url:, tools:, **options)

Ultra-convenient method for quick MCP server usage.

ClaudeCode.add_mcp_server(name, config)

Helper to create MCP server configurations.

JSONL Helpers

ClaudeCode::JSONLHelpers.create_user_message(text)

Create a user message in the format expected by Claude CLI.

ClaudeCode::JSONLHelpers.create_conversation(*turns)

Create multiple user messages from text strings.

ClaudeCode::JSONLHelpers.format_messages_as_jsonl(messages)

Format multiple messages as JSONL string.

Types

See lib/claude_code_sdk/types.rb for complete type definitions:

  • ClaudeCodeOptions - Configuration options
  • AssistantMessage, UserMessage, SystemMessage, ResultMessage - Message types
  • TextBlock, ToolUseBlock, ToolResultBlock - Content blocks

Error Handling

begin
  ClaudeCode.query(prompt: "Hello").each do |message|
    # Process message
  end
rescue ClaudeCode::CLINotFoundError
  puts "Please install Claude Code"
rescue ClaudeCode::ProcessError => e
  puts "Process failed with exit code: #{e.exit_code}"
rescue ClaudeCode::CLIJSONDecodeError => e
  puts "Failed to parse response: #{e}"
end

See lib/claude_code_sdk/errors.rb for all error types.

Available Tools

See the Claude Code documentation for a complete list of available tools.

Examples

See examples/quick_start.rb for a complete working example.

License

MIT