mirror of
https://gitea.com/gitea/gitea-mcp.git
synced 2025-08-23 22:33:05 +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:
|
||||||
|
@@ -15,10 +15,9 @@ 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