AI開発自動化日記 #2
Forgejo APIの「1ファイル1コミットの罠」を突破!Claude MCP × Git CLIでアトミックにソース修正・PR作成する実践フロー
前回のIssue自動起票に続き、今回はClaude DesktopからGit CLIを活用してForgejoのソースコードを安全かつ綺麗に修正・PR化する仕組みを解説します。
1. はじめに:Issue起票のその先へ
前回の記事では、Claude Desktopとのディスカッションから、自社サーバーでセルフホスティングしている Forgejo(Gitリポジトリ管理ツール)へ直接Issueを自動起票するMCP環境の構築について解説しました。
タスクの作成が自動化できたら、次にやりたくなるのは「Claudeとの会話を通して、そのままForgejo上のソースコードを修正し、プルリクエスト(PR)まで作成させること」です。
しかし、API経由で直接リポジトリのファイルを書き換えようとすると、Gitの履歴や運用の安全性の観点で大きな問題に直面します。今回はこの問題をGit CLIとMCP(Model Context Protocol)の組み合わせでスマートに解決する方法を紹介します。
2. なぜ Forgejo REST API でコードを直接編集してはいけないのか?
ForgejoやGitea、GitHubが用意しているコンテンツ編集APIは、画面上から1つのファイルをサクッと編集するためのAPIです。これをそのままAIによる複数ファイルの修正に流用しようとすると、構造的な問題が発生します。
- 1ファイル=1コミット化によるGit履歴の汚染: 複数ファイルを修正すると、微小なコミットが大量に連射され、レビューや履歴追跡が困難になります。
- アトミック性(不可分性)の欠如: 途中のファイル更新でエラーが発生すると「前半の変更だけが反映され、後半が未反映」という、不整合で壊れたコードが取り残されます。
- CI(テスト)の無駄な連鎖: 1ファイル更新されるたびにテストが無駄に起動し、サーバーに無用な負荷がかかります。
ITやデータベースの世界で使われる言葉で、「これ以上分割できない単位で、すべて成功するか、さもなくば全く実行されないかのどちらか(All or Nothing)」という性質のことです。
Gitの文脈で言えば、関連する複数のファイル修正を1つのコミットにまとめることで、「3ファイル中2ファイルだけ中途半端に更新されてプログラムがバグる」という事故を物理的に防ぐことを「アトミック性を保つ」と言います。
3. 解決策:Claudeに「ターミナル実行権限」を付与する
この問題を解消する鍵が、「コードの編集・コミット・Pushは Git CLI(コマンド)で行い、Forgejo操作(PR作成)のみを API / MCP で行う」という役割分担です。
標準のファイル操作MCP(server-filesystem等)はファイルの読み書きしかできず、Gitコマンドを叩くことができません。そこで、Claudeにターミナルでのコマンド実行権限を与えるサードパーティ製MCP(bash-mcp など)を導入します。
ファイル操作専用のMCPだけでは、コードの修正はできてもGitのコミットやプッシュができません。今回の「一括でアトミックな1コミットを作成してPR化する」という仕組みを実現するためには、必ずターミナルコマンド(Git CLI)を直接叩ける設定(server-bash や bash-mcp 等)も必要になります。
AIにローカルPCのコマンド実行権限を与えることは、意図せぬファイル削除や破壊的コマンドが実行されるリスクを伴います。本番環境のPCではなく、開発専用の仮想環境や、最悪壊れてもやり直せるリポジトリ環境内でのみ自己責任でご利用ください。
│
▼ 1. Bash MCP を経由してローカルのターミナルにアクセス
【ローカルワークスペース】
│
▼ 2. Claude が対象ファイルをターミナル経由で修正
│
▼ 3. 続けて Git CLI を実行(`git checkout -b` ➔ `git add .` ➔ `git commit`)
【アトミックな1コミット作成】全修正を1つの綺麗なコミットに集約して Push
│
▼ 4. Forgejo MCP ツールを呼んで PR を起票
【Forgejo】「Closes #12」リンク付きのPRが安全に起票される!
4. Bash MCPの設定手順(Mac / Windows対応)
ステップ 1:対象リポジトリをローカルに clone
あらかじめ Mac や Windows のローカル環境に Forgejo のリポジトリを git clone しておきます。
ステップ 2:claude_desktop_config.json の編集とアプリの再起動
Claude Desktop の設定画面(Settings ➔ Developer ➔ Edit Config)を開き、コミュニティ版のターミナル実行MCPである bash-mcp を追加します。
・Mac:
~/Library/Application Support/Claude/claude_desktop_config.json・Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"forgejo-issue": {
"command": "npx",
"args": ["-y", "@ric_/forgejo-mcp"],
"env": {
"FORGEJO_URL": "https://your-forgejo-domain.com",
"FORGEJO_TOKEN": "発行したアクセストークン"
}
},
"local-bash": {
"command": "npx",
"args": [
"-y",
"bash-mcp"
]
}
}
}
{
"mcpServers": {
"forgejo-issue": {
"command": "npx.cmd",
"args": ["-y", "@ric_/forgejo-mcp"],
"env": {
"FORGEJO_URL": "https://your-forgejo-domain.com",
"FORGEJO_TOKEN": "発行したアクセストークン"
}
},
"local-bash": {
"command": "npx.cmd",
"args": [
"-y",
"bash-mcp"
]
}
}
}
5. 実際の対話フロー:指示からPR作成まで
設定完了後、Claude Desktop に以下のように指示するだけで、ローカルでの修正からGit commit、Push、PR起票までが一気通貫で完了します。
1.
ai/issue-12 ブランチを作成2. 対象ファイルのコードを修正完了
3. 1つのコミットにまとめてPushし、PRを起票(Closes #12)
URL: https://git.example.com/org/repo/pulls/15」

コメント