@happyvertical/smrt-app-cli 0.53.3 → 0.53.5

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/AGENTS.md CHANGED
@@ -15,6 +15,13 @@ Application CLI support for SMRT-based apps.
15
15
  - Do not persist tokens, server URLs, or app slugs outside the configured local CLI config path.
16
16
  - Bind persisted bearer tokens to the exact issuer emitted by the device flow
17
17
  and to the server selected during login. Never reuse them after either changes.
18
+ - The modern bridge targets `mcpPath` (default `/api/mcp`): `createAppCli`
19
+ option, `startMcpBridge({ mcpPath })`, `smrt-mcp-bridge --mcp-path` /
20
+ `SMRT_MCP_PATH`, `smrt-app --mcp-path` / `SMRT_APP_MCP_PATH`. Validate it
21
+ with `resolveMcpPath` (same-server absolute path only) before listening.
22
+ `smrt-mcp-bridge` parses argv with `parseMcpBridgeArgs`: empty, missing or
23
+ repeated value options and an explicit invalid (even empty) path are usage
24
+ errors (exit 2) — never silently the default.
18
25
  - Keep command output stream-injectable so tests can assert behavior without writing to the real terminal.
19
26
 
20
27
  ## Gotchas
package/README.md CHANGED
@@ -150,6 +150,35 @@ stdio clients:
150
150
  await cli.startMcpBridge({ name: 'acme-mcp', version: '1.0.0' });
151
151
  ```
152
152
 
153
+ The bridge forwards to `/api/mcp` by default. When the app mounts its MCP
154
+ route elsewhere, set `mcpPath` on `createAppCli()` or pass it per call
155
+ (`startMcpBridge({ mcpPath: '/mcp' })`). The binaries take `--mcp-path=/mcp`
156
+ (`smrt-mcp-bridge`, or `SMRT_MCP_PATH`) and `--mcp-path` / `SMRT_APP_MCP_PATH`
157
+ (`smrt-app`). The path must be same-server and absolute.
158
+
159
+ For a local-profile s-m-r-t app, mint a credential with
160
+ `smrt app token --scopes <scope>` in the app checkout. The token is printed
161
+ once. Then give the bridge the loopback server and that token through the
162
+ app's environment prefix. This Claude Desktop entry is an example:
163
+
164
+ ```json
165
+ {
166
+ "mcpServers": {
167
+ "notes": {
168
+ "command": "npx",
169
+ "args": ["smrt-mcp-bridge", "--env-prefix=NOTES", "--mcp-path=/mcp"],
170
+ "env": {
171
+ "NOTES_SERVER_URL": "http://127.0.0.1:5173",
172
+ "NOTES_TOKEN": "smrt_mcp_…"
173
+ }
174
+ }
175
+ }
176
+ }
177
+ ```
178
+
179
+ The token is sent only when `<PREFIX>_SERVER_URL` matches the target server.
180
+ Revoke a token with `smrt app token revoke <id>`.
181
+
153
182
  The package also ships the generic `smrt-mcp-bridge` binary. The remote app
154
183
  surface is typically mounted with
155
184
  [`@happyvertical/smrt-app-mcp`](../smrt-app-mcp/README.md).
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { i as runAppCliExecutable } from "../src-CMc9Yx_3.js";
2
+ import { i as runAppCliExecutable } from "../src-DjwsOuHK.js";
3
3
  //#region src/bin/smrt-app.ts
4
4
  /**
5
5
  * `smrt-app` — configuration-driven executable for a published SMRT app CLI.
@@ -15,6 +15,10 @@
15
15
  * - `SMRT_MCP_APP_SLUG` — directory name under `~/.config`.
16
16
  * - `SMRT_MCP_SERVER_NAME` / `SMRT_MCP_SERVER_VERSION` — local server identity.
17
17
  * - `SMRT_MCP_DEFAULT_SERVER_URL` — fallback server URL.
18
+ * - `SMRT_MCP_PATH` (`--mcp-path`) — the app's MCP endpoint path, e.g.
19
+ * `/mcp`. Defaults to `/api/mcp`. An explicit value (even an empty
20
+ * environment value) must be valid; a malformed, missing or repeated
21
+ * value option is a usage error (exit 2) before the bridge listens.
18
22
  *
19
23
  * Apps that want their own branded bin should call `runMcpStdioBridge`
20
24
  * directly from `@happyvertical/smrt-app-cli` — this package's root export —
@@ -1 +1 @@
1
- {"version":3,"file":"smrt-mcp-bridge.d.ts","sourceRoot":"","sources":["../../src/bin/smrt-mcp-bridge.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;GAqBG"}
1
+ {"version":3,"file":"smrt-mcp-bridge.d.ts","sourceRoot":"","sources":["../../src/bin/smrt-mcp-bridge.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
@@ -1,5 +1,76 @@
1
1
  #!/usr/bin/env node
2
- import { m as runMcpStdioBridge } from "../config-Ds7ofwtL.js";
2
+ import { h as runMcpStdioBridge, u as resolveMcpPath } from "../config-B9dESami.js";
3
+ //#region src/bridge-args.ts
4
+ /**
5
+ * Argument parsing for the generic `smrt-mcp-bridge` binary. Every value
6
+ * option requires a non-empty value and may appear once; an explicitly
7
+ * supplied endpoint path (argument or `SMRT_MCP_PATH`, even when empty) is
8
+ * validated and never replaced by the default.
9
+ *
10
+ * @internal
11
+ */
12
+ var VALUE_OPTIONS = [
13
+ "env-prefix",
14
+ "app-slug",
15
+ "default-server-url",
16
+ "name",
17
+ "version",
18
+ "mcp-path"
19
+ ];
20
+ /** A usage error: print the message and exit non-zero without listening. */
21
+ var McpBridgeUsageError = class extends Error {
22
+ name = "McpBridgeUsageError";
23
+ };
24
+ /** Parse bridge argv and the `SMRT_MCP_PATH` environment value. */
25
+ function parseMcpBridgeArgs(argv, env = {}) {
26
+ const values = /* @__PURE__ */ new Map();
27
+ let legacyRest = false;
28
+ for (let index = 0; index < argv.length; index += 1) {
29
+ const arg = argv[index];
30
+ if (arg === "--legacy-rest") {
31
+ legacyRest = true;
32
+ continue;
33
+ }
34
+ if (!arg.startsWith("--")) continue;
35
+ const equals = arg.indexOf("=");
36
+ const key = arg.slice(2, equals < 0 ? void 0 : equals);
37
+ if (!VALUE_OPTIONS.includes(key)) continue;
38
+ const option = key;
39
+ let value;
40
+ if (equals >= 0) value = arg.slice(equals + 1);
41
+ else {
42
+ value = argv[index + 1];
43
+ if (value !== void 0 && !value.startsWith("--")) index += 1;
44
+ else value = void 0;
45
+ }
46
+ if (!value) throw new McpBridgeUsageError(`--${option} requires a value.`);
47
+ if (values.has(option)) throw new McpBridgeUsageError(`--${option} was provided more than once.`);
48
+ values.set(option, value);
49
+ }
50
+ let mcpPath;
51
+ const explicit = values.has("mcp-path") ? {
52
+ source: "--mcp-path",
53
+ value: values.get("mcp-path")
54
+ } : env.SMRT_MCP_PATH !== void 0 ? {
55
+ source: "SMRT_MCP_PATH",
56
+ value: env.SMRT_MCP_PATH
57
+ } : void 0;
58
+ if (explicit) {
59
+ const invalid = new McpBridgeUsageError(`${explicit.source} must be a same-server absolute path such as /mcp.`);
60
+ if (!explicit.value) throw invalid;
61
+ try {
62
+ mcpPath = resolveMcpPath(explicit.value);
63
+ } catch {
64
+ throw invalid;
65
+ }
66
+ }
67
+ return {
68
+ values,
69
+ legacyRest,
70
+ ...mcpPath ? { mcpPath } : {}
71
+ };
72
+ }
73
+ //#endregion
3
74
  //#region src/bin/smrt-mcp-bridge.ts
4
75
  /**
5
76
  * `smrt-mcp-bridge` — generic stdio MCP bridge.
@@ -18,33 +89,40 @@ import { m as runMcpStdioBridge } from "../config-Ds7ofwtL.js";
18
89
  * - `SMRT_MCP_APP_SLUG` — directory name under `~/.config`.
19
90
  * - `SMRT_MCP_SERVER_NAME` / `SMRT_MCP_SERVER_VERSION` — local server identity.
20
91
  * - `SMRT_MCP_DEFAULT_SERVER_URL` — fallback server URL.
92
+ * - `SMRT_MCP_PATH` (`--mcp-path`) — the app's MCP endpoint path, e.g.
93
+ * `/mcp`. Defaults to `/api/mcp`. An explicit value (even an empty
94
+ * environment value) must be valid; a malformed, missing or repeated
95
+ * value option is a usage error (exit 2) before the bridge listens.
21
96
  *
22
97
  * Apps that want their own branded bin should call `runMcpStdioBridge`
23
98
  * directly from `@happyvertical/smrt-app-cli` — this package's root export —
24
99
  * instead of going through this generic entrypoint.
25
100
  */
26
- function readArg(name) {
27
- const prefix = `--${name}=`;
28
- const match = process.argv.find((arg) => arg.startsWith(prefix));
29
- if (match) return match.slice(prefix.length);
30
- const flagIdx = process.argv.indexOf(`--${name}`);
31
- if (flagIdx >= 0 && flagIdx + 1 < process.argv.length) return process.argv[flagIdx + 1];
101
+ var parsed;
102
+ try {
103
+ parsed = parseMcpBridgeArgs(process.argv.slice(2), process.env);
104
+ } catch (error) {
105
+ if (!(error instanceof McpBridgeUsageError)) throw error;
106
+ console.error(`smrt-mcp-bridge: ${error.message}`);
107
+ process.exit(2);
32
108
  }
33
- var envPrefix = readArg("env-prefix") ?? process.env.SMRT_MCP_ENV_PREFIX ?? "";
109
+ var arg = (name) => parsed.values.get(name);
110
+ var envPrefix = arg("env-prefix") ?? process.env.SMRT_MCP_ENV_PREFIX ?? "";
34
111
  if (!envPrefix) {
35
112
  console.error("smrt-mcp-bridge: --env-prefix=<PREFIX> (or SMRT_MCP_ENV_PREFIX) is required.");
36
113
  process.exit(2);
37
114
  }
38
- var appSlug = readArg("app-slug") ?? process.env.SMRT_MCP_APP_SLUG;
39
- var defaultServerUrl = readArg("default-server-url") ?? process.env.SMRT_MCP_DEFAULT_SERVER_URL;
40
- var serverName = readArg("name") ?? process.env.SMRT_MCP_SERVER_NAME ?? "smrt-app-mcp";
41
- var serverVersion = readArg("version") ?? process.env.SMRT_MCP_SERVER_VERSION ?? "0.0.0";
115
+ var appSlug = arg("app-slug") ?? process.env.SMRT_MCP_APP_SLUG;
116
+ var defaultServerUrl = arg("default-server-url") ?? process.env.SMRT_MCP_DEFAULT_SERVER_URL;
117
+ var serverName = arg("name") ?? process.env.SMRT_MCP_SERVER_NAME ?? "smrt-app-mcp";
118
+ var serverVersion = arg("version") ?? process.env.SMRT_MCP_SERVER_VERSION ?? "0.0.0";
42
119
  await runMcpStdioBridge({
43
- transport: process.argv.includes("--legacy-rest") ? "legacy-rest" : "mcp",
120
+ transport: parsed.legacyRest ? "legacy-rest" : "mcp",
44
121
  envPrefix,
45
122
  appSlug,
46
123
  defaultServerUrl,
47
124
  requireSecureServerUrl: true,
125
+ ...parsed.mcpPath ? { mcpPath: parsed.mcpPath } : {},
48
126
  serverInfo: {
49
127
  name: serverName,
50
128
  version: serverVersion
@@ -0,0 +1,2 @@
1
+ import { h as runMcpStdioBridge } from "./config-B9dESami.js";
2
+ export { runMcpStdioBridge };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Argument parsing for the generic `smrt-mcp-bridge` binary. Every value
3
+ * option requires a non-empty value and may appear once; an explicitly
4
+ * supplied endpoint path (argument or `SMRT_MCP_PATH`, even when empty) is
5
+ * validated and never replaced by the default.
6
+ *
7
+ * @internal
8
+ */
9
+ declare const VALUE_OPTIONS: readonly ["env-prefix", "app-slug", "default-server-url", "name", "version", "mcp-path"];
10
+ type ValueOption = (typeof VALUE_OPTIONS)[number];
11
+ /** Parsed bridge configuration (before environment defaults for identity). */
12
+ export interface McpBridgeArgs {
13
+ readonly values: ReadonlyMap<ValueOption, string>;
14
+ readonly legacyRest: boolean;
15
+ /** Validated endpoint path, when one was supplied explicitly. */
16
+ readonly mcpPath?: string;
17
+ }
18
+ /** A usage error: print the message and exit non-zero without listening. */
19
+ export declare class McpBridgeUsageError extends Error {
20
+ readonly name = "McpBridgeUsageError";
21
+ }
22
+ /** Parse bridge argv and the `SMRT_MCP_PATH` environment value. */
23
+ export declare function parseMcpBridgeArgs(argv: readonly string[], env?: Readonly<Record<string, string | undefined>>): McpBridgeArgs;
24
+ export {};
25
+ //# sourceMappingURL=bridge-args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge-args.d.ts","sourceRoot":"","sources":["../src/bridge-args.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,QAAA,MAAM,aAAa,0FAOT,CAAC;AAEX,KAAK,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAElD,8EAA8E;AAC9E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAClD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,4EAA4E;AAC5E,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,SAAkB,IAAI,yBAAyB;CAChD;AAED,mEAAmE;AACnE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAM,GACrD,aAAa,CAiDf"}
package/dist/bridge.d.ts CHANGED
@@ -40,7 +40,10 @@ export interface McpStdioBridgeOptions extends CliConfigContext {
40
40
  toolsPath?: string;
41
41
  /** Modern SDK-v2 HTTP by default. Legacy REST requires explicit opt-in. */
42
42
  transport?: 'mcp' | 'legacy-rest';
43
- /** Same-server modern endpoint. Defaults to /api/mcp. */
43
+ /**
44
+ * Same-server modern endpoint path, e.g. `/mcp`. Defaults to `/api/mcp`.
45
+ * Must be an absolute path with no query, fragment, backslash or `//`.
46
+ */
44
47
  mcpPath?: string;
45
48
  /** Override the call endpoint path. Defaults to `/api/mcp/call`. */
46
49
  callPath?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,OAAO,EAEL,KAAK,cAAc,EAGnB,aAAa,EAEb,MAAM,EACP,MAAM,8BAA8B,CAAC;AAKtC,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EAIrB,KAAK,iBAAiB,EAGvB,MAAM,aAAa,CAAC;AAErB,oEAAoE;AACpE,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAYtF;;;;;GAKG;AACH,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB;IAC7D,uDAAuD;IACvD,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC;IAClC,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAoDA;AAuFD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,iBAAiB,CAAC,cAAc,CAAC,GACzC,cAAc,CAiChB;AAuCD,2EAA2E;AAC3E,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,oBAAoB,GAC7B,aAAa,CAOf;AAiCD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAEf"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAOH,OAAO,EAEL,KAAK,cAAc,EAGnB,aAAa,EAEb,MAAM,EACP,MAAM,8BAA8B,CAAC;AAKtC,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EAIrB,KAAK,iBAAiB,EAIvB,MAAM,aAAa,CAAC;AAErB,oEAAoE;AACpE,OAAO,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAYtF;;;;;GAKG;AACH,MAAM,WAAW,qBAAsB,SAAQ,gBAAgB;IAC7D,uDAAuD;IACvD,UAAU,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,KAAK,GAAG,aAAa,CAAC;IAClC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,qBAAqB,GAAG;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAoDA;AA+ED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,iBAAiB,CAAC,cAAc,CAAC,GACzC,cAAc,CAiChB;AAuCD,2EAA2E;AAC3E,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,oBAAoB,GAC7B,aAAa,CAOf;AAiCD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAIf"}
@@ -75,8 +75,7 @@ function createMcpStdioBridge(options) {
75
75
  }
76
76
  /** Native SDK-v2 forwarding, with fresh credential resolution for each request. */
77
77
  function createModernBridge(options) {
78
- const path = options.mcpPath ?? "/api/mcp";
79
- if (!path.startsWith("/") || path.startsWith("//") || path.includes("\\") || path.includes("?") || path.includes("#")) throw new TypeError("mcpPath must be a same-server absolute path.");
78
+ const path = resolveMcpPath(options.mcpPath);
80
79
  const server = new Server(options.serverInfo, {
81
80
  capabilities: {
82
81
  tools: {},
@@ -207,6 +206,7 @@ function isRecord$1(value) {
207
206
  * promise resolves once the stdio listener is installed.
208
207
  */
209
208
  async function runMcpStdioBridge(options) {
209
+ if (options.transport !== "legacy-rest") resolveMcpPath(options.mcpPath);
210
210
  serveStdio(() => createMcpStdioBridge(options).server);
211
211
  }
212
212
  //#endregion
@@ -222,6 +222,15 @@ async function runMcpStdioBridge(options) {
222
222
  * @packageDocumentation
223
223
  */
224
224
  var DEFAULT_LOCAL_SERVER = "http://localhost:5173";
225
+ /**
226
+ * Validate a same-server MCP endpoint path (default `/api/mcp`): absolute,
227
+ * with no scheme-relative `//`, backslash, query or fragment.
228
+ */
229
+ function resolveMcpPath(value) {
230
+ const path = value ?? "/api/mcp";
231
+ if (typeof path !== "string" || !path.startsWith("/") || path.startsWith("//") || path.includes("\\") || path.includes("?") || path.includes("#")) throw new TypeError("mcpPath must be a same-server absolute path.");
232
+ return path;
233
+ }
225
234
  /** Enforce the executable-safe server URL policy without echoing URL values. */
226
235
  function assertSecureServerUrl(value) {
227
236
  let url;
@@ -520,4 +529,4 @@ async function readBodyWithCap(response, maxBytes) {
520
529
  return new TextDecoder().decode(Buffer.concat(chunks.map((c) => Buffer.from(c))));
521
530
  }
522
531
  //#endregion
523
- export { getStoredToken as a, requestJson as c, saveCliConfig as d, createMcpStdioBridge as f, toMcpTransportError as h, getServerUrl as i, requestJsonResult as l, runMcpStdioBridge as m, assertSecureServerUrl as n, loadCliConfig as o, formatMcpCallResult as p, clearStoredToken as r, redactTransportValue as s, AppCliRequestError as t, saveAuth as u };
532
+ export { getStoredToken as a, requestJson as c, saveAuth as d, saveCliConfig as f, toMcpTransportError as g, runMcpStdioBridge as h, getServerUrl as i, requestJsonResult as l, formatMcpCallResult as m, assertSecureServerUrl as n, loadCliConfig as o, createMcpStdioBridge as p, clearStoredToken as r, redactTransportValue as s, AppCliRequestError as t, resolveMcpPath as u };
package/dist/config.d.ts CHANGED
@@ -50,6 +50,11 @@ export interface CliConfigContext {
50
50
  */
51
51
  expectedCredentialIssuer?: string;
52
52
  }
53
+ /**
54
+ * Validate a same-server MCP endpoint path (default `/api/mcp`): absolute,
55
+ * with no scheme-relative `//`, backslash, query or fragment.
56
+ */
57
+ export declare function resolveMcpPath(value: string | undefined): string;
53
58
  /** Enforce the executable-safe server URL policy without echoing URL values. */
54
59
  export declare function assertSecureServerUrl(value: string): void;
55
60
  /** Read the CLI config file. Missing file → empty config. */
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EAEpB,MAAM,wCAAwC,CAAC;AAGhD,yDAAyD;AACzD,MAAM,WAAW,SAAS;IACxB,2DAA2D;IAC3D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC;;OAEG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAYhE;AAED,gFAAgF;AAChF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAoBzD;AAeD,6DAA6D;AAC7D,wBAAsB,aAAa,CACjC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,SAAS,CAAC,CAgBpB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,0EAA0E;AAC1E,wBAAsB,YAAY,CAChC,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,+EAA+E;AAC/E,wBAAsB,cAAc,CAClC,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,SAAS,EAClB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmC7B;AAED,8DAA8D;AAC9D,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,uEAAuE;AACvE,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,gBAAgB,EACzB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,SAAY,GACjB,OAAO,CAAC,IAAI,CAAC,CAcf;AAED,iCAAiC;AACjC,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAID,2EAA2E;AAC3E,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,CAAC,CAAC;IACV,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,oBAAoB,CAAC;CAC7B;AAED,wDAAwD;AACxD,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC;AAE9E,0EAA0E;AAC1E,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;gBAE5B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB;CAM3D;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3C,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,WAAgB,EACtB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,CAAC,CAAC,CAMZ;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EACjD,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,WAAgB,EACtB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAmG/B;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAW5D;AAqKD,OAAO,EACL,oBAAoB,EACpB,KAAK,qBAAqB,EAC1B,iBAAiB,GAClB,MAAM,aAAa,CAAC"}
@@ -9,7 +9,7 @@
9
9
  */
10
10
  import { type AppCli, type CreateAppCliOptions } from './index.js';
11
11
  export interface AppCliExecutableConfig {
12
- cliOptions: Pick<CreateAppCliOptions, 'name' | 'envPrefix' | 'configDir' | 'defaultServerUrl' | 'requireSecureServerUrl'>;
12
+ cliOptions: Pick<CreateAppCliOptions, 'name' | 'envPrefix' | 'configDir' | 'defaultServerUrl' | 'requireSecureServerUrl' | 'mcpPath'>;
13
13
  argv: string[];
14
14
  mcp?: {
15
15
  name: string;
@@ -1 +1 @@
1
- {"version":3,"file":"executable.d.ts","sourceRoot":"","sources":["../src/executable.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,KAAK,MAAM,EACX,KAAK,mBAAmB,EAEzB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,IAAI,CACd,mBAAmB,EACjB,MAAM,GACN,WAAW,GACX,WAAW,GACX,kBAAkB,GAClB,wBAAwB,CAC3B,CAAC;IACF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,MAAM,CAAC;CACtD;AA2BD,4EAA4E;AAC5E,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,sBAAsB,CAqFxB;AAED,gFAAgF;AAChF,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,IAAI,CAAC,CAWf"}
1
+ {"version":3,"file":"executable.d.ts","sourceRoot":"","sources":["../src/executable.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,KAAK,MAAM,EACX,KAAK,mBAAmB,EAEzB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,IAAI,CACd,mBAAmB,EACjB,MAAM,GACN,WAAW,GACX,WAAW,GACX,kBAAkB,GAClB,wBAAwB,GACxB,SAAS,CACZ,CAAC;IACF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,CAAC,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,MAAM,CAAC;CACtD;AA6BD,4EAA4E;AAC5E,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,sBAAsB,CA+FxB;AAED,gFAAgF;AAChF,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,IAAI,CAAC,CAWf"}
package/dist/index.d.ts CHANGED
@@ -60,6 +60,12 @@ export interface CreateAppCliOptions {
60
60
  defaultServerUrl?: string;
61
61
  /** Enforce HTTPS or loopback HTTP for every effective server URL. */
62
62
  requireSecureServerUrl?: boolean;
63
+ /**
64
+ * Same-server path of the app's modern MCP endpoint used by
65
+ * `startMcpBridge()`. Defaults to `/api/mcp`; apps that mount
66
+ * `mountMcpAppRoute` elsewhere (for example `/mcp`) set it here or per call.
67
+ */
68
+ mcpPath?: string;
63
69
  /**
64
70
  * App-specific commands. Dispatched BEFORE built-ins (`auth`,
65
71
  * `resources`, `mcp`) and before the resource-slug dispatcher, so an
@@ -92,6 +98,8 @@ export interface AppCli {
92
98
  startMcpBridge(serverInfo?: {
93
99
  name?: string;
94
100
  version?: string;
101
+ /** Endpoint path; overrides `CreateAppCliOptions.mcpPath` (default `/api/mcp`). */
102
+ mcpPath?: string;
95
103
  }): Promise<void>;
96
104
  }
97
105
  export declare function createAppCli(options: CreateAppCliOptions): AppCli;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import { a as getStoredToken, c as requestJson, d as saveCliConfig, f as createMcpStdioBridge, i as getServerUrl, l as requestJsonResult, m as runMcpStdioBridge, n as assertSecureServerUrl, o as loadCliConfig, r as clearStoredToken, s as redactTransportValue, t as AppCliRequestError, u as saveAuth } from "./config-Ds7ofwtL.js";
2
- import { a as buildFlagParser, c as createMcpClientIdMetadataDocument, d as buildUrl, f as invokeCommand, h as findResourceBySlug, i as runAppCliExecutable, l as registerMcpClient, m as findCommand, n as createAppCli, o as classifySchema, p as fetchResourceList, r as parseAppCliExecutableConfig, s as renderResponse, t as SMRT_MCP_RESULT_METADATA_KEY, u as resolveMcpClientRegistration } from "./src-CMc9Yx_3.js";
1
+ import { a as getStoredToken, c as requestJson, d as saveAuth, f as saveCliConfig, h as runMcpStdioBridge, i as getServerUrl, l as requestJsonResult, n as assertSecureServerUrl, o as loadCliConfig, p as createMcpStdioBridge, r as clearStoredToken, s as redactTransportValue, t as AppCliRequestError } from "./config-B9dESami.js";
2
+ import { a as buildFlagParser, c as createMcpClientIdMetadataDocument, d as buildUrl, f as invokeCommand, h as findResourceBySlug, i as runAppCliExecutable, l as registerMcpClient, m as findCommand, n as createAppCli, o as classifySchema, p as fetchResourceList, r as parseAppCliExecutableConfig, s as renderResponse, t as SMRT_MCP_RESULT_METADATA_KEY, u as resolveMcpClientRegistration } from "./src-DjwsOuHK.js";
3
3
  export { AppCliRequestError, SMRT_MCP_RESULT_METADATA_KEY, assertSecureServerUrl, buildFlagParser, buildUrl, classifySchema, clearStoredToken, createAppCli, createMcpClientIdMetadataDocument, createMcpStdioBridge, fetchResourceList, findCommand, findResourceBySlug, getServerUrl, getStoredToken, invokeCommand, loadCliConfig, parseAppCliExecutableConfig, redactTransportValue, registerMcpClient, renderResponse, requestJson, requestJsonResult, resolveMcpClientRegistration, runAppCliExecutable, runMcpStdioBridge, saveAuth, saveCliConfig };
@@ -1,4 +1,4 @@
1
- import { a as getStoredToken, c as requestJson, i as getServerUrl, l as requestJsonResult, n as assertSecureServerUrl, o as loadCliConfig, r as clearStoredToken, u as saveAuth } from "./config-Ds7ofwtL.js";
1
+ import { a as getStoredToken, c as requestJson, d as saveAuth, i as getServerUrl, l as requestJsonResult, n as assertSecureServerUrl, o as loadCliConfig, r as clearStoredToken, u as resolveMcpPath } from "./config-B9dESami.js";
2
2
  import { SMRT_MCP_RESULT_METADATA_KEY as SMRT_MCP_RESULT_METADATA_KEY$1, validateDiscoveryConformanceArtifact } from "@happyvertical/smrt-users/app-contract";
3
3
  import { spawn, spawnSync } from "node:child_process";
4
4
  //#region src/discovery.ts
@@ -860,7 +860,8 @@ var CONFIG_KEYS = [
860
860
  "config-dir",
861
861
  "default-server-url",
862
862
  "mcp-server-name",
863
- "mcp-server-version"
863
+ "mcp-server-version",
864
+ "mcp-path"
864
865
  ];
865
866
  var ENV_BY_KEY = {
866
867
  name: "SMRT_APP_NAME",
@@ -868,7 +869,8 @@ var ENV_BY_KEY = {
868
869
  "config-dir": "SMRT_APP_CONFIG_DIR",
869
870
  "default-server-url": "SMRT_APP_DEFAULT_SERVER_URL",
870
871
  "mcp-server-name": "SMRT_APP_MCP_SERVER_NAME",
871
- "mcp-server-version": "SMRT_APP_MCP_SERVER_VERSION"
872
+ "mcp-server-version": "SMRT_APP_MCP_SERVER_VERSION",
873
+ "mcp-path": "SMRT_APP_MCP_PATH"
872
874
  };
873
875
  var APP_NAME_RE = /^[A-Za-z][A-Za-z0-9_-]*$/u;
874
876
  var ENV_PREFIX_RE = /^[A-Z][A-Z0-9_]*$/u;
@@ -916,6 +918,12 @@ function parseAppCliExecutableConfig(argv, env = process.env) {
916
918
  if (stdioMcp && (!mcpName || !mcpVersion)) throw new Error("MCP stdio mode requires a server name and version.");
917
919
  if (mcpName) validate(mcpName, MCP_IDENTITY_RE, "MCP server name");
918
920
  if (mcpVersion) validate(mcpVersion, MCP_IDENTITY_RE, "MCP server version");
921
+ const mcpPath = values.get("mcp-path");
922
+ if (mcpPath !== void 0) try {
923
+ resolveMcpPath(mcpPath);
924
+ } catch {
925
+ throw new Error("Invalid MCP path configuration.");
926
+ }
919
927
  const commandArgv = argv.slice(cursor);
920
928
  if (stdioMcp && commandArgv.length > 0) throw new Error("MCP stdio mode does not accept command arguments.");
921
929
  return {
@@ -924,7 +932,8 @@ function parseAppCliExecutableConfig(argv, env = process.env) {
924
932
  envPrefix,
925
933
  configDir,
926
934
  defaultServerUrl,
927
- requireSecureServerUrl: true
935
+ requireSecureServerUrl: true,
936
+ ...mcpPath === void 0 ? {} : { mcpPath }
928
937
  },
929
938
  argv: commandArgv,
930
939
  mcp: mcpName && mcpVersion ? {
@@ -983,9 +992,11 @@ function createAppCli(options) {
983
992
  return {
984
993
  run: (argv) => runCli(context, options, extraByName, argv),
985
994
  startMcpBridge: async (serverInfo) => {
986
- const { runMcpStdioBridge } = await import("./bridge-C80xQmmW.js");
995
+ const { runMcpStdioBridge } = await import("./bridge-Bl1p3Oun.js");
996
+ const mcpPath = serverInfo?.mcpPath ?? options.mcpPath;
987
997
  await runMcpStdioBridge({
988
998
  ...context,
999
+ ...mcpPath === void 0 ? {} : { mcpPath },
989
1000
  serverInfo: {
990
1001
  name: serverInfo?.name ?? `${options.name}-mcp`,
991
1002
  version: serverInfo?.version ?? "0.0.0"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@happyvertical/smrt-app-cli",
3
- "version": "0.53.3",
3
+ "version": "0.53.5",
4
4
  "description": "Reusable CLI factory for SMRT apps — branded `<name> <resource> <command>` CLI + stdio MCP bridge with decorator-driven resource discovery",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -21,12 +21,12 @@
21
21
  "AGENTS.md"
22
22
  ],
23
23
  "dependencies": {
24
- "@happyvertical/smrt-users": "0.53.3",
24
+ "@happyvertical/smrt-users": "0.53.5",
25
25
  "@modelcontextprotocol/client": "2.0.0",
26
26
  "@modelcontextprotocol/server": "2.0.0"
27
27
  },
28
28
  "devDependencies": {
29
- "@happyvertical/smrt-core": "0.53.3",
29
+ "@happyvertical/smrt-core": "0.53.5",
30
30
  "@types/node": "24.13.6",
31
31
  "typescript": "6.0.3",
32
32
  "vite": "8.1.4",
@@ -1,2 +0,0 @@
1
- import { m as runMcpStdioBridge } from "./config-Ds7ofwtL.js";
2
- export { runMcpStdioBridge };