Merge pull request #1326 from mceachen/main

feat(mcp-server-git): Add context_lines to git_diff* tools
This commit is contained in:
Ola Hungerford 2025-06-24 21:07:31 -07:00 • committed by GitHub
commit 1252f484b9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 20 additions and 11 deletions

View file

@ -16,14 +16,16 @@ Please note that mcp-server-git is currently in early development. The functiona
2. `git_diff_unstaged` 2. `git_diff_unstaged`
- Shows changes in working directory not yet staged - Shows changes in working directory not yet staged
- Input: - Inputs:
- `repo_path` (string): Path to Git repository - `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 - Returns: Diff output of unstaged changes
3. `git_diff_staged` 3. `git_diff_staged`
- Shows changes that are staged for commit - Shows changes that are staged for commit
- Input: - Inputs:
- `repo_path` (string): Path to Git repository - `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 - Returns: Diff output of staged changes
4. `git_diff` 4. `git_diff`
@ -31,6 +33,7 @@ Please note that mcp-server-git is currently in early development. The functiona
- Inputs: - Inputs:
- `repo_path` (string): Path to Git repository - `repo_path` (string): Path to Git repository
- `target` (string): Target branch or commit to compare with - `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 - Returns: Diff output comparing current state with target
5. `git_commit` 5. `git_commit`

View file

@ -15,18 +15,24 @@ from enum import Enum
import git import git
from pydantic import BaseModel from pydantic import BaseModel
# Default number of context lines to show in diff output
DEFAULT_CONTEXT_LINES = 3
class GitStatus(BaseModel): class GitStatus(BaseModel):
repo_path: str repo_path: str
class GitDiffUnstaged(BaseModel): class GitDiffUnstaged(BaseModel):
repo_path: str repo_path: str
context_lines: int = DEFAULT_CONTEXT_LINES
class GitDiffStaged(BaseModel): class GitDiffStaged(BaseModel):
repo_path: str repo_path: str
context_lines: int = DEFAULT_CONTEXT_LINES
class GitDiff(BaseModel): class GitDiff(BaseModel):
repo_path: str repo_path: str
target: str target: str
context_lines: int = DEFAULT_CONTEXT_LINES
class GitCommit(BaseModel): class GitCommit(BaseModel):
repo_path: str repo_path: str
@ -76,14 +82,14 @@ class GitTools(str, Enum):
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, context_lines: int = DEFAULT_CONTEXT_LINES) -> str:
return repo.git.diff() return repo.git.diff(f"--unified={context_lines}")
def git_diff_staged(repo: git.Repo) -> str: def git_diff_staged(repo: git.Repo, context_lines: int = DEFAULT_CONTEXT_LINES) -> str:
return repo.git.diff("--cached") return repo.git.diff(f"--unified={context_lines}", "--cached")
def git_diff(repo: git.Repo, target: str) -> str: def git_diff(repo: git.Repo, target: str, context_lines: int = DEFAULT_CONTEXT_LINES) -> str:
return repo.git.diff(target) return repo.git.diff(f"--unified={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)
@ -278,21 +284,21 @@ async def serve(repository: Path | None) -> None:
)] )]
case GitTools.DIFF_UNSTAGED: case GitTools.DIFF_UNSTAGED:
diff = git_diff_unstaged(repo) diff = git_diff_unstaged(repo, arguments.get("context_lines", DEFAULT_CONTEXT_LINES))
return [TextContent( return [TextContent(
type="text", type="text",
text=f"Unstaged changes:\n{diff}" text=f"Unstaged changes:\n{diff}"
)] )]
case GitTools.DIFF_STAGED: case GitTools.DIFF_STAGED:
diff = git_diff_staged(repo) diff = git_diff_staged(repo, arguments.get("context_lines", DEFAULT_CONTEXT_LINES))
return [TextContent( return [TextContent(
type="text", type="text",
text=f"Staged changes:\n{diff}" text=f"Staged changes:\n{diff}"
)] )]
case GitTools.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( return [TextContent(
type="text", type="text",
text=f"Diff with {arguments['target']}:\n{diff}" text=f"Diff with {arguments['target']}:\n{diff}"