@nwire/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.
@@ -0,0 +1,89 @@
1
+ /**
2
+ * `@nwire/mcp` — Adapter shape for 0.10.
3
+ *
4
+ * import { mcpAdapter } from "@nwire/mcp";
5
+ *
6
+ * const mcp = mcpAdapter();
7
+ * await endpoint("svc", { port: 3000 })
8
+ * .use(httpKoa({ prefix: "/api" }))
9
+ * .use(mcp)
10
+ * .mount(app)
11
+ * .run();
12
+ *
13
+ * const tools = mcp.list(); // [{ name, description, input }]
14
+ * const result = await mcp.call("create-task", { title: "x" });
15
+ *
16
+ * Consumes wires whose `binding.$adapter === "mcp"` + `binding.kind === "tool"`.
17
+ * In-process introspection (`list`, `call`) makes the adapter testable without
18
+ * spinning up an MCP stdio server. The legacy `serveMcp(...)` stdio entry
19
+ * stays available via the package's main export.
20
+ */
21
+ import { dummyContainer } from "@nwire/container";
22
+ import { ConsoleLogger } from "@nwire/logger";
23
+ function isToolBinding(b) {
24
+ return (typeof b === "object" &&
25
+ b !== null &&
26
+ b.$adapter === "mcp" &&
27
+ b.kind === "tool" &&
28
+ typeof b.tool === "string");
29
+ }
30
+ export function mcpAdapter(config = {}) {
31
+ const logger = config.logger ?? new ConsoleLogger();
32
+ let tools = new Map();
33
+ let bootCtx;
34
+ return {
35
+ $kind: "adapter",
36
+ kind: "mcp",
37
+ list() {
38
+ return [...tools.values()].map(({ binding }) => ({
39
+ name: binding.tool,
40
+ description: binding.description,
41
+ inputSchema: binding.input,
42
+ }));
43
+ },
44
+ async call(toolName, input) {
45
+ const entry = tools.get(toolName);
46
+ if (!entry)
47
+ throw new Error(`unknown MCP tool: ${toolName}`);
48
+ if (!bootCtx)
49
+ throw new Error("mcpAdapter not booted");
50
+ const { wire, binding } = entry;
51
+ let parsedInput = input;
52
+ if (binding.input) {
53
+ parsedInput = binding.input.parse(input);
54
+ }
55
+ const parentContainer = bootCtx.containerOf(wire) ?? dummyContainer();
56
+ const reqContainer = parentContainer.createScope();
57
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
+ const wireApp = wire.app;
59
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
+ const runtimeExecute = wireApp?.runtime?.execute;
61
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
62
+ const hasRunMethod = typeof wire.handler?.run === "function";
63
+ if (runtimeExecute && hasRunMethod) {
64
+ return await runtimeExecute.call(wireApp.runtime, wire.handler, parsedInput, {});
65
+ }
66
+ const handlerCtx = {
67
+ resolve: (name) => reqContainer.resolve(name),
68
+ logger,
69
+ };
70
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
71
+ const fn = wire.handler.run ?? wire.handler;
72
+ return await fn(parsedInput, handlerCtx);
73
+ },
74
+ async boot(ctx) {
75
+ bootCtx = ctx;
76
+ tools = new Map();
77
+ for (const wire of ctx.wires) {
78
+ if (!isToolBinding(wire.binding))
79
+ continue;
80
+ tools.set(wire.binding.tool, { wire, binding: wire.binding });
81
+ }
82
+ ctx.addCheck({ name: "mcp", check: () => undefined });
83
+ },
84
+ async shutdown() {
85
+ tools = new Map();
86
+ bootCtx = undefined;
87
+ },
88
+ };
89
+ }
@@ -15,13 +15,19 @@
15
15
  * `tools/list`, but the call returns `isError: true` with an explicit
16
16
  * "endpoint not implemented on wire side" message rather than
17
17
  * synthesizing a fake response. The companion follow-up in
18
- * `@nwire/http` will mount the missing routes.
18
+ * `@nwire/koa` will mount the missing routes.
19
19
  *
20
20
  * These tools register alongside `inspectTools` and reuse the same URL
21
21
  * discovery cache (`discoverInspectUrl`). They do NOT modify the
22
22
  * existing read-only surface.
23
23
  */
24
24
  import { type InspectToolDef } from "./inspect.js";
25
+ /**
26
+ * Tools advertised in `tools/list`. We expose only the tools whose
27
+ * wire-side endpoints are mounted today. `run_command` and
28
+ * `replay_trace` keep their handler definitions above so they're easy
29
+ * to revive when `/_nwire/command` and `/_nwire/replay` land; they
30
+ * just don't appear in the advertised list until then.
31
+ */
25
32
  export declare const writeTools: readonly InspectToolDef[];
26
33
  export declare function findWriteTool(name: string): InspectToolDef | undefined;
27
- //# sourceMappingURL=write-tools.d.ts.map
@@ -15,7 +15,7 @@
15
15
  * `tools/list`, but the call returns `isError: true` with an explicit
16
16
  * "endpoint not implemented on wire side" message rather than
17
17
  * synthesizing a fake response. The companion follow-up in
18
- * `@nwire/http` will mount the missing routes.
18
+ * `@nwire/koa` will mount the missing routes.
19
19
  *
20
20
  * These tools register alongside `inspectTools` and reuse the same URL
21
21
  * discovery cache (`discoverInspectUrl`). They do NOT modify the
@@ -203,8 +203,16 @@ const replayTrace = {
203
203
  return body;
204
204
  },
205
205
  };
206
- export const writeTools = [dispatchAction, runCommand, replayTrace];
206
+ /**
207
+ * Tools advertised in `tools/list`. We expose only the tools whose
208
+ * wire-side endpoints are mounted today. `run_command` and
209
+ * `replay_trace` keep their handler definitions above so they're easy
210
+ * to revive when `/_nwire/command` and `/_nwire/replay` land; they
211
+ * just don't appear in the advertised list until then.
212
+ */
213
+ export const writeTools = [dispatchAction];
214
+ /** All write tools (advertised + gap-flagged) — used by `findWriteTool`. */
215
+ const allWriteTools = [dispatchAction, runCommand, replayTrace];
207
216
  export function findWriteTool(name) {
208
- return writeTools.find((t) => t.name === name);
217
+ return allWriteTools.find((t) => t.name === name);
209
218
  }
210
- //# sourceMappingURL=write-tools.js.map
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@nwire/mcp",
3
- "version": "0.9.1",
3
+ "version": "0.10.0",
4
4
  "private": false,
5
5
  "description": "Nwire MCP (Model Context Protocol) server — exposes the kernel's CommandRouter as MCP tools over stdio. AI clients (Claude, Cursor, …) drive nwire commands the same way the CLI and Studio do.",
6
6
  "license": "MIT",
7
7
  "files": [
8
8
  "dist",
9
- "src",
9
+ "README.md",
10
10
  "LICENSE"
11
11
  ],
12
12
  "type": "module",
@@ -22,7 +22,11 @@
22
22
  "access": "public"
23
23
  },
24
24
  "dependencies": {
25
- "@nwire/kernel": "0.9.1"
25
+ "@nwire/container": "0.10.0",
26
+ "@nwire/logger": "0.10.0",
27
+ "@nwire/endpoint": "0.10.0",
28
+ "@nwire/wires": "0.10.0",
29
+ "@nwire/supervisor": "0.10.0"
26
30
  },
27
31
  "devDependencies": {
28
32
  "@types/node": "^22.19.9",
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,EAAoC,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AAM9E,UAAU,cAAc;IACtB,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,UAAU,eAAe;IACvB,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACpE;AAED,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AASD,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,+DAA+D;IAC/D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC3E;AAoND,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC;AAErE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AACzF,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"inspect.d.ts","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAwBH,kEAAkE;AAClE,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAetE;AAoGD,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACnE;AA8BD,eAAO,MAAM,YAAY,EAAE,SAAS,cAAc,EAsHjD,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAExE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../src/inspect.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-tools.d.ts","sourceRoot":"","sources":["../src/write-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAsB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AA+MvE,eAAO,MAAM,UAAU,EAAE,SAAS,cAAc,EAA8C,CAAC;AAE/F,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAEtE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"write-tools.js","sourceRoot":"","sources":["../src/write-tools.ts"],"names":[],"mappings":"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"}
@@ -1,341 +0,0 @@
1
- /**
2
- * Inspect-tools tests — exercise the read-only MCP tools that proxy
3
- * `/_nwire/*` (or fall back to the on-disk `.nwire/` cache). We stand
4
- * up a tiny stub HTTP server on a free port, point the discovery layer
5
- * at it via `NWIRE_INSPECT_URL`, and drive the tools through the same
6
- * stdio harness the existing `mcp-io.test.ts` uses.
7
- *
8
- * For disk-fallback tools (`list_hooks`, `list_plugins` happy paths),
9
- * we mkdtemp a directory, write fixture JSON into `<tmp>/.nwire/`, and
10
- * chdir into it. The kernel and `serveMcp` see nothing different —
11
- * the inspect module reads `process.cwd()`.
12
- */
13
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
14
- import { PassThrough } from "node:stream";
15
- import { createServer, type Server } from "node:http";
16
- import { AddressInfo } from "node:net";
17
- import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from "node:fs";
18
- import { tmpdir } from "node:os";
19
- import { join } from "node:path";
20
- import { createKernel, type Kernel } from "@nwire/kernel";
21
- import { serveMcp } from "../index";
22
- import { resetInspectDiscoveryCache } from "../inspect";
23
-
24
- interface PendingResponse {
25
- resolve: (value: any) => void;
26
- }
27
-
28
- class StdioHarness {
29
- readonly stdin = new PassThrough();
30
- readonly stdout = new PassThrough();
31
- private buffer = "";
32
- private pending = new Map<string | number, PendingResponse>();
33
- readonly notifications: Array<{ method: string; params?: any }> = [];
34
- readonly served: Promise<void>;
35
- private id = 0;
36
-
37
- constructor(kernel: Kernel) {
38
- this.served = serveMcp({
39
- kernel,
40
- stdin: this.stdin,
41
- stdout: this.stdout,
42
- serverName: "nwire-test",
43
- serverVersion: "0.0.0-test",
44
- });
45
- this.stdout.setEncoding("utf8");
46
- this.stdout.on("data", (chunk: string) => {
47
- this.buffer += chunk;
48
- const lines = this.buffer.split("\n");
49
- this.buffer = lines.pop() ?? "";
50
- for (const line of lines) {
51
- if (!line.trim()) continue;
52
- const msg = JSON.parse(line) as { id?: string | number; method?: string };
53
- if (msg.id != null && this.pending.has(msg.id)) {
54
- this.pending.get(msg.id)!.resolve(msg);
55
- this.pending.delete(msg.id);
56
- } else if (msg.method) {
57
- this.notifications.push(msg as any);
58
- }
59
- }
60
- });
61
- }
62
-
63
- request(method: string, params?: Record<string, unknown>): Promise<any> {
64
- const id = ++this.id;
65
- const promise = new Promise<any>((resolve) => {
66
- this.pending.set(id, { resolve });
67
- });
68
- this.stdin.write(JSON.stringify({ jsonrpc: "2.0", id, method, params }) + "\n");
69
- return promise;
70
- }
71
-
72
- async close(): Promise<void> {
73
- this.stdin.end();
74
- await this.served;
75
- }
76
- }
77
-
78
- interface StubWire {
79
- readonly url: string;
80
- readonly server: Server;
81
- manifest: Record<string, unknown>;
82
- events: unknown[];
83
- telemetry: unknown[];
84
- requests: Array<{ method: string; url: string }>;
85
- }
86
-
87
- async function startStubWire(): Promise<StubWire> {
88
- const stub: StubWire = {
89
- url: "",
90
- server: null as unknown as Server,
91
- manifest: {},
92
- events: [],
93
- telemetry: [],
94
- requests: [],
95
- };
96
- const server = createServer((req, res) => {
97
- stub.requests.push({ method: req.method ?? "?", url: req.url ?? "" });
98
- const send = (body: unknown) => {
99
- res.statusCode = 200;
100
- res.setHeader("Content-Type", "application/json");
101
- res.end(JSON.stringify(body));
102
- };
103
- const url = req.url ?? "";
104
- if (url === "/_nwire/manifest") return send(stub.manifest);
105
- if (url.startsWith("/_nwire/events/recent")) return send(stub.events);
106
- if (url.startsWith("/_nwire/telemetry/recent")) return send(stub.telemetry);
107
- res.statusCode = 404;
108
- res.end(JSON.stringify({ error: "not found" }));
109
- });
110
- await new Promise<void>((r) => server.listen(0, "127.0.0.1", r));
111
- const port = (server.address() as AddressInfo).port;
112
- stub.server = server;
113
- (stub as { url: string }).url = `http://127.0.0.1:${port}`;
114
- return stub;
115
- }
116
-
117
- async function stopStubWire(stub: StubWire): Promise<void> {
118
- await new Promise<void>((r) => stub.server.close(() => r()));
119
- }
120
-
121
- function parseToolResult(res: any): unknown {
122
- expect(res.result.content).toHaveLength(1);
123
- expect(res.result.content[0].type).toBe("text");
124
- return JSON.parse(res.result.content[0].text);
125
- }
126
-
127
- describe("@nwire/mcp — inspect tools", () => {
128
- let kernel: Kernel;
129
- let harness: StdioHarness;
130
- let stub: StubWire | undefined;
131
- let tmpDir: string | undefined;
132
- let prevCwd: string | undefined;
133
- let prevInspectUrl: string | undefined;
134
-
135
- beforeEach(() => {
136
- kernel = createKernel();
137
- prevInspectUrl = process.env.NWIRE_INSPECT_URL;
138
- resetInspectDiscoveryCache();
139
- });
140
-
141
- afterEach(async () => {
142
- if (harness) await harness.close();
143
- if (stub) await stopStubWire(stub);
144
- stub = undefined;
145
- if (prevCwd) {
146
- process.chdir(prevCwd);
147
- prevCwd = undefined;
148
- }
149
- if (tmpDir) {
150
- rmSync(tmpDir, { recursive: true, force: true });
151
- tmpDir = undefined;
152
- }
153
- if (prevInspectUrl === undefined) delete process.env.NWIRE_INSPECT_URL;
154
- else process.env.NWIRE_INSPECT_URL = prevInspectUrl;
155
- resetInspectDiscoveryCache();
156
- });
157
-
158
- it("tools/list appends inspect tools to the kernel commands", async () => {
159
- kernel.router.register("dev", async () => "ok");
160
- harness = new StdioHarness(kernel);
161
-
162
- const res = await harness.request("tools/list", {});
163
- const names = (res.result.tools as Array<{ name: string }>).map((t) => t.name);
164
- expect(names).toContain("dev");
165
- expect(names).toContain("manifest");
166
- expect(names).toContain("list_actions");
167
- expect(names).toContain("list_events");
168
- expect(names).toContain("list_hooks");
169
- expect(names).toContain("list_plugins");
170
- expect(names).toContain("recent_events");
171
- expect(names).toContain("recent_telemetry");
172
- });
173
-
174
- it("manifest returns the live wire's manifest body", async () => {
175
- stub = await startStubWire();
176
- stub.manifest = {
177
- actions: [{ name: "a.do", module: "alpha" }],
178
- events: [],
179
- generatedAt: "now",
180
- };
181
- process.env.NWIRE_INSPECT_URL = stub.url;
182
- harness = new StdioHarness(kernel);
183
-
184
- const res = await harness.request("tools/call", { name: "manifest", arguments: {} });
185
- expect(res.result.isError).toBe(false);
186
- expect(parseToolResult(res)).toEqual(stub.manifest);
187
- expect(stub.requests.some((r) => r.url === "/_nwire/manifest")).toBe(true);
188
- });
189
-
190
- it("list_actions filters by module", async () => {
191
- stub = await startStubWire();
192
- stub.manifest = {
193
- actions: [
194
- { name: "submit", module: "submissions" },
195
- { name: "grade", module: "submissions" },
196
- { name: "enrol", module: "roster" },
197
- ],
198
- };
199
- process.env.NWIRE_INSPECT_URL = stub.url;
200
- harness = new StdioHarness(kernel);
201
-
202
- const unfiltered = await harness.request("tools/call", {
203
- name: "list_actions",
204
- arguments: {},
205
- });
206
- expect((parseToolResult(unfiltered) as unknown[]).length).toBe(3);
207
-
208
- const filtered = await harness.request("tools/call", {
209
- name: "list_actions",
210
- arguments: { module: "submissions" },
211
- });
212
- const actions = parseToolResult(filtered) as Array<{ name: string }>;
213
- expect(actions.map((a) => a.name)).toEqual(["submit", "grade"]);
214
- });
215
-
216
- it("list_events filters by module", async () => {
217
- stub = await startStubWire();
218
- stub.manifest = {
219
- events: [
220
- { name: "Submitted", module: "submissions" },
221
- { name: "Graded", module: "submissions" },
222
- { name: "Enrolled", module: "roster" },
223
- ],
224
- };
225
- process.env.NWIRE_INSPECT_URL = stub.url;
226
- harness = new StdioHarness(kernel);
227
-
228
- const res = await harness.request("tools/call", {
229
- name: "list_events",
230
- arguments: { module: "roster" },
231
- });
232
- const events = parseToolResult(res) as Array<{ name: string }>;
233
- expect(events).toHaveLength(1);
234
- expect(events[0]!.name).toBe("Enrolled");
235
- });
236
-
237
- it("list_hooks reads .nwire/hooks.json from disk", async () => {
238
- tmpDir = mkdtempSync(join(tmpdir(), "nwire-mcp-hooks-"));
239
- prevCwd = process.cwd();
240
- mkdirSync(join(tmpDir, ".nwire"), { recursive: true });
241
- const hooks = [{ name: "tracing", phase: "before" }];
242
- writeFileSync(join(tmpDir, ".nwire", "hooks.json"), JSON.stringify(hooks));
243
- process.chdir(tmpDir);
244
- // No live wire — clear inspect URL so discovery falls through.
245
- delete process.env.NWIRE_INSPECT_URL;
246
- resetInspectDiscoveryCache();
247
- harness = new StdioHarness(kernel);
248
-
249
- const res = await harness.request("tools/call", { name: "list_hooks", arguments: {} });
250
- expect(res.result.isError).toBe(false);
251
- expect(parseToolResult(res)).toEqual(hooks);
252
- });
253
-
254
- it("list_plugins reads .nwire/plugins.json from disk and supports kind filter", async () => {
255
- tmpDir = mkdtempSync(join(tmpdir(), "nwire-mcp-plugins-"));
256
- prevCwd = process.cwd();
257
- mkdirSync(join(tmpDir, ".nwire"), { recursive: true });
258
- const plugins = [
259
- { name: "rbac", kind: "plugin" },
260
- { name: "identity", kind: "plugin" },
261
- { name: "submissions", kind: "module" },
262
- ];
263
- writeFileSync(join(tmpDir, ".nwire", "plugins.json"), JSON.stringify(plugins));
264
- process.chdir(tmpDir);
265
- delete process.env.NWIRE_INSPECT_URL;
266
- resetInspectDiscoveryCache();
267
- harness = new StdioHarness(kernel);
268
-
269
- const all = await harness.request("tools/call", {
270
- name: "list_plugins",
271
- arguments: {},
272
- });
273
- expect((parseToolResult(all) as unknown[]).length).toBe(3);
274
-
275
- const onlyPlugins = await harness.request("tools/call", {
276
- name: "list_plugins",
277
- arguments: { kind: "plugin" },
278
- });
279
- expect((parseToolResult(onlyPlugins) as Array<{ name: string }>).map((p) => p.name)).toEqual([
280
- "rbac",
281
- "identity",
282
- ]);
283
- });
284
-
285
- it("recent_events passes the limit param through to the wire", async () => {
286
- stub = await startStubWire();
287
- stub.events = [
288
- { name: "Submitted", t: 1 },
289
- { name: "Graded", t: 2 },
290
- ];
291
- process.env.NWIRE_INSPECT_URL = stub.url;
292
- harness = new StdioHarness(kernel);
293
-
294
- const res = await harness.request("tools/call", {
295
- name: "recent_events",
296
- arguments: { limit: 42 },
297
- });
298
- expect(res.result.isError).toBe(false);
299
- expect(parseToolResult(res)).toEqual(stub.events);
300
- const eventsHit = stub.requests.find((r) => r.url.startsWith("/_nwire/events/recent"));
301
- expect(eventsHit?.url).toContain("limit=42");
302
- });
303
-
304
- it("recent_telemetry defaults to limit=100 when omitted", async () => {
305
- stub = await startStubWire();
306
- stub.telemetry = [{ kind: "event", at: "now" }];
307
- process.env.NWIRE_INSPECT_URL = stub.url;
308
- harness = new StdioHarness(kernel);
309
-
310
- const res = await harness.request("tools/call", {
311
- name: "recent_telemetry",
312
- arguments: {},
313
- });
314
- expect(res.result.isError).toBe(false);
315
- expect(parseToolResult(res)).toEqual(stub.telemetry);
316
- const hit = stub.requests.find((r) => r.url.startsWith("/_nwire/telemetry/recent"));
317
- expect(hit?.url).toContain("limit=100");
318
- });
319
-
320
- it("manifest gracefully fails when no wire and no cache are available", async () => {
321
- // Point at an empty tmp dir with no .nwire/ AND no live wire URL.
322
- tmpDir = mkdtempSync(join(tmpdir(), "nwire-mcp-empty-"));
323
- prevCwd = process.cwd();
324
- process.chdir(tmpDir);
325
- // Force discovery to find nothing: set a deliberately-empty probe list
326
- // AND clear the inspect URL.
327
- delete process.env.NWIRE_INSPECT_URL;
328
- const prevProbe = process.env.NWIRE_PROBE_PORTS;
329
- process.env.NWIRE_PROBE_PORTS = "1"; // port 1 is reliably closed
330
- resetInspectDiscoveryCache();
331
- try {
332
- harness = new StdioHarness(kernel);
333
- const res = await harness.request("tools/call", { name: "manifest", arguments: {} });
334
- expect(res.result.isError).toBe(true);
335
- expect(res.result.content[0].text).toMatch(/no running wire/);
336
- } finally {
337
- if (prevProbe === undefined) delete process.env.NWIRE_PROBE_PORTS;
338
- else process.env.NWIRE_PROBE_PORTS = prevProbe;
339
- }
340
- });
341
- });