Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions pkg/github/repository_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,16 @@ func GetRepositoryResourcePrContent(t translations.TranslationHelperFunc) invent

// repositoryResourceContentsHandlerFunc returns a ResourceHandlerFunc that creates handlers on-demand.
func repositoryResourceContentsHandlerFunc(resourceURITemplate *uritemplate.Template) inventory.ResourceHandlerFunc {
return func(deps any) mcp.ResourceHandler {
d := deps.(ToolDependencies)
return RepositoryResourceContentsHandler(d, resourceURITemplate)
return func(_ any) mcp.ResourceHandler {
return RepositoryResourceContentsHandler(resourceURITemplate)
}
}

// RepositoryResourceContentsHandler returns a handler function for repository content requests.
func RepositoryResourceContentsHandler(deps ToolDependencies, resourceURITemplate *uritemplate.Template) mcp.ResourceHandler {
// It retrieves ToolDependencies from the context at call time via MustDepsFromContext.
func RepositoryResourceContentsHandler(resourceURITemplate *uritemplate.Template) mcp.ResourceHandler {
return func(ctx context.Context, request *mcp.ReadResourceRequest) (*mcp.ReadResourceResult, error) {
deps := MustDepsFromContext(ctx)
// Match the URI to extract parameters
uriValues := resourceURITemplate.Match(request.Params.URI)
if uriValues == nil {
Expand Down
47 changes: 24 additions & 23 deletions pkg/github/repository_resource_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func Test_repositoryResourceContents(t *testing.T) {
name string
mockedClient *http.Client
uri string
handlerFn func(deps ToolDependencies) mcp.ResourceHandler
handlerFn func() mcp.ResourceHandler
expectedResponseType resourceResponseType
expectError string
expectedResult *mcp.ReadResourceResult
Expand All @@ -41,8 +41,8 @@ func Test_repositoryResourceContents(t *testing.T) {
}),
}),
uri: "repo:///repo/contents/README.md",
handlerFn: func(deps ToolDependencies) mcp.ResourceHandler {
return RepositoryResourceContentsHandler(deps, repositoryResourceContentURITemplate)
handlerFn: func() mcp.ResourceHandler {
return RepositoryResourceContentsHandler(repositoryResourceContentURITemplate)
},
expectedResponseType: resourceResponseTypeText, // Ignored as error is expected
expectError: "owner is required",
Expand All @@ -57,8 +57,8 @@ func Test_repositoryResourceContents(t *testing.T) {
}),
}),
uri: "repo://owner//refs/heads/main/contents/README.md",
handlerFn: func(deps ToolDependencies) mcp.ResourceHandler {
return RepositoryResourceContentsHandler(deps, repositoryResourceBranchContentURITemplate)
handlerFn: func() mcp.ResourceHandler {
return RepositoryResourceContentsHandler(repositoryResourceBranchContentURITemplate)
},
expectedResponseType: resourceResponseTypeText, // Ignored as error is expected
expectError: "repo is required",
Expand All @@ -73,8 +73,8 @@ func Test_repositoryResourceContents(t *testing.T) {
}),
}),
uri: "repo://owner/repo/contents/data.png",
handlerFn: func(deps ToolDependencies) mcp.ResourceHandler {
return RepositoryResourceContentsHandler(deps, repositoryResourceContentURITemplate)
handlerFn: func() mcp.ResourceHandler {
return RepositoryResourceContentsHandler(repositoryResourceContentURITemplate)
},
expectedResponseType: resourceResponseTypeBlob,
expectedResult: &mcp.ReadResourceResult{
Expand All @@ -94,8 +94,8 @@ func Test_repositoryResourceContents(t *testing.T) {
}),
}),
uri: "repo://owner/repo/contents/README.md",
handlerFn: func(deps ToolDependencies) mcp.ResourceHandler {
return RepositoryResourceContentsHandler(deps, repositoryResourceContentURITemplate)
handlerFn: func() mcp.ResourceHandler {
return RepositoryResourceContentsHandler(repositoryResourceContentURITemplate)
},
expectedResponseType: resourceResponseTypeText,
expectedResult: &mcp.ReadResourceResult{
Expand All @@ -117,8 +117,8 @@ func Test_repositoryResourceContents(t *testing.T) {
}),
}),
uri: "repo://owner/repo/contents/pkg/github/actions.go",
handlerFn: func(deps ToolDependencies) mcp.ResourceHandler {
return RepositoryResourceContentsHandler(deps, repositoryResourceContentURITemplate)
handlerFn: func() mcp.ResourceHandler {
return RepositoryResourceContentsHandler(repositoryResourceContentURITemplate)
},
expectedResponseType: resourceResponseTypeText,
expectedResult: &mcp.ReadResourceResult{
Expand All @@ -138,8 +138,8 @@ func Test_repositoryResourceContents(t *testing.T) {
}),
}),
uri: "repo://owner/repo/refs/heads/main/contents/README.md",
handlerFn: func(deps ToolDependencies) mcp.ResourceHandler {
return RepositoryResourceContentsHandler(deps, repositoryResourceBranchContentURITemplate)
handlerFn: func() mcp.ResourceHandler {
return RepositoryResourceContentsHandler(repositoryResourceBranchContentURITemplate)
},
expectedResponseType: resourceResponseTypeText,
expectedResult: &mcp.ReadResourceResult{
Expand All @@ -159,8 +159,8 @@ func Test_repositoryResourceContents(t *testing.T) {
}),
}),
uri: "repo://owner/repo/refs/tags/v1.0.0/contents/README.md",
handlerFn: func(deps ToolDependencies) mcp.ResourceHandler {
return RepositoryResourceContentsHandler(deps, repositoryResourceTagContentURITemplate)
handlerFn: func() mcp.ResourceHandler {
return RepositoryResourceContentsHandler(repositoryResourceTagContentURITemplate)
},
expectedResponseType: resourceResponseTypeText,
expectedResult: &mcp.ReadResourceResult{
Expand All @@ -180,8 +180,8 @@ func Test_repositoryResourceContents(t *testing.T) {
}),
}),
uri: "repo://owner/repo/sha/abc123/contents/README.md",
handlerFn: func(deps ToolDependencies) mcp.ResourceHandler {
return RepositoryResourceContentsHandler(deps, repositoryResourceCommitContentURITemplate)
handlerFn: func() mcp.ResourceHandler {
return RepositoryResourceContentsHandler(repositoryResourceCommitContentURITemplate)
},
expectedResponseType: resourceResponseTypeText,
expectedResult: &mcp.ReadResourceResult{
Expand All @@ -206,8 +206,8 @@ func Test_repositoryResourceContents(t *testing.T) {
}),
}),
uri: "repo://owner/repo/refs/pull/42/head/contents/README.md",
handlerFn: func(deps ToolDependencies) mcp.ResourceHandler {
return RepositoryResourceContentsHandler(deps, repositoryResourcePrContentURITemplate)
handlerFn: func() mcp.ResourceHandler {
return RepositoryResourceContentsHandler(repositoryResourcePrContentURITemplate)
},
expectedResponseType: resourceResponseTypeText,
expectedResult: &mcp.ReadResourceResult{
Expand All @@ -226,8 +226,8 @@ func Test_repositoryResourceContents(t *testing.T) {
}),
}),
uri: "repo://owner/repo/contents/nonexistent.md",
handlerFn: func(deps ToolDependencies) mcp.ResourceHandler {
return RepositoryResourceContentsHandler(deps, repositoryResourceContentURITemplate)
handlerFn: func() mcp.ResourceHandler {
return RepositoryResourceContentsHandler(repositoryResourceContentURITemplate)
},
expectedResponseType: resourceResponseTypeText, // Ignored as error is expected
expectError: "404 Not Found",
Expand All @@ -242,15 +242,16 @@ func Test_repositoryResourceContents(t *testing.T) {
Client: client,
RawClient: mockRawClient,
}
handler := tc.handlerFn(deps)
ctx := ContextWithDeps(context.Background(), deps)
handler := tc.handlerFn()

request := &mcp.ReadResourceRequest{
Params: &mcp.ReadResourceParams{
URI: tc.uri,
},
}

resp, err := handler(context.TODO(), request)
resp, err := handler(ctx, request)

if tc.expectError != "" {
require.ErrorContains(t, err, tc.expectError)
Expand Down
Loading