Loading

ROUTE

ルートゼロの
アクティビティ

MCPの401 Unauthorized原因と確認順

2

MCPへ接続した瞬間に401 Unauthorizedが返ると、トークン・OAuth・ヘッダーのどこを疑うべきか迷いませんか? 結論は、まず「Authorizationヘッダーが毎回付いているか」を確認し、次にトークンの有効期限・発行先・OAuthの検出情報を順番に切り分けることです。

401の原因はまず4つに分ける

なぜ401になるのでしょうか? MCPの現行仕様では、401は「認証が必要」または「トークンが無効」のときに使われます。

  • Authorizationヘッダーが付いていない、またはBearer形式ではない
  • アクセストークンが期限切れ・無効になっている
  • 別のMCPサーバー向けに発行されたトークンを送っている
  • OAuthのProtected Resource Metadataや認可サーバー検出が正しく動いていない

この4点を上から確認すると、認証処理のどの層で止まっているかを絞り込みやすくなります。


Authorizationヘッダーを確認する

最初に見るのはヘッダーです。アクセストークンはURIのクエリ文字列ではなく、HTTPのAuthorizationヘッダーで送ります。

Authorization: Bearer <access-token>

MCPの仕様では、このAuthorizationヘッダーをクライアントからサーバーへの各HTTPリクエストに含める必要があります。最初だけ付けて、その後のリクエストで抜けていないかも確認してください。

状態 確認ポイント
Authorizationなし クライアント設定やプロキシでヘッダーが落ちていないか
Bearer以外 Authorization: Bearer <token> になっているか
クエリにtokenを付与 Authorizationヘッダーへ移す
最初だけ成功 後続HTTPリクエストにもヘッダーが付くか

トークンの有効期限と発行先を見る

ヘッダーが正しいのに401なら、次はトークン自体です。期限切れだけでなく、どのリソース向けに発行されたかも重要です。

MCPサーバーは、受け取ったアクセストークンが自分のリソース向けに発行されたものか検証します。別サービス向けのトークンを流用すると、形式が正しくても401になります。

  • expなどの有効期限を確認する
  • issuerが想定する認可サーバーか確認する
  • audienceまたはresourceが対象MCPサーバーを指しているか確認する
  • 上流API用のトークンをMCPサーバーへそのまま転送していないか確認する

用語解説:Audience / Resource
アクセストークンが「どのリソースで使うために発行されたか」を示す情報です。MCPサーバー側の想定と一致しないトークンは拒否されます。


カジュアル面談はこちら

WWW-AuthenticateからOAuthを追う

トークンを持っていない、または再認証が必要な場合は、401レスポンスのWWW-Authenticateを確認します。ここがOAuthフローの入口です。

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Bearer resource_metadata="https://mcp.example.com/.well-known/oauth-protected-resource"

resource_metadataが返る場合、クライアントはProtected Resource Metadataを取得し、そこから利用すべき認可サーバーを特定します。

curl -i https://mcp.example.com/.well-known/oauth-protected-resource

401は返るのにWWW-AuthenticateやProtected Resource Metadataが欠けている場合は、サーバー側のOAuth公開設定も確認対象です。

401と403を混同しない

認証できない401と、権限不足の403は切り分けます。答えが変わるためです。

HTTP 意味 まず確認するもの
401 認証が必要、またはトークンが無効 Bearerヘッダー、期限、発行先、OAuth検出
403 認証済みだが権限が不足 scopeやアクセス許可

401なのにscopeだけを変更し続けると原因から外れることがあります。まずトークンが有効に認証されているかを先に確認しましょう。

切り分けはこの順番で進める

  1. 401レスポンスのWWW-Authenticateを確認する
  2. Authorization: Bearer <token> が各HTTPリクエストに付いているか確認する
  3. トークンの期限切れ・無効化を確認する
  4. issuerと対象resource / audienceが正しいか確認する
  5. Protected Resource Metadataから認可サーバーを正しく検出できるか確認する
  6. 401ではなく403ならscope・権限側へ切り替える

ここまで確認すれば、「トークンを送れていない」のか「送ったトークンが拒否されている」のか「OAuth検出が壊れている」のかを分離できます。

(MCPサーバー全体の役割や接続の仕組みについては『MCPサーバーとは?仕組みと使い方』をご参照ください)

よくある質問

APIキーを付ければMCPの401は直りますか?

必ずではありません。MCPの標準的なHTTP認証はOAuth 2.1のBearerアクセストークンを前提とします。独自APIキー対応はサーバー実装ごとの仕様なので、そのMCPサーバーの認証方式を確認してください。

トークンがあるのに401になるのはなぜですか?

期限切れ、署名検証失敗、想定外のissuer、対象resource / audienceの不一致などが考えられます。トークンが存在することと、そのMCPサーバーで有効であることは別です。

401でscopeが表示された場合はどうしますか?

WWW-Authenticateにscopeが含まれる場合は、その情報をクライアント側の認可要求に反映します。ただし、まず有効な認証フローが成立していることを確認してください。

まとめ

MCPの401 Unauthorizedは、まずBearerヘッダー、次にトークンの有効性と発行先、最後にOAuthの検出情報を見ると整理しやすくなります。

まず手元の401レスポンスを開き、WWW-AuthenticateとAuthorizationヘッダーの2点から確認してみてください。そこが分かれば、次に直す場所が見えやすくなります。

RANKINGranking-icon

すべてを開示している会社です

ポジティブな面もネガティブな面も、包み隠さず誠実にお答えします。
気になることがあれば、面談の際にすべてオープンにお話します。