ClaudeWork の REST API とWebSocket API の概要です。
GET /api/projectsPOST /api/projects
Content-Type: application/json
{
"path": "/path/to/git/repo"
}DELETE /api/projects/{id}リモートGitリポジトリをクローンしてプロジェクトとして登録します。
POST /api/projects/clone
Content-Type: application/json
{
"url": "git@github.com:user/repo.git",
"name": "optional-name",
"cloneLocation": "docker",
"githubPatId": "pat-uuid"
}パラメータ:
url(required): リモートリポジトリURL(SSH または HTTPS)name(optional): プロジェクト名。未指定時はURLから自動抽出cloneLocation(optional):docker|host(デフォルト:docker)githubPatId(optional): GitHub PAT ID(HTTPS プライベートリポジトリ用)
レスポンス (201):
{
"project": {
"id": "uuid",
"name": "repo",
"path": "/docker-volumes/claude-repo-{id}",
"remote_url": "git@github.com:user/repo.git",
"clone_location": "docker"
}
}エラー:
- 400: 無効なURL形式
- 409: 同じURLのプロジェクトが既に存在
- 500: クローン失敗
リモートリポジトリから最新の変更を取得します。
POST /api/projects/{id}/pullレスポンス (200):
{
"success": true,
"updated": true,
"message": "Successfully pulled from remote"
}エラー:
- 400: リモートURLが未設定
- 404: プロジェクトが存在しない
- 500: Pull失敗
プロジェクトのブランチ一覧を取得します。
GET /api/projects/{id}/branchesレスポンス (200):
{
"branches": [
{
"name": "main",
"isDefault": true,
"isRemote": false
},
{
"name": "feature-branch",
"isDefault": false,
"isRemote": false
},
{
"name": "origin/main",
"isDefault": false,
"isRemote": true
}
]
}エラー:
- 404: プロジェクトが存在しない
- 500: ブランチ取得失敗
GET /api/projects/{id}/sessionsPOST /api/projects/{id}/sessions
Content-Type: application/json
{
"name": "session-name",
"prompt": "initial prompt",
"environment_id": "docker-env-id",
"source_branch": "main",
"claude_code_options": {
"model": "claude-opus-4-5"
},
"custom_env_vars": {
"MY_VAR": "value"
}
}パラメータ:
name(optional): セッション名。未指定時は自動生成prompt(optional): 初期プロンプトenvironment_id(optional): 実行環境ID。プロジェクトにenvironment_idが設定されていない場合に有効source_branch(optional): 作業ブランチ名。未指定時はデフォルトブランチclaude_code_options(optional): Claude Code CLIオプション(model,allowedTools,permissionMode,additionalFlags)custom_env_vars(optional): カスタム環境変数(キーは^[A-Z_][A-Z0-9_]*$形式)dockerMode(deprecated): Docker モードで実行。environment_idを優先使用してください
実行環境の決定優先順位:
- プロジェクトの
environment_id(設定済みの場合は最優先) - リクエストの
environment_id(プロジェクトに設定がない場合) - プロジェクトの
clone_locationに基づく自動選択(docker→デフォルトDocker環境) dockerMode=true(レガシー互換)
DELETE /api/sessions/{id}GET /api/sessions/{id}/diffPOST /api/sessions/{id}/rebasePOST /api/sessions/{id}/merge
Content-Type: application/json
{
"commit_message": "Merge commit message"
}GET /api/environments
GET /api/environments?includeStatus=trueレスポンス:
{
"environments": [
{
"id": "host-default",
"name": "Local Host",
"type": "HOST",
"description": "ローカル環境で直接実行",
"config": "{}",
"is_default": true,
"status": {
"available": true,
"authenticated": true
}
}
]
}POST /api/environments
Content-Type: application/json
{
"name": "My Docker Env",
"type": "DOCKER",
"description": "開発用Docker環境"
}環境タイプ:
HOST: ローカル環境で直接実行DOCKER: Dockerコンテナ内で実行(認証分離)SSH: リモートサーバーで実行(未実装)
GET /api/environments/{id}
GET /api/environments/{id}?includeStatus=truePUT /api/environments/{id}
Content-Type: application/json
{
"name": "Updated Name",
"description": "Updated description"
}DELETE /api/environments/{id}注意:
- デフォルト環境は削除できません(400エラー)
- 使用中のセッションがある場合は409エラー
GET /api/projects/{id}/scriptsPOST /api/sessions/{id}/execute
Content-Type: application/json
{
"script_id": "script-uuid"
}Claude Code との対話用ターミナルセッション。XTerm.js と連携し、Claude Code の対話モードを直接操作します。
ws://localhost:3000/ws/claude/{sessionId}メッセージ形式:
クライアント → サーバー:
{
"type": "input",
"data": "user input text"
}{
"type": "resize",
"cols": 80,
"rows": 24
}{
"type": "restart"
}サーバー → クライアント:
{
"type": "data",
"content": "raw terminal output from Claude Code"
}{
"type": "exit",
"exitCode": 0
}特徴:
- Claude Code は対話モードで起動(
--printフラグなし) - ターミナル出力は加工なしでクライアントに送信
- XTerm.js がターミナルエミュレーションを担当
- リサイズメッセージでターミナルサイズを同期
セッションイベントとスクリプト実行用。
ws://localhost:3000/ws/sessions/{id}メッセージ形式:
クライアント → サーバー:
{
"type": "input",
"content": "user message"
}サーバー → クライアント:
{
"type": "output",
"content": "script output"
}シェルセッション用(bash/zsh等)。
ws://localhost:3000/ws/terminal/{id}メッセージ形式:
クライアント → サーバー:
{
"type": "input",
"data": "ls -la\n"
}サーバー → クライアント:
{
"type": "data",
"content": "total 48\ndrwxr-xr-x ..."
}