SandBase Harness について
SandBase Harness は、ローカルファーストの AI エージェント向けランタイムです。セッション、サンドボックス化されたツール、メモリ、認証情報、監査ログ、内蔵コンソールを備えています。自社環境でエージェントを持続的に実行し、動作を確認したいチームに適しています。
主な機能
- 01/v1 API と内蔵コンソールを備えたローカルランタイム
- 02既定で SQLite によるメタデータ保存
- 03セッションの再生に対応した Server-Sent Events
- 04ローカル、Docker、Kubernetes のサンドボックスバックエンド
- 05MCP ツールセットと権限ポリシー、承認機能
活用シーン
- 01ローカルまたはセルフホスト環境での長時間のエージェントセッション実行
- 02エージェントの実行過程の監査と再生
- 03MCP ツールセットと認証情報ストアによるツールアクセスの制御
MCP 対応
ランタイムはエージェントに MCP ツールセットを提供し、権限ポリシーと承認ゲートによってそれらのツールへのアクセスを管理します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e MANAGED_AGENTS_URL -e MANAGED_AGENTS_API_KEY ghcr.io/sandbaseai/sandbase-harness-mcp:0.3.8MANAGED_AGENTS_URLURL of the SandBase Harness runtime API.MANAGED_AGENTS_API_KEYシークレットAPI key when the connected Harness runtime requires authentication.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/sandbaseai/sandbase-harness-mcp:0.3.8stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
SandBase Harness
AI が読み取りやすいプロジェクトメタデータ:llms.txt · インストールガイド
AI エージェント向けのローカルファーストなランタイムです。セッション、サンドボックス化されたツール、メモリー、認証情報、監査証跡、組み込みのコンソールを、すべてお使いのマシンまたは独自のインフラストラクチャ上で実行できます。
理由
エージェント SDK はモデルのループを処理します。本番環境のエージェントには、永続セッション、ツールガバナンス、サンドボックス境界、認証情報の処理、メモリー、監査可能性、そして人間が動作を確認するための UI も必要です。managed-agents はそのランタイムレイヤーであり、ビジュアルワークフロービルダーでも、新たなモデル SDK でもありません。
| 必要な機能 | Harness が提供するもの |
|---|---|
| 生成されたコードを安全に実行する | ローカル、Docker、Kubernetes、セルフホスト可能なワーカーのサンドボックス |
| 長時間稼働するエージェントを調査する | 永続セッション、再開可能なイベントストリーム、監査、再生 |
| ツールへのアクセスを制御する | MCP ツールセット、認証情報ボルト、権限ポリシー、承認 |
| あらゆるモデルを運用する | DeepSeek V4 を含む、OpenAI、Anthropic、MiniMax、および OpenAI 互換プロバイダー |
| インフラストラクチャを自分で管理する | 必須のホスト型コントロールプレーンを必要としない、ローカルファーストの SQLite とファイルストレージ |
機能
- Claude Managed Agents スタイルの
/v1API とローカルコンソール - エージェント、セッション、環境、認証情報ボルト、メモリーストア、ファイル、スキル、API キーのメタデータには、デフォルトで SQLite を使用します — ローカルのファイル/スキルデータはワークスペースの状態ディレクトリに保存されます
- セッションの再生とデバッグに対応する、再開可能な Server-Sent Events
- Settings V2 で設定する、単一のアクティブなモデルプロバイダー境界
- サンドボックスバックエンド:ローカルプロセス、Docker(セッションごとのコンテナ)、Kubernetes(kubectl exec/cp)、セルフホスト可能なワーカーキュー
- MCP ツールセット、権限ポリシー、組み込みツール、スキルパッケージ
managed-agents/sdkにある TypeScript SDK- リリースゲート:
npm run release:check
クイックスタート
必要条件:Node.js 22 以降、npm 10 以降、およびモデルプロバイダーの API キー(OpenAI、 Anthropic、MiniMax、または OpenAI 互換エンドポイント)。Docker は任意で、 Docker を利用するサンドボックスでのみ必要です。
git clone --branch v0.3.8 --depth 1 https://github.com/sandbaseai/sandbase-harness.git
cd sandbase-harness
npm ci
npm run build
mkdir ../my-agents && cd ../my-agents
node ../sandbase-harness/dist/index.js init
node ../sandbase-harness/dist/index.js start
init は、実行したディレクトリにエージェント、スキルフォルダー、
${OPENAI_API_KEY} 環境変数をプロバイダー参照先とする config.yaml を含むワークスペースを書き込みます。start は API とコンソールを
http://127.0.0.1:3000 で起動します。
セットアップを完了するには、http://127.0.0.1:3000/dashboard の Settings > Setup で、次の 2 つの手順を行います。
- プロバイダー。 プロバイダーフォームに API キーを貼り付けて保存します。保存した設定はまだ有効ではないとページに表示されるため、ランタイムを再起動してください。Ctrl+C で停止して
startコマンドを再度実行するか、再起動ボタンを使用します。保存した設定は起動時にのみ反映されます。プロバイダーが一覧にない場合は、OpenAI 互換のベンダーを選択し、ベース URL を設定してください。 - モデル。 Agent models パネルで、プロバイダーが実際に提供するモデル ID を設定します。たとえば、DeepSeek の場合は
deepseek-chatです。エージェントはそれぞれ独自のモデル ID を持つため、initが書き込むgpt-4oがすべてのプロバイダーで有効とは限りません。誤った ID を指定すると、ターンはmodel_not_foundで失敗します。
最初のメッセージはコンソールから送信できます。Sessions を開き、エージェントのセッションを作成して、入力欄にメッセージを入力します。ターミナルからなら、次の 1 つのコマンドで実行できます。
node ../sandbase-harness/dist/index.js chat agent_assistant --message "hello" --tool-approval allow
chat はメッセージを 1 件送信し、ターンの処理が完了すると終了します。--message を指定しない場合はセッションを開いたままにして、割り込みを受けるまでストリーミングを続けます。
--tool-approval allow
は、エージェントが実行できるツール呼び出しを事前に許可します。init のテンプレートでは、それ以外の場合、ツール呼び出しは承認待ちとなり、人による回答を待ちます。詳しくはCLIを参照してください。
npm にあるスコープなしの managed-agents という名前は、このプロジェクトのものではありません。このリポジトリで公式のスコープ付きパッケージが発表されるまでは、上記に示すタグ付きの GitHub ソースリリースからのみインストールしてください。npx managed-agents や
npm install managed-agents は実行しないでください。
Codespaces で試す
付属の開発用コンテナーが依存関係をインストールし、ランタイムをビルドします。 ターミナルの準備ができたら、転送されたポートでサーバーを起動してください。
node dist/index.js start --host 0.0.0.0
転送された SandBase Harness Console ポートを開き、Settings > Setup でモデルを設定してください。Codespaces の利用には GitHub の料金が発生する場合があります。上記のローカルでのクイックスタートは引き続き無料で、すべてのランタイムデータをお使いのマシンに保存します。
スクリーンショット
| コンソールの概要 | 設定 | API リファレンス |
|---|---|---|
![]() | ![]() | ![]() |
公式 SDK を使用する
ランタイムは同じポートで独自の /v1 API に応答し、公式の Anthropic TypeScript SDK クライアントを変更せずに使用できます。クライアントの
baseURL をランタイムに設定し、ランタイムの API キーを渡すと、
examples/official-sdk のクイックスタートで、メッセージ、ツール呼び出し、ツールの結果、最終応答まで、一連のターン全体を実行できます。この例は各プルリクエストで
tests/conformance/official-sdk-quickstart.test.ts によって実行されるため、ここで説明する互換性は、単なる主張ではなくテストによって確認されています。
同じインターフェースは docs/api.md に仕様が記載されています。また、このリポジトリ独自の TypeScript SDK については、以下の SDK を参照してください。
CMA 互換性
公開されている Claude Managed Agents の仕様への対応状況は、
src/core/capabilities/matrix.ts でエントリーごとに宣言されています。公式 SDK のルート一覧(SDK
0.131.0 時点で 110 個のメソッド/パスの組み合わせ)のうち、90 個のルートがマウントされ、20 個は名前を明示して拒否されます。保留中のルートはありません。
Partial と Unsupported のエントリーには、必ずその理由が記載されています。
以下の表は npm run docs:compat によって生成されます。マトリックスとの不一致が生じると、契約の整合性を確認するテストが失敗します。
互換性表の全体(自動生成)
| 領域 | 公式機能 | ステータス | 備考 | | --- | --- | --- | --- | | headers | `compatibility-header-admission` | 部分対応 | 互換性ヘッダーを含むすべてのリクエストに対し、バージョン、ベータ版、相互排他のルールを適用します。互換性ヘッダーのないリクエストはローカル呼び出し元として受け付けますが、公開仕様では定義されていません。このヘッダーなしの経路は、セルフホスト可能なシングルテナントランタイム向けに意図的に追加したローカルファーストの拡張であり、headers contract §4 にその旨を記録しています。そのため、この項目は部分対応のままです。 | | headers | `extension-namespace-exclusion` | 対応 | | | pagination | `opaque-cursors` | 部分対応 | コレクションのエンベロープはマウント先に従います。operations ルーターは `/v1` で `{data, prev_page, next_page}` を、`/v1/x` ミラーではローカル形式の `{data, has_more, first_id, last_id}` を返します。単一のページャーで形式を選択するため、どのハンドラーも両方の形式を返すことはありません。また、カーソルは不透明なバイナリではなく、読み取り可能な base64url JSON です。すべての正規 `/v1` コレクションは例外なく正規エンベロープを返します。全件リストでは `{data, prev_page: null, next_page: null}` を返し、ウィンドウ表示のリストでは後続ページに進めるカーソルを返します。`/v1/sessions` は `{order, created_at bounds, page}` によるページ番号でページングし、別の並び順または作成期間で再利用されたカーソルを拒否します。`/v1/sessions/{id}/events` は `{order, filter, after_id}` を、`/v1/skills` と認証情報の監査リストは `{offset, filter}` を使用するため、途中で切られたページは、全件揃っているように見えず、そのことが明示されます。これらどちらの形式にも該当しない唯一のリストは `/v1/environments/{id}/work-items` です。これは `counts` オブジェクトを追加するウィンドウ表示の拡張で、仕様に記載されています。 | | pagination | `cursor-query-binding` | 対応 | | | errors | `structured-error-envelope` | 対応 | | | agents | `agent-crud` | 対応 | | | agents | `model-object-profile` | 部分対応 | 文字列形式とオブジェクト形式のモデルを、フィールドごとに解析します。`effort` と `speed` は保存され、読み取りプロジェクション(エージェントの読み取り、バージョンの読み取り、セッションスナップショット)で返され、モデル機能テーブルに基づいて Anthropic プロバイダーで実行されます。`effort` は `output_config.effort` に変換され、`fast` は fast-mode ベータ版とともに `speed: "fast"` に変換されます。また、adaptive-thinking モデルには `thinking: {type: "adaptive", display: "omitted"}` が設定されます。登録済みのモデルに指定できないレベルまたは速度を指定すると、受け付け時に拒否されます。不明なモデル ID または Anthropic 以外のプロバイダーでは何も送信されません。デプロイメント独自の `reasoning_effort` モデル設定は、これとは別のオペレーターレベルの設定です。`inference_geo` は、このランタイムに推論地理の制御機能がないため、`unsupported_model_field` としてフィールド名を示して拒否されます。また、正規の `multiagent` 名簿も実行せず、フィールド名を示して拒否されます。 | | agents | `multiagent-roster` | 非対応 | 正規の `multiagent` 名簿は、エージェントの作成と更新のどちらでも、フィールド名を示して拒否されます。これを有効にできるスレッド、コーディネーター、アドバイザーのインターフェースがないためです。受け付けると、呼び出し元に名簿による委譲が有効になっていると思わせるおそれがあります。ローカル委譲は別の拡張として登録されています。 | | agents | `local-delegation-subagent` | 対応 | | | sessions | `session-lifecycle` | 対応 | | | sessions | `initial-events` | 対応 | | | sessions | `prompt-caching` | 対応 | | | sessions | `session-update` | 対応 | | | budget | `session-budget` | 部分対応 | 使用量は追記専用ログに基づいて整数のマイクロセントで価格計算され、セッションの作成時に `max_list_cost` の上限を指定できます。組み込みループはターン内で上限を確認します。上限を超えたステップが最後のステップとなり、セッションは `stop_reason budget_reached` でアイドル状態になり、その直前の `session.usage` が記録されます。予算の更新または削除が受け付けられると、セッションは自動的に再開します。上限によって中断されたツール呼び出しは精算されるため、再開後のターンで対応するトランスクリプトが揃います。上限に達すると、次の作業を開始するイベントは `budget_reached` で拒否されますが、すでに進行中の作業を精算するイベントは引き続き受け付けられるため、次のモデルリクエストは開始されません。宣言済みアウトカムの改訂ループも同じ使用額を参照し、上限で停止します。ループのターンはすでに受け付け済みのイベント内で行われるため、追加の評価パスやターンを開始せず、結果を `budget_reached` としてアウトカムを終了します。意図的な差異が2点あります。価格は公式の掲載価格ではなく、オペレーターが指定するコストプロファイルに基づくため、プロファイルで価格を計算できないモデルを使用するセッションには予算を設定できず、未価格設定のモデルが使用された場合は `usage.list_cost` を返しません。また、一時停止はセッション自身の `status_idle` でのみ報告されます。公開されているスレッドレベルの `budget_reached` シグナルは、このランタイムで実装していないスレッドインターフェースに属するためです。 | | events | `append-only-event-log` | 対応 | | | events | `processed-at-lifecycle` | 対応 | | | events | `session-error-structure` | 対応 | | | events | `error-enum-completeness` | 対応 | | | events | `model-request-span-pair` | 対応 | | | streaming | `resumable-sse` | 対応 | | | streaming | `agent-message-stream-preview` | 対応 | | | tools | `builtin-tool-execution` | 対応 | | | tools | `web-fetch-execution` | 部分対応 | WebFetch は HTTP/HTTPS 経由で実行され、ドメインポリシー、リダイレクトごとの再検証、プライベートアドレスの拒否、タイムアウトとバイト数の上限、HTML テキスト抽出、`max_content_tokens` の上限に対応しています。テキスト形式のコンテンツのみを変換し、画像や PDF のレンダリングには対応していません。トークン上限は文字数による推定値であり、TLS のホスト名は検証されますが、コンテンツは編集による秘匿化以外の方法ではサンドボックス化されません。 | | tools | `web-tool-domain-policy` | 対応 | | | tools | `tool-output-overflow` | 対応 | | | tools | `mcp-tool-approval-gate` | 対応 | | | tools | `auto-permission-policy` | 対応 | | | custom-tools | `custom-tool-declaration` | 対応 | | | custom-tools | `custom-tool-worker-execution` | 対応 | | | system-message | `system-message-events` | 対応 | | | memory-stores | `memory-crud` | 対応 | | | memory-stores | `memory-limits-and-preconditions` | 対応 | | | memory-stores | `memory-version-audit` | 対応 | | | memory-stores | `memory-multi-mount` | 対応 | | | memory-stores | `memory-worker-materialization` | 対応 | | | github-repository | `github-repository-materialization` | 対応 | | | github-repository | `github-repository-identity-freeze` | 対応 | | | files | `file-resources` | 対応 | | | files | `file-mount-path` | 対応 | | | credentials | `canonical-credential-wire-profile` | 対応 | | | credentials | `credential-rotation` | 対応 | | | credentials | `credential-injection-execution` | 対応 | | | credentials | `oauth-refresh` | 対応 | | | credentials | `mcp-oauth-validation` | 対応 | | | operations | `webhook-subscriptions` | 部分対応 | ローカルで実装されていますが、配信の動作は公開仕様と異なります。サブスクリプションは REST 経由で /v1/webhooks(および /v1/x ミラー)に登録され、配信はランタイムが起動時に組み立てるブリッジによって実行されます。永続化された各イベントはブロードキャスト時にプロジェクションされ、60 秒ごとのティックで再試行対象の配信を再試行し、期限到来したデプロイメントを実行します。一回限りの処理用に POST /v1/webhooks/dispatch と POST /v1/webhooks/retry-due も引き続き利用できます。各試行には公開仕様のヘッダー名が付き、id.timestamp.body に対する Standard Webhooks v1 署名が付与されます。再試行ではイベント ID を維持し、試行ごとに異なるタイムスタンプで署名します。各サブスクリプションには独自の whsec_ シークレットがあり、作成時に一度だけ返されます。ローテーション期間中は以前のシークレットも有効であり、webhook-signature ヘッダーの2つ目の値として含まれます。ローテーション期間は手動の retire-secret によって、または期間経過後に自動的に終了します。期間はデプロイメントで設定され(デフォルトは24時間で、MANAGED_AGENTS_WEBHOOK_ROTATION_WINDOW_SECONDS で設定可能)、起動時に webhook_rotation_window として記録されます。有効期限が切れると以前の列が削除され、署名生成時に適用され、再試行ティックで一掃されます。since タイムスタンプの導入前に開始された期間では、手動での終了動作が維持されます。ペイロードは公開仕様の {type: "event", id, created_at, data: {type, id, organization_id, workspace_id}} 参照エンベロープで、webhook-id はイベント ID と同じ値になり、organization/workspace にはローカルの定数値が入ります。サブスクリプションで指定できるイベントは公式カタログのものに限られます。*、prefix.*、不明な名前は書き込み時に拒否されます。セッションストリームがサブスクライバーに届くのは、公開名へのプロジェクション経由のみです(status イベントはマッピングされ、budget_reached はセッションごと、上限ごとに重複排除され、内部イベントは破棄されます)。リソースルートは、セッション、エージェント、環境、Vault と認証情報、メモリーストア、デプロイメントのライフサイクルイベントを配信します。カタログ内のすべての名前には生成元があります(大まかなセッションライフサイクル名は同じ遷移に伴って配信されます。作成時の pending、ストリームプロジェクション経由の running/idled/requires_action)。生成元となるインターフェースがない公開名(session.thread_*、agent.deleted)は、他の不明な名前と同様にサブスクリプション時に拒否されます。公開されている3つの自動無効化ケースはすべて実装されています。うち2つは常時有効で、1つはオプトインです。リダイレクトを確認した試行では、公開仕様の disabled_reason を付けてエンドポイントを無効化し、再試行しません。ホストが内部名であるか、プライベートアドレスに解決される試行は、接続前に公開仕様独自の理由で拒否されますが、これはデプロイメントで MANAGED_AGENTS_WEBHOOK_SCREEN_PRIVATE_ADDRESSES を設定した場合に限ります。ループバックはプライベートアドレスであり、セルフホスト可能な受信先は通常同じホストを共有するため、デフォルトでは無効です。エンドポイントが期間中に一度も途切れることなく失敗した場合は、公開仕様の継続的失敗理由を付けて無効化されます。仕様では条件の形式(試行回数ではなく継続時間で、2xx によってリセット)を定めていますが、期間の長さは定めていません。そのため期間はローカルパラメーターです。デフォルトは10分で、デプロイメントごとに MANAGED_AGENTS_WEBHOOK_SUSTAINED_FAILURE_WINDOW_SECONDS で設定できます。デプロイメント変数自体には書き込み経路がないため、ランタイムは起動時に有効な期間を記録します。再試行では公開仕様のジッター付き5~120秒の指数バックオフに従います。上限は60秒から120秒まで倍増し、各遅延は5秒からその上限までの範囲で一様に選ばれます。 | | operations | `scheduled-deployment-timers` | 部分対応 | 公開仕様のデプロイメントインターフェースをエンドツーエンドで実装しています。オブジェクトは、type deployment、depl_ ID、固定された {type, id, version} エージェント、environment_id、必須かつ空でない initial_events リスト(セッションの受け付けとデプロイメント専用の system.message)、resources、vault_ids、budget、metadata、および last_run_at と今後3回分の upcoming_runs_at を含む schedule オブジェクトを返します。スケジュールなしのデプロイメントでは null を返します。cron は M052 以降、null を許容するためです。どちらのマウント形式でも、単一のルーターから作成、読み取り、更新(公開仕様の動詞である POST とローカル形式の PUT)、アーカイブ、一時停止、再開、実行、期限到来分の実行を利用できます。ローカルのフラット形式のエイリアス(agent_id、cron、timezone、payload)も引き続き受け付けます。各実行では createWithInitialEvents を通じてセッションを作成し、/v1/deployment_runs で読み取れる drun_ 実行レコードを記録します。このリストは deployment_id、has_error、trigger_type、created_at の各フィルターに対応し、時間指定の実行では trigger_context に scheduled_at を含めます。失敗時の動作は公開仕様に従い、非対称です。関連付けられたエージェントが見つからないかアーカイブ済みの場合、デプロイメントをアーカイブし、実行レコードは作成しません。回復可能な session_rate_limited_error の場合は失敗した実行レコードのみを記録します。その他の分類済みエラーの場合は実行レコードを記録してデプロイメントを自動一時停止し、paused_reason.error にその実行の分類済み error.type を反映します。手動での一時停止と再開に対応しており、一時停止中のデプロイメントも手動実行は受け付けます。時間指定の実行では deployment_run.started/.succeeded/.failed を配信し、手動実行では配信しません。deployment.created/.updated/.paused/.unpaused/.archived はエージェント消失時の連鎖処理を含む各遷移で配信されます。DELETE は1つのトランザクション内でデプロイメントと実行レコードを削除してから deployment.deleted を配信します。ランタイムの60秒ごとのティックは期限到来したデプロイメントを実行し、起動時には過去の実行を再生せず、今後のスケジュールを再設定します。残る未対応点:MCP の外向き通信は制御されていないため、mcp_egress_blocked_error の発生経路がありません。 | | operations | `outcome-grading` | 対応 | | | operations | `outcome-evaluation` | 対応 | | | capabilities | `capability-inventory-endpoint` | 対応 | | | capabilities | `capability-status-truthfulness` | 対応 | | | environments | `environment-hosting-config` | 対応 | | | environments | `environment-network-policy` | 部分対応 | 公開仕様の config.networking オブジェクトは、固有の語彙(limited/unrestricted、allowed_hosts、allow_mcp_servers、allow_package_managers)を使用して受け付けられ、単一の正規化器によって記録用のローカル形式 config.network に正規化されます。認識できない type と未設定の権限にはフェイルクローズのデフォルトが適用され、両方の形式を矛盾する内容で指定したリクエストは拒否されます。limited ポリシーが適用されるようになりました。すべての limited サンドボックスに、CONNECT と absolute-URI HTTP に対応するセッションごとのループバック外向き通信プロキシが設定され、有効な許可リスト(allowed_hosts と、パッケージマネージャーフラグが有効な場合は、厳選された公開レジストリーのエンドポイントを加えたもの)に限り接続が許可されます。docker プロバイダーはセッションコンテナーを --internal ネットワークに接続し、プロキシに転送するリレーサイドカーだけを接続先として許可します。そのため、この境界は単なる助言ではなく強制されます。local プロバイダーはすべてのサンドボックスサブプロセスと stdio MCP サーバーにプロキシ変数を設定しますが、これは設計上、助言にとどまります。プロキシ変数を無視するプロセスは自由に外部へ通信できるため、強制適用をうたわず best_effort として報告します。MCP 接続境界では、ポリシーで許可されないホストを持つ url サーバーを(allow_mcp_servers が設定されていない限り)拒否します。web_fetch はリダイレクトの各段階で、宣言された許可リストと既存のドメインおよび SSRF ガードの両方を適用します。Environment の読み取りでは、有効なバックエンドが宣言する機能に基づいて networking_enforcement(enforced / best_effort / unsupported / not_applicable)を投影します。kubernetes と self-hosted のプロバイダーには外向き通信の境界が設けられておらず、limited ポリシーが設定されても適用せず unsupported と報告されること、また local プロバイダーの強制適用は本質的に助言にとどまることから、部分対応です。 | | environments | `environment-work` | 部分対応 | 公開仕様の Work API 全体を、ローカルのツール実行キュー上にマウントしています。データプレーンでは、poll が呼び出し元の認証情報に関連付けられた環境にスコープされた、請求可能な項目のうち最も古いものを取得し、項目ごとのシークレットとともに公開仕様の BetaSelfHostedWork 形式で返します。シークレットは、その取得のために発行された sessions_token と api_base_url を含む base64url JSON です。ack は取得を確定します。heartbeat は公開仕様の NO_HEARTBEAT 初回取得センチネルおよび expected_last_heartbeat 楽観的同時実行性チェック(サーバーの現在の current_state を含む 412 を返します)に従って、ハートビートのリースを更新します。update はメタデータのパッチをマージし、stop はキューの停止マーカーを記録します。管理プレーンでは、list がキーセット方式のページカーソルを使用して新しい順に項目をページングします。retrieve は、項目操作と同じ項目スコープの境界を適用して項目1件を返します。stats は、リースモデルから計算した公開仕様の work_queue_stats フィールドを返します(depth = 現時点で取得可能な項目数、pending = リース期間内に取得済みの項目数、workers_polling = 過去30秒以内に poll で確認された識別情報の数)。sessions_token は Work ファミリー以外でもワーカーのセッションレベルの認証情報として使用できます。自身のセッションを取得し(ワーカーは resources リストから関連付けられたストアを確認します)、イベントの一覧表示とストリーミング、ツール回答イベントタイプのみの投稿、セッションに関連付けられたストアのメモリーの読み書きが可能です。access: "read_only" の関連付けでは書き込みが 403 で拒否され、それ以外のすべてのルートは 401 を返します。プロジェクションでは対応範囲の限界を正確に示します。ローカルの全項目はセッションに属するため、data は常に {type: "session", id} です。項目ごとの desired_ttl_seconds は適用せず、そのまま返します。force-stop に相当するローカルのモードはありません。結果の報告はローカルの /v1/x/worker チャネルで行われます。ルートの不足ではなく、こうした意味上の差異があるため部分対応です。このファミリー内で拒否されるものはありません。 | | routes | `documented-route-surface` | 対応 | | | dreams | `dreams` | 対応 | | | threads | `threads-and-coordinator` | 非対応 | 未実装です。スレッドのリソース、スレッドのライフサイクルやスレッドごとのイベント分離、コーディネーターまたはアドバイザーのロール、スレッドスコープの予算イベントはありません。公開されている5つのスレッドルートは、この機能名を示す `unsupported_capability` 拒否応答を返すため、SDK 呼び出し元は 404 ではなく 400 を受け取ります。`multiagent` 名簿を含むリクエストは、黙って取り除かれるのではなく、フィールド名を示して拒否されます。委譲はローカルの単一レベルの `delegations` / `enable_general_subagent` 拡張としてのみ存在し、このインターフェースには該当しません。 | | unsupported | `session-budget-alerts` | 非対応 | (not_applicable) 予算通知はホスト型の課金機能です。アカウントの支払い者に通知するための外向きチャネルが必要ですが、SandBase はシングルテナントかつローカルであり、通知対象はオペレーターのみです。 | | unsupported | `mcp-tunnel` | 非対応 | (not_applicable) MCP トンネルは、ローカルファーストの対象範囲外であるホスト型の接続機能です。 | | tools | `web-search-execution` | 対応 | |CLI
managed-agents init
managed-agents start [--host 127.0.0.1] [--port 3000]
managed-agents apply <file...> # create or update agents/environments/deployments from manifests
managed-agents list
managed-agents reload
managed-agents chat <agent-id> --message "hello" [--tool-approval ask|allow|deny]
managed-agents template list | install <name> | create <name>
applyは同じAPIの宣言的な形式です。エージェント定義をフロントマターに記述したMarkdownファイル(---より下の本文がシステムプロンプトになります)、.yaml環境ドキュメント、またはMarkdownデプロイマニフェスト(フロントマターにname、agent、environment、scheduleを記述し、本文が初期のuser.messageになります)を使用します。解決されたIDは各ファイルと同じ場所にあるmanaged-agents-lock.jsonに保存されるため、編集後にapplyを再実行すると重複を作成せず、同じリソースが更新されます。マニフェストと一緒にロックファイルもコミットしてください。後続のファイルから先行ファイルを名前で参照できるため、apply coding-assistant.md environment.yaml deployment.mdを実行すると、デプロイは最初の2つのファイルが作成したエントリーに紐付けられます。
ツールの承認が必要なターンは失敗せずに保留され、chatは実行前に確認を求めた後、ランタイムに同じターンを続行させます。--tool-approval allowはそのような呼び出しをすべて事前に許可します。スクリプトやCIジョブではこのオプションを使います。denyは呼び出しを拒否します。入力を促すターミナルがない場合、デフォルトのaskは何も回答せず、保留中の呼び出しを示してゼロ以外の終了コードで終了するため、スクリプトはポリシーを明示し、暗黙の設定を引き継がずに済みます。カスタムツールは例外です。その結果を生成できるのは独自のクライアントだけであり、chatはその旨を伝えてゼロ以外の終了コードで終了します。使用方法を参照してください。
SDK
import { ManagedAgentsClient } from 'managed-agents/sdk';
const client = new ManagedAgentsClient({
baseUrl: 'http://127.0.0.1:3000',
});
const session = await client.sessions.create({
agent: 'agent_...',
environment_id: 'env_...',
});
for await (const event of client.sessions.chat(session.id, 'Hello')) {
if (event.type === 'agent.message_chunk') {
process.stdout.write(event.delta ?? '');
}
}
/v1 APIはClaude Managed Agentsのリソース形式に準拠しているため、Anthropic SDKをローカルランタイムに接続することもできます。
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: process.env.MANAGED_AGENTS_API_KEY ?? 'local-dev-key',
baseURL: 'http://127.0.0.1:3000',
});
const session = await client.beta.sessions.create({
agent: 'agent_...',
environment_id: 'env_...',
});
認証
デフォルトではオープンです。APIキーが1つ以上存在すると、認証が有効になります。
# Static key via environment
export MANAGED_AGENTS_API_KEY=sk-local-example
# Or create a managed key
curl -X POST http://127.0.0.1:3000/v1/api-keys \
-H "Content-Type: application/json" \
-d '{ "name": "Local Console" }'
クライアントはAuthorization: Bearer <key>を送信します。
インテグレーションと使用例
- DeepSeek Harnessプラグイン — このランタイムをMCP stdio経由のDSHプラグインとして実行します。インストール、事前チェック、ツール一覧、トラブルシューティングについては
examples/deepseek-harnessを参照してください。DSH プロジェクトでは、GitHubソースからポータブルなSkillを取得することもできます —npx --yes github:sandbaseai/sandbase-skills add multi-source-searchを実行すると、.dsh/skills/multi-source-searchにインストールされます。 - Agent Plugins 1.0クライアント(Copilot CLI、VS Code)とスタンドアロンの
MCPブリッジコンテナ —
agent-plugin/PLUGIN.mdを参照してください。 - ユースケース — Showcaseでは、監査可能な コーディングエージェント、インタラクティブなフロントエンドとしてのDSH、Local、Docker、Kubernetes、セルフホスト可能なサンドボックスにまたがる制御されたコード実行を紹介しています。
- エージェント設定 — YAMLエージェント定義、
config.yaml、ワークスペースのレイアウトは使用ガイドに記載されています。すべてのリソースを対象としたcurlの手順についてはdocs/api.mdを参照してください。
ドキュメント
- 機械可読なプロジェクトメタデータ
- エージェント/MCPインストールガイド
- Agent Pluginマーケットプレイスマニフェスト
- インストール
- 使用ガイド
- APIリファレンス
- Skills
- DeepSeek V4
- MiniMax
- デプロイ
- アーキテクチャ
- DeepSeek Harnessインテグレーション
- 貢献方法
- 引用メタデータ
- 変更履歴
開発
npm ci
npm run typecheck # src + tests + Console
npm test # vitest
npm run build # runtime + console + SDK
npm run release:check # full local release gate
release:checkは、型チェック、テスト、2つのビルド、npm pack --dry-run、CLI initのスモークテスト、examples/basicの起動スモークテストを実行します。
スターを付けて共有する
このランタイムが実際のエージェントインフラストラクチャの問題を解決する場合は、 ほかの開発者にも見つけてもらえるよう、リポジトリにスターを付けてください。
エコシステムのディレクトリ、コミュニティガイド、関連プロジェクトについては、 docs/ecosystem.mdをご覧ください。コミュニティでのユースケースに関するディスカッション: Codex、Claude Code、DSH 間のメモリ移行、 サードパーティ製プラグイン向けのサンドボックスとファイルシステム保護。
ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。


