@printwithsynergy/synergy-mcp 0.1.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/CLAUDE.md +119 -0
- package/LICENSE +661 -0
- package/README.md +160 -0
- package/dist/config.d.ts +14 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +78 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +166 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/blast-radius.d.ts +33 -0
- package/dist/tools/blast-radius.d.ts.map +1 -0
- package/dist/tools/blast-radius.js +205 -0
- package/dist/tools/blast-radius.js.map +1 -0
- package/dist/tools/floor-pin-grid.d.ts +23 -0
- package/dist/tools/floor-pin-grid.d.ts.map +1 -0
- package/dist/tools/floor-pin-grid.js +133 -0
- package/dist/tools/floor-pin-grid.js.map +1 -0
- package/dist/tools/pattern-audit.d.ts +30 -0
- package/dist/tools/pattern-audit.d.ts.map +1 -0
- package/dist/tools/pattern-audit.js +184 -0
- package/dist/tools/pattern-audit.js.map +1 -0
- package/dist/tools/stack-health-grid.d.ts +35 -0
- package/dist/tools/stack-health-grid.d.ts.map +1 -0
- package/dist/tools/stack-health-grid.js +110 -0
- package/dist/tools/stack-health-grid.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* stack_health_grid — fetch /healthz (and /v1/contract when available)
|
|
3
|
+
* across the configured prod URLs for the stack, in parallel, and
|
|
4
|
+
* return a grid with status code + latency + version skew.
|
|
5
|
+
*
|
|
6
|
+
* Audit finding #15 in the cross-stack audit caught five different
|
|
7
|
+
* health/contract endpoint patterns. This tool branches per-service
|
|
8
|
+
* so the caller doesn't have to.
|
|
9
|
+
*/
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import { KNOWN_REPOS, PROD_URLS } from "../config.js";
|
|
12
|
+
export const StackHealthGridInput = z.object({
|
|
13
|
+
repos: z
|
|
14
|
+
.array(z.string())
|
|
15
|
+
.optional()
|
|
16
|
+
.describe("Optional subset of repo names to check (e.g. ['codex-pdf', 'lint-pdf']). When omitted, checks every repo with a configured PROD URL."),
|
|
17
|
+
timeout_ms: z
|
|
18
|
+
.number()
|
|
19
|
+
.int()
|
|
20
|
+
.positive()
|
|
21
|
+
.default(5000)
|
|
22
|
+
.describe("Per-request timeout in ms. The whole grid still resolves; rows that time out get `status: 'timeout'`."),
|
|
23
|
+
});
|
|
24
|
+
/** Per-repo endpoint discovery — matches the divergence audit
|
|
25
|
+
* finding #15 documented. */
|
|
26
|
+
function endpointsFor(repo) {
|
|
27
|
+
switch (repo) {
|
|
28
|
+
case "codex-pdf":
|
|
29
|
+
return [
|
|
30
|
+
{ endpoint: "v1/healthz", path: "/v1/healthz" },
|
|
31
|
+
{ endpoint: "v1/contract", path: "/v1/contract" },
|
|
32
|
+
];
|
|
33
|
+
case "lint-pdf":
|
|
34
|
+
return [
|
|
35
|
+
{ endpoint: "health", path: "/health" },
|
|
36
|
+
{ endpoint: "ready", path: "/ready" },
|
|
37
|
+
];
|
|
38
|
+
case "compile-pdf":
|
|
39
|
+
return [
|
|
40
|
+
{ endpoint: "v1/healthz", path: "/v1/healthz" },
|
|
41
|
+
{ endpoint: "v1/contract", path: "/v1/contract" },
|
|
42
|
+
];
|
|
43
|
+
case "synergy":
|
|
44
|
+
return [{ endpoint: "healthz", path: "/healthz" }];
|
|
45
|
+
case "platform":
|
|
46
|
+
return [{ endpoint: "healthz", path: "/healthz" }];
|
|
47
|
+
case "lens-pdf":
|
|
48
|
+
return []; // npm library — no HTTP surface
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async function probe(url, timeout_ms) {
|
|
52
|
+
const ctrl = new AbortController();
|
|
53
|
+
const timer = setTimeout(() => ctrl.abort(), timeout_ms);
|
|
54
|
+
const t0 = performance.now();
|
|
55
|
+
try {
|
|
56
|
+
const res = await fetch(url, { signal: ctrl.signal });
|
|
57
|
+
const latency_ms = Math.round(performance.now() - t0);
|
|
58
|
+
let body_summary = "";
|
|
59
|
+
try {
|
|
60
|
+
const text = await res.text();
|
|
61
|
+
body_summary = text.slice(0, 200).replace(/\s+/g, " ").trim();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
body_summary = "<unreadable body>";
|
|
65
|
+
}
|
|
66
|
+
return { status: res.status, latency_ms, body_summary };
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
const latency_ms = Math.round(performance.now() - t0);
|
|
70
|
+
if (err instanceof Error && err.name === "AbortError") {
|
|
71
|
+
return { status: "timeout", latency_ms, body_summary: "" };
|
|
72
|
+
}
|
|
73
|
+
return {
|
|
74
|
+
status: "error",
|
|
75
|
+
latency_ms,
|
|
76
|
+
body_summary: err instanceof Error ? err.message : String(err),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
export async function stackHealthGrid(input) {
|
|
84
|
+
const subset = input.repos
|
|
85
|
+
? input.repos.filter((r) => KNOWN_REPOS.includes(r))
|
|
86
|
+
: KNOWN_REPOS;
|
|
87
|
+
const notes = [];
|
|
88
|
+
const tasks = [];
|
|
89
|
+
for (const repo of subset) {
|
|
90
|
+
const base = PROD_URLS[repo];
|
|
91
|
+
if (!base) {
|
|
92
|
+
notes.push(`repo ${repo}: no PROD URL configured (set SYNERGY_MCP_URL_${repo
|
|
93
|
+
.toUpperCase()
|
|
94
|
+
.replace(/-/g, "_")})`);
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
for (const ep of endpointsFor(repo)) {
|
|
98
|
+
const url = `${base}${ep.path}`;
|
|
99
|
+
tasks.push(probe(url, input.timeout_ms).then((r) => ({
|
|
100
|
+
repo,
|
|
101
|
+
url,
|
|
102
|
+
endpoint: ep.endpoint,
|
|
103
|
+
...r,
|
|
104
|
+
})));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const rows = await Promise.all(tasks);
|
|
108
|
+
return { rows, notes };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=stack-health-grid.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-health-grid.js","sourceRoot":"","sources":["../../src/tools/stack-health-grid.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@printwithsynergy/synergy-mcp",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Cross-stack dev-audit MCP server for the Print With Synergy stack — blast-radius queries, floor-pin grid, pattern audit, and stack health grid across codex-pdf / lint-pdf / lens-pdf / compile-pdf / synergy / platform.",
|
|
5
|
+
"license": "AGPL-3.0-or-later",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/printwithsynergy/synergy-mcp.git"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"main": "dist/index.js",
|
|
12
|
+
"bin": {
|
|
13
|
+
"synergy-mcp": "dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"README.md",
|
|
18
|
+
"LICENSE",
|
|
19
|
+
"CLAUDE.md"
|
|
20
|
+
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc",
|
|
23
|
+
"typecheck": "tsc --noEmit",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest",
|
|
26
|
+
"lint": "biome check src",
|
|
27
|
+
"lint:fix": "biome check --write src",
|
|
28
|
+
"dev": "tsx src/index.ts",
|
|
29
|
+
"prepublishOnly": "pnpm build"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
33
|
+
"zod": "^3.23.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@biomejs/biome": "^1.9.0",
|
|
37
|
+
"@types/node": "^22.0.0",
|
|
38
|
+
"tsx": "^4.19.0",
|
|
39
|
+
"typescript": "^5.6.0",
|
|
40
|
+
"vite": "^6.4.2",
|
|
41
|
+
"vitest": "^4.1.0"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=20"
|
|
45
|
+
},
|
|
46
|
+
"pnpm": {
|
|
47
|
+
"overrides": {
|
|
48
|
+
"vite": "^6.4.2",
|
|
49
|
+
"esbuild": "^0.25.0"
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"packageManager": "pnpm@9.15.0"
|
|
53
|
+
}
|