mirror of
				https://gitea.com/gitea/gitea-mcp.git
				synced 2025-11-04 04:11:50 +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)
 | 
			
		||||
	issue, _, err := gitea.Client().GetIssue(owner, repo, int64(index))
 | 
			
		||||
	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)
 | 
			
		||||
@@ -92,7 +92,7 @@ func GetPullRequestByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp
 | 
			
		||||
	index := req.Params.Arguments["index"].(float64)
 | 
			
		||||
	pr, _, err := gitea.Client().GetPullRequest(owner, repo, int64(index))
 | 
			
		||||
	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)
 | 
			
		||||
@@ -109,7 +109,7 @@ func CreateIssueFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolR
 | 
			
		||||
		Body:  body,
 | 
			
		||||
	})
 | 
			
		||||
	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)
 | 
			
		||||
@@ -125,7 +125,7 @@ func CreateIssueCommentFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.Ca
 | 
			
		||||
		Body: body,
 | 
			
		||||
	})
 | 
			
		||||
	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)
 | 
			
		||||
@@ -146,7 +146,7 @@ func CreatePullRequestFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.Cal
 | 
			
		||||
		Base:  base,
 | 
			
		||||
	})
 | 
			
		||||
	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)
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ import (
 | 
			
		||||
 | 
			
		||||
	"gitea.com/gitea/gitea-mcp/operation/issue"
 | 
			
		||||
	"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/version"
 | 
			
		||||
	"gitea.com/gitea/gitea-mcp/pkg/flag"
 | 
			
		||||
@@ -27,6 +28,9 @@ func RegisterTool(s *server.MCPServer) {
 | 
			
		||||
	// Issue Tool
 | 
			
		||||
	issue.RegisterTool(s)
 | 
			
		||||
 | 
			
		||||
	// Search Tool
 | 
			
		||||
	search.RegisterTool(s)
 | 
			
		||||
 | 
			
		||||
	// Version Tool
 | 
			
		||||
	version.RegisterTool(s)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,16 +2,20 @@ package repo
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"gitea.com/gitea/gitea-mcp/pkg/gitea"
 | 
			
		||||
	"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"
 | 
			
		||||
	"github.com/mark3labs/mcp-go/mcp"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	CreateBranchToolName = "create_branch"
 | 
			
		||||
	DeleteBranchToolName = "delete_branch"
 | 
			
		||||
	ListBranchesToolName = "list_branches"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
@@ -23,6 +27,21 @@ var (
 | 
			
		||||
		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("")),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	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) {
 | 
			
		||||
@@ -37,8 +56,39 @@ func CreateBranchFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallTool
 | 
			
		||||
		OldBranchName: oldBranch,
 | 
			
		||||
	})
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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 (
 | 
			
		||||
	"context"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"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/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 (
 | 
			
		||||
	CreateRepoToolName  = "create_repo"
 | 
			
		||||
	ForkRepoToolName    = "fork_repo"
 | 
			
		||||
	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")),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	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(
 | 
			
		||||
		ListMyReposToolName,
 | 
			
		||||
		mcp.WithDescription("List my repositories"),
 | 
			
		||||
@@ -43,10 +56,22 @@ var (
 | 
			
		||||
 | 
			
		||||
func RegisterTool(s *server.MCPServer) {
 | 
			
		||||
	s.AddTool(CreateRepoTool, CreateRepoFn)
 | 
			
		||||
	s.AddTool(ForkRepoTool, ForkRepoFn)
 | 
			
		||||
	s.AddTool(ListMyReposTool, ListMyReposFn)
 | 
			
		||||
 | 
			
		||||
	// File
 | 
			
		||||
	s.AddTool(GetFileTool, GetFileFn)
 | 
			
		||||
	s.AddTool(CreateFileTool, CreateFileFn)
 | 
			
		||||
	s.AddTool(UpdateFileTool, UpdateFileFn)
 | 
			
		||||
	s.AddTool(DeleteFileTool, DeleteFileFn)
 | 
			
		||||
 | 
			
		||||
	// Branch
 | 
			
		||||
	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) {
 | 
			
		||||
@@ -81,15 +106,30 @@ func CreateRepoFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolRe
 | 
			
		||||
	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) {
 | 
			
		||||
	log.Debugf("Called ListMyReposFn")
 | 
			
		||||
	page, ok := req.Params.Arguments["page"].(float64)
 | 
			
		||||
	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)
 | 
			
		||||
	if !ok {
 | 
			
		||||
		return mcp.NewToolResultError("get page size number error"), nil
 | 
			
		||||
		return nil, errors.New("get page size number error")
 | 
			
		||||
	}
 | 
			
		||||
	opt := gitea_sdk.ListReposOptions{
 | 
			
		||||
		ListOptions: gitea_sdk.ListOptions{
 | 
			
		||||
@@ -99,7 +139,7 @@ func ListMyReposFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolR
 | 
			
		||||
	}
 | 
			
		||||
	repos, _, err := gitea.Client().ListMyRepos(opt)
 | 
			
		||||
	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)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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 (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"gitea.com/gitea/gitea-mcp/pkg/gitea"
 | 
			
		||||
	"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")
 | 
			
		||||
	user, _, err := gitea.Client().GetMyUserInfo()
 | 
			
		||||
	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)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,7 @@ package to
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"encoding/json"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"gitea.com/gitea/gitea-mcp/pkg/log"
 | 
			
		||||
	"github.com/mark3labs/mcp-go/mcp"
 | 
			
		||||
@@ -10,7 +11,7 @@ import (
 | 
			
		||||
func TextResult(v any) (*mcp.CallToolResult, error) {
 | 
			
		||||
	result, err := json.Marshal(v)
 | 
			
		||||
	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))
 | 
			
		||||
	return mcp.NewToolResultText(string(result)), nil
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user