@dahch/muninn 0.0.0-stage → 0.2.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 (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +395 -2
  3. package/dist/cli.d.ts +23 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +186 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/check.d.ts +3 -0
  8. package/dist/commands/check.d.ts.map +1 -0
  9. package/dist/commands/check.js +56 -0
  10. package/dist/commands/check.js.map +1 -0
  11. package/dist/commands/memory.d.ts +6 -0
  12. package/dist/commands/memory.d.ts.map +1 -0
  13. package/dist/commands/memory.js +374 -0
  14. package/dist/commands/memory.js.map +1 -0
  15. package/dist/commands/setup.d.ts +3 -0
  16. package/dist/commands/setup.d.ts.map +1 -0
  17. package/dist/commands/setup.js +397 -0
  18. package/dist/commands/setup.js.map +1 -0
  19. package/dist/contracts/compiler.d.ts +71 -0
  20. package/dist/contracts/compiler.d.ts.map +1 -0
  21. package/dist/contracts/compiler.js +362 -0
  22. package/dist/contracts/compiler.js.map +1 -0
  23. package/dist/contracts/index.d.ts +2 -0
  24. package/dist/contracts/index.d.ts.map +1 -0
  25. package/dist/contracts/index.js +2 -0
  26. package/dist/contracts/index.js.map +1 -0
  27. package/dist/db/client.d.ts +100 -0
  28. package/dist/db/client.d.ts.map +1 -0
  29. package/dist/db/client.js +318 -0
  30. package/dist/db/client.js.map +1 -0
  31. package/dist/db/schema.sql +99 -0
  32. package/dist/index.d.ts +23 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +23 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/indexer/ast-indexer.d.ts +55 -0
  37. package/dist/indexer/ast-indexer.d.ts.map +1 -0
  38. package/dist/indexer/ast-indexer.js +445 -0
  39. package/dist/indexer/ast-indexer.js.map +1 -0
  40. package/dist/indexer/index.d.ts +2 -0
  41. package/dist/indexer/index.d.ts.map +1 -0
  42. package/dist/indexer/index.js +2 -0
  43. package/dist/indexer/index.js.map +1 -0
  44. package/dist/mcp/index.d.ts +2 -0
  45. package/dist/mcp/index.d.ts.map +1 -0
  46. package/dist/mcp/index.js +2 -0
  47. package/dist/mcp/index.js.map +1 -0
  48. package/dist/mcp/server.d.ts +254 -0
  49. package/dist/mcp/server.d.ts.map +1 -0
  50. package/dist/mcp/server.js +636 -0
  51. package/dist/mcp/server.js.map +1 -0
  52. package/dist/service/index.d.ts +2 -0
  53. package/dist/service/index.d.ts.map +1 -0
  54. package/dist/service/index.js +2 -0
  55. package/dist/service/index.js.map +1 -0
  56. package/dist/service/memory-service.d.ts +320 -0
  57. package/dist/service/memory-service.d.ts.map +1 -0
  58. package/dist/service/memory-service.js +1511 -0
  59. package/dist/service/memory-service.js.map +1 -0
  60. package/dist/setup/index.d.ts +6 -0
  61. package/dist/setup/index.d.ts.map +1 -0
  62. package/dist/setup/index.js +6 -0
  63. package/dist/setup/index.js.map +1 -0
  64. package/dist/setup/json-target.d.ts +30 -0
  65. package/dist/setup/json-target.d.ts.map +1 -0
  66. package/dist/setup/json-target.js +263 -0
  67. package/dist/setup/json-target.js.map +1 -0
  68. package/dist/setup/portable.d.ts +56 -0
  69. package/dist/setup/portable.d.ts.map +1 -0
  70. package/dist/setup/portable.js +365 -0
  71. package/dist/setup/portable.js.map +1 -0
  72. package/dist/setup/registry.d.ts +54 -0
  73. package/dist/setup/registry.d.ts.map +1 -0
  74. package/dist/setup/registry.js +225 -0
  75. package/dist/setup/registry.js.map +1 -0
  76. package/dist/setup/rules-target.d.ts +31 -0
  77. package/dist/setup/rules-target.d.ts.map +1 -0
  78. package/dist/setup/rules-target.js +270 -0
  79. package/dist/setup/rules-target.js.map +1 -0
  80. package/dist/setup/toml-target.d.ts +62 -0
  81. package/dist/setup/toml-target.d.ts.map +1 -0
  82. package/dist/setup/toml-target.js +869 -0
  83. package/dist/setup/toml-target.js.map +1 -0
  84. package/dist/util/path-safety.d.ts +94 -0
  85. package/dist/util/path-safety.d.ts.map +1 -0
  86. package/dist/util/path-safety.js +162 -0
  87. package/dist/util/path-safety.js.map +1 -0
  88. package/dist/util/text.d.ts +9 -0
  89. package/dist/util/text.d.ts.map +1 -0
  90. package/dist/util/text.js +19 -0
  91. package/dist/util/text.js.map +1 -0
  92. package/package.json +87 -4
@@ -0,0 +1,636 @@
1
+ import path from "node:path";
2
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
5
+ import { z } from "zod";
6
+ import { sanitizeTerminalText } from "../util/text.js";
7
+ import { MemoryService, VALID_CATEGORIES, MAX_SESSION_BRIEF_BUDGET, readSessionBrief, } from "../service/index.js";
8
+ import { verifyTypeScriptContracts } from "../contracts/compiler.js";
9
+ /**
10
+ * Zod schema for symbol / entity objects.
11
+ */
12
+ export const SymbolSchema = z
13
+ .object({
14
+ name: z.string().trim().nullish(),
15
+ filePath: z.string().trim().nullish(),
16
+ file_path: z.string().trim().nullish(),
17
+ identifier: z.string().trim().nullish(),
18
+ type: z
19
+ .enum(["file", "function", "class", "interface", "module"])
20
+ .nullish(),
21
+ entity_type: z
22
+ .enum(["file", "function", "class", "interface", "module"])
23
+ .nullish(),
24
+ id: z.string().trim().nullish(),
25
+ })
26
+ .passthrough()
27
+ .refine((s) => Boolean(s.name || s.identifier || s.filePath || s.file_path), {
28
+ message: "Symbol must provide at least one of name, identifier, or filePath",
29
+ });
30
+ /**
31
+ * Schema for observation category.
32
+ */
33
+ export const CategorySchema = z
34
+ .enum(VALID_CATEGORIES)
35
+ .describe(`Allowed observation category: ${VALID_CATEGORIES.join(", ")}`);
36
+ /**
37
+ * Zod schema for muninn_save tool arguments.
38
+ */
39
+ export const MuninnSaveSchema = z.object({
40
+ category: CategorySchema,
41
+ title: z
42
+ .string()
43
+ .trim()
44
+ .min(1, "Observation title is required and cannot be empty")
45
+ .max(1000, "Observation title cannot exceed 1000 characters")
46
+ .describe("Concise title summarizing the observation"),
47
+ content: z
48
+ .string()
49
+ .trim()
50
+ .min(1, "Observation content is required and cannot be empty")
51
+ .max(1_000_000, "Observation content cannot exceed 1,000,000 characters")
52
+ .describe("Detailed markdown or text content of the observation"),
53
+ topicKey: z
54
+ .string()
55
+ .trim()
56
+ .max(256, "Topic key cannot exceed 256 characters")
57
+ .nullish()
58
+ .describe("Optional clustering key to group related observations (e.g. auth, db)"),
59
+ supersedesTopicKey: z
60
+ .string()
61
+ .trim()
62
+ .max(256, "Supersedes topic key cannot exceed 256 characters")
63
+ .nullish()
64
+ .describe("Optional topic key whose active decisions this new decision replaces"),
65
+ supersedes_topic_key: z
66
+ .string()
67
+ .trim()
68
+ .max(256, "Supersedes topic key cannot exceed 256 characters")
69
+ .nullish()
70
+ .describe("Optional topic key whose active decisions this new decision replaces (snake_case)"),
71
+ symbols: z
72
+ .array(z.union([z.string().trim().min(1), SymbolSchema]))
73
+ .max(500, "Symbols array cannot exceed 500 items")
74
+ .nullish()
75
+ .describe("Optional symbols or code entities linked to this observation"),
76
+ });
77
+ /**
78
+ * Zod schema for muninn_search tool arguments.
79
+ */
80
+ export const MuninnSearchSchema = z.object({
81
+ query: z
82
+ .string()
83
+ .trim()
84
+ .min(1, "Search query is required and cannot be empty")
85
+ .max(2000, "Search query cannot exceed 2000 characters")
86
+ .describe("Full-text search query with BM25 ranking"),
87
+ category: CategorySchema.nullish().describe("Optional category filter"),
88
+ limit: z
89
+ .number()
90
+ .int("Limit must be an integer")
91
+ .positive("Limit must be positive")
92
+ .max(500, "Limit cannot exceed 500")
93
+ .nullish()
94
+ .default(10)
95
+ .describe("Maximum number of results to return (default 10, max 500)"),
96
+ allProjects: z
97
+ .boolean()
98
+ .nullish()
99
+ .describe("Whether to search across all projects (default false)"),
100
+ includeSuperseded: z
101
+ .boolean()
102
+ .nullish()
103
+ .describe("Whether to include superseded observations (default false)"),
104
+ include_superseded: z
105
+ .boolean()
106
+ .nullish()
107
+ .describe("Whether to include superseded observations (default false, snake_case)"),
108
+ });
109
+ /**
110
+ * Zod schema for muninn_context tool arguments.
111
+ */
112
+ export const MuninnContextSchema = z.object({
113
+ limit: z
114
+ .number()
115
+ .int("Limit must be an integer")
116
+ .positive("Limit must be positive")
117
+ .max(500, "Limit cannot exceed 500")
118
+ .nullish()
119
+ .default(20)
120
+ .describe("Maximum number of recent observations to return (default 20, max 500)"),
121
+ category: CategorySchema.nullish().describe("Optional category filter"),
122
+ topicKey: z
123
+ .string()
124
+ .trim()
125
+ .max(256, "Topic key cannot exceed 256 characters")
126
+ .nullish()
127
+ .describe("Optional topic key filter"),
128
+ allProjects: z
129
+ .boolean()
130
+ .nullish()
131
+ .describe("Whether to query across all projects (default false)"),
132
+ includeSuperseded: z
133
+ .boolean()
134
+ .nullish()
135
+ .describe("Whether to include superseded observations (default false)"),
136
+ include_superseded: z
137
+ .boolean()
138
+ .nullish()
139
+ .describe("Whether to include superseded observations (default false, snake_case)"),
140
+ });
141
+ /**
142
+ * Zod schema for muninn_link_symbol tool arguments.
143
+ */
144
+ export const MuninnLinkSymbolSchema = z.object({
145
+ observationId: z
146
+ .string()
147
+ .trim()
148
+ .min(1, "observationId is required and cannot be empty")
149
+ .describe("ID of the observation to link the symbol to"),
150
+ symbol: z
151
+ .union([z.string().trim().min(1, "Symbol is required"), SymbolSchema])
152
+ .describe("Symbol string (e.g. 'src/app.ts::run') or SymbolInput object"),
153
+ });
154
+ /**
155
+ * Zod schema for muninn_stats tool arguments.
156
+ */
157
+ export const MuninnStatsSchema = z.object({
158
+ allProjects: z
159
+ .boolean()
160
+ .nullish()
161
+ .describe("Whether to report metrics across all projects (default false)"),
162
+ });
163
+ /**
164
+ * Zod schema for muninn_inspect_symbol tool arguments.
165
+ */
166
+ export const MuninnInspectSymbolSchema = z.object({
167
+ symbol: z
168
+ .string()
169
+ .trim()
170
+ .min(1, "Symbol is required and cannot be empty")
171
+ .max(2000, "Symbol cannot exceed 2000 characters")
172
+ .describe("Symbol identifier or name (e.g. 'src/app.ts::run' or 'run')"),
173
+ projectId: z.string().trim().nullish().describe("Optional project ID filter"),
174
+ project_id: z
175
+ .string()
176
+ .trim()
177
+ .nullish()
178
+ .describe("Optional project ID filter (snake_case)"),
179
+ });
180
+ /**
181
+ * Zod schema for muninn_bootstrap tool arguments.
182
+ */
183
+ export const MuninnBootstrapSchema = z.object({
184
+ paths: z
185
+ .array(z.string().trim().min(1, "Path cannot be empty").max(4096))
186
+ .max(20, "At most 20 paths may be requested")
187
+ .nullish()
188
+ .describe("Optional file or directory paths, relative to the project root or absolute inside it, used to select indexed symbols"),
189
+ budgetChars: z
190
+ .number()
191
+ .int("budgetChars must be an integer")
192
+ .positive("budgetChars must be positive")
193
+ .max(MAX_SESSION_BRIEF_BUDGET, `budgetChars cannot exceed ${MAX_SESSION_BRIEF_BUDGET}`)
194
+ .nullish()
195
+ .describe("Maximum rendered Markdown length (default 8000, max 20000)"),
196
+ budget_chars: z
197
+ .number()
198
+ .int("budget_chars must be an integer")
199
+ .positive("budget_chars must be positive")
200
+ .max(MAX_SESSION_BRIEF_BUDGET, `budget_chars cannot exceed ${MAX_SESSION_BRIEF_BUDGET}`)
201
+ .nullish()
202
+ .describe("Maximum rendered Markdown length (default 8000, max 20000, snake_case)"),
203
+ expandGraph: z
204
+ .boolean()
205
+ .nullish()
206
+ .describe("Whether to include bounded dependency neighbors (default true)"),
207
+ expand_graph: z
208
+ .boolean()
209
+ .nullish()
210
+ .describe("Whether to include bounded dependency neighbors (default true, snake_case)"),
211
+ });
212
+ /**
213
+ * Zod schema for muninn_verify_contract tool arguments.
214
+ */
215
+ export const MuninnVerifyContractSchema = z.object({
216
+ files: z
217
+ .union([
218
+ z.string().trim().min(1).max(1000),
219
+ z.array(z.string().trim().min(1).max(1000)).max(500),
220
+ ])
221
+ .transform((val) => (Array.isArray(val) ? val : [val]))
222
+ .nullish()
223
+ .describe("Optional array of file paths or single file path to verify contracts for"),
224
+ projectRoot: z
225
+ .string()
226
+ .trim()
227
+ .nullish()
228
+ .describe("Optional project root directory"),
229
+ project_root: z
230
+ .string()
231
+ .trim()
232
+ .nullish()
233
+ .describe("Optional project root directory (snake_case)"),
234
+ });
235
+ /**
236
+ * Helper to format Zod validation errors into a human-readable string.
237
+ */
238
+ export function formatZodErrors(error) {
239
+ if (error.issues && Array.isArray(error.issues) && error.issues.length > 0) {
240
+ return error.issues
241
+ .map((issue) => {
242
+ const path = issue.path.join(".");
243
+ return path ? `${path}: ${issue.message}` : issue.message;
244
+ })
245
+ .join(", ");
246
+ }
247
+ return error.message;
248
+ }
249
+ export const TOOL_REGISTRY = {
250
+ muninn_save: {
251
+ name: "muninn_save",
252
+ description: "Save an observation (decision, convention, discovery, bugfix, architecture) to Muninn memory with optional linked entities.",
253
+ schema: MuninnSaveSchema,
254
+ handler: (service, input) => service.saveObservation(input),
255
+ },
256
+ muninn_search: {
257
+ name: "muninn_search",
258
+ description: "Search observations in Muninn memory using full-text search with BM25 ranking.",
259
+ schema: MuninnSearchSchema,
260
+ handler: (service, input) => service.search(input),
261
+ },
262
+ muninn_context: {
263
+ name: "muninn_context",
264
+ description: "Retrieve recent observations and context from Muninn memory, optionally filtered by category or topic.",
265
+ schema: MuninnContextSchema,
266
+ handler: (service, input) => service.getContext(input),
267
+ },
268
+ muninn_link_symbol: {
269
+ name: "muninn_link_symbol",
270
+ description: "Link a code entity/symbol to an existing observation in Muninn memory.",
271
+ schema: MuninnLinkSymbolSchema,
272
+ handler: (service, input) => service.linkSymbol(input.observationId, input.symbol),
273
+ },
274
+ muninn_stats: {
275
+ name: "muninn_stats",
276
+ description: "Get memory statistics (counts of projects, observations, entities, and links).",
277
+ schema: MuninnStatsSchema,
278
+ handler: (service, input) => input.allProjects
279
+ ? service.getStats()
280
+ : service.getStats(service.currentProject.id),
281
+ },
282
+ muninn_inspect_symbol: {
283
+ name: "muninn_inspect_symbol",
284
+ description: "Inspect a code entity/symbol in Muninn memory, returning its definition, file location, dependencies (imports, extends, calls), bounded depth-1 graph neighbors, and linked observations.",
285
+ schema: MuninnInspectSymbolSchema,
286
+ handler: (service, input) => {
287
+ const projectId = input.projectId?.trim() || input.project_id?.trim() || undefined;
288
+ const res = service.inspectSymbol(input.symbol, projectId);
289
+ if (!res) {
290
+ return {
291
+ found: false,
292
+ symbol: input.symbol,
293
+ message: `Symbol "${input.symbol}" not found in Muninn entity index`,
294
+ };
295
+ }
296
+ return {
297
+ found: true,
298
+ ...res,
299
+ };
300
+ },
301
+ },
302
+ muninn_bootstrap: {
303
+ name: "muninn_bootstrap",
304
+ description: "Build a bounded, deterministic read-only session brief with project identity, active decisions, recent activity, path-selected indexed symbols, counts, and notes.",
305
+ schema: MuninnBootstrapSchema,
306
+ handler: (service, input) => service.getSessionBrief({
307
+ paths: input.paths ?? undefined,
308
+ budgetChars: input.budgetChars ?? input.budget_chars,
309
+ expandGraph: input.expandGraph ?? input.expand_graph,
310
+ }).markdown,
311
+ },
312
+ muninn_verify_contract: {
313
+ name: "muninn_verify_contract",
314
+ description: "Verify TypeScript compilation execution contracts for project files, returning diagnostics, exact line/character positions, and visual snippets.",
315
+ schema: MuninnVerifyContractSchema,
316
+ handler: (service, input) => {
317
+ const baseDir = path.resolve(service.currentProject?.root_path ?? process.cwd());
318
+ const rawRoot = input.projectRoot?.trim() || input.project_root?.trim() || undefined;
319
+ let targetRoot = baseDir;
320
+ if (rawRoot) {
321
+ const resolved = path.resolve(baseDir, rawRoot);
322
+ const rel = path.relative(baseDir, resolved);
323
+ if (rel.startsWith("..") || path.isAbsolute(rel)) {
324
+ throw new Error(`Access denied: projectRoot "${rawRoot}" is outside permitted project root "${baseDir}"`);
325
+ }
326
+ targetRoot = resolved;
327
+ }
328
+ return verifyTypeScriptContracts(targetRoot, input.files ?? undefined);
329
+ },
330
+ },
331
+ };
332
+ /**
333
+ * Metadata definition for all Muninn MCP tools.
334
+ */
335
+ export const MUNINN_TOOLS = Object.values(TOOL_REGISTRY).map((tool) => ({
336
+ name: tool.name,
337
+ description: tool.description,
338
+ inputSchema: z.toJSONSchema(tool.schema, {
339
+ unrepresentable: "any",
340
+ }),
341
+ }));
342
+ export const TOOL_NAMES = [
343
+ "muninn_save",
344
+ "muninn_search",
345
+ "muninn_context",
346
+ "muninn_link_symbol",
347
+ "muninn_stats",
348
+ "muninn_inspect_symbol",
349
+ "muninn_verify_contract",
350
+ "muninn_bootstrap",
351
+ ];
352
+ const PROTOTYPE_POLLUTION_KEYS = new Set([
353
+ "__proto__",
354
+ "constructor",
355
+ "prototype",
356
+ ]);
357
+ /**
358
+ * Normalizes input arguments (handling snake_case fallbacks and null/undefined values),
359
+ * hardened against prototype pollution by skipping __proto__, constructor, and prototype keys.
360
+ */
361
+ export function normalizeArgs(args) {
362
+ if (!args || typeof args !== "object" || Array.isArray(args)) {
363
+ return {};
364
+ }
365
+ const normalized = {};
366
+ for (const [key, value] of Object.entries(args)) {
367
+ if (PROTOTYPE_POLLUTION_KEYS.has(key)) {
368
+ continue;
369
+ }
370
+ if (value !== null && value !== undefined) {
371
+ normalized[key] = value;
372
+ }
373
+ }
374
+ if (normalized.topic_key !== undefined && normalized.topicKey === undefined) {
375
+ normalized.topicKey = normalized.topic_key;
376
+ }
377
+ if (normalized.observation_id !== undefined &&
378
+ normalized.observationId === undefined) {
379
+ normalized.observationId = normalized.observation_id;
380
+ }
381
+ if (normalized.all_projects !== undefined &&
382
+ normalized.allProjects === undefined) {
383
+ normalized.allProjects = normalized.all_projects;
384
+ }
385
+ if (normalized.project_id !== undefined &&
386
+ normalized.projectId === undefined) {
387
+ normalized.projectId = normalized.project_id;
388
+ }
389
+ if (normalized.project_root !== undefined &&
390
+ normalized.projectRoot === undefined) {
391
+ normalized.projectRoot = normalized.project_root;
392
+ }
393
+ if (normalized.supersedes_topic_key !== undefined &&
394
+ normalized.supersedesTopicKey === undefined) {
395
+ normalized.supersedesTopicKey = normalized.supersedes_topic_key;
396
+ }
397
+ if (normalized.include_superseded !== undefined &&
398
+ normalized.includeSuperseded === undefined) {
399
+ normalized.includeSuperseded = normalized.include_superseded;
400
+ }
401
+ if (normalized.file !== undefined && normalized.files === undefined) {
402
+ normalized.files = normalized.file;
403
+ }
404
+ if (normalized.budget_chars !== undefined &&
405
+ normalized.budgetChars === undefined) {
406
+ normalized.budgetChars = normalized.budget_chars;
407
+ }
408
+ if (normalized.expand_graph !== undefined &&
409
+ normalized.expandGraph === undefined) {
410
+ normalized.expandGraph = normalized.expand_graph;
411
+ }
412
+ return normalized;
413
+ }
414
+ /**
415
+ * Type guard to check if an object satisfies the IMemoryService interface.
416
+ */
417
+ export function isMemoryService(obj) {
418
+ return (typeof obj === "object" &&
419
+ obj !== null &&
420
+ "saveObservation" in obj &&
421
+ typeof obj.saveObservation === "function" &&
422
+ "search" in obj &&
423
+ typeof obj.search === "function");
424
+ }
425
+ /**
426
+ * Deadline for a single JSON-RPC write (AC-30.3 / ADR-30.3). The SDK transport
427
+ * resolves `send()` on `'drain'`, which a *broken* stdout pipe never emits, so
428
+ * an unbounded write would hang the pending request forever.
429
+ */
430
+ export const MCP_WRITE_TIMEOUT_MS = 5000;
431
+ /**
432
+ * `StdioServerTransport` with a *bounded* write path (REQ-30 / AC-30.3).
433
+ *
434
+ * `send()` races the SDK's write against (i) a short deadline and (ii) an error
435
+ * on the output stream (EPIPE / ERR_STREAM_DESTROYED). Either one **rejects**,
436
+ * so a broken parent pipe fails the pending request with a clear error instead
437
+ * of awaiting a `'drain'` that can never arrive. The reader side (`start()`,
438
+ * buffering, framing) is untouched.
439
+ */
440
+ export class BoundedStdioServerTransport extends StdioServerTransport {
441
+ output;
442
+ writeTimeoutMs;
443
+ constructor(stdin = process.stdin, stdout = process.stdout, options = {}) {
444
+ super(stdin, stdout, { maxBufferSize: options.maxBufferSize });
445
+ this.output = stdout;
446
+ this.writeTimeoutMs = options.writeTimeoutMs ?? MCP_WRITE_TIMEOUT_MS;
447
+ }
448
+ send(message) {
449
+ return new Promise((resolve, reject) => {
450
+ let settled = false;
451
+ let timer;
452
+ const cleanup = () => {
453
+ if (timer) {
454
+ clearTimeout(timer);
455
+ timer = undefined;
456
+ }
457
+ this.output.off("error", onError);
458
+ };
459
+ const fail = (err) => {
460
+ if (settled)
461
+ return;
462
+ settled = true;
463
+ cleanup();
464
+ reject(err);
465
+ };
466
+ const succeed = () => {
467
+ if (settled)
468
+ return;
469
+ settled = true;
470
+ cleanup();
471
+ resolve();
472
+ };
473
+ const onError = (err) => fail(new Error(`MCP stdio write failed (the MCP client pipe is closed): ${sanitizeTerminalText(err.message)}`));
474
+ // A broken pipe emits 'error' on stdout; without a listener that is an
475
+ // unhandled exception, so the transport listens for its own writes too.
476
+ this.output.on("error", onError);
477
+ if (this.writeTimeoutMs > 0) {
478
+ timer = setTimeout(() => fail(new Error(`MCP stdio write timed out after ${this.writeTimeoutMs}ms (the MCP client stopped reading)`)), this.writeTimeoutMs);
479
+ if (typeof timer.unref === "function") {
480
+ timer.unref();
481
+ }
482
+ }
483
+ try {
484
+ super.send(message).then(succeed, (err) => fail(err instanceof Error ? err : new Error(String(err))));
485
+ }
486
+ catch (err) {
487
+ fail(err instanceof Error ? err : new Error(String(err)));
488
+ }
489
+ });
490
+ }
491
+ }
492
+ /**
493
+ * Creates and configures a Model Context Protocol (MCP) server for Muninn memory.
494
+ */
495
+ export function createMcpServer(serviceOrOptions) {
496
+ const injectedService = isMemoryService(serviceOrOptions)
497
+ ? serviceOrOptions
498
+ : undefined;
499
+ const options = injectedService
500
+ ? undefined
501
+ : serviceOrOptions;
502
+ let serviceInstance = injectedService;
503
+ const getService = () => {
504
+ if (!serviceInstance) {
505
+ serviceInstance = new MemoryService(options);
506
+ }
507
+ return serviceInstance;
508
+ };
509
+ const closeService = (force = true) => {
510
+ if (serviceInstance) {
511
+ serviceInstance.close?.(force);
512
+ }
513
+ };
514
+ const server = new Server({
515
+ name: "muninn-memory",
516
+ version: "1.0.0",
517
+ }, {
518
+ capabilities: {
519
+ tools: {},
520
+ },
521
+ });
522
+ // The writable service is lazy for a default server: bootstrap must be able to
523
+ // run without creating or initializing a database. Accessing `service` (or
524
+ // calling any non-bootstrap tool) initializes it exactly as before.
525
+ const mcpServer = server;
526
+ Object.defineProperty(mcpServer, "service", {
527
+ configurable: true,
528
+ enumerable: true,
529
+ get: getService,
530
+ });
531
+ Object.defineProperty(mcpServer, "memoryService", {
532
+ configurable: true,
533
+ enumerable: true,
534
+ get: getService,
535
+ });
536
+ mcpServer.getService = getService;
537
+ mcpServer.closeService = closeService;
538
+ mcpServer.setRequestHandler(ListToolsRequestSchema, async () => {
539
+ return {
540
+ tools: MUNINN_TOOLS,
541
+ };
542
+ });
543
+ mcpServer.setRequestHandler(CallToolRequestSchema, async (request) => {
544
+ try {
545
+ const { name } = request.params;
546
+ const tool = TOOL_REGISTRY[name];
547
+ if (!tool) {
548
+ return {
549
+ isError: true,
550
+ content: [
551
+ {
552
+ type: "text",
553
+ text: `Error: Unknown tool "${name}"`,
554
+ },
555
+ ],
556
+ };
557
+ }
558
+ const rawArgs = request.params.arguments;
559
+ const args = normalizeArgs(rawArgs);
560
+ const parsed = tool.schema.safeParse(args);
561
+ if (!parsed.success) {
562
+ return {
563
+ isError: true,
564
+ content: [
565
+ {
566
+ type: "text",
567
+ text: `Validation error: ${formatZodErrors(parsed.error)}`,
568
+ },
569
+ ],
570
+ };
571
+ }
572
+ const isBootstrap = name === "muninn_bootstrap";
573
+ if (isBootstrap && !injectedService) {
574
+ const input = parsed.data;
575
+ const brief = readSessionBrief({
576
+ dbPath: options?.dbPath,
577
+ projectRoot: options?.projectRoot,
578
+ db: options?.db,
579
+ paths: input.paths ?? undefined,
580
+ budgetChars: input.budgetChars ?? input.budget_chars ?? undefined,
581
+ expandGraph: input.expandGraph ?? input.expand_graph,
582
+ });
583
+ return {
584
+ content: [
585
+ {
586
+ type: "text",
587
+ text: brief.markdown,
588
+ },
589
+ ],
590
+ };
591
+ }
592
+ const result = await tool.handler(getService(), parsed.data);
593
+ return {
594
+ content: [
595
+ {
596
+ type: "text",
597
+ text: isBootstrap ? String(result) : JSON.stringify(result, null, 2),
598
+ },
599
+ ],
600
+ };
601
+ }
602
+ catch (err) {
603
+ return {
604
+ isError: true,
605
+ content: [
606
+ {
607
+ type: "text",
608
+ text: `Error: ${err instanceof Error ? err.message : String(err)}`,
609
+ },
610
+ ],
611
+ };
612
+ }
613
+ });
614
+ return mcpServer;
615
+ }
616
+ /**
617
+ * Starts the Muninn MCP server using the bounded {@link BoundedStdioServerTransport}.
618
+ */
619
+ export async function startMcpServer(options, transportOptions) {
620
+ const server = createMcpServer(options);
621
+ const transport = new BoundedStdioServerTransport(process.stdin, process.stdout, transportOptions);
622
+ await server.connect(transport);
623
+ const handle = { server, transport };
624
+ Object.defineProperty(handle, "service", {
625
+ configurable: true,
626
+ enumerable: true,
627
+ get: () => server.getService(),
628
+ });
629
+ Object.defineProperty(handle, "closeService", {
630
+ configurable: false,
631
+ enumerable: false,
632
+ value: (force = true) => server.closeService(force),
633
+ });
634
+ return handle;
635
+ }
636
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./memory-service.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./memory-service.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}