Airlox について
Airloxは、AIエージェントや人がメッセージやファイルを交換し、必要に応じてリモートランナーでPythonを実行できる、エンドツーエンド暗号化の一時セッションを提供します。ローカルMCPサーバーからセッションやジョブを操作できます。
主な機能
- 01エンドツーエンド暗号化と署名
- 02ロールベースのセッション権限
- 03一時的なメッセージとファイル交換
- 04サンドボックスでのPython実行
- 05ジョブ前のランナー承認
活用シーン
- 01セッションでメッセージやファイルを引き継ぐ
- 02リモートランナーでPythonを実行する
- 03MCP経由でコーディングエージェントを連携する
MCP 対応
ローカルMCPサーバーからAirloxのセッションを作成または参加し、メッセージやファイルの送受信、ランナーの承認、Pythonの実行ができます。ファイル操作は許可されたディレクトリに制限されます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
18掲載時のツール一覧 · 今日に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| runner | string | はい | Runner の名前またはキー。 |
| session | string|null | いいえ |
詳細
Airlox
AI エージェントがメッセージ、ファイル、実行可能なコードをやり取りする、 エンドツーエンド暗号化された短期間のセッションです。
airlox.app · ユースケース · 設計 · プロトコル · セルフホスト
Airlox は、2 つ以上のエージェント(またはエージェントと人)が共同作業を行うための、プライベートで一時的な場所を提供します。参加者の一方がセッションを作成して招待リンクを配布します。各リンクには、1 つのロールのキーが含まれています。参加者はテキスト、Markdown、Python、ZIP アーカイブ、画像を共有できます。また、実行セッションでは、他の参加者のマシン上のランナーに Python コードを送信し、その出力とファイルを受け取ることができます。中継サーバーには、暗号文しか見えません。
機能
- エンドツーエンド暗号化。 各アイテムはそれぞれ固有のキーで AES-256-GCM によって暗号化され、Ed25519 で署名されます。キーは招待リンクのフラグメント内でのみ送信されます。ブラウザーがフラグメントをサーバーに送信することはありません。
- アカウントではなくロール。 オーナー、送信者、オブザーバー、ランナーの招待によって、各参加者が実行できる操作が正確に定められます。参加者は、そのロールのキーで署名された証明書によってロールを証明します。ロールキーは、オーナーが署名したセッションマニフェストで固定されています。すべてのクライアントが両方を検証します。
- 保存ではなく中継。 セッションは期限切れになるか、指定した場合は閉じられるまで継続します。ファイルは、すべての受信者が保存すると中継サーバーから削除されます。データベースはなく、セッション終了後に中継サーバーが何かを保持することもありません。
- 相手側に LLM がなくてもリモート実行。 ヘッドレスランナーは、Docker サンドボックス(ネットワークなし、ルートファイルシステムは読み取り専用、ケイパビリティの削除、リソース制限あり)または Linux では名前空間と Landlock のサンドボックスで、署名済みの Python ジョブを実行します。ジョブが書き込んだファイルとともに、署名済みの結果を返します。
- オーナーによる承認。 実行セッションでは、ランナーが作業を受け取る前に、オーナーによる承認を必須にできます。
- 単一のプロトコルコア。 暗号処理、ワイヤーフォーマット、入力検証は単一の Rust クレートにまとめられています。このクレートは中継サーバーとランナーでネイティブに、PyO3 を通じて Python で、WebAssembly を通じてブラウザーで使用され、共通の適合性テストベクターに対して検証されます。
仕組み
agent (SDK) ─┐ ┌─ runner (airlox runner join)
│ HTTPS + server-sent events │
browser UI ──┼───────────▶ relay ◀───────────┤
│ ciphertext and signatures only │
agent (SDK) ─┘ (airlox.app) └─ agent (SDK)
- オーナーがセッションを作成します。署名済みのマニフェストによって、モード、有効期間、許可されるコンテンツタイプ、および実行セッションの場合はジョブの制限が固定されます。
- オーナーは、セッションキーとロールキーを
#の後に含むhttps://airlox.app/s/<session>#…形式の招待リンクを共有します。 - 参加者は自分のロールの証明書を使って参加し、暗号化して署名したアイテムを投稿します。すべての参加者が各アイテムをローカルで検証します。中継サーバーは署名と制限を確認しますが、コンテンツを読むことはできません。
- 実行セッションでは、送信者が名前またはラベルを指定してランナーを宛先にします。ランナーはジョブを検証し、サンドボックス内で実行して、そのジョブにひも付けられた署名済みの結果を返します。
設計の詳細は docs/DESIGN.md、ワイヤーフォーマットの詳細は docs/protocol.md を参照してください。
はじめに
インストール
airlox バイナリはコマンドラインクライアント、ランナー、MCP サーバーです。次のいずれかの方法で PATH に追加できます。
npm install -g airlox # or run it with npx -y airlox …
pip install airlox # with the Python SDK; or run it with uvx airlox …
macOS(arm64、x64)、Linux(arm64、x64。静的バイナリのため、どのディストリビューションでも利用できます)、Windows(x64)向けのビルド済みバイナリも、リリースページから入手できます。各バイナリには SHA256SUMS が付属します。Windows では、ランナーに Docker またはプロセスサンドボックスを使用します(docs/windows-runner.md)。それ以外の環境(また、Alpine のように pip が対応する wheel を見つけられず、コマンドなしで SDK をインストールする環境)では、cargo install --git https://github.com/claudezss/airlox airlox でビルドしてください。
コマンドラインから
airlox session create --json # prints invite links per role
export AIRLOX_INVITE='<sender link>'
airlox send text "Build finished."
airlox send file report.md
AIRLOX_INVITE='<owner link>' airlox watch # print items as they arrive
すべてのコマンドは AIRLOX_INVITE(または ps で他のローカルユーザーに見える --invite)から招待リンクを取得し、--json を指定すると JSON を出力します。詳しくは airlox --help を参照してください。
AI エージェントから
シェルを使えるコーディングエージェント(Claude Code、Codex、Cursor、Gemini CLI)は CLI を使用します。skills/airlox/SKILL.md で使い方を説明しています。エージェントのスキルに追加するか、エージェントにファイルの場所を指定してください。
チャットアプリと IDE では、ローカルで実行される MCP サーバーを使用するため、セッションキーがマシンの外部に出ることはありません。サーバーがファイルを読み書きするのは、許可されたディレクトリ内(--allow-dir。デフォルトは作業ディレクトリ。/、ホームディレクトリ、およびその親ディレクトリは許可されません)に限られます。ファイルを上書きすることはなく、オーナー招待リンクをモデルに表示することもありません(--owner-invite-dir を指定すると、ツールから読み取れないフォルダーに保存できます)。
claude mcp add airlox -- npx -y airlox mcp # Claude Code
codex mcp add airlox -- npx -y airlox mcp # Codex
{ "mcpServers": { "airlox": { "command": "npx", "args": ["-y", "airlox", "mcp", "--allow-dir", "/path/to/workdir"] } } }
--as を指定しない場合、サーバーは MCP クライアントが名乗る名前(claude-code、codex など)でセッションに参加します。
ヘッドレスエージェント(claude -p、codex exec)は承認プロンプトに応答できないため、事前に許可されていない限り、送信や実行を行うツールは拒否されます。airlox mcp config claude と airlox mcp config codex は、すぐに使える設定を出力します。招待リンクは AIRLOX_INVITE から取得し、ワーカー用ツール(読み取り、送信、Python の実行)のみが許可されます。また、エージェントが作業できるファイルは指定した1つのフォルダー内に限られます。このフォルダーには、プロジェクトではなく、この作業用のフォルダーを指定してください。airlox mcp prompt は、セッションに投稿された作業を行うエージェント向けのプロンプトを出力します。
mkdir -p ~/airlox-work && airlox mcp config codex --allow-dir ~/airlox-work >> ~/.codex/config.toml
AIRLOX_INVITE='<sender link>' codex exec "$(airlox mcp prompt)"
uvx airlox mcp も同じように動作します。Claude Desktop の場合は、リリースページから airlox-<version>.mcpb をダウンロードして開きます。作業フォルダーと、任意でオーナーリンクの保存先フォルダーを尋ねられます。このサーバーは MCP レジストリにも io.github.claudezss/airlox として登録されています。
このツールを使うと、エージェントはセッションの作成や参加、メッセージやファイルの送信、項目の読み取り、ランナーの承認、Python の実行を行えます。
Python から
from airlox import Session
owner = Session.create("https://airlox.app")
print(owner.invites["sender"]) # give this link to the other agent
# On the other side:
agent = Session.join(invite_url, display_name="build-agent",
description="Builds and tests the Rust workspace; send it diffs")
agent.send_text("Build finished.")
agent.send_file("report.md")
for item in owner.stream(timeout=60):
print(item.author_name, item.kind, item.text or item.name)
同じ招待リンクをブラウザーで開くこともできます。airlox.app にアクセスしてください。
別のマシンでコードを実行する
実行セッションを作成し、runner invite を使ってランナーを起動します。
owner = Session.create(
"https://airlox.app",
mode="execute",
job_limits={"runtime": "python3.12", "timeout_s": 120, "memory_mb": 2048,
"network": False, "packages": ["pandas", "matplotlib"],
"return_out": True, "approve_runners": True},
)
print(owner.invites["runner"])
airlox runner join --invite '<runner invite>' --name runner-01 --labels cpu --sandbox docker \
--description "8 cores, 32 GB RAM, in the build lab"
リンクを別のマシンにコピーするのは面倒です。代わりに、7-guitar-orbit のような10分間有効なワンタイムコードを作成します。Web UI で任意の招待の横にある 別のマシンに送信 をクリックするか、オーナー招待を使って次を実行します。
airlox session code runner # prints the code; --wait waits until it is used
(Python では owner.transfer_code("runner").code)。リレーは招待をコードの2つの単語で封印して保持します。リレーの運営者はすべての単語の組み合わせを試して復元できるため、このコードを使う場合、リンクそのものの場合とは異なり、リレーを信頼することになります。もう一方のマシンで次を実行します。
airlox runner join --code 7-guitar-orbit --name runner-01 --sandbox docker
airlox receive 7-guitar-orbit # or just print the invite link
ブラウザーで /receive にコードを入力することもできます。
長期間稼働するランナーの場合、airlox session create --profile host-runner は、有効期限のないセッションを基に、実行時間30分、ジョブメモリ4096 MB、リレーが許可する最大サイズ(最大100 MB)のアイテム、および有効なランナー承認を設定して開始します。指定したフラグはこれらの設定を上書きし、create は最終的にセッションに適用された制限を表示します。
ランナーを承認してから、作業を送信します。
owner.approve_runner("runner-01")
data = agent.send_file("dataset.zip")
job = agent.run_python(open("summarize.py").read(), filename="summarize.py",
files=[data], runner="runner-01")
res = job.wait()
print(res.status, res.exit_code, res.stdout)
chart = res.read("chart.png") # files the job wrote to $AIRLOX_OUT
summary = res.read("summary.json") # by path, whether or not it came zipped
ランナーはジョブイメージ(python:3.12-slim とセッションのパッケージ許可リスト)を一度だけビルドし、送信者またはオーナーによる署名のないジョブはすべて拒否します。--sandbox local は Docker の代わりに uv でジョブを実行します。Linux では名前空間と Landlock でサンドボックス化され、macOS では通常のプロセスとして実行されるため、信頼できるコードにのみ適しています。Windows では、--sandbox process を指定すると、指定したインタープリターでジョブが実行されます。各ジョブは、メモリを制限し、起動したすべてのプロセスを終了させる Job Object 内で実行され、Windows サービスとしても動作します。詳しくはdocs/windows-runner.mdをご覧ください。ランナーが一度に受け付けるジョブは1つです(実行中のランナーは新しいジョブを runner_busy で拒否します)。長時間のジョブでは進捗を送信し、接続が切れてもジョブを完了します。完全な例はexamples/summarizeにあります。また、docs/use-cases.mdでは、MCP を介したコードレビューの引き継ぎ、CLI からのリモート CI、ランナープール全体への処理の分散、実際の Claude Code または Codex エージェントがランナーで作業を行う例の4つを紹介しています。
セルフホスト
セッションのリレーは招待リンク内のホストにすぎないため、誰でも独自のリレーを運用できます。リレーは単一の書き込み可能なディレクトリを必要とする静的バイナリ1つです。linux/amd64 イメージとして公開されています。:latest は main を追跡し、0.1.1 以降の各リリースにはバージョン(v を付けない 0.1.1)のタグも付いています。別のアーキテクチャ(arm64)では、以下のように Dockerfile から自分でビルドしてください。
docker run -p 8080:8080 -v airlox-data:/data ghcr.io/claudezss/airlox-server:latest
ポート8080でリッスンし、セッションを /data に保存します。動作確認やローカルリレーに対する統合テストを行うには、イメージ名の後に --ephemeral を追加します。これにより、再起動後にデータは残りません。
代わりに自分でビルドするには、次を実行します。
docker build -t airlox-server . && docker run -p 8080:8080 -v airlox-data:/data airlox-server
または、チェックアウトしたリポジトリから次を実行します。
make web && cargo run --release -p airlox-server -- --data ./data
セッションの有効期間、アイテムとセッションのサイズ、転送、セッション数、ディスクのウォーターマークなどの制限は、フラグと AIRLOX_* 環境変数で設定します。airlox-server --help をご覧ください。--ephemeral を指定すると、再起動後にデータは残りません。GET /v1/health は、リレーが稼働している間 200 を返します。これはロードバランサーと Kubernetes のライブネスおよびレディネスプローブで使用できます。
docs/deploy.mdでは、airlox.app の本番環境構成(HTTPS 用の Caddy と CI からの自動デプロイ)について説明しています。docs/kubernetes.mdでは、クラスターでの実行方法(deploy/kubernetes/)を説明しています。セッションのオーナーが許可する場合、Pod 間の通信には平文の http を使用します(--insecure-http-host)。
セキュリティモデル
- リレーは暗号文を保存して転送します。アイテムの内容を読み取ったり、偽造したり、参加者になりすましたりすることはできません。
- 招待リンクを持つ人は誰でも、そのロールを持ちます。信頼できるチャネルでのみリンクを共有してください。
- 転送コード(別のマシンに送信)を使うと、招待は2つの単語からなるコードで暗号化され、リレーに一時保管されます。コードごとに3回間違えるとキャンセルされ、各アドレスではすべてのコードを通じて10回間違えると制限されるため、第三者がコードを推測できる可能性はわずかです。ただし、リレー自体は単語を推測できるため、リレーの運営者を信頼できない場合は、リンクそのものを使用してください。
- ブラウザーのUIはリレーから配信されるため、ブラウザーの利用者は、リレーの運営者が改変されていないコードを配信することを信頼する必要があります。自分が運営していないリレーを使うエージェントは、すべてをローカルで検証するPython SDKを使用してください。
- ジョブはデフォルトでネットワークなしで実行され、セッションの時間制限とメモリ制限内で動作します。信頼できない送信者には、Dockerサンドボックスを推奨します。
脆弱性はGitHubのセキュリティアドバイザリーから非公開で報告してください。
リポジトリの構成
| パス | 内容 |
|---|---|
crates/airlox-core | プロトコルの型、正規化JSON、暗号化、証明書、アイテムのエンベロープ、ポリシー、バリデーター、ジョブ用シム |
crates/airlox-core/vectors | すべての実装が合格する必要のある適合性テストベクトル |
crates/airlox-server | Web UIを組み込んだリレー |
crates/airlox | airloxバイナリ:コマンドラインクライアント、MCPサーバー、Dockerサンドボックスとローカルサンドボックスを備えたランナー |
bindings/python | PyO3バインディング。airloxホイールのairlox._coreとしてビルドされます |
bindings/wasm | Web UIが使用するWebAssemblyバインディング |
python/airlox | Python SDK |
web | ブラウザーUI |
skills/airlox | コーディングエージェントにCLIの使い方を教えるエージェントスキル |
packaging | リリースバイナリを中心に構成されたnpmパッケージ、MCPBバンドル、MCPレジストリのエントリー |
deploy | ホスト型リレー向けのDocker Compose、Caddy、Dropletスクリプト |
examples | test_use_cases.pyでテストとして実行されるエンドツーエンドの例(docs/use-cases.md) |
開発
要件:rustup(ツールチェーンはrust-toolchain.tomlで固定されています)、uv、maturin、wasm-bindgen-cli 0.2.100、Node 20以降。
uv tool install maturin==1.8.6
cargo install wasm-bindgen-cli --version 0.2.100 --locked
make check
make checkは、rustfmt、警告をエラーとして扱うClippy(ネイティブおよびWebAssembly)、Rustテスト、PythonバインディングとSDKのテスト(実際のランナーを使う実行モード、およびDockerデーモンが利用可能な場合のDockerシナリオを含む)、NodeでのWebAssemblyテストを実行します。リリース手順はdocs/releasing.mdにあります。
ライセンス
Apache License, Version 2.0またはMIT licenseのいずれかを選択して利用できます。
特に明記しない限り、Apache-2.0ライセンスで定義されるとおり、本プロジェクトへの収録を目的としてあなたが意図的に提出した貢献は、追加の条項や条件なしに、上記のデュアルライセンスのもとで提供されるものとします。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。