{"openapi":"3.1.0","info":{"title":"SRI — MCP Server Inspector","version":"0.1.0"},"paths":{"/mcp":{"get":{"tags":["mcp"],"summary":"Mcp Get","description":"GET は SSE ストリームの要求。こちらは提供しないので 405 を返す。\n\n⚠️ 405 は**仕様どおり**である（Streamable HTTP は\n   「text/event-stream を返すか、405 を返すか」の二択）。\n\n   ただし本文を空にしない。実測で 37 訪問者中 5 者が GET だけで\n   離脱していた。旧トランスポート（2024-11-05 の HTTP+SSE）の作法で\n   GET から入る実装がまだあり、素の 405 だと「壊れている」と\n   解釈されて終わる。何をすべきかを本文に書けば、実装者が読める。","operationId":"mcp_get_mcp_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["mcp"],"summary":"Mcp Endpoint","operationId":"mcp_endpoint_mcp_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/price":{"get":{"tags":["public"],"summary":"Price","description":"買う前に価格を知れなければ意思決定できない。だから無償で公開する。","operationId":"price_v1_price_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/corpus":{"get":{"tags":["public"],"summary":"Corpus","description":"何をどこまで読んだか。索引の入口。","operationId":"corpus_v1_corpus_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/changes":{"get":{"tags":["public"],"summary":"Corpus Changes","description":"版をまたいで**コードが実際に変わり**、観測も動いたサーバの一覧。無料。\n\n⚠️ 載る条件は「content hash が変わった AND（判定かカテゴリが動いた）」。\n   hash が同じで判定だけ動いたものは**我々の規則が変わっただけ**なので\n   載せない——それを「サーバが変わった」と言うのは嘘になる。\n\n⚠️ 中身（どの行がどう変わったか）はここに無い。無料は事実の索引まで。\n   根拠は /v1/verify（各版を照会して突き合わせる）の側。","operationId":"corpus_changes_v1_changes_get","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","default":90,"title":"Days"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/corpus/index":{"get":{"tags":["public"],"summary":"Corpus Index","description":"読んだ対象の一覧。中身は返さない。\n\nname を指定すれば1件の被覆確認になる（「これ読んだ？」の直接照会）。","operationId":"corpus_index_v1_corpus_index_get","parameters":[{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}},{"name":"ecosystem","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ecosystem"}},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/resolve":{"get":{"tags":["public"],"summary":"Resolve","description":"パッケージ名から MCP レジストリ名を引く。無料。\n\n⚠️ これは**写しであって判断ではない**。レジストリが自分でそう名乗って\n   いるという事実だけを返す。曖昧なときに1つへ寄せない——利用者が\n   別のサーバの調査結果を自分のものだと思い込むほうが、\n   「分からない」と言われるより悪い。\n\nなぜ我々が持つのか: 公式レジストリの検索は**サーバ名しか見ていない**。\npackages[].identifier を持っているのに検索対象に入っておらず、\n\"firebase-tools\" では 0 件が返る（実測）。.mcp.json に書いてあるのは\nそのパッケージ名のほうなので、ここが無いと設定ファイルから辿れない。","operationId":"resolve_v1_resolve_get","parameters":[{"name":"package","in":"query","required":true,"schema":{"type":"string","title":"Package"}},{"name":"ecosystem","in":"query","required":false,"schema":{"type":"string","default":"mcp","title":"Ecosystem"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/l402/challenge":{"post":{"tags":["public"],"summary":"L402 Challenge","description":"402 と請求書を返す。エージェントはこれを見て自律的に支払う。\n\n⚠️ ボディにも価格を書く。ヘッダの bolt11 をデコードしないと金額が\n   分からない設計だと、クライアントが「宣言された価格」と「請求額」を\n   突き合わせられず、請求書すり替えを検知できない（DESIGN.md §7.3）。","operationId":"l402_challenge_v1_l402_challenge_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChallengeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/verify":{"post":{"tags":["verify"],"summary":"Verify","operationId":"verify_v1_verify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/x402/verify":{"get":{"tags":["verify"],"summary":"X402 Verify","description":"常に支払いを要求する経路。無料の /v1/verify とは別物。\n\n⚠️ **本文を pydantic に検証させない。** 型注釈で受けると、本文が\n   JSON オブジェクトでない場合（配列・文字列・壊れた JSON・text/plain・\n   フォーム）に FastAPI が先に 422 を返し、402 に到達しない。\n   実測で CDP の検証がそこで止まり、preflight の18項目すべてが\n   Skipped になった。\n\n⚠️ そして順序として、**未払いなら本文を見る前に 402 を返す**のが正しい。\n   支払っていない相手の入力を解析する理由が無く、402 は\n   「払えば通る」という意味なので、本文の良し悪しとは独立している。\n\n⚠️ free_tier に落とさない。無料で通すと「常に有料」の前提が崩れ、\n   402 を返せなくなる（＝発見されなくなる）。","operationId":"x402_verify_v1_x402_verify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"tags":["verify"],"summary":"X402 Verify","description":"常に支払いを要求する経路。無料の /v1/verify とは別物。\n\n⚠️ **本文を pydantic に検証させない。** 型注釈で受けると、本文が\n   JSON オブジェクトでない場合（配列・文字列・壊れた JSON・text/plain・\n   フォーム）に FastAPI が先に 422 を返し、402 に到達しない。\n   実測で CDP の検証がそこで止まり、preflight の18項目すべてが\n   Skipped になった。\n\n⚠️ そして順序として、**未払いなら本文を見る前に 402 を返す**のが正しい。\n   支払っていない相手の入力を解析する理由が無く、402 は\n   「払えば通る」という意味なので、本文の良し悪しとは独立している。\n\n⚠️ free_tier に落とさない。無料で通すと「常に有料」の前提が崩れ、\n   402 を返せなくなる（＝発見されなくなる）。","operationId":"x402_verify_v1_x402_verify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"head":{"tags":["verify"],"summary":"X402 Verify","description":"常に支払いを要求する経路。無料の /v1/verify とは別物。\n\n⚠️ **本文を pydantic に検証させない。** 型注釈で受けると、本文が\n   JSON オブジェクトでない場合（配列・文字列・壊れた JSON・text/plain・\n   フォーム）に FastAPI が先に 422 を返し、402 に到達しない。\n   実測で CDP の検証がそこで止まり、preflight の18項目すべてが\n   Skipped になった。\n\n⚠️ そして順序として、**未払いなら本文を見る前に 402 を返す**のが正しい。\n   支払っていない相手の入力を解析する理由が無く、402 は\n   「払えば通る」という意味なので、本文の良し悪しとは独立している。\n\n⚠️ free_tier に落とさない。無料で通すと「常に有料」の前提が崩れ、\n   402 を返せなくなる（＝発見されなくなる）。","operationId":"x402_verify_v1_x402_verify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/verify/batch":{"post":{"tags":["verify"],"summary":"Verify Batch","description":"CI から package-lock.json / requirements.txt をまとめて投げる用途。","operationId":"verify_batch_v1_verify_batch_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchVerifyRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/artifacts/{ecosystem}/{name}/{version}":{"get":{"tags":["verify"],"summary":"Get Artifact","operationId":"get_artifact_v1_artifacts__ecosystem___name___version__get","parameters":[{"name":"ecosystem","in":"path","required":true,"schema":{"type":"string","title":"Ecosystem"}},{"name":"name","in":"path","required":true,"schema":{"type":"string","title":"Name"}},{"name":"version","in":"path","required":true,"schema":{"type":"string","title":"Version"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/disputes":{"post":{"tags":["public"],"summary":"Submit Dispute","description":"パッケージ作者からの再審査要求。3営業日以内に一次回答する。","operationId":"submit_dispute_v1_disputes_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisputeRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"BatchVerifyRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/VerifyRequest"},"type":"array","maxItems":200,"title":"Items"}},"type":"object","required":["items"],"title":"BatchVerifyRequest"},"ChallengeRequest":{"properties":{"amount_usd":{"type":"number","maximum":100.0,"minimum":0.1,"title":"Amount Usd","description":"Amount to credit, in JPY.","default":1.0}},"type":"object","title":"ChallengeRequest"},"DisputeRequest":{"properties":{"ecosystem":{"type":"string","maxLength":16,"minLength":1,"title":"Ecosystem"},"name":{"type":"string","maxLength":214,"minLength":1,"title":"Name"},"version":{"type":"string","maxLength":64,"minLength":1,"title":"Version"},"submitter":{"type":"string","maxLength":200,"title":"Submitter","description":"Contact address (e.g. email)."},"claim":{"type":"string","maxLength":4000,"minLength":10,"title":"Claim"}},"type":"object","required":["ecosystem","name","version","submitter","claim"],"title":"DisputeRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VerifyRequest":{"properties":{"ecosystem":{"type":"string","title":"Ecosystem","description":"mcp | npm | pypi"},"name":{"type":"string","maxLength":214,"minLength":1,"title":"Name"},"version":{"type":"string","maxLength":64,"minLength":1,"title":"Version"}},"type":"object","required":["ecosystem","name","version"],"title":"VerifyRequest"}}}}