mcpField
M
MCP Git Tools

MCP Git Tools

ローカル
github.com/lileeeiバージョン管理838 週間前に更新

MCP Git Tools について

MCP Git Toolsは、MCPクライアントにリポジトリ操作を提供するRustライブラリ兼スタンドアロンMCPサーバーです。Gitの状態や履歴、リモート同期、worktree管理に対応します。

主な機能

  1. 01リポジトリの状態とブランチ一覧
  2. 02条件指定によるコミット履歴
  3. 03ステージ、コミット、リセット、差分表示
  4. 04リモートへのプルとプッシュ
  5. 05worktreeの一覧と管理

活用シーン

  1. 01リポジトリの状態と履歴の確認
  2. 02MCPクライアント経由でのステージとコミット
  3. 03リモートリポジトリとの同期
  4. 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 でテストする
  1. サーバーをビルドします。
cargo build --release
  1. サーバーを起動します。
./target/release/mcp-git-server
  1. 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 ツールを追加するには:

  1. src/lib.rs にパラメーター構造体を追加します:
#[derive(serde::Deserialize, schemars::JsonSchema)]
struct GitMyToolParams {
    repo_path: String,
    // other parameters...
}
  1. GitToolsHandler の impl ブロックにメソッドを追加します:
#[tool(description = "Description of your tool")]
pub async fn git_my_tool(
    &self,
    repo_path: String,
    // other parameters...
) -> Result<CallToolResult> {
    // Implementation
}
  1. list_tools() メソッドを更新し、返されるリストに新しいツールを含めます

依存関係

  • rmcp v0.14.0 - 公式 RMCP SDK
  • tokio - 非同期ランタイム
  • serde - シリアライゼーションフレームワーク
  • serde_json - JSON 実装
  • anyhow - エラー処理
  • tracing - ロギングフレームワーク
  • tempfile - テストユーティリティ

ライセンス

MIT ライセンス

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。