@arii/boomtick-mcp 0.6.2 → 0.7.0

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.
Files changed (93) hide show
  1. package/.mcp/schemas/boomtick.health.json +22 -3
  2. package/.mcp/schemas/boomtick_health.json +22 -3
  3. package/.mcp/schemas/github.checkout_branch.json +16 -3
  4. package/.mcp/schemas/github.comment_triage_summary.json +16 -3
  5. package/.mcp/schemas/github.create_pull_request.json +16 -3
  6. package/.mcp/schemas/github.get_pr.json +12 -3
  7. package/.mcp/schemas/github.get_pr_commits.json +12 -3
  8. package/.mcp/schemas/github.get_pr_reviews.json +24 -3
  9. package/.mcp/schemas/github.issue_comment.json +19 -3
  10. package/.mcp/schemas/github.issue_view.json +17 -3
  11. package/.mcp/schemas/github.open_replacement_pr.json +16 -3
  12. package/.mcp/schemas/github_checkout_branch.json +16 -3
  13. package/.mcp/schemas/github_comment_triage_summary.json +16 -3
  14. package/.mcp/schemas/github_create_pull_request.json +16 -3
  15. package/.mcp/schemas/github_get_pr.json +12 -3
  16. package/.mcp/schemas/github_get_pr_commits.json +12 -3
  17. package/.mcp/schemas/github_get_pr_reviews.json +24 -3
  18. package/.mcp/schemas/github_issue_comment.json +19 -3
  19. package/.mcp/schemas/github_issue_view.json +17 -3
  20. package/.mcp/schemas/github_open_replacement_pr.json +16 -3
  21. package/.mcp/schemas/jules.cancel_session.json +38 -3
  22. package/.mcp/schemas/jules.create_session.json +52 -3
  23. package/.mcp/schemas/jules.get_messages.json +19 -3
  24. package/.mcp/schemas/jules.get_pr.json +23 -3
  25. package/.mcp/schemas/jules.get_session.json +38 -3
  26. package/.mcp/schemas/jules.list_sessions.json +53 -3
  27. package/.mcp/schemas/jules.send_message.json +31 -3
  28. package/.mcp/schemas/jules.trigger_feedback.json +28 -3
  29. package/.mcp/schemas/jules_cancel_session.json +38 -3
  30. package/.mcp/schemas/jules_create_session.json +52 -3
  31. package/.mcp/schemas/jules_get_messages.json +19 -3
  32. package/.mcp/schemas/jules_get_pr.json +23 -3
  33. package/.mcp/schemas/jules_get_session.json +38 -3
  34. package/.mcp/schemas/jules_list_sessions.json +53 -3
  35. package/.mcp/schemas/jules_send_message.json +31 -3
  36. package/.mcp/schemas/jules_trigger_feedback.json +28 -3
  37. package/.mcp/schemas/repo.check_jules_status.json +93 -3
  38. package/.mcp/schemas/repo.commit_patch.json +23 -3
  39. package/.mcp/schemas/repo.create_branch.json +28 -3
  40. package/.mcp/schemas/repo.create_repair_branch.json +31 -3
  41. package/.mcp/schemas/repo.get_changed_files.json +11 -3
  42. package/.mcp/schemas/repo.get_command_schema.json +29 -3
  43. package/.mcp/schemas/repo.get_package_scripts.json +11 -3
  44. package/.mcp/schemas/repo.get_workflow_runs.json +12 -3
  45. package/.mcp/schemas/repo.logs.json +14 -3
  46. package/.mcp/schemas/repo.multi_exec.json +89 -0
  47. package/.mcp/schemas/repo.read_agent_context.json +117 -5
  48. package/.mcp/schemas/repo.read_ci_logs.json +46 -3
  49. package/.mcp/schemas/repo_check_jules_status.json +93 -3
  50. package/.mcp/schemas/repo_commit_patch.json +23 -3
  51. package/.mcp/schemas/repo_create_branch.json +28 -3
  52. package/.mcp/schemas/repo_create_repair_branch.json +31 -3
  53. package/.mcp/schemas/repo_get_changed_files.json +11 -3
  54. package/.mcp/schemas/repo_get_command_schema.json +29 -3
  55. package/.mcp/schemas/repo_get_package_scripts.json +11 -3
  56. package/.mcp/schemas/repo_get_workflow_runs.json +12 -3
  57. package/.mcp/schemas/repo_logs.json +14 -3
  58. package/.mcp/schemas/repo_multi_exec.json +89 -0
  59. package/.mcp/schemas/repo_read_agent_context.json +117 -5
  60. package/.mcp/schemas/repo_read_ci_logs.json +46 -3
  61. package/CHANGELOG.md +14 -0
  62. package/README.md +7 -5
  63. package/dist/config/dynamic.js +3 -2
  64. package/dist/config/repo.js +5 -5
  65. package/dist/config.test.js +10 -3
  66. package/dist/mcp/definitions.js +49 -36
  67. package/dist/mcp/http.js +15 -0
  68. package/dist/mcp/http.test.js +8 -0
  69. package/dist/mcp/server.js +34 -0
  70. package/dist/mcp/server.test.js +31 -0
  71. package/dist/tools/contract.js +960 -3
  72. package/dist/tools/jules/create-session.js +12 -2
  73. package/dist/tools/jules/create-session.test.js +7 -0
  74. package/dist/tools/repo.multi_exec.js +21 -0
  75. package/dist/tools/repo.multi_exec.test.js +13 -0
  76. package/dist/tools/repo.read_agent_context.js +65 -3
  77. package/dist/tools/repo.read_agent_context.test.js +30 -1
  78. package/package.json +1 -1
  79. package/src/config/dynamic.ts +3 -2
  80. package/src/config/repo.ts +6 -6
  81. package/src/config.test.ts +11 -3
  82. package/src/mcp/definitions.ts +77 -36
  83. package/src/mcp/http.test.ts +10 -0
  84. package/src/mcp/http.ts +20 -0
  85. package/src/mcp/server.test.ts +38 -0
  86. package/src/mcp/server.ts +36 -0
  87. package/src/tools/contract.ts +1089 -16
  88. package/src/tools/jules/create-session.test.ts +9 -0
  89. package/src/tools/jules/create-session.ts +13 -2
  90. package/src/tools/repo.multi_exec.test.ts +15 -0
  91. package/src/tools/repo.multi_exec.ts +23 -0
  92. package/src/tools/repo.read_agent_context.test.ts +35 -1
  93. package/src/tools/repo.read_agent_context.ts +68 -3
@@ -35,8 +35,36 @@
35
35
  "type": "object"
36
36
  },
37
37
  "outputSchema": {
38
- "type": "object",
39
- "properties": {},
40
- "additionalProperties": true
38
+ "properties": {
39
+ "prNumber": {
40
+ "title": "Prnumber",
41
+ "type": "integer"
42
+ },
43
+ "originalBranch": {
44
+ "title": "Originalbranch",
45
+ "type": "string"
46
+ },
47
+ "repairBranch": {
48
+ "title": "Repairbranch",
49
+ "type": "string"
50
+ },
51
+ "baseBranch": {
52
+ "title": "Basebranch",
53
+ "type": "string"
54
+ },
55
+ "worktreePath": {
56
+ "title": "Worktreepath",
57
+ "type": "string"
58
+ }
59
+ },
60
+ "required": [
61
+ "prNumber",
62
+ "originalBranch",
63
+ "repairBranch",
64
+ "baseBranch",
65
+ "worktreePath"
66
+ ],
67
+ "title": "CreateRepairBranchResponse",
68
+ "type": "object"
41
69
  }
42
70
  }
@@ -20,8 +20,16 @@
20
20
  "type": "object"
21
21
  },
22
22
  "outputSchema": {
23
- "type": "object",
24
- "properties": {},
25
- "additionalProperties": true
23
+ "properties": {
24
+ "files": {
25
+ "items": {
26
+ "type": "string"
27
+ },
28
+ "title": "Files",
29
+ "type": "array"
30
+ }
31
+ },
32
+ "title": "GetChangedFilesResponse",
33
+ "type": "object"
26
34
  }
27
35
  }
@@ -16,8 +16,34 @@
16
16
  "type": "object"
17
17
  },
18
18
  "outputSchema": {
19
- "type": "object",
20
- "properties": {},
21
- "additionalProperties": true
19
+ "properties": {
20
+ "status": {
21
+ "anyOf": [
22
+ {
23
+ "type": "string"
24
+ },
25
+ {
26
+ "type": "null"
27
+ }
28
+ ],
29
+ "default": null,
30
+ "title": "Status"
31
+ },
32
+ "schema": {
33
+ "anyOf": [
34
+ {
35
+ "additionalProperties": true,
36
+ "type": "object"
37
+ },
38
+ {
39
+ "type": "null"
40
+ }
41
+ ],
42
+ "default": null,
43
+ "title": "Schema"
44
+ }
45
+ },
46
+ "title": "GetCommandSchemaResponse",
47
+ "type": "object"
22
48
  }
23
49
  }
@@ -21,8 +21,16 @@
21
21
  "type": "object"
22
22
  },
23
23
  "outputSchema": {
24
- "type": "object",
25
- "properties": {},
26
- "additionalProperties": true
24
+ "properties": {
25
+ "scripts": {
26
+ "additionalProperties": {
27
+ "type": "string"
28
+ },
29
+ "title": "Scripts",
30
+ "type": "object"
31
+ }
32
+ },
33
+ "title": "GetPackageScriptsResponse",
34
+ "type": "object"
27
35
  }
28
36
  }
@@ -48,8 +48,17 @@
48
48
  "type": "object"
49
49
  },
50
50
  "outputSchema": {
51
- "type": "object",
52
- "properties": {},
53
- "additionalProperties": true
51
+ "properties": {
52
+ "workflowRuns": {
53
+ "items": {
54
+ "additionalProperties": true,
55
+ "type": "object"
56
+ },
57
+ "title": "Workflowruns",
58
+ "type": "array"
59
+ }
60
+ },
61
+ "title": "GetWorkflowRunsResponse",
62
+ "type": "object"
54
63
  }
55
64
  }
@@ -43,8 +43,19 @@
43
43
  "type": "object"
44
44
  },
45
45
  "outputSchema": {
46
- "type": "object",
47
- "properties": {},
48
- "additionalProperties": true
46
+ "properties": {
47
+ "logs": {
48
+ "anyOf": [
49
+ {},
50
+ {
51
+ "type": "null"
52
+ }
53
+ ],
54
+ "default": null,
55
+ "title": "Logs"
56
+ }
57
+ },
58
+ "title": "RepoLogsResponse",
59
+ "type": "object"
49
60
  }
50
61
  }
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "repo_multi_exec",
3
+ "description": "Execute a shell command sequentially across ecosystem repositories (or a filtered subset).",
4
+ "parameters": {
5
+ "properties": {
6
+ "command": {
7
+ "description": "Shell command to execute sequentially across repositories",
8
+ "title": "Command",
9
+ "type": "string"
10
+ },
11
+ "repos": {
12
+ "anyOf": [
13
+ {
14
+ "items": {
15
+ "type": "string"
16
+ },
17
+ "type": "array"
18
+ },
19
+ {
20
+ "type": "null"
21
+ }
22
+ ],
23
+ "default": null,
24
+ "description": "Optional list of repository names to target",
25
+ "title": "Repos"
26
+ },
27
+ "continueOnError": {
28
+ "anyOf": [
29
+ {
30
+ "type": "boolean"
31
+ },
32
+ {
33
+ "type": "null"
34
+ }
35
+ ],
36
+ "default": true,
37
+ "description": "Whether to continue execution if a repo command fails",
38
+ "title": "Continueonerror"
39
+ }
40
+ },
41
+ "required": [
42
+ "command"
43
+ ],
44
+ "title": "MultiExecInput",
45
+ "type": "object"
46
+ },
47
+ "outputSchema": {
48
+ "properties": {
49
+ "status": {
50
+ "default": "success",
51
+ "description": "Execution status",
52
+ "title": "Status",
53
+ "type": "string"
54
+ },
55
+ "total": {
56
+ "anyOf": [
57
+ {
58
+ "type": "integer"
59
+ },
60
+ {
61
+ "type": "null"
62
+ }
63
+ ],
64
+ "default": null,
65
+ "description": "Total repositories executed against",
66
+ "title": "Total"
67
+ },
68
+ "results": {
69
+ "anyOf": [
70
+ {
71
+ "items": {
72
+ "additionalProperties": true,
73
+ "type": "object"
74
+ },
75
+ "type": "array"
76
+ },
77
+ {
78
+ "type": "null"
79
+ }
80
+ ],
81
+ "default": null,
82
+ "description": "Execution results per repository",
83
+ "title": "Results"
84
+ }
85
+ },
86
+ "title": "MultiExecResponse",
87
+ "type": "object"
88
+ }
89
+ }
@@ -1,14 +1,126 @@
1
1
  {
2
2
  "name": "repo_read_agent_context",
3
- "description": "Read the full repository index including file tree, CLI schema, and MCP tools.",
3
+ "description": "Read the repository index including metadata, model review chains, or multi-repo ecosystem status.",
4
4
  "parameters": {
5
- "properties": {},
5
+ "properties": {
6
+ "path": {
7
+ "anyOf": [
8
+ {
9
+ "type": "string"
10
+ },
11
+ {
12
+ "type": "null"
13
+ }
14
+ ],
15
+ "default": null,
16
+ "description": "Local filesystem path to target repository root",
17
+ "title": "Path"
18
+ },
19
+ "repoPath": {
20
+ "anyOf": [
21
+ {
22
+ "type": "string"
23
+ },
24
+ {
25
+ "type": "null"
26
+ }
27
+ ],
28
+ "default": null,
29
+ "description": "Alias for path (filesystem path to target workspace repository root).",
30
+ "title": "Repopath"
31
+ },
32
+ "repo": {
33
+ "anyOf": [
34
+ {
35
+ "type": "string"
36
+ },
37
+ {
38
+ "type": "null"
39
+ }
40
+ ],
41
+ "default": null,
42
+ "description": "Target GitHub repository string (e.g. org/repo).",
43
+ "title": "Repo"
44
+ },
45
+ "repos": {
46
+ "anyOf": [
47
+ {
48
+ "items": {
49
+ "type": "string"
50
+ },
51
+ "type": "array"
52
+ },
53
+ {
54
+ "type": "null"
55
+ }
56
+ ],
57
+ "default": null,
58
+ "description": "List of repository names to fetch context for",
59
+ "title": "Repos"
60
+ },
61
+ "all": {
62
+ "anyOf": [
63
+ {
64
+ "type": "boolean"
65
+ },
66
+ {
67
+ "type": "null"
68
+ }
69
+ ],
70
+ "default": null,
71
+ "description": "Whether to fetch context across all discovered ecosystem repositories",
72
+ "title": "All"
73
+ }
74
+ },
6
75
  "title": "ReadAgentContextInput",
7
76
  "type": "object"
8
77
  },
9
78
  "outputSchema": {
10
- "type": "object",
11
- "properties": {},
12
- "additionalProperties": true
79
+ "properties": {
80
+ "status": {
81
+ "default": "success",
82
+ "title": "Status",
83
+ "type": "string"
84
+ },
85
+ "packageName": {
86
+ "anyOf": [
87
+ {
88
+ "type": "string"
89
+ },
90
+ {
91
+ "type": "null"
92
+ }
93
+ ],
94
+ "default": null,
95
+ "title": "Packagename"
96
+ },
97
+ "gitCommit": {
98
+ "anyOf": [
99
+ {
100
+ "type": "string"
101
+ },
102
+ {
103
+ "type": "null"
104
+ }
105
+ ],
106
+ "default": null,
107
+ "title": "Gitcommit"
108
+ },
109
+ "config": {
110
+ "anyOf": [
111
+ {
112
+ "additionalProperties": true,
113
+ "type": "object"
114
+ },
115
+ {
116
+ "type": "null"
117
+ }
118
+ ],
119
+ "default": null,
120
+ "title": "Config"
121
+ }
122
+ },
123
+ "title": "ReadAgentContextResponse",
124
+ "type": "object"
13
125
  }
14
126
  }
@@ -36,8 +36,51 @@
36
36
  "type": "object"
37
37
  },
38
38
  "outputSchema": {
39
- "type": "object",
40
- "properties": {},
41
- "additionalProperties": true
39
+ "properties": {
40
+ "checks": {
41
+ "anyOf": [
42
+ {
43
+ "items": {
44
+ "additionalProperties": true,
45
+ "type": "object"
46
+ },
47
+ "type": "array"
48
+ },
49
+ {
50
+ "type": "null"
51
+ }
52
+ ],
53
+ "default": null,
54
+ "title": "Checks"
55
+ },
56
+ "failedChecks": {
57
+ "anyOf": [
58
+ {
59
+ "items": {
60
+ "additionalProperties": true,
61
+ "type": "object"
62
+ },
63
+ "type": "array"
64
+ },
65
+ {
66
+ "type": "null"
67
+ }
68
+ ],
69
+ "default": null,
70
+ "title": "Failedchecks"
71
+ },
72
+ "logs": {
73
+ "anyOf": [
74
+ {},
75
+ {
76
+ "type": "null"
77
+ }
78
+ ],
79
+ "default": null,
80
+ "title": "Logs"
81
+ }
82
+ },
83
+ "title": "ReadCiLogsResponse",
84
+ "type": "object"
42
85
  }
43
86
  }
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.7.0](https://github.com/arii/boomtick/compare/mcp-v0.6.2...mcp-v0.7.0) (2026-10-29)
4
+
5
+
6
+ ### Features
7
+
8
+ * **aggregate:** agent onboarding, multi-repo context, and sequential orchestration ([#1001](https://github.com/arii/boomtick/issues/1001)) ([7060777](https://github.com/arii/boomtick/commit/7060777195a84d391b5098226ce06a04ddefcd9a))
9
+ * **aggregate:** pure-node container, review runner hardening, mcp modernization, and offline dag engine ([#1002](https://github.com/arii/boomtick/issues/1002)) ([056503c](https://github.com/arii/boomtick/commit/056503c8c21b5bd99f3b9d874ee7fac25972362a))
10
+ * **mcp:** modernize boomtick-mcp with typed outputSchema, resources interface, and streamable HTTP transport ([26401df](https://github.com/arii/boomtick/commit/26401df06774e9de7756a375e0080810cc35926e))
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **mcp:** resolve active repository dynamically across workspaces ([#981](https://github.com/arii/boomtick/issues/981)) ([9a757ea](https://github.com/arii/boomtick/commit/9a757ea5d1a878861e69bee4e36201849f7a03e4))
16
+
3
17
  ## [0.6.2](https://github.com/arii/boomtick/compare/mcp-v0.6.1...mcp-v0.6.2) (2026-10-28)
4
18
 
5
19
 
package/README.md CHANGED
@@ -41,19 +41,21 @@ A Model Context Protocol (MCP) server designed to empower AI agents with structu
41
41
 
42
42
  ### Installation
43
43
  ```bash
44
- cd boomtick-mcp
45
- pnpm install
46
- pnpm build
44
+ # From repository root
45
+ pnpm --filter @arii/boomtick-mcp run build
46
+
47
+ # Register boomtick-mcp across installed agent hosts automatically
48
+ td mcp install --execute
47
49
  ```
48
50
 
49
- ### Installation via MCP Client (e.g. Claude Desktop)
51
+ ### Manual Configuration via MCP Client (e.g. Claude Desktop, Cursor)
50
52
  Add the following to your MCP client configuration (e.g. `claude_desktop_config.json`):
51
53
  ```json
52
54
  {
53
55
  "mcpServers": {
54
56
  "boomtick": {
55
57
  "command": "node",
56
- "args": ["/absolute/path/to/boomtick-mcp/dist/index.js"],
58
+ "args": ["/absolute/path/to/mcp/dist/index.js"],
57
59
  "env": {
58
60
  "GITHUB_TOKEN": "your_pat",
59
61
  "GITHUB_OWNER": "your_org",
@@ -1,11 +1,12 @@
1
1
  import { execSync } from "child_process";
2
+ import { findRepoRoot } from "./repo.js";
2
3
  let cachedDynamicConfig = null;
3
- export function initializeConfig() {
4
+ export function initializeConfig(targetCwd) {
4
5
  if (cachedDynamicConfig !== null) {
5
6
  return cachedDynamicConfig;
6
7
  }
7
8
  try {
8
- const cwd = process.env.BOOMTICK_REPO_PATH || process.cwd();
9
+ const cwd = findRepoRoot(targetCwd);
9
10
  const cmd = `td config view`;
10
11
  const output = execSync(cmd, {
11
12
  cwd,
@@ -2,11 +2,8 @@ import path from "path";
2
2
  import fs from "fs";
3
3
  import { fileURLToPath } from "url";
4
4
  const __dirname = path.dirname(fileURLToPath(import.meta.url));
5
- export function findRepoRoot() {
6
- if (process.env.BOOMTICK_REPO_PATH) {
7
- return process.env.BOOMTICK_REPO_PATH;
8
- }
9
- let current = process.cwd();
5
+ export function findRepoRoot(startDir) {
6
+ let current = startDir || process.cwd();
10
7
  while (current !== path.parse(current).root) {
11
8
  if (fs.existsSync(path.join(current, "project_config.json")) ||
12
9
  fs.existsSync(path.join(current, "workspace.json")) ||
@@ -15,6 +12,9 @@ export function findRepoRoot() {
15
12
  }
16
13
  current = path.dirname(current);
17
14
  }
15
+ if (process.env.BOOMTICK_REPO_PATH) {
16
+ return process.env.BOOMTICK_REPO_PATH;
17
+ }
18
18
  current = __dirname;
19
19
  while (current !== path.parse(current).root) {
20
20
  if (fs.existsSync(path.join(current, "project_config.json")) ||
@@ -19,9 +19,10 @@ describe("config", () => {
19
19
  const mockConfig = { github_repo: "owner/repo", base_branch: "origin/main", vite_base_path: "/app/" };
20
20
  vi.mocked(execSync).mockReturnValue(JSON.stringify(mockConfig));
21
21
  const { initializeConfig } = await import("./config.js");
22
+ const { findRepoRoot } = await import("./config/repo.js");
22
23
  const result = initializeConfig();
23
24
  expect(execSync).toHaveBeenCalledWith("td config view", expect.objectContaining({
24
- cwd: process.cwd()
25
+ cwd: findRepoRoot()
25
26
  }));
26
27
  expect(result).toEqual(mockConfig);
27
28
  });
@@ -103,10 +104,16 @@ describe("config", () => {
103
104
  expect(() => config.githubOwner).toThrow("GITHUB_OWNER must be set via environment variable or project_config.json");
104
105
  expect(() => config.githubRepo).toThrow("GITHUB_REPO must be set via environment variable or project_config.json");
105
106
  });
106
- it("should resolve repoPath from BOOMTICK_REPO_PATH or findRepoRoot fallback", async () => {
107
+ it("should resolve active workspace from process.cwd() over BOOMTICK_REPO_PATH when inside a repo", async () => {
107
108
  process.env.BOOMTICK_REPO_PATH = "/custom/repo/path";
108
109
  const { config } = await import("./config.js");
109
- expect(config.repoPath).toBe("/custom/repo/path");
110
+ expect(config.repoPath).toBe(process.cwd().replace(/\/mcp$/, ""));
111
+ });
112
+ it("should fallback to BOOMTICK_REPO_PATH when process.cwd() is outside any repo", async () => {
113
+ process.env.BOOMTICK_REPO_PATH = "/custom/repo/path";
114
+ const { findRepoRoot } = await import("./config/repo.js");
115
+ const rootDir = process.platform === "win32" ? "C:\\" : "/";
116
+ expect(findRepoRoot(rootDir)).toBe("/custom/repo/path");
110
117
  });
111
118
  it("should resolve defaultBaseBranch, viteBasePath, and ghPath", async () => {
112
119
  process.env.DEFAULT_BASE_BRANCH = "develop";