MCP Git Tools について
MCP Git Toolsは、MCPクライアントにリポジトリ操作を提供するRustライブラリ兼スタンドアロンMCPサーバーです。Gitの状態や履歴、リモート同期、worktree管理に対応します。
主な機能
- 01リポジトリの状態とブランチ一覧
- 02条件指定によるコミット履歴
- 03ステージ、コミット、リセット、差分表示
- 04リモートへのプルとプッシュ
- 05worktreeの一覧と管理
活用シーン
- 01リポジトリの状態と履歴の確認
- 02MCPクライアント経由でのステージとコミット
- 03リモートリポジトリとの同期
- 04Git worktreeの作成や整理
MCP 対応
標準入出力でMCPサーバーとして動作し、MCPクライアントにGit操作ツールを提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MCP Git ツール
Model Context Protocol(MCP)向けの Git ツール実装です。
特長
このライブラリは、Model Context Protocol を通じて呼び出せる Git 操作を提供します。
git_status- リポジトリの状態を取得しますgit_branches- ブランチ情報を一覧表示しますgit_log- 柔軟なフィルターオプション(日時、作成者、ブランチ、件数)を指定してコミット履歴を取得しますgit_commit- 新しいコミットを作成しますgit_pull- リモートから変更をプルしますgit_push- リモートに変更をプッシュしますgit_diff- ファイルの差分を表示しますgit_add- ファイルの内容をステージングエリアに追加しますgit_reset- ステージングエリアまたは作業ツリーを指定した状態にリセットしますgit_worktree_list- すべてのワークツリーを一覧表示しますgit_worktree_add- 新しいワークツリーを作成しますgit_worktree_remove- ワークツリーを削除しますgit_worktree_prune- 期限切れのワークツリーファイルを整理します
インストール
# Clone the repository
git clone https://gitcode.com/lileeei/mcp-git-tools.git
# Navigate to the directory
cd mcp-git-tools
# Build
cargo build --release
使い方
スタンドアロンサーバーとして実行する
cargo run --release --bin mcp-git-server
これにより、標準入力/出力を通じてクライアントと通信する MCP サーバーが起動します。
MCP Inspector でテストする
- サーバーをビルドします。
cargo build --release
- サーバーを起動します。
./target/release/mcp-git-server
- MCP Inspector を使用してツールをテストします。
- MCP Inspector をダウンロードします:https://github.com/modelcontextprotocol/inspector
- 「Add a server」をクリックします
/path/to/mcp-git-server/target/release/mcp-git-serverを入力します- 「Add」をクリックします
- Inspector のインターフェースを使用して各ツールをテストします
アーキテクチャ
このプロジェクトでは、クリーンなアーキテクチャを採用した最新の RMCP SDK(v0.14.0)を使用しています。
コアコンポーネント
GitToolsHandler
- すべての Git 操作を担う中心的なハンドラー構造体です
- RMCP SDK の
ServerHandlerトレイトを実装します - 各 Git 操作用のメソッドを含みます
ServerHandler の実装
get_info()- サーバーのメタデータと機能を提供しますlist_tools()- 利用可能なすべてのツールとそのスキーマを一覧表示しますcall_tool()- ツール呼び出しを適切なハンドラーメソッドに振り分けます
ツールの実装パターン
各ツールは GitToolsHandler のメソッドとして実装されています。
impl GitToolsHandler {
#[tool(description = "Get the status of a git repository")]
pub async fn git_status(
&self,
repo_path: String,
) -> Result<CallToolResult> {
// Implementation
}
}
パラメーターの処理
すべてのツールパラメーターでは、スキーマを自動生成するために derive マクロを使用します。
#[derive(serde::Deserialize, schemars::JsonSchema)]
struct GitStatusParams {
repo_path: String,
}
これにより、次のことが可能になります。
- JSON スキーマの自動生成
- 型安全なパラメーター解析
- シリアライズ/デシリアライズ用のコードを手動で記述する必要がありません
トランスポート
標準入力/出力による通信には、RMCP の stdio() トランスポートを使用します。
ツールの詳細
git_status
リポジトリの状態を取得します。
パラメーター:
repo_path- Git リポジトリへのパス
戻り値:
{
"status": ["M file1.txt", "?? file2.txt"],
"is_clean": false
}
git_branches
すべてのブランチを一覧表示します。
パラメーター:
repo_path- Git リポジトリへのパス
戻り値:
{
"branches": ["* main", "develop", "feature/new-feature"],
"current": "main"
}
git_log
柔軟なフィルターオプションを指定してコミット履歴を取得します。
パラメーター:
repo_path- Git リポジトリへのパスmax_count- (任意)返すコミットの最大数branch- (任意)ブランチ名since- (任意)開始日(例:「2023-01-01」、「1 week ago」、「yesterday」)until- (任意)終了日(例:「2023-01-31」、「today」)author- (任意)特定の作成者でフィルターします(名前またはメールアドレスに一致)
戻り値:
{
"commits": [
{
"hash": "abcd1234",
"author": "User Name",
"author_date": "Mon Aug 1 10:00:00 2023 +0800",
"message_title": "Initial commit"
}
]
}
例:
- 直近の 10 件のコミットを取得します:
{"repo_path": ".", "max_count": 10} - 先週のコミットを取得します:
{"repo_path": ".", "since": "1 week ago"} - 作成者によるコミットを取得します:
{"repo_path": ".", "author": "John"} - 指定した期間のコミットを取得します:
{"repo_path": ".", "since": "2023-01-01", "until": "2023-12-31"}
git_commit
新しいコミットを作成します。
パラメーター:
repo_path- Git リポジトリへのパスmessage- コミットメッセージall- (任意)変更したファイルを自動的にステージングするかどうか
戻り値:
{
"success": true,
"hash": "abcd1234",
"message": "feat: Add new feature",
"output": "[main abcd1234] feat: Add new feature\n 1 file changed, 10 insertions(+), 2 deletions(-)"
}
git_pull
リモートから変更をプルします。
パラメーター:
repo_path- Git リポジトリへのパスremote- (任意)リモート名。既定値は「origin」ですbranch- (任意)ブランチ名
戻り値:
{
"success": true,
"remote": "origin",
"output": "Updating abcd1234..efgh5678\nFast-forward\n file1.txt | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)"
}
git_push
変更をリモートにプッシュします。
パラメーター:
repo_path- Git リポジトリへのパスremote- (任意)リモート名。デフォルトは "origin" ですbranch- (任意)ブランチ名force- (任意)強制プッシュするかどうか
戻り値:
{
"success": true,
"remote": "origin",
"output": "To github.com:user/repo.git\n abcd1234..efgh5678 main -> main"
}
git_diff
ファイルの差分を表示します。
パラメーター:
repo_path- Git リポジトリへのパスpath- (任意)ファイルまたはディレクトリへのパスstaged- (任意)ステージ済みの変更を表示するかどうかcommit- (任意)比較対象のコミット
戻り値:
{
"changes": "diff --git a/file.txt b/file.txt\nindex 1234567..abcdefg 100644\n--- a/file.txt\n+++ b/file.txt\n@@ -1,3 +1,4 @@\n Line 1\nLine 2\nLine 3\n+New line\nLine 4"
}
git_add
ファイルの内容をステージングエリアに追加します。
パラメーター:
repo_path- Git リポジトリへのパスpath- 追加するパス、または照合するパターン。すべてのファイルを対象にするには '.' を使用します。update- (任意)追加ではなく更新するかどうかall- (任意)追跡されていないファイルを含むすべての変更を追加するかどうか
戻り値:
{
"success": true,
"message": "Files staged successfully",
"status": ["M file1.txt", "A file2.txt"]
}
git_reset
ステージングエリアまたは作業ツリーを指定した状態にリセットします。
パラメーター:
repo_path- Git リポジトリへのパスpath- リセットするパス、または照合するパターン。すべてのファイルを対象にするには '.' を使用します。hard- (任意)ハードリセットを実行するかどうか(警告:すべてのローカル変更が破棄されます)target- (任意)リセット先のコミットまたはブランチ(デフォルトは HEAD)
戻り値:
{
"success": true,
"message": "Files unstaged successfully",
"status": ["?? file1.txt", "?? file2.txt"]
}
git_worktree_list
リポジトリ内のすべてのワークツリーを一覧表示します。
パラメーター:
repo_path- Git リポジトリへのパス
戻り値:
{
"worktrees": [
{
"id": "worktree-name",
"path": "/path/to/worktree",
"locked": false,
"lock_reason": null
}
]
}
git_worktree_add
新しいワークツリーを作成します。
パラメーター:
repo_path- Git リポジトリへのパスpath- 新しいワークツリーのパスbranch- (任意)作成するブランチ名commit_ref- (任意)チェックアウトするコミット参照checkout- (任意)ファイルをチェックアウトするかどうか。デフォルトは true です
戻り値:
{
"success": true,
"path": "/path/to/new/worktree",
"branch": "feature-branch",
"output": "Preparing worktree (checking out 'feature-branch')"
}
git_worktree_remove
ワークツリーを削除します。
パラメーター:
repo_path- Git リポジトリへのパスpath- 削除するワークツリーへのパスforce- (任意)ワークツリーに未コミットの変更があっても強制的に削除するかどうか
戻り値:
{
"success": true,
"path": "/path/to/worktree",
"force": false,
"output": "Removing worktrees/feature-branch"
}
git_worktree_prune
$GIT_DIR/worktrees 内の作業ツリーファイルを整理します。
パラメーター:
repo_path- Git リポジトリへのパスverbose- (任意)削除内容をすべて報告するかどうかdry_run- (任意)削除せず、表示のみ行うかどうか
戻り値:
{
"success": true,
"verbose": false,
"dry_run": false,
"output": "Pruning worktrees/feature-branch"
}
開発
プロジェクト構成
mcp-git-tools/
├── Cargo.toml # Dependencies and project configuration
├── src/
│ ├── lib.rs # Core library with GitToolsHandler
│ └── bin/
│ └── server.rs # Server entry point
├── tests/
│ └── lib_tests.rs # Unit tests
ビルド
# Debug build
cargo build
# Release build
cargo build --release
# Run tests
cargo test
# Run server
cargo run --release --bin mcp-git-server
新しいツールの追加
新しい Git ツールを追加するには:
src/lib.rsにパラメーター構造体を追加します:
#[derive(serde::Deserialize, schemars::JsonSchema)]
struct GitMyToolParams {
repo_path: String,
// other parameters...
}
GitToolsHandlerの impl ブロックにメソッドを追加します:
#[tool(description = "Description of your tool")]
pub async fn git_my_tool(
&self,
repo_path: String,
// other parameters...
) -> Result<CallToolResult> {
// Implementation
}
list_tools()メソッドを更新し、返されるリストに新しいツールを含めます
依存関係
rmcpv0.14.0 - 公式 RMCP SDKtokio- 非同期ランタイムserde- シリアライゼーションフレームワークserde_json- JSON 実装anyhow- エラー処理tracing- ロギングフレームワークtempfile- テストユーティリティ
ライセンス
MIT ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。