From 34ca5d45db0ac2bdc54c3c88253c46fff4415e8f Mon Sep 17 00:00:00 2001 From: Bo-Yi Wu Date: Mon, 26 May 2025 06:10:10 +0000 Subject: [PATCH] refactor(args): request argument access and update dependencies (#42) - Update dependencies to newer versions in go.mod - Refactor all request argument accesses to use req.GetArguments() instead of direct access to req.Params.Arguments - Change variable declaration for ListRepoCommitsTool from a grouped var block to a single var statement for consistency Signed-off-by: Bo-Yi Wu Reviewed-on: https://gitea.com/gitea/gitea-mcp/pulls/42 Co-authored-by: Bo-Yi Wu Co-committed-by: Bo-Yi Wu --- go.mod | 10 ++++---- go.sum | 24 +++++++++---------- operation/issue/issue.go | 48 +++++++++++++++++++------------------- operation/pull/pull.go | 32 ++++++++++++------------- operation/repo/branch.go | 18 +++++++------- operation/repo/commit.go | 32 ++++++++++++------------- operation/repo/file.go | 46 ++++++++++++++++++------------------ operation/repo/release.go | 42 ++++++++++++++++----------------- operation/repo/repo.go | 32 ++++++++++++------------- operation/repo/tag.go | 30 ++++++++++++------------ operation/search/search.go | 36 ++++++++++++++-------------- operation/user/user.go | 4 ++-- 12 files changed, 176 insertions(+), 178 deletions(-) diff --git a/go.mod b/go.mod index aa170cf..1570a9a 100644 --- a/go.mod +++ b/go.mod @@ -4,20 +4,20 @@ go 1.24.0 require ( code.gitea.io/sdk/gitea v0.21.0 - github.com/mark3labs/mcp-go v0.22.0 + github.com/mark3labs/mcp-go v0.30.0 go.uber.org/zap v1.27.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) require ( - github.com/42wim/httpsig v1.2.2 // indirect + github.com/42wim/httpsig v1.2.3 // indirect github.com/davidmz/go-pageant v1.0.2 // indirect github.com/go-fed/httpsig v1.1.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/hashicorp/go-version v1.7.0 // indirect - github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/cast v1.8.0 // indirect github.com/yosida95/uritemplate/v3 v3.0.2 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.37.0 // indirect - golang.org/x/sys v0.32.0 // indirect + golang.org/x/crypto v0.38.0 // indirect + golang.org/x/sys v0.33.0 // indirect ) diff --git a/go.sum b/go.sum index 5016e84..9a35fd5 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ code.gitea.io/sdk/gitea v0.21.0 h1:69n6oz6kEVHRo1+APQQyizkhrZrLsTLXey9142pfkD4= code.gitea.io/sdk/gitea v0.21.0/go.mod h1:tnBjVhuKJCn8ibdyyhvUyxrR1Ca2KHEoTWoukNhXQPA= -github.com/42wim/httpsig v1.2.2 h1:ofAYoHUNs/MJOLqQ8hIxeyz2QxOz8qdSVvp3PX/oPgA= -github.com/42wim/httpsig v1.2.2/go.mod h1:P/UYo7ytNBFwc+dg35IubuAUIs8zj5zzFIgUCEl55WY= +github.com/42wim/httpsig v1.2.3 h1:xb0YyWhkYj57SPtfSttIobJUPJZB9as1nsfo7KWVcEs= +github.com/42wim/httpsig v1.2.3/go.mod h1:nZq9OlYKDrUBhptd77IHx4/sZZD+IxTBADvAPI9G/EM= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidmz/go-pageant v1.0.2 h1:bPblRCh5jGU+Uptpz6LgMZGD5hJoOt7otgT454WvHn0= @@ -20,14 +20,14 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/mark3labs/mcp-go v0.22.0 h1:cCEBWi4Yy9Kio+OW1hWIyi4WLsSr+RBBK6FI5tj+b7I= -github.com/mark3labs/mcp-go v0.22.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4= +github.com/mark3labs/mcp-go v0.30.0 h1:Taz7fiefkxY/l8jz1nA90V+WdM2eoMtlvwfWforVYbo= +github.com/mark3labs/mcp-go v0.30.0/go.mod h1:rXqOudj/djTORU/ThxYx8fqEVj/5pvTuuebQ2RC7uk4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= -github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cast v1.8.0 h1:gEN9K4b8Xws4EX0+a0reLmhq8moKn7ntRlQYgjPeCDk= +github.com/spf13/cast v1.8.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yosida95/uritemplate/v3 v3.0.2 h1:Ed3Oyj9yrmi9087+NczuL5BwkIc4wvTb5zIM+UJPGz4= @@ -41,18 +41,18 @@ go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= -golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= -golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= -golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= +golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= +golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/operation/issue/issue.go b/operation/issue/issue.go index ea259d6..294414f 100644 --- a/operation/issue/issue.go +++ b/operation/issue/issue.go @@ -99,15 +99,15 @@ func init() { func GetIssueByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called GetIssueByIndexFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - index, ok := req.Params.Arguments["index"].(float64) + index, ok := req.GetArguments()["index"].(float64) if !ok { return to.ErrorResult(fmt.Errorf("index is required")) } @@ -121,23 +121,23 @@ func GetIssueByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallT func ListRepoIssuesFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called ListIssuesFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - state, ok := req.Params.Arguments["state"].(string) + state, ok := req.GetArguments()["state"].(string) if !ok { state = "all" } - page, ok := req.Params.Arguments["page"].(float64) + page, ok := req.GetArguments()["page"].(float64) if !ok { page = 1 } - pageSize, ok := req.Params.Arguments["pageSize"].(float64) + pageSize, ok := req.GetArguments()["pageSize"].(float64) if !ok { pageSize = 100 } @@ -157,19 +157,19 @@ func ListRepoIssuesFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallTo func CreateIssueFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called CreateIssueFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - title, ok := req.Params.Arguments["title"].(string) + title, ok := req.GetArguments()["title"].(string) if !ok { return to.ErrorResult(fmt.Errorf("title is required")) } - body, ok := req.Params.Arguments["body"].(string) + body, ok := req.GetArguments()["body"].(string) if !ok { return to.ErrorResult(fmt.Errorf("body is required")) } @@ -186,19 +186,19 @@ func CreateIssueFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolR func CreateIssueCommentFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called CreateIssueCommentFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - index, ok := req.Params.Arguments["index"].(float64) + index, ok := req.GetArguments()["index"].(float64) if !ok { return to.ErrorResult(fmt.Errorf("index is required")) } - body, ok := req.Params.Arguments["body"].(string) + body, ok := req.GetArguments()["body"].(string) if !ok { return to.ErrorResult(fmt.Errorf("body is required")) } @@ -215,38 +215,38 @@ func CreateIssueCommentFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.Ca func EditIssueFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called EditIssueFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - index, ok := req.Params.Arguments["index"].(float64) + index, ok := req.GetArguments()["index"].(float64) if !ok { return to.ErrorResult(fmt.Errorf("index is required")) } opt := gitea_sdk.EditIssueOption{} - title, ok := req.Params.Arguments["title"].(string) + title, ok := req.GetArguments()["title"].(string) if ok { opt.Title = title } - body, ok := req.Params.Arguments["body"].(string) + body, ok := req.GetArguments()["body"].(string) if ok { opt.Body = ptr.To(body) } - assignees, ok := req.Params.Arguments["assignees"].([]string) + assignees, ok := req.GetArguments()["assignees"].([]string) if ok { opt.Assignees = assignees } - milestone, ok := req.Params.Arguments["milestone"].(float64) + milestone, ok := req.GetArguments()["milestone"].(float64) if ok { opt.Milestone = ptr.To(int64(milestone)) } - state, ok := req.Params.Arguments["state"].(string) + state, ok := req.GetArguments()["state"].(string) if ok { opt.State = ptr.To(gitea_sdk.StateType(state)) } diff --git a/operation/pull/pull.go b/operation/pull/pull.go index 4f32af3..4b90682 100644 --- a/operation/pull/pull.go +++ b/operation/pull/pull.go @@ -72,15 +72,15 @@ func init() { func GetPullRequestByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called GetPullRequestByIndexFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - index, ok := req.Params.Arguments["index"].(float64) + index, ok := req.GetArguments()["index"].(float64) if !ok { return to.ErrorResult(fmt.Errorf("index is required")) } @@ -94,25 +94,25 @@ func GetPullRequestByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp func ListRepoPullRequestsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called ListRepoPullRequests") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - state, _ := req.Params.Arguments["state"].(string) - sort, ok := req.Params.Arguments["sort"].(string) + state, _ := req.GetArguments()["state"].(string) + sort, ok := req.GetArguments()["sort"].(string) if !ok { sort = "recentupdate" } - milestone, _ := req.Params.Arguments["milestone"].(float64) - page, ok := req.Params.Arguments["page"].(float64) + milestone, _ := req.GetArguments()["milestone"].(float64) + page, ok := req.GetArguments()["page"].(float64) if !ok { page = 1 } - pageSize, ok := req.Params.Arguments["pageSize"].(float64) + pageSize, ok := req.GetArguments()["pageSize"].(float64) if !ok { pageSize = 100 } @@ -135,27 +135,27 @@ func ListRepoPullRequestsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp. func CreatePullRequestFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called CreatePullRequestFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - title, ok := req.Params.Arguments["title"].(string) + title, ok := req.GetArguments()["title"].(string) if !ok { return to.ErrorResult(fmt.Errorf("title is required")) } - body, ok := req.Params.Arguments["body"].(string) + body, ok := req.GetArguments()["body"].(string) if !ok { return to.ErrorResult(fmt.Errorf("body is required")) } - head, ok := req.Params.Arguments["head"].(string) + head, ok := req.GetArguments()["head"].(string) if !ok { return to.ErrorResult(fmt.Errorf("head is required")) } - base, ok := req.Params.Arguments["base"].(string) + base, ok := req.GetArguments()["base"].(string) if !ok { return to.ErrorResult(fmt.Errorf("base is required")) } diff --git a/operation/repo/branch.go b/operation/repo/branch.go index c2b3b7f..d71cc35 100644 --- a/operation/repo/branch.go +++ b/operation/repo/branch.go @@ -62,19 +62,19 @@ func init() { func CreateBranchFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called CreateBranchFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - branch, ok := req.Params.Arguments["branch"].(string) + branch, ok := req.GetArguments()["branch"].(string) if !ok { return to.ErrorResult(fmt.Errorf("branch is required")) } - oldBranch, _ := req.Params.Arguments["old_branch"].(string) + oldBranch, _ := req.GetArguments()["old_branch"].(string) _, _, err := gitea.Client().CreateBranch(owner, repo, gitea_sdk.CreateBranchOption{ BranchName: branch, @@ -89,15 +89,15 @@ func CreateBranchFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallTool func DeleteBranchFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called DeleteBranchFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - branch, ok := req.Params.Arguments["branch"].(string) + branch, ok := req.GetArguments()["branch"].(string) if !ok { return to.ErrorResult(fmt.Errorf("branch is required")) } @@ -111,11 +111,11 @@ func DeleteBranchFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallTool func ListBranchesFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called ListBranchesFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } diff --git a/operation/repo/commit.go b/operation/repo/commit.go index 9c9d0e8..048b767 100644 --- a/operation/repo/commit.go +++ b/operation/repo/commit.go @@ -17,17 +17,15 @@ const ( ListRepoCommitsToolName = "list_repo_commits" ) -var ( - ListRepoCommitsTool = mcp.NewTool( - ListRepoCommitsToolName, - mcp.WithDescription("List repository commits"), - mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner")), - mcp.WithString("repo", mcp.Required(), mcp.Description("repository name")), - mcp.WithString("sha", mcp.Description("SHA or branch to start listing commits from")), - mcp.WithString("path", mcp.Description("path indicates that only commits that include the path's file/dir should be returned.")), - mcp.WithNumber("page", mcp.Required(), mcp.Description("page number"), mcp.DefaultNumber(1), mcp.Min(1)), - mcp.WithNumber("page_size", mcp.Required(), mcp.Description("page size"), mcp.DefaultNumber(50), mcp.Min(1)), - ) +var ListRepoCommitsTool = mcp.NewTool( + ListRepoCommitsToolName, + mcp.WithDescription("List repository commits"), + mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner")), + mcp.WithString("repo", mcp.Required(), mcp.Description("repository name")), + mcp.WithString("sha", mcp.Description("SHA or branch to start listing commits from")), + mcp.WithString("path", mcp.Description("path indicates that only commits that include the path's file/dir should be returned.")), + mcp.WithNumber("page", mcp.Required(), mcp.Description("page number"), mcp.DefaultNumber(1), mcp.Min(1)), + mcp.WithNumber("page_size", mcp.Required(), mcp.Description("page size"), mcp.DefaultNumber(50), mcp.Min(1)), ) func init() { @@ -39,24 +37,24 @@ func init() { func ListRepoCommitsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called ListRepoCommitsFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - page, ok := req.Params.Arguments["page"].(float64) + page, ok := req.GetArguments()["page"].(float64) if !ok { return to.ErrorResult(fmt.Errorf("page is required")) } - pageSize, ok := req.Params.Arguments["page_size"].(float64) + pageSize, ok := req.GetArguments()["page_size"].(float64) if !ok { return to.ErrorResult(fmt.Errorf("page_size is required")) } - sha, _ := req.Params.Arguments["sha"].(string) - path, _ := req.Params.Arguments["path"].(string) + sha, _ := req.GetArguments()["sha"].(string) + path, _ := req.GetArguments()["path"].(string) opt := gitea_sdk.ListCommitOptions{ ListOptions: gitea_sdk.ListOptions{ Page: int(page), diff --git a/operation/repo/file.go b/operation/repo/file.go index 09b55b8..ccab6b1 100644 --- a/operation/repo/file.go +++ b/operation/repo/file.go @@ -88,16 +88,16 @@ func init() { func GetFileContentFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called GetFileFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - ref, _ := req.Params.Arguments["ref"].(string) - filePath, ok := req.Params.Arguments["filePath"].(string) + ref, _ := req.GetArguments()["ref"].(string) + filePath, ok := req.GetArguments()["filePath"].(string) if !ok { return to.ErrorResult(fmt.Errorf("filePath is required")) } @@ -110,21 +110,21 @@ func GetFileContentFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallTo func CreateFileFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called CreateFileFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - filePath, ok := req.Params.Arguments["filePath"].(string) + filePath, ok := req.GetArguments()["filePath"].(string) if !ok { return to.ErrorResult(fmt.Errorf("filePath is required")) } - content, _ := req.Params.Arguments["content"].(string) - message, _ := req.Params.Arguments["message"].(string) - branchName, _ := req.Params.Arguments["branch_name"].(string) + content, _ := req.GetArguments()["content"].(string) + message, _ := req.GetArguments()["message"].(string) + branchName, _ := req.GetArguments()["branch_name"].(string) opt := gitea_sdk.CreateFileOptions{ Content: base64.StdEncoding.EncodeToString([]byte(content)), FileOptions: gitea_sdk.FileOptions{ @@ -142,25 +142,25 @@ func CreateFileFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolRe func UpdateFileFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called UpdateFileFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - filePath, ok := req.Params.Arguments["filePath"].(string) + filePath, ok := req.GetArguments()["filePath"].(string) if !ok { return to.ErrorResult(fmt.Errorf("filePath is required")) } - sha, ok := req.Params.Arguments["sha"].(string) + sha, ok := req.GetArguments()["sha"].(string) if !ok { return to.ErrorResult(fmt.Errorf("sha is required")) } - content, _ := req.Params.Arguments["content"].(string) - message, _ := req.Params.Arguments["message"].(string) - branchName, _ := req.Params.Arguments["branch_name"].(string) + content, _ := req.GetArguments()["content"].(string) + message, _ := req.GetArguments()["message"].(string) + branchName, _ := req.GetArguments()["branch_name"].(string) opt := gitea_sdk.UpdateFileOptions{ SHA: sha, @@ -179,21 +179,21 @@ func UpdateFileFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolRe func DeleteFileFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called DeleteFileFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return to.ErrorResult(fmt.Errorf("owner is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(fmt.Errorf("repo is required")) } - filePath, ok := req.Params.Arguments["filePath"].(string) + filePath, ok := req.GetArguments()["filePath"].(string) if !ok { return to.ErrorResult(fmt.Errorf("filePath is required")) } - message, _ := req.Params.Arguments["message"].(string) - branchName, _ := req.Params.Arguments["branch_name"].(string) - sha, ok := req.Params.Arguments["sha"].(string) + message, _ := req.GetArguments()["message"].(string) + branchName, _ := req.GetArguments()["branch_name"].(string) + sha, ok := req.GetArguments()["sha"].(string) if !ok { return to.ErrorResult(fmt.Errorf("sha is required")) } diff --git a/operation/repo/release.go b/operation/repo/release.go index f077fd8..d0e1094 100644 --- a/operation/repo/release.go +++ b/operation/repo/release.go @@ -109,28 +109,28 @@ type ListReleaseResult struct { func CreateReleaseFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called CreateReleasesFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return nil, fmt.Errorf("owner is required") } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return nil, fmt.Errorf("repo is required") } - tagName, ok := req.Params.Arguments["tag_name"].(string) + tagName, ok := req.GetArguments()["tag_name"].(string) if !ok { return nil, fmt.Errorf("tag_name is required") } - target, ok := req.Params.Arguments["target"].(string) + target, ok := req.GetArguments()["target"].(string) if !ok { return nil, fmt.Errorf("target is required") } - title, ok := req.Params.Arguments["title"].(string) + title, ok := req.GetArguments()["title"].(string) if !ok { return nil, fmt.Errorf("title is required") } - isDraft, _ := req.Params.Arguments["is_draft"].(bool) - isPreRelease, _ := req.Params.Arguments["is_pre_release"].(bool) + isDraft, _ := req.GetArguments()["is_draft"].(bool) + isPreRelease, _ := req.GetArguments()["is_pre_release"].(bool) _, _, err := gitea.Client().CreateRelease(owner, repo, gitea_sdk.CreateReleaseOption{ TagName: tagName, @@ -148,15 +148,15 @@ func CreateReleaseFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToo func DeleteReleaseFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called DeleteReleaseFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return nil, fmt.Errorf("owner is required") } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return nil, fmt.Errorf("repo is required") } - id, ok := req.Params.Arguments["id"].(float64) + id, ok := req.GetArguments()["id"].(float64) if !ok { return nil, fmt.Errorf("id is required") } @@ -171,15 +171,15 @@ func DeleteReleaseFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToo func GetReleaseFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called GetReleaseFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return nil, fmt.Errorf("owner is required") } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return nil, fmt.Errorf("repo is required") } - id, ok := req.Params.Arguments["id"].(float64) + id, ok := req.GetArguments()["id"].(float64) if !ok { return nil, fmt.Errorf("id is required") } @@ -194,11 +194,11 @@ func GetReleaseFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolRe func GetLatestReleaseFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called GetLatestReleaseFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return nil, fmt.Errorf("owner is required") } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return nil, fmt.Errorf("repo is required") } @@ -213,18 +213,18 @@ func GetLatestReleaseFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.Call func ListReleasesFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called ListReleasesFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return nil, fmt.Errorf("owner is required") } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return nil, fmt.Errorf("repo is required") } - isDraft, _ := req.Params.Arguments["is_draft"].(bool) - isPreRelease, _ := req.Params.Arguments["is_pre_release"].(bool) - page, _ := req.Params.Arguments["page"].(float64) - pageSize, _ := req.Params.Arguments["pageSize"].(float64) + isDraft, _ := req.GetArguments()["is_draft"].(bool) + isPreRelease, _ := req.GetArguments()["is_pre_release"].(bool) + page, _ := req.GetArguments()["page"].(float64) + pageSize, _ := req.GetArguments()["pageSize"].(float64) releases, _, err := gitea.Client().ListReleases(owner, repo, gitea_sdk.ListReleasesOptions{ ListOptions: gitea_sdk.ListOptions{ diff --git a/operation/repo/repo.go b/operation/repo/repo.go index 91c2215..d9a1831 100644 --- a/operation/repo/repo.go +++ b/operation/repo/repo.go @@ -107,19 +107,19 @@ func RegisterTool(s *server.MCPServer) { func CreateRepoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called CreateRepoFn") - name, ok := req.Params.Arguments["name"].(string) + name, ok := req.GetArguments()["name"].(string) if !ok { return to.ErrorResult(errors.New("repository name is required")) } - description, _ := req.Params.Arguments["description"].(string) - private, _ := req.Params.Arguments["private"].(bool) - issueLabels, _ := req.Params.Arguments["issue_labels"].(string) - autoInit, _ := req.Params.Arguments["auto_init"].(bool) - template, _ := req.Params.Arguments["template"].(bool) - gitignores, _ := req.Params.Arguments["gitignores"].(string) - license, _ := req.Params.Arguments["license"].(string) - readme, _ := req.Params.Arguments["readme"].(string) - defaultBranch, _ := req.Params.Arguments["default_branch"].(string) + description, _ := req.GetArguments()["description"].(string) + private, _ := req.GetArguments()["private"].(bool) + issueLabels, _ := req.GetArguments()["issue_labels"].(string) + autoInit, _ := req.GetArguments()["auto_init"].(bool) + template, _ := req.GetArguments()["template"].(bool) + gitignores, _ := req.GetArguments()["gitignores"].(string) + license, _ := req.GetArguments()["license"].(string) + readme, _ := req.GetArguments()["readme"].(string) + defaultBranch, _ := req.GetArguments()["default_branch"].(string) opt := gitea_sdk.CreateRepoOption{ Name: name, @@ -142,20 +142,20 @@ func CreateRepoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolRe func ForkRepoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called ForkRepoFn") - user, ok := req.Params.Arguments["user"].(string) + user, ok := req.GetArguments()["user"].(string) if !ok { return to.ErrorResult(errors.New("user name is required")) } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return to.ErrorResult(errors.New("repository name is required")) } - organization, ok := req.Params.Arguments["organization"].(string) + organization, ok := req.GetArguments()["organization"].(string) organizationPtr := ptr.To(organization) if !ok || organization == "" { organizationPtr = nil } - name, ok := req.Params.Arguments["name"].(string) + name, ok := req.GetArguments()["name"].(string) namePtr := ptr.To(name) if !ok || name == "" { namePtr = nil @@ -173,11 +173,11 @@ func ForkRepoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResu func ListMyReposFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called ListMyReposFn") - page, ok := req.Params.Arguments["page"].(float64) + page, ok := req.GetArguments()["page"].(float64) if !ok { page = 1 } - pageSize, ok := req.Params.Arguments["pageSize"].(float64) + pageSize, ok := req.GetArguments()["pageSize"].(float64) if !ok { pageSize = 100 } diff --git a/operation/repo/tag.go b/operation/repo/tag.go index 6024c04..b39cf45 100644 --- a/operation/repo/tag.go +++ b/operation/repo/tag.go @@ -87,20 +87,20 @@ type ListTagResult struct { func CreateTagFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called CreateTagFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return nil, fmt.Errorf("owner is required") } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return nil, fmt.Errorf("repo is required") } - tagName, ok := req.Params.Arguments["tag_name"].(string) + tagName, ok := req.GetArguments()["tag_name"].(string) if !ok { return nil, fmt.Errorf("tag_name is required") } - target, _ := req.Params.Arguments["target"].(string) - message, _ := req.Params.Arguments["message"].(string) + target, _ := req.GetArguments()["target"].(string) + message, _ := req.GetArguments()["message"].(string) _, _, err := gitea.Client().CreateTag(owner, repo, gitea_sdk.CreateTagOption{ TagName: tagName, @@ -116,15 +116,15 @@ func CreateTagFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolRes func DeleteTagFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called DeleteTagFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return nil, fmt.Errorf("owner is required") } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return nil, fmt.Errorf("repo is required") } - tagName, ok := req.Params.Arguments["tag_name"].(string) + tagName, ok := req.GetArguments()["tag_name"].(string) if !ok { return nil, fmt.Errorf("tag_name is required") } @@ -139,15 +139,15 @@ func DeleteTagFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolRes func GetTagFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called GetTagFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return nil, fmt.Errorf("owner is required") } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return nil, fmt.Errorf("repo is required") } - tagName, ok := req.Params.Arguments["tag_name"].(string) + tagName, ok := req.GetArguments()["tag_name"].(string) if !ok { return nil, fmt.Errorf("tag_name is required") } @@ -162,16 +162,16 @@ func GetTagFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult func ListTagsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called ListTagsFn") - owner, ok := req.Params.Arguments["owner"].(string) + owner, ok := req.GetArguments()["owner"].(string) if !ok { return nil, fmt.Errorf("owner is required") } - repo, ok := req.Params.Arguments["repo"].(string) + repo, ok := req.GetArguments()["repo"].(string) if !ok { return nil, fmt.Errorf("repo is required") } - page, _ := req.Params.Arguments["page"].(float64) - pageSize, _ := req.Params.Arguments["pageSize"].(float64) + page, _ := req.GetArguments()["page"].(float64) + pageSize, _ := req.GetArguments()["pageSize"].(float64) tags, _, err := gitea.Client().ListRepoTags(owner, repo, gitea_sdk.ListRepoTagsOptions{ ListOptions: gitea_sdk.ListOptions{ diff --git a/operation/search/search.go b/operation/search/search.go index c0e5e2a..9fce5e1 100644 --- a/operation/search/search.go +++ b/operation/search/search.go @@ -75,15 +75,15 @@ func init() { func SearchUsersFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called SearchUsersFn") - keyword, ok := req.Params.Arguments["keyword"].(string) + keyword, ok := req.GetArguments()["keyword"].(string) if !ok { return to.ErrorResult(fmt.Errorf("keyword is required")) } - page, ok := req.Params.Arguments["page"].(float64) + page, ok := req.GetArguments()["page"].(float64) if !ok { page = 1 } - pageSize, ok := req.Params.Arguments["pageSize"].(float64) + pageSize, ok := req.GetArguments()["pageSize"].(float64) if !ok { pageSize = 100 } @@ -103,20 +103,20 @@ func SearchUsersFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolR func SearchOrgTeamsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called SearchOrgTeamsFn") - org, ok := req.Params.Arguments["org"].(string) + org, ok := req.GetArguments()["org"].(string) if !ok { return to.ErrorResult(fmt.Errorf("organization is required")) } - query, ok := req.Params.Arguments["query"].(string) + query, ok := req.GetArguments()["query"].(string) if !ok { return to.ErrorResult(fmt.Errorf("query is required")) } - includeDescription, _ := req.Params.Arguments["includeDescription"].(bool) - page, ok := req.Params.Arguments["page"].(float64) + includeDescription, _ := req.GetArguments()["includeDescription"].(bool) + page, ok := req.GetArguments()["page"].(float64) if !ok { page = 1 } - pageSize, ok := req.Params.Arguments["pageSize"].(float64) + pageSize, ok := req.GetArguments()["pageSize"].(float64) if !ok { pageSize = 100 } @@ -137,22 +137,22 @@ func SearchOrgTeamsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallTo func SearchReposFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called SearchReposFn") - keyword, ok := req.Params.Arguments["keyword"].(string) + keyword, ok := req.GetArguments()["keyword"].(string) if !ok { return to.ErrorResult(fmt.Errorf("keyword is required")) } - keywordIsTopic, _ := req.Params.Arguments["keywordIsTopic"].(bool) - keywordInDescription, _ := req.Params.Arguments["keywordInDescription"].(bool) - ownerID, _ := req.Params.Arguments["ownerID"].(float64) - isPrivate, _ := req.Params.Arguments["isPrivate"].(bool) - isArchived, _ := req.Params.Arguments["isArchived"].(bool) - sort, _ := req.Params.Arguments["sort"].(string) - order, _ := req.Params.Arguments["order"].(string) - page, ok := req.Params.Arguments["page"].(float64) + keywordIsTopic, _ := req.GetArguments()["keywordIsTopic"].(bool) + keywordInDescription, _ := req.GetArguments()["keywordInDescription"].(bool) + ownerID, _ := req.GetArguments()["ownerID"].(float64) + isPrivate, _ := req.GetArguments()["isPrivate"].(bool) + isArchived, _ := req.GetArguments()["isArchived"].(bool) + sort, _ := req.GetArguments()["sort"].(string) + order, _ := req.GetArguments()["order"].(string) + page, ok := req.GetArguments()["page"].(float64) if !ok { page = 1 } - pageSize, ok := req.Params.Arguments["pageSize"].(float64) + pageSize, ok := req.GetArguments()["pageSize"].(float64) if !ok { pageSize = 100 } diff --git a/operation/user/user.go b/operation/user/user.go index a100ab3..d3f5142 100644 --- a/operation/user/user.go +++ b/operation/user/user.go @@ -59,11 +59,11 @@ func GetUserInfoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolR func GetUserOrgsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { log.Debugf("Called GetUserOrgsFn") - page, ok := req.Params.Arguments["page"].(float64) + page, ok := req.GetArguments()["page"].(float64) if !ok || page < 1 { page = 1 } - pageSize, ok := req.Params.Arguments["pageSize"].(float64) + pageSize, ok := req.GetArguments()["pageSize"].(float64) if !ok || pageSize < 1 { pageSize = 100 }