git MCP server
OfficialThis MCP server provides Git repository inspection and modification tools, with optional repository confinement and helper prompts.
Check working-tree status.
View unstaged/staged diffs and diff against a target branch or commit with configurable context lines.
Stage files or all changes, unstage all staged changes, and commit staged changes with a message.
View commit logs with max-count and optional start/end date filters.
Create branches, checkout branches or revisions, and list local/remote/all branches with contains/not-contains filters.
Show commit contents or file/directory content at a revision/object spec.
Use prompts to generate a commit message from staged changes or summarize working-tree/target diffs.
The provided schema exposes 12 tools; the README also documents
git_mergeandgit_remotewith credential redaction, though those are absent from this schema.
Provides tools to read, search, and manipulate Git repositories via Large Language Models. Includes functionalities for viewing git status, diffs, committing changes, managing branches, and other git operations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@git MCP servershow me the last 5 commits in the /home/user/projects/myapp repo"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-server-git: A git MCP server
Overview
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.
Source: https://github.com/modelcontextprotocol/servers/tree/main/src/git
Requires MCP Python SDK 2.x (mcp>=2.3,<3). The server is built on the SDK's high-level MCPServer: each tool is a typed Python function, and the SDK derives its input schema from the signature.
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.
Tools
git_statusShows the working tree status
Input:
repo_path(string): Path to Git repository
Returns: Current status of working directory as text output
git_diff_unstagedShows 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_stagedShows 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_diffShows differences between branches or commits, or across a revision range
Inputs:
repo_path(string): Path to Git repositorytarget(string): Target branch or commit to compare with, or a revision range:a..b(fromatob) ora...b(from the merge base ofaandbtob). An omitted endpoint meansHEAD; each endpoint must resolve and cannot start with-context_lines(number, optional): Number of context lines to show (default: 3)
Returns: Diff output comparing the working tree with target, or the two endpoints of a range with each other
git_commitRecords changes to the repository
Inputs:
repo_path(string): Path to Git repositorymessage(string): Commit message
Returns: Confirmation with new commit hash; an error if nothing is staged (as
git commitwithout--allow-empty), except while a merge is in progress (MERGE_HEADpresent), where git also allows an empty commit. While a merge is in progress the commit concludes it: its parents areHEADand everyMERGE_HEADcommit, and the merge state is cleared
git_addAdds file contents to the staging area
Inputs:
repo_path(string): Path to Git repositoryfiles(string[]): Non-empty array of file paths to stage;["."]stages everything
Returns: Confirmation of staged files, or a message saying nothing was staged when the call left the index unchanged
git_resetUnstages all staged changes
Input:
repo_path(string): Path to Git repository
Returns: Confirmation of reset operation
git_logShows 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_branchCreates a new branch
Inputs:
repo_path(string): Path to Git repositorybranch_name(string): Name of the new branchbase_branch(string, optional): Branch, tag or commit SHA to create from (defaults to the current branch, or to the current commit when HEAD is detached)
Returns: Confirmation of branch creation, naming the base branch, or the short SHA when the base is a commit
git_checkout
Switches branches
Inputs:
repo_path(string): Path to Git repositorybranch_name(string): Name of branch to checkout
Returns: Confirmation of branch switch, or
HEAD is now detached at <short sha>whenbranch_nameis not a branch (a sha, tag or other revision)
git_merge
Merges a branch into the current branch, or changes nothing
Inputs:
repo_path(string): Path to Git repositorysource_branch(string): Branch, tag or commit to merge into the current branch (check out the branch to merge into first withgit_checkout)fast_forward_only(boolean, optional): Only fast-forward, failing if the branches have diverged (defaulttrue).falselets Git create a merge commit when they have
Returns:
Fast-forwarded,Merged ... with merge commit <short sha>, orAlready up to dateRefuses a detached HEAD, a working tree with uncommitted changes, a merge already in progress, and a merge that would overwrite an ignored local file. A merge that stops on conflicts is aborted (
git merge --abort) and the error names the conflicting files, so the repository is left as it was
git_show
Shows the contents of a commit, or of a file or directory at a revision
Inputs:
repo_path(string): Path to Git repositoryrevision(string): The revision (commit hash, branch name, tag) or object spec (HEAD:path/to/file) to show
Returns: Contents of the specified commit, file content, or directory listing
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
Lists the repository's remotes with their fetch and push URLs, like
git remote -vInputs:
repo_path(string): Path to the Git repository.
Returns: One line per remote and direction,
<name>\t<url> (fetch)or(push)(a partial clone's fetch line ends with its filter, such as[blob:none]), orNo remotes configuredA credential embedded in a URL is never returned: the whole userinfo of a URL such as
https://user:token@host/...orhttps://token@host/...is shown as<redacted>. An SSH username (ssh://git@host/...) is kept, since it names an account rather than authenticating one; a password after it is redacted. A remote-helper address (https::https://user:token@host/...) has its inner URL redacted the same way. scp-style addresses (git@host:path) and local paths are shown as configured. A line that cannot be parsed is shown as<redacted>, and if a configured remote URL (orinsteadOfrewrite) contains a newline, which git itself refuses, the tool returns an error instead of a listing.
Protocol versions
The server speaks both eras of the Model Context Protocol over stdio, with nothing to configure: a 2026-07-28 client (discovered with server/discover, no session) and a 2025-11-25 client (the initialize handshake). The client's first request decides which. Tools behave the same in both.
Roots is deprecated in 2026-07-28, and this server never asks a client for Roots in either era: repository access comes from --repository alone, or, with no --repository, from each tool call's repo_path. Methods the 2026-07-28 specification removes, such as ping, are answered only on a 2025-11-25 connection.
Errors
A tool that fails returns a result with
isError: truewhose text isError executing tool <name>: <message>, so the model can read it and correct the call. This covers git errors (an unknown revision, a failed command), arepo_paththat is not a repository or is outside--repository, the flag-injection guards, and arguments that do not match the tool's input schema.An unknown tool name is a protocol error, JSON-RPC
-32602(Unknown tool: <name>), as the specification requires in both eras. Before 2.0.0 it was anisErrorresult.
Prompts
Beside its tools, the server offers two prompts, which a client typically shows the user as slash commands. Each reads the repository when it is requested and returns one user message that embeds the changes, ready to send to the model. They open the repository the way the tools do, so --repository confines them too, and the same flag-injection guards apply. They behave the same in both protocol eras.
git_commit_messageAsks the model for a commit message for the staged changes
Arguments:
repo_path(string, required): Path to the Git repository
Returns: A message embedding the staged diff and asking for a commit message, or one saying nothing is staged
git_summarize_changesAsks the model to summarize the working tree's changes, or the diff against a branch or commit
Arguments:
repo_path(string, required): Path to the Git repositorytarget(string, optional): Branch or commit to diff against. Without it, the working tree's status and its staged and unstaged diffs are summarized
Returns: A message embedding those changes and asking for a summary, or one saying there are none
A prompt request that fails (a repo_path that is not a repository or is outside --repository, an unknown target, a target starting with -) is a JSON-RPC -32602 error carrying the message a tool would report, since prompts/get has no isError result.
Related MCP server: GitHub Tools MCP Server
Installation
Using uv (recommended)
When using uv no specific installation is needed. We will
use uvx to directly run mcp-server-git.
Using PIP
Alternatively you can install mcp-server-git via pip:
pip install mcp-server-gitAfter installation, you can run it as a script using:
python -m mcp_server_gitConfiguration
Without --repository, the server reads and writes any Git repository the server process can reach. Each tool call names its own repo_path, and that holds for the tools that change a repository too (git_add, git_commit, git_reset, git_create_branch, git_checkout, git_merge). --repository is the only confinement the server offers: it never asks the client for Roots, in either protocol era. Set --repository whenever the server is used with prompts or content that are not fully trusted. It admits the whole enclosing repository, not only the directory you name, as the next paragraph describes.
--repository (-r) accepts any path inside a Git working tree. At startup the server walks up to the enclosing repository root, the way git rev-parse --show-toplevel does, so --repository . works when a shared config is launched from any subdirectory of the repository. A path inside the repository therefore allows tool calls anywhere in that repository, not only under the subdirectory given. A path that does not exist, or is not inside a Git repository, is logged as a one-line error at startup.
A tool call's repo_path must be inside that repository, and so must the directories Git then uses for it: a repository nested inside whose .git file, commondir or core.worktree points outside is refused. A linked worktree can still be the --repository, though its Git directory lives under the main repository's .git.
Commit identity
git_commit has no identity setting of its own. It takes the author and the committer from the same places git commit does, in this order:
The server process's environment:
GIT_AUTHOR_NAMEandGIT_AUTHOR_EMAILfor the author,GIT_COMMITTER_NAMEandGIT_COMMITTER_EMAILfor the committer. The author and the committer are resolved separately, so set all four (usually to the same name and email).user.nameanduser.emailfrom Git config: the repository's.git/config, then~/.gitconfig, then$XDG_CONFIG_HOME/git/config(by default~/.config/git/config), then/etc/gitconfig.
Unlike git commit, the server does not refuse to commit when neither is set. It falls back to the operating-system user and host name, so a commit made in a container is recorded as something like root <root@3f2a1b9c8d7e>. A local install usually finds your own ~/.gitconfig; a Docker container has none, so give it an identity explicitly.
For a local command (uvx, python -m mcp_server_git), add an env block to the server's entry in your client configuration:
"mcpServers": {
"git": {
"command": "uvx",
"args": ["mcp-server-git", "--repository", "path/to/git/repo"],
"env": {
"GIT_AUTHOR_NAME": "Your Name",
"GIT_AUTHOR_EMAIL": "you@example.com",
"GIT_COMMITTER_NAME": "Your Name",
"GIT_COMMITTER_EMAIL": "you@example.com"
}
}
}For Docker, pass the variables to docker run with -e, as the Docker examples below do. Alternatively, mount your gitconfig read-only in place of the four -e pairs. The image runs as root, so it goes at /root/.gitconfig:
"args": [
"run", "--rm", "-i",
"--mount", "type=bind,src=/Users/username/.gitconfig,dst=/root/.gitconfig,readonly",
"--mount", "type=bind,src=/Users/username,dst=/Users/username",
"mcp/git"
]Usage with Claude Desktop
Add this to your claude_desktop_config.json:
"mcpServers": {
"git": {
"command": "uvx",
"args": ["mcp-server-git", "--repository", "path/to/git/repo"]
}
}Note: replace '/Users/username' with a path that you want to be accessible by this tool
Note: the
-elines set the identitygit_commitrecords; see Commit identity
"mcpServers": {
"git": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "GIT_AUTHOR_NAME=Your Name",
"-e", "GIT_AUTHOR_EMAIL=you@example.com",
"-e", "GIT_COMMITTER_NAME=Your Name",
"-e", "GIT_COMMITTER_EMAIL=you@example.com",
"--mount", "type=bind,src=/Users/username,dst=/Users/username",
"mcp/git"
]
}
}"mcpServers": {
"git": {
"command": "python",
"args": ["-m", "mcp_server_git", "--repository", "path/to/git/repo"]
}
}Usage with VS Code
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:
"context_servers": [
"mcp-server-git": {
"command": {
"path": "uvx",
"args": ["mcp-server-git"]
}
}
],"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 ToolsClick on the
Add Custom MCPAdd the name (i.e. git) and server configuration from below, and make sure to hit the
Installbutton
{
"command": "uvx",
"args": ["mcp-server-git", "--repository", "path/to/git/repo"]
}Debugging
You can use the MCP inspector to debug the server. For uvx installations:
npx @modelcontextprotocol/inspector uvx mcp-server-gitOr 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-gitRunning tail -n 20 -f ~/Library/Logs/Claude/mcp*.log will show the logs from the server and may
help you debug any issues.
Development
Tests and coverage
The test suite drives serve() in-process through an MCP ClientSession
(see tests/conftest.py), and tests/test_eras.py runs a Client against it
as a 2026-07-28 and as a 2025-11-25 client. From src/git:
uv run --frozen pytest # the tests
uv run --frozen pytest --cov --cov-report=term-missing --cov-report=jsonThe second command adds branch coverage of src/mcp_server_git, printed per
file and written to coverage.json (ignored by git). Every file must stay at
or above 90% of its lines and 90% of its branches. Code that cannot be reached
is marked # pragma: no cover # <reason> rather than lowering that bar.
Trying changes in a client
There are two ways to try your changes in a client:
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:
Docker
{
"mcpServers": {
"git": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e", "GIT_AUTHOR_NAME=Your Name",
"-e", "GIT_AUTHOR_EMAIL=you@example.com",
"-e", "GIT_COMMITTER_NAME=Your Name",
"-e", "GIT_COMMITTER_EMAIL=you@example.com",
"--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"
]
}
}
}UVX
{
"mcpServers": {
"git": {
"command": "uv",
"args": [
"--directory",
"/<path to mcp-servers>/mcp-servers/src/git",
"run",
"mcp-server-git"
]
}
}
}Build
Docker build:
cd src/git
docker build -t mcp/git .License
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.
Available Tools
14 toolsgit_addCIdempotent
Adds file contents to the staging area
| Name | Required | Description | Default |
|---|---|---|---|
| files | Yes | ||
| repo_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the description carries a lighter burden. It usefully identifies the staging-area target, which is the core behavioral effect and is not encoded in any structured field, but it omits what forms the 'files' argument accepts (paths, globs, directories) and doesn't clarify that nothing is committed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single eight-word sentence with no filler and the effect front-loaded. It is efficient, though the brevity edges toward under-specification rather than genuine conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating tool with zero parameter documentation, no output schema, and a dense ecosystem of sibling git operations, the description does too little. It never explains the staging concept, how it relates to git_commit or git_reset, or what the caller learns about success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters, so the description must compensate, and it does not. 'File contents' gestures vaguely at 'files' but gives no path syntax or multi-file semantics, and 'repo_path' is entirely unaddressed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb ('Adds') and resource ('file contents') plus the destination ('staging area'), which is enough for an agent familiar with git to distinguish it from git_commit and git_reset. However, it never explicitly contrasts itself with any sibling, so the differentiation is inferred from domain knowledge rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description contains no when-to-use guidance: no mention that it precedes git_commit, no note that git_reset unstages, and no statement about selecting subsets of files. An agent must rely entirely on prior git knowledge to sequence this tool against its 11 siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_branchCRead-onlyIdempotent
List Git branches
| Name | Required | Description | Default |
|---|---|---|---|
| contains | No | The commit sha that branch should contain. Do not pass anything to this param if no commit sha is specified | |
| repo_path | Yes | The path to the Git repository. | |
| branch_type | Yes | Whether to list local branches ('local'), remote branches ('remote') or all branches('all'). | |
| not_contains | No | The commit sha that branch should NOT contain. Do not pass anything to this param if no commit sha is specified |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds no behavioral context beyond the word 'List', such as return format, filtering behavior, or handling of remote branches.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the core action. However, it is under-specified for a tool with required branch_type and optional commit filters, so it is not appropriately sized to support reliable invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The rich input schema and annotations reduce the description's burden, and no output schema is present. Still, the description omits the key distinction between local, remote, and all branches and the contains/not_contains filtering capability, leaving the agent to infer these entirely from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are documented in the schema. The description adds no parameter meaning beyond what the schema already provides, making the baseline score of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'List Git branches'. It distinguishes the tool from write-oriented siblings like git_create_branch and git_checkout by using 'List', but it does not explicitly differentiate among the several read-only siblings such as git_status and git_log.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives. The description gives no conditions, no exclusions, and no mention of related tools like git_create_branch or git_log.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_checkoutC
Switches branches
| Name | Required | Description | Default |
|---|---|---|---|
| repo_path | Yes | ||
| branch_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, and openWorldHint=false. The description adds no behavioral context beyond that, such as effect on uncommitted changes, working tree state, or whether the operation can fail on dirty state. It does not contradict annotations, but it adds little value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
'Switches branches' is extremely concise but under-specified for a tool with two required parameters and no schema descriptions. It is front-loaded but not appropriately sized for the complexity, so it reads as incomplete rather than efficiently concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The annotations provide a basic safety profile, and no output schema exists. However, the description leaves out any explanation of the required parameters, usage context, or behavioral side effects, making it too thin for a non-read-only Git operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not mention either required parameter (repo_path or branch_name). With two undocumented required parameters, the description must compensate but provides no semantic detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a clear verb+resource: 'Switches branches.' It identifies the core operation but does not distinguish it from sibling tools like git_create_branch or explain the repo_path/branch_name scope. This fits the rubric for a clear purpose without sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no when-to-use guidance, no conditions, and no mention of alternatives among the many sibling git tools. It only implies usage through the phrase 'switches branches,' which is not enough for explicit selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_commitD
Records changes to the repository
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| repo_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare that this is a mutating, non-idempotent, non-destructive, closed-world operation. The description adds no behavioral context beyond that, such as required git identity configuration, whether staged changes are required, or what happens if the working tree is clean.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The single sentence is short, but it is under-specified rather than concise. Every word is vague and no useful information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no parameter descriptions, no output schema, and only generic annotations, the description is far too thin. It omits essential information about how to call the tool correctly and what the parameters mean.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description mentions neither parameter. It does not explain that repo_path specifies the repository and message provides the commit message, leaving both required parameters completely undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Records changes to the repository' essentially restates what the tool name git_commit already implies, rather than specifying a verb and resource with distinguishing detail. It does not mention that it creates a commit from staged changes using the provided message, so an agent cannot easily differentiate it from sibling tools like git_add or git_reset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives. It does not state that changes must be staged first, nor does it mention any prerequisites or relationship to sibling tools such as git_add or git_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_create_branchC
Creates a new branch from an optional base branch or commit
| Name | Required | Description | Default |
|---|---|---|---|
| repo_path | Yes | ||
| base_branch | No | Branch, tag or commit SHA to create the branch from. Defaults to the current branch, or to the current commit when HEAD is detached | |
| branch_name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, so the safety profile is covered. The description adds nothing beyond that: it doesn't say whether HEAD moves to the new branch, what happens if the branch already exists, or whether the working tree is touched — the exact behavioral facts an agent needs for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is terse without being padded, though it is arguably under-specified rather than truly concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a non-idempotent mutation with no output schema and two undocumented parameters, the description leaves out the essentials: whether the branch is checked out, behavior on existing branch names, and what the response reports. Only the base_branch semantics are covered, and those come from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%; base_branch is well documented in the schema, but repo_path and branch_name have no description in either place. The description doesn't compensate — it says nothing about what repo_path should point to or any constraints on branch_name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (creates a branch) and adds the important detail that the base can be a branch or commit. It doesn't explicitly distinguish itself from siblings like git_branch (likely listing) or git_checkout, leaving that inference to the agent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus git_branch or git_checkout, nor whether the new branch becomes the active one. The agent must guess whether this behaves like 'git branch <name>' or 'git checkout -b'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_diffBRead-onlyIdempotent
Shows differences between branches or commits, or across a revision range (main..feature, main...feature)
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| repo_path | Yes | ||
| context_lines | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds nothing beyond that about output format, size of diffs, or behavior on missing refs; with annotations carrying the safety burden, this is adequate but thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single well-formed sentence with the core capability front-loaded and the revision-range syntax appended as a useful clarification. No filler, though the parenthetical could be tightened further.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter read-only inspection tool with no output schema, the description covers the essential purpose and target syntax. It leaves gaps on repo_path expectations, the meaning/effect of context_lines, and how this differs from staged/unstaged diff siblings, so an agent still needs to inspect the schema and guess at selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It partially does: the 'main..feature' and 'main...feature' examples clarify the 'target' parameter's syntax and the two-dot/three-dot distinction, which the schema does not convey. However, 'repo_path' and 'context_lines' (including its default of 3) receive no explanation, leaving roughly a third of the parameters undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Uses a specific verb ('Shows differences') plus resource ('branches or commits', revision ranges) and gives concrete target syntax examples, so the agent knows exactly what the tool returns conceptually. It does not explicitly distinguish itself from the sibling git_diff_staged and git_diff_unstaged, which is the only thing separating it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus git_diff_staged, git_diff_unstaged, git_show, or git_log, all of which overlap in the diff/inspection space. The agent must infer the selection rule from the description alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_diff_stagedBRead-onlyIdempotent
Shows changes that are staged for commit
| Name | Required | Description | Default |
|---|---|---|---|
| repo_path | Yes | ||
| context_lines | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and a closed world, so the safety profile is fully covered without the description. The description adds no further behavior (output format, behavior with nothing staged, pagination), so it is adequate but contributes little.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short, front-loaded sentence with zero filler. It is appropriately sized, though it is so terse that it omits useful detail rather than trimming waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only diff tool with full annotation coverage and no output schema, the essentials are inferable, but the description never mentions what the diff looks like, how paths are interpreted, or what happens when nothing is staged. Minimum viable rather than complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for both parameters, so the description must compensate and does not: neither repo_path nor context_lines (default 3) is explained, and there is no hint about path format or what context lines do. Only the obvious reading of the names carries any meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Shows') and resource ('changes that are staged for commit'), which is precise enough to separate it from git_diff_unstaged by the staged/unstaged qualifier. It does not explicitly name the sibling, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use statement, no prerequisite (e.g. must have staged changes), and no mention of alternatives like git_diff_unstaged or git_status. The 'staged for commit' phrasing faintly implies a pre-commit review context, but nothing is stated explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_diff_unstagedBRead-onlyIdempotent
Shows changes in the working directory that are not yet staged
| Name | Required | Description | Default |
|---|---|---|---|
| repo_path | Yes | ||
| context_lines | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so the safety profile is fully covered elsewhere. The description adds only the scoping qualifier ('working directory, not staged'); it says nothing about output format, whether context_lines truncates output, or behavior on a clean tree. With annotations carrying the load, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the defining scope constraint appears immediately. It could have used a few more words productively (alternatives, parameters) but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, non-destructive diff tool with complete annotations and no output schema, the purpose statement is sufficient to call it correctly. However, the entirely undocumented parameters (repo_path required, context_lines default) leave a real gap that a slightly longer description could have closed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% — neither repo_path nor context_lines has any documentation in the schema — and the description mentions no parameters at all. It does not explain that repo_path is the repository to inspect or what context_lines controls, so it fails to compensate for the coverage gap, though both parameters are conceptually self-explanatory to a git-literate agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Shows') plus a precise resource scope ('changes in the working directory that are not yet staged'), which implicitly separates it from git_diff_staged and git_diff. It is clear, but it never names the sibling it is contrasted with, so differentiation requires the agent to reason about the git workflow rather than being told.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The scope phrase 'not yet staged' implies when this tool is appropriate, but there is no explicit when-to-use guidance, no mention of git_diff_staged or git_diff as alternatives, and no prerequisite (e.g. valid repo_path). Usage is inferable but not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_logCRead-onlyIdempotent
Shows the commit logs
| Name | Required | Description | Default |
|---|---|---|---|
| max_count | No | ||
| repo_path | Yes | ||
| end_timestamp | No | 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') | |
| start_timestamp | No | 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') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds nothing beyond that — no ordering, no default limit behavior, no filtering semantics — so it earns no credit for extra disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short sentence with no filler, which is structurally clean, but the brevity reflects under-specification rather than disciplined concision. Nothing is front-loaded because there is nothing else to load.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter tool with a defaulted max_count, timestamp filtering, and no output schema, five words are far from sufficient. The agent lacks any sense of what the log entries contain, their ordering, or how the filters interact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%: start_timestamp and end_timestamp are well documented in the schema, but max_count (default 10) and repo_path have no descriptions anywhere. The description does nothing to compensate for those gaps, so it falls below the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a verb ('Shows') and a resource ('commit logs'), so the basic operation is inferable, but it essentially restates the tool name git_log and offers no differentiation from siblings like git_show or git_diff. An agent cannot tell from this text how it relates to those alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of alternatives such as git_show for inspecting a single commit. The agent must infer usage purely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_mergeAIdempotent
Merges a branch into the current branch. Fast-forward only unless fast_forward_only is false; refuses a dirty working tree, and aborts a merge that conflicts, leaving the repository unchanged
| Name | Required | Description | Default |
|---|---|---|---|
| repo_path | Yes | ||
| source_branch | Yes | Branch, tag or commit to merge into the current branch | |
| fast_forward_only | No | Only fast-forward, failing if the branches have diverged. False allows a merge commit |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), and the description adds real value beyond them: it discloses that a dirty working tree is refused, that conflicting merges abort, and that the repository is left unchanged on failure. It stops short of describing the success state in detail (index update, merge commit creation beyond the fast_forward_only note) and says nothing about the returned result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence with the core action front-loaded and the conditional/failure behavior following immediately; no filler, and each clause carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter mutation tool with no output schema, the description covers the critical behavioral risks (dirty tree refusal, conflict abort, unchanged repo). The remaining gap is minor: repo_path's expected value and what the tool returns on success are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: source_branch and fast_forward_only are already documented in the schema, and repo_path is undocumented in both places. The description reinforces fast_forward_only's meaning (default fast-forward, false allows divergence) but adds no new syntax or format detail, so the schema is still doing most of the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ("Merges a branch into the current branch") and names the target scope explicitly, so an agent can distinguish it from siblings like git_checkout or git_create_branch without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the operation (merge a branch when you want its commits on the current branch), and the default fast-forward behavior is stated, but there is no explicit when-to-use/when-not guidance and no mention of alternatives such as rebasing or checking out before merging.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_remoteARead-onlyIdempotent
Lists the repository's remotes with their fetch and push URLs, like git remote -v. Credentials embedded in a URL are shown as
| Name | Required | Description | Default |
|---|---|---|---|
| repo_path | Yes | The path to the Git repository. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds genuinely new behavioral detail beyond them: what the output contains (fetch and push URLs) and that credentials embedded in URLs are masked as <redacted>, which matters for how an agent interprets results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with no filler: the first states what is listed, the second discloses the redaction behavior. The core purpose is front-loaded and the caveat follows logically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description properly compensates by stating what is returned, and it flags the redaction behavior an agent would otherwise misinterpret. For a single-parameter read-only tool, nothing an agent needs to call and interpret it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter at 100% schema coverage, so the schema already documents `repo_path` as 'The path to the Git repository.' The description adds nothing further about the parameter, which is acceptable given the schema does the work, but it means no extra meaning is contributed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs the specific verb 'lists' with the precise resource 'the repository's remotes with their fetch and push URLs,' and anchors it to a well-known equivalent (`git remote -v`). That framing makes it unmistakably distinct from every sibling tool, which all concern diffs, commits, branches, merges and logs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The `git remote -v` analogy gives an agent a clear mental model of when this tool applies (inspecting configured remotes), and no alternatives among the siblings serve that purpose. It stops short of explicit when-not guidance, but there is little ambiguity to resolve for a single-purpose read tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_resetBDestructiveIdempotent
Unstages all staged changes
| Name | Required | Description | Default |
|---|---|---|---|
| repo_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description contributes one real behavioral fact - that the reset is unscoped ('all') and index-only - but says nothing about whether working-tree edits are preserved or how that differs from a hard reset.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single five-word clause with zero filler and the scope caveat ('all') front-loaded. It is efficient, though so terse that it borders on under-specification rather than crispness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool this is roughly the minimum viable: the effect on the index is stated and annotations cover safety. Missing is any hint about repo_path's expected form and whether unstaging leaves working-tree changes intact.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description never mentions repo_path, so nothing compensates for the undocumented parameter. The name 'repo_path' is fairly intuitive, which keeps this above a 1, but format or example guidance is absent from both sources.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('unstages ... staged changes') and makes the 'all' scope explicit, so the agent knows it cannot be limited to one file. It does not name or contrast itself with siblings like git_add or git_diff_staged, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to reach for this tool versus git_add, git_diff_staged, or a hard reset, and no exclusions or prerequisites. Usage must be inferred entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_showBRead-onlyIdempotent
Shows the contents of a commit, or of a file or directory given as :
| Name | Required | Description | Default |
|---|---|---|---|
| revision | Yes | ||
| repo_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully covered by structured data. The description adds the useful `<revision>:<path>` addressing form, a genuinely behavioral detail, but says nothing about output shape (diff vs. blob vs. metadata) or how large/binary content is handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. The verb leads and the two scoping modes (whole commit vs. sub-path) follow immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With safety annotations present and no output schema, the remaining burden is explaining what comes back and how args combine. The description covers the two addressing modes but leaves 'repo_path' unexplained and gives no hint of the return format, so it is adequate but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for two parameters, so the description carries the burden. It clarifies the `<revision>:<path>` syntax for 'revision', which the bare schema string type does not, but 'repo_path' is left completely undocumented in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Shows') and resource ('contents of a commit, or of a file or directory'), making it clear this is an inspection tool. It separates itself implicitly from git_diff/git_log by scoping to a named revision, though it never names a sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance and no mention of alternatives like git_log or git_diff. An agent must infer from the resource scope alone that this is the tool for reading historical content rather than working-tree changes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
git_statusBRead-onlyIdempotent
Shows the working tree status
| Name | Required | Description | Default |
|---|---|---|---|
| repo_path | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered without the description. The description adds only a minimal restatement of scope ('working tree'), giving no insight into what the output contains or whether it reflects staged vs unstaged state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short, front-loaded sentence with no filler. It is efficient, though its brevity contributes to the gaps in the other dimensions rather than being purely a virtue.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With strong annotations covering safety and no output schema to explain, the definition is nearly complete for a simple read tool. The remaining gap is the undocumented required repo_path parameter, which an agent must guess at.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single parameter repo_path is entirely undocumented in both schema and description. The description says nothing about how the repository location is specified, so an agent gets no help on the one required input.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Shows') and resource ('working tree status'), which an agent can map directly onto git status. It does not distinguish itself from siblings like git_diff_unstaged or git_diff, but each sibling is semantically distinct enough that confusion is unlikely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this versus git_diff or git_diff_staged, nor any note about prerequisites. The agent is left to infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v2.3.0- Added
git_merge - Added
git_remote
1 tool update
v2.2.0- Changed
git_create_branch1 field changed- added
Input schema / properties / base_branch / descriptionAdded value: +"Branch, tag or commit SHA to create the branch from. Defaults to the current branch, or to the current commit when HEAD is detached"
12 tool updates
v2.0.0- Changed
git_add1 field changed- changed
Input schema / titlePrevious value: -"GitAdd"New value: +"addArguments"
- Changed
git_branch1 field changed- changed
Input schema / titlePrevious value: -"GitBranch"New value: +"branchArguments"
- Changed
git_checkout1 field changed- changed
Input schema / titlePrevious value: -"GitCheckout"New value: +"checkoutArguments"
- Changed
git_commit1 field changed- changed
Input schema / titlePrevious value: -"GitCommit"New value: +"commitArguments"
- Changed
git_create_branch1 field changed- changed
Input schema / titlePrevious value: -"GitCreateBranch"New value: +"create_branchArguments"
- Changed
git_diff1 field changed- changed
Input schema / titlePrevious value: -"GitDiff"New value: +"diffArguments"
- Changed
git_diff_staged1 field changed- changed
Input schema / titlePrevious value: -"GitDiffStaged"New value: +"diff_stagedArguments"
- Changed
git_diff_unstaged1 field changed- changed
Input schema / titlePrevious value: -"GitDiffUnstaged"New value: +"diff_unstagedArguments"
- Changed
git_log1 field changed- changed
Input schema / titlePrevious value: -"GitLog"New value: +"logArguments"
- Changed
git_reset1 field changed- changed
Input schema / titlePrevious value: -"GitReset"New value: +"resetArguments"
- Changed
git_show1 field changed- changed
Input schema / titlePrevious value: -"GitShow"New value: +"showArguments"
- Changed
git_status1 field changed- changed
Input schema / titlePrevious value: -"GitStatus"New value: +"statusArguments"
1 tool update
- Changed
git_add1 field changed- added
Input schema / properties / files / minItemsAdded value: +1
12 tool updates
v1.0.0- Added
git_add - Added
git_branch - Added
git_checkout - Added
git_commit - Added
git_create_branch - Added
git_diff - Added
git_diff_staged - Added
git_diff_unstaged - Added
git_log - Added
git_reset - Added
git_show - Added
git_status
TDQS
Scored across 14 tools
Each tool maps to a fairly distinct git operation, and the descriptions clarify the main risk area: the three diff tools (git_diff, git_diff_staged, git_diff_unstaged). Those three could still be confused by an agent since they share the diff verb, but the descriptions and scoped parameters make the boundaries clear enough. git_branch vs git_create_branch and git_checkout are also well separated.
Every tool uses a uniform git_ prefix with snake_case, mirroring the git CLI (git_commit, git_add, git_merge, git_status). Mixed noun/verb endings (git_status vs git_commit) follow the git convention and remain predictable. No style deviations.
14 tools is a well-scoped size for a git server, each covering a recognized git subcommand. No redundant or filler tools; the count matches the breadth of the domain.
Covers staging, committing, diffing, branching, merging, and inspection well, but there is no push, pull, fetch, or clone, which are core lifecycle operations for working with remotes. git_remote only lists remotes, creating a dead end for any remote-sync workflow an agent might attempt.
Maintenance
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
An MCP server that gives your AI access to the source code and docs of all public github repos
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
A Model Context Protocol server for Wix AI tools
Related MCP Servers
- AlicenseAqualityBmaintenanceA Model Context Protocol server that enables Large Language Models to interact with Git repositories through a robust API, supporting operations like repository initialization, cloning, file staging, committing, and branch management.284,044 npm245Apache 2.0
- FlicenseNot gradedqualityNot gradedmaintenanceModel Context Protocol server that enables interaction with GitHub repositories, issues, pull requests, and search functionality through natural language.1-
- AlicenseBqualityDmaintenanceA Model Context Protocol server that enables LLMs to interact with Git repositories, providing tools to read, search, and manipulate Git repositories through commands like status, diff, commit, and branch management.12MIT
- AlicenseCqualityBmaintenanceA Model Context Protocol server that enables LLMs to interact with Git repositories, providing tools to read, search, and manipulate Git repositories through commands like status, diff, commit, and branch operations.224MIT