Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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