diff --git a/src/git/README.md b/src/git/README.md index caf01294..c7862502 100644 --- a/src/git/README.md +++ b/src/git/README.md @@ -26,34 +26,41 @@ Please note that mcp-server-git is currently in early development. The functiona - `repo_path` (string): Path to Git repository - Returns: Diff output of staged changes -4. `git_commit` +4. `git_diff` + - Shows differences between branches or commits + - Inputs: + - `repo_path` (string): Path to Git repository + - `target` (string): Target branch or commit to compare with + - Returns: Diff output comparing current state with target + +5. `git_commit` - Records changes to the repository - Inputs: - `repo_path` (string): Path to Git repository - `message` (string): Commit message - Returns: Confirmation with new commit hash -5. `git_add` +6. `git_add` - Adds file contents to the staging area - Inputs: - `repo_path` (string): Path to Git repository - `files` (string[]): Array of file paths to stage - Returns: Confirmation of staged files -6. `git_reset` +7. `git_reset` - Unstages all staged changes - Input: - `repo_path` (string): Path to Git repository - Returns: Confirmation of reset operation -7. `git_log` +8. `git_log` - Shows the commit logs - Inputs: - `repo_path` (string): Path to Git repository - `max_count` (number, optional): Maximum number of commits to show (default: 10) - Returns: Array of commit entries with hash, author, date, and message -8. `git_create_branch` +9. `git_create_branch` - Creates a new branch - Inputs: - `repo_path` (string): Path to Git repository @@ -66,7 +73,7 @@ Please note that mcp-server-git is currently in early development. The functiona ### Using uv (recommended) When using [`uv`](https://docs.astral.sh/uv/) no specific installation is needed. We will -use [`uvx`](https://docs.astral.sh/uv/guides/tools/) to directly run *mcp-server-git*. +use [`uvx`](https://docs.astral.sh/uv/guides/tools/) to directly run _mcp-server-git_. ### Using PIP @@ -99,6 +106,7 @@ Add this to your `claude_desktop_config.json`: } } ``` +
@@ -112,6 +120,7 @@ Add this to your `claude_desktop_config.json`: } } ``` +
### Usage with [Zed](https://github.com/zed-industries/zed) @@ -131,6 +140,7 @@ Add to your Zed settings.json: } ], ``` +
@@ -146,6 +156,7 @@ Add to your Zed settings.json: } }, ``` +
## Debugging diff --git a/src/git/src/mcp_server_git/server.py b/src/git/src/mcp_server_git/server.py index 02fae584..ded3d41d 100644 --- a/src/git/src/mcp_server_git/server.py +++ b/src/git/src/mcp_server_git/server.py @@ -24,6 +24,10 @@ class GitDiffUnstaged(BaseModel): class GitDiffStaged(BaseModel): repo_path: str +class GitDiff(BaseModel): + repo_path: str + target: str + class GitCommit(BaseModel): repo_path: str message: str @@ -48,6 +52,7 @@ class GitTools(str, Enum): STATUS = "git_status" DIFF_UNSTAGED = "git_diff_unstaged" DIFF_STAGED = "git_diff_staged" + DIFF = "git_diff" COMMIT = "git_commit" ADD = "git_add" RESET = "git_reset" @@ -63,6 +68,9 @@ def git_diff_unstaged(repo: git.Repo) -> str: def git_diff_staged(repo: git.Repo) -> str: return repo.git.diff("--cached") +def git_diff(repo: git.Repo, target: str) -> str: + return repo.git.diff(target) + def git_commit(repo: git.Repo, message: str) -> str: commit = repo.index.commit(message) return f"Changes committed successfully with hash {commit.hexsha}" @@ -127,6 +135,11 @@ async def serve(repository: Path | None) -> None: description="Shows changes that are staged for commit", inputSchema=GitDiffStaged.schema(), ), + Tool( + name=GitTools.DIFF, + description="Shows differences between branches or commits", + inputSchema=GitDiff.schema(), + ), Tool( name=GitTools.COMMIT, description="Records changes to the repository", @@ -210,6 +223,13 @@ async def serve(repository: Path | None) -> None: text=f"Staged changes:\n{diff}" )] + case GitTools.DIFF: + diff = git_diff(repo, arguments["target"]) + return [TextContent( + type="text", + text=f"Diff with {arguments['target']}:\n{diff}" + )] + case GitTools.COMMIT: result = git_commit(repo, arguments["message"]) return [TextContent( @@ -254,4 +274,4 @@ async def serve(repository: Path | None) -> None: options = server.create_initialization_options() async with stdio_server() as (read_stream, write_stream): - await server.run(read_stream, write_stream, options, raise_exceptions=True) + await server.run(read_stream, write_stream, options, raise_exceptions=True) \ No newline at end of file