diff --git a/src/git/README.md b/src/git/README.md index 8f79a55a..8ef54b17 100644 --- a/src/git/README.md +++ b/src/git/README.md @@ -6,12 +6,6 @@ A Model Context Protocol server for Git repository interaction and automation. T 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. -### Environment Variables - -- `GIT_DIFF_CONTEXT_LINES`: Number of context lines to show in git diff output (default: 3). Increasing this value shows more surrounding code in diffs. - -> **⚠️ Warning:** Large context line values will consume more tokens and may reduce response relevance. Set this value carefully to balance context needs with token limits. - ### Tools 1. `git_status` @@ -22,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` @@ -37,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` @@ -125,10 +122,7 @@ Add this to your `claude_desktop_config.json`: "mcpServers": { "git": { "command": "uvx", - "args": ["mcp-server-git", "--repository", "path/to/git/repo"], - "env": { - "GIT_DIFF_CONTEXT_LINES": "10" - } + "args": ["mcp-server-git", "--repository", "path/to/git/repo"] } } ``` diff --git a/src/git/src/mcp_server_git/server.py b/src/git/src/mcp_server_git/server.py index c5ff011e..ed1f714b 100644 --- a/src/git/src/mcp_server_git/server.py +++ b/src/git/src/mcp_server_git/server.py @@ -16,18 +16,24 @@ from enum import Enum 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 @@ -74,28 +80,17 @@ class GitTools(str, Enum): SHOW = "git_show" INIT = "git_init" -# Default number of context lines if not specified in environment -DEFAULT_CONTEXT_LINES = 3 - -def get_context_lines() -> str: - """Get the number of context lines from environment variable or use default""" - try: - context_lines = int(os.environ.get('GIT_DIFF_CONTEXT_LINES', DEFAULT_CONTEXT_LINES)) - return f"--unified={context_lines}" - except ValueError: - return f"--unified={DEFAULT_CONTEXT_LINES}" - def git_status(repo: git.Repo) -> str: return repo.git.status() -def git_diff_unstaged(repo: git.Repo) -> str: - return repo.git.diff(get_context_lines()) +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(get_context_lines(), "--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(get_context_lines(), 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) @@ -290,21 +285,21 @@ async def serve(repository: Path | None) -> None: )] 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}"