mirror of
https://gitea.com/gitea/gitea-mcp.git
synced 2026-03-13 16:35:12 +00:00
Consolidate 110 individual MCP tools down to 45 using a method dispatch pattern, aligning tool names with the GitHub MCP server conventions. **Motivation:** LLMs work better with fewer, well-organized tools. The method dispatch pattern (used by GitHub's MCP server) groups related operations under read/write tools with a `method` parameter. **Changes:** - Group related tools into `_read`/`_write` pairs with method dispatch (e.g. `issue_read`, `issue_write`, `pull_request_read`, `pull_request_write`) - Rename tools to match GitHub MCP naming (`get_file_contents`, `create_or_update_file`, `list_issues`, `list_pull_requests`, etc.) - Rename `pageSize` to `perPage` for GitHub MCP compat - Move issue label ops (`add_labels`, `remove_label`, etc.) into `issue_write` - Merge `create_file`/`update_file` into `create_or_update_file` with optional `sha` - Make `delete_file` require `sha` - Add `get_labels` method to `issue_read` - Add shared helpers: `GetInt64Slice`, `GetStringSlice`, `GetPagination` in params package - Unexport all dispatch handler functions - Fix: pass assignees/milestone in `CreateIssue`, bounds check in `GetFileContent` Reviewed-on: https://gitea.com/gitea/gitea-mcp/pulls/143 Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: silverwind <me@silverwind.io> Co-committed-by: silverwind <me@silverwind.io>
134 lines
2.6 KiB
Go
134 lines
2.6 KiB
Go
package issue
|
|
|
|
import (
|
|
gitea_sdk "code.gitea.io/sdk/gitea"
|
|
)
|
|
|
|
func userLogin(u *gitea_sdk.User) string {
|
|
if u == nil {
|
|
return ""
|
|
}
|
|
return u.UserName
|
|
}
|
|
|
|
func userLogins(users []*gitea_sdk.User) []string {
|
|
if len(users) == 0 {
|
|
return nil
|
|
}
|
|
out := make([]string, 0, len(users))
|
|
for _, u := range users {
|
|
if u != nil {
|
|
out = append(out, u.UserName)
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
|
|
func labelNames(labels []*gitea_sdk.Label) []string {
|
|
if len(labels) == 0 {
|
|
return nil
|
|
}
|
|
out := make([]string, 0, len(labels))
|
|
for _, l := range labels {
|
|
if l != nil {
|
|
out = append(out, l.Name)
|
|
}
|
|
}
|
|
return out
|
|
}
|
|
|
|
func slimIssue(i *gitea_sdk.Issue) map[string]any {
|
|
if i == nil {
|
|
return nil
|
|
}
|
|
m := map[string]any{
|
|
"number": i.Index,
|
|
"title": i.Title,
|
|
"body": i.Body,
|
|
"state": i.State,
|
|
"html_url": i.HTMLURL,
|
|
"user": userLogin(i.Poster),
|
|
"labels": labelNames(i.Labels),
|
|
"comments": i.Comments,
|
|
"created_at": i.Created,
|
|
"updated_at": i.Updated,
|
|
"closed_at": i.Closed,
|
|
}
|
|
if len(i.Assignees) > 0 {
|
|
m["assignees"] = userLogins(i.Assignees)
|
|
}
|
|
if i.Milestone != nil {
|
|
m["milestone"] = map[string]any{
|
|
"id": i.Milestone.ID,
|
|
"title": i.Milestone.Title,
|
|
}
|
|
}
|
|
if i.PullRequest != nil {
|
|
m["is_pull"] = true
|
|
}
|
|
return m
|
|
}
|
|
|
|
func slimIssues(issues []*gitea_sdk.Issue) []map[string]any {
|
|
out := make([]map[string]any, 0, len(issues))
|
|
for _, i := range issues {
|
|
if i == nil {
|
|
continue
|
|
}
|
|
m := map[string]any{
|
|
"number": i.Index,
|
|
"title": i.Title,
|
|
"state": i.State,
|
|
"html_url": i.HTMLURL,
|
|
"user": userLogin(i.Poster),
|
|
"comments": i.Comments,
|
|
"created_at": i.Created,
|
|
"updated_at": i.Updated,
|
|
}
|
|
if len(i.Labels) > 0 {
|
|
m["labels"] = labelNames(i.Labels)
|
|
}
|
|
out = append(out, m)
|
|
}
|
|
return out
|
|
}
|
|
|
|
func slimComment(c *gitea_sdk.Comment) map[string]any {
|
|
if c == nil {
|
|
return nil
|
|
}
|
|
return map[string]any{
|
|
"id": c.ID,
|
|
"body": c.Body,
|
|
"user": userLogin(c.Poster),
|
|
"html_url": c.HTMLURL,
|
|
"created_at": c.Created,
|
|
"updated_at": c.Updated,
|
|
}
|
|
}
|
|
|
|
func slimComments(comments []*gitea_sdk.Comment) []map[string]any {
|
|
out := make([]map[string]any, 0, len(comments))
|
|
for _, c := range comments {
|
|
out = append(out, slimComment(c))
|
|
}
|
|
return out
|
|
}
|
|
|
|
func slimLabels(labels []*gitea_sdk.Label) []map[string]any {
|
|
out := make([]map[string]any, 0, len(labels))
|
|
for _, l := range labels {
|
|
if l == nil {
|
|
continue
|
|
}
|
|
out = append(out, map[string]any{
|
|
"id": l.ID,
|
|
"name": l.Name,
|
|
"color": l.Color,
|
|
"description": l.Description,
|
|
"exclusive": l.Exclusive,
|
|
})
|
|
}
|
|
return out
|
|
}
|