概要

MCPサーバーのセキュリティ

このページは、AIエージェントをDocsbookに接続することを承認する必要がある方を対象としています。ここでは、MCPサーバーが現在実際に行っていること、つまりクライアントの認証方法、各スコープでアクセスできる範囲、記録される内容、ネットワークの外部に送信される内容を説明し、そのうえで、DocsbookがModel Context Protocol仕様に準拠していない点と、まだ存在しないコンプライアンス関連の成果物を、それぞれ別の2つのセクションで示します。

ここに書かれている内容に、将来の計画を示すものはありません。管理策が存在しない場合は、存在しないものとして記載しています。

得られるもの#

接続されたクライアントは、1つのDocsbookアカウントに結び付けられた1つの不透明なベアラートークンを保持し、2つあるスコープのいずれか1つを持ちます。スコープは同意画面で人間が選択するものであり、クライアントが要求するものではありません。プロジェクトに対して動作するすべてのツールは、ownerによってそのプロジェクトを解決するため、他人に属するワークスペースIDを指定したトークンは、そのワークスペースではなく、何も取得できません。これがテナント間の境界であり、すべてのツールで維持されます。

読み取りと書き込みの境界は、2つのスコープ名から想像されるほど単純ではありません。以下のセクションでは、どのツールがこの境界を適用し、どのツールが適用しないのかを正確に説明します。読み取り専用トークンを封じ込め対策として扱う前に、これを読んでください。

従量計測の対象となる呼び出しはすべて、プロジェクト専用の呼び出しログに1行を書き込みます。使用したツール、入力された内容、返された内容、所要時間、消費したものが記録されます。引数と結果は保存前にキー単位で編集されるため、ツールに渡されたAPIキーが記録されることはありません。

得られないもの:トークンの有効期限、リフレッシュトークン、レート制限、アカウント内のロール、監査レポート。

認証の仕組み#

認可フロー#

Docsbook は独自の認可サーバーであり、独自のリソースサーバーでもあります。自身のために不透明なトークンを発行し、他者が発行したトークンを受け入れたり、転送したり、再利用したりすることはありません。

ステップ 処理内容
ディスカバリー サーバーエンドポイントへの未認証リクエストは、WWW-Authenticate: Bearer resource_metadata="…/.well-known/oauth-protected-resource" を含む 401 を返します。そのドキュメントにはリソースとその認可サーバーが記載され、/.well-known/oauth-authorization-server に RFC 8414 形式のエンドポイントが含まれます。
クライアント登録 登録エンドポイントへの POST は、RFC 7591 形式の新しい client_id を返します。クライアントは永続化されません。ID はステートレスに生成され、認可エンドポイントは任意の client_id を受け入れます。
認可 クライアントは response_type=coderedirect_uri、8 文字以上の state、そして通常は PKCE の code_challenge を送信します。パラメーターは state に関連付けて保存され、ブラウザーは同意ページに移動します。行は 10 分後に期限切れになります。
同意 同意ページでは、Docsbook アカウントへのサインインと明示的なクリックが必要です。スコープを決定するチェックボックス「ドキュメントの編集を許可する」が 1 つあります。「このクライアントを記憶する」Cookie も、サイレントな再承認経路もありません。認可のたびにこの画面が表示されます。
トークン交換 コードはトークンエンドポイントで Bearer トークンと交換されます。クライアントがメソッド S256 の PKCE チャレンジを指定した場合、検証子がチェックされ、不一致の場合は拒否されます。コードは 1 回限り使用可能で、最初の交換が成功した時点で消去されます。

公開されているメタデータでは、パブリッククライアントモデル、つまり code_challenge_methods_supported: ["S256"]token_endpoint_auth_methods_supported: ["none"]grant_types_supported: ["authorization_code"] が宣言されています。クライアントシークレットも、クライアントクレデンシャルグラントもありません。

トークンとは#

トークンはプラットフォームの CSPRNG から取得した48バイトを、96文字の16進数として表現したものです。クレームは一切含まれず、アカウント、スコープ、失効タイムスタンプを保持する行へのルックアップキーです。

  • 有効期限はありません。 expires_in は返されず、リフレッシュトークンも発行されません。トークンは失効されるまで有効です。
  • 失効は即時に反映されます。 パネルから失効させると行に記録され、その後のすべての呼び出しでルックアップに失敗します。前段にキャッシュはありません。
  • ハッシュ化されず、発行時のまま保存されます。 Docsbook MCP トークンはパスワードと同じように扱ってください。保持しているマシンが侵害された場合は、時間の経過で無効になると考えず、トークンを失効させてください。(保存時に暗号化されるものについては、ワークスペースから外部に出るものに記載されています。)
  • 最終使用日時が記録されます。 すべての呼び出しで記録されるため、未使用のトークンもパネルのトークン一覧で確認できます。

各スコープで可能なこと#

スコープは完全一致で比較される単一の文字列です。書き込みスコープでないものはすべて読み取り専用として扱われ、認識されない値は安全側に倒して拒否されます。

呼び出し元 回答内容
トークンなし、スコープ未指定のエンドポイント 何もありません。検出ヘッダー付きの 401
トークンなし、リポジトリスコープのエンドポイント(/{owner}/{repo}/api/mcp/server 5つのツール:get_infofind_skillfind_widgetlist_content_widgetssearch。1つの公開済みサイトに対して動作します。メーター計測されることも、誰かに請求されることもありません。
読み取り専用トークン すべてのレポート、検索、アウトライン、分析、呼び出し履歴ツールに加え、list_memoryそして現在は、以下に一覧されている設定書き込みツールも含まれます
読み書きトークン アカウントで可能なすべての操作

現在、スコープチェックはすべての書き込みツールを対象としているわけではないため、その前提で計画してください。 スコープチェックが適用されるツールは、write_docscreate_issueconnect_sourceconfigure_sourceの4つだけです。これらは何も実行する前に、読み取り専用トークンを拒否します。

その他の状態変更ツール — update_*およびset_*の設定書き込みツール、update_access、Webhookの登録と削除、目標とファネルの作成、翻訳のアップロード、承認と削除、create_workspace — は、スコープではなくプロジェクト所有権だけによって制限されています。したがって、読み取り専用トークンでも、アカウントが所有するプロジェクトの設定を変更したり、Webhookを有効化したり、翻訳を削除したりできます。ただし、ページをコミットしたり、課題を登録したり、ソースを接続したり、エージェントを有効化したりすることはできません。

読み取り専用スコープは「公開や新しい機能の接続はできない」と捉え、「何も変更できない」とは考えないでください。これ以上の封じ込めが重要な場合は、公開してもよいプロジェクトだけを所有する別のDocsbookアカウントを使用してください。これは設計ではなく、制限事項で改めて記載している不具合です。

チェックを適用するツールは、読み取り専用トークンに対して、ツール名と再認証方法を示す構造化されたREAD_ONLY_TOKENエラーを返します。単なる403でも、何も通知しないまま終了するものでもありません。プロジェクトの残高が空の場合も同じ形式が適用され(プロジェクト名、価格、残額を示すINSUFFICIENT_BALANCE)、プランにその機能が含まれていない場合も同様です(ティアを示すPLAN_RESTRICTION)。

匿名のsearchは、トークンなしでプロジェクトを読み取る唯一のツールであり、3つのケースで拒否されます。プロジェクトが指定されていないエンドポイントの場合、公開設定が非公開のプロジェクトの場合(期限切れのプランもこれに含まれます)、またクエリ埋め込みの支払いに使える残高がプロジェクトに残っていない場合です。プロジェクト引数を受け取らないため、読み取れるのは常に自分が固定されているサイトだけです。

1つのトークンでは到達できない範囲#

各ツールは、明示的な workspace_idrepo 引数、またはエンドポイント自体のピンから対象ワークスペースを解決しますが、いずれの場合もトークンのアカウントでフィルタリングされた状態で検索されます。アカウントが所有していないワークスペースは何も解決されず、ツールは「ワークスペースが見つかりません」と応答します。課金リゾルバーにも同じフィルターが適用されるため、他人のプロジェクト ID を指定しても、他人の残高から引き落とすことはできません。

さらに、意外に思われる2つの境界についても説明しておきます。

  • write_docs は、Docsbook 独自の GitHub 資格情報を使用して、Docsbook がホストするリポジトリにコミットします。自身の GitHub アカウントにあるリポジトリから提供されるサイトは NO_GITHUB_ACCESS で拒否され、コミットされません。したがって、MCP トークンは GitHub 組織にプッシュするための手段ではありません。
  • 監査モードで実行されているスキルは変更を加えられません。audit モードのスキルがアクティブな間は、明示的なライターのリストに加え、名前が update_set_register_webhook_enable_、または disable_ で始まるすべてのツールが、実行前に拒否されます。サーバー側の実行全体に対して以前このモードを設定していたランナーは 12.09.2026 に削除されたため、現在このガードが保護するのは、audit スキルを事前に読み込んだターンと、それ以外に何もない場合だけです。

記録される内容#

メーター対象かどうか、成功したかどうかにかかわらず、すべてのMCP呼び出しはプロジェクトの呼び出し台帳に1行を書き込み、プロジェクトの所有者はFeedsパネルでそれを確認できます。

記録されるもの 記録されないもの
ツール名、課金クラス、価格、実際に差し引かれたセント数、実行時間、成功フラグ、バックグラウンド実行ID、呼び出し元(エージェント、パネル、スケジュール、イベント) 呼び出し元のIPアドレス
呼び出しの引数と結果(シリアライズ、編集、切り詰め済み) 生のペイロード — 編集および切り詰め後の表示内容のみが保存されます
呼び出しを行ったアカウントと、呼び出しの対象となったプロジェクト apikeyapi_keyauthorizationcredentialpasswordpasswdsecrettokenprivate_keyprivatekeysessioncookieのいずれかを含むキーの下にある値

確認にあたっては、編集処理の2つの点が重要です。照合するのは値の形状ではなく、キーを大文字と小文字を区別せず、部分文字列として照合します。秘密情報がどのような形をしているかを推測する方法では、見逃してしまいます。また、処理は入力時だけでなく出力時にも実行されるため、入力内容をそのまま返すツールでも、結果を通じてキーが漏洩することはありません。各側は8,000文字で切り詰められ、何文字削除されたかを示すマーカーが付加されます。

閲覧者レベルの分析情報がMCPクライアントにIDを渡すことはありません。訪問者は仮名化されます。sha256(salt | repository | ip)は16桁の16進文字に切り詰められ、ソルトはサーバー側で保持されます。get_top_visitorsget_page_journeysget_visitor_activityは、その仮名、国、ページレベルのイベントを返します。どのツールもIPアドレス、名前、メールアドレスを返しません。仮名のスコープは1つのリポジトリに限定されるため、あなたの2つのサイトを訪れた同じ閲覧者も、互いに無関係な2つのIDとして扱われます。

ワークスペースから外部に出るもの#

データ 送信先 保存時の暗号化
ページ本文、見出し、タイトル 全文検索用に Docsbook の Postgres にコピーされ、セマンティック検索用のベクトルとして埋め込まれる いいえ — コンテンツとして保存
埋め込み、チャット、エージェント処理のために送信されるページ本文 OpenRouter。Docsbook のキー、または設定した場合は独自のキーを使用するモデルプロバイダー 該当なし — 転送中のみ
閲覧者イベント 生の IP アドレスを含む Docsbook の分析ストア。IP アドレスを返す API はない 該当なし
非公開ドキュメント用の OIDC クライアントシークレット Docsbook の Postgres はい — AES-GCM。プラットフォームシークレットから導出したキーを使用
非公開リポジトリのソースに接続する GitHub トークン Docsbook の Postgres はい — 同じ方式。API が返すのはトークンの存在有無のみ
独自のモデル API キー(BYOK) Docsbook の Postgres、およびそのキーで支払われるすべての呼び出しにおけるプロバイダー いいえ — 受け取った状態で保存され、API が返すすべてのワークスペースペイロードから除去
MCP Bearer トークン Docsbook の Postgres いいえ — 上記を参照
fetch_urlread_source、およびクローラーが取得するページ 指定したアドレスへ 該当なし

ドキュメントベンダーのセキュリティページで通常示される2つの主張を訂正します。

  • 「コンテンツがリポジトリから外部に出ることは決してない」は、ここでは真実ではありません。 Docsbook は、ページ本文の検索可能なコピーとそのベクトル埋め込みを保存し、それらの埋め込みの作成やチャットおよびエージェント呼び出しへの回答のために、ページ本文をモデルプロバイダーへ送信します。正しいのは、GitHub が引き続き信頼できる唯一の情報源であるため、支払いを停止しても、従量制の処理が停止するだけで Markdown が削除されることはないという点です。
  • 外部へのフェッチは、単に信頼されているのではなく、保護されています。 フェッチの前にスキームが確認され、ホスト名が解決され、解決されたアドレスがプライベートまたは予約済みの範囲にある場合は拒否されます。また、すべてのリダイレクト先でもチェックが再実行されるため、公開 URL から内部 URL へ転送することはできません。robots.txt は遵守され、レスポンスには上限が設定されます。スキルフェッチャーはさらに限定されており、カタログ自体のホストとパスプレフィックスからのみフェッチするため、任意の URL プロキシとして利用することはできません。

Webhookとチャットフックは同じものではありません#

外向きWebhookの配信には署名が付与されます。署名は、X-Docsbook-Signature-256: sha256=<hex>内でX-Docsbook-Eventとともに送信された正確なバイト列に対するHMAC-SHA256です。DiscordまたはSlackのIncoming Webhook URLは、署名する前に各プラットフォーム向けに変換されるため、署名は常にエンドポイントが実際に受信する内容を対象とします。シークレットは登録時に設定され、16文字以上であり、その後プレーンテキストで返されることはありません。配信の試行は15秒でタイムアウトし、レスポンスは切り詰められて保存されます。

チャットフックには署名がありません。ドキュメントアシスタントのpreフック、postフック、ストリーミングフックは、5秒のタイムアウトでHMACヘッダーのない単純なJSON POSTです。Webhookの検証コードをそこで再利用して、何かが検証済みだと考えないでください。preフックはinject_contextを返すこともでき、そのテキストはアシスタントのプロンプトに入ります。つまり、チャットフックの接続先にしたエンドポイントがアシスタントの発言内容に影響を与える可能性があるため、信頼できるインフラストラクチャとして扱い、別の手段で認証し、自分が管理していないURLを接続先に指定しないでください。

これが正しい方法である理由(根拠)#

Docsbookが従うルール それを利用するものにとって重要な理由 出典
独自の不透明なトークンを発行し、他所で発行されたトークンは決して受け入れたり転送したりしない 「MCPサーバーは、MCPサーバー向けに明示的に発行されていないトークンを受け入れてはならない MCPセキュリティのベストプラクティス、トークンパススルー
認証されていない呼び出しには、保護リソースメタデータを示す WWW-Authenticate を付けて応答する 「MCPサーバーはOAuth 2.0保護リソースメタデータ(RFC9728)を実装しなければならない MCP認可
トークンエンドポイントでPKCEの S256 ベリファイアを検証し、code_challenge_methods_supported を公開する code_challenge_methods_supported が存在しない場合、認可サーバーはPKCEをサポートしておらず、MCPクライアントは処理の続行を拒否しなければならない 認可に関するセキュリティ上の考慮事項
クライアントを記憶しておくのではなく、認可のたびに同意画面を表示する 混乱した代理人攻撃は、スキップされた同意画面を経由して成立する。「Cookieが存在するため、同意をスキップ」 MCPセキュリティのベストプラクティス、混乱した代理人
クライアントが要求するスコープのカタログではなく、人が選択した2つのスコープに限定する 不適切なスコープ設計は、「影響範囲の拡大:盗まれた広範なトークンによって、無関係なツールやリソースへのアクセスが可能になる」ことを意味する MCPセキュリティのベストプラクティス、スコープの最小化
解決されたプライベートIPまたは予約済みIPを拒否し、リダイレクトのたびに再確認する クライアントとサーバーは「リンクローカル:169.254.0.0/16(クラウドメタデータエンドポイントを含む)」をブロックすべきである MCPセキュリティのベストプラクティス、SSRF
各ツールの対象を、提供されたIDではなく呼び出し元の所有権に紐付ける サーバーは「状態ハンドルを所持していることを認証として扱ってはならず」、検証済みの主体に状態を紐付けるべきである MCPセキュリティのベストプラクティス、状態ハイジャック
エージェントが読み込むスキル(当社のものを含む)を審査する 「外部URLからデータを取得するスキルは、取得したコンテンツに悪意のある命令が含まれる可能性があるため、特にリスクが高い」 Anthropic、エージェントスキル

もう1つ、私たちではなくクライアントに関係する点があります。MCP仕様は、クライアントに対して「信頼できるサーバーから提供されたものでない限り、ツールのアノテーションを信頼できないものとして扱う」こと、また「ツール呼び出しを拒否できる人間をループ内に置く」ことを求めています(MCPツール)。読み書き可能なDocsbookトークンは、まさにその人間による確認に値するケースです。

現在、Docsbook が MCP 仕様を満たしていない点#

これらは 2026-07-28 リビジョンに照らして評価したものです。いずれも仕様への異議ではなく、Docsbook における未対応事項です。

要件 Docsbook の動作 レビュー担当者にとっての重大度
「認可サーバーは、事前登録された値に対して正確なリダイレクト URI を必ず検証しなければならない」 redirect_uriスキームを許可リスト(HTTPS、ループバック、エディターのディープリンク用スキームの固定リスト)に対して検証しますが、クライアントが永続化されないため、交換時に登録済みの値との比較は行いません 最初に指摘すべき事項です。リダイレクト先を表示しない同意画面と組み合わさると、細工されたリンクをクリックしたユーザーが、別の場所に到達する権限付与を承認してしまう可能性があります。画面では毎回、意図的なクリックが必要であり、スキップはできません。
認可サーバーは「有効期限の短いアクセストークンを発行すべき」であり、パブリッククライアント向けのリフレッシュトークンをローテーションする 有効期限もリフレッシュトークンもないトークンを発行します 漏洩したトークンは、誰かが取り消すまで有効です
サーバーはツール呼び出しをレート制限しなければならない レート制限を行いません。プロジェクトの残高だけが唯一の制限であり、従量課金されないディスカバリー呼び出しには制限がまったくありません リクエスト数ではなく、金額でリスクを予算化してください
認可コードでの PKCE クライアントがメソッド S256 のチャレンジを提供した場合に検証されます。提供しないクライアントでもフローを完了できます 主要な MCP クライアントはすべて PKCE を送信しますが、サーバーは現在、それを必須としていません
プロトコルリビジョン サーバーは、ステートレス HTTP トランスポート上で、現在の SDK がサポートする初期化ベースのリビジョン(最新は 2025-11-25)を使用します 2026-07-28 専用のクライアントは接続できません
WWW-Authenticate チャレンジ内の scope とメタデータ内の scopes_supported どちらも公開されておらず、スコープは同意画面で選択されます クライアントは 2 つのスコープをプログラムで検出できません

Docsbookにまだないもの#

レビューで3週目ではなく1時間でDocsbookを候補から外せるよう、一覧にしています。

機能 ステータス
SOC 2 Type II 提供なし — 共有できるレポートはありません
データ処理契約 提供なし — 現時点で双方が署名したDPAはありません
契約上のSLA 提供なし
Docsbookへのサインイン用SAML SSO 提供なし — アカウントへのサインインにはGitHub OAuthを使用します
チームアカウント、ロール、RBAC 提供なし — アクセスはアカウント単位であり、アカウントにサインインできる人は、そのアカウントで可能なすべての操作を実行できます
アカウントイベントの監査ログ 提供なし — サインイン、トークン発行、プラン変更はイベントログとして公開されません。MCPツールの呼び出しはプロジェクトごとに完全に記録され、コンテンツのコミットは変更履歴から確認できます
ペネトレーションテストレポート 提供なし

2行目と4行目の機能と混同されることが多い機能が1つあります。プライベートワークスペースは、すべてのプランで、パスワードまたは update_access を通じた独自のOIDCプロバイダーによってゲートできます。これはドキュメントサイトの閲覧者向けのシングルサインオンです。Docsbookアカウントのメンバー向けのシングルサインオンではなく、MCPアクセスも付与されません。

組織で特定の書類 — GDPR DPA、BAA、記入済みの質問票など — が必要な場合は、support@docsbook.io に連絡して何が用意されているか尋ねてください。現時点では、存在しないという回答になる可能性も十分にあります。

制限事項と未解決の問題#

  • 要確認:ホスティングリージョン。 このページでは、データベースや分析ストアのリージョンを意図的に記載していません。どちらもマネージドサービスであり、そのリージョンは、Docsbookの動作から読者が確認できるものではなく、デプロイ設定によって決まるためです。また、このページの以前のバージョンでは、出典のないリージョンが記載されていました。データレジデンシーがレビューの一部である場合は、現在の回答を書面でサポートに問い合わせてください。
  • 仮名化された訪問者IDは、匿名化ではなく仮名化です。 これは、64ビットに切り詰めたIPアドレスのソルト付きハッシュです。ソルトと生のイベントストアの両方を持っている人は、そこから再導出できます。保証されているのは、ソルトがデータ内に存在せず、どのAPIもIPアドレスを返さないことです。これが規制当局の要件を満たすかどうかは、規制当局に確認してください。
  • 読み書きトークンは、完全な管理者資格情報です。 「ページの編集は許可するが設定の変更は許可しない」や、「分析は読めるがチャットの記録は読めない」といった権限を付与する方法はありません。スコープには2つの段階しかありません。
  • 読み取り専用スコープの適用は不完全です。 8つのツールはこれをチェックしますが、設定、Webhook、目標、翻訳の書き込みツールはチェックしません。また、それらのツールの説明には読み書きトークンが必要だと記載されているものがありますが、実際には何もチェックされません。これが解消されるまでは、信頼できる境界はスコープではなくアカウント所有権です。そのため、アカウント単位で分離し、ツールの説明ではなく、上記の適用対象リストを確認してください。
  • ここに記載されている内容は、第三者による独立した検証を受けていません。 上記のすべての記述は、Docsbookの動作で確認できます。読み取り専用トークンを発行して書き込みツールが拒否することを確認したり、自分が所有していないプロジェクトを接続して解決されないことを確認したりできます。しかし、第三者による監査は行われていません。このページは、テスト可能な仕様として扱い、認証として扱わないでください。
  • 提供状況と料金については、料金ページをご覧ください。 ドキュメントに記載した料金は気付かないうちに古くなるため、ここでは具体的な金額を記載していません。

Updated

このページは役に立ちましたか?