update
This commit is contained in:
@@ -157,6 +157,7 @@ The Gitea MCP Server supports the following tools: | ||||
| create_release | Release | Create a new release in a repository | | ||||
| delete_release | Release | Delete a release from a repository | | ||||
| get_release | Release | Get a release | | ||||
| get_latest_release | Release | Get the latest release in a repository | | ||||
| list_releases | Release | List all releases in a repository | | ||||
| create_tag | Tag | Create a new tag | | ||||
| delete_tag | Tag | Delete a tag | | ||||
|
@@ -157,6 +157,7 @@ Gitea MCP 服务器支持以下工具: | ||||
| create_release | 版本发布 | 创建一个新版本发布 | | ||||
| delete_release | 版本发布 | 删除一个版本发布 | | ||||
| get_release | 版本发布 | 获取一个版本发布 | | ||||
| get_latest_release | 版本发布 | 获取最新的版本发布 | | ||||
| list_releases | 版本发布 | 列出所有版本发布 | | ||||
| create_tag | 标签 | 创建一个新标签 | | ||||
| delete_tag | 标签 | 删除一个标签 | | ||||
|
@@ -153,10 +153,11 @@ Gitea MCP 伺服器支持以下工具: | ||||
| create_branch | 分支 | 創建一個新分支 | | ||||
| delete_branch | 分支 | 刪除一個分支 | | ||||
| list_branches | 分支 | 列出倉庫中的所有分支 | | ||||
| create_release | 版本發布 | 創建一個新版本發布 | | ||||
| delete_release | 版本發布 | 刪除一個版本發布 | | ||||
| get_release | 版本發布 | 獲取一個版本發布 | | ||||
| list_releases | 版本發布 | 列出所有版本發布 | | ||||
| create_release | 版本發布 | 創建一個新版本發布 | | ||||
| delete_release | 版本發布 | 刪除一個版本發布 | | ||||
| get_release | 版本發布 | 獲取一個版本發布 | | ||||
| get_latest_release | 版本發布 | 獲取最新的版本發布 | | ||||
| list_releases | 版本發布 | 列出所有版本發布 | | ||||
| create_tag | 標籤 | 創建一個新標籤 | | ||||
| delete_tag | 標籤 | 刪除一個標籤 | | ||||
| get_tag | 標籤 | 獲取一個標籤 | | ||||
|
@@ -3,6 +3,7 @@ package repo | ||||
import ( | ||||
"context" | ||||
"fmt" | ||||
"time" | ||||
| ||||
gitea_sdk "code.gitea.io/sdk/gitea" | ||||
"gitea.com/gitea/gitea-mcp/pkg/gitea" | ||||
@@ -13,10 +14,11 @@ import ( | ||||
) | ||||
| ||||
const ( | ||||
CreateReleaseToolName = "create_release" | ||||
DeleteReleaseToolName = "delete_release" | ||||
GetReleaseToolName = "get_release" | ||||
ListReleasesToolName = "list_releases" | ||||
CreateReleaseToolName = "create_release" | ||||
DeleteReleaseToolName = "delete_release" | ||||
GetReleaseToolName = "get_release" | ||||
GetLatestReleaseToolName = "get_latest_release" | ||||
ListReleasesToolName = "list_releases" | ||||
) | ||||
| ||||
var ( | ||||
@@ -48,6 +50,13 @@ var ( | ||||
mcp.WithNumber("id", mcp.Required(), mcp.Description("release id")), | ||||
) | ||||
| ||||
GetLatestReleaseTool = mcp.NewTool( | ||||
GetLatestReleaseToolName, | ||||
mcp.WithDescription("Get latest release"), | ||||
mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner")), | ||||
mcp.WithString("repo", mcp.Required(), mcp.Description("repository name")), | ||||
) | ||||
| ||||
ListReleasesTool = mcp.NewTool( | ||||
ListReleasesToolName, | ||||
mcp.WithDescription("List releases"), | ||||
@@ -56,10 +65,23 @@ var ( | ||||
mcp.WithBoolean("is_draft", mcp.Description("Whether the release is draft"), mcp.DefaultBool(false)), | ||||
mcp.WithBoolean("is_pre_release", mcp.Description("Whether the release is pre-release"), mcp.DefaultBool(false)), | ||||
mcp.WithNumber("page", mcp.Description("page number"), mcp.DefaultNumber(1), mcp.Min(1)), | ||||
mcp.WithNumber("pageSize", mcp.Description("page size"), mcp.DefaultNumber(100), mcp.Min(1)), | ||||
mcp.WithNumber("pageSize", mcp.Description("page size"), mcp.DefaultNumber(20), mcp.Min(1)), | ||||
) | ||||
) | ||||
| ||||
// To avoid return too many tokens, we need to provide at least information as possible | ||||
// llm can call get release to get more information | ||||
type ListReleaseResult struct { | ||||
ID int64 `json:"id"` | ||||
TagName string `json:"tag_name"` | ||||
Target string `json:"target_commitish"` | ||||
Title string `json:"title"` | ||||
IsDraft bool `json:"draft"` | ||||
IsPrerelease bool `json:"prerelease"` | ||||
CreatedAt time.Time `json:"created_at"` | ||||
PublishedAt time.Time `json:"published_at"` | ||||
} | ||||
| ||||
func CreateReleaseFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { | ||||
log.Debugf("Called CreateReleasesFn") | ||||
owner, ok := req.Params.Arguments["owner"].(string) | ||||
@@ -145,6 +167,25 @@ func GetReleaseFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolRe | ||||
return to.TextResult(release) | ||||
} | ||||
| ||||
func GetLatestReleaseFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { | ||||
log.Debugf("Called GetLatestReleaseFn") | ||||
owner, ok := req.Params.Arguments["owner"].(string) | ||||
if !ok { | ||||
return nil, fmt.Errorf("owner is required") | ||||
} | ||||
repo, ok := req.Params.Arguments["repo"].(string) | ||||
if !ok { | ||||
return nil, fmt.Errorf("repo is required") | ||||
} | ||||
| ||||
release, _, err := gitea.Client().GetLatestRelease(owner, repo) | ||||
if err != nil { | ||||
return nil, fmt.Errorf("get latest release error: %v", err) | ||||
} | ||||
| ||||
return to.TextResult(release) | ||||
} | ||||
| ||||
func ListReleasesFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { | ||||
log.Debugf("Called ListReleasesFn") | ||||
owner, ok := req.Params.Arguments["owner"].(string) | ||||
@@ -172,5 +213,18 @@ func ListReleasesFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallTool | ||||
return nil, fmt.Errorf("list releases error: %v", err) | ||||
} | ||||
| ||||
return to.TextResult(releases) | ||||
results := make([]ListReleaseResult, len(releases)) | ||||
for _, release := range releases { | ||||
results = append(results, ListReleaseResult{ | ||||
ID: release.ID, | ||||
TagName: release.TagName, | ||||
Target: release.Target, | ||||
Title: release.Title, | ||||
IsDraft: release.IsDraft, | ||||
IsPrerelease: release.IsPrerelease, | ||||
CreatedAt: release.CreatedAt, | ||||
PublishedAt: release.PublishedAt, | ||||
}) | ||||
} | ||||
return to.TextResult(results) | ||||
} | ||||
|
@@ -74,6 +74,7 @@ func RegisterTool(s *server.MCPServer) { | ||||
s.AddTool(CreateReleaseTool, CreateReleaseFn) | ||||
s.AddTool(DeleteReleaseTool, DeleteReleaseFn) | ||||
s.AddTool(GetReleaseTool, GetReleaseFn) | ||||
s.AddTool(GetLatestReleaseTool, GetLatestReleaseFn) | ||||
s.AddTool(ListReleasesTool, ListReleasesFn) | ||||
| ||||
// Tag | ||||
|
@@ -51,10 +51,19 @@ var ( | ||||
mcp.WithString("owner", mcp.Required(), mcp.Description("repository owner")), | ||||
mcp.WithString("repo", mcp.Required(), mcp.Description("repository name")), | ||||
mcp.WithNumber("page", mcp.Description("page number"), mcp.DefaultNumber(1), mcp.Min(1)), | ||||
mcp.WithNumber("pageSize", mcp.Description("page size"), mcp.DefaultNumber(100), mcp.Min(1)), | ||||
mcp.WithNumber("pageSize", mcp.Description("page size"), mcp.DefaultNumber(20), mcp.Min(1)), | ||||
) | ||||
) | ||||
| ||||
// To avoid return too many tokens, we need to provide at least information as possible | ||||
// llm can call get tag to get more information | ||||
type ListTagResult struct { | ||||
ID string `json:"id"` | ||||
Name string `json:"name"` | ||||
Commit *gitea_sdk.CommitMeta `json:"commit"` | ||||
// message may be a long text, so we should not provide it here | ||||
} | ||||
| ||||
func CreateTagFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) { | ||||
log.Debugf("Called CreateTagFn") | ||||
owner, ok := req.Params.Arguments["owner"].(string) | ||||
@@ -153,5 +162,13 @@ func ListTagsFn(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResu | ||||
return nil, fmt.Errorf("list tags error: %v", err) | ||||
} | ||||
| ||||
return to.TextResult(tags) | ||||
results := make([]ListTagResult, 0, len(tags)) | ||||
for _, tag := range tags { | ||||
results = append(results, ListTagResult{ | ||||
ID: tag.ID, | ||||
Name: tag.Name, | ||||
Commit: tag.Commit, | ||||
}) | ||||
} | ||||
return to.TextResult(results) | ||||
} | ||||
|
Reference in New Issue
Block a user