@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 +7 -0
- package/dist/mcp/server.js +12 -0
- package/dist/mcp/server.test.js +24 -0
- package/dist/tools/github.get_pr_commits.js +1 -1
- package/dist/tools/github.get_pr_reviews.js +1 -1
- package/dist/tools/repo.get_workflow_runs.js +1 -1
- package/package.json +1 -1
- package/src/mcp/server.test.ts +28 -0
- package/src/mcp/server.ts +12 -0
- package/src/tools/github.get_pr_commits.ts +1 -1
- package/src/tools/github.get_pr_reviews.ts +1 -1
- package/src/tools/repo.get_workflow_runs.ts +1 -1
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
|
|
package/dist/mcp/server.js
CHANGED
|
@@ -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)));
|
package/dist/mcp/server.test.js
CHANGED
|
@@ -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
package/src/mcp/server.test.ts
CHANGED
|
@@ -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)."),
|