@nowline/mcp 0.8.2 → 0.8.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ui-bundle.js","sourceRoot":"","sources":["../../src/generated/ui-bundle.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,EAAE;AACF,qEAAqE;AACrE,8CAA8C;AAC9C,EAAE;AACF,mFAAmF;AAEnF,yEAAyE;AACzE,MAAM,CAAC,MAAM,SAAS,GAAW,o64lCAAo64lC,CAAC;AAEt84lC,gFAAgF;AAChF,MAAM,CAAC,MAAM,YAAY,GAAW,0x5lCAA0x5lC,CAAC"}
1
+ {"version":3,"file":"ui-bundle.js","sourceRoot":"","sources":["../../src/generated/ui-bundle.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,EAAE;AACF,qEAAqE;AACrE,8CAA8C;AAC9C,EAAE;AACF,mFAAmF;AAEnF,yEAAyE;AACzE,MAAM,CAAC,MAAM,SAAS,GAAW,4l5lCAA4l5lC,CAAC;AAE9n5lC,gFAAgF;AAChF,MAAM,CAAC,MAAM,YAAY,GAAW,k95lCAAk95lC,CAAC"}
package/dist/index.js CHANGED
@@ -16,6 +16,7 @@ import { dirname, resolve } from 'node:path';
16
16
  import { fileURLToPath } from 'node:url';
17
17
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
18
18
  import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
19
+ import { expandRootPath } from './root-path.js';
19
20
  import { createMcpServer } from './server.js';
20
21
  const __filename = fileURLToPath(import.meta.url);
21
22
  const __dirname = dirname(__filename);
@@ -78,7 +79,15 @@ if (help) {
78
79
  ].join('\n'));
79
80
  process.exit(0);
80
81
  }
81
- const server = createMcpServer({ allowedRoot: root, version: PKG_VERSION });
82
+ // Expand mcpb tokens (${HOME}/~/env vars) so a literal default from the
83
+ // .mcpb directory picker resolves to a real path. An empty/blank value
84
+ // (optional field left unset) collapses to undefined → cwd fallback, inline.
85
+ const expandedRoot = expandRootPath(root);
86
+ const server = createMcpServer({
87
+ allowedRoot: expandedRoot,
88
+ rootConfigured: expandedRoot !== undefined,
89
+ version: PKG_VERSION,
90
+ });
82
91
  if (port !== undefined) {
83
92
  // Streamable HTTP transport — stateless (no session management).
84
93
  const transport = new StreamableHTTPServerTransport({
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Expands `--root` into an absolute path, or returns `undefined` when no
3
+ * usable root was provided (undefined or empty — e.g. an optional `.mcpb`
4
+ * directory field left blank, which the host passes as an empty string).
5
+ *
6
+ * Handled tokens:
7
+ * - mcpb specials: `${HOME}`, `${DESKTOP}`, `${DOCUMENTS}`, `${DOWNLOADS}`,
8
+ * `${pathSeparator}`, `${/}`
9
+ * - generic environment variables: `${NAME}` / `$NAME` (uppercase)
10
+ * - a leading `~` / `~/`
11
+ */
12
+ export declare function expandRootPath(raw: string | undefined): string | undefined;
13
+ //# sourceMappingURL=root-path.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-path.d.ts","sourceRoot":"","sources":["../src/root-path.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAqC1E"}
@@ -0,0 +1,58 @@
1
+ // Resolves the --root argument into a real absolute path.
2
+ //
3
+ // Claude Desktop's .mcpb variable substitution is single-pass: a `user_config`
4
+ // default like "${HOME}/Downloads" can reach the server with `${HOME}` still
5
+ // unexpanded when the user installs the bundle without opening the directory
6
+ // picker (the optional field's raw default is used verbatim for the
7
+ // `${user_config.*}` substitution, and the nested token is never re-expanded).
8
+ // To stay robust regardless of host behavior we expand the mcpb special tokens,
9
+ // a leading `~`, and generic environment variables here.
10
+ //
11
+ // Spec: specs/mcp.md ".mcpb bundle packaging".
12
+ import { homedir } from 'node:os';
13
+ import { join, resolve, sep } from 'node:path';
14
+ /**
15
+ * Expands `--root` into an absolute path, or returns `undefined` when no
16
+ * usable root was provided (undefined or empty — e.g. an optional `.mcpb`
17
+ * directory field left blank, which the host passes as an empty string).
18
+ *
19
+ * Handled tokens:
20
+ * - mcpb specials: `${HOME}`, `${DESKTOP}`, `${DOCUMENTS}`, `${DOWNLOADS}`,
21
+ * `${pathSeparator}`, `${/}`
22
+ * - generic environment variables: `${NAME}` / `$NAME` (uppercase)
23
+ * - a leading `~` / `~/`
24
+ */
25
+ export function expandRootPath(raw) {
26
+ if (raw === undefined)
27
+ return undefined;
28
+ const trimmed = raw.trim();
29
+ if (trimmed === '')
30
+ return undefined;
31
+ const home = homedir();
32
+ const specials = {
33
+ HOME: home,
34
+ DESKTOP: join(home, 'Desktop'),
35
+ DOCUMENTS: join(home, 'Documents'),
36
+ DOWNLOADS: join(home, 'Downloads'),
37
+ };
38
+ let out = trimmed;
39
+ // mcpb path-separator tokens.
40
+ out = out.replace(/\$\{pathSeparator\}/g, sep).replace(/\$\{\/\}/g, sep);
41
+ // ${NAME} / $NAME — mcpb special dirs first, then generic env vars.
42
+ out = out.replace(/\$\{([A-Z_][A-Z0-9_]*)\}|\$([A-Z_][A-Z0-9_]*)/g, (match, braced, bare) => {
43
+ const name = braced ?? bare ?? '';
44
+ if (name in specials)
45
+ return specials[name];
46
+ const env = process.env[name];
47
+ return env !== undefined ? env : match;
48
+ });
49
+ // Leading ~ / ~/.
50
+ if (out === '~') {
51
+ out = home;
52
+ }
53
+ else if (out.startsWith('~/') || out.startsWith(`~${sep}`)) {
54
+ out = join(home, out.slice(2));
55
+ }
56
+ return resolve(out);
57
+ }
58
+ //# sourceMappingURL=root-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root-path.js","sourceRoot":"","sources":["../src/root-path.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,oEAAoE;AACpE,+EAA+E;AAC/E,gFAAgF;AAChF,yDAAyD;AACzD,EAAE;AACF,+CAA+C;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc,CAAC,GAAuB;IAClD,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAErC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,MAAM,QAAQ,GAA2B;QACrC,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;QAC9B,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;QAClC,SAAS,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC;KACrC,CAAC;IAEF,IAAI,GAAG,GAAG,OAAO,CAAC;IAElB,8BAA8B;IAC9B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,sBAAsB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IAEzE,oEAAoE;IACpE,GAAG,GAAG,GAAG,CAAC,OAAO,CACb,gDAAgD,EAChD,CAAC,KAAK,EAAE,MAA0B,EAAE,IAAwB,EAAE,EAAE;QAC5D,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,IAAI,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3C,CAAC,CACJ,CAAC;IAEF,kBAAkB;IAClB,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;QACd,GAAG,GAAG,IAAI,CAAC;IACf,CAAC;SAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;QAC3D,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;AACxB,CAAC"}
package/dist/schemas.d.ts CHANGED
@@ -94,7 +94,6 @@ export declare const RenderOutputSchema: z.ZodObject<{
94
94
  format: z.ZodString;
95
95
  path: z.ZodOptional<z.ZodString>;
96
96
  bytes: z.ZodOptional<z.ZodNumber>;
97
- shareUrl: z.ZodOptional<z.ZodString>;
98
97
  insights: z.ZodOptional<z.ZodArray<z.ZodObject<{
99
98
  severity: z.ZodEnum<{
100
99
  warning: "warning";
@@ -109,7 +108,9 @@ export declare const ExportOutputSchema: z.ZodObject<{
109
108
  format: z.ZodString;
110
109
  path: z.ZodOptional<z.ZodString>;
111
110
  bytes: z.ZodOptional<z.ZodNumber>;
112
- shareUrl: z.ZodOptional<z.ZodString>;
111
+ }, z.core.$strip>;
112
+ export declare const ShareOutputSchema: z.ZodObject<{
113
+ shareUrl: z.ZodString;
113
114
  }, z.core.$strip>;
114
115
  export declare const ConvertOutputSchema: z.ZodObject<{
115
116
  to: z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;iBAQ3B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;iBAKxB,CAAC;AAIH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;iBAG3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;iBAE3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;iBAO7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;iBAK7B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;iBAG9B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;iBAMnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;iBAGhC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;iBAI7B,CAAC"}
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;iBAQ3B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;;iBAKxB,CAAC;AAIH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;iBAG3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AAEH,eAAO,MAAM,gBAAgB;;iBAE3B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;iBAM7B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;iBAI7B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;iBAE5B,CAAC;AAEH,eAAO,MAAM,mBAAmB;;;;;;iBAG9B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;iBAMnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;iBAEhC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;;iBAGhC,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;iBAI7B,CAAC"}
package/dist/schemas.js CHANGED
@@ -48,14 +48,15 @@ export const RenderOutputSchema = z.object({
48
48
  /** Set when the output was written to disk. */
49
49
  path: z.string().optional(),
50
50
  bytes: z.number().optional(),
51
- shareUrl: z.string().optional(),
52
51
  insights: z.array(InsightSchema).optional(),
53
52
  });
54
53
  export const ExportOutputSchema = z.object({
55
54
  format: z.string(),
56
55
  path: z.string().optional(),
57
56
  bytes: z.number().optional(),
58
- shareUrl: z.string().optional(),
57
+ });
58
+ export const ShareOutputSchema = z.object({
59
+ shareUrl: z.string(),
59
60
  });
60
61
  export const ConvertOutputSchema = z.object({
61
62
  to: z.enum(['json', 'nowline']),
@@ -1 +1 @@
1
- {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -4,6 +4,8 @@ export declare const PREVIEW_UI_URI = "ui://nowline/preview-v1";
4
4
  export interface McpServerOptions {
5
5
  /** Working directory — all file paths are resolved relative to this root. Defaults to process.cwd(). */
6
6
  allowedRoot?: string;
7
+ /** Whether the allowed root was explicitly configured (vs. defaulting to cwd). Controls smart export delivery for binary formats. Defaults to false. */
8
+ rootConfigured?: boolean;
7
9
  /** Server name shown in the MCP client. Defaults to 'nowline'. */
8
10
  name?: string;
9
11
  /** Server version. Defaults to package version. */
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgEpE,4EAA4E;AAC5E,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAwIxD,MAAM,WAAW,gBAAgB;IAC7B,wGAAwG;IACxG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,gBAAqB,GAAG,SAAS,CAi9BtE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiEpE,4EAA4E;AAC5E,eAAO,MAAM,cAAc,4BAA4B,CAAC;AAwIxD,MAAM,WAAW,gBAAgB;IAC7B,wGAAwG;IACxG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wJAAwJ;IACxJ,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,IAAI,GAAE,gBAAqB,GAAG,SAAS,CAokCtE"}
package/dist/server.js CHANGED
@@ -22,7 +22,7 @@ import { PREVIEW_HTML } from './generated/ui-bundle.js';
22
22
  import { registerPrompts } from './prompts.js';
23
23
  import { REFERENCE_CHEATSHEET } from './reference-cheatsheet.js';
24
24
  import { SCHEMA_VOCABULARY } from './schema-vocab.js';
25
- import { CapabilitiesOutputSchema, ConvertOutputSchema, CreateOutputSchema, DeleteOutputSchema, ExamplesOutputSchema, ExportOutputSchema, ListItemsOutputSchema, ListOutputSchema, ReadOutputSchema, ReferenceOutputSchema, RenderOutputSchema, SchemaOutputSchema, UpdateOutputSchema, ValidateOutputSchema, } from './schemas.js';
25
+ import { CapabilitiesOutputSchema, ConvertOutputSchema, CreateOutputSchema, DeleteOutputSchema, ExamplesOutputSchema, ExportOutputSchema, ListItemsOutputSchema, ListOutputSchema, ReadOutputSchema, ReferenceOutputSchema, RenderOutputSchema, SchemaOutputSchema, ShareOutputSchema, UpdateOutputSchema, ValidateOutputSchema, } from './schemas.js';
26
26
  // ---- MCP Apps UI (in-chat live preview) -------------------------------------
27
27
  //
28
28
  // Official MCP Apps model (SEP-1865): a pre-declared ui:// resource serves
@@ -136,6 +136,7 @@ async function sourceAndPath(args, allowedRoot) {
136
136
  }
137
137
  export function createMcpServer(opts = {}) {
138
138
  const allowedRoot = opts.allowedRoot ?? process.cwd();
139
+ const rootConfigured = opts.rootConfigured ?? false;
139
140
  const server = new McpServer({
140
141
  name: opts.name ?? 'nowline',
141
142
  version: opts.version ?? '0.6.0',
@@ -146,7 +147,16 @@ export function createMcpServer(opts = {}) {
146
147
  'Workflow: 1. call `reference` or `examples` to learn syntax → 2. write `.nowline` → ' +
147
148
  '3. call `render` (validates + renders; or `validate` alone) → 4. fix errors keyed on `NL.E####` ' +
148
149
  'and re-render → 5. review returned layout `insights` (what reflowed) → 6. when uncertain, ' +
149
- 'call `render` with `review:true` for a final visual check. JSON in `convert` is AST conversion only.',
150
+ 'call `render` with `review:true` for a final visual check. JSON in `convert` is AST conversion only. ' +
151
+ 'Presenting output: default to `render` (in-chat preview / inline image) — the primary presentation. ' +
152
+ 'The in-chat preview is view-only (no download/export button). Use `export` to produce a file. ' +
153
+ 'Export files: binary formats (pdf, xlsx, png) are auto-saved to the configured folder — omit `delivery` ' +
154
+ 'and omit `output` to let the server save the file; never use `delivery:"inline"` for pdf/xlsx on Claude ' +
155
+ 'Desktop (the host cannot display inline documents, so nothing appears). For svg/html/mermaid exports, ' +
156
+ 'present the returned text to the user as a downloadable artifact of the matching type ' +
157
+ '(.svg / .html / .mermaid) so they can save it. ' +
158
+ 'Use the `share` tool only when the user explicitly wants a link they can open or share ' +
159
+ '(opens the free Nowline web app, where they can also export).',
150
160
  });
151
161
  // ---- Resources ----------------------------------------------------------
152
162
  server.registerResource('nowline-reference', 'nowline://reference', {
@@ -387,8 +397,9 @@ export function createMcpServer(opts = {}) {
387
397
  });
388
398
  // ---- render -------------------------------------------------------------
389
399
  registerAppTool(server, 'render', {
390
- description: toolDescriptionWithSyntax('Validate then render a .nowline roadmap to SVG or PNG (combined validate+render+share). ' +
391
- 'Returns structured diagnostics on error-severity input instead of a raw kernel error.'),
400
+ description: toolDescriptionWithSyntax('Validate then render a .nowline roadmap to SVG or PNG (combined validate+render). ' +
401
+ 'Returns structured diagnostics on error-severity input instead of a raw kernel error. ' +
402
+ 'On MCP Apps hosts the in-chat preview is view-only (no download/export button); use `export` for files and the `share` tool for an openable link.'),
392
403
  inputSchema: z.object({
393
404
  source: z.string().optional().describe('Inline .nowline source text.'),
394
405
  path: z
@@ -420,10 +431,6 @@ export function createMcpServer(opts = {}) {
420
431
  .describe('Real local filesystem path to write the output file (e.g. /Users/name/Desktop/roadmap.svg). ' +
421
432
  'Never pass a virtual or sandbox path such as /mnt/user-data/… — ' +
422
433
  'omit this parameter to receive output inline instead.'),
423
- share: z
424
- .boolean()
425
- .optional()
426
- .describe('When true, include a shareUrl pointing to https://free.nowline.io/open.'),
427
434
  review: z
428
435
  .boolean()
429
436
  .optional()
@@ -476,9 +483,6 @@ export function createMcpServer(opts = {}) {
476
483
  const bytes = needsRender
477
484
  ? await exportDocument(source, format, inputs, host)
478
485
  : new Uint8Array(0);
479
- const shareUrl = args.share
480
- ? (buildShareLink({ source, share: true }) ?? undefined)
481
- : undefined;
482
486
  const insights = await collectMcpLayoutInsights({
483
487
  source,
484
488
  filePath,
@@ -510,7 +514,6 @@ export function createMcpServer(opts = {}) {
510
514
  format,
511
515
  path: outAbs,
512
516
  bytes: bytes.byteLength,
513
- shareUrl,
514
517
  ...insightsField,
515
518
  };
516
519
  return {
@@ -530,7 +533,6 @@ export function createMcpServer(opts = {}) {
530
533
  if (appActive) {
531
534
  const structured = {
532
535
  format,
533
- shareUrl,
534
536
  ...insightsField,
535
537
  };
536
538
  return {
@@ -546,7 +548,6 @@ export function createMcpServer(opts = {}) {
546
548
  const structured = {
547
549
  format,
548
550
  bytes: bytes.byteLength,
549
- shareUrl,
550
551
  ...insightsField,
551
552
  };
552
553
  return {
@@ -563,7 +564,7 @@ export function createMcpServer(opts = {}) {
563
564
  };
564
565
  }
565
566
  const svgText = new TextDecoder('utf-8').decode(bytes);
566
- const structured = { format, shareUrl, ...insightsField };
567
+ const structured = { format, ...insightsField };
567
568
  return {
568
569
  content: [
569
570
  { type: 'text', text: svgText, mimeType: 'image/svg+xml' },
@@ -574,9 +575,12 @@ export function createMcpServer(opts = {}) {
574
575
  };
575
576
  });
576
577
  // ---- export -------------------------------------------------------------
577
- const EXPORT_FORMATS = ['pdf', 'html', 'mermaid', 'xlsx', 'msproj', 'png'];
578
+ const EXPORT_FORMATS = ['svg', 'pdf', 'html', 'mermaid', 'xlsx', 'msproj', 'png'];
578
579
  server.registerTool('export', {
579
- description: 'Export a .nowline roadmap to any of the eight canonical formats. Byte-identical to `nowline -f <format>` for the same source and inputs.',
580
+ description: 'Export a .nowline roadmap to any of the eight canonical formats. Byte-identical to `nowline -f <format>` for the same source and inputs. ' +
581
+ 'For pdf/xlsx/png: omit `delivery` and omit `output` — the server auto-saves to the configured folder and returns the path. ' +
582
+ 'Never use `delivery:"inline"` for binary formats on Claude Desktop (inline binary cannot be displayed). ' +
583
+ 'For svg/html/mermaid: the text is returned inline — present it to the user as a downloadable artifact of the matching type.',
580
584
  inputSchema: z.object({
581
585
  source: z.string().optional().describe('Inline .nowline source text.'),
582
586
  path: z
@@ -587,14 +591,15 @@ export function createMcpServer(opts = {}) {
587
591
  'those do not exist on the host filesystem. Pass `source` instead.'),
588
592
  format: z
589
593
  .enum(EXPORT_FORMATS)
590
- .describe('Export format: pdf, html, mermaid, xlsx, msproj, or png.'),
594
+ .describe('Export format: svg, pdf, html, mermaid, xlsx, msproj, or png.'),
591
595
  output: z
592
596
  .string()
593
597
  .optional()
594
- .describe('Real local filesystem path to write the output (e.g. /Users/name/Desktop/roadmap.pdf). ' +
595
- 'Required for binary formats (pdf, xlsx, msproj, png). ' +
596
- 'Never pass a virtual or sandbox path such as /mnt/user-data/… — ' +
597
- 'those do not exist on the host filesystem.'),
598
+ .describe('Optional path to write the output file. Omit for binary formats (pdf, xlsx, png) — ' +
599
+ 'the server auto-saves to the configured folder as <roadmap-id>.<ext>. ' +
600
+ 'To choose a filename, pass a bare filename (e.g. "roadmap.pdf") — it is saved into the configured folder. ' +
601
+ 'Never pass a virtual or sandbox path such as /home/claude/…, /mnt/user-data/…, or any path ' +
602
+ 'outside the configured output folder — those do not exist on the host filesystem.'),
598
603
  now: z.string().optional().describe('Now-line date as YYYY-MM-DD (UTC).'),
599
604
  theme: z.enum(['light', 'dark', 'grayscale']).optional(),
600
605
  scale: z.number().optional().describe('PNG scale factor.'),
@@ -608,10 +613,15 @@ export function createMcpServer(opts = {}) {
608
613
  .string()
609
614
  .optional()
610
615
  .describe('MS Project start date override (YYYY-MM-DD).'),
611
- share: z
612
- .boolean()
616
+ delivery: z
617
+ .enum(['file', 'inline', 'both'])
613
618
  .optional()
614
- .describe('When true, include a shareUrl pointing to https://free.nowline.io/open.'),
619
+ .describe('"file" — write to disk and return the path (no inline bytes). ' +
620
+ '"inline" — return bytes in the response (embedded resource for pdf/xlsx, image for png, text for other formats). ' +
621
+ '"both" — write to disk and also attach inline bytes. ' +
622
+ 'Default is smart per format: pdf/xlsx/png write to disk when a root folder is configured, else return inline; text formats (svg/html/mermaid/msproj) always return inline. ' +
623
+ 'IMPORTANT — for pdf/xlsx/png on Claude Desktop, prefer omitting `delivery` entirely (smart default saves the file). ' +
624
+ 'Do NOT use delivery:"inline" for pdf/xlsx — Claude Desktop silently drops inline documents, so nothing appears to the user.'),
615
625
  }),
616
626
  outputSchema: ExportOutputSchema,
617
627
  annotations: readOnlyTool('Export Roadmap'),
@@ -649,48 +659,144 @@ export function createMcpServer(opts = {}) {
649
659
  }
650
660
  const host = createNodeHostEnv(filePath);
651
661
  const bytes = await exportDocument(source, format, inputs, host);
652
- const shareUrl = args.share
653
- ? (buildShareLink({ source, share: true }) ?? undefined)
654
- : undefined;
655
662
  const BINARY_FORMATS = new Set(['png', 'pdf', 'xlsx']);
656
663
  const isBinary = BINARY_FORMATS.has(format);
657
- if (args.output) {
664
+ // Default filename: <roadmap-id>.<ext>, used when no output path is given.
665
+ const FORMAT_EXT = {
666
+ svg: '.svg',
667
+ pdf: '.pdf',
668
+ xlsx: '.xlsx',
669
+ png: '.png',
670
+ html: '.html',
671
+ mermaid: '.md',
672
+ msproj: '.xml',
673
+ };
674
+ const ext = FORMAT_EXT[format] ?? `.${format}`;
675
+ const roadmapId = blocked.doc.parseResult.value.roadmapDecl?.name ?? 'roadmap';
676
+ const defaultFilename = `${roadmapId}${ext}`;
677
+ // Resolve delivery mode.
678
+ const hasExplicitOutput = !!args.output;
679
+ const delivery = args.delivery;
680
+ let doWrite;
681
+ let doInline;
682
+ if (hasExplicitOutput) {
683
+ doWrite = true;
684
+ doInline = delivery === 'both';
685
+ }
686
+ else if (delivery === 'file') {
687
+ doWrite = true;
688
+ doInline = false;
689
+ }
690
+ else if (delivery === 'inline') {
691
+ doWrite = false;
692
+ doInline = true;
693
+ }
694
+ else if (delivery === 'both') {
695
+ doWrite = true;
696
+ doInline = true;
697
+ }
698
+ else {
699
+ // Smart default: binary formats (pdf/xlsx/png) write to the configured root
700
+ // (return a reference, not bytes — the idiomatic MCP pattern). Text formats
701
+ // (svg/html/mermaid/msproj) always return inline so Claude can surface them
702
+ // as downloadable artifacts.
703
+ if (format === 'pdf' || format === 'xlsx' || format === 'png') {
704
+ doWrite = rootConfigured;
705
+ doInline = !rootConfigured;
706
+ }
707
+ else {
708
+ // svg/html/mermaid/msproj: always inline text.
709
+ doWrite = false;
710
+ doInline = true;
711
+ }
712
+ }
713
+ // Write to disk if needed.
714
+ const outTarget = args.output ?? path.join(allowedRoot, defaultFilename);
715
+ let writtenPath;
716
+ if (doWrite) {
658
717
  try {
659
- const outAbs = resolveAndGuard(args.output, allowedRoot);
718
+ const outAbs = resolveAndGuard(outTarget, allowedRoot);
660
719
  await fs.mkdir(path.dirname(outAbs), { recursive: true });
661
720
  await fs.writeFile(outAbs, bytes);
662
- const structured = { format, path: outAbs, bytes: bytes.byteLength, shareUrl };
663
- return {
664
- content: [{ type: 'text', text: JSON.stringify(structured, null, 2) }],
665
- structuredContent: structured,
666
- };
721
+ writtenPath = outAbs;
667
722
  }
668
723
  catch (err) {
669
- return handleToolError(err, args.output);
724
+ return handleToolError(err, args.output ?? outTarget);
670
725
  }
671
726
  }
672
- if (isBinary) {
673
- const mimeMap = {
674
- png: 'image/png',
675
- pdf: 'application/pdf',
676
- xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
677
- };
678
- const structured = { format, bytes: bytes.byteLength, shareUrl };
679
- return {
680
- content: [
681
- {
682
- type: 'image',
683
- data: Buffer.from(bytes).toString('base64'),
684
- mimeType: mimeMap[format] ?? 'application/octet-stream',
685
- },
686
- ],
687
- structuredContent: structured,
688
- };
727
+ // Build response content.
728
+ const contentBlocks = [];
729
+ if (writtenPath !== undefined) {
730
+ contentBlocks.push({
731
+ type: 'text',
732
+ text: `Saved to \`${writtenPath}\` (${bytes.byteLength} bytes).`,
733
+ });
734
+ }
735
+ if (doInline) {
736
+ if (isBinary) {
737
+ contentBlocks.push(...buildExportInlineContentBlocks(format, bytes, !doWrite, rootConfigured));
738
+ }
739
+ else {
740
+ const TEXT_MIME = {
741
+ svg: 'image/svg+xml',
742
+ html: 'text/html',
743
+ mermaid: 'text/markdown',
744
+ msproj: 'application/xml',
745
+ };
746
+ const text = new TextDecoder('utf-8').decode(bytes);
747
+ const mt = TEXT_MIME[format];
748
+ contentBlocks.push({ type: 'text', text, ...(mt ? { mimeType: mt } : {}) });
749
+ }
750
+ }
751
+ const structured = { format };
752
+ if (writtenPath !== undefined) {
753
+ structured.path = writtenPath;
754
+ structured.bytes = bytes.byteLength;
755
+ }
756
+ else if (doInline && isBinary) {
757
+ structured.bytes = bytes.byteLength;
689
758
  }
690
- const text = new TextDecoder('utf-8').decode(bytes);
691
- const structured = { format, shareUrl };
692
759
  return {
693
- content: [{ type: 'text', text }],
760
+ content: contentBlocks,
761
+ structuredContent: structured,
762
+ };
763
+ });
764
+ // ---- share --------------------------------------------------------------
765
+ server.registerTool('share', {
766
+ description: 'Generate a shareable link for a roadmap. The roadmap source is encoded into the URL fragment ' +
767
+ '(client-side; no upload, no account, no network call) and opens in the free Nowline web app ' +
768
+ '(free.nowline.io/open), where anyone with the link can view it and export to PDF/PNG/SVG. ' +
769
+ 'Prefer `render` to show a roadmap in chat — that is the default. Use `share` only when the user ' +
770
+ 'explicitly asks for a link to open, send, or export elsewhere.',
771
+ inputSchema: z.object({
772
+ source: z.string().optional().describe('Inline .nowline source text.'),
773
+ path: z
774
+ .string()
775
+ .optional()
776
+ .describe('Real local filesystem path to the .nowline file (e.g. /Users/name/Desktop/foo.nowline). ' +
777
+ 'Never pass a virtual or sandbox path such as /mnt/user-data/… — ' +
778
+ 'those do not exist on the host filesystem. Pass `source` instead.'),
779
+ }),
780
+ outputSchema: ShareOutputSchema,
781
+ annotations: readOnlyTool('Share Roadmap'),
782
+ }, async (args) => {
783
+ let source;
784
+ let filePath;
785
+ try {
786
+ ({ source, filePath } = await sourceAndPath(args, allowedRoot));
787
+ }
788
+ catch (err) {
789
+ return handleToolError(err, args.path);
790
+ }
791
+ const blocked = await diagnosticsErrorBlock(source, filePath);
792
+ if (!blocked.ok)
793
+ return blocked.response;
794
+ // buildShareLink returns null only for share:false/'none'; this tool
795
+ // always requests share:true, so the result is always a link.
796
+ const shareUrl = buildShareLink({ source, share: true });
797
+ const structured = { shareUrl };
798
+ return {
799
+ content: [{ type: 'text', text: JSON.stringify(structured, null, 2) }],
694
800
  structuredContent: structured,
695
801
  };
696
802
  });
@@ -921,6 +1027,45 @@ export function createMcpServer(opts = {}) {
921
1027
  });
922
1028
  return server;
923
1029
  }
1030
+ const EXPORT_BINARY_SHARE_HINT_NO_ROOT = 'No file was written. To save a file, pass `output: "/path/to/roadmap.pdf"` or `delivery: "file"` ' +
1031
+ '(on Claude Desktop, configure an output folder in the server settings so the server can auto-save). ' +
1032
+ 'For a shareable link the user can view and export from, call the `share` tool.';
1033
+ const EXPORT_BINARY_SHARE_HINT_ROOT_CONFIGURED = 'No file was written because `delivery:"inline"` was requested. ' +
1034
+ 'Claude Desktop cannot display inline pdf/xlsx documents, so nothing appeared. ' +
1035
+ 'Omit `delivery` (or use `delivery:"file"`) to let the server save the file to the configured output folder — ' +
1036
+ 'then share that local path with the user. Alternatively call the `share` tool for an openable link.';
1037
+ function buildExportInlineContentBlocks(format, bytes, showHint = true, rootConfigured = false) {
1038
+ const mimeMap = {
1039
+ png: 'image/png',
1040
+ pdf: 'application/pdf',
1041
+ xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
1042
+ };
1043
+ const mimeType = mimeMap[format] ?? 'application/octet-stream';
1044
+ const base64 = Buffer.from(bytes).toString('base64');
1045
+ // PNG renders inline as an image — no resource wrapper or share hint needed.
1046
+ if (format === 'png') {
1047
+ return [{ type: 'image', data: base64, mimeType }];
1048
+ }
1049
+ // pdf/xlsx: embedded resource block, and optionally a hint pointing the agent
1050
+ // at output:/delivery:'file' when no file was also written.
1051
+ const blocks = [
1052
+ {
1053
+ type: 'resource',
1054
+ resource: {
1055
+ uri: `nowline://export/roadmap.${format}`,
1056
+ mimeType,
1057
+ blob: base64,
1058
+ },
1059
+ },
1060
+ ];
1061
+ if (showHint) {
1062
+ const hint = rootConfigured
1063
+ ? EXPORT_BINARY_SHARE_HINT_ROOT_CONFIGURED
1064
+ : EXPORT_BINARY_SHARE_HINT_NO_ROOT;
1065
+ blocks.push({ type: 'text', text: hint });
1066
+ }
1067
+ return blocks;
1068
+ }
924
1069
  async function buildReviewContentBlocks(source, format, artifactBytes, inputs, host) {
925
1070
  const blocks = [
926
1071
  {