diff --git a/README.md b/README.md index 624279927..b5f04f371 100644 --- a/README.md +++ b/README.md @@ -993,9 +993,11 @@ Possible options: - **search_repositories** - Search repositories - `minimal_output`: Return minimal repository information (default: true). When false, returns full GitHub API repository objects. (boolean, optional) + - `order`: Sort order (string, optional) - `page`: Page number for pagination (min 1) (number, optional) - `perPage`: Results per page for pagination (min 1, max 100) (number, optional) - `query`: Repository search query. Examples: 'machine learning in:name stars:>1000 language:python', 'topic:react', 'user:facebook'. Supports advanced search syntax for precise filtering. (string, required) + - `sort`: Sort repositories by field, defaults to best match (string, optional) diff --git a/pkg/github/__toolsnaps__/search_repositories.snap b/pkg/github/__toolsnaps__/search_repositories.snap index f350c8e2b..99828380e 100644 --- a/pkg/github/__toolsnaps__/search_repositories.snap +++ b/pkg/github/__toolsnaps__/search_repositories.snap @@ -11,6 +11,14 @@ "description": "Return minimal repository information (default: true). When false, returns full GitHub API repository objects.", "type": "boolean" }, + "order": { + "description": "Sort order", + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, "page": { "description": "Page number for pagination (min 1)", "minimum": 1, @@ -25,6 +33,16 @@ "query": { "description": "Repository search query. Examples: 'machine learning in:name stars:\u003e1000 language:python', 'topic:react', 'user:facebook'. Supports advanced search syntax for precise filtering.", "type": "string" + }, + "sort": { + "description": "Sort repositories by field, defaults to best match", + "enum": [ + "stars", + "forks", + "help-wanted-issues", + "updated" + ], + "type": "string" } }, "required": [ diff --git a/pkg/github/search.go b/pkg/github/search.go index 55e4cf8b4..a735c894b 100644 --- a/pkg/github/search.go +++ b/pkg/github/search.go @@ -26,6 +26,14 @@ func SearchRepositories(getClient GetClientFn, t translations.TranslationHelperF mcp.Required(), mcp.Description("Repository search query. Examples: 'machine learning in:name stars:>1000 language:python', 'topic:react', 'user:facebook'. Supports advanced search syntax for precise filtering."), ), + mcp.WithString("sort", + mcp.Description("Sort repositories by field, defaults to best match"), + mcp.Enum("stars", "forks", "help-wanted-issues", "updated"), + ), + mcp.WithString("order", + mcp.Description("Sort order"), + mcp.Enum("asc", "desc"), + ), mcp.WithBoolean("minimal_output", mcp.Description("Return minimal repository information (default: true). When false, returns full GitHub API repository objects."), mcp.DefaultBool(true), @@ -37,6 +45,14 @@ func SearchRepositories(getClient GetClientFn, t translations.TranslationHelperF if err != nil { return mcp.NewToolResultError(err.Error()), nil } + sort, err := OptionalParam[string](request, "sort") + if err != nil { + return mcp.NewToolResultError(err.Error()), nil + } + order, err := OptionalParam[string](request, "order") + if err != nil { + return mcp.NewToolResultError(err.Error()), nil + } pagination, err := OptionalPaginationParams(request) if err != nil { return mcp.NewToolResultError(err.Error()), nil @@ -46,6 +62,8 @@ func SearchRepositories(getClient GetClientFn, t translations.TranslationHelperF return mcp.NewToolResultError(err.Error()), nil } opts := &github.SearchOptions{ + Sort: sort, + Order: order, ListOptions: github.ListOptions{ Page: pagination.Page, PerPage: pagination.PerPage, diff --git a/pkg/github/search_test.go b/pkg/github/search_test.go index 91ca45af5..9ccf17664 100644 --- a/pkg/github/search_test.go +++ b/pkg/github/search_test.go @@ -23,6 +23,8 @@ func Test_SearchRepositories(t *testing.T) { assert.Equal(t, "search_repositories", tool.Name) assert.NotEmpty(t, tool.Description) assert.Contains(t, tool.InputSchema.Properties, "query") + assert.Contains(t, tool.InputSchema.Properties, "sort") + assert.Contains(t, tool.InputSchema.Properties, "order") assert.Contains(t, tool.InputSchema.Properties, "page") assert.Contains(t, tool.InputSchema.Properties, "perPage") assert.ElementsMatch(t, tool.InputSchema.Required, []string{"query"}) @@ -66,6 +68,8 @@ func Test_SearchRepositories(t *testing.T) { mock.GetSearchRepositories, expectQueryParams(t, map[string]string{ "q": "golang test", + "sort": "stars", + "order": "desc", "page": "2", "per_page": "10", }).andThen( @@ -75,6 +79,8 @@ func Test_SearchRepositories(t *testing.T) { ), requestArgs: map[string]interface{}{ "query": "golang test", + "sort": "stars", + "order": "desc", "page": float64(2), "perPage": float64(10), },