Skip to main content
Glama
jmazzahacks

byteforge-aegis-mcp

by jmazzahacks

byteforge-aegis-mcp

ByteForge Aegis管理APIに対する読み取り専用のMCPサーバーで、Gatekeeper認証付きのnginxの背後にコンテナとしてデプロイされています。

なぜ必要か

Aegisおよびテナント統合に取り組むエージェントは、「本番環境で実際に何が設定されているのか?」という問いに繰り返し答える必要があります。Webhook URLが設定されているか、allow_self_registrationが有効か、どのサイトが存在するか、このユーザーが存在するかなどです。このサーバーが登場する前は、そのような問いにはマスターAPIキーを使った手動のcurlで答えていました。あるいは全く答えられず、サイト設定を読み戻せなかったため、テナントプロビジョニングリクエストが主張に基づいて部分的に承認されたこともありました。

Related MCP server: readonly-mcp-akamai

設計による読み取り専用

すべてのツールはGETにマッピングされています。このラッパーが使用するAegisクライアントはcreate_site、update_site、delete_site、delete_userなども公開していますが、ここからはアクセスできず、追加すべきでもありません。このサーバーの価値は、本番環境の状態を変更する可能性が一切ない状態でエージェントに渡せることです。もし変更操作が必要になったとしても、それは別の、別途認可されたデプロイメントに属するものです。

ツール

ツール

回答する内容

aegis_health

どのビルドが稼働中か(status、service、version)

aegis_list_sites

インスタンス上のすべてのテナント(シークレット含む)

aegis_get_site

1つのサイトの完全な設定(UUIDまたはドメインで指定)

aegis_list_users

サイト上のすべてのユーザー

aegis_find_user

サイト上の1人のユーザー(メールアドレスで検索、大文字小文字を区別しない)

aegis_get_siteとaegis_list_usersはUUIDだけでなくドメインも受け付けます。管理APIはUUIDでのみサイトを識別します(utils/identifiers.pyのresolve_siteはUUID以外を拒否します)。そのため、ドメインは最初に公開のby-domainルックアップを通じて解決されます。呼び出し元はほとんどの場合、UUIDではなくドメインを知っています。

レスポンス内のシークレット

サイトの読み取りには、tenant_api_key、webhook_secret、mailgun_api_keyが完全な形で含まれます。これは@jmazzahacksが存在を示すブール値を返すよりも意図的に選択した方法です。その結果、ここで読み取られたものはすべて呼び出し元のエージェントのトランスクリプトに記録されるため、レスポンスをチケットや他の共有画面に貼り付けてはいけません。AEGIS_MASTER_API_KEYはインスタンス上のすべてのサイトに及びます。

設定

変数

目的

AEGIS_API_URL

読み取り対象のAegisインスタンス(例:https://aegis.example.com)

AEGIS_MASTER_API_KEY

マスターキー。すべてのサイトに及びます

MCP_TRANSPORT

ローカル開発ではstdio、Dockerではstreamable-http

FASTMCP_HOST / FASTMCP_PORT

バインドアドレス。FastMCPがこれらを特に読み取ります

example.envを参照してください。

ローカル開発

uv venv --python 3.13 .venv
source .venv/bin/activate
uv pip install -r requirements.txt

AEGIS_API_URL=https://aegis.example.com \
AEGIS_MASTER_API_KEY=... \
MCP_TRANSPORT=stdio \
python aegis_mcp_server.py

venvはリポジトリルートではなく.venv/にあります。これは兄弟のAegisリポジトリとは異なります。uv venvは空でないディレクトリにvenvを作成することを拒否するためです。

デプロイ時と同様にネットワーク経由で動作を確認するには:

MCP_TRANSPORT=streamable-http FASTMCP_HOST=127.0.0.1 FASTMCP_PORT=8931 \
AEGIS_API_URL=... AEGIS_MASTER_API_KEY=... python aegis_mcp_server.py &

curl -s -X POST http://127.0.0.1:8931/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

initializeなしで成功するtools/listは、ステートレスモードが有効であることを示します。

ビルドと公開

./build-publish.sh            # or --no-cache

ghcr.io/jmazzahacks/byteforge-aegis-mcp:<n>と:latestを公開し、その後VERSIONを進めます。VERSIONはgitignoreされており、スクリプトが完全に管理します。手動で編集しないでください。

byteforge-aegisとは異なり、このイメージはVERSIONを自身に焼き付けません。そのため、ここではスクリプトのビルド後の書き込み順序が正しく機能します。もしバージョンエンドポイントが追加された場合、書き込みはdocker buildの前に移動する必要があります。そうしないと、すべてのイメージが1バージョン古いものを報告することになります。

デプロイメント

Gatekeeper auth_request認証を使用するmcp.<domain>統合バーチャルホストの背後で動作します。ロケーションブロックについてはnginx-mcp-aegis.confを参照してください。コンテナはホストポートを公開しません。nginxは共有Dockerネットワーク上のコンテナ名で到達します。これは、マスターキーが直接の露出を許容しないため重要です。

トランスポート

stateless_http=Trueを使用したstreamable-http。SSEではありません。Claude Codeの長期間存続するSSE GETが停止すると、initializeを再実行せずに再接続し、サーバーが最初にtools/callを認識し、結果として-32602が発生して手動で/mcpをリロードするまでクライアントが動かなくなります。ステートレスなstreamable-httpには失うべきセッションごとの状態がないため、そのような障害は構造的に発生し得ません。

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Read-only MCP server that allows AI assistants to query and monitor KVM Fleet devices, audit logs, and console sessions through the official REST API.
    5
    16 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A read-only MCP server that provides tools to list and read devices, MDM servers, blueprints, configurations, apps, packages, users, and other resources from Apple Business Manager and Apple School Manager.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Read-only MCP server to inspect allowlisted Docker containers, systemd services, JSONL logs, and HTTP health endpoints without arbitrary shell access.
    MIT