@arii/boomtick-mcp 0.6.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.6.1](https://github.com/arii/boomtick/compare/mcp-v0.6.0...mcp-v0.6.1) (2026-10-23)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * **mcp:** mount missing handlers for github_get_pr_reviews, github_get_pr_commits, and repo_get_workflow_runs [skip-scope-check] ([#916](https://github.com/arii/boomtick/issues/916)) ([60a2851](https://github.com/arii/boomtick/commit/60a2851a2f2d5ac8010422796573b7ea20bb6767))
9
+
3
10
  ## [0.6.0](https://github.com/arii/boomtick/compare/mcp-v0.5.0...mcp-v0.6.0) (2026-10-22)
4
11
 
5
12
 
@@ -16,6 +16,7 @@ import { getCommandSchemaHandler, GetCommandSchemaInputSchema } from "../tools/r
16
16
  import { getPackageScriptsHandler, GetPackageScriptsInputSchema } from "../tools/repo.get_package_scripts.js";
17
17
  import { readCiLogsHandler, ReadCiLogsInputSchema } from "../tools/repo.read_ci_logs.js";
18
18
  import { repoLogsHandler, RepoLogsInputSchema } from "../tools/repo.logs.js";
19
+ import { getWorkflowRunsHandler, GetWorkflowRunsInputSchema } from "../tools/repo.get_workflow_runs.js";
19
20
  import { createRepairBranchHandler, CreateRepairBranchInputSchema } from "../tools/repo.create_repair_branch.js";
20
21
  import { createBranchHandler, CreateBranchInputSchema } from "../tools/repo.create_branch.js";
21
22
  import { runTestsHandler, RunTestsInputSchema } from "../tools/repo.run_tests.js";
@@ -24,6 +25,8 @@ import { openReplacementPrHandler, OpenReplacementPrInputSchema } from "../tools
24
25
  import { commentTriageSummaryHandler, CommentTriageSummaryInputSchema } from "../tools/github.comment_triage_summary.js";
25
26
  import { createPullRequestHandler, CreatePullRequestInputSchema } from "../tools/github.create_pull_request.js";
26
27
  import { getPrHandler, GetPrInputSchema } from "../tools/github.get_pr.js";
28
+ import { getPrReviewsHandler, GetPrReviewsInputSchema } from "../tools/github.get_pr_reviews.js";
29
+ import { getPrCommitsHandler, GetPrCommitsInputSchema } from "../tools/github.get_pr_commits.js";
27
30
  import { issueViewHandler, IssueViewInputSchema } from "../tools/github.issue_view.js";
28
31
  import { issueUpdateHandler, IssueUpdateInputSchema } from "../tools/github.issue_update.js";
29
32
  import { issueCommentHandler, IssueCommentInputSchema } from "../tools/github.issue_comment.js";
@@ -189,6 +192,9 @@ export class BoomtickMCPServer {
189
192
  return createSuccessResult(await readCiLogsHandler(ReadCiLogsInputSchema.parse(normArgs)));
190
193
  case "repo.logs":
191
194
  return createSuccessResult(await repoLogsHandler(RepoLogsInputSchema.parse(normArgs)));
195
+ case "repo.get.workflow.runs":
196
+ case "repo.get_workflow_runs":
197
+ return createSuccessResult(await getWorkflowRunsHandler(GetWorkflowRunsInputSchema.parse(normArgs)));
192
198
  case "repo.create.branch":
193
199
  case "repo.create_branch":
194
200
  return createSuccessResult(await createBranchHandler(CreateBranchInputSchema.parse(normArgs)));
@@ -213,6 +219,12 @@ export class BoomtickMCPServer {
213
219
  case "github.get.pr":
214
220
  case "github.get_pr":
215
221
  return createSuccessResult(await getPrHandler(GetPrInputSchema.parse(normArgs)));
222
+ case "github.get.pr.reviews":
223
+ case "github.get_pr_reviews":
224
+ return createSuccessResult(await getPrReviewsHandler(GetPrReviewsInputSchema.parse(normArgs)));
225
+ case "github.get.pr.commits":
226
+ case "github.get_pr_commits":
227
+ return createSuccessResult(await getPrCommitsHandler(GetPrCommitsInputSchema.parse(normArgs)));
216
228
  case "github.issue.view":
217
229
  case "github.issue_view":
218
230
  return createSuccessResult(await issueViewHandler(IssueViewInputSchema.parse(normArgs)));
@@ -4,6 +4,9 @@ import fs from "fs/promises";
4
4
  import * as healthModule from "./tools.js";
5
5
  import * as prDiffModule from "../tools/github.get_pr_diff.js";
6
6
  import * as ciLogsModule from "../tools/repo.read_ci_logs.js";
7
+ import * as prReviewsModule from "../tools/github.get_pr_reviews.js";
8
+ import * as prCommitsModule from "../tools/github.get_pr_commits.js";
9
+ import * as workflowRunsModule from "../tools/repo.get_workflow_runs.js";
7
10
  vi.mock("fs/promises");
8
11
  vi.mock("../config.js", () => ({
9
12
  config: {
@@ -177,6 +180,27 @@ describe("BoomtickMCPServer", () => {
177
180
  structuredContent: { status: "ok" },
178
181
  });
179
182
  });
183
+ it("should execute github_get_pr_reviews and github_get_pr_commits via underscore or dot name", async () => {
184
+ const handler = requestHandlers.get("tools/call");
185
+ vi.spyOn(prReviewsModule, "getPrReviewsHandler").mockResolvedValue({ reviews: [] });
186
+ vi.spyOn(prCommitsModule, "getPrCommitsHandler").mockResolvedValue({ commits: [] });
187
+ vi.spyOn(workflowRunsModule, "getWorkflowRunsHandler").mockResolvedValue({ runs: [] });
188
+ const resReviews = await handler({
189
+ method: "tools/call",
190
+ params: { name: "github_get_pr_reviews", arguments: { prNumber: 123 } },
191
+ });
192
+ expect(resReviews.structuredContent).toEqual({ reviews: [] });
193
+ const resCommits = await handler({
194
+ method: "tools/call",
195
+ params: { name: "github_get_pr_commits", arguments: { prNumber: 123 } },
196
+ });
197
+ expect(resCommits.structuredContent).toEqual({ commits: [] });
198
+ const resWorkflow = await handler({
199
+ method: "tools/call",
200
+ params: { name: "repo_get_workflow_runs", arguments: {} },
201
+ });
202
+ expect(resWorkflow.structuredContent).toEqual({ runs: [] });
203
+ });
180
204
  it("should return error result for unknown tool", async () => {
181
205
  const handler = requestHandlers.get("tools/call");
182
206
  const result = await handler({
@@ -2,7 +2,7 @@ import { z } from "zod";
2
2
  import { runCommand } from "../lib/shell.js";
3
3
  import { resolveRepo } from "../lib/git.js";
4
4
  import { sanitizeError } from "../lib/error_utils.js";
5
- const GetPrCommitsInputSchema = z.object({
5
+ export const GetPrCommitsInputSchema = z.object({
6
6
  prNumber: z.number().describe("The number of the PR to list commits for."),
7
7
  repo: z.string().optional().describe("The target repository override (e.g. org/repo)."),
8
8
  });
@@ -2,7 +2,7 @@ import { z } from "zod";
2
2
  import { runCommand } from "../lib/shell.js";
3
3
  import { resolveRepo } from "../lib/git.js";
4
4
  import { sanitizeError } from "../lib/error_utils.js";
5
- const GetPrReviewsInputSchema = z.object({
5
+ export const GetPrReviewsInputSchema = z.object({
6
6
  prNumber: z.number().describe("The number of the PR to view reviews for."),
7
7
  repo: z.string().optional().describe("The target repository override (e.g. org/repo)."),
8
8
  });
@@ -2,7 +2,7 @@ import { z } from "zod";
2
2
  import { runCommand } from "../lib/shell.js";
3
3
  import { resolveRepo } from "../lib/git.js";
4
4
  import { sanitizeError } from "../lib/error_utils.js";
5
- const GetWorkflowRunsInputSchema = z.object({
5
+ export const GetWorkflowRunsInputSchema = z.object({
6
6
  branch: z.string().optional().describe("Filter workflow runs by branch name."),
7
7
  event: z.string().optional().describe("Filter workflow runs by event (e.g. push, pull_request)."),
8
8
  repo: z.string().optional().describe("The target repository override (e.g. org/repo)."),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arii/boomtick-mcp",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "Boomtick MCP Guide: PR Rescue + Merge Conflict Agent",
5
5
  "repository": {
6
6
  "type": "git",
@@ -5,6 +5,9 @@ import fs from "fs/promises";
5
5
  import * as healthModule from "./tools.js";
6
6
  import * as prDiffModule from "../tools/github.get_pr_diff.js";
7
7
  import * as ciLogsModule from "../tools/repo.read_ci_logs.js";
8
+ import * as prReviewsModule from "../tools/github.get_pr_reviews.js";
9
+ import * as prCommitsModule from "../tools/github.get_pr_commits.js";
10
+ import * as workflowRunsModule from "../tools/repo.get_workflow_runs.js";
8
11
 
9
12
  vi.mock("fs/promises");
10
13
  vi.mock("../config.js", () => ({
@@ -223,6 +226,31 @@ describe("BoomtickMCPServer", () => {
223
226
  });
224
227
  });
225
228
 
229
+ it("should execute github_get_pr_reviews and github_get_pr_commits via underscore or dot name", async () => {
230
+ const handler = requestHandlers.get("tools/call");
231
+ vi.spyOn(prReviewsModule, "getPrReviewsHandler").mockResolvedValue({ reviews: [] } as any);
232
+ vi.spyOn(prCommitsModule, "getPrCommitsHandler").mockResolvedValue({ commits: [] } as any);
233
+ vi.spyOn(workflowRunsModule, "getWorkflowRunsHandler").mockResolvedValue({ runs: [] } as any);
234
+
235
+ const resReviews = await handler!({
236
+ method: "tools/call",
237
+ params: { name: "github_get_pr_reviews", arguments: { prNumber: 123 } },
238
+ });
239
+ expect(resReviews.structuredContent).toEqual({ reviews: [] });
240
+
241
+ const resCommits = await handler!({
242
+ method: "tools/call",
243
+ params: { name: "github_get_pr_commits", arguments: { prNumber: 123 } },
244
+ });
245
+ expect(resCommits.structuredContent).toEqual({ commits: [] });
246
+
247
+ const resWorkflow = await handler!({
248
+ method: "tools/call",
249
+ params: { name: "repo_get_workflow_runs", arguments: {} },
250
+ });
251
+ expect(resWorkflow.structuredContent).toEqual({ runs: [] });
252
+ });
253
+
226
254
  it("should return error result for unknown tool", async () => {
227
255
  const handler = requestHandlers.get("tools/call");
228
256
 
package/src/mcp/server.ts CHANGED
@@ -24,6 +24,7 @@ import { getCommandSchemaHandler, GetCommandSchemaInputSchema } from "../tools/r
24
24
  import { getPackageScriptsHandler, GetPackageScriptsInputSchema } from "../tools/repo.get_package_scripts.js";
25
25
  import { readCiLogsHandler, ReadCiLogsInputSchema } from "../tools/repo.read_ci_logs.js";
26
26
  import { repoLogsHandler, RepoLogsInputSchema } from "../tools/repo.logs.js";
27
+ import { getWorkflowRunsHandler, GetWorkflowRunsInputSchema } from "../tools/repo.get_workflow_runs.js";
27
28
  import { createRepairBranchHandler, CreateRepairBranchInputSchema } from "../tools/repo.create_repair_branch.js";
28
29
  import { createBranchHandler, CreateBranchInputSchema } from "../tools/repo.create_branch.js";
29
30
  import { runTestsHandler, RunTestsInputSchema } from "../tools/repo.run_tests.js";
@@ -32,6 +33,8 @@ import { openReplacementPrHandler, OpenReplacementPrInputSchema } from "../tools
32
33
  import { commentTriageSummaryHandler, CommentTriageSummaryInputSchema } from "../tools/github.comment_triage_summary.js";
33
34
  import { createPullRequestHandler, CreatePullRequestInputSchema } from "../tools/github.create_pull_request.js";
34
35
  import { getPrHandler, GetPrInputSchema } from "../tools/github.get_pr.js";
36
+ import { getPrReviewsHandler, GetPrReviewsInputSchema } from "../tools/github.get_pr_reviews.js";
37
+ import { getPrCommitsHandler, GetPrCommitsInputSchema } from "../tools/github.get_pr_commits.js";
35
38
  import { issueViewHandler, IssueViewInputSchema } from "../tools/github.issue_view.js";
36
39
  import { issueUpdateHandler, IssueUpdateInputSchema } from "../tools/github.issue_update.js";
37
40
  import { issueCommentHandler, IssueCommentInputSchema } from "../tools/github.issue_comment.js";
@@ -222,6 +225,9 @@ export class BoomtickMCPServer {
222
225
  return createSuccessResult(await readCiLogsHandler(ReadCiLogsInputSchema.parse(normArgs)));
223
226
  case "repo.logs":
224
227
  return createSuccessResult(await repoLogsHandler(RepoLogsInputSchema.parse(normArgs)));
228
+ case "repo.get.workflow.runs":
229
+ case "repo.get_workflow_runs":
230
+ return createSuccessResult(await getWorkflowRunsHandler(GetWorkflowRunsInputSchema.parse(normArgs)));
225
231
  case "repo.create.branch":
226
232
  case "repo.create_branch":
227
233
  return createSuccessResult(await createBranchHandler(CreateBranchInputSchema.parse(normArgs)));
@@ -246,6 +252,12 @@ export class BoomtickMCPServer {
246
252
  case "github.get.pr":
247
253
  case "github.get_pr":
248
254
  return createSuccessResult(await getPrHandler(GetPrInputSchema.parse(normArgs)));
255
+ case "github.get.pr.reviews":
256
+ case "github.get_pr_reviews":
257
+ return createSuccessResult(await getPrReviewsHandler(GetPrReviewsInputSchema.parse(normArgs)));
258
+ case "github.get.pr.commits":
259
+ case "github.get_pr_commits":
260
+ return createSuccessResult(await getPrCommitsHandler(GetPrCommitsInputSchema.parse(normArgs)));
249
261
  case "github.issue.view":
250
262
  case "github.issue_view":
251
263
  return createSuccessResult(await issueViewHandler(IssueViewInputSchema.parse(normArgs)));
@@ -3,7 +3,7 @@ import { runCommand } from "../lib/shell.js";
3
3
  import { resolveRepo } from "../lib/git.js";
4
4
  import { sanitizeError } from "../lib/error_utils.js";
5
5
 
6
- const GetPrCommitsInputSchema = z.object({
6
+ export const GetPrCommitsInputSchema = z.object({
7
7
  prNumber: z.number().describe("The number of the PR to list commits for."),
8
8
  repo: z.string().optional().describe("The target repository override (e.g. org/repo)."),
9
9
  });
@@ -3,7 +3,7 @@ import { runCommand } from "../lib/shell.js";
3
3
  import { resolveRepo } from "../lib/git.js";
4
4
  import { sanitizeError } from "../lib/error_utils.js";
5
5
 
6
- const GetPrReviewsInputSchema = z.object({
6
+ export const GetPrReviewsInputSchema = z.object({
7
7
  prNumber: z.number().describe("The number of the PR to view reviews for."),
8
8
  repo: z.string().optional().describe("The target repository override (e.g. org/repo)."),
9
9
  });
@@ -3,7 +3,7 @@ import { runCommand } from "../lib/shell.js";
3
3
  import { resolveRepo } from "../lib/git.js";
4
4
  import { sanitizeError } from "../lib/error_utils.js";
5
5
 
6
- const GetWorkflowRunsInputSchema = z.object({
6
+ export const GetWorkflowRunsInputSchema = z.object({
7
7
  branch: z.string().optional().describe("Filter workflow runs by branch name."),
8
8
  event: z.string().optional().describe("Filter workflow runs by event (e.g. push, pull_request)."),
9
9
  repo: z.string().optional().describe("The target repository override (e.g. org/repo)."),