mirror of
https://gitea.com/gitea/gitea-mcp.git
synced 2025-08-23 22:33:05 +00:00
Update
This commit is contained in:
@@ -79,7 +79,7 @@ func GetIssueByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallT
|
|||||||
index := req.Params.Arguments["index"].(float64)
|
index := req.Params.Arguments["index"].(float64)
|
||||||
issue, _, err := gitea.Client().GetIssue(owner, repo, int64(index))
|
issue, _, err := gitea.Client().GetIssue(owner, repo, int64(index))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mcp.NewToolResultError(fmt.Sprintf("get %v/%v/issue/%v err", owner, repo, int64(index))), err
|
return nil, fmt.Errorf("get %v/%v/issue/%v err", owner, repo, int64(index))
|
||||||
}
|
}
|
||||||
|
|
||||||
return to.TextResult(issue)
|
return to.TextResult(issue)
|
||||||
@@ -92,7 +92,7 @@ func GetPullRequestByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp
|
|||||||
index := req.Params.Arguments["index"].(float64)
|
index := req.Params.Arguments["index"].(float64)
|
||||||
pr, _, err := gitea.Client().GetPullRequest(owner, repo, int64(index))
|
pr, _, err := gitea.Client().GetPullRequest(owner, repo, int64(index))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mcp.NewToolResultError(fmt.Sprintf("get %v/%v/pr/%v err", owner, repo, int64(index))), err
|
return nil, fmt.Errorf("get %v/%v/pr/%v err", owner, repo, int64(index))
|
||||||
}
|
}
|
||||||
|
|
||||||
return to.TextResult(pr)
|
return to.TextResult(pr)
|
||||||
@@ -109,7 +109,7 @@ func CreateIssueFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolR
|
|||||||
Body: body,
|
Body: body,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mcp.NewToolResultError(fmt.Sprintf("create %v/%v/issue err", owner, repo)), err
|
return nil, fmt.Errorf("create %v/%v/issue err", owner, repo)
|
||||||
}
|
}
|
||||||
|
|
||||||
return to.TextResult(issue)
|
return to.TextResult(issue)
|
||||||
@@ -125,7 +125,7 @@ func CreateIssueCommentFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.Ca
|
|||||||
Body: body,
|
Body: body,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mcp.NewToolResultError(fmt.Sprintf("create %v/%v/issue/%v/comment err", owner, repo, int64(index))), err
|
return nil, fmt.Errorf("create %v/%v/issue/%v/comment err", owner, repo, int64(index))
|
||||||
}
|
}
|
||||||
|
|
||||||
return to.TextResult(issueComment)
|
return to.TextResult(issueComment)
|
||||||
@@ -146,7 +146,7 @@ func CreatePullRequestFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.Cal
|
|||||||
Base: base,
|
Base: base,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mcp.NewToolResultError(fmt.Sprintf("create %v/%v/pull_request err", owner, repo)), err
|
return nil, fmt.Errorf("create %v/%v/pull_request err", owner, repo)
|
||||||
}
|
}
|
||||||
|
|
||||||
return to.TextResult(pr)
|
return to.TextResult(pr)
|
||||||
|
@@ -5,6 +5,7 @@ import (
|
|||||||
|
|
||||||
"gitea.com/gitea/gitea-mcp/operation/issue"
|
"gitea.com/gitea/gitea-mcp/operation/issue"
|
||||||
"gitea.com/gitea/gitea-mcp/operation/repo"
|
"gitea.com/gitea/gitea-mcp/operation/repo"
|
||||||
|
"gitea.com/gitea/gitea-mcp/operation/search"
|
||||||
"gitea.com/gitea/gitea-mcp/operation/user"
|
"gitea.com/gitea/gitea-mcp/operation/user"
|
||||||
"gitea.com/gitea/gitea-mcp/operation/version"
|
"gitea.com/gitea/gitea-mcp/operation/version"
|
||||||
"gitea.com/gitea/gitea-mcp/pkg/flag"
|
"gitea.com/gitea/gitea-mcp/pkg/flag"
|
||||||
@@ -27,6 +28,9 @@ func RegisterTool(s *server.MCPServer) {
|
|||||||
// Issue Tool
|
// Issue Tool
|
||||||
issue.RegisterTool(s)
|
issue.RegisterTool(s)
|
||||||
|
|
||||||
|
// Search Tool
|
||||||
|
search.RegisterTool(s)
|
||||||
|
|
||||||
// Version Tool
|
// Version Tool
|
||||||
version.RegisterTool(s)
|
version.RegisterTool(s)
|
||||||
}
|
}
|
||||||
|
@@ -2,16 +2,20 @@ package repo
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"gitea.com/gitea/gitea-mcp/pkg/gitea"
|
"gitea.com/gitea/gitea-mcp/pkg/gitea"
|
||||||
"gitea.com/gitea/gitea-mcp/pkg/log"
|
"gitea.com/gitea/gitea-mcp/pkg/log"
|
||||||
"github.com/mark3labs/mcp-go/mcp"
|
"gitea.com/gitea/gitea-mcp/pkg/to"
|
||||||
|
|
||||||
gitea_sdk "code.gitea.io/sdk/gitea"
|
gitea_sdk "code.gitea.io/sdk/gitea"
|
||||||
|
"github.com/mark3labs/mcp-go/mcp"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
CreateBranchToolName = "create_branch"
|
CreateBranchToolName = "create_branch"
|
||||||
|
DeleteBranchToolName = "delete_branch"
|
||||||
|
ListBranchesToolName = "list_branches"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -23,6 +27,21 @@ var (
|
|||||||
mcp.WithString("branch", mcp.Required(), mcp.Description("Name of the branch to create"), mcp.DefaultString("")),
|
mcp.WithString("branch", mcp.Required(), mcp.Description("Name of the branch to create"), mcp.DefaultString("")),
|
||||||
mcp.WithString("old_branch", mcp.Description("Name of the old branch to create from"), mcp.DefaultString("")),
|
mcp.WithString("old_branch", mcp.Description("Name of the old branch to create from"), mcp.DefaultString("")),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
DeleteBranchTool = mcp.NewTool(
|
||||||
|
DeleteBranchToolName,
|
||||||
|
mcp.WithDescription("Delete branch"),
|
||||||
|
mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("branch", mcp.Required(), mcp.Description("Name of the branch to delete"), mcp.DefaultString("")),
|
||||||
|
)
|
||||||
|
|
||||||
|
ListBranchesTool = mcp.NewTool(
|
||||||
|
ListBranchesToolName,
|
||||||
|
mcp.WithDescription("List branches"),
|
||||||
|
mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
func CreateBranchFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
func CreateBranchFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
@@ -37,8 +56,39 @@ func CreateBranchFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallTool
|
|||||||
OldBranchName: oldBranch,
|
OldBranchName: oldBranch,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mcp.NewToolResultError("Create Branch Error"), err
|
return nil, fmt.Errorf("Create Branch Error: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return mcp.NewToolResultText("Branch Created"), nil
|
return mcp.NewToolResultText("Branch Created"), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DeleteBranchFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
|
log.Debugf("Called DeleteBranchFn")
|
||||||
|
owner := req.Params.Arguments["owner"].(string)
|
||||||
|
repo := req.Params.Arguments["repo"].(string)
|
||||||
|
branch := req.Params.Arguments["branch"].(string)
|
||||||
|
_, _, err := gitea.Client().DeleteRepoBranch(owner, repo, branch)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("Delete Branch Error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return to.TextResult("Branch Deleted")
|
||||||
|
}
|
||||||
|
|
||||||
|
func ListBranchesFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
|
log.Debugf("Called ListBranchesFn")
|
||||||
|
owner := req.Params.Arguments["owner"].(string)
|
||||||
|
repo := req.Params.Arguments["repo"].(string)
|
||||||
|
opt := gitea_sdk.ListRepoBranchesOptions{
|
||||||
|
ListOptions: gitea_sdk.ListOptions{
|
||||||
|
Page: 1,
|
||||||
|
PageSize: 100,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
branches, _, err := gitea.Client().ListRepoBranches(owner, repo, opt)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("List Branches Error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return to.TextResult(branches)
|
||||||
|
}
|
||||||
|
46
operation/repo/commit.go
Normal file
46
operation/repo/commit.go
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package repo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
gitea_sdk "code.gitea.io/sdk/gitea"
|
||||||
|
"gitea.com/gitea/gitea-mcp/pkg/gitea"
|
||||||
|
"gitea.com/gitea/gitea-mcp/pkg/log"
|
||||||
|
"gitea.com/gitea/gitea-mcp/pkg/to"
|
||||||
|
"github.com/mark3labs/mcp-go/mcp"
|
||||||
|
)
|
||||||
|
|
||||||
|
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.DefaultString("")),
|
||||||
|
mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("sha", mcp.Description("sha"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("path", mcp.Description("path"), mcp.DefaultString("")),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
func ListRepoCommitsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
|
log.Debugf("Called ListRepoCommitsFn")
|
||||||
|
owner := req.Params.Arguments["owner"].(string)
|
||||||
|
repo := req.Params.Arguments["repo"].(string)
|
||||||
|
opt := gitea_sdk.ListCommitOptions{
|
||||||
|
ListOptions: gitea_sdk.ListOptions{
|
||||||
|
Page: 1,
|
||||||
|
PageSize: 1000,
|
||||||
|
},
|
||||||
|
SHA: req.Params.Arguments["sha"].(string),
|
||||||
|
Path: req.Params.Arguments["path"].(string),
|
||||||
|
}
|
||||||
|
commits, _, err := gitea.Client().ListRepoCommits(owner, repo, opt)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("list repo commits err: %v", err)
|
||||||
|
}
|
||||||
|
return to.TextResult(commits)
|
||||||
|
}
|
143
operation/repo/file.go
Normal file
143
operation/repo/file.go
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
package repo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"gitea.com/gitea/gitea-mcp/pkg/gitea"
|
||||||
|
"gitea.com/gitea/gitea-mcp/pkg/log"
|
||||||
|
"gitea.com/gitea/gitea-mcp/pkg/to"
|
||||||
|
|
||||||
|
gitea_sdk "code.gitea.io/sdk/gitea"
|
||||||
|
"github.com/mark3labs/mcp-go/mcp"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
GetFileToolName = "get_file"
|
||||||
|
CreateFileToolName = "create_file"
|
||||||
|
UpdateFileToolName = "update_file"
|
||||||
|
DeleteFileToolName = "delete_file"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
GetFileTool = mcp.NewTool(
|
||||||
|
GetFileToolName,
|
||||||
|
mcp.WithDescription("Get file"),
|
||||||
|
mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("ref", mcp.Required(), mcp.Description("ref"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("filePath", mcp.Required(), mcp.Description("file path"), mcp.DefaultString("")),
|
||||||
|
)
|
||||||
|
|
||||||
|
CreateFileTool = mcp.NewTool(
|
||||||
|
CreateFileToolName,
|
||||||
|
mcp.WithDescription("Create file"),
|
||||||
|
mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("filePath", mcp.Required(), mcp.Description("file path"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("content", mcp.Required(), mcp.Description("file content"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("message", mcp.Required(), mcp.Description("commit message"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("branch_name", mcp.Required(), mcp.Description("branch name"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("new_branch_name", mcp.Description("new branch name"), mcp.DefaultString("")),
|
||||||
|
)
|
||||||
|
|
||||||
|
UpdateFileTool = mcp.NewTool(
|
||||||
|
UpdateFileToolName,
|
||||||
|
mcp.WithDescription("Update file"),
|
||||||
|
mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("filePath", mcp.Required(), mcp.Description("file path"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("content", mcp.Required(), mcp.Description("file content"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("message", mcp.Required(), mcp.Description("commit message"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("branch_name", mcp.Required(), mcp.Description("branch name"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("new_branch_name", mcp.Description("new branch name"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("from_path", mcp.Description("from path"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("sha", mcp.Description("sha"), mcp.DefaultString("")),
|
||||||
|
)
|
||||||
|
|
||||||
|
DeleteFileTool = mcp.NewTool(
|
||||||
|
DeleteFileToolName,
|
||||||
|
mcp.WithDescription("Delete file"),
|
||||||
|
mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("filePath", mcp.Required(), mcp.Description("file path"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("message", mcp.Required(), mcp.Description("commit message"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("branch_name", mcp.Required(), mcp.Description("branch name"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("sha", mcp.Description("sha"), mcp.DefaultString("")),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetFileFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
|
log.Debugf("Called GetFileFn")
|
||||||
|
owner := req.Params.Arguments["owner"].(string)
|
||||||
|
repo := req.Params.Arguments["repo"].(string)
|
||||||
|
ref := req.Params.Arguments["ref"].(string)
|
||||||
|
filePath := req.Params.Arguments["filePath"].(string)
|
||||||
|
file, _, err := gitea.Client().GetFile(owner, repo, ref, filePath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("get file err: %v", err)
|
||||||
|
}
|
||||||
|
return to.TextResult(file)
|
||||||
|
}
|
||||||
|
|
||||||
|
func CreateFileFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
|
log.Debugf("Called CreateFileFn")
|
||||||
|
owner := req.Params.Arguments["owner"].(string)
|
||||||
|
repo := req.Params.Arguments["repo"].(string)
|
||||||
|
filePath := req.Params.Arguments["filePath"].(string)
|
||||||
|
opt := gitea_sdk.CreateFileOptions{
|
||||||
|
Content: req.Params.Arguments["content"].(string),
|
||||||
|
FileOptions: gitea_sdk.FileOptions{
|
||||||
|
Message: req.Params.Arguments["message"].(string),
|
||||||
|
BranchName: req.Params.Arguments["branch_name"].(string),
|
||||||
|
NewBranchName: req.Params.Arguments["new_branch_name"].(string),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
_, _, err := gitea.Client().CreateFile(owner, repo, filePath, opt)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("create file err: %v", err)
|
||||||
|
}
|
||||||
|
return to.TextResult("Create file success")
|
||||||
|
}
|
||||||
|
|
||||||
|
func UpdateFileFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
|
log.Debugf("Called UpdateFileFn")
|
||||||
|
owner := req.Params.Arguments["owner"].(string)
|
||||||
|
repo := req.Params.Arguments["repo"].(string)
|
||||||
|
filePath := req.Params.Arguments["filePath"].(string)
|
||||||
|
opt := gitea_sdk.UpdateFileOptions{
|
||||||
|
Content: req.Params.Arguments["content"].(string),
|
||||||
|
FromPath: req.Params.Arguments["from_path"].(string),
|
||||||
|
SHA: req.Params.Arguments["sha"].(string),
|
||||||
|
FileOptions: gitea_sdk.FileOptions{
|
||||||
|
Message: req.Params.Arguments["message"].(string),
|
||||||
|
BranchName: req.Params.Arguments["branch_name"].(string),
|
||||||
|
NewBranchName: req.Params.Arguments["new_branch_name"].(string),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
_, _, err := gitea.Client().UpdateFile(owner, repo, filePath, opt)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("update file err: %v", err)
|
||||||
|
}
|
||||||
|
return to.TextResult("Update file success")
|
||||||
|
}
|
||||||
|
|
||||||
|
func DeleteFileFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
|
log.Debugf("Called DeleteFileFn")
|
||||||
|
owner := req.Params.Arguments["owner"].(string)
|
||||||
|
repo := req.Params.Arguments["repo"].(string)
|
||||||
|
filePath := req.Params.Arguments["filePath"].(string)
|
||||||
|
opt := gitea_sdk.DeleteFileOptions{
|
||||||
|
FileOptions: gitea_sdk.FileOptions{
|
||||||
|
Message: req.Params.Arguments["message"].(string),
|
||||||
|
BranchName: req.Params.Arguments["branch_name"].(string),
|
||||||
|
},
|
||||||
|
SHA: req.Params.Arguments["sha"].(string),
|
||||||
|
}
|
||||||
|
_, err := gitea.Client().DeleteFile(owner, repo, filePath, opt)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("delete file err: %v", err)
|
||||||
|
}
|
||||||
|
return to.TextResult("Delete file success")
|
||||||
|
}
|
@@ -2,18 +2,22 @@ package repo
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
gitea_sdk "code.gitea.io/sdk/gitea"
|
|
||||||
"gitea.com/gitea/gitea-mcp/pkg/gitea"
|
"gitea.com/gitea/gitea-mcp/pkg/gitea"
|
||||||
"gitea.com/gitea/gitea-mcp/pkg/log"
|
"gitea.com/gitea/gitea-mcp/pkg/log"
|
||||||
|
"gitea.com/gitea/gitea-mcp/pkg/ptr"
|
||||||
"gitea.com/gitea/gitea-mcp/pkg/to"
|
"gitea.com/gitea/gitea-mcp/pkg/to"
|
||||||
|
|
||||||
|
gitea_sdk "code.gitea.io/sdk/gitea"
|
||||||
"github.com/mark3labs/mcp-go/mcp"
|
"github.com/mark3labs/mcp-go/mcp"
|
||||||
"github.com/mark3labs/mcp-go/server"
|
"github.com/mark3labs/mcp-go/server"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
CreateRepoToolName = "create_repo"
|
CreateRepoToolName = "create_repo"
|
||||||
|
ForkRepoToolName = "fork_repo"
|
||||||
ListMyReposToolName = "list_my_repos"
|
ListMyReposToolName = "list_my_repos"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -33,6 +37,15 @@ var (
|
|||||||
mcp.WithString("default_branch", mcp.Description("DefaultBranch of the repository (used when initializes and in template)"), mcp.DefaultString("main")),
|
mcp.WithString("default_branch", mcp.Description("DefaultBranch of the repository (used when initializes and in template)"), mcp.DefaultString("main")),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
ForkRepoTool = mcp.NewTool(
|
||||||
|
ForkRepoToolName,
|
||||||
|
mcp.WithDescription("Fork repository"),
|
||||||
|
mcp.WithString("user", mcp.Required(), mcp.Description("User name of the repository to fork")),
|
||||||
|
mcp.WithString("repo", mcp.Required(), mcp.Description("Repository name to fork")),
|
||||||
|
mcp.WithString("organization", mcp.Description("Organization name to fork")),
|
||||||
|
mcp.WithString("name", mcp.Description("Name of the forked repository")),
|
||||||
|
)
|
||||||
|
|
||||||
ListMyReposTool = mcp.NewTool(
|
ListMyReposTool = mcp.NewTool(
|
||||||
ListMyReposToolName,
|
ListMyReposToolName,
|
||||||
mcp.WithDescription("List my repositories"),
|
mcp.WithDescription("List my repositories"),
|
||||||
@@ -43,10 +56,22 @@ var (
|
|||||||
|
|
||||||
func RegisterTool(s *server.MCPServer) {
|
func RegisterTool(s *server.MCPServer) {
|
||||||
s.AddTool(CreateRepoTool, CreateRepoFn)
|
s.AddTool(CreateRepoTool, CreateRepoFn)
|
||||||
|
s.AddTool(ForkRepoTool, ForkRepoFn)
|
||||||
s.AddTool(ListMyReposTool, ListMyReposFn)
|
s.AddTool(ListMyReposTool, ListMyReposFn)
|
||||||
|
|
||||||
|
// File
|
||||||
|
s.AddTool(GetFileTool, GetFileFn)
|
||||||
|
s.AddTool(CreateFileTool, CreateFileFn)
|
||||||
|
s.AddTool(UpdateFileTool, UpdateFileFn)
|
||||||
|
s.AddTool(DeleteFileTool, DeleteFileFn)
|
||||||
|
|
||||||
// Branch
|
// Branch
|
||||||
s.AddTool(CreateBranchTool, CreateBranchFn)
|
s.AddTool(CreateBranchTool, CreateBranchFn)
|
||||||
|
s.AddTool(DeleteBranchTool, DeleteBranchFn)
|
||||||
|
s.AddTool(ListBranchesTool, ListBranchesFn)
|
||||||
|
|
||||||
|
// Commit
|
||||||
|
s.AddTool(ListRepoCommitsTool, ListRepoCommitsFn)
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateRepoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
func CreateRepoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
@@ -81,15 +106,30 @@ func CreateRepoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolRe
|
|||||||
return to.TextResult(repo)
|
return to.TextResult(repo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ForkRepoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
|
log.Debugf("Called ForkRepoFn")
|
||||||
|
user := req.Params.Arguments["user"].(string)
|
||||||
|
repo := req.Params.Arguments["repo"].(string)
|
||||||
|
opt := gitea_sdk.CreateForkOption{
|
||||||
|
Organization: ptr.To(req.Params.Arguments["organization"].(string)),
|
||||||
|
Name: ptr.To(req.Params.Arguments["name"].(string)),
|
||||||
|
}
|
||||||
|
_, _, err := gitea.Client().CreateFork(user, repo, opt)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("fork repository error %v", err)
|
||||||
|
}
|
||||||
|
return to.TextResult("Fork success")
|
||||||
|
}
|
||||||
|
|
||||||
func ListMyReposFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
func ListMyReposFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
log.Debugf("Called ListMyReposFn")
|
log.Debugf("Called ListMyReposFn")
|
||||||
page, ok := req.Params.Arguments["page"].(float64)
|
page, ok := req.Params.Arguments["page"].(float64)
|
||||||
if !ok {
|
if !ok {
|
||||||
return mcp.NewToolResultError("get page number error"), nil
|
return nil, errors.New("get page number error")
|
||||||
}
|
}
|
||||||
size, ok := req.Params.Arguments["pageSize"].(float64)
|
size, ok := req.Params.Arguments["pageSize"].(float64)
|
||||||
if !ok {
|
if !ok {
|
||||||
return mcp.NewToolResultError("get page size number error"), nil
|
return nil, errors.New("get page size number error")
|
||||||
}
|
}
|
||||||
opt := gitea_sdk.ListReposOptions{
|
opt := gitea_sdk.ListReposOptions{
|
||||||
ListOptions: gitea_sdk.ListOptions{
|
ListOptions: gitea_sdk.ListOptions{
|
||||||
@@ -99,7 +139,7 @@ func ListMyReposFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolR
|
|||||||
}
|
}
|
||||||
repos, _, err := gitea.Client().ListMyRepos(opt)
|
repos, _, err := gitea.Client().ListMyRepos(opt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mcp.NewToolResultError("List my repositories error"), err
|
return nil, fmt.Errorf("list my repositories error %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return to.TextResult(repos)
|
return to.TextResult(repos)
|
||||||
|
119
operation/search/search.go
Normal file
119
operation/search/search.go
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
package search
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"gitea.com/gitea/gitea-mcp/pkg/gitea"
|
||||||
|
"gitea.com/gitea/gitea-mcp/pkg/log"
|
||||||
|
"gitea.com/gitea/gitea-mcp/pkg/ptr"
|
||||||
|
"gitea.com/gitea/gitea-mcp/pkg/to"
|
||||||
|
|
||||||
|
gitea_sdk "code.gitea.io/sdk/gitea"
|
||||||
|
"github.com/mark3labs/mcp-go/mcp"
|
||||||
|
"github.com/mark3labs/mcp-go/server"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
SearchUsersToolName = "search_users"
|
||||||
|
SearchOrgTeamsToolName = "search_org_teams"
|
||||||
|
SearchReposToolName = "search_repos"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
SearchUsersTool = mcp.NewTool(
|
||||||
|
SearchUsersToolName,
|
||||||
|
mcp.WithDescription("search users"),
|
||||||
|
mcp.WithString("keyword", mcp.Description("Keyword"), mcp.DefaultString("")),
|
||||||
|
mcp.WithNumber("page", mcp.Description("Page"), mcp.DefaultNumber(1)),
|
||||||
|
mcp.WithNumber("pageSize", mcp.Description("PageSize"), mcp.DefaultNumber(100)),
|
||||||
|
)
|
||||||
|
|
||||||
|
SearOrgTeamsTool = mcp.NewTool(
|
||||||
|
SearchOrgTeamsToolName,
|
||||||
|
mcp.WithDescription("search organization teams"),
|
||||||
|
mcp.WithString("org", mcp.Description("organization name"), mcp.DefaultString("")),
|
||||||
|
mcp.WithString("query", mcp.Description("search organization teams"), mcp.DefaultString("")),
|
||||||
|
mcp.WithBoolean("includeDescription", mcp.Description("include description?"), mcp.DefaultBool(true)),
|
||||||
|
mcp.WithNumber("page", mcp.Description("Page"), mcp.DefaultNumber(1)),
|
||||||
|
mcp.WithNumber("pageSize", mcp.Description("PageSize"), mcp.DefaultNumber(100)),
|
||||||
|
)
|
||||||
|
|
||||||
|
SearchReposTool = mcp.NewTool(
|
||||||
|
SearchReposToolName,
|
||||||
|
mcp.WithDescription("search repos"),
|
||||||
|
mcp.WithString("keyword", mcp.Description("Keyword"), mcp.DefaultString("")),
|
||||||
|
mcp.WithBoolean("keywordIsTopic", mcp.Description("KeywordIsTopic"), mcp.DefaultBool(false)),
|
||||||
|
mcp.WithBoolean("keywordInDescription", mcp.Description("KeywordInDescription"), mcp.DefaultBool(false)),
|
||||||
|
mcp.WithNumber("ownerID", mcp.Description("OwnerID"), mcp.DefaultNumber(0)),
|
||||||
|
mcp.WithBoolean("isPrivate", mcp.Description("IsPrivate"), mcp.DefaultBool(false)),
|
||||||
|
mcp.WithBoolean("isArchived", mcp.Description("IsArchived"), mcp.DefaultBool(false)),
|
||||||
|
mcp.WithString("sort", mcp.Description("Sort"), mcp.DefaultString(""), mcp.Enum("")),
|
||||||
|
mcp.WithString("order", mcp.Description("Order"), mcp.DefaultString(""), mcp.Enum("")),
|
||||||
|
mcp.WithNumber("page", mcp.Description("Page"), mcp.DefaultNumber(1)),
|
||||||
|
mcp.WithNumber("pageSize", mcp.Description("PageSize"), mcp.DefaultNumber(100)),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
func RegisterTool(s *server.MCPServer) {
|
||||||
|
s.AddTool(SearchUsersTool, SearchUsersFn)
|
||||||
|
s.AddTool(SearOrgTeamsTool, SearchOrgTeamsFn)
|
||||||
|
s.AddTool(SearchReposTool, SearchReposFn)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SearchUsersFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
|
log.Debugf("Called SearchUsersFn")
|
||||||
|
opt := gitea_sdk.SearchUsersOption{
|
||||||
|
KeyWord: req.Params.Arguments["keyword"].(string),
|
||||||
|
ListOptions: gitea_sdk.ListOptions{
|
||||||
|
Page: req.Params.Arguments["page"].(int),
|
||||||
|
PageSize: req.Params.Arguments["pageSize"].(int),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
users, _, err := gitea.Client().SearchUsers(opt)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return to.TextResult(users)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SearchOrgTeamsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
|
log.Debugf("Called SearchOrgTeamsFn")
|
||||||
|
org := req.Params.Arguments["org"].(string)
|
||||||
|
opt := gitea_sdk.SearchTeamsOptions{
|
||||||
|
Query: req.Params.Arguments["query"].(string),
|
||||||
|
IncludeDescription: req.Params.Arguments["includeDescription"].(bool),
|
||||||
|
ListOptions: gitea_sdk.ListOptions{
|
||||||
|
Page: req.Params.Arguments["page"].(int),
|
||||||
|
PageSize: req.Params.Arguments["pageSize"].(int),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
teams, _, err := gitea.Client().SearchOrgTeams(org, &opt)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("search organization teams error: %v", err)
|
||||||
|
}
|
||||||
|
return to.TextResult(teams)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SearchReposFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
|
||||||
|
log.Debugf("Called SearchReposFn")
|
||||||
|
opt := gitea_sdk.SearchRepoOptions{
|
||||||
|
Keyword: req.Params.Arguments["keyword"].(string),
|
||||||
|
KeywordIsTopic: req.Params.Arguments["keywordIsTopic"].(bool),
|
||||||
|
KeywordInDescription: req.Params.Arguments["keywordInDescription"].(bool),
|
||||||
|
OwnerID: req.Params.Arguments["ownerID"].(int64),
|
||||||
|
IsPrivate: ptr.To(req.Params.Arguments["isPrivate"].(bool)),
|
||||||
|
IsArchived: ptr.To(req.Params.Arguments["isArchived"].(bool)),
|
||||||
|
Sort: req.Params.Arguments["sort"].(string),
|
||||||
|
Order: req.Params.Arguments["order"].(string),
|
||||||
|
ListOptions: gitea_sdk.ListOptions{
|
||||||
|
Page: req.Params.Arguments["page"].(int),
|
||||||
|
PageSize: req.Params.Arguments["pageSize"].(int),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
repos, _, err := gitea.Client().SearchRepos(opt)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("search repos error: %v", err)
|
||||||
|
}
|
||||||
|
return to.TextResult(repos)
|
||||||
|
}
|
@@ -2,6 +2,7 @@ package user
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"gitea.com/gitea/gitea-mcp/pkg/gitea"
|
"gitea.com/gitea/gitea-mcp/pkg/gitea"
|
||||||
"gitea.com/gitea/gitea-mcp/pkg/log"
|
"gitea.com/gitea/gitea-mcp/pkg/log"
|
||||||
@@ -30,7 +31,7 @@ func GetUserInfoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolR
|
|||||||
log.Debugf("Called GetUserInfoFn")
|
log.Debugf("Called GetUserInfoFn")
|
||||||
user, _, err := gitea.Client().GetMyUserInfo()
|
user, _, err := gitea.Client().GetMyUserInfo()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mcp.NewToolResultError("Get My User Info Error"), err
|
return nil, fmt.Errorf("get user info err: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return to.TextResult(user)
|
return to.TextResult(user)
|
||||||
|
@@ -2,6 +2,7 @@ package to
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
"gitea.com/gitea/gitea-mcp/pkg/log"
|
"gitea.com/gitea/gitea-mcp/pkg/log"
|
||||||
"github.com/mark3labs/mcp-go/mcp"
|
"github.com/mark3labs/mcp-go/mcp"
|
||||||
@@ -10,7 +11,7 @@ import (
|
|||||||
func TextResult(v any) (*mcp.CallToolResult, error) {
|
func TextResult(v any) (*mcp.CallToolResult, error) {
|
||||||
result, err := json.Marshal(v)
|
result, err := json.Marshal(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return mcp.NewToolResultError("marshal result error"), err
|
return nil, fmt.Errorf("marshal result err: %v", err)
|
||||||
}
|
}
|
||||||
log.Debugf("Text Result: %s", string(result))
|
log.Debugf("Text Result: %s", string(result))
|
||||||
return mcp.NewToolResultText(string(result)), nil
|
return mcp.NewToolResultText(string(result)), nil
|
||||||
|
Reference in New Issue
Block a user