MCPcopy Index your code
hub / github.com/github/github-mcp-server / addProjectItem

Function addProjectItem

pkg/github/projects.go:1183–1244  ·  view source on GitHub ↗

addProjectItem adds an item to a project by resolving the issue/PR number to a node ID

(ctx context.Context, gqlClient *githubv4.Client, owner, ownerType string, projectNumber int, itemOwner, itemRepo string, itemNumber int, itemType string)

Source from the content-addressed store, hash-verified

1181
1182// addProjectItem adds an item to a project by resolving the issue/PR number to a node ID
1183func addProjectItem(ctx context.Context, gqlClient *githubv4.Client, owner, ownerType string, projectNumber int, itemOwner, itemRepo string, itemNumber int, itemType string) (*mcp.CallToolResult, any, error) {
1184 if itemType != "issue" && itemType != "pull_request" {
1185 return utils.NewToolResultError("item_type must be either 'issue' or 'pull_request'"), nil, nil
1186 }
1187
1188 // Resolve the item number to a node ID
1189 var nodeID githubv4.ID
1190 var err error
1191 if itemType == "issue" {
1192 nodeID, err = resolveIssueNodeID(ctx, gqlClient, itemOwner, itemRepo, itemNumber)
1193 } else {
1194 nodeID, err = resolvePullRequestNodeID(ctx, gqlClient, itemOwner, itemRepo, itemNumber)
1195 }
1196 if err != nil {
1197 return utils.NewToolResultError(fmt.Sprintf("failed to resolve %s: %v", itemType, err)), nil, nil
1198 }
1199
1200 // Use GraphQL to add the item to the project
1201 var mutation struct {
1202 AddProjectV2ItemByID struct {
1203 Item struct {
1204 ID githubv4.ID
1205 FullDatabaseID string `graphql:"fullDatabaseId"`
1206 }
1207 } `graphql:"addProjectV2ItemById(input: $input)"`
1208 }
1209
1210 // Resolve the project number to a node ID
1211 projectID, err := resolveProjectNodeID(ctx, gqlClient, owner, ownerType, projectNumber)
1212 if err != nil {
1213 return utils.NewToolResultError(err.Error()), nil, nil
1214 }
1215
1216 // Add the item to the project
1217 input := githubv4.AddProjectV2ItemByIdInput{
1218 ProjectID: projectID,
1219 ContentID: nodeID,
1220 }
1221
1222 err = gqlClient.Mutate(ctx, &mutation, input, nil)
1223 if err != nil {
1224 return utils.NewToolResultError(fmt.Sprintf(ProjectAddFailedError+": %v", err)), nil, nil
1225 }
1226
1227 result := map[string]any{
1228 "id": mutation.AddProjectV2ItemByID.Item.ID,
1229 "message": fmt.Sprintf("Successfully added %s %s/%s#%d to project %s/%d", itemType, itemOwner, itemRepo, itemNumber, owner, projectNumber),
1230 }
1231 if fullDatabaseID := mutation.AddProjectV2ItemByID.Item.FullDatabaseID; fullDatabaseID != "" {
1232 result["full_database_id"] = fullDatabaseID
1233 if itemID, err := strconv.ParseInt(fullDatabaseID, 10, 64); err == nil {
1234 result["item_id"] = itemID
1235 }
1236 }
1237
1238 r, err := json.Marshal(result)
1239 if err != nil {
1240 return nil, nil, fmt.Errorf("failed to marshal response: %w", err)

Callers 1

ProjectsWriteFunction · 0.85

Calls 6

NewToolResultErrorFunction · 0.92
NewToolResultTextFunction · 0.92
resolveIssueNodeIDFunction · 0.85
resolvePullRequestNodeIDFunction · 0.85
resolveProjectNodeIDFunction · 0.85
ErrorMethod · 0.45

Tested by

no test coverage detected