Add batched update_project_items writes via GraphQL#2903
Draft
veralizeth wants to merge 11 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
zwick
force-pushed
the
veralizeth/mcp-batch-bulk-field-value
branch
from
July 21, 2026 12:50
5ff24d6 to
669974c
Compare
zwick
force-pushed
the
veralizeth/mcp-batch-bulk-field-value
branch
3 times, most recently
from
July 21, 2026 14:04
ad9f0e4 to
85ec9ef
Compare
6 tasks
zwick
force-pushed
the
veralizeth/mcp-batch-bulk-field-value
branch
from
July 21, 2026 19:40
e55769d to
ef236d5
Compare
zwick
changed the base branch from
main
to
zwick-extract-projects-resolver-refactor
July 21, 2026 19:40
13 tasks
zwick
changed the base branch from
zwick-extract-projects-resolver-refactor
to
zwick-extract-projects-batch-mutation
July 21, 2026 20:04
zwick
force-pushed
the
veralizeth/mcp-batch-bulk-field-value
branch
from
July 21, 2026 20:04
ef236d5 to
f1a291e
Compare
zwick
force-pushed
the
zwick-extract-projects-batch-mutation
branch
from
July 21, 2026 20:32
a69dd2d to
a7b9cf3
Compare
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
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
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
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7ae767ff-c1d0-46a9-b126-2e91403993a0
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d7dc302d-e6f2-41e9-a2c8-ed598de47067
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d7dc302d-e6f2-41e9-a2c8-ed598de47067
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: d7dc302d-e6f2-41e9-a2c8-ed598de47067
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 20:33
f1a291e to
03efb11
Compare
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. Tool guidance directs bulk callers here instead of loopingupdate_project_item.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.go, using shared helpers inpkg/github/projects_resolver.gopkg/github/projects_batch_test.gopkg/github/projects_batch_mutation_test.goAutomated tests are 1,345 of 2,303 added lines; production code is 859 and generated output is 99.
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