A Model Context Protocol server for Git repository interaction and automation. This server provides tools to read, search, and manipulate Git repositories via Large Language Models.
Please note that mcp-server-git is currently in early development. The functionality and available tools are subject to change and expansion as we continue to develop and improve the server.
-
git_status- Shows the working tree status
- Input:
repo_path(string): Path to Git repository
- Returns: Current status of working directory as text output
-
git_diff_unstaged- Shows changes in working directory not yet staged
- Inputs:
repo_path(string): Path to Git repositorycontext_lines(number, optional): Number of context lines to show (default: 3)
- Returns: Diff output of unstaged changes
-
git_diff_staged- Shows changes that are staged for commit
- Inputs:
repo_path(string): Path to Git repositorycontext_lines(number, optional): Number of context lines to show (default: 3)
- Returns: Diff output of staged changes
-
git_diff- Shows differences between branches or commits
- Inputs:
repo_path(string): Path to Git repositorytarget(string): Target branch or commit to compare withcontext_lines(number, optional): Number of context lines to show (default: 3)
- Returns: Diff output comparing current state with target
-
git_commit- Records changes to the repository
- Inputs:
repo_path(string): Path to Git repositorymessage(string): Commit message
- Returns: Confirmation with new commit hash
-
git_add- Adds file contents to the staging area
- Inputs:
repo_path(string): Path to Git repositoryfiles(string[]): Array of file paths to stage
- Returns: Confirmation of staged files
-
git_reset- Unstages all staged changes
- Input:
repo_path(string): Path to Git repository
- Returns: Confirmation of reset operation
-
git_log- Shows the commit logs with optional date filtering
- Inputs:
repo_path(string): Path to Git repositorymax_count(number, optional): Maximum number of commits to show (default: 10)start_timestamp(string, optional): Start timestamp for filtering commits. Accepts ISO 8601 format (e.g., '2024-01-15T14:30:25'), relative dates (e.g., '2 weeks ago', 'yesterday'), or absolute dates (e.g., '2024-01-15', 'Jan 15 2024')end_timestamp(string, optional): End timestamp for filtering commits. Accepts ISO 8601 format (e.g., '2024-01-15T14:30:25'), relative dates (e.g., '2 weeks ago', 'yesterday'), or absolute dates (e.g., '2024-01-15', 'Jan 15 2024')
- Returns: Array of commit entries with hash, author, date, and message
-
git_create_branch- Creates a new branch
- Inputs:
repo_path(string): Path to Git repositorybranch_name(string): Name of the new branchbase_branch(string, optional): Base branch to create from (defaults to current branch)
- Returns: Confirmation of branch creation
-
git_checkout
- Switches branches
- Inputs:
repo_path(string): Path to Git repositorybranch_name(string): Name of branch to checkout
- Returns: Confirmation of branch switch
git_show
- Shows the contents of a commit
- Inputs:
repo_path(string): Path to Git repositoryrevision(string): The revision (commit hash, branch name, tag) to show
- Returns: Contents of the specified commit
git_branch
- List Git branches
- Inputs:
repo_path(string): Path to the Git repository.branch_type(string): Whether to list local branches ('local'), remote branches ('remote') or all branches('all').contains(string, optional): The commit sha that branch should contain. Do not pass anything to this param if no commit sha is specifiednot_contains(string, optional): The commit sha that branch should NOT contain. Do not pass anything to this param if no commit sha is specified
- Returns: List of branches
git_remote
- List configured remotes and their URLs
- Input:
repo_path(string): Path to Git repository
- Returns: One line per remote/URL pair (name<tab>url)
git_fetch
- Fetch from a configured remote by name. Optionally fetches a single named branch. Does not accept arbitrary URLs or refspec syntax.
- Inputs:
repo_path(string): Path to Git repositoryremote(string, optional): Configured remote name (default: "origin"). Must already exist in the repo config.branch(string, optional): Single branch name to fetch. No ':' or whitespace.prune(bool, optional): Prune remote-tracking refs that no longer exist upstream (default: false)tags(bool, optional): Also fetch tags (default: false)
- Returns: Summary of updated refs
git_ls_tree
- List the contents of a tree at a given revision
- Inputs:
repo_path(string): Path to Git repositoryrevision(string): Revision to inspect (commit, branch, tag)path(string, optional): Restrict to a subtree or pathrecursive(bool, optional): Recurse into subtrees (default: false)
- Returns:
ls-treeoutput
git_cat_file
- Read the contents of a file at a given revision (text blobs; output is truncated to
max_bytes) - Inputs:
repo_path(string): Path to Git repositoryrevision(string): Revision the blob is read frompath(string): Path to the file within that revisionmax_bytes(number, optional): Maximum bytes to return (default: 200000)
- Returns: File contents, UTF-8 decoded with replacement for invalid bytes
git_blame
- Show line-by-line authorship of a file, optionally scoped to a line range.
Output format is pinned (
--abbrev=12 --date=iso-strict) so results are stable regardless of the user's git config. - Inputs:
repo_path(string): Path to Git repositorypath(string): Path to the file to blamerevision(string, optional): Revision at which to blame (defaults to working tree)line_start(number, optional): First line of the range (1-based)line_end(number, optional): Last line of the range (defaults to line_start)ignore_whitespace(bool, optional): Pass-wto look past whitespace-only changes (default: false)follow_renames(bool, optional): Pass-C -Cto also attribute lines to commits that moved/copied content in from other files (in the same commit or the one that created this file). Plain blame already follows simple whole-file renames; this flag additionally handles file splits and cross-file copies. (default: false)
- Returns:
git blameoutput
git_merge_base
- Find the best common ancestor between two refs
- Inputs:
repo_path(string): Path to Git repositoryref_a(string): First refref_b(string): Second ref
- Returns: SHA of the common ancestor (or multiple, one per line, in criss-cross cases)
git_tag
- List tags, optionally filtered by glob pattern or containing commit
- Inputs:
repo_path(string): Path to Git repositorypattern(string, optional): Glob pattern (e.g. 'v1.*')contains(string, optional): Only list tags whose history contains this commit SHA
- Returns: Newline-separated list of tag names
When using uv no specific installation is needed. We will
use uvx to directly run mcp-server-git.
Alternatively you can install mcp-server-git via pip:
pip install mcp-server-git
After installation, you can run it as a script using:
python -m mcp_server_git
Add this to your claude_desktop_config.json:
Using uvx
"mcpServers": {
"git": {
"command": "uvx",
"args": ["mcp-server-git", "--repository", "path/to/git/repo"]
}
}Using docker
- Note: replace '/Users/username' with a path that you want to be accessible by this tool
"mcpServers": {
"git": {
"command": "docker",
"args": ["run", "--rm", "-i", "--mount", "type=bind,src=/Users/username,dst=/Users/username", "mcp/git"]
}
}Using pip installation
"mcpServers": {
"git": {
"command": "python",
"args": ["-m", "mcp_server_git", "--repository", "path/to/git/repo"]
}
}For quick installation, use one of the one-click install buttons below...
For manual installation, you can configure the MCP server using one of these methods:
Method 1: User Configuration (Recommended)
Add the configuration to your user-level MCP configuration file. Open the Command Palette (Ctrl + Shift + P) and run MCP: Open User Configuration. This will open your user mcp.json file where you can add the server configuration.
Method 2: Workspace Configuration
Alternatively, you can add the configuration to a file called .vscode/mcp.json in your workspace. This will allow you to share the configuration with others.
For more details about MCP configuration in VS Code, see the official VS Code MCP documentation.
{
"servers": {
"git": {
"command": "uvx",
"args": ["mcp-server-git"]
}
}
}For Docker installation:
{
"mcp": {
"servers": {
"git": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"--mount", "type=bind,src=${workspaceFolder},dst=/workspace",
"mcp/git"
]
}
}
}
}Usage with Zed
Add to your Zed settings.json:
Using uvx
"context_servers": [
"mcp-server-git": {
"command": {
"path": "uvx",
"args": ["mcp-server-git"]
}
}
],Using pip installation
"context_servers": {
"mcp-server-git": {
"command": {
"path": "python",
"args": ["-m", "mcp_server_git"]
}
}
},Usage with Zencoder
- Go to the Zencoder menu (...)
- From the dropdown menu, select
Agent Tools - Click on the
Add Custom MCP - Add the name (i.e. git) and server configuration from below, and make sure to hit the
Installbutton
Using uvx
{
"command": "uvx",
"args": ["mcp-server-git", "--repository", "path/to/git/repo"]
}You can use the MCP inspector to debug the server. For uvx installations:
npx @modelcontextprotocol/inspector uvx mcp-server-git
Or if you've installed the package in a specific directory or are developing on it:
cd path/to/servers/src/git
npx @modelcontextprotocol/inspector uv run mcp-server-git
Running tail -n 20 -f ~/Library/Logs/Claude/mcp*.log will show the logs from the server and may
help you debug any issues.
If you are doing local development, there are two ways to test your changes:
-
Run the MCP inspector to test your changes. See Debugging for run instructions.
-
Test using the Claude desktop app. Add the following to your
claude_desktop_config.json:
{
"mcpServers": {
"git": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"--mount", "type=bind,src=/Users/username/Desktop,dst=/projects/Desktop",
"--mount", "type=bind,src=/path/to/other/allowed/dir,dst=/projects/other/allowed/dir,ro",
"--mount", "type=bind,src=/path/to/file.txt,dst=/projects/path/to/file.txt",
"mcp/git"
]
}
}
}{
"mcpServers": {
"git": {
"command": "uv",
"args": [
"--directory",
"/<path to mcp-servers>/mcp-servers/src/git",
"run",
"mcp-server-git"
]
}
}
}Docker build:
cd src/git
docker build -t mcp/git .This MCP server is licensed under the MIT License. This means you are free to use, modify, and distribute the software, subject to the terms and conditions of the MIT License. For more details, please see the LICENSE file in the project repository.