@unclick/mcp-server 0.3.10 → 0.3.12

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.
@@ -1,19 +1,15 @@
1
1
  /**
2
- * uxpass-tool - MCP handlers for UXPass (Chunk 1 stubs).
2
+ * uxpass-tool - MCP handlers for UXPass.
3
3
  *
4
- * UXPass is the UI/UX sister to TestPass. The full execution pipeline
5
- * (capture, hat panel, synthesiser, reports) ships in Chunks 2 to 4.
6
- * Chunk 1 wires the MCP surface so agents can discover the contract,
7
- * does a minimal pack YAML validity check, and persists registered packs
8
- * to a local file under packs/registered/ so the wiring is end-to-end
9
- * testable before the backend lands.
4
+ * UXPass is the UI/UX sister to TestPass. uxpass_run, uxpass_status, and
5
+ * the three uxpass_report_* tools call back into the UnClick Vercel API at
6
+ * /api/uxpass using the caller's UNCLICK_API_KEY as a Bearer token (same
7
+ * pattern as the testpass tool). The API resolves the key to a user id and
8
+ * persists run + finding rows under that user.
10
9
  *
11
- * Note on schema validation: the canonical zod schema for UXPass packs
12
- * lives in @unclick/uxpass and is unit-tested there. This MCP wrapper
13
- * cannot depend on the workspace package because mcp-server is published
14
- * standalone to npm. The check here is intentionally shallow (parse YAML,
15
- * confirm the required top-level keys exist). Full validation runs server
16
- * side when the UXPass API ships in a later chunk.
10
+ * uxpass_register_pack still validates and persists packs to a local file
11
+ * under packs/registered/. The full server-side packs table lands in a
12
+ * later chunk; until then the local persistence keeps the wiring testable.
17
13
  */
18
14
  export declare function uxpassRun(args: Record<string, unknown>): Promise<unknown>;
19
15
  export declare function uxpassStatus(args: Record<string, unknown>): Promise<unknown>;
@@ -1 +1 @@
1
- {"version":3,"file":"uxpass-tool.d.ts","sourceRoot":"","sources":["../src/uxpass-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAsCH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAoB/E;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAUlF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CActF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAetF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAapF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA4CxF"}
1
+ {"version":3,"file":"uxpass-tool.d.ts","sourceRoot":"","sources":["../src/uxpass-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAqEH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA8B/E;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAIlF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAetF;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAKtF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAQpF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA4CxF"}
@@ -1,25 +1,21 @@
1
1
  /**
2
- * uxpass-tool - MCP handlers for UXPass (Chunk 1 stubs).
2
+ * uxpass-tool - MCP handlers for UXPass.
3
3
  *
4
- * UXPass is the UI/UX sister to TestPass. The full execution pipeline
5
- * (capture, hat panel, synthesiser, reports) ships in Chunks 2 to 4.
6
- * Chunk 1 wires the MCP surface so agents can discover the contract,
7
- * does a minimal pack YAML validity check, and persists registered packs
8
- * to a local file under packs/registered/ so the wiring is end-to-end
9
- * testable before the backend lands.
4
+ * UXPass is the UI/UX sister to TestPass. uxpass_run, uxpass_status, and
5
+ * the three uxpass_report_* tools call back into the UnClick Vercel API at
6
+ * /api/uxpass using the caller's UNCLICK_API_KEY as a Bearer token (same
7
+ * pattern as the testpass tool). The API resolves the key to a user id and
8
+ * persists run + finding rows under that user.
10
9
  *
11
- * Note on schema validation: the canonical zod schema for UXPass packs
12
- * lives in @unclick/uxpass and is unit-tested there. This MCP wrapper
13
- * cannot depend on the workspace package because mcp-server is published
14
- * standalone to npm. The check here is intentionally shallow (parse YAML,
15
- * confirm the required top-level keys exist). Full validation runs server
16
- * side when the UXPass API ships in a later chunk.
10
+ * uxpass_register_pack still validates and persists packs to a local file
11
+ * under packs/registered/. The full server-side packs table lands in a
12
+ * later chunk; until then the local persistence keeps the wiring testable.
17
13
  */
18
14
  import * as fs from "node:fs";
19
15
  import * as path from "node:path";
20
16
  import * as crypto from "node:crypto";
21
17
  import yaml from "js-yaml";
22
- const STUB_NOTE = "UXPass run execution lands in Chunks 2 to 4. Chunk 1 wires the MCP surface and schema only.";
18
+ const API_BASE = (process.env.UNCLICK_API_URL ?? "https://unclick.world").replace(/\/$/, "");
23
19
  const PACKS_DIR = path.resolve(process.env.UXPASS_PACKS_DIR ??
24
20
  path.join(process.cwd(), "packages", "uxpass", "packs", "registered"));
25
21
  const REQUIRED_PACK_KEYS = [
@@ -32,6 +28,35 @@ const REQUIRED_PACK_KEYS = [
32
28
  "budgets",
33
29
  "remediation",
34
30
  ];
31
+ function getApiKey() {
32
+ const key = process.env.UNCLICK_API_KEY?.trim();
33
+ if (!key) {
34
+ throw new Error("UNCLICK_API_KEY env var is not set. Get your install config at https://unclick.world");
35
+ }
36
+ return key;
37
+ }
38
+ async function callApi(pathAndQuery, init = {}) {
39
+ const apiKey = getApiKey();
40
+ const res = await fetch(`${API_BASE}/api/uxpass${pathAndQuery}`, {
41
+ method: init.method ?? "GET",
42
+ headers: {
43
+ "Content-Type": "application/json",
44
+ Authorization: `Bearer ${apiKey}`,
45
+ },
46
+ body: init.body !== undefined ? JSON.stringify(init.body) : undefined,
47
+ });
48
+ const text = await res.text();
49
+ let body = text;
50
+ try {
51
+ body = text ? JSON.parse(text) : null;
52
+ }
53
+ catch {
54
+ /* keep text */
55
+ }
56
+ if (!res.ok)
57
+ return { error: `uxpass API failed (HTTP ${res.status})`, body };
58
+ return body;
59
+ }
35
60
  function ensurePacksDir() {
36
61
  try {
37
62
  fs.mkdirSync(PACKS_DIR, { recursive: true });
@@ -44,79 +69,75 @@ function safeFilename(name) {
44
69
  return name.replace(/[^a-zA-Z0-9._-]+/g, "-").slice(0, 120);
45
70
  }
46
71
  export async function uxpassRun(args) {
47
- const packName = typeof args.pack_name === "string" ? args.pack_name : undefined;
48
72
  const url = typeof args.url === "string" ? args.url : undefined;
49
- const hats = Array.isArray(args.hats)
50
- ? args.hats.filter((h) => typeof h === "string")
51
- : undefined;
52
- if (!packName && !url) {
53
- return { error: "Either pack_name or url is required" };
73
+ const packName = typeof args.pack_name === "string" ? args.pack_name : undefined;
74
+ if (!url && !packName) {
75
+ return { error: "Either url or pack_name is required" };
54
76
  }
55
- const runId = `uxpass_${crypto.randomBytes(8).toString("hex")}`;
56
- return {
57
- run_id: runId,
58
- status: "queued",
59
- pack_name: packName ?? null,
60
- url: url ?? null,
61
- hats: hats ?? null,
62
- note: STUB_NOTE,
63
- };
77
+ // pack_name still resolves locally because pack persistence is file-based
78
+ // until the server-side packs table lands. We resolve it to the pack's
79
+ // declared url and submit a run for that.
80
+ let targetUrl = url;
81
+ if (!targetUrl && packName) {
82
+ try {
83
+ ensurePacksDir();
84
+ const candidate = fs.readdirSync(PACKS_DIR).find((f) => f.startsWith(`${safeFilename(packName)}-`));
85
+ if (!candidate)
86
+ return { error: `No registered pack found for name '${packName}'` };
87
+ const packYaml = fs.readFileSync(path.join(PACKS_DIR, candidate), "utf8");
88
+ const parsed = yaml.load(packYaml);
89
+ if (!parsed?.url)
90
+ return { error: `Pack '${packName}' has no url field` };
91
+ targetUrl = parsed.url;
92
+ }
93
+ catch (err) {
94
+ return { error: `failed to read pack '${packName}': ${err.message}` };
95
+ }
96
+ }
97
+ return callApi("?action=start_run", {
98
+ method: "POST",
99
+ body: { target_url: targetUrl, pack_slug: "uxpass-core" },
100
+ });
64
101
  }
65
102
  export async function uxpassStatus(args) {
66
103
  const runId = typeof args.run_id === "string" ? args.run_id : "";
67
104
  if (!runId)
68
105
  return { error: "run_id is required" };
69
- return {
70
- run_id: runId,
71
- status: "queued",
72
- ux_score: null,
73
- summary: STUB_NOTE,
74
- };
106
+ return callApi(`?action=status&run_id=${encodeURIComponent(runId)}`);
75
107
  }
76
108
  export async function uxpassReportHtml(args) {
77
109
  const runId = typeof args.run_id === "string" ? args.run_id : "";
78
110
  if (!runId)
79
111
  return { error: "run_id is required" };
80
- const html = `<!doctype html>
81
- <html lang="en">
82
- <head><meta charset="utf-8"><title>UXPass Report ${runId}</title></head>
83
- <body>
84
- <h1>UXPass Report</h1>
85
- <p>Run id: <code>${runId}</code></p>
86
- <p>Run not yet implemented. ${STUB_NOTE}</p>
87
- </body>
88
- </html>`;
89
- return { run_id: runId, format: "html", body: html };
112
+ const apiKey = getApiKey();
113
+ const res = await fetch(`${API_BASE}/api/uxpass?action=report_html&run_id=${encodeURIComponent(runId)}`, { headers: { Authorization: `Bearer ${apiKey}` } });
114
+ const text = await res.text();
115
+ if (!res.ok) {
116
+ let body = text;
117
+ try {
118
+ body = text ? JSON.parse(text) : null;
119
+ }
120
+ catch { /* keep text */ }
121
+ return { error: `uxpass report_html failed (HTTP ${res.status})`, body };
122
+ }
123
+ return { run_id: runId, format: "html", body: text };
90
124
  }
91
125
  export async function uxpassReportJson(args) {
92
126
  const runId = typeof args.run_id === "string" ? args.run_id : "";
93
127
  if (!runId)
94
128
  return { error: "run_id is required" };
95
- return {
96
- run_id: runId,
97
- format: "json",
98
- body: {
99
- run_id: runId,
100
- status: "queued",
101
- ux_score: null,
102
- hat_verdicts: [],
103
- note: STUB_NOTE,
104
- },
105
- };
129
+ const data = await callApi(`?action=report_json&run_id=${encodeURIComponent(runId)}`);
130
+ return { run_id: runId, format: "json", body: data };
106
131
  }
107
132
  export async function uxpassReportMd(args) {
108
133
  const runId = typeof args.run_id === "string" ? args.run_id : "";
109
134
  if (!runId)
110
135
  return { error: "run_id is required" };
111
- const md = [
112
- `# UXPass Report ${runId}`,
113
- "",
114
- "Run not yet implemented.",
115
- "",
116
- STUB_NOTE,
117
- "",
118
- ].join("\n");
119
- return { run_id: runId, format: "md", body: md };
136
+ const data = await callApi(`?action=report_md&run_id=${encodeURIComponent(runId)}`);
137
+ if (data && typeof data === "object" && "markdown" in data) {
138
+ return { run_id: runId, format: "md", body: data.markdown };
139
+ }
140
+ return data;
120
141
  }
121
142
  export async function uxpassRegisterPack(args) {
122
143
  const packYaml = typeof args.pack_yaml === "string" ? args.pack_yaml : "";
@@ -159,7 +180,7 @@ export async function uxpassRegisterPack(args) {
159
180
  pack_id: packId,
160
181
  name,
161
182
  file: filePath,
162
- note: "Persisted to local file. Database-backed persistence and full schema validation land with the backend in a later chunk.",
183
+ note: "Persisted to local file. Database-backed pack persistence lands in a later chunk; uxpass_run currently resolves pack_name to its declared url and submits a deterministic run.",
163
184
  };
164
185
  }
165
186
  //# sourceMappingURL=uxpass-tool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"uxpass-tool.js","sourceRoot":"","sources":["../src/uxpass-tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"uxpass-tool.js","sourceRoot":"","sources":["../src/uxpass-tool.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unclick/mcp-server",
3
- "version": "0.3.10",
3
+ "version": "0.3.12",
4
4
  "mcpName": "io.github.malamutemayhem/unclick-mcp-server",
5
5
  "description": "MCP server for the UnClick tool marketplace — lets AI agents discover and use every UnClick tool",
6
6
  "type": "module",
@@ -22,7 +22,7 @@
22
22
  "build": "tsc",
23
23
  "dev": "tsx src/index.ts",
24
24
  "start": "node dist/index.js",
25
- "test": "tsx --test src/memory/__tests__/hybrid-search.test.ts src/memory/__tests__/bitemporal.test.ts && vitest run",
25
+ "test": "tsx --test src/memory/__tests__/hybrid-search.test.ts src/memory/__tests__/bitemporal.test.ts src/memory/__tests__/response-bounds.test.ts && vitest run",
26
26
  "prepublishOnly": "npm run build"
27
27
  },
28
28
  "dependencies": {