@nyuchi/mzizi-mcp 0.9.1 → 0.10.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 (97) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +115 -85
  3. package/dist/access.d.ts +69 -0
  4. package/dist/access.d.ts.map +1 -0
  5. package/dist/access.js +72 -0
  6. package/dist/access.js.map +1 -0
  7. package/dist/auth/authkit-handler.d.ts +4 -3
  8. package/dist/auth/authkit-handler.d.ts.map +1 -1
  9. package/dist/auth/authkit-handler.js +52 -6
  10. package/dist/auth/authkit-handler.js.map +1 -1
  11. package/dist/auth/front.d.ts +17 -0
  12. package/dist/auth/front.d.ts.map +1 -0
  13. package/dist/auth/front.js +25 -0
  14. package/dist/auth/front.js.map +1 -0
  15. package/dist/auth/mcp-api-handler.d.ts +20 -7
  16. package/dist/auth/mcp-api-handler.d.ts.map +1 -1
  17. package/dist/auth/mcp-api-handler.js +43 -29
  18. package/dist/auth/mcp-api-handler.js.map +1 -1
  19. package/dist/desk-context.d.ts +33 -0
  20. package/dist/desk-context.d.ts.map +1 -0
  21. package/dist/desk-context.js +49 -0
  22. package/dist/desk-context.js.map +1 -0
  23. package/dist/docs-federation.d.ts +68 -0
  24. package/dist/docs-federation.d.ts.map +1 -0
  25. package/dist/docs-federation.js +282 -0
  26. package/dist/docs-federation.js.map +1 -0
  27. package/dist/env.d.ts +7 -8
  28. package/dist/env.d.ts.map +1 -1
  29. package/dist/env.js +5 -5
  30. package/dist/fundi-a2a.d.ts +1 -1
  31. package/dist/fundi-a2a.js +2 -2
  32. package/dist/fundi-a2a.js.map +1 -1
  33. package/dist/fundi-client.d.ts +24 -4
  34. package/dist/fundi-client.d.ts.map +1 -1
  35. package/dist/fundi-client.js +91 -4
  36. package/dist/fundi-client.js.map +1 -1
  37. package/dist/generated/registry-pin.d.ts +5 -0
  38. package/dist/generated/registry-pin.d.ts.map +1 -0
  39. package/dist/generated/registry-pin.js +3 -0
  40. package/dist/generated/registry-pin.js.map +1 -0
  41. package/dist/generated/registry.d.ts +23 -0
  42. package/dist/generated/registry.d.ts.map +1 -0
  43. package/dist/generated/registry.js +1204 -0
  44. package/dist/generated/registry.js.map +1 -0
  45. package/dist/generated/skills.d.ts +18 -0
  46. package/dist/generated/skills.d.ts.map +1 -0
  47. package/dist/generated/skills.js +67 -0
  48. package/dist/generated/skills.js.map +1 -0
  49. package/dist/http.d.ts +18 -9
  50. package/dist/http.d.ts.map +1 -1
  51. package/dist/http.js +16 -13
  52. package/dist/http.js.map +1 -1
  53. package/dist/issue-desk.d.ts +152 -0
  54. package/dist/issue-desk.d.ts.map +1 -0
  55. package/dist/issue-desk.js +392 -0
  56. package/dist/issue-desk.js.map +1 -0
  57. package/dist/issue-log.d.ts +80 -0
  58. package/dist/issue-log.d.ts.map +1 -0
  59. package/dist/issue-log.js +146 -0
  60. package/dist/issue-log.js.map +1 -0
  61. package/dist/issue-report.d.ts +138 -0
  62. package/dist/issue-report.d.ts.map +1 -0
  63. package/dist/issue-report.js +112 -0
  64. package/dist/issue-report.js.map +1 -0
  65. package/dist/rate-limit.d.ts +41 -0
  66. package/dist/rate-limit.d.ts.map +1 -0
  67. package/dist/rate-limit.js +58 -0
  68. package/dist/rate-limit.js.map +1 -0
  69. package/dist/registry.d.ts +126 -0
  70. package/dist/registry.d.ts.map +1 -0
  71. package/dist/registry.js +280 -0
  72. package/dist/registry.js.map +1 -0
  73. package/dist/server.d.ts +96 -22
  74. package/dist/server.d.ts.map +1 -1
  75. package/dist/server.js +76 -32
  76. package/dist/server.js.map +1 -1
  77. package/dist/stdio.d.ts +6 -13
  78. package/dist/stdio.d.ts.map +1 -1
  79. package/dist/stdio.js +6 -29
  80. package/dist/stdio.js.map +1 -1
  81. package/dist/tools.d.ts +45 -6
  82. package/dist/tools.d.ts.map +1 -1
  83. package/dist/tools.js +299 -82
  84. package/dist/tools.js.map +1 -1
  85. package/dist/worker.d.ts +26 -14
  86. package/dist/worker.d.ts.map +1 -1
  87. package/dist/worker.js +42 -14
  88. package/dist/worker.js.map +1 -1
  89. package/package.json +24 -19
  90. package/dist/api-client.d.ts +0 -101
  91. package/dist/api-client.d.ts.map +0 -1
  92. package/dist/api-client.js +0 -200
  93. package/dist/api-client.js.map +0 -1
  94. package/dist/defaults.d.ts +0 -29
  95. package/dist/defaults.d.ts.map +0 -1
  96. package/dist/defaults.js +0 -29
  97. package/dist/defaults.js.map +0 -1
package/dist/tools.js CHANGED
@@ -1,10 +1,13 @@
1
1
  /**
2
2
  * The Mzizi MCP tool surface — 10 tools, defined in code.
3
3
  *
4
- * Every one is backed by `mzizi.dev/api/v1` over HTTP. There is no Supabase client and
5
- * no `mcp_tool_registry` lookup: components are real files the Next.js app compiles and
6
- * serves, so the API is the single source of truth and this server is one of its
7
- * clients.
4
+ * Eight are free. `fundi` and `report_issue` act as a console user and need
5
+ * the WorkOS sign-in; `access.ts` says which is which and how to sign in.
6
+ *
7
+ * The registry tools answer from files bundled into this build (`registry.ts`,
8
+ * generated from mzizi-dev/mzizi-registry at the commit in `registry.pin.json`), and
9
+ * skills from the skill files in this repo. There is no database and no request-time
10
+ * registry API call. Docs are federated separately (`docs-federation.ts`).
8
11
  *
9
12
  * Defining the tools here rather than loading them from a table is the point. A
10
13
  * registry-driven surface changed what the server exposed whenever someone edited a
@@ -16,10 +19,13 @@
16
19
  * be checked mechanically rather than argued about.
17
20
  */
18
21
  import { z } from "zod";
22
+ import { bundledRegistry } from "./registry.js";
19
23
  import { dispatchFundiA2A, FUNDI_SUBMIT_TOOL, FUNDI_STATUS_TOOL, FUNDI_CANCEL_TOOL, } from "./fundi-a2a.js";
20
24
  import { jsonContent, toolError } from "./tool-result.js";
25
+ import { signInRequired } from "./access.js";
26
+ import { BUNDLED_SKILLS, SKILLS_VERSION } from "./generated/skills.js";
21
27
  export const TOOL_PREFIX = "mzizi_";
22
- /** Unwrap an API result into an MCP tool result, keeping the failure readable. */
28
+ /** Unwrap a registry result into an MCP tool result, keeping the failure readable. */
23
29
  function respond(result, wrapKey) {
24
30
  if (!result.ok)
25
31
  return toolError(result.message);
@@ -27,10 +33,14 @@ function respond(result, wrapKey) {
27
33
  }
28
34
  /**
29
35
  * Annotations are declared per tool, honestly. A read is read-only and idempotent; a
30
- * write is neither. `openWorldHint` is true throughout because every tool reaches an
31
- * external service.
36
+ * write is neither. The registry reads are closed-world — they answer from the bundle
37
+ * and reach nothing — while the writes (the issue desk, fundi) reach other services.
32
38
  */
33
- const READ = { readOnlyHint: true, idempotentHint: true, openWorldHint: true };
39
+ const READ = {
40
+ readOnlyHint: true,
41
+ idempotentHint: true,
42
+ openWorldHint: false,
43
+ };
34
44
  /**
35
45
  * Default rows per `list_components` call.
36
46
  *
@@ -80,14 +90,23 @@ export const TOOL_COVERAGE = {
80
90
  "resolve_primitive",
81
91
  "list_primitive_sources",
82
92
  ],
83
- list_components: ["list_components", "list_collections", "get_node_categories", "get_node_counts"],
93
+ list_components: [
94
+ "list_components",
95
+ "list_collections",
96
+ "get_node_categories",
97
+ "get_node_counts",
98
+ ],
84
99
  get_tokens: [
85
100
  "get_brand_tokens",
86
101
  "list_brand_token_categories",
87
102
  "get_token_counts",
88
103
  "list_ecosystem_brands",
89
104
  ],
90
- get_architecture: ["get_architecture", "get_node_detail", "get_node_documents"],
105
+ get_architecture: [
106
+ "get_architecture",
107
+ "get_node_detail",
108
+ "get_node_documents",
109
+ ],
91
110
  get_doctrine: [
92
111
  "get_ubuntu_pillars",
93
112
  "get_ubuntu_principles",
@@ -107,11 +126,20 @@ export const TOOL_COVERAGE = {
107
126
  "run_accessibility_audit",
108
127
  "get_accessibility_summary",
109
128
  ],
110
- report_issue: ["submit_component_feedback", "record_observability_event", "record_chaos_event"],
111
- fundi: ["fundi_status", "fundi_submit_test", "fundi_task_status", "fundi_cancel_task"],
129
+ report_issue: [
130
+ "submit_component_feedback",
131
+ "record_observability_event",
132
+ "record_chaos_event",
133
+ ],
134
+ fundi: [
135
+ "fundi_status",
136
+ "fundi_submit_test",
137
+ "fundi_task_status",
138
+ "fundi_cancel_task",
139
+ ],
112
140
  };
113
141
  export function registerMziziTools(server, opts) {
114
- const { api } = opts;
142
+ const reg = opts.registry ?? bundledRegistry;
115
143
  const registered = [];
116
144
  // Records the bare name and returns the prefixed one, so registerTool is called
117
145
  // directly and keeps its generic inference over the Zod input schema.
@@ -122,14 +150,16 @@ export function registerMziziTools(server, opts) {
122
150
  // 1 ─ search
123
151
  server.registerTool(note("search"), {
124
152
  title: "Search Mzizi",
125
- description: "Search across components, documentation and releases. Start here when you do not know the exact name of what you want.",
126
- inputSchema: { query: z.string().min(1).describe("Free-text search term.") },
153
+ description: "Search the registry by words: components, conventions, AI instruction sets and releases. Start here when you do not know the exact name of what you want. Documentation pages are searched by the docs_* tools.",
154
+ inputSchema: {
155
+ query: z.string().min(1).describe("Free-text search term."),
156
+ },
127
157
  annotations: READ,
128
- }, async ({ query }) => respond(await api.search(query), "results"));
158
+ }, async ({ query }) => respond((await reg()).search(query), "results"));
129
159
  // 2 ─ get_component — one read, everything
130
160
  server.registerTool(note("get_component"), {
131
161
  title: "Get a component",
132
- description: "Fetch one component in full: metadata, dependencies, registryDependencies, files[], install command, docs (use cases, variants, a11y) and version history. One read, everything.",
162
+ description: "Fetch one component in full: metadata, dependencies, registryDependencies, files[] with source inline, docs (use cases, variants, a11y) and version history (from the changelog). One read, everything. Former nyuchi-* names resolve to their mzizi-* successors.",
133
163
  inputSchema: {
134
164
  name: z.string().min(1).describe("Component name, e.g. 'button'."),
135
165
  include: z
@@ -139,14 +169,17 @@ export function registerMziziTools(server, opts) {
139
169
  },
140
170
  annotations: READ,
141
171
  }, async ({ name, include }) => {
142
- const base = await api.getComponent(name);
172
+ const r = await reg();
173
+ const base = r.getComponent(name);
143
174
  if (!base.ok)
144
175
  return toolError(base.message);
145
176
  const out = { component: base.data };
146
- // Each extra is a separate upstream call, so a failure there must not discard the
147
- // component the caller actually asked for -- it is reported alongside it.
177
+ // A failure in an extra section must not discard the component the caller
178
+ // actually asked for -- it is reported alongside it.
148
179
  for (const section of include ?? []) {
149
- const res = section === "docs" ? await api.getComponentDocs(name) : await api.getComponentVersions(name);
180
+ const res = section === "docs"
181
+ ? r.getComponentDocs(name)
182
+ : r.getComponentVersions(name);
150
183
  out[section] = res.ok ? res.data : { error: res.message };
151
184
  }
152
185
  return jsonContent(out);
@@ -161,7 +194,10 @@ export function registerMziziTools(server, opts) {
161
194
  inputSchema: {
162
195
  // No .max(): the node set is uncapped, and a Zod bound would reject a filter
163
196
  // before it reached the data, turning a new node into a schema error.
164
- node: NUM.int().positive().optional().describe("Filter by node number (uncapped)."),
197
+ node: NUM.int()
198
+ .positive()
199
+ .optional()
200
+ .describe("Filter by node number (uncapped)."),
165
201
  owner: z
166
202
  .string()
167
203
  .optional()
@@ -174,34 +210,29 @@ export function registerMziziTools(server, opts) {
174
210
  .string()
175
211
  .optional()
176
212
  .describe("Filter by registry type, e.g. registry:ui | registry:lib | registry:block."),
177
- limit: NUM.int().positive().optional().describe(`Rows per call (default ${LIST_DEFAULT_LIMIT}).`),
178
- offset: NUM.int().min(0).optional().describe("Rows to skip, for paging."),
213
+ limit: NUM.int()
214
+ .positive()
215
+ .optional()
216
+ .describe(`Rows per call (default ${LIST_DEFAULT_LIMIT}).`),
217
+ offset: NUM.int()
218
+ .min(0)
219
+ .optional()
220
+ .describe("Rows to skip, for paging."),
179
221
  },
180
222
  annotations: READ,
181
223
  }, async ({ node, owner, collection, type, limit, offset }) => {
182
- // Filtering and paging happen UPSTREAM. Doing it here is what was broken: the index
183
- // carried none of these fields, so every filter compared against `undefined` and
184
- // returned nothing — for every value, without ever saying so.
185
224
  const take = limit ?? LIST_DEFAULT_LIMIT;
186
225
  const skip = offset ?? 0;
187
- const res = await api.listComponents({ node, owner, collection, type, limit: take, offset: skip });
188
- if (!res.ok)
189
- return toolError(res.message);
226
+ const res = (await reg()).listComponents({
227
+ node,
228
+ owner,
229
+ collection,
230
+ type,
231
+ limit: take,
232
+ offset: skip,
233
+ });
190
234
  const payload = res.data;
191
235
  const rows = payload.items ?? [];
192
- // Refuse rather than mislead when the upstream is older than this tool.
193
- //
194
- // An API that does not know these params IGNORES them and returns the whole
195
- // registry. Paging that and labelling it `node=3` would hand back 400 unrelated
196
- // components as though they matched — a wrong answer dressed as a right one, which
197
- // is worse than the empty list this tool used to return. The `meta.filters` echo is
198
- // the upstream saying "I applied these"; no echo, no claim.
199
- const askedToFilter = node !== undefined || owner !== undefined || collection !== undefined || type !== undefined;
200
- if (askedToFilter && payload.meta?.filters === undefined) {
201
- return toolError("The Mzizi API did not confirm it applied the filter, so these results cannot be " +
202
- "trusted as filtered — it is serving a build older than this tool. Retry without " +
203
- "node/owner/collection/type, or use search.");
204
- }
205
236
  const total = payload.meta?.total ?? rows.length;
206
237
  const registryTotal = payload.meta?.registryTotal;
207
238
  // The lean row. `description` and `dependencies` are deliberately absent: with them
@@ -223,7 +254,10 @@ export function registerMziziTools(server, opts) {
223
254
  offset: skip,
224
255
  hasMore: returned < total,
225
256
  ...(returned < total
226
- ? { nextOffset: returned, hint: `Call again with offset=${returned}, or narrow with node/owner/collection.` }
257
+ ? {
258
+ nextOffset: returned,
259
+ hint: `Call again with offset=${returned}, or narrow with node/owner/collection.`,
260
+ }
227
261
  : {}),
228
262
  // Present so a caller can distinguish "your filter matched nothing" from "the
229
263
  // registry is empty" — the two look identical in an empty items array, and the
@@ -235,24 +269,98 @@ export function registerMziziTools(server, opts) {
235
269
  // 4 ─ get_tokens
236
270
  server.registerTool(note("get_tokens"), {
237
271
  title: "Get design tokens",
238
- description: "The Mzizi brand system: minerals, heritage tones, status colours, typography, spacing, radius and the ecosystem brands.",
272
+ description: "The Mzizi brand system: 21 colour families (7 minerals, 7 heritage, 7 experimental), semantic colours, typography, spacing, radii and the ecosystem brands. Ask for `colors` to get every colour family in one call.",
239
273
  inputSchema: {
240
274
  family: z
241
275
  .string()
242
276
  .optional()
243
- .describe("Narrow to one family, e.g. minerals | heritage | status | semantic | spacing | radius | type. Omit for everything."),
277
+ .describe("One of: colors (all 21 colour families at once), minerals, heritage, experimental, semantic, backgrounds, typography, spacing, radii, ecosystem, componentSpecs, accessibility, voiceAndTone, philosophy. Common aliases resolve (status/semanticColors, radius, type/fonts, exp). Omit for everything."),
244
278
  },
245
279
  annotations: READ,
246
280
  }, async ({ family }) => {
247
- const res = await api.getBrand();
248
- if (!res.ok)
249
- return toolError(res.message);
281
+ const res = (await reg()).getBrand();
250
282
  if (!family)
251
283
  return jsonContent(res.data);
252
284
  const brand = res.data;
253
- const key = Object.keys(brand).find((k) => k.toLowerCase().includes(family.toLowerCase()));
285
+ // The payload is JSON-LD, so it carries an envelope ($schema, @context,
286
+ // @type) and metadata (version, name, lastUpdated, homepage) alongside the
287
+ // token families. Those are not selectable families, and listing them as
288
+ // such was actively misleading: an agent that asked for a real family and
289
+ // missed was told "Available: $schema, @context, @type, version, name, …".
290
+ // `name` was also reachable by the old substring match, so `family:
291
+ // "name"` returned the brand's name instead of an error.
292
+ const ENVELOPE = new Set([
293
+ "$schema",
294
+ "@context",
295
+ "@type",
296
+ "version",
297
+ "name",
298
+ "lastUpdated",
299
+ "homepage",
300
+ ]);
301
+ const families = Object.keys(brand).filter((k) => !ENVELOPE.has(k));
302
+ // Every family name this tool has ever advertised resolves, plus the
303
+ // synonyms a model reaches for first. The previous resolver was a
304
+ // substring match over raw keys, so `heritage`, `status`, `radius` and
305
+ // `type` — four of the seven names in its own schema — simply errored.
306
+ const ALIASES = {
307
+ minerals: "minerals",
308
+ mineral: "minerals",
309
+ heritage: "heritage",
310
+ heritagecolors: "heritage",
311
+ heritagecolours: "heritage",
312
+ experimental: "experimental",
313
+ exp: "experimental",
314
+ semantic: "semanticColors",
315
+ semanticcolors: "semanticColors",
316
+ semanticcolours: "semanticColors",
317
+ status: "semanticColors",
318
+ background: "backgrounds",
319
+ backgrounds: "backgrounds",
320
+ type: "typography",
321
+ typography: "typography",
322
+ font: "typography",
323
+ fonts: "typography",
324
+ spacing: "spacing",
325
+ space: "spacing",
326
+ radius: "radii",
327
+ radii: "radii",
328
+ ecosystem: "ecosystem",
329
+ brands: "ecosystem",
330
+ componentspecs: "componentSpecs",
331
+ components: "componentSpecs",
332
+ accessibility: "accessibility",
333
+ a11y: "accessibility",
334
+ voiceandtone: "voiceAndTone",
335
+ voice: "voiceAndTone",
336
+ philosophy: "philosophy",
337
+ };
338
+ const asked = family.toLowerCase().replace(/[\s_-]/g, "");
339
+ // One call for the whole palette. An agent styling anything needs the
340
+ // colours and nothing else; making it guess three family names — or fetch
341
+ // the entire brand payload including philosophy prose — is the round-trip
342
+ // cost this shortcut removes.
343
+ if (asked === "colors" || asked === "colours" || asked === "palette") {
344
+ const colourFamilies = [
345
+ "minerals",
346
+ "heritage",
347
+ "experimental",
348
+ "semanticColors",
349
+ "backgrounds",
350
+ ];
351
+ const out = {};
352
+ for (const k of colourFamilies)
353
+ if (k in brand)
354
+ out[k] = brand[k];
355
+ return jsonContent(out);
356
+ }
357
+ const resolved = ALIASES[asked];
358
+ const key = resolved && resolved in brand
359
+ ? resolved
360
+ : families.find((k) => k.toLowerCase() === asked);
254
361
  if (!key) {
255
- return toolError(`No token family matching "${family}". Available: ${Object.keys(brand).join(", ")}.`);
362
+ return toolError(`No token family matching "${family}". Available: ${families.join(", ")}. ` +
363
+ `Use "colors" for every colour family at once.`);
256
364
  }
257
365
  return jsonContent({ [key]: brand[key] });
258
366
  });
@@ -261,35 +369,74 @@ export function registerMziziTools(server, opts) {
261
369
  title: "Get the architecture",
262
370
  description: "The Mzizi DNA double helix — nodes, rungs and strands — with live counts. Pass `node` for one node's covenant, stakeholder and implementation rules.",
263
371
  inputSchema: {
264
- node: NUM.int().positive().optional().describe("One node's detail (uncapped)."),
372
+ node: NUM.int()
373
+ .positive()
374
+ .optional()
375
+ .describe("One node's detail (uncapped)."),
265
376
  },
266
377
  annotations: READ,
267
- }, async ({ node }) => respond(node === undefined ? await api.getArchitecture() : await api.getNode(node)));
378
+ }, async ({ node }) => {
379
+ const r = await reg();
380
+ return respond(node === undefined ? r.getArchitecture() : r.getNode(node));
381
+ });
268
382
  // 6 ─ get_doctrine
269
383
  server.registerTool(note("get_doctrine"), {
270
384
  title: "Get doctrine",
271
- description: "How to build here: Ubuntu pillars and principles, bundu conventions, and the AI instruction sets.",
385
+ description: "How to build here: Ubuntu pillars and principles, mzizi conventions, and the AI instruction sets.",
272
386
  inputSchema: {
273
387
  topic: z
274
- .enum(["ubuntu-pillars", "ubuntu-principles", "ai-instructions"])
388
+ .enum(["ubuntu-pillars", "ubuntu-principles", "ai-instructions", "conventions"])
275
389
  .describe("Which doctrine to read."),
276
- name: z.string().optional().describe("For ai-instructions, the target to fetch."),
390
+ name: z
391
+ .string()
392
+ .optional()
393
+ .describe("For ai-instructions, the name or target to fetch; for conventions, the convention's name. Omit to list."),
277
394
  },
278
395
  annotations: READ,
279
396
  }, async ({ topic, name }) => {
397
+ const r = await reg();
280
398
  if (topic === "ubuntu-pillars")
281
- return respond(await api.getUbuntuPillars(), "pillars");
399
+ return respond(r.getUbuntuPillars(), "pillars");
282
400
  if (topic === "ubuntu-principles")
283
- return respond(await api.getUbuntuPrinciples(), "principles");
284
- return respond(name ? await api.getAiInstructions(name) : await api.listAiInstructions());
401
+ return respond(r.getUbuntuPrinciples(), "principles");
402
+ if (topic === "conventions")
403
+ return respond(name ? r.getConvention(name) : r.listConventions());
404
+ return respond(name ? r.getAiInstructions(name) : r.listAiInstructions());
285
405
  });
286
- // 7 ─ get_skills
406
+ // 7 ─ get_skills — served from the bundle this Worker ships with
287
407
  server.registerTool(note("get_skills"), {
288
408
  title: "Get agent skills",
289
- description: "List the published Mzizi agent skills, or fetch one in full. Skills are what an agent loads first.",
290
- inputSchema: { name: z.string().optional().describe("Skill name. Omit to list all.") },
409
+ description: "List the published Mzizi agent skills, or fetch one in full. Skills are what an agent loads first. Served from the skill files bundled into this server at build time, so they are exactly the text in mzizi-dev/agent-tools at the deployed commit.",
410
+ inputSchema: {
411
+ name: z.string().optional().describe("Skill name. Omit to list all."),
412
+ },
291
413
  annotations: READ,
292
- }, async ({ name }) => respond(name ? await api.getSkill(name) : await api.listSkills(), "skills"));
414
+ },
415
+ // No network call, and that is the point. This used to read
416
+ // mzizi.dev/api/v1/skills, which read a database row, which a script had to
417
+ // be remembered to sync from git. It was not, and the MCP served skills
418
+ // instructing agents to write into a database column that had been cleared.
419
+ // The Worker now answers from the bundle it was built with: one hop, and a
420
+ // merge is the only way the answer changes.
421
+ async ({ name }) => {
422
+ if (!name) {
423
+ // The list omits bodies — nine full skills is ~60 kB, and a client
424
+ // asking "what is available" is choosing, not reading.
425
+ return jsonContent({
426
+ version: SKILLS_VERSION,
427
+ skills: BUNDLED_SKILLS.map(({ name: n, description, source }) => ({
428
+ name: n,
429
+ description,
430
+ source,
431
+ })),
432
+ }, "skills");
433
+ }
434
+ const skill = BUNDLED_SKILLS.find((s) => s.name === name);
435
+ if (!skill) {
436
+ return toolError(`No skill named "${name}". Available: ${BUNDLED_SKILLS.map((s) => s.name).join(", ")}.`);
437
+ }
438
+ return jsonContent({ version: SKILLS_VERSION, ...skill }, "skills");
439
+ });
293
440
  // 8 ─ check_accessibility
294
441
  server.registerTool(note("check_accessibility"), {
295
442
  title: "Check accessibility",
@@ -327,49 +474,119 @@ export function registerMziziTools(server, opts) {
327
474
  foreground,
328
475
  background,
329
476
  contrastRatio: rounded,
330
- passes: { aaLarge: rounded >= 3, aa: rounded >= 4.5, aaa: rounded >= 7 },
477
+ passes: {
478
+ aaLarge: rounded >= 3,
479
+ aa: rounded >= 4.5,
480
+ aaa: rounded >= 7,
481
+ },
331
482
  // Mzizi's floor is AAA (7:1), stricter than WCAG AA -- say so rather than
332
483
  // letting a 4.5 look like a pass here.
333
484
  meetsMziziFloor: rounded >= 7,
334
485
  });
335
486
  });
336
- // 9 ─ report_issue — the public write sink
487
+ // 9 ─ report_issue — the write sink, backed by the per-user issue desk
337
488
  server.registerTool(note("report_issue"), {
338
489
  title: "Report an issue",
339
- description: "File component feedback, an observability event or a chaos event. Feeds the N9 fundi self-healing rung.",
490
+ description: "Report a problem with a component or the registry. It goes to your own issue desk — a Durable Object holding your reports — which reproduces it via fundi, drafts an issue body including what the reproduction actually returned, and logs it to fundi. fundi files the GitHub issue with its proposed fix in it and tracks that issue afterwards, so action 'get' shows where yours got to: filed, picked up, closed. Use 'list' to see your earlier reports and 'retry' to re-attempt one that drafted but could not be logged. Your history is included in each new issue, because a repeated complaint from one reporter is often one bug. Needs sign-in: the desk belongs to your Mzizi console user.",
340
491
  inputSchema: {
341
- kind: z.enum(["feedback", "observability", "chaos"]).describe("Which sink to write to."),
342
- component: z.string().optional().describe("Component the report concerns."),
343
- message: z.string().min(1).describe("What happened."),
492
+ action: z
493
+ .enum(["file", "list", "get", "retry"])
494
+ .default("file")
495
+ .describe("What to do. Defaults to filing a new report."),
496
+ kind: z
497
+ .enum(["feedback", "observability", "chaos"])
498
+ .optional()
499
+ .describe("Report kind. Required for action 'file'."),
500
+ component: z
501
+ .string()
502
+ .optional()
503
+ .describe("Component the report concerns."),
504
+ message: z
505
+ .string()
506
+ .optional()
507
+ .describe("What happened. Required for action 'file'."),
344
508
  severity: z.enum(["low", "medium", "high", "critical"]).optional(),
509
+ skill: z
510
+ .string()
511
+ .optional()
512
+ .describe("fundi skill to run for the reproduction. fundi never infers a skill from text, so omit this to let the report kind choose one."),
513
+ reportId: z
514
+ .string()
515
+ .optional()
516
+ .describe("Report id. Required for actions 'get' and 'retry'."),
517
+ limit: z.number().int().min(1).max(100).optional(),
345
518
  },
346
519
  annotations: WRITE,
347
- }, async ({ kind, component, message, severity }) => {
348
- // Deliberately not wired to a write endpoint yet: /api/v1 exposes no public write
349
- // route, and inventing one here would either fail opaquely or write somewhere
350
- // unreviewed. Refusing with the reason is honest; silently accepting is not.
351
- return toolError(`report_issue is declared but not yet wired: the Mzizi API exposes no public write endpoint for "${kind}". ` +
352
- `Report it at https://github.com/nyuchi/mzizi/issues for now.` +
353
- (component ? ` (component: ${component}${severity ? `, severity: ${severity}` : ""})` : "") +
354
- ` Message: ${message}`);
520
+ }, async (args) => {
521
+ const desk = opts.desk;
522
+ // An anonymous caller on the Worker: the desk exists, the user does not.
523
+ if (!desk && opts.anonymous)
524
+ return signInRequired("report_issue");
525
+ // The desk is per USER, so it needs an identity. The stdio bin and
526
+ // `wrangler dev` have neither a binding nor a signed-in user, and saying
527
+ // that plainly beats a null-object desk that accepts reports into nothing.
528
+ if (!desk) {
529
+ return toolError("The issue desk is not available on this server. It needs the ISSUE_DESK Durable Object binding and a signed-in user, which the deployed Worker at mcp.mzizi.dev has and the stdio bin does not. " +
530
+ "File it directly at https://github.com/mzizi-dev/mzizi-registry/issues.");
531
+ }
532
+ const action = args.action ?? "file";
533
+ if (action === "list") {
534
+ return jsonContent(await desk.list(args.limit ?? 20), "reports");
535
+ }
536
+ if (action === "get") {
537
+ if (!args.reportId)
538
+ return toolError("action 'get' needs a reportId.");
539
+ const report = await desk.get(args.reportId);
540
+ if (!report) {
541
+ return toolError(`No report ${args.reportId} on your desk. Use action 'list' to see the ids you own — a desk holds one person's reports, so an id from someone else's will not be found here.`);
542
+ }
543
+ return jsonContent(report, "report");
544
+ }
545
+ if (action === "retry") {
546
+ if (!args.reportId)
547
+ return toolError("action 'retry' needs a reportId.");
548
+ const report = await desk.retry(args.reportId);
549
+ if (!report)
550
+ return toolError(`No report ${args.reportId} on your desk.`);
551
+ return jsonContent(report, "report");
552
+ }
553
+ if (!args.kind || !args.message) {
554
+ return toolError("action 'file' needs both a kind and a message.");
555
+ }
556
+ return jsonContent(await desk.open({
557
+ kind: args.kind,
558
+ message: args.message,
559
+ component: args.component,
560
+ severity: args.severity,
561
+ skill: args.skill,
562
+ }), "report");
355
563
  });
356
- // 10 ─ fundi — only when this server is wired as a fundi caller
357
- if (opts.fundi) {
564
+ // 10 ─ fundi — only when this server can reach fundi. Listed to an anonymous
565
+ // caller too, so the refusal can say how to sign in.
566
+ if (opts.fundi || opts.anonymous?.fundi) {
358
567
  const f = opts.fundi;
359
568
  server.registerTool(note("fundi"), {
360
569
  title: "fundi",
361
- description: "Delegate a task to the fundi agent, or check on one. Submit-and-poll: `submit` returns a task id immediately and never waits for the run.",
570
+ description: "Delegate a task to the fundi agent, or check on one. Submit-and-poll: `submit` returns a task id immediately and never waits for the run. Needs sign-in: fundi runs as your Mzizi console user.",
362
571
  inputSchema: {
363
572
  action: z.enum(["submit", "task_status", "cancel"]),
364
573
  skill: z
365
574
  .enum(["security-scan", "chaos-run", "a11y-audit", "heal-issue"])
366
575
  .optional()
367
576
  .describe("Required for submit."),
368
- instruction: z.string().optional().describe("What fundi should do. Required for submit."),
369
- taskId: z.string().optional().describe("Required for task_status and cancel."),
577
+ instruction: z
578
+ .string()
579
+ .optional()
580
+ .describe("What fundi should do. Required for submit."),
581
+ taskId: z
582
+ .string()
583
+ .optional()
584
+ .describe("Required for task_status and cancel."),
370
585
  },
371
586
  annotations: { ...WRITE, destructiveHint: true },
372
587
  }, async ({ action, skill, instruction, taskId }) => {
588
+ if (!f)
589
+ return signInRequired("fundi");
373
590
  // Dispatch to the existing A2A layer rather than reimplementing it: it already
374
591
  // owns the transport, the submit-and-poll guarantee (exactly one round trip on
375
592
  // submit) and the entitlement refusals worded for a caller to act on.
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}