package tools import ( "context" "encoding/json" "gitea.d-ma.be/mathias/gitea-mcp/internal/allowlist" "gitea.d-ma.be/mathias/gitea-mcp/internal/gitea" "gitea.d-ma.be/mathias/gitea-mcp/internal/registry" ) type RepoList struct { c *gitea.Client a *allowlist.Allowlist } func NewRepoList(c *gitea.Client, a *allowlist.Allowlist) *RepoList { return &RepoList{c: c, a: a} } func (t *RepoList) Descriptor() registry.ToolDescriptor { return registry.ToolDescriptor{ Name: "repo_list", Description: "List repos for a given owner.", InputSchema: json.RawMessage(`{ "type":"object", "properties":{ "owner":{"type":"string"}, "page":{"type":"integer","minimum":1}, "limit":{"type":"integer","minimum":1,"maximum":50} }, "required":["owner"] }`), } } type repoListArgs struct { Owner string `json:"owner"` Page int `json:"page"` Limit int `json:"limit"` } func (t *RepoList) Call(ctx context.Context, raw json.RawMessage) (json.RawMessage, error) { var args repoListArgs if err := parseArgs(raw, &args); err != nil { return nil, err } if err := t.a.Check(args.Owner); err != nil { return nil, err } args.Limit = capLimit(args.Limit, 30) if args.Page < 1 { args.Page = 1 } repos, err := t.c.ListRepos(ctx, args.Owner, args.Page, args.Limit) if err != nil { return nil, err } out := map[string]any{ "repos": repos, } if len(repos) == args.Limit { out["next_page"] = args.Page + 1 } return textOK(out) }