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
commit 1ac3c1da59
No known key found for this signature in database
GPG key ID: CFD5233EAB7B1685
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. 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 ### Tools
1. `git_status` 1. `git_status`
@ -119,7 +125,10 @@ Add this to your `claude_desktop_config.json`:
"mcpServers": { "mcpServers": {
"git": { "git": {
"command": "uvx", "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 import logging
from pathlib import Path from pathlib import Path
import os
from typing import Sequence from typing import Sequence
from mcp.server import Server from mcp.server import Server
from mcp.server.session import ServerSession from mcp.server.session import ServerSession
@ -73,17 +74,28 @@ class GitTools(str, Enum):
SHOW = "git_show" SHOW = "git_show"
INIT = "git_init" 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: def git_status(repo: git.Repo) -> str:
return repo.git.status() return repo.git.status()
def git_diff_unstaged(repo: git.Repo) -> str: 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: 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: 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: def git_commit(repo: git.Repo, message: str) -> str:
commit = repo.index.commit(message) commit = repo.index.commit(message)