@codesherlock/codesherlock-alpha-mcp-server 0.0.9 → 0.0.11

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/.env CHANGED
@@ -3,7 +3,7 @@
3
3
  # Backend API Configuration
4
4
  BACKEND_API_URL=https://api.dev.codesherlock.ai
5
5
 
6
- NODE_ENV=development
7
6
 
8
7
  # Application Insights Configuration
9
- APPLICATIONINSIGHTS_CONNECTION_STRING=your-application-insights-connection-string-here
8
+ APPLICATIONINSIGHTS_CONNECTION_STRING="InstrumentationKey=9a687b23-0384-4345-abaa-4e7065b0d103;IngestionEndpoint=https://eastus-8.in.applicationinsights.azure.com/;LiveEndpoint=https://eastus.livediagnostics.monitor.azure.com/;ApplicationId=9e40bff2-07af-4326-be55-f5dc98e9e9c3"
9
+
@@ -13,13 +13,23 @@ export declare const AnalyzeCommitInputSchema: {
13
13
  * - Usage limit errors
14
14
  * - Git errors
15
15
  * - Internal server errors
16
+ *
17
+ * IMPORTANT:
18
+ * We intentionally keep `errorType` as a free-form string instead of a strict enum.
19
+ * The backend may introduce new error type strings (for example, "no_analysis_error")
20
+ * and we **do not** want the MCP server to fail schema validation with an error like:
21
+ * "Structured content does not match the tool's output schema: data.errorType should be equal to one of the allowed values".
22
+ *
23
+ * By allowing any string here, we always pass through whatever the backend sends and let
24
+ * the client / UI decide how to display or group unknown error types, instead of hiding
25
+ * the real backend error behind a schema error.
16
26
  */
17
27
  export declare const AnalyzeCommitOutputSchema: {
18
28
  success: z.ZodBoolean;
19
29
  analysisId: z.ZodOptional<z.ZodString>;
20
30
  status: z.ZodOptional<z.ZodString>;
21
31
  statusCode: z.ZodOptional<z.ZodNumber>;
22
- errorType: z.ZodOptional<z.ZodEnum<["authentication_error", "validation_error", "not_found_error", "git_error", "websocket_error", "api_error", "internal_error", "usage_limit_error", "repository_error"]>>;
32
+ errorType: z.ZodOptional<z.ZodString>;
23
33
  results: z.ZodOptional<z.ZodAny>;
24
34
  message: z.ZodOptional<z.ZodString>;
25
35
  error: z.ZodOptional<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"toolSchemas.d.ts","sourceRoot":"","sources":["../../src/schemas/toolSchemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,eAAO,MAAM,wBAAwB;;;;CAIpC,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;CAwBrC,CAAC"}
1
+ {"version":3,"file":"toolSchemas.d.ts","sourceRoot":"","sources":["../../src/schemas/toolSchemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,eAAO,MAAM,wBAAwB;;;;CAIpC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;CAsBrC,CAAC"}
@@ -13,23 +13,29 @@ export const AnalyzeCommitInputSchema = {
13
13
  * - Usage limit errors
14
14
  * - Git errors
15
15
  * - Internal server errors
16
+ *
17
+ * IMPORTANT:
18
+ * We intentionally keep `errorType` as a free-form string instead of a strict enum.
19
+ * The backend may introduce new error type strings (for example, "no_analysis_error")
20
+ * and we **do not** want the MCP server to fail schema validation with an error like:
21
+ * "Structured content does not match the tool's output schema: data.errorType should be equal to one of the allowed values".
22
+ *
23
+ * By allowing any string here, we always pass through whatever the backend sends and let
24
+ * the client / UI decide how to display or group unknown error types, instead of hiding
25
+ * the real backend error behind a schema error.
16
26
  */
17
27
  export const AnalyzeCommitOutputSchema = {
18
28
  success: z.boolean().describe("Whether the commit analysis was successful"),
19
29
  analysisId: z.string().optional().describe("Analysis ID returned from the backend (if successful)"),
20
30
  status: z.string().optional().describe("Status string (e.g., 'complete', 'pending', 'failed')"),
21
31
  statusCode: z.number().optional().describe("HTTP status code for error scenarios. Common values: 401 (authentication), 404 (not found), 422 (validation), 500 (internal error)"),
22
- errorType: z.enum([
23
- "authentication_error",
24
- "validation_error",
25
- "not_found_error",
26
- "git_error",
27
- "websocket_error",
28
- "api_error",
29
- "internal_error",
30
- "usage_limit_error",
31
- "repository_error"
32
- ]).optional().describe("Categorized error type for better error handling and user experience"),
32
+ errorType: z
33
+ .string()
34
+ .optional()
35
+ .describe("Categorized error type for better error handling and user experience. " +
36
+ "Common values include: authentication_error, validation_error, not_found_error, " +
37
+ "no_analysis_error, websocket_error, api_error, internal_error, usage_limit_error, repository_error. " +
38
+ "Additional values may be introduced by the backend over time."),
33
39
  results: z.any().optional().describe("Analysis results array (present when success is true)"),
34
40
  message: z.string().optional().describe("Success or informational message"),
35
41
  error: z.string().optional().describe("Error message (present when success is false)"),
@@ -1 +1 @@
1
- {"version":3,"file":"toolSchemas.js","sourceRoot":"","sources":["../../src/schemas/toolSchemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACpC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,uEAAuE,CAAC;IAC1G,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACjE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,gDAAgD,CAAC;CAChH,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACrC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IAC3E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IACnG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IAC/F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oIAAoI,CAAC;IAChL,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC;QACd,sBAAsB;QACtB,kBAAkB;QAClB,iBAAiB;QACjB,WAAW;QACX,iBAAiB;QACjB,WAAW;QACX,gBAAgB;QAChB,mBAAmB;QACnB,kBAAkB;KACrB,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sEAAsE,CAAC;IAC9F,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IAC7F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC3E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IACtF,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;QAC7G,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QAClG,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4HAA4H,CAAC;KAC3K,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+EAA+E,CAAC;CAC1G,CAAC"}
1
+ {"version":3,"file":"toolSchemas.js","sourceRoot":"","sources":["../../src/schemas/toolSchemas.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACpC,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,uEAAuE,CAAC;IAC1G,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IACjE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,gBAAgB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,gDAAgD,CAAC;CAChH,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACrC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IAC3E,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IACnG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IAC/F,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oIAAoI,CAAC;IAChL,SAAS,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACL,wEAAwE;QACxE,kFAAkF;QAClF,sGAAsG;QACtG,+DAA+D,CAClE;IACL,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uDAAuD,CAAC;IAC7F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;IAC3E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IACtF,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gEAAgE,CAAC;QAC7G,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QAClG,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4HAA4H,CAAC;KAC3K,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+EAA+E,CAAC;CAC1G,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=analysisFormatter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysisFormatter.test.d.ts","sourceRoot":"","sources":["../../src/tests/analysisFormatter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
1
+ import { jsonToMdIssue, jsonToMdAnalysis, formatFileAnalysisToMarkdown, formatMultipleFileAnalysisToMarkdown, } from "../utils/analysisFormatter.js";
2
+ describe("analysisFormatter", () => {
3
+ describe("jsonToMdIssue", () => {
4
+ it("renders issue with lines, snippets, severity and solution", () => {
5
+ const md = jsonToMdIssue({
6
+ issue: "Null pointer",
7
+ uid: "u1",
8
+ start_line: 10,
9
+ end_line: 12,
10
+ issue_code_snippet: "foo.bar();",
11
+ severity: "High",
12
+ solution: "Check nulls",
13
+ solution_code_snippet: "if (foo) foo.bar();",
14
+ }, "TS", "Reliability");
15
+ expect(md).toContain("**Issue:** Null pointer");
16
+ expect(md).toContain("**Quality Aspect:** Reliability");
17
+ expect(md).toContain("**Severity:** High");
18
+ expect(md).toContain("**Lines:** 10-12");
19
+ expect(md).toContain("```ts\nfoo.bar();\n```");
20
+ expect(md).toContain("**Solution:** Check nulls");
21
+ expect(md).toContain("```ts\nif (foo) foo.bar();\n```");
22
+ });
23
+ it("omits optional sections when not provided", () => {
24
+ const md = jsonToMdIssue({
25
+ issue: "Minor style",
26
+ uid: "u2",
27
+ severity: "low",
28
+ solution: "Run formatter",
29
+ }, "JS");
30
+ expect(md).not.toContain("Lines:");
31
+ expect(md).not.toContain("Quality Aspect");
32
+ expect(md).toContain("**Solution:** Run formatter");
33
+ });
34
+ });
35
+ describe("jsonToMdAnalysis", () => {
36
+ it("groups issues and returns markdown per characteristic", () => {
37
+ const md = jsonToMdAnalysis([
38
+ {
39
+ characteristic: "Security",
40
+ description_of_characteristic: "OWASP checks",
41
+ issue_items: [
42
+ { issue: "SQLi", severity: "critical", solution: "Use params", uid: "u3" },
43
+ { issue: "XSS", severity: "medium", solution: "Escape output", uid: "u4" },
44
+ ],
45
+ },
46
+ ], "TS");
47
+ expect(md).toContain("## Security");
48
+ expect(md).toContain("OWASP checks");
49
+ expect(md).toContain("SQLi");
50
+ expect(md).toContain("XSS");
51
+ });
52
+ it("skips null entries gracefully", () => {
53
+ const md = jsonToMdAnalysis([null, {
54
+ characteristic: "Quality",
55
+ description_of_characteristic: "General",
56
+ issue_items: [],
57
+ }], "ts");
58
+ expect(md).toContain("## Quality");
59
+ expect(md).not.toContain("null");
60
+ });
61
+ });
62
+ describe("formatFileAnalysisToMarkdown", () => {
63
+ it("adds file header and delegates to jsonToMdAnalysis", () => {
64
+ const md = formatFileAnalysisToMarkdown([{
65
+ characteristic: "Performance",
66
+ description_of_characteristic: "Speed issues",
67
+ issue_items: [{ issue: "Slow loop", severity: "high", solution: "Optimize" }],
68
+ }], "ts", "app.ts");
69
+ expect(md.startsWith("# Analysis for app.ts")).toBe(true);
70
+ expect(md).toContain("Performance");
71
+ expect(md).toContain("Slow loop");
72
+ });
73
+ it("handles missing analysis array", () => {
74
+ const md = formatFileAnalysisToMarkdown(undefined, "ts", "file.ts");
75
+ expect(md).toContain("No analysis data available.");
76
+ });
77
+ });
78
+ describe("formatMultipleFileAnalysisToMarkdown", () => {
79
+ it("renders multiple files separated by rules", () => {
80
+ const md = formatMultipleFileAnalysisToMarkdown([
81
+ { file_name: "a.ts", language: "ts", analysis: [] },
82
+ { file_name: "b.ts", language: "ts", analysis: [] },
83
+ ]);
84
+ expect(md).toContain("# Code Analysis Results");
85
+ const separators = md.match(/---/g) || [];
86
+ expect(separators.length).toBe(2);
87
+ expect(md).toContain("Analysis for a.ts");
88
+ expect(md).toContain("Analysis for b.ts");
89
+ });
90
+ });
91
+ });
92
+ //# sourceMappingURL=analysisFormatter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analysisFormatter.test.js","sourceRoot":"","sources":["../../src/tests/analysisFormatter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=errorExtractor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorExtractor.test.d.ts","sourceRoot":"","sources":["../../src/tests/errorExtractor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { extractErrorDetails } from "../utils/errorExtractor.js";
2
+ describe("extractErrorDetails", () => {
3
+ it("maps authentication errors (401)", () => {
4
+ const err = new Error("Authentication failed");
5
+ err.statusCode = 401;
6
+ const details = extractErrorDetails(err);
7
+ expect(details.errorType).toBe("authentication_error");
8
+ expect(details.retryable).toBe(false);
9
+ });
10
+ it("maps not found errors (404) with custom message", () => {
11
+ const err = new Error("User not found");
12
+ err.statusCode = 404;
13
+ const details = extractErrorDetails(err);
14
+ expect(details.errorType).toBe("not_found_error");
15
+ expect(details.userMessage).toContain("User not found");
16
+ });
17
+ it("maps validation errors (422) and keeps user-friendly message", () => {
18
+ const err = new Error("Invalid JSON format in files.json");
19
+ err.statusCode = 422;
20
+ const details = extractErrorDetails(err);
21
+ expect(details.errorType).toBe("validation_error");
22
+ expect(details.userMessage).toContain("Invalid file format");
23
+ });
24
+ it("maps git related errors to no_analysis_error and retryable true", () => {
25
+ const details = extractErrorDetails(new Error("Git operation failed"));
26
+ expect(details.errorType).toBe("no_analysis_error");
27
+ expect(details.retryable).toBe(true);
28
+ });
29
+ it("maps websocket errors to websocket_error and retryable true", () => {
30
+ const details = extractErrorDetails(new Error("WebSocket connection closed unexpectedly"));
31
+ expect(details.errorType).toBe("websocket_error");
32
+ expect(details.retryable).toBe(true);
33
+ });
34
+ it("maps internal errors (500) and sets retryable true", () => {
35
+ const err = new Error("Internal server error");
36
+ err.statusCode = 500;
37
+ const details = extractErrorDetails(err);
38
+ expect(details.errorType).toBe("internal_error");
39
+ expect(details.retryable).toBe(true);
40
+ });
41
+ it("maps other 4xx client errors to api_error", () => {
42
+ const err = new Error("Teapot error");
43
+ err.statusCode = 418;
44
+ const details = extractErrorDetails(err);
45
+ expect(details.errorType).toBe("api_error");
46
+ expect(details.retryable).toBe(false);
47
+ });
48
+ it("maps other 5xx server errors to api_error and retryable true", () => {
49
+ const err = new Error("Bad gateway");
50
+ err.statusCode = 502;
51
+ const details = extractErrorDetails(err);
52
+ expect(details.errorType).toBe("api_error");
53
+ expect(details.retryable).toBe(true);
54
+ });
55
+ it("uses status parsed from message when missing on object", () => {
56
+ const details = extractErrorDetails(new Error("HTTP error! status: 404, detail: missing"));
57
+ expect(details.statusCode).toBe(404);
58
+ expect(details.errorType).toBe("not_found_error");
59
+ });
60
+ });
61
+ //# sourceMappingURL=errorExtractor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorExtractor.test.js","sourceRoot":"","sources":["../../src/tests/errorExtractor.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codesherlock/codesherlock-alpha-mcp-server",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "description": "A TypeScript-based Model Context Protocol (MCP) server",
5
5
  "main": "build/index.js",
6
6
  "bin": {