diff --git a/src/git/README.md b/src/git/README.md index 6aaf81ac65..e268ed3f4f 100644 --- a/src/git/README.md +++ b/src/git/README.md @@ -16,14 +16,16 @@ Please note that mcp-server-git is currently in early development. The functiona 2. `git_diff_unstaged` - Shows changes in working directory not yet staged - - Input: + - Inputs: - `repo_path` (string): Path to Git repository + - `context_lines` (number, optional): Number of context lines to show (default: 3) - Returns: Diff output of unstaged changes 3. `git_diff_staged` - Shows changes that are staged for commit - - Input: + - Inputs: - `repo_path` (string): Path to Git repository + - `context_lines` (number, optional): Number of context lines to show (default: 3) - Returns: Diff output of staged changes 4. `git_diff` @@ -31,6 +33,7 @@ Please note that mcp-server-git is currently in early development. The functiona - Inputs: - `repo_path` (string): Path to Git repository - `target` (string): Target branch or commit to compare with + - `context_lines` (number, optional): Number of context lines to show (default: 3) - Returns: Diff output comparing current state with target 5. `git_commit` diff --git a/src/git/src/mcp_server_git/server.py b/src/git/src/mcp_server_git/server.py index c6a346cfef..a1b5687132 100644 --- a/src/git/src/mcp_server_git/server.py +++ b/src/git/src/mcp_server_git/server.py @@ -15,18 +15,24 @@ import git from pydantic import BaseModel +# Default number of context lines to show in diff output +DEFAULT_CONTEXT_LINES = 3 + class GitStatus(BaseModel): repo_path: str class GitDiffUnstaged(BaseModel): repo_path: str + context_lines: int = DEFAULT_CONTEXT_LINES class GitDiffStaged(BaseModel): repo_path: str + context_lines: int = DEFAULT_CONTEXT_LINES class GitDiff(BaseModel): repo_path: str target: str + context_lines: int = DEFAULT_CONTEXT_LINES class GitCommit(BaseModel): repo_path: str @@ -76,14 +82,14 @@ class GitTools(str, Enum): def git_status(repo: git.Repo) -> str: return repo.git.status() -def git_diff_unstaged(repo: git.Repo) -> str: - return repo.git.diff() +def git_diff_unstaged(repo: git.Repo, context_lines: int = DEFAULT_CONTEXT_LINES) -> str: + return repo.git.diff(f"--unified={context_lines}") -def git_diff_staged(repo: git.Repo) -> str: - return repo.git.diff("--cached") +def git_diff_staged(repo: git.Repo, context_lines: int = DEFAULT_CONTEXT_LINES) -> str: + return repo.git.diff(f"--unified={context_lines}", "--cached") -def git_diff(repo: git.Repo, target: str) -> str: - return repo.git.diff(target) +def git_diff(repo: git.Repo, target: str, context_lines: int = DEFAULT_CONTEXT_LINES) -> str: + return repo.git.diff(f"--unified={context_lines}", target) def git_commit(repo: git.Repo, message: str) -> str: commit = repo.index.commit(message) @@ -278,21 +284,21 @@ async def call_tool(name: str, arguments: dict) -> list[TextContent]: )] case GitTools.DIFF_UNSTAGED: - diff = git_diff_unstaged(repo) + diff = git_diff_unstaged(repo, arguments.get("context_lines", DEFAULT_CONTEXT_LINES)) return [TextContent( type="text", text=f"Unstaged changes:\n{diff}" )] case GitTools.DIFF_STAGED: - diff = git_diff_staged(repo) + diff = git_diff_staged(repo, arguments.get("context_lines", DEFAULT_CONTEXT_LINES)) return [TextContent( type="text", text=f"Staged changes:\n{diff}" )] case GitTools.DIFF: - diff = git_diff(repo, arguments["target"]) + diff = git_diff(repo, arguments["target"], arguments.get("context_lines", DEFAULT_CONTEXT_LINES)) return [TextContent( type="text", text=f"Diff with {arguments['target']}:\n{diff}"