From 32f49f44876ea4e8a7550cafad933b68ae7ace4f Mon Sep 17 00:00:00 2001 From: "John-Mason P. Shackelford" Date: Mon, 3 Mar 2025 17:03:20 -0500 Subject: [PATCH] feat(github): Add missing pull request operations to MCP server Add support for all pull request operations documented in README.md that were previously missing from the MCP server implementation. This includes: - get_pull_request: Get details of a specific pull request - list_pull_requests: List and filter repository pull requests - create_pull_request_review: Create a review on a pull request - merge_pull_request: Merge a pull request - get_pull_request_files: Get the list of files changed in a pull request - get_pull_request_status: Get the combined status of all status checks - update_pull_request_branch: Update a PR branch with latest base branch changes - get_pull_request_comments: Get the review comments on a pull request - get_pull_request_reviews: Get the reviews on a pull request --- src/github/index.ts | 121 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/src/github/index.ts b/src/github/index.ts index 88b236894f..33b62ff7fb 100644 --- a/src/github/index.ts +++ b/src/github/index.ts @@ -149,6 +149,51 @@ server.setRequestHandler(ListToolsRequestSchema, async () => { name: "get_issue", description: "Get details of a specific issue in a GitHub repository.", inputSchema: zodToJsonSchema(issues.GetIssueSchema) + }, + { + name: "get_pull_request", + description: "Get details of a specific pull request", + inputSchema: zodToJsonSchema(pulls.GetPullRequestSchema) + }, + { + name: "list_pull_requests", + description: "List and filter repository pull requests", + inputSchema: zodToJsonSchema(pulls.ListPullRequestsSchema) + }, + { + name: "create_pull_request_review", + description: "Create a review on a pull request", + inputSchema: zodToJsonSchema(pulls.CreatePullRequestReviewSchema) + }, + { + name: "merge_pull_request", + description: "Merge a pull request", + inputSchema: zodToJsonSchema(pulls.MergePullRequestSchema) + }, + { + name: "get_pull_request_files", + description: "Get the list of files changed in a pull request", + inputSchema: zodToJsonSchema(pulls.GetPullRequestFilesSchema) + }, + { + name: "get_pull_request_status", + description: "Get the combined status of all status checks for a pull request", + inputSchema: zodToJsonSchema(pulls.GetPullRequestStatusSchema) + }, + { + name: "update_pull_request_branch", + description: "Update a pull request branch with the latest changes from the base branch", + inputSchema: zodToJsonSchema(pulls.UpdatePullRequestBranchSchema) + }, + { + name: "get_pull_request_comments", + description: "Get the review comments on a pull request", + inputSchema: zodToJsonSchema(pulls.GetPullRequestCommentsSchema) + }, + { + name: "get_pull_request_reviews", + description: "Get the reviews on a pull request", + inputSchema: zodToJsonSchema(pulls.GetPullRequestReviewsSchema) } ], }; @@ -335,6 +380,82 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { }; } + case "get_pull_request": { + const args = pulls.GetPullRequestSchema.parse(request.params.arguments); + const pullRequest = await pulls.getPullRequest(args.owner, args.repo, args.pull_number); + return { + content: [{ type: "text", text: JSON.stringify(pullRequest, null, 2) }], + }; + } + + case "list_pull_requests": { + const args = pulls.ListPullRequestsSchema.parse(request.params.arguments); + const { owner, repo, ...options } = args; + const pullRequests = await pulls.listPullRequests(owner, repo, options); + return { + content: [{ type: "text", text: JSON.stringify(pullRequests, null, 2) }], + }; + } + + case "create_pull_request_review": { + const args = pulls.CreatePullRequestReviewSchema.parse(request.params.arguments); + const { owner, repo, pull_number, ...options } = args; + const review = await pulls.createPullRequestReview(owner, repo, pull_number, options); + return { + content: [{ type: "text", text: JSON.stringify(review, null, 2) }], + }; + } + + case "merge_pull_request": { + const args = pulls.MergePullRequestSchema.parse(request.params.arguments); + const { owner, repo, pull_number, ...options } = args; + const result = await pulls.mergePullRequest(owner, repo, pull_number, options); + return { + content: [{ type: "text", text: JSON.stringify(result, null, 2) }], + }; + } + + case "get_pull_request_files": { + const args = pulls.GetPullRequestFilesSchema.parse(request.params.arguments); + const files = await pulls.getPullRequestFiles(args.owner, args.repo, args.pull_number); + return { + content: [{ type: "text", text: JSON.stringify(files, null, 2) }], + }; + } + + case "get_pull_request_status": { + const args = pulls.GetPullRequestStatusSchema.parse(request.params.arguments); + const status = await pulls.getPullRequestStatus(args.owner, args.repo, args.pull_number); + return { + content: [{ type: "text", text: JSON.stringify(status, null, 2) }], + }; + } + + case "update_pull_request_branch": { + const args = pulls.UpdatePullRequestBranchSchema.parse(request.params.arguments); + const { owner, repo, pull_number, expected_head_sha } = args; + await pulls.updatePullRequestBranch(owner, repo, pull_number, expected_head_sha); + return { + content: [{ type: "text", text: JSON.stringify({ success: true }, null, 2) }], + }; + } + + case "get_pull_request_comments": { + const args = pulls.GetPullRequestCommentsSchema.parse(request.params.arguments); + const comments = await pulls.getPullRequestComments(args.owner, args.repo, args.pull_number); + return { + content: [{ type: "text", text: JSON.stringify(comments, null, 2) }], + }; + } + + case "get_pull_request_reviews": { + const args = pulls.GetPullRequestReviewsSchema.parse(request.params.arguments); + const reviews = await pulls.getPullRequestReviews(args.owner, args.repo, args.pull_number); + return { + content: [{ type: "text", text: JSON.stringify(reviews, null, 2) }], + }; + } + default: throw new Error(`Unknown tool: ${request.params.name}`); }