Skip to content

Commit aa9a952

Browse files
updates mcp-server with latest google-go-github APIs
1 parent b98af18 commit aa9a952

File tree

1 file changed

+31
-75
lines changed

1 file changed

+31
-75
lines changed

pkg/github/projects.go

Lines changed: 31 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -256,30 +256,19 @@ func ListProjectFields(getClient GetClientFn, t translations.TranslationHelperFu
256256
return mcp.NewToolResultError(err.Error()), nil
257257
}
258258

259+
var resp *github.Response
260+
var projectFields []*github.ProjectV2Field
261+
259262
opts := &github.ListProjectsOptions{
260263
ListProjectsPaginationOptions: pagination,
261264
}
262265

263-
var url string
264266
if ownerType == "org" {
265-
url = fmt.Sprintf("orgs/%s/projectsV2/%d/fields", owner, projectNumber)
267+
projectFields, resp, err = client.Projects.ListOrganizationProjectFields(ctx, owner, projectNumber, opts)
266268
} else {
267-
url = fmt.Sprintf("users/%s/projectsV2/%d/fields", owner, projectNumber)
268-
}
269-
270-
url, err = addOptions(url, opts)
271-
if err != nil {
272-
return mcp.NewToolResultError(err.Error()), nil
269+
projectFields, resp, err = client.Projects.ListUserProjectFields(ctx, owner, projectNumber, opts)
273270
}
274271

275-
httpRequest, err := client.NewRequest("GET", url, nil)
276-
if err != nil {
277-
return nil, fmt.Errorf("failed to create request: %w", err)
278-
}
279-
280-
var projectFields []projectV2Field
281-
resp, err := client.Do(ctx, httpRequest, &projectFields)
282-
283272
if err != nil {
284273
return ghErrors.NewGitHubAPIErrorResponse(ctx,
285274
"failed to list project fields",
@@ -452,7 +441,7 @@ func ListProjectItems(getClient GetClientFn, t translations.TranslationHelperFun
452441
}
453442

454443
var resp *github.Response
455-
var projectItems []projectV2Item
444+
var projectItems []*github.ProjectV2Item
456445
var queryPtr *string
457446

458447
if queryStr != "" {
@@ -467,25 +456,12 @@ func ListProjectItems(getClient GetClientFn, t translations.TranslationHelperFun
467456
},
468457
}
469458

470-
var url string
471459
if ownerType == "org" {
472-
url = fmt.Sprintf("orgs/%s/projectsV2/%d/items", owner, projectNumber)
460+
projectItems, resp, err = client.Projects.ListOrganizationProjectItems(ctx, owner, projectNumber, opts)
473461
} else {
474-
url = fmt.Sprintf("users/%s/projectsV2/%d/items", owner, projectNumber)
462+
projectItems, resp, err = client.Projects.ListUserProjectItems(ctx, owner, projectNumber, opts)
475463
}
476464

477-
url, err = addOptions(url, opts)
478-
if err != nil {
479-
return mcp.NewToolResultError(err.Error()), nil
480-
}
481-
482-
httpRequest, err := client.NewRequest("GET", url, nil)
483-
if err != nil {
484-
return nil, fmt.Errorf("failed to create request: %w", err)
485-
}
486-
487-
resp, err = client.Do(ctx, httpRequest, &projectItems)
488-
489465
if err != nil {
490466
return ghErrors.NewGitHubAPIErrorResponse(ctx,
491467
ProjectListFailedError,
@@ -566,32 +542,22 @@ func GetProjectItem(getClient GetClientFn, t translations.TranslationHelperFunc)
566542
return mcp.NewToolResultError(err.Error()), nil
567543
}
568544

569-
var url string
570-
if ownerType == "org" {
571-
url = fmt.Sprintf("orgs/%s/projectsV2/%d/items/%d", owner, projectNumber, itemID)
572-
} else {
573-
url = fmt.Sprintf("users/%s/projectsV2/%d/items/%d", owner, projectNumber, itemID)
574-
}
575-
576-
opts := fieldSelectionOptions{}
545+
resp := &github.Response{}
546+
projectItem := &github.ProjectV2Item{}
547+
var opts *github.GetProjectItemOptions
577548

578549
if len(fields) > 0 {
579-
opts.Fields = fields
580-
}
581-
582-
url, err = addOptions(url, opts)
583-
if err != nil {
584-
return mcp.NewToolResultError(err.Error()), nil
550+
opts = &github.GetProjectItemOptions{
551+
Fields: fields,
552+
}
585553
}
586554

587-
projectItem := projectV2Item{}
588-
589-
httpRequest, err := client.NewRequest("GET", url, nil)
590-
if err != nil {
591-
return nil, fmt.Errorf("failed to create request: %w", err)
555+
if ownerType == "org" {
556+
projectItem, resp, err = client.Projects.GetOrganizationProjectItem(ctx, owner, projectNumber, itemID, opts)
557+
} else {
558+
projectItem, resp, err = client.Projects.GetUserProjectItem(ctx, owner, projectNumber, itemID, opts)
592559
}
593560

594-
resp, err := client.Do(ctx, httpRequest, &projectItem)
595561
if err != nil {
596562
return ghErrors.NewGitHubAPIErrorResponse(ctx,
597563
"failed to get project item",
@@ -748,7 +714,7 @@ func UpdateProjectItem(getClient GetClientFn, t translations.TranslationHelperFu
748714
if err != nil {
749715
return mcp.NewToolResultError(err.Error()), nil
750716
}
751-
itemID, err := RequiredInt(req, "item_id")
717+
itemID, err := RequiredBigInt(req, "item_id")
752718
if err != nil {
753719
return mcp.NewToolResultError(err.Error()), nil
754720
}
@@ -773,21 +739,15 @@ func UpdateProjectItem(getClient GetClientFn, t translations.TranslationHelperFu
773739
return mcp.NewToolResultError(err.Error()), nil
774740
}
775741

776-
var projectsURL string
742+
var resp *github.Response
743+
var updatedItem *github.ProjectV2Item
744+
777745
if ownerType == "org" {
778-
projectsURL = fmt.Sprintf("orgs/%s/projectsV2/%d/items/%d", owner, projectNumber, itemID)
746+
updatedItem, resp, err = client.Projects.UpdateOrganizationProjectItem(ctx, owner, projectNumber, itemID, updatePayload)
779747
} else {
780-
projectsURL = fmt.Sprintf("users/%s/projectsV2/%d/items/%d", owner, projectNumber, itemID)
781-
}
782-
httpRequest, err := client.NewRequest("PATCH", projectsURL, updateProjectItemPayload{
783-
Fields: []updateProjectItem{*updatePayload},
784-
})
785-
if err != nil {
786-
return nil, fmt.Errorf("failed to create request: %w", err)
748+
updatedItem, resp, err = client.Projects.UpdateUserProjectItem(ctx, owner, projectNumber, itemID, updatePayload)
787749
}
788-
updatedItem := projectV2Item{}
789750

790-
resp, err := client.Do(ctx, httpRequest, &updatedItem)
791751
if err != nil {
792752
return ghErrors.NewGitHubAPIErrorResponse(ctx,
793753
ProjectUpdateFailedError,
@@ -892,15 +852,6 @@ type fieldSelectionOptions struct {
892852
Fields []int64 `url:"fields,omitempty,comma"`
893853
}
894854

895-
type updateProjectItemPayload struct {
896-
Fields []updateProjectItem `json:"fields"`
897-
}
898-
899-
type updateProjectItem struct {
900-
ID int `json:"id"`
901-
Value any `json:"value"`
902-
}
903-
904855
type projectV2ItemFieldValue struct {
905856
ID *int64 `json:"id,omitempty"`
906857
Name string `json:"name,omitempty"`
@@ -967,7 +918,7 @@ func toNewProjectType(projType string) string {
967918
}
968919
}
969920

970-
func buildUpdateProjectItem(input map[string]any) (*updateProjectItem, error) {
921+
func buildUpdateProjectItem(input map[string]any) (*github.UpdateProjectItemOptions, error) {
971922
if input == nil {
972923
return nil, fmt.Errorf("updated_field must be an object")
973924
}
@@ -986,7 +937,12 @@ func buildUpdateProjectItem(input map[string]any) (*updateProjectItem, error) {
986937
if !ok {
987938
return nil, fmt.Errorf("updated_field.value is required")
988939
}
989-
payload := &updateProjectItem{ID: int(idFieldAsFloat64), Value: valueField}
940+
payload := &github.UpdateProjectItemOptions{
941+
Fields: []*github.UpdateProjectV2Field{{
942+
ID: int64(idFieldAsFloat64),
943+
Value: valueField,
944+
}},
945+
}
990946

991947
return payload, nil
992948
}

0 commit comments

Comments
 (0)