@nowline/mcp 0.0.0-dev.20260603150914.g70caedb
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.
- package/LICENSE +190 -0
- package/dist/generated/resources.d.ts +9 -0
- package/dist/generated/resources.d.ts.map +1 -0
- package/dist/generated/resources.js +69 -0
- package/dist/generated/resources.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +11 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +464 -0
- package/dist/server.js.map +1 -0
- package/package.json +49 -0
- package/src/generated/resources.ts +75 -0
- package/src/index.ts +59 -0
- package/src/server.ts +587 -0
package/dist/server.js
ADDED
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
// @nowline/mcp server factory.
|
|
2
|
+
//
|
|
3
|
+
// Creates and configures an McpServer instance with all eight tools and two
|
|
4
|
+
// resources (nowline://reference + nowline://examples). The factory is shared
|
|
5
|
+
// by the entry-point bin (npx @nowline/mcp) and the CLI's --mcp flag so both
|
|
6
|
+
// paths expose an identical surface.
|
|
7
|
+
//
|
|
8
|
+
// Spec: specs/mcp.md. Plan: export_determinism s8 + s9.
|
|
9
|
+
import { promises as fs } from 'node:fs';
|
|
10
|
+
import * as path from 'node:path';
|
|
11
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
12
|
+
import { collectDocumentDiagnostics, createNowlineServices } from '@nowline/core';
|
|
13
|
+
import { exportDocument, } from '@nowline/export';
|
|
14
|
+
import { resolveFonts } from '@nowline/export-core';
|
|
15
|
+
import { URI } from 'langium';
|
|
16
|
+
import { z } from 'zod';
|
|
17
|
+
import { EXAMPLES, REFERENCE_MAN_PAGE } from './generated/resources.js';
|
|
18
|
+
function collectMcpDiagnostics(doc, filePath) {
|
|
19
|
+
const raw = collectDocumentDiagnostics(doc);
|
|
20
|
+
const out = [];
|
|
21
|
+
for (const d of raw) {
|
|
22
|
+
if (d.origin === 'lexer' || d.origin === 'parser') {
|
|
23
|
+
out.push({
|
|
24
|
+
file: filePath,
|
|
25
|
+
line: 1,
|
|
26
|
+
column: 1,
|
|
27
|
+
severity: 'error',
|
|
28
|
+
code: d.origin === 'lexer' ? 'lexing-error' : 'parsing-error',
|
|
29
|
+
message: d.error.message,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
const diag = d.diagnostic;
|
|
34
|
+
const range = diag.range;
|
|
35
|
+
out.push({
|
|
36
|
+
file: filePath,
|
|
37
|
+
line: (range?.start.line ?? 0) + 1,
|
|
38
|
+
column: (range?.start.character ?? 0) + 1,
|
|
39
|
+
severity: diag.severity === 1 ? 'error' : 'warning',
|
|
40
|
+
code: String(diag.code ?? 'unknown'),
|
|
41
|
+
message: diag.message,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
// ---- Langium services -------------------------------------------------------
|
|
48
|
+
let cachedServices;
|
|
49
|
+
let docCounter = 0;
|
|
50
|
+
function getServices() {
|
|
51
|
+
if (!cachedServices)
|
|
52
|
+
cachedServices = createNowlineServices();
|
|
53
|
+
return cachedServices;
|
|
54
|
+
}
|
|
55
|
+
async function buildDocument(source) {
|
|
56
|
+
const services = getServices();
|
|
57
|
+
const uri = URI.parse(`memory:///mcp-${++docCounter}.nowline`);
|
|
58
|
+
const doc = services.shared.workspace.LangiumDocumentFactory.fromString(source, uri);
|
|
59
|
+
await services.shared.workspace.DocumentBuilder.build([doc], { validation: true });
|
|
60
|
+
return doc;
|
|
61
|
+
}
|
|
62
|
+
// ---- Allowed-root enforcement -----------------------------------------------
|
|
63
|
+
function resolveAndGuard(filePath, allowedRoot) {
|
|
64
|
+
const abs = path.resolve(allowedRoot, filePath);
|
|
65
|
+
const guard = path.resolve(allowedRoot);
|
|
66
|
+
if (!abs.startsWith(guard + path.sep) && abs !== guard) {
|
|
67
|
+
throw new Error(`Path ${filePath} is outside the allowed root ${allowedRoot}`);
|
|
68
|
+
}
|
|
69
|
+
return abs;
|
|
70
|
+
}
|
|
71
|
+
// ---- Node HostEnv for export ------------------------------------------------
|
|
72
|
+
function createNodeHostEnv(sourcePath) {
|
|
73
|
+
const assetRoot = path.resolve(path.dirname(sourcePath));
|
|
74
|
+
return {
|
|
75
|
+
async readSource(p) {
|
|
76
|
+
return fs.readFile(p, 'utf-8');
|
|
77
|
+
},
|
|
78
|
+
async readAsset(ref) {
|
|
79
|
+
const abs = path.resolve(assetRoot, ref);
|
|
80
|
+
if (!abs.startsWith(assetRoot + path.sep) && abs !== assetRoot) {
|
|
81
|
+
throw new Error(`Asset ${ref} escapes asset-root ${assetRoot}`);
|
|
82
|
+
}
|
|
83
|
+
const bytes = await fs.readFile(abs);
|
|
84
|
+
return new Uint8Array(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
85
|
+
},
|
|
86
|
+
async loadWasm() {
|
|
87
|
+
// Resolve resvg.wasm relative to @nowline/export-png/dist/ at runtime.
|
|
88
|
+
const { createRequire } = await import('node:module');
|
|
89
|
+
const req = createRequire(import.meta.url);
|
|
90
|
+
const entry = req.resolve('@resvg/resvg-wasm');
|
|
91
|
+
const { dirname } = await import('node:path');
|
|
92
|
+
const wasmPath = `${dirname(entry)}/index_bg.wasm`;
|
|
93
|
+
const bytes = await fs.readFile(wasmPath);
|
|
94
|
+
return bytes.buffer;
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// ---- Helpers ----------------------------------------------------------------
|
|
99
|
+
function todayUtc() {
|
|
100
|
+
const now = new Date();
|
|
101
|
+
return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate()));
|
|
102
|
+
}
|
|
103
|
+
async function sourceAndPath(args, allowedRoot) {
|
|
104
|
+
if (args.source !== undefined && args.path === undefined) {
|
|
105
|
+
return { source: args.source, filePath: path.join(allowedRoot, 'unnamed.nowline') };
|
|
106
|
+
}
|
|
107
|
+
if (args.path !== undefined) {
|
|
108
|
+
const abs = resolveAndGuard(args.path, allowedRoot);
|
|
109
|
+
const source = args.source ?? (await fs.readFile(abs, 'utf-8'));
|
|
110
|
+
return { source, filePath: abs };
|
|
111
|
+
}
|
|
112
|
+
throw new Error('At least one of `source` or `path` is required.');
|
|
113
|
+
}
|
|
114
|
+
export function createMcpServer(opts = {}) {
|
|
115
|
+
const allowedRoot = opts.allowedRoot ?? process.cwd();
|
|
116
|
+
const server = new McpServer({
|
|
117
|
+
name: opts.name ?? 'nowline',
|
|
118
|
+
version: opts.version ?? '0.5.1',
|
|
119
|
+
});
|
|
120
|
+
// ---- Resources ----------------------------------------------------------
|
|
121
|
+
server.registerResource('nowline-reference', 'nowline://reference', {
|
|
122
|
+
description: 'Full DSL reference (nowline.5 man page): syntax, directives, and examples.',
|
|
123
|
+
mimeType: 'text/plain',
|
|
124
|
+
}, async () => ({
|
|
125
|
+
contents: [
|
|
126
|
+
{ uri: 'nowline://reference', text: REFERENCE_MAN_PAGE, mimeType: 'text/plain' },
|
|
127
|
+
],
|
|
128
|
+
}));
|
|
129
|
+
server.registerResource('nowline-examples', 'nowline://examples', {
|
|
130
|
+
description: 'Canonical example .nowline files from the official examples/ directory.',
|
|
131
|
+
mimeType: 'text/plain',
|
|
132
|
+
}, async () => ({
|
|
133
|
+
contents: EXAMPLES.map((ex) => ({
|
|
134
|
+
uri: `nowline://examples/${ex.name}`,
|
|
135
|
+
text: `# ${ex.name}\n\n${ex.content}`,
|
|
136
|
+
mimeType: 'text/plain',
|
|
137
|
+
})),
|
|
138
|
+
}));
|
|
139
|
+
// ---- validate -----------------------------------------------------------
|
|
140
|
+
server.registerTool('validate', {
|
|
141
|
+
description: 'Parse and validate a .nowline roadmap. Returns ok=true and an empty diagnostics array if valid, or ok=false with structured diagnostics.',
|
|
142
|
+
inputSchema: z.object({
|
|
143
|
+
source: z.string().optional().describe('Inline .nowline source text to validate.'),
|
|
144
|
+
path: z
|
|
145
|
+
.string()
|
|
146
|
+
.optional()
|
|
147
|
+
.describe('Absolute or relative path to a .nowline file to validate.'),
|
|
148
|
+
}),
|
|
149
|
+
}, async (args) => {
|
|
150
|
+
const { source, filePath } = await sourceAndPath(args, allowedRoot);
|
|
151
|
+
const doc = await buildDocument(source);
|
|
152
|
+
const diagnostics = collectMcpDiagnostics(doc, filePath);
|
|
153
|
+
const ok = diagnostics.every((d) => d.severity !== 'error');
|
|
154
|
+
return {
|
|
155
|
+
content: [{ type: 'text', text: JSON.stringify({ ok, diagnostics }, null, 2) }],
|
|
156
|
+
};
|
|
157
|
+
});
|
|
158
|
+
// ---- read ---------------------------------------------------------------
|
|
159
|
+
server.registerTool('read', {
|
|
160
|
+
description: 'Read a local .nowline file.',
|
|
161
|
+
inputSchema: z.object({
|
|
162
|
+
path: z
|
|
163
|
+
.string()
|
|
164
|
+
.describe('Absolute or relative path to the .nowline file to read.'),
|
|
165
|
+
}),
|
|
166
|
+
}, async (args) => {
|
|
167
|
+
const abs = resolveAndGuard(args.path, allowedRoot);
|
|
168
|
+
const source = await fs.readFile(abs, 'utf-8');
|
|
169
|
+
return {
|
|
170
|
+
content: [
|
|
171
|
+
{
|
|
172
|
+
type: 'text',
|
|
173
|
+
text: JSON.stringify({ path: abs, source }, null, 2),
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
};
|
|
177
|
+
});
|
|
178
|
+
// ---- create -------------------------------------------------------------
|
|
179
|
+
server.registerTool('create', {
|
|
180
|
+
description: 'Write a new .nowline file after validation. Overwrites if the path already exists.',
|
|
181
|
+
inputSchema: z.object({
|
|
182
|
+
path: z.string().describe('Absolute or relative path to write the .nowline file.'),
|
|
183
|
+
source: z.string().describe('The .nowline source text to write.'),
|
|
184
|
+
}),
|
|
185
|
+
}, async (args) => {
|
|
186
|
+
const abs = resolveAndGuard(args.path, allowedRoot);
|
|
187
|
+
const doc = await buildDocument(args.source);
|
|
188
|
+
const diagnostics = collectMcpDiagnostics(doc, abs);
|
|
189
|
+
const errors = diagnostics.filter((d) => d.severity === 'error');
|
|
190
|
+
if (errors.length > 0) {
|
|
191
|
+
return {
|
|
192
|
+
content: [
|
|
193
|
+
{
|
|
194
|
+
type: 'text',
|
|
195
|
+
text: JSON.stringify({ ok: false, path: abs, diagnostics }, null, 2),
|
|
196
|
+
},
|
|
197
|
+
],
|
|
198
|
+
isError: true,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
await fs.mkdir(path.dirname(abs), { recursive: true });
|
|
202
|
+
await fs.writeFile(abs, args.source, 'utf-8');
|
|
203
|
+
return {
|
|
204
|
+
content: [{ type: 'text', text: JSON.stringify({ ok: true, path: abs }, null, 2) }],
|
|
205
|
+
};
|
|
206
|
+
});
|
|
207
|
+
// ---- update -------------------------------------------------------------
|
|
208
|
+
server.registerTool('update', {
|
|
209
|
+
description: 'Replace an existing .nowline file after validation.',
|
|
210
|
+
inputSchema: z.object({
|
|
211
|
+
path: z
|
|
212
|
+
.string()
|
|
213
|
+
.describe('Absolute or relative path of the .nowline file to update.'),
|
|
214
|
+
source: z.string().describe('The new .nowline source text.'),
|
|
215
|
+
}),
|
|
216
|
+
}, async (args) => {
|
|
217
|
+
const abs = resolveAndGuard(args.path, allowedRoot);
|
|
218
|
+
const doc = await buildDocument(args.source);
|
|
219
|
+
const diagnostics = collectMcpDiagnostics(doc, abs);
|
|
220
|
+
const errors = diagnostics.filter((d) => d.severity === 'error');
|
|
221
|
+
if (errors.length > 0) {
|
|
222
|
+
return {
|
|
223
|
+
content: [
|
|
224
|
+
{
|
|
225
|
+
type: 'text',
|
|
226
|
+
text: JSON.stringify({ ok: false, path: abs, diagnostics }, null, 2),
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
isError: true,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
await fs.writeFile(abs, args.source, 'utf-8');
|
|
233
|
+
return {
|
|
234
|
+
content: [{ type: 'text', text: JSON.stringify({ ok: true, path: abs }, null, 2) }],
|
|
235
|
+
};
|
|
236
|
+
});
|
|
237
|
+
// ---- delete -------------------------------------------------------------
|
|
238
|
+
server.registerTool('delete', {
|
|
239
|
+
description: 'Delete a local .nowline file.',
|
|
240
|
+
inputSchema: z.object({
|
|
241
|
+
path: z
|
|
242
|
+
.string()
|
|
243
|
+
.describe('Absolute or relative path of the .nowline file to delete.'),
|
|
244
|
+
}),
|
|
245
|
+
}, async (args) => {
|
|
246
|
+
const abs = resolveAndGuard(args.path, allowedRoot);
|
|
247
|
+
await fs.unlink(abs);
|
|
248
|
+
return {
|
|
249
|
+
content: [{ type: 'text', text: JSON.stringify({ path: abs }, null, 2) }],
|
|
250
|
+
};
|
|
251
|
+
});
|
|
252
|
+
// ---- list ---------------------------------------------------------------
|
|
253
|
+
server.registerTool('list', {
|
|
254
|
+
description: 'List .nowline files under a directory.',
|
|
255
|
+
inputSchema: z.object({
|
|
256
|
+
directory: z
|
|
257
|
+
.string()
|
|
258
|
+
.optional()
|
|
259
|
+
.describe('Directory to scan. Defaults to the allowed root (cwd or --root). Absolute or relative.'),
|
|
260
|
+
recursive: z
|
|
261
|
+
.boolean()
|
|
262
|
+
.optional()
|
|
263
|
+
.describe('Whether to scan subdirectories. Defaults to false.'),
|
|
264
|
+
}),
|
|
265
|
+
}, async (args) => {
|
|
266
|
+
const dir = args.directory ? resolveAndGuard(args.directory, allowedRoot) : allowedRoot;
|
|
267
|
+
const recursive = args.recursive ?? false;
|
|
268
|
+
const paths = await listNowlineFiles(dir, recursive);
|
|
269
|
+
return {
|
|
270
|
+
content: [{ type: 'text', text: JSON.stringify({ paths }, null, 2) }],
|
|
271
|
+
};
|
|
272
|
+
});
|
|
273
|
+
// ---- render -------------------------------------------------------------
|
|
274
|
+
server.registerTool('render', {
|
|
275
|
+
description: 'Render a .nowline roadmap to SVG or PNG using the shared export kernel. Byte-identical to `nowline -f svg/png` for the same source and inputs.',
|
|
276
|
+
inputSchema: z.object({
|
|
277
|
+
source: z.string().optional().describe('Inline .nowline source text.'),
|
|
278
|
+
path: z.string().optional().describe('Path to the .nowline file.'),
|
|
279
|
+
format: z
|
|
280
|
+
.enum(['svg', 'png'])
|
|
281
|
+
.optional()
|
|
282
|
+
.describe('Output format. Defaults to svg.'),
|
|
283
|
+
theme: z
|
|
284
|
+
.enum(['light', 'dark', 'grayscale'])
|
|
285
|
+
.optional()
|
|
286
|
+
.describe('Color theme. Defaults to light.'),
|
|
287
|
+
now: z
|
|
288
|
+
.string()
|
|
289
|
+
.optional()
|
|
290
|
+
.describe('Now-line date as YYYY-MM-DD (UTC). Omit to suppress.'),
|
|
291
|
+
width: z.number().optional().describe('Canvas width in px.'),
|
|
292
|
+
scale: z
|
|
293
|
+
.number()
|
|
294
|
+
.optional()
|
|
295
|
+
.describe('PNG pixel-density multiplier. Defaults to 2.'),
|
|
296
|
+
output: z
|
|
297
|
+
.string()
|
|
298
|
+
.optional()
|
|
299
|
+
.describe('Write output to this path instead of returning inline.'),
|
|
300
|
+
}),
|
|
301
|
+
}, async (args) => {
|
|
302
|
+
const { source, filePath } = await sourceAndPath(args, allowedRoot);
|
|
303
|
+
const format = args.format ?? 'svg';
|
|
304
|
+
const today = args.now ? new Date(`${args.now}T00:00:00Z`) : todayUtc();
|
|
305
|
+
const inputs = {
|
|
306
|
+
sourcePath: filePath,
|
|
307
|
+
today,
|
|
308
|
+
locale: 'en-US',
|
|
309
|
+
theme: args.theme ?? 'light',
|
|
310
|
+
width: args.width,
|
|
311
|
+
pngScale: args.scale,
|
|
312
|
+
};
|
|
313
|
+
if (format === 'png') {
|
|
314
|
+
const result = await resolveFonts({ headless: true });
|
|
315
|
+
inputs.fonts = { sans: result.sans, mono: result.mono };
|
|
316
|
+
}
|
|
317
|
+
const host = createNodeHostEnv(filePath);
|
|
318
|
+
const bytes = await exportDocument(source, format, inputs, host);
|
|
319
|
+
if (args.output) {
|
|
320
|
+
const outAbs = resolveAndGuard(args.output, allowedRoot);
|
|
321
|
+
await fs.mkdir(path.dirname(outAbs), { recursive: true });
|
|
322
|
+
await fs.writeFile(outAbs, bytes);
|
|
323
|
+
return {
|
|
324
|
+
content: [
|
|
325
|
+
{
|
|
326
|
+
type: 'text',
|
|
327
|
+
text: JSON.stringify({ path: outAbs, bytes: bytes.byteLength }),
|
|
328
|
+
},
|
|
329
|
+
],
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
if (format === 'png') {
|
|
333
|
+
return {
|
|
334
|
+
content: [
|
|
335
|
+
{
|
|
336
|
+
type: 'image',
|
|
337
|
+
data: Buffer.from(bytes).toString('base64'),
|
|
338
|
+
mimeType: 'image/png',
|
|
339
|
+
},
|
|
340
|
+
],
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
return {
|
|
344
|
+
content: [
|
|
345
|
+
{
|
|
346
|
+
type: 'text',
|
|
347
|
+
text: new TextDecoder('utf-8').decode(bytes),
|
|
348
|
+
mimeType: 'image/svg+xml',
|
|
349
|
+
},
|
|
350
|
+
],
|
|
351
|
+
};
|
|
352
|
+
});
|
|
353
|
+
// ---- export -------------------------------------------------------------
|
|
354
|
+
const EXPORT_FORMATS = ['pdf', 'html', 'mermaid', 'xlsx', 'msproj', 'png'];
|
|
355
|
+
server.registerTool('export', {
|
|
356
|
+
description: 'Export a .nowline roadmap to any of the eight canonical formats. Byte-identical to `nowline -f <format>` for the same source and inputs.',
|
|
357
|
+
inputSchema: z.object({
|
|
358
|
+
source: z.string().optional().describe('Inline .nowline source text.'),
|
|
359
|
+
path: z.string().optional().describe('Path to the .nowline file.'),
|
|
360
|
+
format: z
|
|
361
|
+
.enum(EXPORT_FORMATS)
|
|
362
|
+
.describe('Export format: pdf, html, mermaid, xlsx, msproj, or png.'),
|
|
363
|
+
output: z
|
|
364
|
+
.string()
|
|
365
|
+
.optional()
|
|
366
|
+
.describe('Path to write the output file. Required for binary formats.'),
|
|
367
|
+
now: z.string().optional().describe('Now-line date as YYYY-MM-DD (UTC).'),
|
|
368
|
+
theme: z.enum(['light', 'dark', 'grayscale']).optional(),
|
|
369
|
+
scale: z.number().optional().describe('PNG scale factor.'),
|
|
370
|
+
pageSize: z.string().optional().describe('PDF page size.'),
|
|
371
|
+
orientation: z
|
|
372
|
+
.enum(['portrait', 'landscape', 'auto'])
|
|
373
|
+
.optional()
|
|
374
|
+
.describe('PDF orientation.'),
|
|
375
|
+
marginPt: z.number().optional().describe('PDF margin in points.'),
|
|
376
|
+
msprojStart: z
|
|
377
|
+
.string()
|
|
378
|
+
.optional()
|
|
379
|
+
.describe('MS Project start date override (YYYY-MM-DD).'),
|
|
380
|
+
}),
|
|
381
|
+
}, async (args) => {
|
|
382
|
+
const { source, filePath } = await sourceAndPath(args, allowedRoot);
|
|
383
|
+
const format = args.format;
|
|
384
|
+
const today = args.now ? new Date(`${args.now}T00:00:00Z`) : todayUtc();
|
|
385
|
+
const inputs = {
|
|
386
|
+
sourcePath: filePath,
|
|
387
|
+
today,
|
|
388
|
+
locale: 'en-US',
|
|
389
|
+
theme: args.theme ?? 'light',
|
|
390
|
+
pngScale: args.scale,
|
|
391
|
+
pageSize: args.pageSize,
|
|
392
|
+
orientation: args.orientation,
|
|
393
|
+
marginPt: args.marginPt,
|
|
394
|
+
msprojStart: args.msprojStart,
|
|
395
|
+
};
|
|
396
|
+
if (format === 'png' || format === 'pdf') {
|
|
397
|
+
const result = await resolveFonts({ headless: true });
|
|
398
|
+
inputs.fonts = { sans: result.sans, mono: result.mono };
|
|
399
|
+
}
|
|
400
|
+
const host = createNodeHostEnv(filePath);
|
|
401
|
+
const bytes = await exportDocument(source, format, inputs, host);
|
|
402
|
+
const BINARY_FORMATS = new Set(['png', 'pdf', 'xlsx']);
|
|
403
|
+
const isBinary = BINARY_FORMATS.has(format);
|
|
404
|
+
if (args.output) {
|
|
405
|
+
const outAbs = resolveAndGuard(args.output, allowedRoot);
|
|
406
|
+
await fs.mkdir(path.dirname(outAbs), { recursive: true });
|
|
407
|
+
await fs.writeFile(outAbs, bytes);
|
|
408
|
+
return {
|
|
409
|
+
content: [
|
|
410
|
+
{
|
|
411
|
+
type: 'text',
|
|
412
|
+
text: JSON.stringify({ path: outAbs, bytes: bytes.byteLength }),
|
|
413
|
+
},
|
|
414
|
+
],
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
if (isBinary) {
|
|
418
|
+
const mimeMap = {
|
|
419
|
+
png: 'image/png',
|
|
420
|
+
pdf: 'application/pdf',
|
|
421
|
+
xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
422
|
+
};
|
|
423
|
+
return {
|
|
424
|
+
content: [
|
|
425
|
+
{
|
|
426
|
+
type: 'image',
|
|
427
|
+
data: Buffer.from(bytes).toString('base64'),
|
|
428
|
+
mimeType: mimeMap[format] ?? 'application/octet-stream',
|
|
429
|
+
},
|
|
430
|
+
],
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
return {
|
|
434
|
+
content: [
|
|
435
|
+
{
|
|
436
|
+
type: 'text',
|
|
437
|
+
text: new TextDecoder('utf-8').decode(bytes),
|
|
438
|
+
},
|
|
439
|
+
],
|
|
440
|
+
};
|
|
441
|
+
});
|
|
442
|
+
return server;
|
|
443
|
+
}
|
|
444
|
+
// ---- Helpers ----------------------------------------------------------------
|
|
445
|
+
async function listNowlineFiles(dir, recursive) {
|
|
446
|
+
const results = [];
|
|
447
|
+
try {
|
|
448
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
449
|
+
for (const entry of entries) {
|
|
450
|
+
const fullPath = path.join(dir, entry.name);
|
|
451
|
+
if (entry.isDirectory() && recursive) {
|
|
452
|
+
results.push(...(await listNowlineFiles(fullPath, true)));
|
|
453
|
+
}
|
|
454
|
+
else if (entry.isFile() && entry.name.endsWith('.nowline')) {
|
|
455
|
+
results.push(fullPath);
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
catch {
|
|
460
|
+
// Directory not accessible — return empty
|
|
461
|
+
}
|
|
462
|
+
return results.sort();
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nowline/mcp",
|
|
3
|
+
"version": "0.0.0-dev.20260603150914.g70caedb",
|
|
4
|
+
"description": "Nowline MCP server — stdio tool surface for validate/render/read/create/update/delete/list/export over local .nowline files",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=22",
|
|
8
|
+
"pnpm": ">=11"
|
|
9
|
+
},
|
|
10
|
+
"type": "module",
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"bin": {
|
|
14
|
+
"nowline-mcp": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"exports": {
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./server": {
|
|
22
|
+
"types": "./dist/server.d.ts",
|
|
23
|
+
"import": "./dist/server.js"
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"dist/",
|
|
28
|
+
"src/"
|
|
29
|
+
],
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
32
|
+
"langium": "~4.2.4",
|
|
33
|
+
"zod": "^4.4.3",
|
|
34
|
+
"@nowline/core": "0.0.0-dev.20260603150914.g70caedb",
|
|
35
|
+
"@nowline/export": "0.0.0-dev.20260603150914.g70caedb",
|
|
36
|
+
"@nowline/export-core": "0.0.0-dev.20260603150914.g70caedb"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "^25.9.1",
|
|
40
|
+
"vitest": "^4.1.7"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"prebuild": "node scripts/bundle-resources.mjs",
|
|
44
|
+
"build": "tsc -b tsconfig.json",
|
|
45
|
+
"watch": "tsc -b tsconfig.json --watch",
|
|
46
|
+
"typecheck": "tsc --noEmit",
|
|
47
|
+
"test": "vitest run"
|
|
48
|
+
}
|
|
49
|
+
}
|