ブラウザ版・スマホ版のClaudeからGitHubを操作したい——読み取りだけなら公式のGitHub MCPをOAuthで接続すればすぐに使えます。しかし書き込みは通りません。
この検証では、その制約の正体を特定し、自作のCloudflare Workers版MCPサーバー+Fine-grained PATという構成で回避しました。結果として「ブランチ作成 → ファイルコミット → PR作成」のフルサイクルをclaude.aiから一気通貫で実行できることを確認しています。
この検証の概要
検証日 | 2026年4月15日(1日で完結) |
|---|---|
対象 | GitHub Remote MCP Server(公式 + 自作Cloudflare Workers版) |
バージョン | github/github-mcp-server(GA: 2025年9月4日)/自作版 初版 2026/04/15 |
やりたかったこと | claude.ai(ブラウザ・スマホ)からGitHubのIssue作成・ブランチpush・PR作成を行う |
結果 | 書き込みフルサイクル成功。ブランチ作成〜PR作成の一連が約30秒 |
運用コスト | Cloudflare Workers 無料枠内(10万req/日):$0/GitHub Free:$0 |
判定 | 条件付きで導入可(自作Worker + Fine-grained PAT構成) |
結論:OAuthで書き込めないのは仕様ではなくアプリ側の設計
この検証で最も価値のある発見は、制約の正確な把握です。
claude.aiのOAuth連携は書き込みスコープを持っていません。これはclaude.ai側の実装制約です。
ここは誤解されやすい部分です。「書き込み権限を与えると他ツールに伝播するリスクがある」という説明はOAuthの仕様上正確ではありません。正確には「claude.aiのアプリが書き込みスコープを要求しない設計になっている」という話です。
さらに、claude.aiのカスタムコネクタUIはOAuth前提で、PATをAuthorizationヘッダーで渡す欄がありません。つまりUI上で直接PAT接続に切り替えることもできません。
制約の場所が分かれば、回避方法も決まります。今回は「Worker側でPATに変換する」という構成をとりました。
構成:OAuthとPATを橋渡しする
[GitHub API] ← PAT認証 ← [Cloudflare Worker(自作MCPサーバー)]
↑ OAuth(Client ID/Secret)
[claude.ai カスタムコネクタ]- claude.aiはWorkerにOAuthで接続する(Client ID / Secretで認証)
- WorkerはGitHub APIをPATで呼び出す
「OAuthで書き込めない」問題を、Worker側でPATに変換することで回避する構成です。claude.aiから見ればOAuth接続、GitHubから見ればPAT認証になります。
Fine-grained PATに必要な権限
ここでも一度つまずいています。初回のPATはFine-grained権限が不十分で create_branch が403エラーになりました。
Permission | 設定 |
|---|---|
Contents | Read and write |
Issues | Read and write |
Pull requests | Read and write |
Metadata | Read(自動付与) |
Read only のままだと create_branch や create_pull_request が403になります。
Repository accessは対象リポジトリのみに絞ります(All repositoriesは避ける)。Fine-grained PATはリポジトリ単位・権限単位で絞れるため、アカウント全体に紐づくOAuthよりセキュリティを高くできます。
GitHub APIは User-Agent がないと403を返す
実装で最初に踏んだ落とし穴です。
GitHub APIはリクエストに User-Agent ヘッダーが必須で、未設定の場合は403エラーになります。
headers: {
'Authorization': `token ${env.GITHUB_PAT}`,
'User-Agent': 'github-remote-mcp-worker/1.0', // ← これが必須
'Content-Type': 'application/json',
}403という同じステータスコードが、権限不足とヘッダー不足という異なる原因で返ってきます。切り分けの順番を知らないと時間を取られます。
動作確認:フルサイクルの実績
ツール単位の検証結果は次のとおりです。
ツール名 | 概要 | 結果 |
|---|---|---|
| 引数をそのまま返すデバッグ用 | 正常動作(timestampカスタム確認) |
| Issue一覧取得 | 正常動作(#1〜#76 取得確認) |
| Issue作成 | 正常動作(Issue #77 作成確認) |
| 読み取り系 | 正常動作 |
| フィーチャーブランチ作成 | PAT更新後に動作確認済み |
| ファイルコミット | PAT更新後に動作確認済み |
| PR作成 | PAT更新後に動作確認済み |
フルサイクルは ① create_branch → ② create_or_update_file → ③ create_pull_request の順で実行し、PR作成まで完全に成功しています。
項目 | 測定結果 |
|---|---|
読み取り成功率 | 100%(OAuthで安定動作) |
書き込み成功率(PAT権限付与後) | 100% |
ブランチ作成〜PR作成(一連) | 約30秒(3ツール連続実行の合計) |
OAuthとPAT、どちらを使うか
項目 | OAuth(公式Remote) | Fine-grained PAT(自作Worker) |
|---|---|---|
設定の手軽さ | ◎ 数クリックで完了 | △ Worker + PAT設定が必要 |
読み取り | ✅ | ✅ |
書き込み | ❌ claude.aiでは不可 | ✅ 全ツール動作確認済み |
スマホ対応 | ✅ 読み取りのみ | ✅ 書き込みも可(Worker経由) |
セキュリティ | △ アカウント全体に紐づく | ◎ リポジトリ・権限単位で制御可 |
カスタマイズ性 | ✗ | ◎ ツール追加が自由 |
読み取りだけで十分ならOAuthが最も手軽です。書き込みが必要な場合のみ、自作Worker + Fine-grained PATの構成を検討する形になります。
導入コストの内訳
項目 | 工数 |
|---|---|
OAuth接続(読み取り) | 約15分 |
Fine-grained PAT発行 | 約10分 |
Cloudflare Workersデプロイ(フォーク〜deploy + デバッグ込み) | 約2〜3時間 |
PATスコープ調整(権限不足エラー確認後の再発行) | 約15分 |
PAT発行からclaude.ai接続完了までの目安は約3〜4時間(初回)です。
トラブルシューティング早見表
症状 | 原因 | 対処 |
|---|---|---|
| OAuthスコープ不足(claude.aiの制約) | 自作Worker + Fine-grained PATに切り替える |
| PATのFine-grained権限不足 | Contents / Pull requests を |
GitHub API |
| fetchにUser-Agentを追加して |
新しいツールが認識されない | MCPツール一覧のキャッシュ | MCP接続をオフ→オン、または新しいチャットを開く |
| tools/callレスポンス前にWorkerが終了 | Streamable HTTP statelessモードへの移行を検討 |
運用上の注意点
- MCPサーバーのツール一覧はセッション開始時に読み込まれます。新ツール追加後は新チャット、またはMCP再接続が必要です
- Cloudflare WorkersはPagesと異なりGitHubリポジトリと直接紐付けできません。
wrangler deployの手動実行が基本になります - PATはCloudflare Workersのシークレットで管理し、コードにハードコードしない
- 公開エンドポイントに認証なしでアクセスできる状態のため、APIキー認証の追加が望ましい(この検証時点では未対応)
- 公式リポジトリの最新を取り込むには
git remote add upstream→git fetch upstream && git merge upstream/main
よくある質問
claude.aiからGitHubに書き込めないのはなぜですか?
claude.aiのOAuth連携が書き込みスコープを要求しない設計になっているためです。OAuthの仕様上の制約ではなく、アプリ側の実装によるものです。
PATをUIから設定できませんか?
できません。claude.aiのカスタムコネクタUIはOAuth前提で、PATをAuthorizationヘッダーで渡す欄がありません。Authorization: Bearer [JWT] を直接入力できるUIも現状存在しません。
GitHub APIで403が出ます
権限不足と User-Agent ヘッダー未設定の2つの可能性があります。まずリクエストにUser-Agentが含まれているか確認し、次にFine-grained PATのContents / Pull requestsが Read and write になっているか確認してください。
費用はかかりますか?
この構成では$0です。Cloudflare Workersの無料枠(10万req/日)とGitHub Freeプランの範囲で運用できます。
まとめ
- claude.aiのOAuth連携は書き込みスコープを持たない。これはclaude.ai側の実装制約
- 回避策は自作Cloudflare Workers版MCPサーバーで、OAuth接続をPAT認証に変換する構成
- 「ブランチ作成 → ファイルコミット → PR作成」のフルサイクルをclaude.aiから約30秒で実行できることを確認
- Fine-grained PATはContents / Issues / Pull requests を Read and write に。
Read onlyだと403 - GitHub APIは
User-Agentヘッダー必須。未設定でも403が返るため切り分けに注意 - 読み取りだけならOAuthで十分。書き込みが必要な場合のみWorker構成を検討(初回セットアップ約3〜4時間)
AIエージェントに実際の作業をさせようとすると、必ず認証と権限の設計に突き当たります。どこで詰まるかを先に把握しておくと、構成の選択が速くなります。
株式会社AI棒では、こうしたAI活用の検証を日々行い、企業のAIエージェント導入を支援しています。ご相談はお問い合わせフォームから、継続的な伴走支援についてはAI参謀をご覧ください。
