mirror of
				https://gitea.com/gitea/gitea-mcp.git
				synced 2025-11-04 04:11:50 +00:00 
			
		
		
		
	Update
This commit is contained in:
		
							
								
								
									
										31
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								README.md
									
									
									
									
									
								
							@@ -79,6 +79,37 @@ Once everything is set up, try typing the following in your MCP-compatible chatb
 | 
			
		||||
list all my repositories
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## ✅Available Tools
 | 
			
		||||
 | 
			
		||||
The Gitea MCP Server supports the following tools:
 | 
			
		||||
 | 
			
		||||
|  Tool  |  Scope  | Description  |
 | 
			
		||||
|:------:|:-------:|:------------:|
 | 
			
		||||
|get_my_user_info|User|Get the information of the authenticated user|
 | 
			
		||||
|create_repo|Repository|Create a new repository|
 | 
			
		||||
|fork_repo|Repository|Fork a repository|
 | 
			
		||||
|list_my_repos|Repository|List all repositories owned by the authenticated user|
 | 
			
		||||
|create_branch|Branch|Create a new branch|
 | 
			
		||||
|delete_branch|Branch|Delete a branch|
 | 
			
		||||
|list_branches|Branch|List all branches in a repository|
 | 
			
		||||
|list_repo_commits|Commit|List all commits in a repository|
 | 
			
		||||
|get_file|File|Get the content of a file|
 | 
			
		||||
|create_file|File|Create a new file|
 | 
			
		||||
|update_file|File|Update an existing file|
 | 
			
		||||
|delete_file|File|Delete a file|
 | 
			
		||||
|get_issue_by_index|Issue|Get an issue by its index|
 | 
			
		||||
|list_repo_issues|Issue|List all issues in a repository|
 | 
			
		||||
|create_issue|Issue|Create a new issue|
 | 
			
		||||
|create_issue_comment|Issue|Create a comment on an issue|
 | 
			
		||||
|get_pull_request_by_index|Pull Request|Get a pull request by its index|
 | 
			
		||||
|list_repo_pull_requests|Pull Request|List all pull requests in a repository|
 | 
			
		||||
|create_pull_request|Pull Request|Create a new pull request|
 | 
			
		||||
|search_users|User|Search for users|
 | 
			
		||||
|search_org_teams|Organization|Search for teams in an organization|
 | 
			
		||||
|search_repos|Repository|Search for repositories|
 | 
			
		||||
|get_gitea_mcp_server_version|Server|Get the version of the Gitea MCP Server|
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 🐛 Debugging
 | 
			
		||||
 | 
			
		||||
To enable debug mode, add the `-d` flag when running the Gitea MCP Server with sse mode:
 | 
			
		||||
 
 | 
			
		||||
@@ -14,11 +14,10 @@ import (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	GetIssueByIndexToolName       = "get_issue_by_index"
 | 
			
		||||
	GetPullRequestByIndexToolName = "get_pull_request_by_index"
 | 
			
		||||
	CreateIssueToolName           = "create_issue"
 | 
			
		||||
	CreateIssueCommentToolName    = "create_issue_comment"
 | 
			
		||||
	CreatePullRequestToolName     = "create_pull_request"
 | 
			
		||||
	GetIssueByIndexToolName    = "get_issue_by_index"
 | 
			
		||||
	ListRepoIssuesToolName     = "list_repo_issues"
 | 
			
		||||
	CreateIssueToolName        = "create_issue"
 | 
			
		||||
	CreateIssueCommentToolName = "create_issue_comment"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
@@ -29,13 +28,12 @@ var (
 | 
			
		||||
		mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithNumber("index", mcp.Required(), mcp.Description("repository issue index"), mcp.DefaultNumber(0)),
 | 
			
		||||
	)
 | 
			
		||||
	GetPullRequestByIndexTool = mcp.NewTool(
 | 
			
		||||
		GetPullRequestByIndexToolName,
 | 
			
		||||
		mcp.WithDescription("get pull request by index"),
 | 
			
		||||
		mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithNumber("index", mcp.Required(), mcp.Description("repository pull request index"), mcp.DefaultNumber(0)),
 | 
			
		||||
 | 
			
		||||
	ListRepoIssuesTool = mcp.NewTool(
 | 
			
		||||
		ListRepoIssuesToolName,
 | 
			
		||||
		mcp.WithDescription("List repository issues"),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	CreateIssueTool = mcp.NewTool(
 | 
			
		||||
		CreateIssueToolName,
 | 
			
		||||
		mcp.WithDescription("create issue"),
 | 
			
		||||
@@ -52,24 +50,13 @@ var (
 | 
			
		||||
		mcp.WithNumber("index", mcp.Required(), mcp.Description("repository issue index"), mcp.DefaultNumber(0)),
 | 
			
		||||
		mcp.WithString("body", mcp.Required(), mcp.Description("issue comment body"), mcp.DefaultString("")),
 | 
			
		||||
	)
 | 
			
		||||
	CreatePullRequestTool = mcp.NewTool(
 | 
			
		||||
		CreatePullRequestToolName,
 | 
			
		||||
		mcp.WithDescription("create pull request"),
 | 
			
		||||
		mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("title", mcp.Required(), mcp.Description("pull request title"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("body", mcp.Required(), mcp.Description("pull request body"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("head", mcp.Required(), mcp.Description("pull request head"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("base", mcp.Required(), mcp.Description("pull request base"), mcp.DefaultString("")),
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func RegisterTool(s *server.MCPServer) {
 | 
			
		||||
	s.AddTool(GetIssueByIndexTool, GetIssueByIndexFn)
 | 
			
		||||
	s.AddTool(GetPullRequestByIndexTool, GetPullRequestByIndexFn)
 | 
			
		||||
	s.AddTool(ListRepoIssuesTool, ListRepoIssuesFn)
 | 
			
		||||
	s.AddTool(CreateIssueTool, CreateIssueFn)
 | 
			
		||||
	s.AddTool(CreateIssueCommentTool, CreateIssueCommentFn)
 | 
			
		||||
	s.AddTool(CreatePullRequestTool, CreatePullRequestFn)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetIssueByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
 | 
			
		||||
@@ -85,17 +72,16 @@ func GetIssueByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallT
 | 
			
		||||
	return to.TextResult(issue)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetPullRequestByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
 | 
			
		||||
	log.Debugf("Called GetPullRequestByIndexFn")
 | 
			
		||||
func ListRepoIssuesFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
 | 
			
		||||
	log.Debugf("Called ListIssuesFn")
 | 
			
		||||
	owner := req.Params.Arguments["owner"].(string)
 | 
			
		||||
	repo := req.Params.Arguments["repo"].(string)
 | 
			
		||||
	index := req.Params.Arguments["index"].(float64)
 | 
			
		||||
	pr, _, err := gitea.Client().GetPullRequest(owner, repo, int64(index))
 | 
			
		||||
	opt := gitea_sdk.ListIssueOption{}
 | 
			
		||||
	issues, _, err := gitea.Client().ListRepoIssues(owner, repo, opt)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("get %v/%v/pr/%v err", owner, repo, int64(index))
 | 
			
		||||
		return nil, fmt.Errorf("get %v/%v/issues err", owner, repo)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return to.TextResult(pr)
 | 
			
		||||
	return to.TextResult(issues)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CreateIssueFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
 | 
			
		||||
@@ -130,24 +116,3 @@ func CreateIssueCommentFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.Ca
 | 
			
		||||
 | 
			
		||||
	return to.TextResult(issueComment)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CreatePullRequestFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
 | 
			
		||||
	log.Debugf("Called CreatePullRequestFn")
 | 
			
		||||
	owner := req.Params.Arguments["owner"].(string)
 | 
			
		||||
	repo := req.Params.Arguments["repo"].(string)
 | 
			
		||||
	title := req.Params.Arguments["title"].(string)
 | 
			
		||||
	body := req.Params.Arguments["body"].(string)
 | 
			
		||||
	head := req.Params.Arguments["head"].(string)
 | 
			
		||||
	base := req.Params.Arguments["base"].(string)
 | 
			
		||||
	pr, _, err := gitea.Client().CreatePullRequest(owner, repo, gitea_sdk.CreatePullRequestOption{
 | 
			
		||||
		Title: title,
 | 
			
		||||
		Body:  body,
 | 
			
		||||
		Head:  head,
 | 
			
		||||
		Base:  base,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("create %v/%v/pull_request err", owner, repo)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return to.TextResult(pr)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -4,6 +4,7 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"gitea.com/gitea/gitea-mcp/operation/issue"
 | 
			
		||||
	"gitea.com/gitea/gitea-mcp/operation/pull"
 | 
			
		||||
	"gitea.com/gitea/gitea-mcp/operation/repo"
 | 
			
		||||
	"gitea.com/gitea/gitea-mcp/operation/search"
 | 
			
		||||
	"gitea.com/gitea/gitea-mcp/operation/user"
 | 
			
		||||
@@ -28,6 +29,9 @@ func RegisterTool(s *server.MCPServer) {
 | 
			
		||||
	// Issue Tool
 | 
			
		||||
	issue.RegisterTool(s)
 | 
			
		||||
 | 
			
		||||
	// Pull Tool
 | 
			
		||||
	pull.RegisterTool(s)
 | 
			
		||||
 | 
			
		||||
	// Search Tool
 | 
			
		||||
	search.RegisterTool(s)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										112
									
								
								operation/pull/pull.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								operation/pull/pull.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,112 @@
 | 
			
		||||
package pull
 | 
			
		||||
 | 
			
		||||
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"
 | 
			
		||||
	"github.com/mark3labs/mcp-go/server"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	GetPullRequestByIndexToolName = "get_pull_request_by_index"
 | 
			
		||||
	ListRepoPullRequestsToolName  = "list_repo_pull_requests"
 | 
			
		||||
	CreatePullRequestToolName     = "create_pull_request"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	GetPullRequestByIndexTool = mcp.NewTool(
 | 
			
		||||
		GetPullRequestByIndexToolName,
 | 
			
		||||
		mcp.WithDescription("get pull request by index"),
 | 
			
		||||
		mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithNumber("index", mcp.Required(), mcp.Description("repository pull request index"), mcp.DefaultNumber(0)),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	ListRepoPullRequestsTool = mcp.NewTool(
 | 
			
		||||
		ListRepoPullRequestsToolName,
 | 
			
		||||
		mcp.WithDescription("List repository pull requests"),
 | 
			
		||||
		mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("state", mcp.Description("state"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("sort", mcp.Description("sort"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithNumber("milestone", mcp.Description("milestone"), mcp.DefaultNumber(0)),
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	CreatePullRequestTool = mcp.NewTool(
 | 
			
		||||
		CreatePullRequestToolName,
 | 
			
		||||
		mcp.WithDescription("create pull request"),
 | 
			
		||||
		mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("title", mcp.Required(), mcp.Description("pull request title"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("body", mcp.Required(), mcp.Description("pull request body"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("head", mcp.Required(), mcp.Description("pull request head"), mcp.DefaultString("")),
 | 
			
		||||
		mcp.WithString("base", mcp.Required(), mcp.Description("pull request base"), mcp.DefaultString("")),
 | 
			
		||||
	)
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func RegisterTool(s *server.MCPServer) {
 | 
			
		||||
	s.AddTool(GetPullRequestByIndexTool, GetPullRequestByIndexFn)
 | 
			
		||||
	s.AddTool(ListRepoPullRequestsTool, ListRepoPullRequestsFn)
 | 
			
		||||
	s.AddTool(CreatePullRequestTool, CreatePullRequestFn)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetPullRequestByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
 | 
			
		||||
	log.Debugf("Called GetPullRequestByIndexFn")
 | 
			
		||||
	owner := req.Params.Arguments["owner"].(string)
 | 
			
		||||
	repo := req.Params.Arguments["repo"].(string)
 | 
			
		||||
	index := req.Params.Arguments["index"].(float64)
 | 
			
		||||
	pr, _, err := gitea.Client().GetPullRequest(owner, repo, int64(index))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("get %v/%v/pr/%v err", owner, repo, int64(index))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return to.TextResult(pr)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func ListRepoPullRequestsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
 | 
			
		||||
	log.Debugf("Called ListRepoPullRequests")
 | 
			
		||||
	owner := req.Params.Arguments["owner"].(string)
 | 
			
		||||
	repo := req.Params.Arguments["repo"].(string)
 | 
			
		||||
	opt := gitea_sdk.ListPullRequestsOptions{
 | 
			
		||||
		State:     gitea_sdk.StateType(req.Params.Arguments["state"].(string)),
 | 
			
		||||
		Sort:      req.Params.Arguments["sort"].(string),
 | 
			
		||||
		Milestone: req.Params.Arguments["milestone"].(int64),
 | 
			
		||||
		ListOptions: gitea_sdk.ListOptions{
 | 
			
		||||
			Page:     1,
 | 
			
		||||
			PageSize: 1000,
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
	pullRequests, _, err := gitea.Client().ListRepoPullRequests("", "", opt)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("list %v/%v/pull_requests err", owner, repo)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return to.TextResult(pullRequests)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func CreatePullRequestFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
 | 
			
		||||
	log.Debugf("Called CreatePullRequestFn")
 | 
			
		||||
	owner := req.Params.Arguments["owner"].(string)
 | 
			
		||||
	repo := req.Params.Arguments["repo"].(string)
 | 
			
		||||
	title := req.Params.Arguments["title"].(string)
 | 
			
		||||
	body := req.Params.Arguments["body"].(string)
 | 
			
		||||
	head := req.Params.Arguments["head"].(string)
 | 
			
		||||
	base := req.Params.Arguments["base"].(string)
 | 
			
		||||
	pr, _, err := gitea.Client().CreatePullRequest(owner, repo, gitea_sdk.CreatePullRequestOption{
 | 
			
		||||
		Title: title,
 | 
			
		||||
		Body:  body,
 | 
			
		||||
		Head:  head,
 | 
			
		||||
		Base:  base,
 | 
			
		||||
	})
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("create %v/%v/pull_request err", owner, repo)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return to.TextResult(pr)
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user