@paretools/shared 0.12.0 → 0.13.1

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 (47) hide show
  1. package/dist/ansi.js +1 -1
  2. package/dist/ansi.js.map +1 -1
  3. package/dist/discover-tool.d.ts +19 -0
  4. package/dist/discover-tool.d.ts.map +1 -0
  5. package/dist/discover-tool.js +70 -0
  6. package/dist/discover-tool.js.map +1 -0
  7. package/dist/index.d.ts +8 -5
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +8 -5
  10. package/dist/index.js.map +1 -1
  11. package/dist/lazy-tools.d.ts +44 -0
  12. package/dist/lazy-tools.d.ts.map +1 -0
  13. package/dist/lazy-tools.js +54 -0
  14. package/dist/lazy-tools.js.map +1 -0
  15. package/dist/output.d.ts +27 -0
  16. package/dist/output.d.ts.map +1 -1
  17. package/dist/output.js +43 -0
  18. package/dist/output.js.map +1 -1
  19. package/dist/profiles.d.ts +16 -0
  20. package/dist/profiles.d.ts.map +1 -1
  21. package/dist/profiles.js +58 -0
  22. package/dist/profiles.js.map +1 -1
  23. package/dist/runner.d.ts +31 -5
  24. package/dist/runner.d.ts.map +1 -1
  25. package/dist/runner.js +140 -12
  26. package/dist/runner.js.map +1 -1
  27. package/dist/server.d.ts +10 -2
  28. package/dist/server.d.ts.map +1 -1
  29. package/dist/server.js +40 -1
  30. package/dist/server.js.map +1 -1
  31. package/dist/strict-input.d.ts +19 -0
  32. package/dist/strict-input.d.ts.map +1 -0
  33. package/dist/strict-input.js +59 -0
  34. package/dist/strict-input.js.map +1 -0
  35. package/dist/tool-filter.d.ts +12 -0
  36. package/dist/tool-filter.d.ts.map +1 -1
  37. package/dist/tool-filter.js +24 -0
  38. package/dist/tool-filter.js.map +1 -1
  39. package/dist/validation.d.ts +8 -0
  40. package/dist/validation.d.ts.map +1 -1
  41. package/dist/validation.js +17 -0
  42. package/dist/validation.js.map +1 -1
  43. package/dist/version.d.ts +16 -0
  44. package/dist/version.d.ts.map +1 -0
  45. package/dist/version.js +42 -0
  46. package/dist/version.js.map +1 -0
  47. package/package.json +3 -3
package/dist/runner.js CHANGED
@@ -1,6 +1,49 @@
1
1
  import { spawn, execFileSync } from "node:child_process";
2
+ import { normalize } from "node:path";
2
3
  import { stripAnsi } from "./ansi.js";
3
4
  import { sanitizeErrorOutput } from "./sanitize.js";
5
+ /**
6
+ * Resolves a command name to its absolute path using `where` (Windows) or
7
+ * `which` (Unix). On Windows this is used to detect whether a command is a
8
+ * .cmd/.bat wrapper so the runner can invoke it via cmd.exe without using
9
+ * `shell: true` (which triggers CodeQL alert #16).
10
+ *
11
+ * Returns the original command string if resolution fails (e.g., the command
12
+ * is already an absolute path, or `which`/`where` is unavailable).
13
+ */
14
+ function resolveCommand(cmd) {
15
+ // Skip resolution if cmd is already an absolute path
16
+ if (cmd.startsWith("/") || /^[A-Za-z]:[/\\]/.test(cmd)) {
17
+ return cmd;
18
+ }
19
+ try {
20
+ const resolver = process.platform === "win32" ? "where" : "which";
21
+ const output = execFileSync(resolver, [cmd], {
22
+ timeout: 5_000,
23
+ stdio: ["ignore", "pipe", "ignore"],
24
+ windowsHide: true,
25
+ }).toString("utf-8");
26
+ const lines = output
27
+ .split(/\r?\n/)
28
+ .map((l) => l.trim())
29
+ .filter(Boolean);
30
+ if (process.platform === "win32" && lines.length > 1) {
31
+ // On Windows, `where` returns multiple matches (e.g., `npx` and `npx.cmd`).
32
+ // Prefer .cmd/.bat entries so _buildSpawnConfig routes them through the
33
+ // cmd.exe wrapper path (Branch 2) instead of trying to execute an
34
+ // extensionless shell script with shell: false (which would fail).
35
+ const cmdLine = lines.find((l) => /\.(cmd|bat)$/i.test(l));
36
+ if (cmdLine)
37
+ return cmdLine;
38
+ }
39
+ return lines[0] || cmd;
40
+ }
41
+ catch {
42
+ // Resolution failed — fall back to the bare command name so existing
43
+ // behavior (PATH lookup by the shell/OS) is preserved.
44
+ return cmd;
45
+ }
46
+ }
4
47
  /**
5
48
  * Kills an entire process group (Unix) or process tree (Windows).
6
49
  *
@@ -87,32 +130,117 @@ export function escapeCmdArg(arg) {
87
130
  escaped = escaped.replace(/!/g, "^!");
88
131
  return escaped;
89
132
  }
133
+ // ---------------------------------------------------------------------------
134
+ // Verbatim-mode escaping helpers (cross-spawn pattern)
135
+ //
136
+ // These are used when spawning .cmd/.bat files via cmd.exe with
137
+ // windowsVerbatimArguments: true, where libuv performs NO quoting.
138
+ // Algorithm ported from cross-spawn (https://github.com/moxystudio/node-cross-spawn).
139
+ // ---------------------------------------------------------------------------
140
+ /** cmd.exe metacharacters that need caret-escaping. */
141
+ const META_CHARS_RE = /([()\][%!^"`<>&|;, *?])/g;
142
+ /** Caret-escape cmd.exe metacharacters in a command path. */
143
+ function escapeCommandForVerbatim(cmd) {
144
+ return cmd.replace(META_CHARS_RE, "^$1");
145
+ }
146
+ /**
147
+ * Escapes a single argument for cmd.exe in windowsVerbatimArguments mode.
148
+ *
149
+ * Based on https://qntm.org/cmd (same algorithm as cross-spawn):
150
+ * 1. Handle backslash+quote sequences for MSVC C runtime parsing
151
+ * 2. Wrap in double quotes
152
+ * 3. Caret-escape cmd.exe metacharacters on the quoted result
153
+ */
154
+ function escapeArgForVerbatim(arg) {
155
+ // Sequence of backslashes followed by a double quote:
156
+ // double up all the backslashes and escape the double quote.
157
+ // The outer `?` makes the capture group optional so bare `"` (zero
158
+ // preceding backslashes) is also matched — matching cross-spawn exactly.
159
+ let escaped = arg.replace(/(?=(\\+?)?)\1"/g, '$1$1\\"');
160
+ // Sequence of backslashes at end of string (will be followed by our closing quote):
161
+ // double up all the backslashes
162
+ escaped = escaped.replace(/(?=(\\+?)?)\1$/, "$1$1");
163
+ // Wrap in double quotes, then caret-escape metacharacters
164
+ escaped = `"${escaped}"`;
165
+ escaped = escaped.replace(META_CHARS_RE, "^$1");
166
+ return escaped;
167
+ }
168
+ /**
169
+ * Determines how to spawn a command, handling Windows .cmd/.bat wrappers
170
+ * without using `shell: true` (which triggers CodeQL alert #16).
171
+ *
172
+ * @internal — Exported for unit testing only. Use `run()` instead.
173
+ *
174
+ * Branches:
175
+ * 1. Explicit `shell: true` — pass cmd directly, don't resolve (caller wants shell features)
176
+ * 2. Windows native .exe/.com — spawn resolved path directly
177
+ * 3. Windows non-exe (cmd/bat/extensionless/bare) — cmd.exe /d /s /c with windowsVerbatimArguments
178
+ * 4. Unix — spawn cmd directly, execvp handles PATH
179
+ */
180
+ export function _buildSpawnConfig(cmd, args, opts, platform = process.platform, resolver = resolveCommand) {
181
+ // Branch 1: Explicit shell: true — caller wants shell features (pipes, globs).
182
+ // Pass cmd directly to spawn with shell: true — do NOT call resolveCommand,
183
+ // which breaks the taint flow that CodeQL flags (environment → shell command).
184
+ if (opts?.shell === true) {
185
+ const safeArgs = platform === "win32" ? args.map(escapeCmdArg) : args;
186
+ return { command: cmd, args: safeArgs, shell: true, windowsVerbatimArguments: false };
187
+ }
188
+ // Branches 2+3: Windows without shell
189
+ if (platform === "win32") {
190
+ const resolved = resolver(cmd);
191
+ // Branch 2: Native .exe/.com — spawn resolved path directly.
192
+ // Only these extensions are true PE executables that CreateProcessW can run
193
+ // without a shell. This matches cross-spawn's isExecutableRegExp check.
194
+ if (/\.(exe|com)$/i.test(resolved)) {
195
+ return { command: resolved, args, shell: false, windowsVerbatimArguments: false };
196
+ }
197
+ // Branch 3: Everything else (.cmd, .bat, extensionless, bare names) needs
198
+ // cmd.exe to interpret it. Use cross-spawn pattern:
199
+ // cmd.exe /d /s /c "escaped-command escaped-args"
200
+ // with windowsVerbatimArguments: true so libuv doesn't re-quote.
201
+ // shell: false ensures resolveCommand output never enters a shell command
202
+ // string from Node's perspective — satisfying CodeQL.
203
+ // Normalize posix slashes to Windows backslashes (cross-spawn does this too).
204
+ const normalizedCmd = normalize(resolved);
205
+ const escapedParts = [
206
+ escapeCommandForVerbatim(normalizedCmd),
207
+ ...args.map((a) => escapeArgForVerbatim(a)),
208
+ ];
209
+ return {
210
+ command: "cmd.exe",
211
+ args: ["/d", "/s", "/c", `"${escapedParts.join(" ")}"`],
212
+ shell: false,
213
+ windowsVerbatimArguments: true,
214
+ };
215
+ }
216
+ // Branch 4: Unix — spawn cmd directly with shell: false.
217
+ // execvp handles PATH lookup natively, no resolution needed.
218
+ return { command: cmd, args, shell: false, windowsVerbatimArguments: false };
219
+ }
90
220
  /**
91
221
  * Executes a command and returns cleaned output with ANSI codes stripped.
92
222
  * Uses spawn (not exec) to avoid shell injection. The child is spawned in its
93
223
  * own process group (`detached: true` on Unix) so that on timeout we can kill
94
224
  * the entire group — preventing orphaned grandchild processes.
95
225
  *
96
- * On Windows, shell is enabled so that .cmd/.bat wrappers (like npx) can be
97
- * executed — args are still passed as an array so they remain properly escaped.
226
+ * Shell mode defaults to `false` on all platforms. On Windows, .cmd/.bat
227
+ * wrappers (like npm, npx) are automatically handled via cmd.exe invocation
228
+ * with windowsVerbatimArguments (cross-spawn pattern), avoiding shell injection.
229
+ *
230
+ * Callers can opt in to `shell: true` for shell features (pipes, globs),
231
+ * but this bypasses security protections — use only with trusted input.
98
232
  *
99
233
  * Throws on system-level errors (command not found, permission denied, timeout).
100
234
  * Normal non-zero exit codes are returned in the result, not thrown.
101
235
  */
102
236
  export function run(cmd, args, opts) {
103
237
  return new Promise((resolve, reject) => {
104
- // Determine shell mode: default to true on Windows (for .cmd/.bat wrappers),
105
- // but allow callers to override (e.g., git uses shell:false to avoid cmd.exe
106
- // mangling format strings that contain < > characters).
107
- const useShell = opts?.shell ?? process.platform === "win32";
108
- // On Windows with shell mode, escape cmd.exe metacharacters to prevent
109
- // environment variable expansion and command injection via special chars.
110
- // See escapeCmdArg() for details on what is escaped and why.
111
- const safeArgs = useShell && process.platform === "win32" ? args.map(escapeCmdArg) : args;
112
- const child = spawn(cmd, safeArgs, {
238
+ const config = _buildSpawnConfig(cmd, args, { shell: opts?.shell });
239
+ const child = spawn(config.command, config.args, {
113
240
  cwd: opts?.cwd,
114
241
  env: opts?.env ? (opts.replaceEnv ? opts.env : { ...process.env, ...opts.env }) : undefined,
115
- shell: useShell,
242
+ shell: config.shell,
243
+ windowsVerbatimArguments: config.windowsVerbatimArguments,
116
244
  // Unix: creates a new process group via setsid(2) so we can kill the
117
245
  // entire group on timeout (prevents orphaned grandchild processes).
118
246
  // Windows: skip — detached on Windows creates a visible console window,
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type LazyToolManager } from "./lazy-tools.js";
2
3
  export interface CreateServerOptions {
3
4
  /** Package name, e.g. "@paretools/git" */
4
5
  name: string;
@@ -6,8 +7,15 @@ export interface CreateServerOptions {
6
7
  version: string;
7
8
  /** Human-readable server instructions for MCP clients */
8
9
  instructions: string;
9
- /** Callback that registers all tools on the server */
10
- registerTools: (server: McpServer) => void;
10
+ /**
11
+ * Callback that registers all tools on the server.
12
+ *
13
+ * When lazy mode is active (`PARE_LAZY=true`), the second argument is a
14
+ * `LazyToolManager` that the callback can use to defer non-core tools.
15
+ * When lazy mode is off, the second argument is `undefined` and all tools
16
+ * should be registered directly.
17
+ */
18
+ registerTools: (server: McpServer, lazyManager?: LazyToolManager) => void;
11
19
  }
12
20
  /**
13
21
  * Creates an MCP server with the standard Pare boilerplate:
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,aAAa,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;CAC5C;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CAWnF"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQpE,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAI9E,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,aAAa,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,eAAe,KAAK,IAAI,CAAC;CAC3E;AA0BD;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,SAAS,CAAC,CA0BnF"}
package/dist/server.js CHANGED
@@ -1,5 +1,31 @@
1
1
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
2
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { ErrorCode, ListResourcesRequestSchema, McpError, ReadResourceRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
4
+ import { createLazyToolManager } from "./lazy-tools.js";
5
+ import { isLazyEnabled } from "./tool-filter.js";
6
+ import { strictifyInputSchema } from "./strict-input.js";
7
+ /**
8
+ * Wraps an McpServer so that every `registerTool` call automatically applies
9
+ * strict input validation (rejects unknown parameters) to the tool's
10
+ * inputSchema. This prevents AI agents from silently passing wrong-but-
11
+ * plausible parameter names (e.g. `branch` instead of `ref`).
12
+ */
13
+ function applyStrictInputSchemas(server) {
14
+ const original = server.registerTool.bind(server);
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ server.registerTool = function (...args) {
17
+ // The config-based overload: registerTool(name, config, callback)
18
+ // config is always the second argument and contains inputSchema
19
+ if (args.length >= 2 && typeof args[1] === "object" && args[1] !== null) {
20
+ const config = args[1];
21
+ if (config.inputSchema) {
22
+ config.inputSchema = strictifyInputSchema(config.inputSchema);
23
+ }
24
+ }
25
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
26
+ return original(...args);
27
+ };
28
+ }
3
29
  /**
4
30
  * Creates an MCP server with the standard Pare boilerplate:
5
31
  * instantiates McpServer, registers tools via callback, connects StdioServerTransport.
@@ -9,7 +35,20 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
9
35
  export async function createServer(options) {
10
36
  const { name, version, instructions, registerTools } = options;
11
37
  const server = new McpServer({ name, version }, { instructions });
12
- registerTools(server);
38
+ applyStrictInputSchemas(server);
39
+ const lazy = isLazyEnabled();
40
+ const lazyManager = lazy ? createLazyToolManager(server) : undefined;
41
+ registerTools(server, lazyManager);
42
+ // Pare servers are tool-only and register no resources. Some MCP clients
43
+ // (e.g. OpenCode) fire `resources/read` after every structured tool call,
44
+ // which causes a -32603 InternalError because no resource handler exists.
45
+ // Register stub handlers so those requests receive a clean -32602 response
46
+ // ("Resource not found") instead of the confusing generic error.
47
+ server.server.registerCapabilities({ resources: {} });
48
+ server.server.setRequestHandler(ListResourcesRequestSchema, () => ({ resources: [] }));
49
+ server.server.setRequestHandler(ReadResourceRequestSchema, (request) => {
50
+ throw new McpError(ErrorCode.InvalidParams, `Resource not found: ${request.params.uri}`);
51
+ });
13
52
  const transport = new StdioServerTransport();
14
53
  await server.connect(transport);
15
54
  return server;
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAajF;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA4B;IAC7D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAE/D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IAElE,aAAa,CAAC,MAAM,CAAC,CAAC;IAEtB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,SAAS,EACT,0BAA0B,EAC1B,QAAQ,EACR,yBAAyB,GAC1B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,qBAAqB,EAAwB,MAAM,iBAAiB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAoBzD;;;;;GAKG;AACH,SAAS,uBAAuB,CAAC,MAAiB;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAElD,8DAA8D;IAC7D,MAAc,CAAC,YAAY,GAAG,UAAU,GAAG,IAAW;QACrD,kEAAkE;QAClE,gEAAgE;QAChE,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxE,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACvB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,MAAM,CAAC,WAAW,GAAG,oBAAoB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,iEAAiE;QACjE,OAAQ,QAAyC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA4B;IAC7D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAE/D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC;IAClE,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAEhC,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAErE,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEnC,yEAAyE;IACzE,0EAA0E;IAC1E,0EAA0E;IAC1E,2EAA2E;IAC3E,iEAAiE;IACjE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACvF,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,yBAAyB,EAAE,CAAC,OAAO,EAAE,EAAE;QACrE,MAAM,IAAI,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,uBAAuB,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3F,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Converts a raw Zod shape (used as `inputSchema` in tool registration) into
3
+ * a strict Zod object schema that rejects unrecognized properties.
4
+ *
5
+ * By default the MCP SDK wraps raw shapes with `z.object(shape)` which
6
+ * silently strips unknown keys. This causes confusing errors when an AI agent
7
+ * passes a wrong-but-plausible parameter name (e.g. `branch` instead of `ref`).
8
+ *
9
+ * Applying `z.strictObject(shape)` instead causes validation to fail with a
10
+ * clear error message listing the unrecognized key.
11
+ */
12
+ /**
13
+ * If `schema` is a raw Zod shape, wraps it in `z.strictObject()` so that
14
+ * unknown parameters are rejected during validation. If the schema is already
15
+ * a Zod schema instance, applies `.strict()` if it's an object schema.
16
+ * Otherwise returns the schema unchanged.
17
+ */
18
+ export declare function strictifyInputSchema<T>(schema: T): T;
19
+ //# sourceMappingURL=strict-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-input.d.ts","sourceRoot":"","sources":["../src/strict-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA2BH;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAiBpD"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Converts a raw Zod shape (used as `inputSchema` in tool registration) into
3
+ * a strict Zod object schema that rejects unrecognized properties.
4
+ *
5
+ * By default the MCP SDK wraps raw shapes with `z.object(shape)` which
6
+ * silently strips unknown keys. This causes confusing errors when an AI agent
7
+ * passes a wrong-but-plausible parameter name (e.g. `branch` instead of `ref`).
8
+ *
9
+ * Applying `z.strictObject(shape)` instead causes validation to fail with a
10
+ * clear error message listing the unrecognized key.
11
+ */
12
+ import { z } from "zod";
13
+ /**
14
+ * Checks whether a value is a Zod schema instance (has `_zod` for v4).
15
+ */
16
+ function isZodSchema(value) {
17
+ return typeof value === "object" && value !== null && ("_zod" in value || "_def" in value);
18
+ }
19
+ /**
20
+ * Checks whether a value is a "raw shape" — a plain object whose values are
21
+ * Zod schemas. This is the shorthand form used by all Pare tools:
22
+ * `{ path: z.string(), maxCount: z.number() }`.
23
+ */
24
+ function isRawShape(value) {
25
+ if (typeof value !== "object" || value === null)
26
+ return false;
27
+ // If it's already a Zod schema instance, it's NOT a raw shape
28
+ if (isZodSchema(value))
29
+ return false;
30
+ const entries = Object.values(value);
31
+ // Empty shape is valid (tools with no parameters)
32
+ if (entries.length === 0)
33
+ return true;
34
+ // A raw shape has values that are Zod schemas
35
+ return entries.some((v) => isZodSchema(v));
36
+ }
37
+ /**
38
+ * If `schema` is a raw Zod shape, wraps it in `z.strictObject()` so that
39
+ * unknown parameters are rejected during validation. If the schema is already
40
+ * a Zod schema instance, applies `.strict()` if it's an object schema.
41
+ * Otherwise returns the schema unchanged.
42
+ */
43
+ export function strictifyInputSchema(schema) {
44
+ if (!schema)
45
+ return schema;
46
+ if (isRawShape(schema)) {
47
+ // Convert raw shape to strict object schema.
48
+ // The MCP SDK's normalizeObjectSchema will recognize this as a pre-built
49
+ // Zod v4 schema and use it directly instead of wrapping in z.object().
50
+ return z.strictObject(schema);
51
+ }
52
+ // If it's already a Zod object schema, apply .strict()
53
+ const schemaObj = schema;
54
+ if (isZodSchema(schema) && typeof schemaObj.strict === "function") {
55
+ return schemaObj.strict();
56
+ }
57
+ return schema;
58
+ }
59
+ //# sourceMappingURL=strict-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strict-input.js","sourceRoot":"","sources":["../src/strict-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,SAAS,WAAW,CAAC,KAAc;IACjC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,CAAC,CAAC;AAC7F,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,8DAA8D;IAC9D,IAAI,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrC,kDAAkD;IAClD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,8CAA8C;IAC9C,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAI,MAAS;IAC/C,IAAI,CAAC,MAAM;QAAE,OAAO,MAAM,CAAC;IAE3B,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,6CAA6C;QAC7C,yEAAyE;QACzE,uEAAuE;QACvE,OAAO,CAAC,CAAC,YAAY,CAAC,MAAmC,CAAiB,CAAC;IAC7E,CAAC;IAED,uDAAuD;IACvD,MAAM,SAAS,GAAG,MAAiC,CAAC;IACpD,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAClE,OAAQ,SAAS,CAAC,MAAwB,EAAO,CAAC;IACpD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -22,6 +22,18 @@
22
22
  */
23
23
  import { _resetProfileCache } from "./profiles.js";
24
24
  export { _resetProfileCache };
25
+ /**
26
+ * Returns `true` when lazy tool loading is enabled.
27
+ *
28
+ * Lazy mode is activated by setting `PARE_LAZY=true` (case-insensitive).
29
+ * When active, only core tools are registered at startup; extended tools
30
+ * are deferred and discoverable via the `discover-tools` meta-tool.
31
+ *
32
+ * Lazy mode is NOT active when `PARE_PROFILE=full` is explicitly set,
33
+ * or when any explicit tool filter (`PARE_TOOLS`, `PARE_{SERVER}_TOOLS`)
34
+ * is in use — those filters already provide precise control.
35
+ */
36
+ export declare function isLazyEnabled(): boolean;
25
37
  /**
26
38
  * Determines whether a tool should be registered based on environment variables.
27
39
  *
@@ -1 +1 @@
1
- {"version":3,"file":"tool-filter.d.ts","sourceRoot":"","sources":["../src/tool-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAkB,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA0BhF"}
1
+ {"version":3,"file":"tool-filter.d.ts","sourceRoot":"","sources":["../src/tool-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAkB,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,IAAI,OAAO,CAWvC;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA0BhF"}
@@ -22,6 +22,30 @@
22
22
  */
23
23
  import { resolveProfile, _resetProfileCache } from "./profiles.js";
24
24
  export { _resetProfileCache };
25
+ /**
26
+ * Returns `true` when lazy tool loading is enabled.
27
+ *
28
+ * Lazy mode is activated by setting `PARE_LAZY=true` (case-insensitive).
29
+ * When active, only core tools are registered at startup; extended tools
30
+ * are deferred and discoverable via the `discover-tools` meta-tool.
31
+ *
32
+ * Lazy mode is NOT active when `PARE_PROFILE=full` is explicitly set,
33
+ * or when any explicit tool filter (`PARE_TOOLS`, `PARE_{SERVER}_TOOLS`)
34
+ * is in use — those filters already provide precise control.
35
+ */
36
+ export function isLazyEnabled() {
37
+ // Explicit tool filters take precedence — no lazy behavior.
38
+ if (process.env.PARE_TOOLS !== undefined)
39
+ return false;
40
+ // Explicit "full" profile means load everything.
41
+ const profile = process.env.PARE_PROFILE;
42
+ if (profile !== undefined && profile.trim().toLowerCase() === "full")
43
+ return false;
44
+ const raw = process.env.PARE_LAZY;
45
+ if (raw === undefined)
46
+ return false;
47
+ return raw.trim().toLowerCase() === "true";
48
+ }
25
49
  /**
26
50
  * Determines whether a tool should be registered based on environment variables.
27
51
  *
@@ -1 +1 @@
1
- {"version":3,"file":"tool-filter.js","sourceRoot":"","sources":["../src/tool-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,QAAgB;IACrE,qDAAqD;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACzC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,UAAU,IAAI,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,2CAA2C;IAC3C,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,UAAU,IAAI,QAAQ,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,8CAA8C;IAC9C,MAAM,MAAM,GAAG,QAAQ,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;IAC3E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,2BAA2B;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"tool-filter.js","sourceRoot":"","sources":["../src/tool-filter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa;IAC3B,4DAA4D;IAC5D,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAEvD,iDAAiD;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IACzC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAEnF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IAClC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;AAC7C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,QAAgB;IACrE,qDAAqD;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;IACzC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,UAAU,IAAI,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,2CAA2C;IAC3C,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO,UAAU,CAAC,GAAG,CAAC,GAAG,UAAU,IAAI,QAAQ,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,8CAA8C;IAC9C,MAAM,MAAM,GAAG,QAAQ,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;IAC3E,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,2BAA2B;IAC3B,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -1,3 +1,11 @@
1
+ /**
2
+ * Preprocess function for Zod schemas that coerces a JSON string to an array.
3
+ * Handles the case where MCP clients serialize array parameters as JSON strings
4
+ * before the tool schema is fully loaded.
5
+ *
6
+ * Usage: `z.preprocess(coerceJsonArray, z.array(z.string()))`
7
+ */
8
+ export declare function coerceJsonArray(val: unknown): unknown;
1
9
  /**
2
10
  * Validates that a string argument is safe to pass as a positional argument to a CLI tool.
3
11
  * Prevents flag injection attacks (e.g., passing "--output=/etc/passwd" as a ref name).
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAM5E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAMzE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CASzE;AAiCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAwB1D"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAOrD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAM5E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAMzE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CASzE;AAiCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAwB1D"}
@@ -1,3 +1,20 @@
1
+ /**
2
+ * Preprocess function for Zod schemas that coerces a JSON string to an array.
3
+ * Handles the case where MCP clients serialize array parameters as JSON strings
4
+ * before the tool schema is fully loaded.
5
+ *
6
+ * Usage: `z.preprocess(coerceJsonArray, z.array(z.string()))`
7
+ */
8
+ export function coerceJsonArray(val) {
9
+ if (typeof val !== "string")
10
+ return val;
11
+ try {
12
+ return JSON.parse(val);
13
+ }
14
+ catch {
15
+ return val;
16
+ }
17
+ }
1
18
  /**
2
19
  * Validates that a string argument is safe to pass as a positional argument to a CLI tool.
3
20
  * Prevents flag injection attacks (e.g., passing "--output=/etc/passwd" as a ref name).
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,SAAiB;IACpE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,WAAW,SAAS,MAAM,KAAK,kEAAkE,CAClG,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,SAAiB;IACjE,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,WAAW,SAAS,MAAM,KAAK,yDAAyD,CACzF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,SAAiB;IACjE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,WAAW,SAAS,YAAY,KAAK,kEAAkE,CACxG,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,KAAK;IACL,KAAK;IACL,OAAO;IACP,IAAI;IACJ,QAAQ;IACR,SAAS;IACT,KAAK;IACL,SAAS;IACT,MAAM;IACN,SAAS;IACT,QAAQ;IACR,OAAO;IACP,IAAI;IACJ,OAAO;CACR,CAAC,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,+EAA+E;IAC/E,MAAM,IAAI,GACR,OAAO;SACJ,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,EAAE;QACN,EAAE,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IAEhD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,YAAY,OAAO,+CAA+C;YAChE,YAAY,CAAC,GAAG,sBAAsB,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9D,CAAC;IACJ,CAAC;IAED,2FAA2F;IAC3F,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,IAAI,CACV,8CAA8C,OAAO,KAAK;YACxD,sBAAsB,IAAI,yCAAyC;YACnE,8CAA8C,CACjD,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,SAAiB;IACpE,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,WAAW,SAAS,MAAM,KAAK,kEAAkE,CAClG,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,SAAiB;IACjE,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,WAAW,SAAS,MAAM,KAAK,yDAAyD,CACzF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,SAAiB;IACjE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CACb,WAAW,SAAS,YAAY,KAAK,kEAAkE,CACxG,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IACrC,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,KAAK;IACL,KAAK;IACL,OAAO;IACP,IAAI;IACJ,QAAQ;IACR,SAAS;IACT,KAAK;IACL,SAAS;IACT,MAAM;IACN,SAAS;IACT,QAAQ;IACR,OAAO;IACP,IAAI;IACJ,OAAO;CACR,CAAC,CAAC;AAEH;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,+EAA+E;IAC/E,MAAM,IAAI,GACR,OAAO;SACJ,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,EAAE;QACN,EAAE,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IAEhD,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,YAAY,OAAO,+CAA+C;YAChE,YAAY,CAAC,GAAG,sBAAsB,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9D,CAAC;IACJ,CAAC;IAED,2FAA2F;IAC3F,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,IAAI,CACV,8CAA8C,OAAO,KAAK;YACxD,sBAAsB,IAAI,yCAAyC;YACnE,8CAA8C,CACjD,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Reads the `version` field from the nearest `package.json` relative to
3
+ * the calling module's `import.meta.url`.
4
+ *
5
+ * Walks up directory tree from the given module URL until it finds a
6
+ * `package.json` with a `version` field, or returns `"0.0.0"` as a
7
+ * fallback.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { readPackageVersion } from "@paretools/shared";
12
+ * const version = readPackageVersion(import.meta.url);
13
+ * ```
14
+ */
15
+ export declare function readPackageVersion(importMetaUrl: string): string;
16
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAwBhE"}
@@ -0,0 +1,42 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ /**
5
+ * Reads the `version` field from the nearest `package.json` relative to
6
+ * the calling module's `import.meta.url`.
7
+ *
8
+ * Walks up directory tree from the given module URL until it finds a
9
+ * `package.json` with a `version` field, or returns `"0.0.0"` as a
10
+ * fallback.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import { readPackageVersion } from "@paretools/shared";
15
+ * const version = readPackageVersion(import.meta.url);
16
+ * ```
17
+ */
18
+ export function readPackageVersion(importMetaUrl) {
19
+ let dir = dirname(fileURLToPath(importMetaUrl));
20
+ // Walk up to find the nearest package.json with a version field
21
+ for (;;) {
22
+ try {
23
+ const pkgPath = join(dir, "package.json");
24
+ const raw = readFileSync(pkgPath, "utf-8");
25
+ const pkg = JSON.parse(raw);
26
+ if (pkg.version) {
27
+ return pkg.version;
28
+ }
29
+ }
30
+ catch {
31
+ // No package.json in this directory, keep walking up
32
+ }
33
+ const parent = dirname(dir);
34
+ if (parent === dir) {
35
+ // Reached filesystem root
36
+ break;
37
+ }
38
+ dir = parent;
39
+ }
40
+ return "0.0.0";
41
+ }
42
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,aAAqB;IACtD,IAAI,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;IAEhD,gEAAgE;IAChE,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;YAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;YACpD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChB,OAAO,GAAG,CAAC,OAAO,CAAC;YACrB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;QACvD,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACnB,0BAA0B;YAC1B,MAAM;QACR,CAAC;QACD,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paretools/shared",
3
- "version": "0.12.0",
3
+ "version": "0.13.1",
4
4
  "description": "Shared utilities for Pare MCP servers",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -40,11 +40,11 @@
40
40
  "dist"
41
41
  ],
42
42
  "dependencies": {
43
- "@modelcontextprotocol/sdk": "^1.26.0",
43
+ "@modelcontextprotocol/sdk": "^1.27.1",
44
44
  "zod": "^4.3.6"
45
45
  },
46
46
  "devDependencies": {
47
- "@types/node": "^25.2.3",
47
+ "@types/node": "^25.3.3",
48
48
  "typescript": "^5.7.0",
49
49
  "vitest": "^4.0.18",
50
50
  "@paretools/tsconfig": "0.0.0"