GitHub MCPのRead-only modeを使う

GitHub MCPのRead-only modeを使う

Github MCPのRead-only modeがどのようなセキュリティ機能なのか、実装の仕組みも含めて調査してみました。書き込み権限を与えずにMCPを活用したい場合の選択肢として、その仕組みを紹介します。
2026.07.27

GitHub MCPにはRead-only modeというのがある

https://github.com/github/github-mcp-server#read-only-mode

どのようなものか気になったので調べてみた

※本記事の内容は筆者が確認した時点(2026年7月)のものです
GitHub MCP はOSSで活発に更新されているため、最新の実装は
リポジトリを確認してください

GitHub MCPのドキュメント

Server Configuration Guideの記載を確認すると以下の文がある

Note: read-only mode acts as a strict security filter that takes precedence over any other configuration, by disabling write tools even when explicitly requested.
訳:読み取り専用モードは、明示的に書き込みが要求された場合でも書き込みツールを無効にすることで、他のいかなる設定よりも優先される厳格なセキュリティフィルターとして機能します。

セキュリティ意識の高い開発者に用意されたAIが勝手に書き込みを行わないモードだそう
業務上書き込み権限を与えたくないが、MCP使いたいならば有用そうな記載

前提:MCP(Model Context Protocol)の仕組み

基本的にAIがMCPサーバーとのやり取りする際にはJSON-RPC 2.0を利用する
この仕様はAnthropic社がAIと外部データ・ツールを繋ぐ共通規格として提唱したものらしい

本題ではないので詳しくは割愛するが、GitHub MCPも例に漏れずこの規格に則って実装されている

動かしてみる

GitHub MCPはオープンソースなのでローカルでビルドして実行して動きを見てみる

MCPサーバーを起動し初期化処理を行なった後以下のツール一覧取得リクエストを送る

// 1.イニシャライズ
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2025-06-18",
    "capabilities": {},
    "clientInfo": { "name": "cli", "version": "0" }
  }
}

// 2.イニシャライズ完了通知
{
  "jsonrpc":"2.0",
  "method":"notifications/initialized"
}

// 3.ツール一覧の取得
{
  "jsonrpc":"2.0",
  "id":2,
  "method":"tools/list"
}

セッション開始時にクライアント側がtools/listのレスポンス内容をAIが実行可能なツールの一覧として保持する

Claude Code CLIなどで/mcp -> 該当のMCP -> View toolsを見ると出てくるツール一覧の正体になる

Read-only modeでは書き込み可能なツールを渡さないのでAIによる書き込みはできない、というのがRead-onlyであるということらしい

Read-only modeで書き込み系のリクエストを送ってみる

Read-only modeで起動したMCPサーバーに書き込み用のツールを使ってリクエストを送ってみたらどうなるのか検証してみた

書き込み系ツールにはcreate_repositoryというツールがあったのでリクエストを送る(※Read-only modeではツール一覧には出ない)

tools/callを使ってリクエストを送信

{
  "jsonrpc": "2.0",
  "id": 3,
  "method": "tools/call",
  "params": {
    "name": "create_repository",
    "arguments": { "name": "test-repo" }
  }
}

レスポンス:

{
  "jsonrpc": "2.0",
  "id": 3,
  "error": { "code": -32602, "message": "unknown tool \"create_repository\"" }
}

そんなツールは存在しないとエラーが返ってきた

エラーメッセージを見るに拒否ではなく存在しないと言っている

以上のことからツール一覧に存在しないツールは呼び出せないようになっていることが分かる

実装を見る

ソースコードからどのようにして読み取り専用ツールを決定しているのか確認してみた

どうやら定義されている各ツールにはReadOnlyHintというBool値のフィールドがありこのフラグが読み取り専用であるかを決める実装になっていた

※以下は github/github-mcp-server の main ブランチ(2026年07月時点)を元にした抜粋

// 各ツールが ReadOnlyHint を宣言 — pkg/github/repositories.go
func CreateRepository(t translations.TranslationHelperFunc) inventory.ServerTool {
    return NewTool(
        ToolsetMetadataRepos,
        mcp.Tool{
            Name: "create_repository",
            Annotations: &mcp.ToolAnnotations{
                Title:        t("TOOL_CREATE_REPOSITORY_USER_TITLE", "Create repository"),
                ReadOnlyHint: false, // ← 書き込みツール(読み取り専用ではない)
            },
            // ...
        },
        // ...
    )
}

// そのフラグを読む — pkg/inventory/server_tool.go
func (st *ServerTool) IsReadOnly() bool {
    return st.Tool.Annotations != nil && st.Tool.Annotations.ReadOnlyHint
}

// リードオンリー時、読み取り専用でないツールをフィルターで除外 — pkg/inventory/filters.go
func (r *Inventory) isToolEnabled(ctx context.Context, tool *ServerTool) bool {
    // ...
    if r.readOnly && !tool.IsReadOnly() { // ← ここでツールの有効性を判断しフィルタリング
        return false
    }
    // ...
}

出典: github/github-mcp-server(MIT License)
Copyright (c) GitHub, Inc.

上記のソースからわかったことはあくまでGitHub MCP上で正しく実装されていることが前提であるということ

何かの拍子に実装を間違えるとAIが書き込みツールを使うことができる懸念は払拭できないというのが感想

ローカルで扱う分には安全を確認したバージョンで運用すれば安全に使えそうではある

セキュリティの観点について詳しいわけではないのであくまで自分の意見ではあるが、PATとの併用が安全であると感じた

じゃあGitHub CLIでいいじゃんという話

PAT併用の前提でやるならばghコマンドでAIに使わせるのと変わらないじゃんと思ったがghにはバグがある

オーガナイゼーション配下でCIを設定しているプライベートリポジトリではfine-grained PATでgh pr view(デフォルト表示)を実行すると失敗する(issue#12597)
※2026年7月時点での確認

上記のバグはGraphQLクエリでCIのステータスを取得しようとしてしまいfine-grained PATに権限が無く失敗すると言った内容

回避策として、取得するJSONフィールドを指定し必要な情報に絞るか、gh apiコマンド(REST API)で実行すればエラーは起きないらしい

ただ、GitHub MCPのプルリクエスト取得ツールpull_request_readはREST APIを使うので、ghのようなGraphQL起因のエラーが起きない

gh pr viewコマンドでエラーが起きないようにCLAUDE.mdに回避策を行う指示を書くなどをせずともGitHub MCPであれば素直に動いた

GitHub MCPのpull_request_readを使えば勝手に回避策を取ってくれる

まとめ

  • PATと併用すれば安全そう
  • GitHub CLIのバグを回避してくれるラッパーとして使える

Claudeならクラスメソッドにお任せください

クラスメソッドは、Anthropic社とリセラー契約を締結しています。各種製品ガイドから、業種別の活用法、フェーズごとのお悩み解決などサービス支援ページにまとめております。まずはご覧いただき、お気軽にご相談ください。

サービス詳細を見る

この記事をシェアする

AI白書

関連記事