gam-seller-mcp-node について
gam-seller-mcp-node は、買い手エージェントが広告在庫、確定価格、空き状況を確認できるガバナンス付き MCP サーバーのプロトタイプです。広告サーバーへの書き込みではなく買い手単位の仮意向を使い、ハッシュチェーン監査台帳に判断を記録します。
主な機能
- 01許可された商品ファミリーと価格の公開
- 02段階化した空き状況予測の提示
- 03買い手単位の仮意向の作成と取り消し
- 04ツール要求の認証とレート制限
- 05監査台帳への判断の記録
- 06任意の読み取り専用 GAM 予測
活用シーン
- 01買い手エージェントによる許可済み広告在庫の発見
- 02空き状況と確定リスト価格の確認
- 03後続処理に向けた買い手の仮意向の記録
- 04許可・拒否された要求の監査
MCP 対応
能力や商品、予測の確認と、買い手単位の意向作成・取り消しを MCP ツールとして買い手エージェントに提供します。唯一の書き込み面は仮意向で、広告サーバーの注文は作成・変更しません。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
将来のGAM統合に向けた、ガバナンスを備えたMCPセラーコントロールプレーンのプロトタイプ。
買い手側の AI エージェントに、セラー側の広告在庫を公開するModel Context Protocol サーバーです。提供する機能は、在庫の検索、確定価格、買い手単位の仮予約プリミティブです。広告サーバーへの書き込み機能はありません。予測データは Google Ad Manager からリアルタイムに取得できます(オプトイン方式の読み取り専用 ForecastService スナップショット)。カタログはオペレーターが設定し、GAM に接続していない場合の予測データは合成データです。
このプロジェクトで解決する課題
セラー側の広告在庫(空き状況、価格、商品構成)は、商業上機微なデータや個人データを含むこともある広告サーバー内にあります。AI の買い手エージェントに GAM などのシステムへの API アクセスを直接許可すると、次の 3 つのリスクが生じます。
| リスク | このプロジェクトがない場合 | このプロジェクトがある場合 |
|---|---|---|
| データの過剰な公開 | エージェントが未加工の空き状況、取引 ID、正確な下限価格を読み取れる | 概略的な区分と事前定義されたファミリーのみを公開 |
| 意図しない書き込み | エージェントの SDK が注文を作成したり、広告枠を変更したりできる | 広告サーバーへの書き込み機能はありません。唯一の書き込みである買い手自身の仮予約は、GAM の注文や在庫の確保に変換されることはありません |
| 説明責任の欠如 | API 呼び出しは記録されても監査できない | ハッシュチェーン型の監査台帳に、許可・拒否のすべてを記録 |
仕組み
買い手エージェントは MCP 経由で接続し、5 つのツールを利用できます。3 つは読み取り専用で、残る 1 つは買い手単位の仮予約プリミティブ(作成・取り消し)で、唯一の書き込み手段です。
Buyer agent
│
├── well_known_capabilities ← Signed trust anchor. Check this first.
│ Returns: RS256-signed capability document, node identity, privacy posture.
│
├── discover_products ← What can I buy here, and at what firm price?
│ Returns: product families the buyer is entitled to see (e.g. "Pre-Roll Video"),
│ each with its formats, channel and sites, and its firm list price
│ when the publisher has configured them.
│ Never returns: deal IDs, internal IDs, raw inventory, exact per-impression pricing.
│
├── get_forecast ← How available is this family next quarter?
│ Returns: Low / Mid / High availability bucket.
│ Never returns: exact impression counts, CPM curves, floor prices.
│
├── check_availability ← Can you deliver 2.8M impressions of this family in October?
│ Returns: available / partial (up to ~2.7M, ~1.3M viewable) / unavailable, as of the
│ last forecast — and, when it does not fit, where it would ("November: 3.1M").
│ Volumes come from the forecast rounded down to 2 significant figures
│ (configurable by the publisher).
│ Never returns: other buyers' bookings, floor prices, audience data.
│
├── create_intent ← Commit to a product at its current firm price (with TTL).
│ Records a firm, time-boxed buying intent — rejected if the price is stale or
│ mismatched. NOT a GAM order and NOT an inventory hold; it is the handoff artifact
│ the classic sales rails pick up. Buyer-scoped: you can only ever commit as yourself.
│
└── revoke_intent ← Withdraw one of your own active intents by id.
ドメインロジックの実行前に、すべての呼び出しが同一のパイプラインを通過します。
Buyer request
│
▼
[SEC-GATE-3] Replay detection — deduplicate client_request_id
│
▼
[Auth] RS256 token validation → identity confirmed or AUTH_FAILED
│
▼
[Policy] Surface denylist → entitlement check → scope check (Default-Deny)
│
▼
[Rate limit] N=1 / T=30s per buyer_id
│
▼
[Domain] Catalog / ForecastEngine — synthetic, seeded or live GAM forecast snapshot
│
▼
[Disclosure] Response checked against the tool's strict schema — undeclared field → withheld
│
▼
[Audit] Append-only hash-chained ledger, buyer pseudonymized (HMAC)
│
▼
Response to buyer
リクエスト経路上の各ゲートは、失敗するとリクエストを拒否します。上の図について、正直に補足しておく点が 1 つあります。
client_request_id(リプレイ防止の重複排除キー)は、v0.9.0 以降、認証が必要なすべてのサーフェスでデフォルトで必須です。指定されていないリクエストは拒否されるため、省略によって SEC-GATE-3 を回避することはできません。オペレーターはMCP_REQUIRE_IDEMPOTENCY_KEY=0を設定して、レガシークライアント向けに明示的に無効化できますが、その場合は回避が可能になります。
レート制限の段階は、読み取り用サーフェス、create_intent、revoke_intent を含む、認証が必要なすべてのツールに適用されるため、これを回避する認証済みサーフェスはありません。
ディスク上の台帳が破損または改ざんされている場合、起動時に検出され、ノードはサービスの提供を拒否します(読み込み時にフェイルクローズし、最初のリクエストの前にチェーンの整合性を検証します)。空のチェーンにリセットされることはありません。
create_intent は同じゲートを実行し、記録前にさらに 1 つチェックします。買い手の price_ref がファミリーの現在の確定価格と一致しない場合、リクエストは拒否されます。
クイックスタート
1 つのコマンドでパイロットを完全に実行できます。
scripts/pilot.shは、本番環境向けのガードを有効にして設定済みのノードを起動し、権限を持つ買い手ごとに買い手トークンを発行します。また、買い手エージェントで一連の流れ(検索 → 予測 → 仮予約 → 取り消し)を実行する方法を表示します。詳しくはdocs/PILOT-QUICKSTART.mdをご覧ください。参照用の買い手エージェントはexamples/buyer-client-ts/agent.tsにあります。TLS の背後でホストする手順はdeploy/に用意されています。
MCP クライアントにインストールする(npx 経由)
サーバーを MCP クライアント(Claude Desktop、Claude Code、Cursor など)に追加します:
{
"mcpServers": {
"gam-seller": {
"command": "npx",
"args": ["-y", "gam-seller-mcp-node"]
}
}
}
または、直接実行します(stdio トランスポート — MCP クライアントのデフォルト):
npx -y gam-seller-mcp-node
デモモード。 独自の設定がない場合、ノードは同梱の
pilot-publisherの例(カタログ、価格、予測の例)で起動し、その旨を stderr に出力します。失敗するのではなく起動するため、すぐにツールを試せます。 購入者向けの機能では常にトークンが必要なため(デモでも匿名での利用はできません)、 ノードは起動時にすぐに使えるデモ用購入者トークンを出力します。これをコピーし、discover_products/get_forecastのtoken引数に渡すと、サンプルの ファミリー、価格、予測を確認できます。実際のデプロイでは、独自の
deployment.json、catalog.json、entitlements.json、pricing.jsonを含むディレクトリをMCP_CONFIG_DIRに指定します:MCP_CONFIG_DIR=/etc/gam-seller/config npx -y gam-seller-mcp-node
ソースから
git clone https://github.com/juan-sibbo/gam-seller-mcp-node.git
cd gam-seller-mcp-node
npm install
npm run build
npm run start:http # HTTP transport on 127.0.0.1:3900
購入者エージェントのウォークスルー全体(スクリプト化されたデモ)を実行します。実際の インプロセス MCP トランスポート上で 5 つのネイティブツールを動かし、ガバナンスに基づく拒否 (フェイルクローズの認証、Default-Deny、フェイルクローズの価格設定)で締めくくり、 監査チェーンを検証します:
npm run demo # or: npx tsx demo/run-demo.ts
Docker を使用する
docker compose up
ノードは 127.0.0.1:3900 で起動します。Well-Known ドキュメントは
/.well-known/seller-mcp-capabilities にあります。キーと監査データ用の永続ボリュームは
docker-compose.yml で事前設定されています。
パブリッシャー向けの設定
パブリッシャー固有の動作は、4 つの JSON ファイルですべて制御します。コードを変更する必要はありません。config/(ソースから実行する場合)、または MCP_CONFIG_DIR で指定したディレクトリ(npx/コンテナ環境)に配置してください。
deployment.json # DSR contact, controller model, data retention window
catalog.json # product families + per-buyer access grants
entitlements.json # which buyers are entitled to which MCP surfaces
pricing.json # firm list prices per family (fail-closed on expiry)
forecast.json # OPTIONAL — seed availability buckets from real numbers (still synthetic-labeled)
gam.json # OPTIONAL — live GAM forecast (network, service-account key path, family → targeting)
設定が無効な場合は、常にフェイルクローズします。不正な形式のファイルがあると、アクセスポリシーが気付かないうちに変わった状態で実行するのではなく、ノードを停止します。設定が存在しない(config/ も MCP_CONFIG_DIR もない)場合は、同梱の config/examples/pilot-publisher/ のサンプルに切り替わり、デモモードであることを標準エラー出力に通知します。そのため、ノードが壊れた状態でインストールされることはなく、実環境へのデプロイか、デモであることが明示された状態のどちらかになります。
パイロット版を実在庫に移行する(GAM へのライブ接続を除く)には、設定のみで対応できます。詳しくは docs/PUBLISHER-DEPLOYMENT.md を参照してください。
- 予測データを初期投入するには、GAM レポートから一度だけエクスポートしたパブリッシャー独自の在庫状況を、オプションの
forecast.jsonで指定します(テンプレート:config/examples/pilot-publisher/forecast.sample.json)。これによりバケットが実態に即したものになりますが、すべての結果はsynthetic: trueのままです。事前に読み込んだデータはライブ読み取りではないため、GAM からライブ取得したという主張にはなりません。 - GAM にライブ接続するには、オプションの
gam.json(テンプレート:config/examples/pilot-publisher/gam.sample.json)を設定し、予測を実行できる読み取りロールを持つサービスアカウントを GAM ネットワークに追加します。ノードは起動時と 30 分ごとに、設定された各ファミリー × 期間についてForecastService.getAvailabilityForecastを呼び出します。このとき使用するのは保存されない仮想の広告申込情報です。GAM 上では何も作成、変更、予約されません。購入者には、synthetic: falseの Low/Mid/High バケットとしてスナップショットを返し、生の在庫状況がノードの外に出ることはありません。優先順位はgam.json>forecast.json> 合成データです。 - 引き継ぎのループを閉じるには、確定したインテントをパブリッシャーの営業システムに渡すために
MCP_INTENT_HANDOFF=fileを使用します(運用担当者のフォワーダーが監視する、ローカルの JSONL 出力です)。この引き継ぎでは外部への呼び出しは行われません。転送は運用担当者のプロセスであり、URL の値は拒否されます。引き継ぎレコードは通知であり、GAM の注文や在庫の確保ではありません。 - 運用に向けてセキュリティを強化するには、
MCP_REQUIRE_OPERATOR_CONFIG=1(デモ設定での起動を拒否)とMCP_ANCHOR_SINK=tsa(監査証跡を第三者にアンカー)を設定します。
ネットワークへの外向き通信 — 全拒否ではなく、明示して制限します。 購入者のリクエスト処理では、外部へのネットワーク呼び出しは行いません。ライブ GAM 予測(gam.json)では、起動時と 30 分ごとの更新サイクルに、設定されたネットワークを対象として Google の OAuth トークンエンドポイントと Ad Manager SOAP API を呼び出します。購入者のリクエスト中には呼び出さないため、購入者がパブリッシャーの GAM に負荷を発生させることはできません。オプションの監査アンカリングでは、購入者のリクエスト経路外(起動時および定期的なアンカーサイクル)で、運用担当者が設定した外向き通信が発生する場合があります。TSA バックエンド(MCP_ANCHOR_SINK=tsa)は、台帳のヘッドハッシュを設定済みの RFC 3161 認証局に送信します。S3 バックエンド(MCP_ANCHOR_SINK=s3)は、設定済みの Object Lock バケットにアンカーレコードを書き込みます。カスタムシンクモジュール(MCP_ANCHOR_SINK=<module>)は、運用担当者が提供したコードを実行します。デフォルトのローカルアンカーバックエンドは、外部へのネットワーク呼び出しを行いません。接続先は運用担当者の設定からのみ決まり、購入者の入力で選択することはできません。この範囲は tests/egress-surface.test.ts で固定されています。新しい外向き通信機能を追加する場合、意図的に宣言するまでは CI に失敗します。
GAM API を直接使用しない理由
| アプローチ | データの露出 | 書き込み可能性 | 監査可能性 | AI エージェントへの適合性 |
|---|---|---|---|---|
| Raw GAM API | アカウント内のすべての情報 | 完全な CRUD | ログ記録のみ | 低い(SOAP/REST、MCP なし) |
| OpenRTB 入札リクエスト | ユーザーレベルのデータ、フロア価格 | 入札のみ | なし | 低い |
| このサーバー | ライブ予測から取得するファミリーと空き状況の確認 | 購入者自身のソフトコミットメントのみ(GAM への書き込みなし) | ハッシュチェーン台帳 | MCP ネイティブ |
現在の状況
動作するプロトタイプです。リクエストパイプライン全体(認証 → ポリシー → レート制限 → ドメイン → 監査)、
購入者単位のコミットメントプリミティブ(create_intent / revoke_intent、TTL による期限切れ)、
監査台帳、GDPR データ主体の権利に関するツールキット、Docker パッケージング、HTTP トランスポート、
ライブ相互運用性プローブ(Python 購入者エージェントのシミュレーション)は、すべて実装およびテスト済みです。
永続化レイヤーは再起動に耐えるよう強化されています(追記専用、アトミックな書き込み、永続的なローテーション状態、
フェイルクローズドな読み込み)。ヘッドハッシュアンカーは追記専用で、選択可能な外部 WORM バックエンド(RFC 3161 タイムスタンプ/S3 Object Lock)を備えています。残る制約(実際に一度だけ書き込める保存先は運用者のインフラ作業です)については、
既知の制限を参照してください。
GAM との接続 — 予測のみ:ライブアダプター
(src/forecast/gam-source.ts)は、
gam.json がある場合、GAM の ForecastService から在庫状況を読み取ります。カタログのファミリーと、それらの GAM ターゲティング(広告ユニット、
サイズ、環境)は、引き続き設定で手動マッピングされ、価格は固定の定価です。
gam.json がない場合、予測は合成値(またはシード値)となり、その旨を示します(synthetic: true)。ロードマップについては
未解決の課題を参照してください。
既知の制限 — 日付時点の状況です。解決済みの行も意図的に残しています。状態が変化する制限の一覧は、誠実さと進捗の両方を示す証拠となるためです。
| 制限 | 該当箇所 | 状況 | 解決内容 |
|---|---|---|---|
アトリビューション(buyer_id / request_id)はエントリーごとに保存されますが、チェーンの改ざん検知ハッシュの対象外です | audit/event.ts | 欠陥ではなく設計上の決定です — トレーサビリティと消去可能性の両立 (ADR-4) | — |
ヘッドハッシュアンカーは書き込みのたびにファイル全体を書き換えていました(writeFileSync)— 追記専用ではなく、外部 WORM もありませんでした | audit/anchor.ts | ✅ 解決済み 2026-08-23 — 追記専用 JSONL と注入可能な AnchorSink。MCP_ANCHOR_SINK により tsa(RFC 3161)と s3(S3 Object Lock)バックエンドを選択可能です | #92 #94 #95 |
| 外部 WORM アンカリングでは、運用者が実際に一度だけ書き込める保存先(TSA URL またはロックされたバケット)を指定する必要があります — ノードに含まれるのはバックエンドであり、保存先ではありません | audit/anchor-tsa.ts、audit/anchor-s3.ts | 未解決 — デプロイ境界(インフラ作業) | — |
client_request_id(リプレイガード)は任意でした。省略すると SEC-GATE-3 を回避できました | src/server.ts | v0.9.0 で解決済み — すべての認証済みインターフェースでデフォルト必須(フェイルクローズド)です。MCP_REQUIRE_IDEMPOTENCY_KEY=0 は運用者が明示的に無効化する設定です | #82 |
| 転送中の TLS がありません(リバースプロキシによる終端を想定) | — | 未解決 — デプロイ境界 | — |
revoke_intent はレート制限ステージの対象外です | src/server.ts | ✅ 解決済み 2026-08-18 — すべての認証済みインターフェースと同様に、レート制限ゲートの対象になりました | #80 |
GDPR DSR CLI(scripts/dsr.ts、…)が npm パッケージに含まれていません | package.json の files | ✅ 解決済み 2026-08 — gam-seller-dsr bin として同梱されます | #78 |
| 台帳がフェイルオープンで読み込まれていました — ファイルが破損すると、空のチェーンにリセットされていました | audit/ledger.ts | ✅ 解決済み 2026-08-07 | #65 |
| 起動時、リクエストの処理開始前にチェーンの整合性を検証していませんでした | src/server.ts | ✅ 解決済み 2026-08-07 | #65 |
アーキテクチャ
モジュールマップとデータフロー図については、docs/ARCHITECTURE.mdを参照してください。
主なモジュール:
| モジュール | 役割 |
|---|---|
src/server.ts | MCP ツールの定義とリクエストパイプライン |
src/policy/ | Default-Deny エンジン、権限ストア、サーフェスの許可リスト/拒否リスト、ツールごとの開示スキーマ |
src/identity/ | RS256 鍵管理、トークンの発行/検証、失効拒否リスト |
src/audit/ | ハッシュチェーン台帳、HMAC による仮名化、選択可能な WORM バックエンド(anchor-tsa.ts、anchor-s3.ts)を使用した追記専用のヘッドハッシュ・アンカリング |
src/pricing/ | 企業の定価ストア、期限を考慮(価格が古い場合はフェイルクローズ) |
src/forecast/ | バケットエンジンとソース:合成データ、シード済みデータ、ライブ GAM スナップショット |
src/gam/ | サービスアカウント OAuth と最小限の Ad Manager SOAP クライアント(読み取り専用) |
src/dsr/ | GDPR 第15/17/18/20条に基づくデータ主体の権利ツールキット(gam-seller-dsr バイナリとしても提供) |
src/catalog/ | 製品ファミリーストア、購入者ごとのアクセス権付与 |
セキュリティモデル
デフォルト拒否。 明示的な権限がない限り、すべてのリクエストは拒否されます。コードには「デフォルトで許可」する経路はありません。
ツールを呼び出せる主体と、ツールが返せる内容の2つのゲート。 ポリシーレイヤーはサーフェスのラベルに基づいて動作します。認証された各ツールは登録時に許可されたサーフェスを1つ宣言し、正確な価格、取引ID、生の在庫数、購入者間の状態、実際の在庫予約(ソフトロック)、広告サーバーへの書き込みは、恒久的に拒否リストに登録されます。このラベルチェックではレスポンスを確認しないため、許可されたラベルのツールが返すべきでない情報を返すことを、それだけで防ぐことはできません。それを防ぐのが開示ゲートです。認証されたすべてのツールは厳格なレスポンススキーマ(src/policy/disclosure.ts)を宣言する必要があり、宣言されていないフィールドを含むレスポンスは保留され、汎用的なINTERNAL_ERRORに置き換えられます(mcp_disclosure_rejected_totalに計上)。このスキーマがなければ新しいツールを登録できないため、購入者に表示されるフィールドを追加するには、レビュー可能な1つのファイルを変更する必要があります。許可されている唯一の書き込みは、購入者自身のコミットメント(create_intent/revoke_intent)です。この操作にはサーフェス許可リストへの明示的な修正が必要で、購入者の範囲内に限定されます。
不透明なエラー。 拒否されたリクエスト、認証の失敗、失効したトークンは、いずれも同じ汎用コードAUTH_FAILEDを返します。内部の理由が購入者に伝わることはありません。
監査優先。 すべての許可/拒否は、レスポンスを送信する前に台帳へ書き込まれます。購入者のbuyer_id値は、チェーンに格納される前に仮名化(HMAC-SHA256)されます。buyer_idとrequest_idは各監査エントリに格納されますが、ハッシュチェーンの正規化入力(audit/event.ts:50)には含まれないため、チェーンによる改ざん検知の保証対象外です。
設計によるプライバシー保護。 レスポンスに含まれるのは在庫レベルのデータ(製品ファミリー、粗いバケット)のみです。ユーザーレベルの属性がレスポンス経路に含まれることはありません。
詳しい説明については、docs/DESIGN-PRINCIPLES.mdを参照してください。
規制上の位置づけ
AEPD(スペインのデータ保護機関)は、2026年2月にエージェント型AIシステムに関するガイドラインを公表しました。広告在庫ノードに最も関連する4つの推奨事項は、既存の設計判断に直接対応しています。
| AEPDの推奨事項 | このノードでの対応 |
|---|---|
| 設計時およびデフォルトでの保護 | デフォルト拒否:明示的な権限付与がアクセスを許可しない限り、すべてのサーフェスへのアクセスを拒否します |
| エージェントの操作を記録し、文書化する | 追記専用のハッシュチェーン監査台帳。許可/拒否はすべて、応答の送信前に記録されます |
| 第三者に送信される情報と、その追跡可能性を管理する | バイヤー向け開示許可リスト(SEC-GATE-):正確な価格、ディール ID、生の空き状況は、応答から恒久的に除外されます。ネットワーク送信先許可リスト:外部への接続は、オペレーターが選択した監査アンカーと、オペレーターが選択した GAM 予測の更新(上記のネットワーク送信先*を参照)のみで、CI によって固定されています |
| エージェントのメモリを目的と保持期間のルールに基づいて管理する | DSR ツールキット(第15条/第17条/第18条/第20条)。設定可能な保持期間が監査台帳に適用されます |
この整合性は、署名付きの well-known ドキュメント(/.well-known/seller-mcp-capabilities)内の privacy_posture.regulatory_alignment_declared に、機械可読形式で宣言されています:["GDPR", "AEPD-orientaciones-IA-agentica-2026"]。バイヤーエージェントや監査担当者は、この README を信頼することなく、暗号学的に検証できます。
このノードは、法的判断を行いません。特定の処理に正当な根拠があるか、同意が有効か、特定の取り扱いが許可されるかといった判断は行いません。これらの判断は管理者(放送事業者)が行います。ノードは仕組みを提供し、管理者が基準を適用します。この境界によって、EU データ法の交渉がどのような結果になっても、ノードの設計を安定させられます。
機械可読な信頼アンカー
/.well-known/seller-mcp-capabilities エンドポイントは、RS256 署名付き JWT を返します。バイヤーエージェントは、最初の認証済みリクエストを行う前にこのドキュメントを読み取り、検証します。その中の privacy_posture ブロックは機械可読であり、ノードの鍵ペアによって暗号学的に結び付けられています。
| プロパティ | 現在の値 | 意味 |
|---|---|---|
end_user_personal_data | "none" | いずれの応答経路にもエンドユーザーの個人データはありません |
audience_segmentation | "not_offered_v1" | オーディエンスターゲティング用のサーフェスはありません |
tc_string_consumption | "none" | ノードは TC 文字列を消費しません(サーバー間、PATH A) |
device_storage_access | "none" | デバイスストレージへのアクセスはありません(ePrivacy 該当なし) |
jurisdiction | ["ES", "EU"] | 宣言された運用管轄区域 |
regulatory_alignment_declared | ["GDPR", "AEPD-orientaciones-IA-agentica-2026"] | 宣言された整合性 |
dsr_contact | deployment.json から取得 | データ主体からの請求に関する連絡先 |
controller_model | deployment.json から取得 | パブリッシャーが宣言した管理者の役割 |
audit_retention | deployment.json から取得 | ホット/アーカイブの保持期間(日/月) |
well-known ドキュメントには未掲載(暗黙のままのプロパティ):
- カタログデータと予測データが合成データか実データか(
data_source) - ヘッドハッシュのアンカリングにローカルファイルとクラウドの Object Lock のどちらを使用するか(
anchor_store) - ノードがデモモードか、実際のパブリッシャー設定を提供しているか(
deployment_mode)
これらのプロパティがあれば、バイヤーエージェントはデモ環境と本番環境を、ローカルにアンカリングされたノードと外部の改ざん検知機能を備えたノードを、プログラムで区別できるようになります。これらは現行バージョンには含まれていません。
テスト
npm test # full suite (vitest)
python3 sandbox/buyer-agent-probe.py # external Python interop probe (no shared code with server)
テストスイートには、次のテストが含まれます。
- 各モジュール(policy、pricing、identity、audit、catalog、forecast、DSR)のユニットテスト
- 実際のインメモリ MCP トランスポートを使用した統合テスト(
tests/server.test.ts) - 実際の一時ポート HTTP サーバーを使用したHTTP トランスポートテスト(
tests/http.test.ts) - 購入者エージェントのセッション全体をシミュレートするエンドツーエンドのセッションテスト(
tests/buyer-agent-session.test.ts) - 共有の Node.js コードを使用せずに HTTP トランスポートをテストする外部 Python プローブ
CI は GitHub Actions により、プッシュのたびに実行されます。
データ保護
生の buyer_id 値が監査台帳に記録されることはありません。記録されるのは HMAC による仮名のみです。
src/dsr/toolkit.ts は、購入者の監査データのエクスポート、制限、消去を実装しています(GDPR 第15条/第17条/第18条/第20条)。ノードはエンドユーザーに関する情報を保存しません。DSR の対象範囲は、記録される内容そのもの、つまり B2B 購入者組織の仮名とそのリクエストイベントです。
配布に関する注意。 オペレーターコマンドは npm パッケージとコンテナーイメージに gam-seller-admin バイナリ(issue-token、revoke-token、dsr …。DSR コマンドのエイリアスとして gam-seller-dsr も引き続き使用可能)として同梱されるため、チェックアウトは不要です。これらのコマンドはノードの状態を書き換えるため、ノードの停止中にのみ実行できます。実行中のノードが状態ディレクトリを所有している場合(所有者リース)、コマンドは終了コード 3 で拒否されます。scripts/*.ts エントリーは、同じコードを使用する開発用ラッパーです。
ロードマップ
ロードマップの全容については、未解決の Issueをご覧ください。主な項目は次のとおりです。
- GAM インベントリーマッピング — 手書きの
gam.jsonではなく、GAM の広告ユニット/プレースメントからファミリーターゲティングを導出 - 購入者エージェント SDK — MCP 購入者フロー向けの Python および TypeScript クライアントライブラリ
- OpenRTB 3.0 タクソノミー —
family_idの方式を IAB 標準に準拠させる - 広く知られているオブザーバビリティプロパティ — 購入者エージェントがデモと本番環境をプログラムで識別できるよう、
data_source/anchor_store/deployment_modeを公開
(Prometheus の /metrics エンドポイントはすでに提供されています。ループバックのみで、オプトイン方式です。)
コントリビューション
CONTRIBUTING.mdをご覧ください。
good first issueのラベルが付いた Issue は、取り組みを始めるのに適しています。
ライセンス
MIT — LICENSEをご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。