-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Always include SHA in get_file_contents responses #676
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Always include SHA in get_file_contents responses #676
Conversation
…ub#595) Enhance get_file_contents to include SHA information without changing the existing MCP server response format. Changes: - Add Contents API call to retrieve SHA before fetching raw content - Include SHA in resourceURI (repo://owner/repo/sha/{SHA}/contents/path) - Add SHA to success messages - Update tests to verify SHA inclusion - Maintain original behavior: text files return raw text, binaries return base64 This preserves backward compatibility while providing SHA information for better file versioning support. Closes github#595
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull Request Overview
This PR enhances the get_file_contents
tool to always include SHA information in responses by adding a preliminary Contents API call before fetching raw content. This provides a simpler, backward-compatible solution that automatically includes SHA data without requiring parameter changes.
Key changes:
- Added Contents API call to retrieve file metadata (including SHA) before fetching raw content
- Updated resource URI format to include SHA instead of branch reference
- Enhanced success messages to include SHA information
Reviewed Changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
File | Description |
---|---|
pkg/github/repositories.go | Added Contents API call to retrieve SHA before raw content fetch and updated URI/message formatting |
pkg/github/repositories_test.go | Updated test mocks to include Contents API responses and adjusted expected URIs to use SHA format |
Comments suppressed due to low confidence (1)
pkg/github/repositories.go:513
- The variable name 'errContents' is inconsistent with Go naming conventions. It should be 'err' or follow the existing pattern used elsewhere in the function.
fileContent, _, respContents, errContents := client.Repositories.GetContents(ctx, owner, repo, path, opts)
Ensure response body is properly closed even when an error occurs by moving the defer statement before the error check. This prevents potential resource leaks when the Contents API returns an error with a non-nil response. Changes: - Move defer respContents.Body.Close() before error checking - Rename errContents to err for consistency - Add nil check for respContents before attempting to close body This follows Go best practices for handling HTTP responses and prevents potential goroutine/memory leaks.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you so much @yonaka15 for reworking this based on our feedback. It's great to see this working!
Screenshot
get_file_contents being used before create_or_update_file to get the blob SHA of file to update
My only minor comments (which I will action):
- Changing the resource URI is not necessary. I will revert this.
- Using the contents API to get the file's blob SHA is not optimal. I will look into using a GraphQL query to get just the SHA.
Thank you again, I'm excited to get your work merged :)
The GraphQL query was slow so I've stuck with your original method using the contents method of the GitHub API. GraphQL (~350ms)You can run the following query in https://docs.github.com/en/graphql/overview/explorer and see the response time in the network panel
Contents (~30ms)https://api.github.com/repos/github/github-mcp-server/contents/README.md
Docs: https://docs.github.com/en/rest/repos/contents?apiVersion=2022-11-28#get-repository-content Raw (~30ms)
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice one! The approach to contents api vs raw api vs graphql makes sense to me!
Summary
This PR provides a simpler solution to #595 by always including SHA information in the
get_file_contents
tool responses without requiring any parameter changes.Unlike #605 which adds an
include_sha
parameter, this approach transparently enhances all responses with SHA information while preserving the existing MCP server behavior.Approach
The implementation adds a preliminary Contents API call to retrieve SHA information before fetching the actual content:
This dual-API approach ensures:
create_or_update_file
operationsChanges
pkg/github/repositories.go
to add Contents API call before Raw Content APIpkg/github/repositories_test.go
to include Contents API mocksBenefits over #605
include_sha=true
Testing
Verified with both unit tests and MCP Inspector against real repositories:
Closes #595