mirror of
				https://gitea.com/gitea/gitea-mcp.git
				synced 2025-10-30 01:41: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 | 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 | ## 🐛 Debugging | ||||||
|  |  | ||||||
| To enable debug mode, add the `-d` flag when running the Gitea MCP Server with sse mode: | To enable debug mode, add the `-d` flag when running the Gitea MCP Server with sse mode: | ||||||
|   | |||||||
| @@ -14,11 +14,10 @@ import ( | |||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
| 	GetIssueByIndexToolName       = "get_issue_by_index" | 	GetIssueByIndexToolName    = "get_issue_by_index" | ||||||
| 	GetPullRequestByIndexToolName = "get_pull_request_by_index" | 	ListRepoIssuesToolName     = "list_repo_issues" | ||||||
| 	CreateIssueToolName           = "create_issue" | 	CreateIssueToolName        = "create_issue" | ||||||
| 	CreateIssueCommentToolName    = "create_issue_comment" | 	CreateIssueCommentToolName = "create_issue_comment" | ||||||
| 	CreatePullRequestToolName     = "create_pull_request" |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| @@ -29,13 +28,12 @@ var ( | |||||||
| 		mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")), | 		mcp.WithString("repo", mcp.Required(), mcp.Description("repository name"), mcp.DefaultString("")), | ||||||
| 		mcp.WithNumber("index", mcp.Required(), mcp.Description("repository issue index"), mcp.DefaultNumber(0)), | 		mcp.WithNumber("index", mcp.Required(), mcp.Description("repository issue index"), mcp.DefaultNumber(0)), | ||||||
| 	) | 	) | ||||||
| 	GetPullRequestByIndexTool = mcp.NewTool( |  | ||||||
| 		GetPullRequestByIndexToolName, | 	ListRepoIssuesTool = mcp.NewTool( | ||||||
| 		mcp.WithDescription("get pull request by index"), | 		ListRepoIssuesToolName, | ||||||
| 		mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner"), mcp.DefaultString("")), | 		mcp.WithDescription("List repository issues"), | ||||||
| 		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)), |  | ||||||
| 	) | 	) | ||||||
|  |  | ||||||
| 	CreateIssueTool = mcp.NewTool( | 	CreateIssueTool = mcp.NewTool( | ||||||
| 		CreateIssueToolName, | 		CreateIssueToolName, | ||||||
| 		mcp.WithDescription("create issue"), | 		mcp.WithDescription("create issue"), | ||||||
| @@ -52,24 +50,13 @@ var ( | |||||||
| 		mcp.WithNumber("index", mcp.Required(), mcp.Description("repository issue index"), mcp.DefaultNumber(0)), | 		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("")), | 		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) { | func RegisterTool(s *server.MCPServer) { | ||||||
| 	s.AddTool(GetIssueByIndexTool, GetIssueByIndexFn) | 	s.AddTool(GetIssueByIndexTool, GetIssueByIndexFn) | ||||||
| 	s.AddTool(GetPullRequestByIndexTool, GetPullRequestByIndexFn) | 	s.AddTool(ListRepoIssuesTool, ListRepoIssuesFn) | ||||||
| 	s.AddTool(CreateIssueTool, CreateIssueFn) | 	s.AddTool(CreateIssueTool, CreateIssueFn) | ||||||
| 	s.AddTool(CreateIssueCommentTool, CreateIssueCommentFn) | 	s.AddTool(CreateIssueCommentTool, CreateIssueCommentFn) | ||||||
| 	s.AddTool(CreatePullRequestTool, CreatePullRequestFn) |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func GetIssueByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { | 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) | 	return to.TextResult(issue) | ||||||
| } | } | ||||||
|  |  | ||||||
| func GetPullRequestByIndexFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { | func ListRepoIssuesFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { | ||||||
| 	log.Debugf("Called GetPullRequestByIndexFn") | 	log.Debugf("Called ListIssuesFn") | ||||||
| 	owner := req.Params.Arguments["owner"].(string) | 	owner := req.Params.Arguments["owner"].(string) | ||||||
| 	repo := req.Params.Arguments["repo"].(string) | 	repo := req.Params.Arguments["repo"].(string) | ||||||
| 	index := req.Params.Arguments["index"].(float64) | 	opt := gitea_sdk.ListIssueOption{} | ||||||
| 	pr, _, err := gitea.Client().GetPullRequest(owner, repo, int64(index)) | 	issues, _, err := gitea.Client().ListRepoIssues(owner, repo, opt) | ||||||
| 	if err != nil { | 	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(issues) | ||||||
| 	return to.TextResult(pr) |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func CreateIssueFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { | 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) | 	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" | 	"fmt" | ||||||
|  |  | ||||||
| 	"gitea.com/gitea/gitea-mcp/operation/issue" | 	"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/repo" | ||||||
| 	"gitea.com/gitea/gitea-mcp/operation/search" | 	"gitea.com/gitea/gitea-mcp/operation/search" | ||||||
| 	"gitea.com/gitea/gitea-mcp/operation/user" | 	"gitea.com/gitea/gitea-mcp/operation/user" | ||||||
| @@ -28,6 +29,9 @@ func RegisterTool(s *server.MCPServer) { | |||||||
| 	// Issue Tool | 	// Issue Tool | ||||||
| 	issue.RegisterTool(s) | 	issue.RegisterTool(s) | ||||||
|  |  | ||||||
|  | 	// Pull Tool | ||||||
|  | 	pull.RegisterTool(s) | ||||||
|  |  | ||||||
| 	// Search Tool | 	// Search Tool | ||||||
| 	search.RegisterTool(s) | 	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