mirror of
https://gitea.com/gitea/gitea-mcp.git
synced 2026-08-27 02:27:45 +00:00
b22ee74148
Add params.Bind, which unmarshals a tool call's map[string]any args into a typed struct via JSON round-trip so JSON numbers land in the correct Go numeric field types, and enforces `required:"true"` struct tags with clear errors. Migrate the branch, tree, and file repo handlers to use it instead of repeated args["x"].(string)/!ok extraction, preserving existing validation behavior for each field. Co-Authored-By: Codet <codet@commitgo.dev> (GPT-5-Codex)
72 lines
2.0 KiB
Go
72 lines
2.0 KiB
Go
package repo
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"gitea.com/gitea/gitea-mcp/pkg/annotation"
|
|
"gitea.com/gitea/gitea-mcp/pkg/gitea"
|
|
"gitea.com/gitea/gitea-mcp/pkg/params"
|
|
"gitea.com/gitea/gitea-mcp/pkg/to"
|
|
"gitea.com/gitea/gitea-mcp/pkg/tool"
|
|
|
|
gitea_sdk "gitea.dev/sdk"
|
|
"github.com/modelcontextprotocol/go-sdk/mcp"
|
|
)
|
|
|
|
const (
|
|
GetRepoTreeToolName = "get_repository_tree"
|
|
)
|
|
|
|
var GetRepoTreeTool = tool.NewDefinition(
|
|
GetRepoTreeToolName,
|
|
"Get the file tree of a repository at a given ref (SHA, branch, or tag), optionally recursively.",
|
|
annotation.ReadOnly("Get repository file tree"),
|
|
tool.String("owner", tool.Required(), tool.Description(params.OwnerDesc)),
|
|
tool.String("repo", tool.Required(), tool.Description(params.RepoDesc)),
|
|
tool.String("tree_sha", tool.Required(), tool.Description("SHA, branch, or tag")),
|
|
tool.Boolean("recursive"),
|
|
tool.Number("page", tool.Description(params.PageDesc), tool.Default(1)),
|
|
tool.Number("per_page", tool.Description(params.PaginationDesc), tool.Default(30)),
|
|
)
|
|
|
|
func init() {
|
|
Tool.RegisterRead(tool.ServerTool{
|
|
Tool: GetRepoTreeTool,
|
|
Handler: GetRepoTreeFn,
|
|
})
|
|
}
|
|
|
|
type getRepoTreeArgs struct {
|
|
Owner string `json:"owner" required:"true"`
|
|
Repo string `json:"repo" required:"true"`
|
|
TreeSHA string `json:"tree_sha" required:"true"`
|
|
Recursive bool `json:"recursive"`
|
|
}
|
|
|
|
func GetRepoTreeFn(ctx context.Context, args map[string]any) (*mcp.CallToolResult, error) {
|
|
var in getRepoTreeArgs
|
|
if err := params.Bind(args, &in); err != nil {
|
|
return to.ErrorResult(err)
|
|
}
|
|
page, pageSize := params.GetPagination(args, 30)
|
|
|
|
opt := gitea_sdk.ListTreeOptions{
|
|
ListOptions: gitea_sdk.ListOptions{
|
|
Page: page,
|
|
PageSize: pageSize,
|
|
},
|
|
Ref: in.TreeSHA,
|
|
Recursive: in.Recursive,
|
|
}
|
|
client, err := gitea.ClientFromContext(ctx)
|
|
if err != nil {
|
|
return to.ErrorResult(fmt.Errorf("get gitea client err: %v", err))
|
|
}
|
|
tree, _, err := client.Git.GetTrees(ctx, in.Owner, in.Repo, opt)
|
|
if err != nil {
|
|
return to.ErrorResult(fmt.Errorf("get repository tree err: %v", err))
|
|
}
|
|
return to.TextResult(slimTree(tree))
|
|
}
|