2026年9月4日 金曜日
AI時短ラボ
検証· 約14

Claude Code・Codex・Hermesを1コンテナにまとめる「HarnessRouter」──自前サーバーで動かす統一プロトコル

OSSのHarnessRouterは、Claude Code・Codex・Pi・Hermes・DeepSeek Harnessという5つのエージェントハーネスを1つのDockerコンテナに同居させ、Unified Harness Protocol(UHP)という共通APIの背後に隠す自己ホスト型ツール。READMEを実際に読み、初期パスワードの扱いなど運用上の注意点まで確認した。

Claude Code・Codex・Hermesを1コンテナにまとめる「HarnessRouter」──自前サーバーで動かす統一プロトコル
執筆・編集:
目次

3行まとめ

  1. HarnessRouterは、Claude Code・Codex・Pi・Hermes・DeepSeek Harnessという5つのエージェントハーネスを1台のDockerコンテナで動かし、Unified Harness Protocol(UHP)という共通APIで統一的に呼び出せるようにするOSSツール。
  2. アカウント登録もクラウドも不要。APIキーはモデルプロバイダに投げる時以外は箱の外に出ない、とREADMEは説明している。
  3. 初期状態はユーザー名・パスワードともharnessrouter固定。READMEはこれを公開する前に必ず変更しろと明記している。

何を統一しようとしているのか

AIコーディングエージェントは、Claude Code・Codex・Cursor・Hermesなど選択肢が乱立していて、それぞれ起動方法もAPIも設定ファイルも違う。HarnessRouterは、この「ハーネスごとにバラバラ」な状態を1つのコンテナの中に閉じ込め、Unified Harness Protocol(UHP)という共通プロトコルの背後に統一するというアプローチを取る。README曰く、ホスト版のサービスも同じUHPを実装しており、HarnessRouterはそのコミュニティ版(セルフホスト・OSS)という位置づけだ。

インストールはDockerイメージを1つpullするだけで、GitHub READMEを確認すると次のように書かれている。

docker pull harnessrouter/harnessrouter
docker run -d --name harnessrouter \
  -p 127.0.0.1:3000:3000 \
  -v harnessrouter:/data \
  harnessrouter/harnessrouter

イメージサイズは約700MB、必要ディスクは約4GB。ポートはデフォルトでlocalhostのみに公開され、外部公開は明示的な設定変更が必要という設計だ。実際にDocker HubのAPI(hub.docker.com/v2/repositories/harnessrouter/harnessrouter/tags)を叩いてlatestタグのイメージサイズを確認したところ、amd64版で735,013,256バイト(約701MiB)、last_pushedは2026年8月29日。README記載の「約700MB」という数字と、頻繁に更新が入っている状態を裏付ける。

一方でREADMEは、docker runのコマンドとdocker composeのデフォルト設定に違いがある点も明記している。上記のdocker run例はポートをloopback(127.0.0.1)に絞っているが、README添付のdocker-compose.ymlはデフォルトで3000:3000を全インターフェースに公開する設定になっており、Compose運用に切り替える場合はこの1行を書き換えないと外部から到達可能になる、という注意書きがある。

起動直後のログに並ぶ5つのハーネス

READMEに掲載されている起動ログの抜粋には、コンテナ初回起動時に次の順でハーネスがインストールされる様子が示されている。

[harnessrouter] installing Claude Code (Anthropic's terms apply)…
[harnessrouter] installing Codex (Apache-2.0)…
[harnessrouter] installing Pi (MIT) and its MCP adapter (MIT)…
[harnessrouter] installing DeepSeek Harness (MIT, developer preview — version-pinned)…
[harnessrouter] installing Hermes (check its upstream license before use)…
[harnessrouter] data=/data  backends available: claude codex hermes pi dsh

ここで目を引くのは、ライセンス表記がハーネスごとに違う点をREADME自身が隠していないことだ。Codex・Pi・DeepSeek HarnessはApache-2.0やMITだが、Claude CodeはAnthropic自身の利用規約に従い、Hermesはそもそもライセンスを宣言していない。READMEはこの2つ(Claude CodeとHermes)は公開イメージに同梱配布できないためインストール時に自分でupstreamから取得する形になっており、「だからこそこの2つのバックエンドを使う前にそれぞれの規約を読んでほしい」という趣旨の注記がある。

プロバイダキーの扱い

READMEによれば、コンテナ起動時にはプロバイダキーを渡す必要はなく、コンソールの画面から接続する設計になっている。対応プロバイダと、それぞれが使えるハーネスの組み合わせは次の通り(README記載の対応表)。

プロバイダ 使えるハーネス
anthropic Claude Code, Hermes, Pi
openai Codex, Hermes, Pi
openrouter Codex, Hermes, Pi, DeepSeek Harness
azure-foundry Codex, Hermes, Pi
bedrock Claude Code, Hermes
tokenrouter Claude Code, Codex, Hermes, Pi, DeepSeek Harness
vercel Claude Code, Codex, Hermes, Pi, DeepSeek Harness
llmtr Claude Code, Codex, Hermes, Pi, DeepSeek Harness

タスクの実行は「Tasks → New Task」から、左側のスイッチャーでハーネスを選び、モデルを選ぶという流れになっている。

UHP(Unified Harness Protocol)とは何か

「同じUHPを実装している」というREADMEの説明だけでは実体が分からないため、仕様サイト(unifiedharnessprotocol.org)を確認した。UHPは、現在の仕様バージョンが2026-08-11、ステータスは「Draft standard」、ライセンスはApache-2.0で、「HarnessRouterのオープンソースリポジトリ内で定義・保守されている」と明記されている。つまりUHPは、IETFやW3Cのような独立した標準化団体ではなく、HarnessRouterプロジェクト自身がホストする仕様だ。

仕様サイトが強調しているのは、UHPは「モデルAPIではない」という区別だ。モデルAPI(Claude APIやOpenAI APIなど)が「メッセージを送るとトークンが返る」というターンを単位にするのに対し、UHPは「仕事を投げると、自分のツールを使い自分のセッションを保ちながら動くエージェントが結果とファイルを返す」というタスクを単位にする、と説明している。設計上はOpenAIのResponses APIの形に意図的に似せてあり、「Responses APIをすでに話せるコードは、UHPサーバーに対しても無改修で動く」ことを目標にしていると書かれている。適合性については「52個の実行可能なチェック」からなる適合スイート(conformance suite)が用意されており、これに通ったサーバーは「UHP 2026-08-11 conformant」を名乗ってよい、という運用になっている。

初期パスワードは変えないと危険

README中に太字の警告が入っている点は書いておく価値がある。

[harnessrouter] WARNING: using the DEFAULT password. Set HR_AUTH_PASSWORD, or change it from the profile page, before exposing this instance.

初期状態のユーザー名・パスワードはどちらも固定値harnessrouterで、外部に公開する前にHR_AUTH_PASSWORD環境変数を設定するかプロフィール画面から変更するよう明示的に指示されている。README自身がデフォルトのバインドをlocalhostに絞っているのはこのための安全策で、「デフォルトログインのまま起動しても、そもそも外から触れない」という設計思想が読み取れる。逆に言えば、ポート開放やリバースプロキシ越しに公開する運用に切り替える際は、この初期パスワード変更を忘れると誰でもClaude Code・Codexを操作できる状態になるということでもある。

パスワードを変更した後の挙動についてもREADMEは細かく書いている。新しい認証情報は/data/selfhost-auth.jsonにユーザー名・ソルト・ハッシュの形で保存され(パスワードそのものは保存されない)、以降はdocker run時の環境変数より優先される。つまり「起動時に設定したHR_AUTH_PASSWORDを後から変えても、プロフィール画面で変更した内容の方が勝つ」という仕様だ。保存後は起動ログの表示もsign in as 'harnessrouter' (credentials set from the profile page)に変わる。パスワードを忘れた場合はリセットメールの仕組みが無く、/data/selfhost-auth.jsonを削除して再起動し、環境変数の値にフォールバックさせる、という手順がREADMEに明記されている。

コンテナ自体の権限設計にも踏み込んだ記述がある。コンテナはroot権限で起動する(README曰くバージョン0.8.2以降、--userオプションでの上書きはむしろ拒否されるようになった)が、これは「rootのまま動かす」ためではなく、起動直後にエージェントCLIごとのセッション専用ユーザーへ権限を委譲するためだと説明されている。1つのコンテナで複数セッションを扱う際、あるセッションのエージェントが別セッションのファイル・DB・シークレットストアを読み書きできないようにする設計だとしている。この権限委譲の実効性そのものは、この記事では検証していない。

コンテナは実際に起動していない

本記事はGitHubリポジトリのREADMEとUHPの仕様サイトを2026年8月29日にcurlで取得し、記載されているコマンド・ログ・対応表・仕様説明をそのまま書き起こしている。だが筆者の手元でDockerを使ってコンテナを実際に起動し、6ステップのインストール手順やパスワード変更・権限委譲の挙動を動かして確かめたわけではない。UHPの適合スイート(52チェック)を自分で実行してHarnessRouterがどこまで通るかも検証していない。ホスト版サービス(hosted service)とコミュニティ版(セルフホスト・OSS)の機能差についても、README記載の「同じUHPを実装している」という説明以上のことは確認できていない。Hermesはライセンスを宣言していないとREADMEに書かれているが、そのHermes自体の配布元やライセンス状況をこの記事では個別に調べていない。

日本語圏ではまだ手つかず

Zenn・Qiitaともに言及はゼロだった。「複数のコーディングエージェントを自前運用でまとめる」というテーマ自体、まだ日本語での解説記事が少ない。

関連記事

シェア: ポスト はてブ

出典・参照資料

AIニュースの解説を動画でも

YouTubeでは注目ニュースの背景を解説し、Xでは新着記事をお知らせしています。

コメント

まだコメントはありません。最初のコメントを書いてみませんか?

AIについて聞きたいことはありますか?

質問箱で無料で受け付けています。回答は公開され、他の方の参考にもなります。

質問箱を見る →

新しい記事をメールで受け取る

AIの新しい発表を、出典付きで整理して届けます。

関連記事