GitHub MCPのRead-only modeを使う
GitHub MCPには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のバグを回避してくれるラッパーとして使える







