mcp-git-tools
If you are the rightful owner of mcp-git-tools and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
MCP Git Tools is a library that integrates Git operations with the Model Context Protocol (MCP), allowing for seamless interaction with Git repositories through MCP.
MCP Git Tools
Git tool integration library for the Model Context Protocol (MCP).
Features
This library provides a set of Git operations that can be called through the Model Context Protocol:
git_status
- Get the status of a repositorygit_branches
- List branch informationgit_log
- Get commit historygit_time_filtered_log
- Get commits within a specific time rangegit_commit
- Create a new commitgit_pull
- Pull changes from remotegit_push
- Push changes to remotegit_diff
- View file differencesgit_add
- Add file contents to the staging areagit_reset
- Reset the staging area or working tree to a specified state
Installation
# Clone the repository
git clone https://github.com/lileeei/mcp-git-tools.git
# Navigate to the directory
cd mcp-git-tools
# Build
cargo build
Usage
Run as a standalone server
cargo run --bin mcp-git-server
This starts an MCP server that interacts with clients through standard input/output.
Use in an MCP client
use mcp_client::{
client::{ClientCapabilities, ClientInfo, McpClient},
StdioTransport, Transport, McpService,
};
use std::collections::HashMap;
use std::time::Duration;
// Create a connection to the Git tools server
let transport = StdioTransport::new(
"path/to/mcp-git-server",
vec![],
HashMap::new()
);
// Start the transport
let handle = transport.start().await?;
let service = McpService::with_timeout(handle, Duration::from_secs(10));
let mut client = McpClient::new(service);
// Initialize the client
client.initialize(
ClientInfo {
name: "my-client".into(),
version: "1.0.0".into(),
},
ClientCapabilities::default(),
).await?;
// Call the git_status tool
let status = client
.call_tool("git_status", serde_json::json!({ "repo_path": "/path/to/repo" }))
.await?;
println!("Git status: {:?}", status);
Integrate into your own MCP server
use mcp_git_tools::register_git_tools;
use mcp_server::McpServerBuilder;
// Create a server
let mut builder = McpServerBuilder::new("my-server", "1.0.0");
// Register Git tools
register_git_tools(&mut builder);
// Add other tools...
// Build the server
let server = builder.build();
Tool Details
git_status
Get the status of a repository.
Parameters:
repo_path
- Path to the Git repository
Returns:
{
"status": ["M file1.txt", "?? file2.txt"],
"is_clean": false
}
git_branches
List all branches.
Parameters:
repo_path
- Path to the Git repository
Returns:
{
"branches": ["* main", "develop", "feature/new-feature"],
"current": "main"
}
git_log
Get commit history.
Parameters:
repo_path
- Path to the Git repositorymax_count
- (optional) Maximum number of commits to returnbranch
- (optional) Branch name
Returns:
{
"commits": [
{
"hash": "abcd1234",
"author": "User Name",
"date": "Mon Aug 1 10:00:00 2023 +0800",
"message": "Initial commit"
}
]
}
git_time_filtered_log
Get commits within a specified time range, optionally filtered by author and branch.
Parameters:
repo_path
- Path to the Git repositorysince
- Start date (e.g., "2023-01-01", "1 week ago", "yesterday")until
- (optional) End date (e.g., "2023-01-31", "today")author
- (optional) Filter by specific authorbranch
- (optional) Branch name
Returns:
{
"commits": [
{
"hash": "abcd1234",
"author": "User Name",
"date": "Mon Aug 1 10:00:00 2023 +0800",
"message": "Initial commit"
}
],
"filters": {
"since": "1 week ago",
"until": "today",
"author": "User Name",
"branch": "main"
}
}
git_commit
Create a new commit.
Parameters:
repo_path
- Path to the Git repositorymessage
- Commit messageall
- (optional) Whether to automatically stage modified files
Returns:
{
"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
Pull changes from remote.
Parameters:
repo_path
- Path to the Git repositoryremote
- (optional) Remote name, defaults to "origin"branch
- (optional) Branch name
Returns:
{
"success": true,
"remote": "origin",
"output": "Updating abcd1234..efgh5678\nFast-forward\n file1.txt | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)"
}
git_push
Push changes to remote.
Parameters:
repo_path
- Path to the Git repositoryremote
- (optional) Remote name, defaults to "origin"branch
- (optional) Branch nameforce
- (optional) Whether to force push
Returns:
{
"success": true,
"remote": "origin",
"output": "To github.com:user/repo.git\n abcd1234..efgh5678 main -> main"
}
git_diff
View file differences.
Parameters:
repo_path
- Path to the Git repositorypath
- (optional) Path to file or directorystaged
- (optional) Whether to show staged changescommit
- (optional) Commit to compare against
Returns:
{
"diff": "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\n Line 2\n+New line\n Line 3"
}
git_add
Add file contents to the staging area.
Parameters:
repo_path
- Path to the Git repositorypath
- Path(s) to add, or patterns to match. Use '.' for all files.update
- (optional) Whether to update, rather than addall
- (optional) Whether to add all changes, including untracked files
Returns:
{
"success": true,
"message": "Files staged successfully",
"status": ["M file1.txt", "A file2.txt"]
}
git_reset
Reset the staging area or working tree to a specified state.
Parameters:
repo_path
- Path to the Git repositorypath
- Path(s) to reset, or patterns to match. Use '.' for all files.hard
- (optional) Whether to perform a hard reset (WARNING: discards all local changes)target
- (optional) The commit or branch to reset to (defaults to HEAD)
Returns:
{
"success": true,
"message": "Files unstaged successfully",
"status": ["?? file1.txt", "?? file2.txt"]
}
License
MIT License