@judge-java/mcp 0.1.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.
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP server for judge-java.
4
+ * Exposes review tools to Claude Code sessions.
5
+ *
6
+ * Run from repo root:
7
+ * npx judge-java-mcp
8
+ *
9
+ * Or configure in .claude/mcp.json:
10
+ * {
11
+ * "mcpServers": {
12
+ * "judge-java": {
13
+ * "command": "npx",
14
+ * "args": ["judge-java-mcp"],
15
+ * "cwd": "/path/to/repo"
16
+ * }
17
+ * }
18
+ * }
19
+ */
20
+ export {};
21
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG"}
package/dist/server.js ADDED
@@ -0,0 +1,371 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP server for judge-java.
4
+ * Exposes review tools to Claude Code sessions.
5
+ *
6
+ * Run from repo root:
7
+ * npx judge-java-mcp
8
+ *
9
+ * Or configure in .claude/mcp.json:
10
+ * {
11
+ * "mcpServers": {
12
+ * "judge-java": {
13
+ * "command": "npx",
14
+ * "args": ["judge-java-mcp"],
15
+ * "cwd": "/path/to/repo"
16
+ * }
17
+ * }
18
+ * }
19
+ */
20
+ import { addDecision, addTrackedIssue, buildIssueFromFinding, createLLMAdapter, GitHubClient, loadConfig, loadMemory, runReview, } from "@judge-java/core";
21
+ import * as readline from "readline";
22
+ // ─── Tool Definitions ─────────────────────────────────────────────────────────
23
+ const TOOLS = [
24
+ {
25
+ name: "review_diff",
26
+ description: "Review a code diff or the current working changes. Performs a thorough domain-aware code review. Use this when you want a full review of specific code.",
27
+ inputSchema: {
28
+ type: "object",
29
+ properties: {
30
+ diff: {
31
+ type: "string",
32
+ description: "The unified diff to review. If omitted, runs `git diff HEAD` automatically.",
33
+ },
34
+ title: {
35
+ type: "string",
36
+ description: "Title or description of the change being reviewed.",
37
+ },
38
+ taskDescription: {
39
+ type: "string",
40
+ description: "The task or issue description that defines the scope of this change.",
41
+ },
42
+ additionalLevels: {
43
+ type: "array",
44
+ items: {
45
+ type: "string",
46
+ enum: ["security", "performance", "architecture", "accessibility", "refactoring_opportunities"],
47
+ },
48
+ description: "Optional additional review levels to run beyond the defaults.",
49
+ },
50
+ },
51
+ },
52
+ },
53
+ {
54
+ name: "review_pr",
55
+ description: "Review a GitHub pull request by number. Fetches the PR diff, description, and linked issue automatically.",
56
+ inputSchema: {
57
+ type: "object",
58
+ required: ["prNumber"],
59
+ properties: {
60
+ prNumber: {
61
+ type: "number",
62
+ description: "The pull request number to review.",
63
+ },
64
+ additionalLevels: {
65
+ type: "array",
66
+ items: { type: "string" },
67
+ description: "Optional additional review levels.",
68
+ },
69
+ },
70
+ },
71
+ },
72
+ {
73
+ name: "check_memory",
74
+ description: "Query the judge-java memory for existing decisions, tracked issues, or domain conventions. Use before raising a concern to check if it's already known.",
75
+ inputSchema: {
76
+ type: "object",
77
+ properties: {
78
+ query: {
79
+ type: "string",
80
+ description: "Keyword or topic to search for in memory.",
81
+ },
82
+ type: {
83
+ type: "string",
84
+ enum: ["decisions", "issues", "conventions", "all"],
85
+ description: "What type of memory to query. Defaults to 'all'.",
86
+ },
87
+ },
88
+ },
89
+ },
90
+ {
91
+ name: "add_decision",
92
+ description: "Record a conscious team decision to dismiss a type of finding. Future reviews will not raise this concern again.",
93
+ inputSchema: {
94
+ type: "object",
95
+ required: ["title", "reason"],
96
+ properties: {
97
+ title: {
98
+ type: "string",
99
+ description: "Short title of the decision.",
100
+ },
101
+ reason: {
102
+ type: "string",
103
+ description: "Why the team made this decision.",
104
+ },
105
+ matchKeywords: {
106
+ type: "array",
107
+ items: { type: "string" },
108
+ description: "Keywords that identify findings this decision covers.",
109
+ },
110
+ matchFiles: {
111
+ type: "array",
112
+ items: { type: "string" },
113
+ description: "File path patterns this decision applies to.",
114
+ },
115
+ matchLevels: {
116
+ type: "array",
117
+ items: { type: "string" },
118
+ description: "Review levels this decision applies to.",
119
+ },
120
+ },
121
+ },
122
+ },
123
+ {
124
+ name: "update_conventions",
125
+ description: "Add domain knowledge, naming conventions, or architectural patterns to memory.md. This helps the reviewer understand your codebase better.",
126
+ inputSchema: {
127
+ type: "object",
128
+ required: ["content"],
129
+ properties: {
130
+ content: {
131
+ type: "string",
132
+ description: "The convention, pattern, or domain knowledge to add.",
133
+ },
134
+ },
135
+ },
136
+ },
137
+ {
138
+ name: "generate_dashboard",
139
+ description: "Generate the static HTML dashboard from the current .codeagent/ state.",
140
+ inputSchema: {
141
+ type: "object",
142
+ properties: {},
143
+ },
144
+ },
145
+ ];
146
+ // ─── Tool Handlers ────────────────────────────────────────────────────────────
147
+ const repoRoot = process.cwd();
148
+ async function handleTool(name, args) {
149
+ const config = await loadConfig(repoRoot);
150
+ const memory = await loadMemory(repoRoot);
151
+ switch (name) {
152
+ case "review_diff": {
153
+ let diff = args.diff ?? "";
154
+ if (!diff) {
155
+ const { execSync } = await import("child_process");
156
+ diff = execSync("git diff HEAD", { cwd: repoRoot }).toString();
157
+ }
158
+ if (!diff.trim()) {
159
+ return "No changes detected in the working directory.";
160
+ }
161
+ const pr = {
162
+ number: 0,
163
+ title: args.title ?? "Local review",
164
+ description: args.taskDescription ?? "",
165
+ author: "local",
166
+ baseBranch: "main",
167
+ headBranch: "working",
168
+ commitSha: "local",
169
+ diff,
170
+ changedFiles: [],
171
+ linkedIssue: args.taskDescription
172
+ ? {
173
+ number: 0,
174
+ title: "Task",
175
+ description: args.taskDescription,
176
+ labels: [],
177
+ }
178
+ : undefined,
179
+ };
180
+ const llm = createLLMAdapter(config.llm);
181
+ const result = await runReview({
182
+ pr,
183
+ memory,
184
+ config,
185
+ additionalLevels: args.additionalLevels ?? [],
186
+ }, llm, repoRoot);
187
+ return formatMCPReviewResult(result);
188
+ }
189
+ case "review_pr": {
190
+ const token = process.env.GITHUB_TOKEN;
191
+ const repository = process.env.GITHUB_REPOSITORY;
192
+ if (!token || !repository) {
193
+ return "GITHUB_TOKEN and GITHUB_REPOSITORY environment variables are required for PR reviews.";
194
+ }
195
+ const [owner, repo] = repository.split("/");
196
+ const github = new GitHubClient(token, owner, repo);
197
+ const pr = await github.getPullRequest(args.prNumber);
198
+ const llm = createLLMAdapter(config.llm);
199
+ const result = await runReview({
200
+ pr,
201
+ memory,
202
+ config,
203
+ additionalLevels: args.additionalLevels ?? [],
204
+ }, llm, repoRoot);
205
+ // Create GitHub issues for findings that need them
206
+ for (const finding of result.findingsNeedingIssues) {
207
+ const { title, body, labels, trackedIssuePartial } = buildIssueFromFinding(finding, pr.number, pr.title, config.github.labelPrefix);
208
+ const issueNumber = await github.createIssue({ title, body, labels });
209
+ finding.createdIssueNumber = issueNumber;
210
+ await addTrackedIssue(repoRoot, {
211
+ ...trackedIssuePartial,
212
+ githubIssueNumber: issueNumber,
213
+ });
214
+ }
215
+ return formatMCPReviewResult(result);
216
+ }
217
+ case "check_memory": {
218
+ const query = (args.query ?? "").toLowerCase();
219
+ const type = args.type ?? "all";
220
+ const results = [];
221
+ if ((type === "all" || type === "conventions") && memory.narrative) {
222
+ const relevant = memory.narrative
223
+ .split("\n")
224
+ .filter((l) => !query || l.toLowerCase().includes(query))
225
+ .join("\n");
226
+ if (relevant.trim()) {
227
+ results.push(`## Conventions & Domain Knowledge\n\n${relevant}`);
228
+ }
229
+ }
230
+ if (type === "all" || type === "decisions") {
231
+ const decisions = memory.decisions.filter((d) => !query ||
232
+ d.title.toLowerCase().includes(query) ||
233
+ d.reason.toLowerCase().includes(query));
234
+ if (decisions.length > 0) {
235
+ results.push(`## Decisions\n\n${decisions
236
+ .map((d) => `- **${d.title}** (${d.date}): ${d.reason}`)
237
+ .join("\n")}`);
238
+ }
239
+ }
240
+ if (type === "all" || type === "issues") {
241
+ const issues = memory.trackedIssues.filter((i) => i.status === "open" &&
242
+ (!query ||
243
+ i.title.toLowerCase().includes(query) ||
244
+ i.description.toLowerCase().includes(query)));
245
+ if (issues.length > 0) {
246
+ results.push(`## Tracked Issues\n\n${issues
247
+ .map((i) => `- **#${i.githubIssueNumber}** ${i.title} (\`${i.reviewLevel}\`)`)
248
+ .join("\n")}`);
249
+ }
250
+ }
251
+ return results.length > 0
252
+ ? results.join("\n\n")
253
+ : "No matching memory found.";
254
+ }
255
+ case "add_decision": {
256
+ const decision = await addDecision(repoRoot, {
257
+ title: args.title,
258
+ reason: args.reason,
259
+ author: "claude-code",
260
+ date: new Date().toISOString().split("T")[0],
261
+ matchPatterns: {
262
+ keywords: args.matchKeywords ?? [],
263
+ files: args.matchFiles ?? [],
264
+ reviewLevels: args.matchLevels ?? [],
265
+ },
266
+ });
267
+ return `✓ Decision recorded: "${decision.title}" (id: ${decision.id})`;
268
+ }
269
+ case "update_conventions": {
270
+ const { updateNarrative } = await import("@judge-java/core");
271
+ await updateNarrative(repoRoot, args.content);
272
+ return "✓ Conventions updated in .codeagent/memory.md";
273
+ }
274
+ case "generate_dashboard": {
275
+ const { generateDashboard } = await import("@judge-java/dashboard");
276
+ const outputPath = await generateDashboard(repoRoot);
277
+ return `✓ Dashboard generated at ${outputPath}`;
278
+ }
279
+ default:
280
+ throw new Error(`Unknown tool: ${name}`);
281
+ }
282
+ }
283
+ // ─── Result Formatter ─────────────────────────────────────────────────────────
284
+ function formatMCPReviewResult(result) {
285
+ const lines = [
286
+ `## ${result.passed ? "✅ Review Passed" : "❌ Changes Requested"}`,
287
+ ``,
288
+ result.summary,
289
+ ];
290
+ if (result.findings.length === 0) {
291
+ lines.push(``, `No findings. 🎉`);
292
+ }
293
+ else {
294
+ for (const f of result.findings) {
295
+ lines.push(``, `### [${f.severity.toUpperCase()}] ${f.title}`, `**Level:** ${f.level}${f.file ? ` · **File:** \`${f.file}\`` : ""}`, ``, f.description);
296
+ if (f.suggestion) {
297
+ lines.push(``, `**Suggestion:** ${f.suggestion}`);
298
+ }
299
+ if (f.existingIssueNumber) {
300
+ lines.push(``, `_Already tracked: Issue #${f.existingIssueNumber}_`);
301
+ }
302
+ if (f.createdIssueNumber) {
303
+ lines.push(``, `_Filed as: Issue #${f.createdIssueNumber}_`);
304
+ }
305
+ }
306
+ }
307
+ return lines.join("\n");
308
+ }
309
+ // ─── MCP Server (stdio transport) ────────────────────────────────────────────
310
+ const rl = readline.createInterface({
311
+ input: process.stdin,
312
+ output: process.stdout,
313
+ terminal: false,
314
+ });
315
+ function send(response) {
316
+ process.stdout.write(JSON.stringify(response) + "\n");
317
+ }
318
+ rl.on("line", async (line) => {
319
+ let request;
320
+ try {
321
+ request = JSON.parse(line);
322
+ }
323
+ catch {
324
+ return;
325
+ }
326
+ const { id, method, params } = request;
327
+ if (method === "initialize") {
328
+ send({
329
+ jsonrpc: "2.0",
330
+ id,
331
+ result: {
332
+ protocolVersion: "2024-11-05",
333
+ capabilities: { tools: {} },
334
+ serverInfo: { name: "judge-java", version: "0.1.0" },
335
+ },
336
+ });
337
+ return;
338
+ }
339
+ if (method === "tools/list") {
340
+ send({ jsonrpc: "2.0", id, result: { tools: TOOLS } });
341
+ return;
342
+ }
343
+ if (method === "tools/call") {
344
+ const toolName = params?.name;
345
+ const toolArgs = (params?.arguments ?? {});
346
+ try {
347
+ const result = await handleTool(toolName, toolArgs);
348
+ send({
349
+ jsonrpc: "2.0",
350
+ id,
351
+ result: {
352
+ content: [{ type: "text", text: result }],
353
+ },
354
+ });
355
+ }
356
+ catch (err) {
357
+ send({
358
+ jsonrpc: "2.0",
359
+ id,
360
+ error: { code: -32000, message: String(err) },
361
+ });
362
+ }
363
+ return;
364
+ }
365
+ send({
366
+ jsonrpc: "2.0",
367
+ id,
368
+ error: { code: -32601, message: `Method not found: ${method}` },
369
+ });
370
+ });
371
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "@judge-java/mcp",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for judge-java \u2014 Claude Code integration",
5
+ "type": "module",
6
+ "files": ["dist"],
7
+ "bin": {
8
+ "judge-java-mcp": "./dist/server.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc -p tsconfig.json",
12
+ "start": "node ../dist/mcp/src/server.js",
13
+ "test": "vitest run"
14
+ },
15
+ "dependencies": {
16
+ "@judge-java/core": "*",
17
+ "@judge-java/dashboard": "*"
18
+ },
19
+ "main": "./dist/server.js"
20
+ }