Add batched update_project_items writes via GraphQL#2903
Draft
veralizeth wants to merge 9 commits into
Draft
Conversation
|
go |
13 tasks
zwick
force-pushed
the
veralizeth/mcp-batch-bulk-field-value
branch
from
July 20, 2026 19:43
15ca2ee to
b8f5ca9
Compare
zwick
force-pushed
the
veralizeth/mcp-batch-bulk-field-value
branch
from
July 20, 2026 20:26
983d5f4 to
047505f
Compare
Extend ResolvedField with the GraphQL node ID alongside the existing numeric databaseId, and extend the #2914 paginated issue-item resolver to also return the item's node ID (resolveProjectItemByIssueNumber), keeping resolveProjectItemIDByIssueNumber as a numeric-only wrapper for existing callers. These node IDs are what the upcoming aliased GraphQL mutations need as ItemID/FieldID inputs, in place of the numeric IDs the REST API takes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d7dc302d-e6f2-41e9-a2c8-ed598de47067
Add projects_batch_mutation.go: builds a runtime struct type (reflect.StructOf) for sending up to 20 aliased updateProjectV2ItemFieldValue / clearProjectV2ItemFieldValue mutations in a single GraphQL request, still via the existing authenticated *githubv4.Client. Fields and aliases are purely positional (Item0/item0, Item1/item1, ...); per the pinned githubv4.Client.Mutate signature, the first input is always sent under the $input variable, so aliases 1+ reference $input1, $input2, ... via the variables map. Reflected types are cached by (operation kind, chunk size) only, never by request data. This file is not yet wired up to any caller. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d7dc302d-e6f2-41e9-a2c8-ed598de47067
Rewire update_project_items to resolve the project, every distinct field, and every item once up front, then write via the projects_batch_mutation.go aliased-mutation builder, chunked into sequential requests of 20, instead of one REST PATCH per item. - projects_batch_resolve.go: field/item resolution. Adds node_id as a third item-reference form (alongside item_id and item_owner+item_repo+issue_number, exactly one required per item), bypassing REST lookup entirely. Numeric item_id values are deduplicated and resolved to node IDs via bounded-concurrency REST GETs; issue refs are deduplicated and resolved via the paginated resolver from the previous commit. updated_field.value is converted to the matching ProjectV2FieldValue member for TEXT, NUMBER, DATE, SINGLE_SELECT, and ITERATION; null routes to the clear mutation. - projects_batch.go: orchestration. Rejects duplicate item+field targets before any writes, partitions into update/clear chunks, and tracks tri-state per-item results (succeeded/failed/unknown). After an ambiguous transport-level failure or context cancellation, no further chunks are sent. - projects.go: removed the old REST-loop implementation and its helpers; added node_id to the update_project_items item schema. - Removed the stale comment claiming the pinned client couldn't build dynamic aliases. - Updated/added tests accordingly, including toolsnap and README regeneration for the schema change. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d7dc302d-e6f2-41e9-a2c8-ed598de47067
Distinguish GraphQL response errors from ambiguous transport or missing-data responses, validate numeric references before narrowing them, reuse the resolved project ID for issue lookups, and cache field-load failures. Add focused regression coverage and align the tool schema with the supported issue-reference contract.\n\nCo-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: d7dc302d-e6f2-41e9-a2c8-ed598de47067
zwick
force-pushed
the
veralizeth/mcp-batch-bulk-field-value
branch
from
July 21, 2026 12:50
5ff24d6 to
669974c
Compare
Cover paginated node-ID capture, deduplicated issue resolution, post-resolution duplicate detection, ambiguous field names, and top-level guards. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7ae767ff-c1d0-46a9-b126-2e91403993a0
Model node, numeric, and issue references as closed schema variants while retaining runtime validation. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7ae767ff-c1d0-46a9-b126-2e91403993a0
zwick
force-pushed
the
veralizeth/mcp-batch-bulk-field-value
branch
2 times, most recently
from
July 21, 2026 14:00
38df97f to
ad9f0e4
Compare
Remove redundant implementation narration while retaining comments for non-obvious client and failure semantics. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d7dc302d-e6f2-41e9-a2c8-ed598de47067
zwick
force-pushed
the
veralizeth/mcp-batch-bulk-field-value
branch
from
July 21, 2026 14:04
ad9f0e4 to
85ec9ef
Compare
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7ae767ff-c1d0-46a9-b126-2e91403993a0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds batched field-value writes to
update_project_itemsusing chunked, aliased GraphQL mutations with input-orderedsucceeded,failed, orunknownresults. One required top-levelupdated_fieldapplies to every item in the batch.Why
Implements the MCP portion of github/planning-tracking#3331. It builds on the issue-membership pagination merged in #2914; CLI support will follow separately.
What changed
items[]as three closedoneOfreference variants:node_id, numericitem_id, oritem_owner+item_repo+issue_number. The top-level field is a closed ID-or-name variant;nullclears it for all items.githubv4.Client, with a 100-item call cap and no automatic retries or per-item fallbacks.unknownwhen mutation outcomes are ambiguous.Review guide
pkg/github/projects_batch_mutation.gopkg/github/projects_batch_resolve.goandpkg/github/projects_resolver.gopkg/github/projects_batch.gopkg/github/projects_batch_e2e_test.goAutomated tests are 1,630 of 2,736 added lines; production code is 1,008 and generated output is 98.
MCP impact
update_project_itemsadds reference-only batch items, one shared field/value,node_idreferences, and structured tri-state results. Existing single-item runtime behavior is unchanged.Prompts tested (tool changes only)
No live prompts were run. Automated handler tests cover equivalent scenarios:
Security / limits
The implementation uses the existing injected REST and GraphQL clients and their permissions. The tool remains capped at 100 items; numeric reads use at most five concurrent lookups, and writes remain sequential in chunks of 20 with no automatic retry.
Tool renaming
deprecated_tool_aliases.goNote: if you're renaming tools, you must add the tool aliases. For more information on how to do so, please refer to the official docs.
Lint & tests
./script/lint./script/testFocused schema, field conversion/resolution, item resolution, mutation execution, and handler tests also pass.
Docs