1. Go to this page and download the library: Download helgesverre/claude-code-sdk library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
helgesverre / claude-code-sdk example snippets
use HelgeSverre\ClaudeCode\ClaudeCode;
use HelgeSverre\ClaudeCode\Types\Messages\AssistantMessage;
use HelgeSverre\ClaudeCode\Types\Messages\SystemMessage;
use HelgeSverre\ClaudeCode\Types\Messages\ResultMessage;
use HelgeSverre\ClaudeCode\Types\ContentBlocks\TextBlock;
// Send a query to Claude
$messages = ClaudeCode::query("What files are in the current directory?");
// Process the streaming response
foreach ($messages as $message) {
match (true) {
$message instanceof SystemMessage =>
echo "[SYSTEM] {$message->subtype}\n",
$message instanceof AssistantMessage =>
array_map(function ($block) {
if ($block instanceof TextBlock) {
echo "[CLAUDE] {$block->text}\n";
}
}, $message->content),
$message instanceof ResultMessage =>
echo "[DONE] Cost: \${$message->totalCostUsd} | Time: {$message->durationMs}ms\n",
default => null
};
}
use HelgeSverre\ClaudeCode\ClaudeCode;
use HelgeSverre\ClaudeCode\Types\Config\Options;
use HelgeSverre\ClaudeCode\Types\Enums\PermissionMode;
$options = new Options(
systemPrompt: "You are a helpful coding assistant",
allowedTools: ['Read', 'Write', 'Edit'],
permissionMode: PermissionMode::acceptEdits,
maxTurns: 5,
);
/**
* A generator is returned, allowing you to stream messages as they are generated.
* @var Generator<HelgeSverre\ClaudeCode\Types\Messages\Message> $messages
*/
$messages = ClaudeCode::query("Help me refactor this code", $options);
foreach ($messages as $message) {
if ($message instanceof AssistantMessage) {
foreach ($message->content as $block) {
if ($block instanceof TextBlock) {
echo "[CLAUDE] {$block->text}\n";
}
}
} elseif ($message instanceof ResultMessage) {
echo "[DONE] Total Cost: \${$message->totalCostUsd}\n";
}
}
use HelgeSverre\ClaudeCode\Laravel\Facades\ClaudeCode;
// Simple query
$messages = ClaudeCode::query("Create a new Laravel controller");
// With custom options
$options = ClaudeCode::options()
->systemPrompt("You are a Laravel expert")
->allowedTools(['Read', 'Write', 'Edit'])
->maxTurns(10);
$messages = ClaudeCode::query("Help me build a REST API", $options);
use Illuminate\Support\Facades\App;
class MyService
{
private $claude;
public function __construct()
{
$this->claude = App::make('claude-code');
}
public function generateCode(string $prompt): void
{
$messages = $this->claude->query($prompt);
foreach ($messages as $message) {
// Process messages...
}
}
}
$options = new Options(
// System prompt to set context
systemPrompt: "You are a helpful assistant",
// Additional system prompt to append
appendSystemPrompt: "Always be concise",
// Tools Claude can use
allowedTools: ['Read', 'Write', 'Edit', 'Bash'],
// Tools Claude cannot use
disallowedTools: ['Delete'],
// Permission handling mode
permissionMode: PermissionMode::acceptEdits,
// Custom permission prompt tool
permissionPromptToolName: "MyCustomPrompt",
// Continue existing conversation
continueConversation: true,
// Resume from session ID
resume: "session-abc123",
// Maximum conversation turns
maxTurns: 10,
// Claude model to use
model: "claude-3-sonnet",
// Working directory
cwd: "/path/to/project",
// MCP server configurations
mcpServers: [
'my-server' => new \HelgeSverre\ClaudeCode\Types\ServerConfigs\StdioServerConfig('node', ['server.js']),
],
);
use HelgeSverre\ClaudeCode\Types\ServerConfigs\StdioServerConfig;
use HelgeSverre\ClaudeCode\Types\ServerConfigs\SSEServerConfig;
use HelgeSverre\ClaudeCode\Types\ServerConfigs\HTTPServerConfig;
$options = new Options(
mcpServers: [
// Stdio server
'filesystem' => new StdioServerConfig(
command: 'node',
args: ['mcp-server-filesystem.js'],
env: ['NODE_ENV' => 'production']
),
// SSE server
'weather' => new SSEServerConfig(
url: 'https://api.example.com/mcp/sse',
headers: ['Authorization' => 'Bearer token']
),
// HTTP server
'database' => new HTTPServerConfig(
url: 'https://api.example.com/mcp',
headers: ['API-Key' => 'secret']
),
]
);
use HelgeSverre\ClaudeCode\ClaudeCode;
use HelgeSverre\ClaudeCode\Types\Config\Options;
// Simple logging interceptor
$logger = function(string $event, mixed $data) {
echo "[{$event}] " . json_encode($data) . PHP_EOL;
};
$options = new Options(
interceptors: [$logger]
);
$messages = ClaudeCode::query("Help me code", $options);
use HelgeSverre\ClaudeCode\Examples\Interceptors\FileLoggerInterceptor;
$options = new Options(
interceptors: [
new FileLoggerInterceptor('/tmp/claude.log')
]
);
use HelgeSverre\ClaudeCode\Examples\Interceptors\MetricsInterceptor;
$options = new Options(
interceptors: [
new MetricsInterceptor() // Tracks token usage, costs, and timing
]
);
use HelgeSverre\ClaudeCode\Examples\Interceptors\WebhookInterceptor;
$options = new Options(
interceptors: [
new WebhookInterceptor('https://api.example.com/claude-events')
]
);
// In a service provider
$this->app->bind(Options::class, function ($app) {
$interceptors = [];
// Add logging if enabled
if (config('claude-code.logging.enabled')) {
$interceptors[] = new FileLoggerInterceptor(
storage_path('logs/claude-code.log')
);
}
// Add metrics collection
if (config('claude-code.metrics.enabled')) {
$interceptors[] = new MetricsInterceptor();
}
return new Options(
interceptors: $interceptors,
// ... other options
);
});
use HelgeSverre\ClaudeCode\ClaudeCode;
use HelgeSverre\ClaudeCode\Exceptions\CLINotFoundException;
use HelgeSverre\ClaudeCode\Exceptions\CLIConnectionException;
use HelgeSverre\ClaudeCode\Exceptions\ProcessException;
try {
$messages = ClaudeCode::query("Help me code");
} catch (CLINotFoundException $e) {
echo "Claude Code CLI not found. Install with: npm install -g @anthropic-ai/claude-code";
} catch (CLIConnectionException $e) {
echo "Failed to connect to Claude Code: {$e->getMessage()}";
} catch (ProcessException $e) {
echo "Process failed with exit code {$e->exitCode}: {$e->stderr}";
}