Skip to main content
Glama

AgentBus

AIエージェント群のための耐久性のある調整バス — 取り返しのつかない操作の前に人間の承認ゲートを備えています。

エージェントはますますデプロイ、送信、削除、支出を行うことが許可されるようになっています。その時点で2つのことが壊れますが、どちらもLLMの問題ではありません。

  1. ハンドオフが失われる。 エージェントが完了し、次のエージェントに作業を引き渡した後、プロセスが死ぬ。再試行もされず、誰も気づかない。

  2. チョークポイントがない。 承認はプロンプトの中に存在する — 「まず私に聞け」— これは制御ではなく提案であり、誰が何を許可したかの記録も残らない。

AgentBusはその下にある退屈なインフラです:少なくとも1回の配信を保証する耐久性のあるキュー、ブロッキングする人間の承認ゲート、そしてすべてのメッセージと決定の追記専用監査ログ。

                    ┌──────────────────────────────┐
   agents  ────────▶│  topics · groups · leases    │────────▶  workers
   (MCP/HTTP/CLI)   │  retries · dead letters      │
                    ├──────────────────────────────┤
   agent  ─ ask ───▶│  approval gate  ── blocks ───│──▶ human (phone/dashboard)
                    ├──────────────────────────────┤
                    │  append-only audit log       │
                    └──────────────────────────────┘
                         one SQLite file

ランタイム依存関係ゼロ。RedisもPostgresもブローカーもクラウドアカウントも不要。Node 24以上とファイル1つだけ。


クイックスタート

npx agentbus serve                 # http://127.0.0.1:7801 — API + dashboard

リスクのあるアクションを人間の承認でゲートする

agentbus ask "Deploy api build 118 to production" \
  --action deploy.prod --risk high \
  --detail "3 commits, including a migration that drops a column." \
  --payload '{"service":"api","build":118}' \
  --wait && ./deploy.sh

ask --wait はブロックしてリンクを表示します。人がスマートフォンで開き、承認または拒否すると、コマンドは 0 承認 · 10 拒否 · 11 期限切れ で終了します — したがって && は正確に正しい動作をし、決定はその人の名前で記録されます。

耐久性のある作業ハンドオフ

# Producer — survives a crash, deduplicated by key
agentbus pub job.render '{"file":"a.png"}' --key render-a

# Consumer — any shell command becomes a durable worker.
# Payload on stdin; exit 0 acks, non-zero retries with backoff, then dead-letters.
agentbus sub 'job.>' --group renderers --exec './render.sh'

未確認の作業はリースが切れるとキューに戻るため、ジョブの途中でワーカーが強制終了しても何も失われません。


Related MCP server: team-protocol

エージェントへのアクセス付与(MCP)

// .mcp.json  — or claude_desktop_config.json
{
  "mcpServers": {
    "agentbus": {
      "command": "npx",
      "args": ["-y", "agentbus", "mcp"],
      "env": { "AGENTBUS_URL": "http://127.0.0.1:7801", "AGENTBUS_AGENT": "deploy-agent" }
    }
  }
}

エージェントは request_approval、check_approval、publish、pull、ack、nack、stats を取得します。request_approval は人間が決定するまで ブロック し、明示的なガイダンスを返します:

{
  "state": "denied",
  "approved": false,
  "decidedBy": "sami",
  "reason": "not without a backup",
  "guidance": "Not approved (denied). Do NOT proceed. Tell the user and stop."
}

タイムアウトは pending を返し、決して approved を返しません — 沈黙は決して同意ではありません。


概念

トピック はドット区切りです:deploy.prod.api。パターンは1セグメントに *、残りに > を使用します — deploy.>、*.prod.api、>。

コンシューマグループ はそれぞれ一致するすべてのメッセージのコピーを取得します。グループ内では、メッセージは一度に1つのワーカーにのみ配信されます。新しいグループはデフォルトで 現在 から開始します;--earliest はバックログ全体を再生します。

リース はワーカーに可視性タイムアウト(デフォルト30秒、延長可能)を与えます。それを逃すとメッセージは再配信されます。max_attempts(5)の後、デッドレターとなり、ダッシュボードに表示され、1クリックで再生可能です。

承認 はタイトル、機械可読なアクション、自由形式の詳細、構造化ペイロード、リスクレベル、オプションのラベル付き選択肢(「カナリア10%」対「フルロールアウト」)を保持します。それらは永久にハングするのではなく期限切れになります。すべてのリクエストと決定 — 誰が、いつ、なぜ — は監査ログに記録されます。

順序付け はタイムスタンプではなくSQLiteシーケンスによって行われます:同じミリ秒に公開された2つのメッセージでも明確な順序があります。


HTTP API

メソッド

パス

POST

/v1/publish

{topic, payload, idempotencyKey?, delayMs?}

POST

/v1/pull

{group, patterns?, max?, leaseMs?, waitMs?} — ロングポーリング

POST

/v1/ack · /v1/nack · /v1/extend

配信を確定または延長

GET

/v1/stats · /v1/dead · /v1/audit

可観測性

POST

/v1/replay

デッドレターを再キュー化

POST

/v1/approvals

作成;署名付き共有可能URLを返す

GET

/v1/approvals/:id/wait

決定までロングポーリング

POST

/v1/approvals/:id/decide

{decision, by, reason?, choice?}

GET

/v1/stream

メッセージと承認のSSEテール

GET

/ · /a/:id

ダッシュボード · 単一承認ページ

AGENTBUS_TOKEN を設定すると Authorization: Bearer … が必要になります。承認リンクは独自のHMACトークンを保持するため、APIキーを渡さずにスマートフォンに送信できます。

環境変数: AGENTBUS_URL、AGENTBUS_TOKEN、AGENTBUS_DB、AGENTBUS_SECRET、AGENTBUS_AGENT、AGENTBUS_ALLOWED_ORIGINS。

ブラウザオリジンポリシー

デフォルトはループバック上の認証なしサーバーであり、つまり開いているWebページがそれに到達できる可能性があります。3つのルールがそれを防ぎ、トークンが設定されているかどうかに関係なく適用されます:

  • Origin ヘッダーを運ぶリクエストは、そのオリジンがサーバー自身のもの、AGENTBUS_URL のホスト、または AGENTBUS_ALLOWED_ORIGINS にリストされているものでない限り拒否されます。拒否は 403 を意味します — 単にCORSヘッダーが欠落しているだけでなく、応答を隠すが書き込みは実行するのではありません。

  • POST は content-type: application/json を要求します。フォームと text/plain ボディは、ブラウザがプリフライトなしで送信するCORS「シンプルリクエスト」であるため、それらを受け入れると穴が再び開きます。

  • 予期しない Host ヘッダーは拒否され、DNSリバインディングをブロックします。

ブラウザ以外のクライアント — CLI、MCPサーバー、curl、独自のスクリプト — は Origin を送信しないため影響を受けません。ダッシュボードをLANアドレスまたはプロキシ経由で提供して承認がスマートフォンに届くようにする場合は、AGENTBUS_URL(または --url)をその公開オリジンに設定します;承認リンクはそもそもそれから構築されます。


開発

npm test          # 66 tests, no network, no fixtures
npm run typecheck # strict, noUncheckedIndexedAccess, erasableSyntaxOnly

TypeScriptはネイティブ型ストリッピングによりNode 24上で直接実行されます — ビルドステップもランタイムパスにコンパイラもありません。


ライセンス

MIT

Maintenance

ActivityStale
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers