diff --git a/README.md b/README.md
index 4a45f7a2..bebf4bb6 100644
--- a/README.md
+++ b/README.md
@@ -43,6 +43,7 @@ Official integrations are maintained by companies building production ready MCP
-
**[Axiom](https://github.com/axiomhq/mcp-server-axiom)** - Query and analyze your Axiom logs, traces, and all other event data in natural language
-
**[Browserbase](https://github.com/browserbase/mcp-server-browserbase)** - Automate browser interactions in the cloud (e.g. web navigation, data extraction, form filling, and more)
-
**[Chroma](https://github.com/chroma-core/chroma-mcp)** - Embeddings, vector search, document storage, and full-text search with the open-source AI application database
+-
**[ClickHouse](https://github.com/ClickHouse/mcp-clickhouse)** - Query your [ClickHouse](https://clickhouse.com/) database server.
-
**[Cloudflare](https://github.com/cloudflare/mcp-server-cloudflare)** - Deploy, configure & interrogate your resources on the Cloudflare developer platform (e.g. Workers/KV/R2/D1)
-
**[E2B](https://github.com/e2b-dev/mcp-server)** - Run code in secure sandboxes hosted by [E2B](https://e2b.dev)
-
**[eSignatures](https://github.com/esignaturescom/mcp-server-esignatures)** - Contract and template management for drafting, reviewing, and sending binding contracts.
@@ -70,7 +71,6 @@ Official integrations are maintained by companies building production ready MCP
-
**[Tavily](https://github.com/tavily-ai/tavily-mcp)** - Search engine for AI agents (search + extract) powered by [Tavily](https://tavily.com/)
-
**[Tinybird](https://github.com/tinybirdco/mcp-tinybird)** - Interact with Tinybird serverless ClickHouse platform
-
**[Verodat](https://github.com/Verodat/verodat-mcp-server)** - Interact with Verodat AI Ready Data platform
--
**[ClickHouse](https://github.com/ClickHouse/mcp-clickhouse)** - Query your [ClickHouse](https://clickhouse.com/) server.
### 🌎 Community Servers
diff --git a/src/github/index.ts b/src/github/index.ts
index 88b23689..33b62ff7 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}`);
}