PG1 Sovereign Threat Intelligence について
PG1 Sovereign Threat Intelligenceは、AIエージェントやセキュリティツール向けに脅威情報を確認します。関連チェックをまとめた実行前判定を行い、結果にEd25519署名を付けてオフライン検証を可能にします。
主な機能
- 01ウォレット・ドメイン・ホスト名の確認
- 02npm・PyPIパッケージの確認
- 03CVEと脅威アクターの検索
- 04複数チェックによる実行前判定
- 05Ed25519署名結果の検証
活用シーン
- 01支払い前のウォレット確認
- 02リンクを開く前のドメイン確認
- 03インストール前のnpm・PyPIパッケージ確認
- 04CVEの評価と結果の検証
MCP 対応
MCPサーバーは、実行前判定、ウォレット・ドメイン確認、パッケージ・CVE検索、署名検証のツールを提供します。一部の確認は無料で、x402による有料呼び出しも利用できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://pg1-ai-agent.vercel.app/api/mcpclaude mcp add --transport http project-gifted1-pg1-threat-intel https://pg1-ai-agent.vercel.app/api/mcp{"mcpServers":{"project-gifted1-pg1-threat-intel":{"type":"http","url":"https://pg1-ai-agent.vercel.app/api/mcp"}}}Cursor で開く{"servers":{"project-gifted1-pg1-threat-intel":{"type":"http","url":"https://pg1-ai-agent.vercel.app/api/mcp"}}}VS Code で開く{"mcpServers":{"project-gifted1-pg1-threat-intel":{"type":"http","url":"https://pg1-ai-agent.vercel.app/api/mcp"}}}{"mcpServers":{"project-gifted1-pg1-threat-intel":{"serverUrl":"https://pg1-ai-agent.vercel.app/api/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
20| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| chain | enum | いいえ | ウォレットへの支払いに使用するチェーン(デフォルトは base)。base | ethereum | arbitrum | optimism | polygon | bsc |
| action | enum | はい | これから実行する操作。pay | open | install | patch | trust_agent |
| target | string | はい | 操作対象:ウォレットアドレス、URL、ホスト名、パッケージ名(name または name@version)、CVE ID、「vendor product version」、またはエージェントの URL/ドメイン。 |
| ecosystem | enum | いいえ | install で使用するパッケージレジストリ。npm | pypi |
詳細
PG1 主権型脅威インテリジェンス API
AI エージェントとセキュリティツール向けの脅威インテリジェンス API および MCP サーバーです。
ライセンスキー: データライセンスの最終調整中のため、新規販売を一時停止しています。無料プランと x402 は引き続きご利用いただけます。
エージェント向け
まずは無料の個別チェックから始めましょう。実行前に一度で判断したい場合は、preflight_check を使ってください。
有料プランを今すぐ無料でお試しください: すべての呼び出し元は、キー、アカウント、支払いなしで、1 日 5 回まで有料呼び出しを利用できます。支払いの前に、無料の get_usage_status ツールから free_tier_calls_remaining_today を取得するか、レスポンスヘッダー X-Free-Tier-Remaining を確認してください。
エージェントが PG1 を使う理由
自律型エージェントは、これまで見たことのないものに対して行動します。ウォレットへの支払い、リンクの閲覧、パッケージのインストール、CVE の修正などです。PG1 はその対象を事前にチェックし、reasons + status + checks という機械可読形式で回答します。これにより、エージェントは自ら判断でき、人はその理由を監査できます。
- 「安全」とは決して言いません。 PG1 が把握しているのは、ソースに記録された情報だけです。そのため、最良の回答も
no_flags、つまりチェックしたソースで何も見つからなかったという意味にとどまります。チェックが完了しなかった場合は、no_flagsではなくunknownになります。 - 無料で始められます。 ウォレット、ドメイン、ホスト名、パッケージのチェックは常に無料です。有料呼び出しは 1 日 5 回まで無料で、その後は x402 経由で Base 上の USDC により 1 回あたり 0.01 USD です。アカウントもキーも必要ありません。
- 行動前に 1 回呼び出すだけ:
preflight_checkは、これから行うアクション(pay、open、install、patch、trust_agent)とその対象を受け取り、関連するすべてのチェックを並行して実行し、1 つの判断を返します。フェイルクローズ方式のため、チェックが完了しない場合はunknownになります。 - 署名付きの結果。 すべての結果には、リクエスト、結果、ソース、タイムスタンプ、PG1 のバージョンを対象とした Ed25519 署名が付与されます。/.well-known/pg1-signing-key を使ってオフラインで検証するか、無料の
verify_resultツールで確認できます。 - 特に重要なツール:
preflight_check、check_wallet_sanctions、check_wallet_age、check_hostname_reputation、check_domain_age、check_package、get_cve_details、get_cve_batch、get_threat_actor_profile、get_ioc_context。
30 秒以内に接続できます。クライアントに MCP サーバーを追加してください:
{ "mcpServers": { "pg1": { "type": "http", "url": "https://pg1-ai-agent.vercel.app/api/mcp" } } }
または、直接呼び出してください:
curl -X POST https://pg1-ai-agent.vercel.app/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_hostname_reputation","arguments":{"hostname":"example.com"}}}'
A2A エージェントは https://pg1-ai-agent.vercel.app/api/a2a を使用してください(エージェントカードは /.well-known/agent-card.json にあります)。
呼び出すツール
| 対象 | 呼び出すツール | 備考 |
|---|---|---|
| これから実行する操作(支払い、開く、インストール、パッチ適用、エージェントを信頼するなど) | preflight_check | 1つの判定が必要な場合は、まずこれを呼び出してください。1回あたり0.01 USDで、1日5回まで無料です(ほかの有料ツールと共通)。以下のチェックを並列で実行し、no_flags(フラグなし)、flagged、unknownのいずれか1つの判定を返します。フェイルクローズ方式です。チェックが完了しない場合、判定はno_flagsではなく必ずunknownになります。 |
| これから支払うx402エンドポイント | check_x402_endpoint | 402支払いリクエストを読み取り、payToの制裁対象該当性とウォレットの利用期間、ネットワークとアセットの妥当性、TLS、ドメインの登録期間を確認します。 |
| これから信頼する別のエージェント | check_agent_card | A2Aエージェントカードを取得し、スキーマの有効性、ドメインの登録期間と評判、類似名を確認します。 |
| ワークロードのホスティング先(プライバシー、データの保存場所、レイテンシ、稼働時間、予算) | hosting_advisor | 根拠を添えたリージョンとプロバイダーのランキング、冗長化計画、プライバシー・バイ・デザインに関するガイダンスを提供します。有料です。法的助言ではありません。REST:POST /api/hosting-advisor。 |
| PG1の結果とその署名 | verify_result | PG1が公開している鍵を使って、Ed25519署名を検証します。常に無料です。 |
| 1つのIP、ドメイン、URL、またはファイルハッシュ | get_ioc_context | 記録がない場合(found: false)は無料です。PG1のライセンス対象レコードには、現時点ではNVD由来のCVE IDのみが含まれるため、IP、ドメイン、URL、ハッシュに対してはfound: falseを返します。ドメインまたはホスト名の場合は、以下のホスト名チェックも2つ実行してください。 |
| 複数のインジケーター(最大20件) | get_ioc_batch | 1件も見つからない場合(上記と同じCVEのみのレコード)は無料です。バッチのstatusだけでなく、resultsの各エントリーを確認してください。 |
| CVE ID | get_cve_details | 複数のIDには、get_cve_batch(最大20件)を使用してください。 |
| CVE IDなしのベンダーと製品 | get_cve_by_product | 既知の悪用済みCVEが先に表示されます。 |
| これから支払う、または信頼するウォレットアドレス | check_wallet_sanctions and check_wallet_age | 制裁リストとの照合後、オンチェーンの利用期間を確認します。履歴のないウォレットにはフラグが付きます。 |
| リンク、ホスト名、またはフィッシングの可能性があるサイト | check_hostname_reputation and check_domain_age | リスト掲載済みまたは類似するホスト名を確認後、登録期間を確認します。登録から30日未満のドメインにはフラグが付きます。 |
| インストール前のnpmまたはPyPIパッケージ | check_package | 存在しない名前、悪意のある報告、または人気パッケージに最近似せた名前にフラグを付けます。 |
| 脅威アクター名またはAPT名 | get_threat_actor_profile | MITRE ATT&CKの詳細情報を返します。 |
| 1つのパブリックIPと自分のAbuseIPDBキー | check_ip_abuse | キーはX-AbuseIPDB-Keyで送信してください。PG1は独自のキーを持っていません。 |
| 取り込むCVEリスト | get_threat_indicators | NVDのCVEレコードを含むSTIX 2.1バンドルです。含まれるのはCVE IDとNVDの参照情報のみで、スコアやIP/ドメイン/URL/ハッシュのインジケーターは含まれません。REST:GET /api/ioc。無料です(NIST NVD由来のCVEレコード)。1日5回までの無料有料ツール呼び出しには含まれず、支払いもライセンスキーも不要です(運営者がPG1_FEED_PAIDスイッチを有効にすると有料になる場合があります)。 |
| 残りの無料呼び出し回数 | get_usage_status | 常に無料です。 |
| 観測したインジケーターを報告する場合 | submit_indicator | ライセンスキーのみ(X-API-KEY)が必要です。呼び出しごとの販売ではありません。送信された情報は、利用前に審査されます。 |
0.01 USD の有料呼び出しを利用する価値があるとき
単一のシグナルには無料チェックを使います。それでは得られない情報が必要な場合は、有料呼び出しを利用してください。
| 必要な情報 | 呼び出し | 0.01 USD で得られるもの |
|---|---|---|
| 1 つのシグナル(このウォレットは制裁対象か、このドメインは新しいか) | 無料の check_* ツール | 支払いは不要です。常に無料です。 |
| アクションを実行する前の、フェイルクローズな判断を 1 つ | preflight_check | アクションに必要なすべてのチェック(ウォレットへの pay:制裁対象かどうかとオンチェーンの経過期間、リンクの open:ホスト名の評判とドメインの経過期間、patch:製品の CVE 照会)を並列で実行し、すべての理由とチェックごとの結果を含む、署名済みの 1 つの decision にまとめます。チェックが完了しない場合は unknown になるため、マージやタイムアウトのロジックを自分で記述する必要はありません。 |
| CVE を今すぐ修正すべきか | get_cve_details(または get_cve_batch、get_cve_by_product) | cisa_kev.is_known_exploited と KEV の required_action、CVSS、および照合に使える CVE_KNOWN_EXPLOITED_KEV を含む reasons を取得できます。既知の悪用済みなら、まず修正してください。 |
| IP、ドメイン、URL、ハッシュに関するコンテキスト | get_ioc_context | 現在、PG1 のライセンス対象レコードは NVD の CVE ID のみです。そのため、これらは found: false を返し、費用はかかりません。該当するシグナルには、無料のホスト名、ドメイン、ウォレットのチェックを使ってください。 |
| 何かが変わったときに把握する | ウォッチリスト(下記) | 1 日ごとの再チェックと署名済み Webhook により、手動で再チェックする必要がなくなります。 |
| ワークロードのホスティング先 | hosting_advisor | 実行前チェックではなく計画ツールです。出典付きで、リージョンとプロバイダーを順位付けして提示します。 |
再チェックせずに監視する
以下の 4 つの対象は、30 日間で 4 × 0.05 = 0.20 USD です。x402 経由で一度だけ支払います(ウォッチリストに無料枠はありません)。PG1 は各項目を約 24 時間ごとに preflight_check と同じチェックで再確認し、項目の status が変わった場合にのみ Webhook に POST します。
curl -X POST https://pg1-ai-agent.vercel.app/api/watchlists \
-H "Content-Type: application/json" \
-d '{"webhook_url":"https://agent.example.com/pg1","items":[{"kind":"wallet","target":"0x..."},{"kind":"domain","target":"pay.example.com"},{"kind":"package","target":"left-pad","ecosystem":"npm"},{"kind":"cve_product","target":"openssl openssl 3.0"}]}'
最初のレスポンスは 402 の支払いリクエストです。支払い後に再送すると、201 { id, secret, expires_at, items } が返されます。secret は必ず保存してください。一度しか表示されず、各 Webhook の X-PG1-Signature の検証と、GET/DELETE /api/watchlists?id=<id> の認証に使います。各配信は、項目、previous_status、status、reasons を含む watchlist.status_changed イベントです。
3 つのアクションに使う 1 回の preflight_check
各呼び出しは 1 つの decision を返します。以下の対象は PG1 のテストフィクスチャ(/docs/testing)です。内部のチェックでは上流への照会が行われず、回答は固定されています。ただし、各 preflight_check 呼び出しは、1 日 5 回の無料呼び出し枠にカウントされます。
{"action":"open","target":"https://pg1-test-flagged.invalid/login"}
{"action":"pay","target":"0x7067312d746573742d6669787475726500000002"}
{"action":"install","target":"_pg1-test-unknown","ecosystem":"npm"}
| アクション | 実行されるチェック | decision | 理由 |
|---|---|---|---|
open + URL | check_hostname_reputation、check_domain_age | flagged | HOSTNAME_PHISHING_LISTED と DOMAIN_NEWLY_REGISTERED_30D |
pay + ウォレット | check_wallet_sanctions、check_wallet_age | no_flags | チェック対象のソースではフラグは見つかりませんでした。これはウォレットが安全だという判定ではありません。 |
install + パッケージ | check_package | unknown | パッケージの照会が完了しなかったため、フェイルクローズな判断になります。停止するか、担当者に確認してください。 |
status の意味
status | 意味 | 対応 |
|---|---|---|
"no_flags" | チェック対象のソースではフラグが見つかりませんでした(checks を参照)。PG1 は対象を「安全」と呼ぶことはありません。 | 独自のポリシーに従って続行してください。 |
"flagged" | reasons に警告が 1 つ以上あります。 | 停止するか、担当者にエスカレーションしてください。message ではなく、reasons[].code で照合してください。 |
"unknown" | ソースがタイムアウトした、エラーになった、またはスキップされたため、回答が不完全です。 | 問題なしと見なさないでください。再試行するか、フェイルクローズにしてください。 |
情報提供用コード(WALLET_DELEGATED、IP_TOR_EXIT_NODE、IP_WHITELISTED、IP_REPORTS_SCORED_ZERO)は事実を報告するもので、status を変更することはありません。全コードについては /docs/reason-codes を参照してください。
結果を検証する
すべての PG1 の結果には Ed25519 で署名が付与されるため、エージェントは後からオフラインで PG1 がその結果を返したことを証明できます。
- 場所: MCP では
result._meta["pg1/signature"]、A2A ではタスクのmetadata["pg1.signature"]、REST(/api/preflight、/api/hosting-advisor)ではトップレベルのsignatureです。 - ブロック:
{ alg: "EdDSA", kid, request_hash, sources, timestamp, version, sig, jwks_url }。 - 鍵: /.well-known/pg1-signing-key にある JWKS(RFC 7517、
OKPとしての Ed25519 鍵、RFC 8037)と、同じドキュメントが /.well-known/jwks.json にもあります。kidで鍵を選択します。現在の本番用kidはa3f2fbf9d8188a3cです。ローテーション後も古い鍵は一覧に残るため、古い署名も引き続き検証できます。不明なkidが見つかったら、JWKS を再取得してください。 - 結果から鍵を見つける方法: すべての署名ブロックには
jwks_urlが含まれ、署名を含むすべてのレスポンスにはヘッダーLink: <https://pg1-ai-agent.vercel.app/.well-known/pg1-signing-key>; rel="jwks"が含まれます。jwks_urlは署名対象ではありません。メッセージに含まれる URL を信頼するのではなく、PG1 独自の URL を検証ツールに固定してください。 - 方法: 無料の
verify_resultツール、PG1 SDK を使ったオフライン検証(JavaScript ではverifyResult、Python ではverify_result)、または以下の 10 行のコード例を使います。
署名対象の入力(厳密な定義)。 sig は { request_hash, result, sources, timestamp, version } の正規化 JSON の UTF-8 バイト列に対する Ed25519 署名(RFC 8032、pure Ed25519、事前ハッシュなし)であり、パディングなしの base64url(RFC 4648 第 5 節)でエンコードされています。
request_hash:{ "arguments": <送信した引数>, "tool": "<ツール名>" }の正規化 JSON の UTF-8 バイト列に対する SHA-256 の小文字 16 進数表記です。ツール名は、MCP ツール名、A2A スキル名、または REST の場合はpreflight_check/hosting_advisorです。引数がない場合は{}として扱います。署名がリクエストに対するものか確認するには、これを再計算してください。署名を別のリクエストに使い回すことはできません。result:返された結果オブジェクトそのもの(MCP:content[0].text内の JSON、A2A:アーティファクトの data 部分、REST:本文)から、独自のsignatureフィールドを除いたものです。request_idとtest_fixtureも含まれます。sources:結果のchecks[].sourceの重複を除いた値を、最初に現れた順に並べたものです。timestamp:PG1 が署名した時刻を表す ISO 8601 の UTC ミリ秒表記です(2026-10-21T12:00:00.000Z)。version:PG1 の公開バージョン(server.json)です。
正規化 JSON。 オブジェクトのキーは UTF-16 コード単位でソートします。空白は一切含めません。配列は元の順序を維持します。文字列と数値は JavaScript の JSON.stringify が出力する形式と完全に同じにします。数値は往復変換できる最短形式(1e+30、0.002、1e-7)で表記し、整数には小数部を付けません。文字列では ", バックスラッシュ、制御文字(\b \f \n \r \t、その他は小文字の \u00xx)のみをエスケープします。それ以外の文字は、非 ASCII 文字も含め、すべて UTF-8 バイトとして出力します。I-JSON の値では、これは RFC 8785(JCS)に準拠します。PG1 の結果は常に I-JSON です。以下の Python コード例では json.dumps(sort_keys=True, separators=(",", ":"), ensure_ascii=False) を使用しており、2 つのケースを除いて同じバイト列が得られます。1 つ目は、絶対値が 0.0001 未満のゼロでない数値です。JavaScript が 0.00004 と出力するところ、Python は 4e-05 と出力します。2 つ目は、基本多言語面外のオブジェクトキーです。Python はコードポイント順にソートします。これらのいずれかを含む結果(たとえば、非常に小さな EPSS スコア)は、このコード例では検証に失敗します。その場合は、RFC 8785 ライブラリ(rfc8785 パッケージなど)、PG1 Python SDK、または無料の verify_result ツールを使用してください。
検証例。 signed-result-example.json は、署名付きの実際のフィクスチャ結果です(FLAGGED テストウォレットに対する check_wallet_sanctions)。本番用鍵ではなく、ドキュメントのサンプル鍵(kid は pg1-docs-example、公開鍵は signed-result-example-jwks.json)で署名されています。署名ブロックは次のとおりです。
{
"alg": "EdDSA",
"kid": "pg1-docs-example",
"request_hash": "3b139e7fce1af42a65163e87c9c2c4914225a07c13069cf750b0d17fd8c7da73",
"sources": [
"fixture"
],
"timestamp": "2026-10-21T12:00:00.000Z",
"version": "1.20.2",
"sig": "IUs2DSN_FxT8zIuH7m3VQAYxTfwszHMoGFmSfLjxqBq5KNYE-Yzwyq5Ls10_qXLnfmhUM_W6wRlWZTbhR4MJAg",
"jwks_url": "https://pg1-ai-agent.vercel.app/.well-known/pg1-signing-key"
}
Node でオフライン検証(18 以上、依存関係なし;verify-pg1.mjs):
import crypto from 'node:crypto';
const canon = (v) => v === null || typeof v !== 'object' ? JSON.stringify(v) : Array.isArray(v) ? `[${v.map(canon)}]` : `{${Object.keys(v).sort().map((k) => `${JSON.stringify(k)}:${canon(v[k])}`)}}`;
export async function verifyPg1(result, sig, jwksUrl = 'https://pg1-ai-agent.vercel.app/.well-known/pg1-signing-key') {
const { signature, ...clean } = result;
const jwk = (await (await fetch(jwksUrl)).json()).keys.find((k) => k.kid === sig.kid);
if (!jwk || sig.alg !== 'EdDSA') return false;
const signed = canon({ request_hash: sig.request_hash, result: clean, sources: sig.sources, timestamp: sig.timestamp, version: sig.version });
const key = crypto.createPublicKey({ key: { kty: 'OKP', crv: 'Ed25519', x: jwk.x }, format: 'jwk' });
return crypto.verify(null, Buffer.from(signed, 'utf8'), key, Buffer.from(sig.sig, 'base64url'));
}
Python でオフライン検証(3.8 以上、pip install cryptography;verify_pg1.py):
import base64, json, urllib.request
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
def verify_pg1(result, sig, jwks_url="https://pg1-ai-agent.vercel.app/.well-known/pg1-signing-key"):
clean = {k: v for k, v in result.items() if k != "signature"}
jwk = next((k for k in json.load(urllib.request.urlopen(jwks_url))["keys"] if k["kid"] == sig["kid"]), None)
if jwk is None or sig["alg"] != "EdDSA": return False
signed = json.dumps({"request_hash": sig["request_hash"], "result": clean, "sources": sig["sources"], "timestamp": sig["timestamp"], "version": sig["version"]}, sort_keys=True, separators=(",", ":"), ensure_ascii=False)
b64 = lambda s: base64.urlsafe_b64decode(s + "=" * (-len(s) % 4))
try: Ed25519PublicKey.from_public_bytes(b64(jwk["x"])).verify(b64(sig["sig"]), signed.encode("utf-8")); return True
except Exception: return False
結果とその署名ブロックを渡して、どちらかを呼び出します。実行例では、サンプルの JWKS URL を渡すと、verifyPg1(example.result, example.signature, "https://pg1-ai-agent.vercel.app/docs/signed-result-example-jwks.json") は true を返します。結果のフィールドをどれか変更すると、false を返します。
ウォッチリストの Webhook は HMAC-SHA256 で個別に署名されます:X-PG1-Signature: t=<unix>,v1=<hex HMAC(secret, "<t>.<body>")>。5 分以上前の配信は拒否してください。
無料枠とレート制限
| ツール | 費用 | ライセンスキーなしの場合の制限 |
|---|---|---|
check_wallet_sanctions | 常に無料 | 呼び出し元ごとに 1 時間あたり 120 回 |
check_domain_age, check_hostname_reputation, check_wallet_age, check_package | 常に無料 | ツールごとに、呼び出し元ごとに 1 時間あたり 60 回 |
check_ip_abuse | 常に無料(ご自身の AbuseIPDB クォータを使用) | 呼び出し元ごとに 1 時間あたり 60 回 |
check_x402_endpoint, check_agent_card | 常に無料 | ツールごとに、呼び出し元ごとに 1 時間あたり 60 回 |
verify_result | 常に無料 | なし |
preflight_check, hosting_advisor | 有料:1 回あたり 0.01 USD | 呼び出し元ごとに 1 日 5 回まで無料。ほかの有料ツールと共有され、その後は x402 |
get_usage_status | 常に無料 | なし |
get_ioc_context, get_ioc_batch | 該当なしの場合は無料。該当ありの場合は有料 | 有料呼び出しでは、まず無料枠が使われます |
get_threat_indicators, GET /api/ioc(STIX フィード) | 無料(NIST NVD の CVE レコード);1 日 5 回の有料ツール無料枠は消費しません(運営者の PG1_FEED_PAID スイッチで有料にできます) | なし |
get_cve_details, get_cve_batch, get_cve_by_product, get_threat_actor_profile | 有料:1 回あたり 0.01 USD | 呼び出し元ごとに 1 日 5 回まで無料。すべての対象ツールで共有され、その後は x402 |
submit_indicator | ライセンスキーのみ(x402 なし、無料枠なし) | なし |
| テスト用フィクスチャ(/docs/testing) | 常に無料 | なし。無料枠の呼び出し回数も消費しません |
- 無料枠ではヘッダーは不要です。 支払いもライセンスキーもない呼び出し元には、自動的に無料枠が適用されます。レスポンスには
X-Free-Tier-LimitとX-Free-Tier-Remainingが含まれます。 - 無料枠をスキップして、すぐに支払いチャレンジを受け取るには、
X-Free-Tier: 0を送信します。 X-API-KEYにライセンスキーを設定すると、1 時間あたりの制限が解除され、有料呼び出しの料金が支払われます。- レート制限された呼び出しは、
retry_afterを含むrate_limitedエラーになります。
接続方法は 2 種類
/api/ioc— シンプルな REST GET で、NIST NVD の CVE レコードを含む STIX 2.1 バンドルを返します(現在 PG1 が商用再配布できる唯一のソースです。IP、ドメイン、URL、ファイルハッシュのインジケーターにはまだ対応していません)。無料です(NIST NVD の CVE レコード)。1 日 5 回の無料の有料呼び出しには含まれません。キーも支払いも不要です。スクリプト、curl、シンプルな連携に最適です。/api/mcp— 20 個のツールを備えた完全な Model Context Protocol サーバーです(1 回の呼び出しでの事前確認、ホスティングアドバイザー、CVE 検索、一括操作、脅威アクターの詳細情報、ウォレットの制裁対象スクリーニング、ドメインの経過期間、ホスト名/フィッシングのレピュテーション、ウォレットの経過期間/履歴など)。Claude、MCP 対応エージェント、および MCP 標準で通信するあらゆるクライアントに最適です。
検出: /llms.txt(llmstxt.org 形式、AI エージェント/クローラー向け)および /openapi.json(/api/ioc と /api/health の OpenAPI 3.1 仕様)。
オプトイン: /api/ioc/context?value=<indicator> — get_ioc_context MCP ツールを REST で提供するエンドポイントです。デフォルトでは無効です。このルートが応答するには、運用者が ENABLE_REST_IOC_CONTEXT=true を設定する必要があります。設定されていない場合は 404 {"error":"not available"} を返します。x402 Bazaar/検出メタデータには掲載されません。
有料 MCP ツールでは、x-api-key ヘッダーによる Gumroad ライセンスキー、または PAYMENT-SIGNATURE ヘッダーによる呼び出しごとの x402 マイクロペイメント($0.01/回)を利用できます(x402 v2)。運用者がフィードを再び有料にした場合(PG1_FEED_PAID=true)、/api/ioc でも同じ方法を利用できます。
無料枠(1 日 5 回)
無料枠は自動適用されます。ライセンスキーも支払いもない呼び出し元は、最初に 402 Payment Required が返されるまで、1 日に 5 回の有料呼び出しを無料で利用できます。ヘッダーも登録も不要なため、ブラウザーや MCP クライアントからの最初の呼び出しはそのまま利用できます。
無料枠は、呼び出し元ごとにカウンターが 1 つ(IP 自体ではなく、ソルト付き IP ハッシュ)あり、有料 MCP ツール(/api/mcp)と有料 A2A スキル(/api/a2a)で共有されます。どちらのルートを利用しても、無料の有料呼び出しは 1 日合計 5 回です。呼び出しが成功した場合にのみカウントされ、HEAD はカウントされません。無料枠の各レスポンスには X-Free-Tier-Limit と X-Free-Tier-Remaining が含まれ、get_usage_status で残り回数を確認できます。支払いを提示した呼び出し元には必ず課金され、無料では提供されません。無料枠をスキップして、すぐに支払いチャレンジを受けるには X-Free-Tier: 0 を送信してください。User-Agent に x402 スキャナー、クローラー、またはボットを示す名前が含まれるリクエスト(config/usageProbes.mjs)も無料枠をスキップします。そのため、検出スキャナーには有料リソースとして掲載されているとおり 402 が返されます。
STIX フィードは無料です(NIST NVD の CVE レコード)。1 日 5 回の無料の有料呼び出しには含まれません。 get_threat_indicators と GET /api/ioc は、402 もライセンスキーも不要で、誰でも利用できます。また、X-Free-Tier: 0 や支払いヘッダーが付いていても、1 日 5 回の呼び出しにはカウントされません(課金もされません)。運用者は PG1_FEED_PAID=true を設定してフィードを有料にできます。その場合、他の有料ツールと同様に無料枠と x402 が適用されます。
curl "https://pg1-ai-agent.vercel.app/api/ioc"
任意のクエリパラメーター:?since=<ISO timestamp>、?type=<IPv4|domain|URL|FileHash-MD5|FileHash-SHA1|FileHash-SHA256>、?min_score=<0-100>、?limit=<1-1000>
信頼度スコアに関する注意: ソースレコードに confidence_score がない場合、インジケーターの confidence は現在、固定値の 50 がデフォルトで設定されます。これらのレコードについて、計算または重み付けされたスコアではありません。
例外: get_ioc_context と get_ioc_batch(アクション実行前の安全確認ツール)は、結果が found: false の場合、常に無料です。この「記録なし」のレスポンスでは x-free-tier ヘッダーは不要です。このヘッダーが必要なのは、一般的な無料枠の場合のみです。
MCP ツール呼び出しの支払い(x402 v2)
/api/mcp は有料の tools/call リクエストに対して x402 v2 MCP transport spec に準拠しているため、お使いのクライアントライブラリが対応している方法で、MCP ネイティブのフィールドまたは HTTP ヘッダーのいずれかに支払い情報を添付できます。
-
params._meta["x402/payment"](MCP クライアント向けに推奨。例:@x402/mcp) — 署名済み x402 v2PaymentPayloadオブジェクトを JSON-RPC リクエストに直接添付します。{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "get_cve_details", "arguments": { "cve_id": "CVE-2021-44228" }, "_meta": { "x402/payment": { "x402Version": 2, "scheme": "exact", "network": "eip155:8453", "accepted": { /* … */ }, "payload": { /* … */ } } } } } -
PAYMENT-SIGNATUREヘッダー(またはX-Payment) — 同じ署名済みペイロードを base64 エンコードし、JSON-RPC リクエスト内ではなく、HTTP トランスポートレベルで添付します。MCP に対応していない HTTP クライアントで支払う場合は、この方法を使用します。
同じリクエストに両方が含まれる場合は、_meta が優先されます。
支払いのない呼び出しに HTTP 402 は返されません。 ライセンスキーがなく、無料枠も支払いもない場合、有料ツールへの tools/call は、MCP ツールエラー形式の通常の 200 OK JSON-RPC 結果を返します。
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"isError": true,
"structuredContent": { "x402Version": 2, "error": "Payment required", "resource": { /* … */ }, "accepts": [ /* … */ ] },
"content": [{ "type": "text", "text": "{\"x402Version\":2,...}" }]
}
}
後方互換性のため、ヘッダーのみを読み取るクライアント向けに、同じオブジェクトを base64 エンコードして PAYMENT-REQUIRED レスポンスヘッダーにも送信します。検証または決済に失敗した場合も、まったく同じ形式(引き続き 200 OK、isError: true)が返され、structuredContent.error に失敗の内容が記述されます。
支払いが成功すると、ツールの結果に決済事業者からの決済完了レシートが result._meta["x402/payment-response"] として含まれ、PAYMENT-RESPONSE ヘッダーもこれまでどおり設定されます。
インストールと接続(MCP クライアント)
自律型エージェントを PG1 API に接続するには、接続リクエストに Gumroad のライセンスキーを指定します。
オプション 1:Smithery CLI を使用
ターミナルで次のコマンドを実行し、プレースホルダーを有効なキーに置き換えてください。
smithery mcp add --transport http --id pg1-threat-intel https://pg1-ai-agent.vercel.app/api/mcp --header "x-api-key: YOUR_GUMROAD_LICENSE_KEY"
オプション 2:curl で無料枠をテスト(キー不要)
curl -X POST https://pg1-ai-agent.vercel.app/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_cve_details",
"arguments": { "cve_id": "CVE-2021-44228" }
}
}'
利用可能なすべての MCP ツール
スキーマ全体を確認するには、/api/mcp に対して "method": "tools/list" を呼び出してください。概要:
| ツール | 用途 | ソース | 無料枠の適用 |
|---|---|---|---|
preflight_check | エージェントが別のエージェントに支払い、アクセス、インストール、パッチ適用、または信頼する前に行う1回の呼び出し:関連するすべてのチェックを並行して実行し、1つの判定(no_flags、flagged、unknown)を返します。安全側に倒して判定します | PG1 独自の以下のチェック | はい(1日5回まで無料、その後は x402)。REST:POST /api/preflight |
check_x402_endpoint | 支払いの前に x402 エンドポイントをチェックします:payTo の制裁対象該当性とウォレットの経過期間、ネットワークとアセット、TLS、ドメインの経過期間 | 以下のチェックをリアルタイムで実施 | 常に無料(ライセンスキーなしで1時間あたり60回) |
check_agent_card | 別のエージェントを信頼する前にチェックします:A2A カードのスキーマ、ドメインの経過期間とレピュテーション、類似名 | 以下のチェックをリアルタイムで実施 | 常に無料(ライセンスキーなしで1時間あたり60回) |
verify_result | 公開鍵に照らして PG1 の結果の Ed25519 署名を検証します | /.well-known/pg1-signing-key | 常に無料 |
hosting_advisor | 法務、プライバシー、レイテンシに関する根拠を引用し、ホスティング地域とプロバイダーをランク付けします。法的助言ではありません | PG1 が厳選し、出典を明記したデータセット | はい(1日5回まで無料、その後は x402)。REST:POST /api/hosting-advisor |
get_threat_indicators | CVE レコードの STIX 2.1 バンドル(CVE ID と NVD 参照。IP/ドメイン/URL/ハッシュのインジケーターには未対応) | NVD(PG1 が商用再配布できるソースのみ。データソースの切り替えを参照) | いいえ:無料(NIST NVD の CVE レコード)。1日5回の有料呼び出し枠は消費しません(PG1_FEED_PAID を有効にすると有料になります) |
get_ioc_context | 単一インジケーターの安全性チェック | NVD(データソースの切り替えを参照) | 見つからない場合は常に無料 |
get_ioc_batch | 1回の呼び出しで最大20件のインジケーターを処理します | NVD(データソースの切り替えを参照) | いずれも見つからない場合は常に無料 |
get_cve_details | NVD、CISA KEV の情報を加えた CVE 検索(PG1_SOURCE_EPSS_PAID が有効な場合のみ EPSS を含みます) | NVD、CISA KEV | はい(1日5回まで無料、その後は x402) |
get_cve_batch | 1回の呼び出しで最大20件の CVE ID を処理します | NVD、CISA KEV(EPSS は上記と同様) | はい(1日5回まで無料、その後は x402) |
get_cve_by_product | ベンダー/製品別に CVE を検索します | NVD | はい(1日5回まで無料、その後は x402) |
get_threat_actor_profile | MITRE ATT&CK を用いた APT/脅威アクターの詳細情報 | MITRE ATT&CK Enterprise | はい(1日5回まで無料、その後は x402) |
get_usage_status | 残りの無料枠を確認します | — | 常に無料、ヘッダー不要 |
submit_indicator | 観測したインジケーターをレビュー用に提供します | — | いいえ — ライセンスキーが必要です |
check_wallet_sanctions | ウォレットアドレスを制裁リストと照合します | OFAC SDN リスト(米国財務省)、毎日同期 | 常に無料(ライセンスキーなしで1時間あたり120回) |
check_domain_age | RDAP を使ってドメインの登録期間を確認します | RDAP(TLD ごとのサーバー。IANA ブートストラップレジストリを使って解決) | 常に無料 |
check_hostname_reputation | フィッシング/類似ドメインに該当するホスト名をチェックします | MetaMask eth-phishing-detect、毎日同期 | 常に無料(ライセンスキーなしで1時間あたり60回) |
check_wallet_age | EVM アドレスがチェーン上に初めて現れた時期を、オンチェーンの送金履歴から確認します | オンチェーンの送金履歴(チェーンごと) | 常に無料(ライセンスキーなしで1時間あたり60回) |
check_ip_abuse | ご自身の AbuseIPDB キーを使って、1つのパブリック IP の不正利用信頼度スコアと報告件数を確認します | AbuseIPDB をリアルタイムで確認します。X-AbuseIPDB-Key で送信したキーを使用します | PG1 の料金はかかりません。ご自身の AbuseIPDB 利用枠を使用します(ライセンスキーなしで1時間あたり60回)。AbuseIPDB キーを持ち込むを参照 |
check_package | インストール前のチェック:npm または PyPI のパッケージを1つ確認します(存在するか、経過期間、悪意あるパッケージとして報告されているか、既知の脆弱性、類似名、npm の非推奨指定とインストールスクリプト) | npm パブリックレジストリ/PyPI、および OSV.dev(OpenSSF Malicious Packages、GitHub Advisory Database、PyPI Advisory Database)。/docs/attributionsを参照 | 常に無料(ライセンスキーなしで1時間あたり60回)。インストール前にパッケージをチェックするを参照 |
subscribe_alerts は利用できません(tools/list に含まれておらず、呼び出すと not_available が返され、無料です)。アラートにはウォッチリストを使用してください。POST /api/watchlists を呼び出し、x402 経由で1項目あたり30日間0.05 USDを支払うと、ステータスが変わるたびに署名付きWebhookが送信されます。 |
重要な表現上の注意点
check_wallet_sanctions:結果がlisted: falseの場合、報告されたlist_last_syncedの時点で、そのアドレスが OFAC SDN リストに掲載されていないことを意味します。これは情報提供のみを目的としたものであり、法的助言や制裁コンプライアンスに関する助言ではありません。「安全」や「問題なし」と表現されることはありません。制裁データが空、またはアクセス不能な場合、このツールは誤ってlisted: falseを返すのではなく、エラーを返します。アドレスの検証:このツールは、まず(正規化された)アドレスをpublic.sanctioned_walletsに照会します。一致するものがあれば、アドレスが現在認識されている形式に合致しなくても、常にlisted: trueを返します。一致するものがない場合に限り、形式チェックに移ります。addressが制裁リストに含まれるいずれかの通貨で認識されている形式(EVM の0x+ 40 桁の 16 進数、BTC/LTC/BCH/DOGE/DASH/ZEC の base58 または bech32/CashAddr、TRON、Monero、Solana の base58)に一致しない場合、listed: falseではなく、MCP ツールエラー(isError: true、code: "invalid_address")を返します。これは"hello"のような不正な入力や、長さが正しくない0xアドレスにも適用されます。空のaddressは、照会前に必ずinvalid_addressとして拒否されます。無料で利用でき、Gumroad ライセンスキーがない場合、呼び出し元ごと(IP ごとに/api/mcpと/api/a2a共通のカウンター)に 1 時間あたり 120 回までに制限されます。1 時間内の 121 回目の呼び出しでは、check_wallet_ageと同じrate_limitedツールエラーが返されます。フィクスチャ入力は回数に含まれません。check_domain_age:新しく登録されたドメイン(age_days < 30)は、悪意がある証拠ではなく、よく見られるフィッシングの兆候として報告されます。照会に成功すると、このツールはfound: trueを返します(後方互換性のためavailable: trueも返します。availableは非推奨のため、foundの使用を推奨します)。照会で解決できない場合は、reasonとreason_codeを伴ってfound: false/available: falseを返します。TLD に IANA ブートストラップレジストリ内の RDAP サーバーがない場合は"unsupported_tld"、RDAP の照会がタイムアウトした場合は"timeout"、その他の失敗時は"invalid_domain"/"bootstrap_unavailable"/"lookup_failed"が返されます。年齢を推測したり、WHOIS にフォールバックしたりすることはありません。get_ioc_context/get_ioc_batch(既存の動作):結果がfound: falseの場合、PG1 の情報源に悪い情報が記録されていないことを意味します。インジケーターが安全という意味ではなく、単にこのデータセットに含まれていないということです。check_hostname_reputation:単一のホスト名(バルク入力、URL/スキーム/パス/ポート/ワイルドカードは不可)を受け取り、それに加えてすべての親ドメインもpublic.phishing_domains(sovereign-threat-pipelineリポジトリによって毎日同期されるブロックリスト/許可リスト/類似ドメインリスト)とpublic.phishing_list_metaに照らしてスクリーニングします。verdict: "allowlisted" | "listed" | "lookalike" | "not_listed"を返し、"safe"や"clean"を返すことはありません。許可リストとブロックリストの両方に一致する場合は、許可リストが常に優先されます。"listed"の判定では、match_type: "exact"または"parent_domain"が報告されます。"lookalike"の判定は、ホスト名が直接リストに掲載されてはいないものの、類似ドメインリストにある既知ブランドのドメインに似ていることを意味します。該当するのは、保存済みの許容範囲(デフォルト 3)内で紛らわしい文字や誤字を含む場合、または他の単語とともにブランドキーワード(5 文字以上)が埋め込まれている場合(例:metamask-login.com)です。この場合、lookalike_ofには一致したブランドドメインが設定されます。ブランド本来のドメインとそのサブドメインがフラグ付けされることはありません。フィッシングリストのデータにアクセスできない場合、またはタイムアウトした場合、not_listedを報告することは決してなく、ツールはエラーを返します。不正なホスト名の入力では、MCP ツールエラー(isError: true、code: "invalid_hostname")が返されます。リストの内容は、一致した単一のエントリを超えて公開されることはありません。無料で利用でき、Gumroad ライセンスキーがない場合は、呼び出し元ごとに 1 時間あたり 60 回までに制限されます。ライセンスキー(X-API-KEY)があれば、この制限を回避できます。check_wallet_age:EVM アドレス(0x+ 40 桁の 16 進数、大文字と小文字を区別しません)が、指定されたチェーン(デフォルトはbase、またはethereum/arbitrum/optimism/polygon/bsc)で最初に確認された時期を、入出金を含むオンチェーンの送金履歴のうち最も古いものに基づいて報告し、コントラクトかどうか(is_contract)も返します。アドレスの経過期間はチェーンごとに異なります。first_seen/age_daysは、要求されたchain上でのこのアドレスの履歴のみを示すため、同じアドレスでも、あるチェーンでは古く、別のチェーンでは新規(またはfound: false)の場合があります。確認したいチェーンごとにチェックしてください。found: falseの結果(is_contract以外のすべてのフィールドがnull)は、そのチェーンにアドレスの送金履歴がないことを意味します。これは通常よくある結果であり、エラーではありません。また、どちらの意味でもアドレスが安全または危険である証拠にはなりません。このツールが報告するのは経過期間と履歴のみです。上流の障害やタイムアウトが発生した場合、「作成されたばかりのウォレット」と誤解されないよう、found: falseにフォールバックすることなく、MCP ツールエラー(isError: true、code: "upstream_unavailable")を返します。不正なaddress/chainの入力では、MCP ツールエラー(code: "invalid_address"/"invalid_chain")が返されます。foundの結果は永続的にキャッシュされます。found: falseの結果は 10 分間のみキャッシュされます。無料で利用でき、Gumroad ライセンスキーがない場合は、check_domain_age/check_hostname_reputationと同じく、呼び出し元ごとに 1 時間あたり 60 回までに制限されます。1.14.0 以降は、キャッシュ済みの回答も制限回数に含まれます。回答ごとにライブの委任チェックを行うためです。ライセンスキーがあれば、引き続き制限の対象外となります。- EIP-7702 の委任(
delegated、delegate_address)。1.14.0 でオプションフィールドとして追加されました。要求されたチェーン上で、アドレスのコードが 23 バイトちょうどであり、0xef0100の後に 20 バイトの委任先アドレスが続く場合(EIP-7702 の委任)、delegated: trueとなり、小文字に変換された委任先アドレスがdelegate_addressに設定されます。コードがそれ以外(空、通常のコントラクト、または長さが異なるのにプレフィックスだけ似ているもの)の場合、delegated: false(およびdelegate_address: null)となります。コードチェックが完了しなかった場合(タイムアウトまたは上流エラー)、delegated: nullとなります。falseと推測されることはありません。年齢の結果は引き続き返され、statusは"unknown"となります。委任チェックには常にsource: "on-chain code"の独立したchecksエントリがあり、resultは"ok"、"error"、または"timeout"となるため、チェックが完了したかどうかを確認できます。委任の状態は決してキャッシュされません。所有者はいつでも追加または削除できるため、first_seenが従来どおりキャッシュされている場合も含め、呼び出しごとにライブチェックされます。委任されたアドレスには、事実のみを示し、評価を含まない理由コードWALLET_DELEGATEDが付与されます。これは情報提供のみを目的としており、委任が単独でstatusを変更することはありません。古い委任済みウォレットはreasons: [WALLET_DELEGATED]を伴うstatus: "no_flags"となり、古い非委任ウォレット("no_flags"、reasons: [])と同じステータスです。statusは、委任がなかった場合と同じ値になるか、コードチェックが完了しなかった場合に"unknown"となります。たとえば、部分的な照会結果がある古いウォレット(WALLET_AGE_PARTIAL)は、委任の有無にかかわらず"unknown"です。また、履歴のないウォレットは委任の状態にかかわらず"flagged"です。is_contractに変更はなく、委任されたアドレスでも引き続きtrueとなるため、既存の連携は従来どおり動作します。委任もチェーンごとに異なり、あるチェーンでの委任は別のチェーンについて何も示しません。
- EIP-7702 の委任(
check_package:「安全」や「問題なし」とは決して表現されません。悪意のあるパッケージについての報告は、情報源に偽陽性があるため、常に**「悪意があると報告されています」**と表現されます。レジストリの照会に失敗した場合は、exists: falseではなくexists: nullが返され、status: "unknown"となります。インストール前にパッケージをチェックするを参照してください。check_wallet_sanctions/check_domain_age/check_hostname_reputation/check_wallet_ageはすべてoutputSchemaを宣言し、MCP 仕様に従って、既存のcontentテキストブロックとともに、それに一致するstructuredContentオブジェクトを返します。構造化ツール出力に対応するクライアントは、テキストブロックを解析せずにフィールドを直接読み取れます。
データソースの切り替え
脅威インジケーターのデータ(get_threat_indicators、get_ioc_context、get_ioc_batch、/api/ioc、/api/ioc/context、およびこれらを利用するチャットとプレイグラウンドのチェック)は、すべてのクエリで、単一の場所である lib/sourcePolicy.mjs によって上流ソース別にフィルタリングされます。これらは有料のレスポンスであるため、PG1 が再販売できる場合に限り、ソースからデータを提供します。対象となるのは、自社データ、パブリックドメインのデータ、または利用規約で商用再販売が明示的に許可されているソースです。
| 変数 | デフォルト | 対象 |
|---|---|---|
SOURCE_ABUSECH_ENABLED | 常にオフ(固定。変数は無視されます) | abuse.ch(ThreatFox、URLhaus、MalwareBazaar、Feodo、SSLBL、YARAify)。ライセンスを取得するまでは、有料 API で提供されません。 |
SOURCE_OTX_ENABLED | 常にオフ(固定) | AlienVault OTX。商用ライセンスはありません。 |
SOURCE_ABUSEIPDB_ENABLED | 常にオフ(固定) | AbuseIPDB とラベル付けされた行。PG1 は AbuseIPDB のライセンスを取得しないことを決定しました。check_ip_abuse では、呼び出し元自身のキーのみを使用します。 |
SOURCE_UNATTRIBUTED_ENABLED | 常にオフ(固定) | ソースラベルのない行、および実際のフィードを隠す、旧パイプライン由来の Sovereign-Engine-v3.2-* とラベル付けされた行。記録されたソースがないデータは、ライセンスされていないものとして扱います。 |
SOURCE_NVD_ENABLED | オン | NIST NVD(米国政府の著作物、パブリックドメイン)。 |
SOURCE_BLOCKLIST_DE_ENABLED、SOURCE_PG1_SWARM_ENABLED、SOURCE_SCAMSNIFFER_ENABLED、SOURCE_OTHER_ENABLED | オフ | Blocklist.de、PG1-Swarm-* ラベル、ScamSniffer、およびその他すべてのラベル。商用再販売に関する利用規約が確認されるまではオフです。確認できた場合にのみ true に設定してください。 |
固定されたソースは、ライセンスの締結後に一度だけ行うコード変更によってのみ、再び提供できるようになります。
有料 CVE レスポンスの EPSS。 FIRST は EPSS スコアを「一般に無償で」提供していますが、再販売について書面で確認していません。そのため、有料 CVE レスポンス(x402、ライセンスキー、無料枠のいずれで支払う場合も、MCP または A2A 経由の get_cve_details、get_cve_batch、get_cve_by_product)には EPSS を含めず、FIRST への問い合わせも行いません。つまり、epss フィールド、EPSS チェック、EPSS クレジットはありません。PG1_SOURCE_EPSS_PAID=true を設定すると再び含まれます。FIRST が再販売を書面で確認した場合にのみ設定してください。無料レスポンス(PG1 チャット)では、引き続き EPSS が含まれます。
STIX フィードの料金。 get_threat_indicators と /api/ioc は無料です(NIST NVD の CVE レコードを使用)。1 日あたり 5 回の無料有料呼び出しには含まれません。PG1_FEED_PAID=true に設定すると有料になります(1 回あたり 0.01 USD。まず共有無料枠が適用されます)。同時に、public/.well-known/x402 に /api/ioc を再追加し、public/openapi.json の 2 つの操作に x-payment-info を追加してください(node scripts/verify-payment-config.mjs で確認できます)。
ライセンスキーは保存されません。 api_access_logs には、ライセンスキーの呼び出し元は license:<HMAC>(TELEMETRY_IP_SALT でソルト処理し、IP ハッシュとはドメイン分離)、無料枠の呼び出し元は free-tier:<IP hash>、無料フィードは free-feed として記録されます。データベースの CHECK 制約により、これ以外の値は拒否されます。
threat_indicators。 レガシーの threat_indicators テーブル(source_id がなく、stix_data にも値がない行)は、有料ルートでは一切読み取られません。読み取るのは、運用者自身のチャットコンテキストと、運用者専用の診断エンドポイントだけです。tests/phase2-funnel.test.mjs では、この両方を固定しています。
オフにしたソースの行は、有料・無料を問わず、どのレスポンスにも表示されません。そのようなソースでしか知られていないインジケーターは、found: false として報告されます。
A2A(Agent2Agent Protocol)
/api/a2a では、A2A と JSON-RPC 2.0 を介して、常に無料で使える 10 個のスキル(check_wallet_sanctions、check_domain_age、check_hostname_reputation、check_wallet_age、check_package、check_x402_endpoint、check_agent_card、verify_result、get_usage_status、および /api/mcp と同様に X-AbuseIPDB-Key ヘッダーに自身のキーが必要な check_ip_abuse)と、6 個の有料スキル(preflight_check、hosting_advisor、get_cve_details、get_cve_batch、get_cve_by_product、get_threat_actor_profile。1 回につき 0.01 USD)、有料ジョブ(submit_job)、および委託ツール(build_tool)を公開します。呼び出し側に無料枠が残っている間(上記の共通カウンターで 1 日 5 回、自動適用)、有料スキルは無料で提供されます。その後は、ライセンスキー(X-API-KEY)または x402 決済を利用します。決済はA2A x402 拡張に従います。未決済の呼び出しでは、状態が input-required のタスクが返され、そのステータスメッセージのメタデータには "x402.payment.status": "payment-required" と x402 v2 の PaymentRequired オブジェクトが "x402.payment.required" に含まれます。署名済みの PaymentPayload を message.metadata["x402.payment.payload"] に含めてメッセージを再送してください。決済はスキルが成功した後にのみ確定され、レシートは "x402.payment.receipts" に返されます。NVD CVE フィードとレコードの検索は引き続き /api/mcp で行います。エージェントカードは /.well-known/agent-card.json で公開されています。message/send(v0.3 のメソッド名)は SendMessage の別名として受け付けられます。A2A-Version ヘッダー(またはクエリパラメーター)で応答形式を選択します。1.0 または 0.3(省略時のデフォルト)を指定できます。レート制限は MCP ツール独自のもので、カウンターは共通です。たとえば、ライセンスキーがない場合、check_wallet_sanctions は呼び出し元ごと(IP ごと)に 1 時間あたり 120 回に制限され、1 時間以内の 121 回目の呼び出しでは check_wallet_age と同じ rate_limited エラーが返されます。スキルとその引数は DataPart として送信してください。
curl -X POST https://pg1-ai-agent.vercel.app/api/a2a \
-H "Content-Type: application/json" \
-H "A2A-Version: 1.0" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "SendMessage",
"params": {
"message": {
"role": "user",
"messageId": "1",
"parts": [{ "kind": "data", "data": { "skill": "check_domain_age", "arguments": { "domain": "example.com" } } }]
}
}
}'
AbuseIPDB キーを持ち込む
check_ip_abuse(MCP ツールおよび A2A スキル。1.16.0 以降)は、AbuseIPDB の無料または有料の自身の AbuseIPDB API キーを使って、公開 IPv4 または IPv6 アドレスを 1 つ検索します。AbuseIPDB との契約に基づき、次の条件で実行されます。
- 自身のキーのみを使用します。
/api/mcpまたは/api/a2aへの HTTP リクエストヘッダーX-AbuseIPDB-Keyにキーを指定してください。ツールの引数には指定しません(引数はモデルコンテキストとログに含まれます)。PG1 は独自の AbuseIPDB キーを持たず、代替キーへのフォールバックも行いません。ヘッダーがない場合は AbuseIPDB を呼び出さず、ツールはコードabuseipdb_key_requiredとともにisError: trueを返します。 - 結果は常に自身のもののみで、必ず出典を表示します。各結果には
attribution: { "text": "Data from AbuseIPDB", "url": "https://www.abuseipdb.com/check/<ip>" }が含まれます。 - キーごとにのみキャッシュします。メモリー上で 15 分間、
sha256(your key) + ip + max_age_in_daysをキーとしてキャッシュします。データベースには保存せず、他のユーザーに提供することもありません。生のキーが保存、ログ記録、返却されることはありません。 - 共有されることはありません。 結果が PG1 のフィード、
get_ioc_context、get_threat_indicators、またはパイプラインに含まれることはありません。 - PG1 の料金はかかりません(x402 決済なし)。検索は自身の AbuseIPDB 利用枠を消費します。PG1 の通常の制限は別途適用され、Gumroad ライセンスキーがない場合、呼び出し元ごとに 1 時間あたり 60 回です。
AbuseIPDB アカウントからキーを取得してください: https://www.abuseipdb.com/account/api。
curl -X POST https://pg1-ai-agent.vercel.app/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "X-AbuseIPDB-Key: $ABUSEIPDB_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_ip_abuse","arguments":{"ip":"8.8.8.8","max_age_in_days":90}}}'
A2A での同じ呼び出し:
curl -X POST "https://pg1-ai-agent.vercel.app/api/a2a?A2A-Version=1.0" \
-H "Content-Type: application/json" \
-H "X-AbuseIPDB-Key: $ABUSEIPDB_KEY" \
-d '{"jsonrpc":"2.0","id":1,"method":"SendMessage","params":{"message":{"messageId":"abuse-1","role":"ROLE_USER","parts":[{"data":{"skill":"check_ip_abuse","arguments":{"ip":"8.8.8.8"}}}]}}}'
引数: ip(必須。公開 IPv4 または IPv6 アドレスを正確に 1 つ指定します。プライベート、予約済み、ドキュメント用のアドレス、および形式が不正な入力は invalid_ip として拒否され、AbuseIPDB は呼び出されません)と max_age_in_days(任意。1~365。デフォルトは 90)。
結果(structuredContent としても返されます。ツールは outputSchema を宣言します):ip、ip_version、max_age_in_days、abuse_confidence_score(0~100)、total_reports、distinct_reporters、last_reported_at、country_code、usage_type、isp、domain、is_tor、is_whitelisted、cached、note、attribution、および通常の reasons、status、checks、request_id。status は AbuseIPDB 独自のレポート評価に従い、それに PG1 のスコアしきい値は適用されません(abuse_confidence_score に独自のしきい値を設定してください)。
| 上流からの回答 | status | 理由 |
|---|---|---|
is_whitelisted が true(スコアやレポート件数にかかわらず) | "no_flags" | IP_WHITELISTED(参考情報):AbuseIPDB はこのアドレスをホワイトリストに登録済みとしており、そのレポートをこのアドレスの評価にカウントしません |
ホワイトリストに登録されておらず、abuse_confidence_score が 0 より大きい | "flagged" | IP_ABUSE_REPORTED。スコア、レポート件数、報告者数を含みます |
| ホワイトリストに登録されておらず、スコアが 0 で、期間内にレポートがある | "no_flags" | IP_REPORTS_SCORED_ZERO(参考情報):レポートは存在しますが、AbuseIPDB はスコアを 0 としています |
| 期間内にレポートがない | "no_flags" | なし |
| スコアまたはレポート件数が不明 | "unknown" | なし |
IP_TOR_EXIT_NODE は参考情報で、これらのいずれとともに表示される場合もあります。abuse_confidence_score は、そのアドレスが不正利用されているという AbuseIPDB の確信度を 0~100 で示します。スコアが 0 であっても、そのアドレスに問題がないことの証明にはなりません。また、PG1 は結果を「安全」または「クリーン」と表現することはありません。期間内にレポートがある場合、checks[0].data_as_of は last_reported_at です。
エラー(MCP では isError: true と code、A2A では JSON-RPC エラー -32000 と error.data.code):
| コード | 発生条件 | AbuseIPDB が呼び出されますか? |
|---|---|---|
abuseipdb_key_required | X-AbuseIPDB-Key ヘッダーがない | いいえ |
invalid_abuseipdb_key | AbuseIPDB が 401/403 を返した場合、またはヘッダーをキーとして使用できない場合(空白、制御文字、256 文字超) | 最初の場合のみ |
abuseipdb_rate_limited | AbuseIPDB が 429 を返した場合(AbuseIPDB の利用枠超過)。AbuseIPDB が値を送信した場合、retry_after(秒)と Retry-After レスポンスヘッダーが引き継がれます | はい |
upstream_unavailable | AbuseIPDB の 5xx、解析できない応答、または 5 秒以内に応答がない | はい |
invalid_ip | 公開 IPv4/IPv6 アドレスが 1 つちょうどではない | いいえ |
invalid_max_age | max_age_in_days が 1~365 の整数ではない | いいえ |
rate_limited | ライセンスキーがない場合の、呼び出し元ごとに PG1 で設定された 1 時間あたり 60 回の呼び出し制限 | いいえ |
ブラウザー:X-AbuseIPDB-Key は、/api/mcp と /api/a2a の CORS Access-Control-Allow-Headers にのみ含まれます。チャットとプレイグラウンドでは、このツールは提供されません。
インストール前にパッケージを確認する
check_package(MCP ツール、A2A スキル、チャットツール、プレイグラウンドでの確認。1.17.0 以降)は、インストールまたは推奨しようとしている AI エージェント向けに作られた、npm または PyPI の単一パッケージを対象とするインストール前チェックです。無料で利用でき(ライセンスキーなしの場合、呼び出し元あたり 1 時間に 60 回)、AI モデルは関与しません。
引数:ecosystem("npm" または "pypi")、name(単一パッケージ。npm の名前はスコープ付きでも指定できます。例:@scope/name)、および任意の version(完全一致する単一のバージョン。指定しない場合は最新バージョンを確認します)。
シグナルはそれぞれ、ライセンスを確認した公開ソースから取得します(全リストとライセンスについては /docs/attributions を参照してください)。
| シグナル | フィールド | ソース |
|---|---|---|
| パッケージ(およびバージョン)は存在しますか? | exists、version_exists | npm パブリックレジストリ/PyPI |
| 公開からの経過期間 | first_published、age_days、latest_version、latest_published | npm パブリックレジストリ/PyPI |
| 悪意のあるものとして報告済み | reported_malicious、malicious_reports(MAL- ID) | OSV.dev 経由の OpenSSF Malicious Packages(Apache-2.0) |
| そのバージョンの既知の脆弱性 | vulnerabilities(id、severity、cvss_vector のみ) | OSV.dev 経由の GitHub Advisory Database、PyPI Advisory Database(CC-BY 4.0) |
| 人気パッケージに似た名前 | lookalike_of、lookalike_pattern(separator、confusable、affix、edit_distance) | PG1 独自の人気パッケージ名リスト |
| npm のみ:非推奨、インストールスクリプト | deprecated、deprecation_message、install_scripts | npm パブリックレジストリ |
ステータスは、PG1 の通常のルールに従います。
- バージョンが悪意のあるものとして報告されている(
PACKAGE_REPORTED_MALICIOUS)、パッケージまたは要求されたバージョンが存在しない(PACKAGE_NOT_FOUND、PACKAGE_VERSION_NOT_FOUND)、あるいはパッケージの初回公開から 30 日未満で、かつ名前が人気パッケージに似ている場合は"flagged"です(PACKAGE_NEW_LOOKALIKE)。 - いずれかの照会が完了しなかった場合は
"unknown"です。レジストリへの照会に失敗した場合、existsはfalseではなくnullになります。また、OSV への照会に失敗した場合、reported_maliciousはnullになります。 - それ以外の場合は
"no_flags"です。似た名前だけ、新しいパッケージであることだけ、既知の脆弱性、非推奨、インストールスクリプトは、いずれも情報提供のための理由であり、それだけでフラグが立つことはありません。「安全」や「問題なし」と判定することはありません。
表示されるのは、/docs/attributions に記載されたデータベースのアドバイザリのみです。OSV が返すそれ以外の情報は vulnerabilities_omitted に計上されます。ディストリビューション固有(Ubuntu など)のデータは使用しません。レジストリからの応答は 1 時間、悪意のあるステータスを含む OSV からの応答はパッケージごとに 15 分間キャッシュされます。照会には短いタイムアウトを設定し、リクエストごとに単一のパッケージを対象とします。一括クロールは行いません。入力が保存されることはありません。テレメトリに記録されるのは、ツール名、結果、レイテンシ、ソルト付きの呼び出し元ハッシュのみです。
curl -X POST https://pg1-ai-agent.vercel.app/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_package","arguments":{"ecosystem":"npm","name":"lodash","version":"4.17.21"}}}'
チャットから PG1 にチェックを実行させる
サインイン済みのオペレーターは、PG1 のチャットに自然な言葉で上記の読み取り専用ツールを実行するよう依頼できます。「このウォレットを確認して 0x…」「このドメインの登録から何年経っていますか」「このホスト名は類似ドメインですか」「CVE-2021-44228 について何がわかっていますか」などと尋ねられます。チャットモデルには、読み取り専用の MCP ツールがネイティブ関数として提供されます(tools/list と同じツール一覧およびスキーマから生成され、ロールでフィルタリングされます)。メッセージごとに最大 5 個のツールを実行し(独立している場合は並列実行)、結果から回答を作成します。各呼び出しでは、MCP クライアントと同じハンドラーが実行され、/api/mcp への HTTP リクエストは行われません。
- 実行できるもの:
check_wallet_sanctions、check_domain_age、check_hostname_reputation、check_wallet_age、get_ioc_context、get_ioc_batch、get_cve_details、get_cve_batch、get_cve_by_product、get_threat_actor_profile。submit_indicator(書き込みを行います)、get_threat_indicators(有料の一括フィードであり、チェックではありません)、get_usage_status(呼び出し元自身のクォータを返します)、check_ip_abuse(リクエストヘッダーから呼び出し元自身の AbuseIPDB キーが渡された場合にのみ実行されます。チャットにはキーがなく、PG1 自身も AbuseIPDB キーを持っていません)は実行しません。チャットが実行する処理によって、書き込み、支払い、状態変更が行われることはありません。 - オペレーターの利用は無料で、ライセンス保有者と同様です。PG1 のレート制限は適用されませんが、アップストリームの各ソース固有のタイムアウトとキャッシュは適用され、各呼び出しにも個別のタイムアウト(10 秒)があります。各呼び出しは
request_idとともにログに記録され、MCP と同様に、アップストリームでの失敗やタイムアウトはその ID の下にエラーログとして記録されます。ツール一覧と制限はロールごとのポリシー(lib/chatTools.mjs)で管理されているため、将来ゲストロールが追加された場合は、匿名ユーザー向けのレート制限のもとでcheck_*ツールを無料で利用できます。 - 正確な回答: 返信には、各結果の
status(flagged、no_flags、unknown)とreasonsが記載されます。no_flagsを「安全」と表現することはありません。失敗、タイムアウト、またはunknownとなったチェックは、モデルの出力にかかわらず、返信の末尾にコードおよびrequest_idとともに記載されます。ツールの出力は信頼できないデータとして扱われます。結果内のテキストは報告されますが、それに従って処理することはありません。 - トレースとカード: ライブトレースには、呼び出しごとに 1 行が表示されます(「ウォレットの利用期間を確認 · 0x12ab…9f3c · フラグなし」のように所要時間も表示され、失敗はエラー色で表示されます)。返信の下には結果ごとに 1 枚のカードが表示されます。カードには、平易な言葉で表したツール名、ステータスチップ、主要フィールド、理由、
data_as_ofを含むチェック、request_id、コピー ボタン付きの Raw JSON 展開欄が表示されます(タイトルではアドレスが短縮され、展開欄では完全なアドレスが表示されます)。 - 音声: 音声での返信が有効な場合、チェックを実行した返信では、チェックごとのステータスと主な理由を短く要約して読み上げます。アドレス、ハッシュ、JSON は読み上げません。
- アップストリームへの呼び出しなしでデモ: 以下のフィクスチャはチャットからも利用できます。例:「このウォレットを確認して 0x7067312d746573742d6669787475726500000001」「pg1-test-clean.invalid の登録から何年経っていますか」。カードには「fixture」と表示されます。

レスポンスメタデータ(reasons、status、checks、request_id)
すべての MCP ツールとすべての無料の A2A スキルは、既存の出力に加えて4つのフィールドを追加します。追加のみであり、既存のフィールドの名前変更や用途変更はありません。
reasons:[{ code, message }]。以下の恒久的なリストにある、機械可読なコードを0個以上含みます。該当するものがない場合は空です。コードは追加されることはあっても、削除や名前変更はされません。status:reasonsに実際の警告コードが含まれる場合は"flagged"、そうでなく、reasonsに未完了コードが含まれる場合、または回答に必要な情報源がタイムアウト、エラー、スキップとなった場合は"unknown"(誤ってクリーンと見なす"no_flags"として報告されることはありません)、それ以外の場合は"no_flags"です。reasonsに記載されるコードのうち、警告ではないものが2種類あります。情報提供コード(WALLET_DELEGATED、IP_TOR_EXIT_NODE、IP_WHITELISTED、IP_REPORTS_SCORED_ZERO)は事実を報告するもので、statusに影響しません。未完了コード(現在はWALLET_AGE_PARTIALのみ)はチェックが完了しなかったことを意味するため、statusは"flagged"ではなく"unknown"になります。check_wallet_ageの場合、WALLET_NO_HISTORYがある場合に限り"flagged"になります。それ以外では、処理が完了しなかったものがあれば(WALLET_AGE_PARTIAL、またはdelegated: null)"unknown"、それ以外は"no_flags"になります。なお、submit_indicatorには既存のstatusフィールドがあり、これは申請のライフサイクル状態を表すもので、この信頼性を示すstatusとは異なります。追加されるのはreasons/checks/request_idのみです。checks:[{ source, result, checked_at, data_as_of }]。この呼び出しで参照したデータソースごとに1件を含みます。resultは"ok" | "timeout" | "error" | "skipped"のいずれかです。sourceは常に一般的なラベル(例:"sanctions list"、"domain registration records"、"on-chain transfer history")であり、ベンダー名やプロバイダー名は含みません。checked_atはこのリクエストでチェックを実行した時刻、data_as_ofは基になるデータの鮮度を示す値で、該当しない場合はnullです。check_wallet_ageでは、キャッシュされた回答の"on-chain transfer history"エントリーのdata_as_ofは、その年齢を最初に照会した時刻になります(新規照会の場合はnull)。"on-chain code"エントリーはライブの委任チェックです。request_id:この呼び出しを識別する UUID です。/api/mcpおよび/api/a2aでは、レスポンスヘッダーX-Request-Idとしても送信されます。ツールの結果(およびstructuredContent)内、または JSON-RPC エラーの場合はerror.data内に含まれます。JSON-RPC エンベロープの最上位には含まれません。最上位にあるのはjsonrpc、id、result/errorのみです。呼び出しが失敗し、サーバーのエラーログに記録された場合も、同じrequest_idがログエントリーに付与されます。
check_wallet_sanctions、check_domain_age、check_hostname_reputation、check_wallet_age では、出力スキーマの outputSchema に、これら4つを任意プロパティとして宣言します(required には追加されず、スキーマのその他の部分に変更はありません)。さらに、任意のブール値 test_fixture も宣言します。これは、統合をテストするに記載のフィクスチャ入力に対するレスポンスにのみ含まれ、その値は true です。check_wallet_age では、任意の委任関連プロパティ delegated(boolean | null)と delegate_address(string | null)も宣言します。これらは required には含まれません(上記の check_wallet_age の注記を参照してください)。
理由コード
| コード | 意味 |
|---|---|
WALLET_SANCTIONED | アドレスが制裁リストの項目と一致します。 |
DOMAIN_NEWLY_REGISTERED_30D | ドメインが登録されてから30日未満です。 |
HOSTNAME_PHISHING_LISTED | ホスト名、またはその親ドメインがフィッシングブロックリストに登録されています。 |
HOSTNAME_LOOKALIKE | ホスト名が、既知のブランドドメインによく似たもの、またはそのタイポスクワットである可能性が高いです。 |
WALLET_NO_HISTORY | このチェーン上で、このアドレスのオンチェーン送金履歴が見つかりませんでした。 |
WALLET_AGE_PARTIAL | 内部送金を時間内に確認できませんでした。ウォレットは表示より古い可能性があります。(未完了:status は "flagged" ではなく "unknown" になります。) |
CVE_KNOWN_EXPLOITED_KEV | CVEが既知の悪用済み脆弱性カタログに登録されています。 |
IOC_FOUND_IN_THREAT_FEED | 脅威インジケーターフィードに、このインジケーターと一致するレコードが少なくとも1件あります。 |
WALLET_DELEGATED | このチェーン上で、アドレスに現在EIP-7702の委任が設定されています。コードが委任先コントラクトを指しています。(参考情報:これ単独でstatusが変わることはありません。) |
IP_ABUSE_REPORTED | 確認対象の報告期間内に寄せられた報告に基づき、IPアドレスの不正利用信頼度スコアが0を超えています。 |
IP_TOR_EXIT_NODE | IPアドレスはTorの出口ノードです。(参考情報:これ単独でstatusが変わることはありません。) |
IP_WHITELISTED | IPアドレスは不正利用報告元によって許可リストに登録されているため、その報告はスコアに反映されません。(参考情報:これ単独でstatusが変わることはありません。) |
IP_REPORTS_SCORED_ZERO | 確認対象の報告期間内にIPアドレスへの不正利用報告がありますが、不正利用信頼度スコアは0です。(参考情報:これ単独でstatusが変わることはありません。) |
信頼できる情報源:lib/reasonCodes.mjs。
未対応: /api/ioc RESTフィードと/api/ioc/contextには、まだreasons/status/checks/request_idが含まれていません。
インテグレーションをテストする
何かをフラグ付けできるすべての MCP ツールには、常に同じ回答を返す、固定された架空のフィクスチャ入力が 3 つあります。1 つは FLAGGED、1 つは CLEAN、もう 1 つは UNKNOWN です。テストする価値のある 2 つ目のケースとして、もう 1 つ用意されているツールもあります。check_wallet_age の DELEGATED、check_hostname_reputation の LOOKALIKE(登録済みホスト名ではなく、タイポスクワッティング)、check_package の MISSING(アシスタントが作り上げた名前のように、存在しないパッケージ)、そして get_ioc_batch / get_cve_batch の MIXED(フラグ付けされたエントリーとされていないエントリーが 1 つずつ含まれるため、バッチのステータスだけでなく各エントリーを確認したかをテストできます)です。これらを使えば、費用をかけたりライブデータに依存したりせずに、インテグレーションの正常系、「フラグ付き」経路、スキップ/再試行経路をテストできます。
-
常に無料で、すべての呼び出し元が利用できます。ライセンスキー、
x-free-tierヘッダー、x402 による支払い、レート制限の利用は不要です。有料ツールにも適用されます。 -
実際のレスポンスと同じ形式です。
reasons、status、checks、request_idに加え、test_fixture: trueが含まれます。すべてのchecks[]エントリーにはsource: "fixture"が含まれます。エラー形式の UNKNOWN では、JSON-RPC エラーの場合はerror.data内に、isError ツール結果の場合はcodeの隣にtest_fixture: trueが含まれます。 -
UNKNOWN は、そのツールで実際の上流障害が発生した場合に返されるものとまったく同じです。そのため、スキップ経路をテストできます。
check_wallet_ageの場合、これはupstream_unavailableの isError 結果であり、found: falseではありません。 -
check_domain_ageでは、必ずfoundより先にstatusを確認してください。status: "unknown"の場合のfound: falseは、ドメインが新しいという意味ではなく、照会が完了しなかったことを意味します。 -
値は完全一致のみです。 正規化されるのはツール自体が行う処理だけです。
0xアドレスまたはホスト名の小文字化、CVE ID の大文字化、ドメイン/URL の登録可能ドメインへの変換がこれに当たります。それ以外は、1 文字違いでも実際の入力として扱われるため、www.pg1-test-flagged.invalidは実際のホスト名照会になります。 -
すべての値は予約済み、または合成されたものなので、実在する対象に属することはありません。
.invalidドメイン(RFC 2606/6761)、ドキュメント用 IP 範囲(RFC 5737 の192.0.2.0/24、198.51.100.0/24、203.0.113.0/24、RFC 3849 の2001:db8::/32)、CVE-0000-*ID(CVE プログラムは 1999 年に開始)、および 16 進数表記でpg1-test-fixtureを表す0xアドレスが使われています。 -
check_wallet_ageに年齢のしきい値はありません。FLAGGED フィクスチャは履歴のないウォレット(found: false、WALLET_NO_HISTORY)で、CLEAN フィクスチャは固定のfirst_seenを持つ古いウォレットです。DELEGATED フィクスチャは EIP-7702 の委任を持つ古いウォレットです。delegated: true、合成されたdelegate_address(こちらも 16 進数表記でpg1-test-fixtureを表します)、そしてコードが情報提供用であるためstatus: "no_flags"の理由WALLET_DELEGATEDが含まれます。実際の回答と同様、checksエントリーは 2 つ(送金履歴、次に委任チェック)あり、どちらもsource: "fixture"、result: "ok"です。ほかのフィクスチャではdelegated: falseが返されます。chainは任意で、指定するとその値が返されます。未対応のチェーンは引き続きinvalid_chainエラーになります。 -
check_packageでは_で始まる名前を使用します。このような名前は npm と PyPI のどちらでも受け付けられないため、フィクスチャが実在するパッケージになることはありません。ライブ経路ではinvalid_package_nameとして拒否されます。同じ 3 つの名前は"ecosystem": "npm"または"pypi"でも使え、上流への呼び出しは発生しません。データは合成されたものであり、レポート IDMAL-0000-0001が発行されることはありません。versionは任意で、指定するとその値が返されます。 -
check_ip_abuseではドキュメント用の IPv4 アドレスを使用します。これらは予約済みで公開アドレスではないため、ライブ経路ではinvalid_ipとして拒否され、フィクスチャが実際の照会になることはありません。フィクスチャはキーの確認より先に応答するため、X-AbuseIPDB-Keyヘッダーは不要で、上流への呼び出しも発生しません。データは合成されたものであり、その旨がattribution.textに記載されています。max_age_in_daysは任意で、指定するとその値が返されます。
フィクスチャ一覧
| ツール | フィクスチャ | 引数 | 期待される結果 |
|---|---|---|---|
check_wallet_sanctions | FLAGGED | {"address":"0x7067312d746573742d6669787475726500000001"} | listed: true、status "flagged"、reason WALLET_SANCTIONED |
check_wallet_sanctions | CLEAN | {"address":"0x7067312d746573742d6669787475726500000002"} | listed: false、status "no_flags" |
check_wallet_sanctions | UNKNOWN | {"address":"0x7067312d746573742d6669787475726500000003"} | HTTP 503、JSON-RPC error -32003 "Sanctions data temporarily unavailable, please retry." |
check_domain_age | FLAGGED | {"domain":"pg1-test-flagged.invalid"} | found: true、age_days 3、newly_registered: true、status "flagged"、reason DOMAIN_NEWLY_REGISTERED_30D |
check_domain_age | CLEAN | {"domain":"pg1-test-clean.invalid"} | found: true、registration_date 2000-01-01、status "no_flags" |
check_domain_age | UNKNOWN | {"domain":"pg1-test-unknown.invalid"} | found: false、reason_code "timeout"、status "unknown"(実際の登録情報検索でタイムアウトした場合に返される内容) |
check_hostname_reputation | FLAGGED | {"hostname":"pg1-test-flagged.invalid"} | verdict "listed"(match_type "exact")、status "flagged"、reason HOSTNAME_PHISHING_LISTED |
check_hostname_reputation | CLEAN | {"hostname":"pg1-test-clean.invalid"} | verdict "not_listed"、status "no_flags" |
check_hostname_reputation | UNKNOWN | {"hostname":"pg1-test-unknown.invalid"} | HTTP 503、JSON-RPC error -32003 "Phishing domain list temporarily unavailable, please retry." |
check_hostname_reputation | LOOKALIKE | {"hostname":"pg1-test-lookalike.invalid"} | verdict "lookalike"、lookalike_of pg1-test-brand.invalid、status "flagged"、reason HOSTNAME_LOOKALIKE |
check_wallet_age | FLAGGED | {"address":"0x7067312d746573742d6669787475726500000001"} | found: false(送金履歴なし)、status "flagged"、reason WALLET_NO_HISTORY |
check_wallet_age | CLEAN | {"address":"0x7067312d746573742d6669787475726500000002"} | found: true、first_seen 2023-09-01T00:00:00.000Z、status "no_flags" |
check_wallet_age | UNKNOWN | {"address":"0x7067312d746573742d6669787475726500000003"} | isError: true、code "upstream_unavailable"、status "unknown"(found: falseにはなりません) |
check_wallet_age | DELEGATED | {"address":"0x7067312d746573742d6669787475726500000004"} | found: true、is_contract: true、delegated: true、delegate_address 0x7067312d746573742d66697874757265de1e9a7e、reason WALLET_DELEGATED(参考情報)、status "no_flags" |
get_ioc_context | FLAGGED | {"value":"192.0.2.1"} | found: true、status "flagged"、reason IOC_FOUND_IN_THREAT_FEED(無料、支払い不要) |
get_ioc_context | CLEAN | {"value":"198.51.100.1"} | found: false、status "no_flags" |
get_ioc_context | UNKNOWN | {"value":"203.0.113.1"} | HTTP 503、JSON-RPC error -32603 "Threat data temporarily unavailable, please retry." |
get_ioc_batch | FLAGGED | {"values":["2001:db8::1"]} | total_found 1、status "flagged"、reason IOC_FOUND_IN_THREAT_FEED(無料、支払い不要) |
get_ioc_batch | CLEAN | {"values":["2001:db8::2"]} | total_found 0、status "no_flags" |
get_ioc_batch | UNKNOWN | {"values":["2001:db8::3"]} | HTTP 503、JSON-RPC error -32003 "Threat data temporarily unavailable, please retry." |
get_ioc_batch | MIXED | {"values":["2001:db8::1","2001:db8::2"]} | total_requested 2、total_found 1(1つ目は検出、2つ目は found: false)、status "flagged"(無料、支払い不要) |
get_cve_details | FLAGGED | {"cve_id":"CVE-0000-0001"} | cisa_kev.is_known_exploited: true、status "flagged"、reason CVE_KNOWN_EXPLOITED_KEV(無料、支払い不要) |
get_cve_details | CLEAN | {"cve_id":"CVE-0000-0002"} | cisa_kev.is_known_exploited: false、status "no_flags" |
get_cve_details | UNKNOWN | {"cve_id":"CVE-0000-0003"} | exploit-scoreとKEVのチェックは "error"、exploit scoreはnull、status "unknown" |
get_cve_batch | FLAGGED | {"cve_ids":["CVE-0000-0001"]} | KEVリストに掲載された結果が1件、status "flagged"、reason CVE_KNOWN_EXPLOITED_KEV(無料、支払い不要) |
get_cve_batch | CLEAN | {"cve_ids":["CVE-0000-0002"]} | KEVに掲載されていない結果が1件、status "no_flags" |
get_cve_batch | UNKNOWN | {"cve_ids":["CVE-0000-0003"]} | exploit-scoreとKEVのチェックは "error"、status "unknown" |
get_cve_batch | MIXED | {"cve_ids":["CVE-0000-0001","CVE-0000-0002"]} | 結果は2件。1つ目はKEVリストに掲載、2つ目は非掲載、status "flagged"(無料、支払い不要) |
get_cve_by_product | FLAGGED | {"vendor":"pg1-test.invalid","product":"flagged"} | KEVリストに掲載されたCVEが1件、status "flagged"、reason CVE_KNOWN_EXPLOITED_KEV(無料、支払い不要) |
get_cve_by_product | CLEAN | {"vendor":"pg1-test.invalid","product":"clean"} | total_found 0、status "no_flags" |
get_cve_by_product | UNKNOWN | {"vendor":"pg1-test.invalid","product":"unknown"} | exploit-scoreとKEVのチェックは "error"、status "unknown" |
check_ip_abuse | FLAGGED | {"ip":"192.0.2.1"} | abuse_confidence_score 100、total_reports 42、ホワイトリスト登録なし、status "flagged"、reason IP_ABUSE_REPORTED(合成データ。キーのヘッダーは不要で、上流への呼び出しもありません) |
check_ip_abuse | CLEAN | {"ip":"198.51.100.1"} | abuse_confidence_score 0、total_reports 0、status "no_flags"(報告なし。スコア0は、そのアドレスに危険性がないことの証明ではありません) |
check_ip_abuse | UNKNOWN | {"ip":"203.0.113.1"} | isError: true、code "upstream_unavailable"、status "unknown"(実際の検索でタイムアウトした場合に返される内容) |
check_package | FLAGGED | {"ecosystem":"npm","name":"_pg1-test-flagged"} | exists: true、age_days 3、reported_malicious: true(MAL-0000-0001)、status "flagged"、reasons PACKAGE_REPORTED_MALICIOUSとPACKAGE_NEWLY_PUBLISHED(参考情報)(合成データ。上流への呼び出しなし。"pypi"も使用できます) |
check_package | CLEAN | {"ecosystem":"npm","name":"_pg1-test-clean"} | exists: true、first_published 2026-01-01、reported_malicious: false、脆弱性なし、status "no_flags" |
check_package | UNKNOWN | {"ecosystem":"npm","name":"_pg1-test-unknown"} | exists: true。ただし、悪意あるパッケージの報告と脆弱性のチェックは "timeout"、reported_malicious: null、status "unknown"(実際の検索でタイムアウトした場合に返される内容) |
check_package | MISSING | {"ecosystem":"npm","name":"_pg1-test-missing"} | exists: false、status "flagged"、reason PACKAGE_NOT_FOUND(アシスタントが作り出した名前のように、実在しない名前) |
get_threat_indicators(ターゲット入力を必要としない一括フィード)、get_threat_actor_profile、get_usage_status(フラグ付けに使える理由コードがないため)、submit_indicator(書き込みアクションで、status は判定ではなくライフサイクル状態)のフィクスチャはありません。 |
A2A: フィクスチャがある6つの無料スキル(check_wallet_sanctions、check_domain_age、check_hostname_reputation、check_wallet_age、check_ip_abuse、check_package)は、/api/a2a でも同じフィクスチャを受け付けます。結果は完了済みの Task として返されます。isError 形式の UNKNOWN は、詳細が error.data に入った JSON-RPC エラー -32000 として返されます。503 形式の UNKNOWN は、JSON-RPC エラー -32010 を伴う HTTP 503 として返されます。これらは、そのエンドポイントで実際の失敗が発生した場合と同じ形式です。
対象外: REST エンドポイント(/api/ioc と /api/ioc/context)にはフィクスチャがありません。そこに送信されたフィクスチャ値は、ほかの値と同様に検索されます。
例
MCP 経由の FLAGGED。キーなし:
curl -X POST https://pg1-ai-agent.vercel.app/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_hostname_reputation","arguments":{"hostname":"pg1-test-flagged.invalid"}}}'
スキップ処理をテストするための、MCP 経由の UNKNOWN(upstream_unavailable の isError 結果):
curl -X POST https://pg1-ai-agent.vercel.app/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"check_wallet_age","arguments":{"address":"0x7067312d746573742d6669787475726500000003"}}}'
有料ツールの FLAGGED フィクスチャ。キーなしでも無料:
curl -X POST https://pg1-ai-agent.vercel.app/api/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_cve_details","arguments":{"cve_id":"CVE-0000-0001"}}}'
無効な入力に対するメッセージ
無効な入力では、既存のエラーコードが維持されます(ほとんどのツールでは JSON-RPC -32602、形式が不正な get_cve_details の id では -32004、またはツール独自の invalid_address/invalid_hostname/invalid_chain isError コード)。メッセージには、何が問題だったか、期待される形式、有効な入力例が記載され、最後に request_id が付加されます。生の入力がそのまま返されることはありません。例:
address is not a valid EVM address. Expected: '0x' followed by exactly 40 hex characters (case-insensitive). Example: 0x7067312d746573742d6669787475726500000002. request_id: 9cf7345b-f8d6-46f7-8e45-0da5e25a002d
PG1 Studio の映画用ボイス(オペレーター)
映画ごとにボイスが選択されます。環境変数は必要ありません。
/voices(サインイン済みのオペレーターのみ)は、アカウント内のボイスを簡単な説明(アクセント、年齢、性別、用途)とともに一覧表示し、それぞれがクライアント向けの仕事で使用許可済みかどうかを示します。ストック(プリメイド)ボイスと、アカウントで作成したボイスは使用許可済みです。共有ボイスライブラリから追加したボイスは、使用許可されていません。/film ... --voice "<name or id>"と/film director ... --voice "<name or id>"では、ボイスを選択します(Director Mode ではナレーターのボイス)。まず id の完全一致を照合し、次に名前(大文字・小文字を区別せず、前後の空白を除去)を照合します。名前が見つからない場合は最も近い名前を3つ提示し、同じ名前のボイスが2つある場合はそれぞれの id を表示します。使用許可されていないボイスをクライアント向け映画で使おうとすると拒否されます。いずれの場合も、作成や費用の発生前に処理が停止します。--voiceを指定しない Director Mode では、トリートメント(年齢、性別、トーン、アクセント)に合うように、アカウント内のボイスからナレーターと発話するすべてのキャラクターの配役を決め、そのキャストを映画(director.cast)に保存します。再試行や再生成でも同じキャストが使われ、映画の配役が変更されることはありません。キャストのボイスがアカウントからなくなった場合は、その役だけ別のボイスに切り替え、映画の制作は続行されます。- 映画で選択または配役されたボイスがない場合のフォールバック順序:そのボイスが引き続きアカウント内にあり(クライアント向け映画の場合は使用許可済みであること)、
PG1_FILM_VOICE_IDが設定されていれば、そのボイスを使います。それ以外の場合は、FALLBACK_PREMADE_VOICE(lib/film/voices.mjsにある男性のイギリス英語ボイス)で指定されたプリメイドボイスを使います。このボイスの id は、アカウントのボイス一覧から名前で検索されます。ボイスが見つからない、または無効でも、映画の制作が失敗することはありません。
謝辞
- Frits(x402 Doctor):決済ゲートの処理順序に関するバグを見つけ、修正を確認してくださいました。これにより、PG1 はデフォルトで適切な x402 決済チャレンジを返すようになりました。
check_packageのデータソースとライセンス(OSV.dev 経由の OpenSSF Malicious Packages、GitHub Advisory Database、PyPI Advisory Database、Go Vulnerability Database、RustSec、および npm の公開レジストリと PyPI)は、lib/attributions.mjsから生成される /docs/attributions に記載されています。check_hostname_reputationのブロックリスト/許可リスト/ファジーリストのデータは、MetaMask eth-phishing-detect を出典とし、Don't Be A Dick (DBAD) Public License に基づいて使用しています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。