feat(mcp_server_git): Add support for configurable GIT_DIFF_CONTEXT_LINES

- Introduced `GIT_DIFF_CONTEXT_LINES` environment variable to customize the number of context lines shown in git diff output.
- Updated `git_diff_unstaged`, `git_diff_staged`, and `git_diff` functions to utilize the new context line setting.
- Enhanced README.md to document the new environment variable and its implications.
This commit is contained in:
Matthew McEachen
2025-04-08 15:41:41 -07:00
parent e8f0b15f41
commit 1ac3c1da59
2 changed files with 25 additions and 4 deletions

View File

@@ -6,6 +6,12 @@ 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`
@@ -119,7 +125,10 @@ Add this to your `claude_desktop_config.json`:
"mcpServers": {
"git": {
"command": "uvx",
"args": ["mcp-server-git", "--repository", "path/to/git/repo"]
"args": ["mcp-server-git", "--repository", "path/to/git/repo"],
"env": {
"GIT_DIFF_CONTEXT_LINES": "10"
}
}
}
```

View File

@@ -1,5 +1,6 @@
import logging
from pathlib import Path
import os
from typing import Sequence
from mcp.server import Server
from mcp.server.session import ServerSession
@@ -73,17 +74,28 @@ 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()
return repo.git.diff(get_context_lines())
def git_diff_staged(repo: git.Repo) -> str:
return repo.git.diff("--cached")
return repo.git.diff(get_context_lines(), "--cached")
def git_diff(repo: git.Repo, target: str) -> str:
return repo.git.diff(target)
return repo.git.diff(get_context_lines(), target)
def git_commit(repo: git.Repo, message: str) -> str:
commit = repo.index.commit(message)