@@ -315,33 +315,38 @@ func UpdatePullRequest(getClient GetClientFn, getGQLClient GetGQLClientFn, t tra
315315 return mcp .NewToolResultError (err .Error ()), nil
316316 }
317317
318- // If no updates and no reviewers, return error early
319- if ! restUpdateNeeded && len (reviewers ) == 0 && ! draftProvided {
320- return mcp .NewToolResultError ("No update parameters provided" ), nil
318+ // If no updates, no draft change, and no reviewers, return error early
319+ if ! restUpdateNeeded && ! draftProvided && len (reviewers ) == 0 {
320+ return mcp .NewToolResultError ("No update parameters provided. " ), nil
321321 }
322322
323- client , err := getClient (ctx )
324- if err != nil {
325- return nil , fmt .Errorf ("failed to get GitHub client: %w" , err )
326- }
327- pr , resp , err := client .PullRequests .Edit (ctx , owner , repo , pullNumber , update )
328- if err != nil {
329- return ghErrors .NewGitHubAPIErrorResponse (ctx ,
330- "failed to update pull request" ,
331- resp ,
332- err ,
333- ), nil
334- }
335- defer func () { _ = resp .Body .Close () }()
323+ // Handle REST API updates
324+ if restUpdateNeeded {
325+ client , err := getClient (ctx )
326+ if err != nil {
327+ return nil , fmt .Errorf ("failed to get GitHub client: %w" , err )
328+ }
336329
337- if resp .StatusCode != http .StatusOK {
338- body , err := io .ReadAll (resp .Body )
330+ _ , resp , err := client .PullRequests .Edit (ctx , owner , repo , pullNumber , update )
339331 if err != nil {
340- return nil , fmt .Errorf ("failed to read response body: %w" , err )
332+ return ghErrors .NewGitHubAPIErrorResponse (ctx ,
333+ "failed to update pull request" ,
334+ resp ,
335+ err ,
336+ ), nil
337+ }
338+ defer func () { _ = resp .Body .Close () }()
339+
340+ if resp .StatusCode != http .StatusOK {
341+ body , err := io .ReadAll (resp .Body )
342+ if err != nil {
343+ return nil , fmt .Errorf ("failed to read response body: %w" , err )
344+ }
345+ return mcp .NewToolResultError (fmt .Sprintf ("failed to update pull request: %s" , string (body ))), nil
341346 }
342- return mcp .NewToolResultError (fmt .Sprintf ("failed to update pull request: %s" , string (body ))), nil
343347 }
344348
349+ // Handle draft status changes using GraphQL
345350 if draftProvided {
346351 gqlClient , err := getGQLClient (ctx )
347352 if err != nil {
@@ -407,6 +412,41 @@ func UpdatePullRequest(getClient GetClientFn, getGQLClient GetGQLClientFn, t tra
407412 }
408413 }
409414
415+ // Handle reviewer requests
416+ if len (reviewers ) > 0 {
417+ client , err := getClient (ctx )
418+ if err != nil {
419+ return nil , fmt .Errorf ("failed to get GitHub client: %w" , err )
420+ }
421+
422+ reviewersRequest := github.ReviewersRequest {
423+ Reviewers : reviewers ,
424+ }
425+
426+ _ , resp , err := client .PullRequests .RequestReviewers (ctx , owner , repo , pullNumber , reviewersRequest )
427+ if err != nil {
428+ return ghErrors .NewGitHubAPIErrorResponse (ctx ,
429+ "failed to request reviewers" ,
430+ resp ,
431+ err ,
432+ ), nil
433+ }
434+ defer func () {
435+ if resp != nil && resp .Body != nil {
436+ _ = resp .Body .Close ()
437+ }
438+ }()
439+
440+ if resp .StatusCode != http .StatusCreated && resp .StatusCode != http .StatusOK {
441+ body , err := io .ReadAll (resp .Body )
442+ if err != nil {
443+ return nil , fmt .Errorf ("failed to read response body: %w" , err )
444+ }
445+ return mcp .NewToolResultError (fmt .Sprintf ("failed to request reviewers: %s" , string (body ))), nil
446+ }
447+ }
448+
449+ // Get the final state of the PR to return
410450 client , err := getClient (ctx )
411451 if err != nil {
412452 return nil , err
0 commit comments