feat: add get_file_blame tool for retrieving git blame information#1538
feat: add get_file_blame tool for retrieving git blame information#1538MayorFaj wants to merge 5 commits into
Conversation
There was a problem hiding this comment.
Pull request overview
This PR adds a new get_file_blame tool that enables users to retrieve git blame information for files in GitHub repositories using the GraphQL API. The implementation includes comprehensive test coverage, proper error handling, and complete documentation updates.
Key Changes
- Added
GetFileBlamefunction that queries GitHub's GraphQL API to retrieve blame information showing who last modified each line of a file - Integrated the new tool into the default toolset alongside other repository management tools
- Created comprehensive unit tests covering successful operations, error scenarios, and edge cases like missing default branches
Reviewed changes
Copilot reviewed 5 out of 5 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| pkg/github/repositories.go | Implements the GetFileBlame tool with GraphQL queries for default branch resolution and blame data retrieval, including proper type conversions and JSON response formatting |
| pkg/github/tools.go | Registers GetFileBlame in the DefaultToolsetGroup for availability in the standard tool collection |
| pkg/github/repositories_test.go | Adds comprehensive test coverage including tool schema validation, default branch handling, specific ref queries, and error scenarios |
| pkg/github/toolsnaps/get_file_blame.snap | Tool schema snapshot documenting the API surface with ReadOnly annotation |
| README.md | Documents the new tool with parameter descriptions and usage information |
1222293 to
8e494d9
Compare
|
Just wanted to add a +1 to this PR! 👍 Having a Thanks for the hard work! |
|
Hi @MayorFaj could you please resolve conflicts in this pr? :) |
# Conflicts: # docs/remote-server.md # pkg/github/repositories_test.go # pkg/github/tools.go
Hi @JoannaaKL , conflicts resolved |
JoannaaKL
left a comment
There was a problem hiding this comment.
Thanks for adding this tool — blame support is a great addition! I have a few concerns I'd love to see addressed:
-
Redundant GraphQL call for default branch: When
refis empty, there's a separate query just to fetch the default branch before the blame query. Please consider usingHEADas the expression or combining both into a single query to avoid the extra round-trip. -
No pagination or size limit: A blame response for a large file (thousands of lines) could produce a massive JSON payload that blows past MCP response size limits or LLM context windows. Please add some form of truncation or line-range filtering — other tools in this codebase handle pagination, and this one should too.
-
No validation that
objectresolved to a Commit: If therefexpression resolves to a Tree or Blob, the... on Commitfragment silently returns zero data and the tool returns an emptyrangesarray with no error. Let's add a nil/empty check on the commit object with a meaningful error message so users aren't left guessing. -
No validation on
pathinput: Thepathparameter is passed directly into the GraphQL query with no sanitization. Please add checks for empty strings, absolute paths, or path traversal patterns (../) — other tools in the codebase validate their path inputs. -
Inline struct types:
BlameRangeandBlameResultare defined inside the handler closure. Let's move these to package-level types, consistent with how other tools structure their response types — it makes them testable and reusable. -
agefield is opaque: Theageinteger from GitHub's GraphQL API represents relative age compared to other ranges, not an absolute value. Please add some documentation in the tool description or response so an LLM consuming this doesn't misinterpret it. -
Commit message not truncated: Full commit messages (including multi-line bodies) are included for every blame range. For a file with many ranges, this creates enormous redundant output — the same commit message repeated for every range it touches. Please consider including only the first line (subject), or deduplicating commits into a separate section.
-
e2e test changes are unrelated: The
e2e/e2e_test.gochanges (NewMCPServer→NewStdioMCPServer, addingVersion,Logger) look like merge conflict resolution artifacts. Let's clean these up with a rebase so the PR diff only contains blame-related changes. -
Missing newline at end of snap file:
get_file_blame.snapis missing a trailing newline — minor, but please add one to avoid noisy diffs later. -
No test for empty blame ranges: There's no test case for when the blame query returns successfully but with zero ranges (e.g., empty file). Please add one to verify the response structure is still valid in that case.
This pull request adds a new tool for retrieving git blame information for files in a GitHub repository, along with comprehensive tests and documentation updates. The main focus is on enabling users to see who last modified each line in a file, with support for specifying branches, tags, or commit SHAs.
New Git Blame Tool Integration
get_file_blametool to the codebase, which uses the GitHub GraphQL API to fetch blame information for a file, including author details, commit SHA, message, and line ranges. The tool supports specifying the repository owner, name, file path, and git reference, defaulting to the repository's default branch if not provided. (pkg/github/repositories.go)get_file_blametool in the default toolset group so it is available for use alongside other repository tools. (pkg/github/tools.go)Documentation and Tool Snapshots
README.mdto document the newget_file_blametool, including its parameters and usage.get_file_blamefor validation and testing purposes. (pkg/github/__toolsnaps__/get_file_blame.snap)Closes: #504