@nyuchi/mzizi-mcp 0.9.0 → 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 +313 -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
  *
@@ -48,6 +58,20 @@ const READ = { readOnlyHint: true, idempotentHint: true, openWorldHint: true };
48
58
  * are always reported, so nothing is hidden and nothing is silently truncated.
49
59
  */
50
60
  const LIST_DEFAULT_LIMIT = 400;
61
+ /**
62
+ * A number argument that also accepts the string form of itself.
63
+ *
64
+ * MCP arguments arrive as JSON, but clients are not consistent about typing them: the same
65
+ * client that sent `node: 2` as a number sent `limit: 3` as `"3"`, and a bare `z.number()`
66
+ * rejected the whole call with a schema error before it reached the tool. From the agent's
67
+ * side that is indistinguishable from the filter being unsupported — the failure mode this
68
+ * tool has just been fixed for.
69
+ *
70
+ * Coercion is safe here because every one of these is `.int()`-bounded afterwards, so
71
+ * "abc" still fails and "3" resolves to 3. Being strict about a wire-format detail the
72
+ * caller does not control buys nothing.
73
+ */
74
+ const NUM = z.coerce.number();
51
75
  const WRITE = {
52
76
  readOnlyHint: false,
53
77
  destructiveHint: false,
@@ -66,14 +90,23 @@ export const TOOL_COVERAGE = {
66
90
  "resolve_primitive",
67
91
  "list_primitive_sources",
68
92
  ],
69
- 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
+ ],
70
99
  get_tokens: [
71
100
  "get_brand_tokens",
72
101
  "list_brand_token_categories",
73
102
  "get_token_counts",
74
103
  "list_ecosystem_brands",
75
104
  ],
76
- 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
+ ],
77
110
  get_doctrine: [
78
111
  "get_ubuntu_pillars",
79
112
  "get_ubuntu_principles",
@@ -93,11 +126,20 @@ export const TOOL_COVERAGE = {
93
126
  "run_accessibility_audit",
94
127
  "get_accessibility_summary",
95
128
  ],
96
- report_issue: ["submit_component_feedback", "record_observability_event", "record_chaos_event"],
97
- 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
+ ],
98
140
  };
99
141
  export function registerMziziTools(server, opts) {
100
- const { api } = opts;
142
+ const reg = opts.registry ?? bundledRegistry;
101
143
  const registered = [];
102
144
  // Records the bare name and returns the prefixed one, so registerTool is called
103
145
  // directly and keeps its generic inference over the Zod input schema.
@@ -108,14 +150,16 @@ export function registerMziziTools(server, opts) {
108
150
  // 1 ─ search
109
151
  server.registerTool(note("search"), {
110
152
  title: "Search Mzizi",
111
- description: "Search across components, documentation and releases. Start here when you do not know the exact name of what you want.",
112
- 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
+ },
113
157
  annotations: READ,
114
- }, async ({ query }) => respond(await api.search(query), "results"));
158
+ }, async ({ query }) => respond((await reg()).search(query), "results"));
115
159
  // 2 ─ get_component — one read, everything
116
160
  server.registerTool(note("get_component"), {
117
161
  title: "Get a component",
118
- 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.",
119
163
  inputSchema: {
120
164
  name: z.string().min(1).describe("Component name, e.g. 'button'."),
121
165
  include: z
@@ -125,14 +169,17 @@ export function registerMziziTools(server, opts) {
125
169
  },
126
170
  annotations: READ,
127
171
  }, async ({ name, include }) => {
128
- const base = await api.getComponent(name);
172
+ const r = await reg();
173
+ const base = r.getComponent(name);
129
174
  if (!base.ok)
130
175
  return toolError(base.message);
131
176
  const out = { component: base.data };
132
- // Each extra is a separate upstream call, so a failure there must not discard the
133
- // 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.
134
179
  for (const section of include ?? []) {
135
- 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);
136
183
  out[section] = res.ok ? res.data : { error: res.message };
137
184
  }
138
185
  return jsonContent(out);
@@ -147,7 +194,10 @@ export function registerMziziTools(server, opts) {
147
194
  inputSchema: {
148
195
  // No .max(): the node set is uncapped, and a Zod bound would reject a filter
149
196
  // before it reached the data, turning a new node into a schema error.
150
- node: z.number().int().positive().optional().describe("Filter by node number (uncapped)."),
197
+ node: NUM.int()
198
+ .positive()
199
+ .optional()
200
+ .describe("Filter by node number (uncapped)."),
151
201
  owner: z
152
202
  .string()
153
203
  .optional()
@@ -160,34 +210,29 @@ export function registerMziziTools(server, opts) {
160
210
  .string()
161
211
  .optional()
162
212
  .describe("Filter by registry type, e.g. registry:ui | registry:lib | registry:block."),
163
- limit: z.number().int().positive().optional().describe(`Rows per call (default ${LIST_DEFAULT_LIMIT}).`),
164
- offset: z.number().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."),
165
221
  },
166
222
  annotations: READ,
167
223
  }, async ({ node, owner, collection, type, limit, offset }) => {
168
- // Filtering and paging happen UPSTREAM. Doing it here is what was broken: the index
169
- // carried none of these fields, so every filter compared against `undefined` and
170
- // returned nothing — for every value, without ever saying so.
171
224
  const take = limit ?? LIST_DEFAULT_LIMIT;
172
225
  const skip = offset ?? 0;
173
- const res = await api.listComponents({ node, owner, collection, type, limit: take, offset: skip });
174
- if (!res.ok)
175
- 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
+ });
176
234
  const payload = res.data;
177
235
  const rows = payload.items ?? [];
178
- // Refuse rather than mislead when the upstream is older than this tool.
179
- //
180
- // An API that does not know these params IGNORES them and returns the whole
181
- // registry. Paging that and labelling it `node=3` would hand back 400 unrelated
182
- // components as though they matched — a wrong answer dressed as a right one, which
183
- // is worse than the empty list this tool used to return. The `meta.filters` echo is
184
- // the upstream saying "I applied these"; no echo, no claim.
185
- const askedToFilter = node !== undefined || owner !== undefined || collection !== undefined || type !== undefined;
186
- if (askedToFilter && payload.meta?.filters === undefined) {
187
- return toolError("The Mzizi API did not confirm it applied the filter, so these results cannot be " +
188
- "trusted as filtered — it is serving a build older than this tool. Retry without " +
189
- "node/owner/collection/type, or use search.");
190
- }
191
236
  const total = payload.meta?.total ?? rows.length;
192
237
  const registryTotal = payload.meta?.registryTotal;
193
238
  // The lean row. `description` and `dependencies` are deliberately absent: with them
@@ -209,7 +254,10 @@ export function registerMziziTools(server, opts) {
209
254
  offset: skip,
210
255
  hasMore: returned < total,
211
256
  ...(returned < total
212
- ? { 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
+ }
213
261
  : {}),
214
262
  // Present so a caller can distinguish "your filter matched nothing" from "the
215
263
  // registry is empty" — the two look identical in an empty items array, and the
@@ -221,24 +269,98 @@ export function registerMziziTools(server, opts) {
221
269
  // 4 ─ get_tokens
222
270
  server.registerTool(note("get_tokens"), {
223
271
  title: "Get design tokens",
224
- 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.",
225
273
  inputSchema: {
226
274
  family: z
227
275
  .string()
228
276
  .optional()
229
- .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."),
230
278
  },
231
279
  annotations: READ,
232
280
  }, async ({ family }) => {
233
- const res = await api.getBrand();
234
- if (!res.ok)
235
- return toolError(res.message);
281
+ const res = (await reg()).getBrand();
236
282
  if (!family)
237
283
  return jsonContent(res.data);
238
284
  const brand = res.data;
239
- 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);
240
361
  if (!key) {
241
- 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.`);
242
364
  }
243
365
  return jsonContent({ [key]: brand[key] });
244
366
  });
@@ -247,35 +369,74 @@ export function registerMziziTools(server, opts) {
247
369
  title: "Get the architecture",
248
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.",
249
371
  inputSchema: {
250
- node: z.number().int().positive().optional().describe("One node's detail (uncapped)."),
372
+ node: NUM.int()
373
+ .positive()
374
+ .optional()
375
+ .describe("One node's detail (uncapped)."),
251
376
  },
252
377
  annotations: READ,
253
- }, 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
+ });
254
382
  // 6 ─ get_doctrine
255
383
  server.registerTool(note("get_doctrine"), {
256
384
  title: "Get doctrine",
257
- 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.",
258
386
  inputSchema: {
259
387
  topic: z
260
- .enum(["ubuntu-pillars", "ubuntu-principles", "ai-instructions"])
388
+ .enum(["ubuntu-pillars", "ubuntu-principles", "ai-instructions", "conventions"])
261
389
  .describe("Which doctrine to read."),
262
- 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."),
263
394
  },
264
395
  annotations: READ,
265
396
  }, async ({ topic, name }) => {
397
+ const r = await reg();
266
398
  if (topic === "ubuntu-pillars")
267
- return respond(await api.getUbuntuPillars(), "pillars");
399
+ return respond(r.getUbuntuPillars(), "pillars");
268
400
  if (topic === "ubuntu-principles")
269
- return respond(await api.getUbuntuPrinciples(), "principles");
270
- 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());
271
405
  });
272
- // 7 ─ get_skills
406
+ // 7 ─ get_skills — served from the bundle this Worker ships with
273
407
  server.registerTool(note("get_skills"), {
274
408
  title: "Get agent skills",
275
- description: "List the published Mzizi agent skills, or fetch one in full. Skills are what an agent loads first.",
276
- 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
+ },
277
413
  annotations: READ,
278
- }, 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
+ });
279
440
  // 8 ─ check_accessibility
280
441
  server.registerTool(note("check_accessibility"), {
281
442
  title: "Check accessibility",
@@ -313,49 +474,119 @@ export function registerMziziTools(server, opts) {
313
474
  foreground,
314
475
  background,
315
476
  contrastRatio: rounded,
316
- 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
+ },
317
482
  // Mzizi's floor is AAA (7:1), stricter than WCAG AA -- say so rather than
318
483
  // letting a 4.5 look like a pass here.
319
484
  meetsMziziFloor: rounded >= 7,
320
485
  });
321
486
  });
322
- // 9 ─ report_issue — the public write sink
487
+ // 9 ─ report_issue — the write sink, backed by the per-user issue desk
323
488
  server.registerTool(note("report_issue"), {
324
489
  title: "Report an issue",
325
- 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.",
326
491
  inputSchema: {
327
- kind: z.enum(["feedback", "observability", "chaos"]).describe("Which sink to write to."),
328
- component: z.string().optional().describe("Component the report concerns."),
329
- 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'."),
330
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(),
331
518
  },
332
519
  annotations: WRITE,
333
- }, async ({ kind, component, message, severity }) => {
334
- // Deliberately not wired to a write endpoint yet: /api/v1 exposes no public write
335
- // route, and inventing one here would either fail opaquely or write somewhere
336
- // unreviewed. Refusing with the reason is honest; silently accepting is not.
337
- return toolError(`report_issue is declared but not yet wired: the Mzizi API exposes no public write endpoint for "${kind}". ` +
338
- `Report it at https://github.com/nyuchi/mzizi/issues for now.` +
339
- (component ? ` (component: ${component}${severity ? `, severity: ${severity}` : ""})` : "") +
340
- ` 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");
341
563
  });
342
- // 10 ─ fundi — only when this server is wired as a fundi caller
343
- 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) {
344
567
  const f = opts.fundi;
345
568
  server.registerTool(note("fundi"), {
346
569
  title: "fundi",
347
- 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.",
348
571
  inputSchema: {
349
572
  action: z.enum(["submit", "task_status", "cancel"]),
350
573
  skill: z
351
574
  .enum(["security-scan", "chaos-run", "a11y-audit", "heal-issue"])
352
575
  .optional()
353
576
  .describe("Required for submit."),
354
- instruction: z.string().optional().describe("What fundi should do. Required for submit."),
355
- 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."),
356
585
  },
357
586
  annotations: { ...WRITE, destructiveHint: true },
358
587
  }, async ({ action, skill, instruction, taskId }) => {
588
+ if (!f)
589
+ return signInRequired("fundi");
359
590
  // Dispatch to the existing A2A layer rather than reimplementing it: it already
360
591
  // owns the transport, the submit-and-poll guarantee (exactly one round trip on
361
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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"}