GitHub MCPサーバーにOAuth接続できないエラーの原因と対処
Claude CodeからGitHubのリモートMCPサーバーへOAuthで接続すると起きる「Incompatible auth server」エラーの原因と、実際に通る対処法をIssue #3433の経緯とあわせて扱います。
Claude Codeでclaude mcp add --transport http github https://api.githubcopilot.com/mcp/のようにGitHubのリモートMCPサーバーを追加し、/mcpからOAuthで認証しようとすると、「Incompatible auth server: does not support dynamic client registration」というエラーで接続が失敗する報告が続いています。2025年7月に登録されたGitHub Issue #3433として追跡されている既知の問題で、原因はGitHub側の認可サーバーがDynamic Client Registration(DCR)に対応していないことにあります。本記事では原因の切り分けと、Claude Code側のバージョンごとの対応状況を含めた実際に通る対処法を、GitHubのリモートMCPサーバーに絞って扱います。リモートMCPのOAuth認可フローの一般的な仕組みはリモートMCPのOAuth認証にまとめてあるので、あわせて参考にしてください。
GitHubのリモートMCPサーバーで何が起きるか
GitHubのリモートMCPサーバーとは、GitHubがホストするMCPエンドポイント(https://api.githubcopilot.com/mcp/)です。Issueやプルリクエストの操作を、Claude Codeから自然文の指示で呼び出せます。
問題が起きるのはOAuthで接続しようとしたときだけです。ヘッダーなしでclaude mcp add --transport http github https://api.githubcopilot.com/mcp/を実行し、/mcpパネルから認証を試みると、Claude Codeは次のエラーを返します。
Error: Incompatible auth server: does not support dynamic client registrationIssueの本文には、同じ設定がVS Code(GitHub Copilot拡張)では動作すると記載されています。原因はGitHub側の設定ミスではなく、Claude CodeのOAuthクライアントとGitHubの認可サーバーの組み合わせにあります。
Issueのコメントには、Anthropic APIを使う環境だけでなくAWS Bedrock経由でも同じエラーが起きるという報告があります。Claude Codeのバージョンでは、最初の報告があったv1.0.51から、2026年1月に報告が続いたv2.1.6・v2.1.7まで一貫して再現しており、特定のバージョンだけの不具合ではありません。Claude Code側はその後v2.1.30とv2.1.81でDCR非対応サーバーへの対応を追加しており、現在の状況は後述します。
エラーの原因はDCR非対応
Claude CodeがリモートMCPサーバーへOAuth接続するとき、まずクライアントIDを認可サーバーに登録する必要があります。この登録方式の1つがDynamic Client Registration(DCR)です。クライアントがPOST /registerを呼ぶだけで、認可サーバーが自動的にclient_idを発行してくれる仕組みです。
GitHubのMCP認可サーバーはこのDCRに対応していません。Issueのコメントでも「GitHubがDCRをサポートすれば解決するはず」と指摘されています。事前登録クレデンシャルもCIMDでの自動発見も使わない標準のOAuthサインインでは、Claude CodeがDCRでの自動登録を試み、認可サーバーから登録自体を拒否されてエラーになる、という構図です。
PATをヘッダーで渡せば接続できる
Claude Codeのドキュメントは、GitHubのリモートMCPサーバーの接続例としてOAuthではなく、GitHubのPersonal Access Token(PAT)をヘッダーで渡す方法を案内しています。GitHubの個人アクセストークン設定で、対象リポジトリへのアクセス権を持つfine-grainedトークンを発行し、次のように追加します。
claude mcp add --transport http github https://api.githubcopilot.com/mcp/ \
--header "Authorization: Bearer YOUR_GITHUB_PAT"claude mcp addはトークンの有効性を検証せずに設定を保存するため、追加コマンド自体が成功しても、実際の呼び出しで失敗することがあります。/mcpを実行し、githubがconnectedと表示されるかを確認します。認証情報が誤っている場合はfailedと表示され、失敗の詳細にGitHub側が返したHTTPステータス(401など)が含まれます。
Issueのコメントでも、Authorizationヘッダーにトークンを渡す同じ方法が回避策として共有され、複数の利用者が「これで動いた」と追認しています。最初に共有された回避策は--headerフラグではなくclaude mcp add-jsonでheadersオブジェクトを直接書く形でしたが、Claude Codeへ渡る設定内容は同じです。複数のヘッダーを同時に設定したい場合や、設定をJSONで一元管理したい場合はadd-jsonの形が向いています。トークンの発行手順や、有効にするtoolsetsの絞り方、read-onlyモードとの併用はGitHub MCPサーバーの使い方にまとめてあります。
マーケットプレイスのgithubプラグインを使う場合の落とし穴
/pluginからインストールできるマーケットプレイスのgithubプラグインは、内部の.mcp.jsonが環境変数GITHUB_PERSONAL_ACCESS_TOKENからトークンを読み込む設定になっています。ところが/mcpや/pluginのパネルには「Authenticate」ボタンが表示され、押すとOAuthサインインが始まり、claude mcp addを手動で行った場合と同じ「Incompatible auth server」エラーで失敗します。
対処は環境変数を設定することで、ボタンを押す必要はありません。Issueのコメントには、macOS・Windowsの両方でこの手順を踏んで解決した報告が複数あります。
export GITHUB_PERSONAL_ACCESS_TOKEN="YOUR_GITHUB_PAT"変数名はGITHUB_PERSONAL_ACCESS_TOKENである必要があります。GITHUB_PATやGITHUB_TOKENという名前で設定しても、プラグインの.mcp.jsonはその変数を参照しないため接続できません。設定後はターミナルを再起動してからClaude Codeを開き、/mcpでconnectedになっているかを確認します。
OAuthのまま接続したい場合の選択肢
Claude Codeはv2.1.30で、DCRに対応しない認可サーバー向けに、事前登録したクレデンシャルを--client-idと--client-secretで渡す機能を追加しました。同じ「Incompatible auth server」エラーが出ていたSlackのリモートMCPサーバーのIssue(#18009)は、このv2.1.30の機能追加と、続くv2.1.231のリダイレクトURIミスマッチ修正をもってクローズされています。実際にSlack接続が直った決め手は、Slackのプラグイン側がエンドポイントを切り替え、事前登録済みのクライアントIDを組み込んだことです。DCR前提の実装では動かないサービスに対し、あらかじめ発行済みのclient_idをプラグインに同梱する対応でした。なおv2.1.81では、DCRに代わる新しい仕組みであるClient ID Metadata Documents(CIMD)の自動発見にも対応していますが、これはSlackの解決とは別の変更です。
GitHubのhttps://api.githubcopilot.com/mcp/が、CIMDでの自動発見に対応しているか、独自の事前登録手順を案内しているかは、ドキュメントにもIssue #3433上にも記載がなく確認できていません。そのため、Claude Codeをv2.1.81以降に更新するだけでOAuth接続が直るとは言い切れません。手順自体はリモートMCPのOAuth認証で扱っています。
Issue #18009のコメントでは、この制約はGitHubやSlackに限らず、Google Workspace・HubSpot・Microsoft Graph・Salesforceのような業務SaaSの多くに共通するという指摘もあります。これらのサービスの大半は、開発者ポータルで事前登録したアプリのclient_id・client_secretを要求し、実行時にDCRでクライアントを自動登録する仕組みを持たないためです。GitHub Enterprise Serverなど、社内ホスト型の環境で同じエラーが起きるかどうかは、Issue #3433上では報告されておらず判断材料がありません。
ローカルサーバーとghコマンドという別の経路
OAuth接続にこだわらないなら、GitHubが配布するローカルのDockerサーバー(ghcr.io/github/github-mcp-server)に切り替える方法もあります。今回のDCR非対応問題は、Claude Codeがリモートのhttps://api.githubcopilot.com/mcp/へOAuthクライアントを登録しようとする経路で起きるもので、ローカルサーバーは認証の仕組み自体が異なります。設定手順はGitHub MCPサーバーの使い方にまとめてあります。
Issueのコメントでは、MCPサーバー自体を使わず、Bashツール経由でghコマンドを直接呼ばせる案も共有されています。事前にgh auth loginでサインインしておけば、Issueの作成やPRのレビューはMCPサーバーを介さずに実行できます。
Issue #3433が起票されてからの経緯
| 日付 | 出来事 |
|---|---|
| 2025-07-13 | 出来事Issue登録。Claude Code v1.0.51でGitHubのリモートMCPサーバーへのOAuth接続が「Incompatible auth server」エラーで失敗すると報告 |
| 2025-09-09 | 出来事GitHubがDCRに対応すれば解決するはず、という指摘 |
| 2025-10-21 | 出来事ドキュメントの同じ接続例がまだ動かない例として指摘される(現在の同セクションはPAT表記) |
| 2025-12-26 | 出来事PATをAuthorizationヘッダーで渡す回避策が共有される |
| 2026-01-08 | 出来事MCP認可仕様がDCRを非推奨化した動きへの言及 |
| 2026-01-13 | 出来事v2.1.6・v2.1.7を含む複数バージョンで同じエラーの再現報告が続く |
| 2026-02 | 出来事v2.1.30でDCR非対応サーバー向けに--client-id / --client-secretを追加 |
| 2026-03 | 出来事v2.1.81でCIMDの自動発見に対応 |
この経緯のあいだに、ドキュメントの同じGitHub接続例は、現在のPATをヘッダーで渡す形に置き換わっています。同じ時期に報告されたSlackのDCR非対応エラー(Issue #18009)は、v2.1.30の機能追加とプラグイン側の対応をもって解消済みとしてクローズされていますが、Issue #3433のコメント上には、GitHub側がDCRやCIMDに対応した、あるいはGitHubが組み込みクライアントIDを用意したという報告は見当たりません。
まとめ
GitHubのリモートMCPサーバー(https://api.githubcopilot.com/mcp/)へ事前登録クレデンシャルなしでOAuthサインインすると、GitHub側の認可サーバーがDynamic Client Registrationに対応していないため、「Incompatible auth server」エラーで失敗します。2025年7月に報告されIssue #3433としてv1.0.51〜2026年1月のv2.1.7まで再現が続いた問題で、ドキュメントが案内する対処は、Personal Access Tokenをヘッダーで渡す方法です。Claude Code自体はv2.1.30で事前登録クレデンシャルを渡す機能を追加し、v2.1.81ではCIMDの自動発見にも対応しました。ただしGitHubのhttps://api.githubcopilot.com/mcp/がCIMDに対応しているかは確認できておらず、更新するだけで標準のOAuthサインインが直るとは言い切れません。同種のエラーがSlackのリモートMCPサーバーで起きた際は、v2.1.30の機能追加とSlackのプラグイン側の組み込みクライアントIDへの切り替えで解消しています。マーケットプレイスのgithubプラグインを使っている場合は、環境変数GITHUB_PERSONAL_ACCESS_TOKENを設定し、「Authenticate」ボタンは使わないのが確実な対処です。GitHub以外のサーバーを含む接続不具合の切り分け手順はMCPサーバーに接続できないときの切り分け手順で扱っています。