@runa-cmd/mcp 0.2.0-beta.5 → 0.2.0-beta.7

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/CHANGELOG.md CHANGED
@@ -1,5 +1,74 @@
1
1
  # @runa-cmd/mcp
2
2
 
3
+ ## 0.2.0-beta.7
4
+
5
+ ### Minor Changes
6
+
7
+ - 7fd5dd6: Error codes are now a list you can import. `ERROR_CODES` from `@runa-cmd/core` has every code core throws, and the README says when each one comes up. `isRunaError(error, code?)` tells if something is a `RunaError` with that code, and works even when two copies of `@runa-cmd/core` are installed, where `instanceof` fails. It takes your own codes too, as a `CommandError`'s:
8
+
9
+ ```ts
10
+ if (isRunaError(error, ERROR_CODES.INVALID_CONFIG)) {
11
+ /* the config file is wrong */
12
+ }
13
+ if (isRunaError(error, "DEPLOY_FAILED")) {
14
+ /* your own code */
15
+ }
16
+ ```
17
+
18
+ `@runa-cmd/mcp` exports `ERROR_CLASSES`, the `class` values of a failed call, and `MCP_ERROR_CODES`, its own startup codes. Its README lists each class with its `effect`.
19
+
20
+ **Breaking:** three codes are renamed, before they're fixed for 1.0.
21
+
22
+ | Before | Now |
23
+ | ----------------------------------------------------------------- | ----------------------------------- |
24
+ | `CONFIG_INVALID` (a `ConfigError`) | `INVALID_CONFIG` |
25
+ | `OPTION_NAME`, when two keys give the same flag | `OPTION_COLLISION`, as with globals |
26
+ | `OPTION_NAME`, when a boolean `noCache` clashes with `--no-cache` | `INVALID_OPTION_NAME` |
27
+
28
+ **Migration:** compare against the new names, or against `ERROR_CODES`. Messages and exit codes don't change.
29
+
30
+ - db60a2d: A tool call that's missing a value only the operator gives, as an option's env var, now fails with `class: "not_configured"`, not `invalid_input`. Its text starts with `The operator of this server has to set NOTES_FILE. It isn't a value you can send.`, so a model doesn't take it as its own mistake, nor ask the user for it. The server also says it at startup, on stderr, one line per tool, and keeps serving:
31
+
32
+ ```
33
+ mcpPlugin: tool 'add' can't run until the operator sets NOTES_FILE (--file).
34
+ ```
35
+
36
+ An input error the model can fix names the key it sent, as `Invalid value for 'limit': must be greater than 0`, instead of `--limit`, a flag it never saw. The line about an operator's value still names the flag and the variable, for whoever runs the server.
37
+
38
+ **Breaking:** a plain `Error` thrown from `run()` is now `class: "crashed"`, with `The command did not finish.`, instead of `command_failed`. Only a `CommandError` is `command_failed`, with its message as you wrote it. A client can now tell a failure you foresaw from a bug, as the README always said.
39
+
40
+ **Migration:** to have the model read your message as is, throw a `CommandError`.
41
+
42
+ - ba4bdee: **Breaking:** a tool call that fails because a value the operator gave breaks its schema, in env or in the config file, now comes with `class: "not_configured"`, as a missing value does, instead of `invalid_input`. Its text says what the operator has to fix, never the value, so a model doesn't take it as its own mistake:
43
+
44
+ ```
45
+ The operator of this server has to fix 'deploy.replicas' in the config file. It isn't a value you can send.
46
+ ```
47
+
48
+ The server also says it at startup, on stderr, with the reason, and keeps serving the other tools:
49
+
50
+ ```
51
+ mcpPlugin: tool 'deploy' can't run until the operator fixes DEPLOY_ENV (--env): expected one of: staging, production.
52
+ ```
53
+
54
+ Values are checked with the rules the CLI uses, so `"5"` for a number in the config file is fine.
55
+
56
+ - 67e3865: **Breaking:** a tool call that sends an option the operator fixed now fails, and nothing runs:
57
+
58
+ ```
59
+ 'replicas' is set by the operator of this server, so it can't be sent.
60
+
61
+ The command did not run.
62
+ ```
63
+
64
+ It comes with `class: "invalid_input"` and `effect: "none"`, and never shows the operator's value. Before, the value was dropped and the call answered success with the operator's value: a model that sent `replicas: 5` got back a deploy with 2, and believed it had done what it was asked. An option that declares `env`, or has a value in the config file, is the operator's. To let the model choose it, list it in `expose`.
65
+
66
+ ### Patch Changes
67
+
68
+ - 6592957: Each plugin requires the `@runa-cmd/core` it was released with. The peer of `help` was `^0.2.0-beta.1`, so npm could install it with an older `core` where `defaultDescription` and the `GLOBAL OPTIONS` section did nothing, without a warning. Until 1.0, the peer is always core's current version.
69
+
70
+ ## 0.2.0-beta.6
71
+
3
72
  ## 0.2.0-beta.5
4
73
 
5
74
  ### Minor Changes
package/README.md CHANGED
@@ -11,7 +11,9 @@ pnpm add @runa-cmd/mcp@beta
11
11
  ```
12
12
 
13
13
  > Peer dependencies: `@runa-cmd/core` and `zod ^4.0.0`.
14
- > Runtime dependency: `@modelcontextprotocol/sdk ^1.29.0`.
14
+ > Runtime dependency: `@modelcontextprotocol/sdk ^1.32.2`.
15
+ >
16
+ > **New to it?** [Your CLI as an agent's tools](https://github.com/jrodrigopuca/runa-cmd/blob/main/guides/mcp.md) builds a CLI for agents step by step, and tests it as a client does.
15
17
 
16
18
  ## Quick Start
17
19
 
@@ -109,6 +111,35 @@ A failed call says what happened, not what to do next. `_meta['runa/error']` tel
109
111
 
110
112
  A `CommandError` is the exception: the model reads your message as you wrote it, with `effect: "unknown"`, because only you know what the command did. To guide the model, say it there: `throw new CommandError('The proxy is off. Start it first.')`.
111
113
 
114
+ The `class` says what failed. Each one is part of the [contract](../../VERSIONING.md), and `ERROR_CLASSES` lists them:
115
+
116
+ | `class` | `effect` | When |
117
+ |---|---|---|
118
+ | `unknown_tool` | `none` | No tool has that name, or it's excluded |
119
+ | `invalid_input` | `none` | An argument or option the model sent is missing or breaks its schema |
120
+ | `not_configured` | `none` | A value only the operator gives is missing, as an option's env var, or breaks its schema, in env or in the config file. The model can't send it nor fix it, so the text says what the operator has to set or fix |
121
+ | `rejected` | `none` | The call failed before `run()`, as in a hook or a middleware |
122
+ | `not_run` | `none` | The call ended well without running the command, because a hook or a middleware skipped it |
123
+ | `command_failed` | `unknown` | `run()` threw a `CommandError`: the failure you wrote, with your message as is |
124
+ | `crashed` | `none` or `unknown` | `run()` threw any other error, as a plain `Error`: a bug, not a failure you foresaw. Also when the process ends without saying why |
125
+ | `invalid_output` | `completed` | `run()` returned a value its `output` schema rejects |
126
+ | `output_too_large` | `completed` | The result is over `maxOutput` |
127
+ | `after_run_failed` | `completed` | Something failed after `run()` returned, as an `afterRun` hook |
128
+ | `cancelled` | `unknown` | The client cancelled the call, or the server closed |
129
+
130
+ ```ts
131
+ import { ERROR_CLASSES, type ErrorClass } from '@runa-cmd/mcp';
132
+
133
+ const retryable = (found: ErrorClass) => found === ERROR_CLASSES.CANCELLED;
134
+ ```
135
+
136
+ These stop the server at startup, with exit 1, and `MCP_ERROR_CODES` lists them. The rest of the codes are [core's](../core/README.md#error-codes):
137
+
138
+ | Code | When |
139
+ |---|---|
140
+ | `MCP_INVALID_TOOLS` | The tool settings can't be met: `exclude` or `tools` names a tool or option that doesn't exist, an excluded tool has settings, a tool is read-only and destructive, an option is exposed and server-only, a `maxOutput` isn't a positive number, or a server-only option has no value |
141
+ | `MCP_SELF_CHECK_FAILED` | The CLI can't start itself as a subprocess, as a compiled binary without `selfCommand` |
142
+
112
143
  **Retrying is up to you and whoever approves the calls.** Runa knows how far a command got, not whether repeating it is a good idea. If a command fails partway, a model only sees `unknown` and may run it again, so make that safe, or say so in your message.
113
144
 
114
145
  ### Cancellation
@@ -151,7 +182,9 @@ An unknown name in `exclude`, an excluded tool with settings, or a tool both rea
151
182
 
152
183
  ## What the Operator Decides
153
184
 
154
- Whoever starts the server beats the model. An option that declares `env`, or has a value for that command in the config file, stays out of the tool's schema, and if a model sends it anyway, it's dropped. This holds even if the env var isn't set: a missing required value fails the call, so a model can't ask anyone for it.
185
+ Whoever starts the server beats the model. An option that declares `env`, or has a value for that command in the config file, stays out of the tool's schema. If a model sends it anyway, the call fails with `class: "invalid_input"` and nothing runs: `'replicas' is set by the operator of this server, so it can't be sent.` The text never shows the operator's value. To let the model choose, list the option in `expose`. This holds even if the env var isn't set: a missing required value fails the call with `class: "not_configured"`, and its text tells the model that the operator has to set it, so it doesn't take it as its own mistake. The server also says it at startup, on stderr, which clients show in their logs: `mcpPlugin: tool 'deploy' can't run until the operator sets DEPLOY_TOKEN (--token).` It keeps serving, because the other tools work.
186
+
187
+ A value the operator gave that breaks its schema works the same way, checked with the rules the CLI uses, so `"5"` for a number is fine. The call fails with `not_configured`, and the server says at startup what to fix, without the value: `mcpPlugin: tool 'deploy' can't run until the operator fixes DEPLOY_ENV (--env): expected one of: staging, production.`, or `fixes 'deploy.replicas' in the config file: expected number.`
155
188
 
156
189
  ```ts
157
190
  mcpPlugin({
@@ -242,7 +275,7 @@ $ my-tool --mcp # Machine-readable MCP server
242
275
 
243
276
  - **Transport**: stdio (stdin/stdout JSON-RPC)
244
277
  - **Graceful shutdown**: Handles SIGINT and SIGTERM
245
- - **SDK**: Uses `@modelcontextprotocol/sdk` v1.29+ with `McpServer` API
278
+ - **SDK**: Uses `@modelcontextprotocol/sdk` v1.32+ with `McpServer` API
246
279
  - **Zod v4 native**: Zod v4 implements [Standard Schema](https://github.com/standard-schema/standard-schema), so schemas pass directly to `registerTool()` — no conversion layer
247
280
 
248
281
  ### Testing with MCP Inspector
@@ -0,0 +1,42 @@
1
+ /**
2
+ * What a failed tool call reports in `_meta['runa/error']`, and the codes this
3
+ * plugin throws at startup. Both are contract; the README lists when each one
4
+ * comes up. Core's own codes are in `ERROR_CODES` from `@runa-cmd/core`.
5
+ */
6
+ /** The `class` of a failed call: what failed. */
7
+ export declare const ERROR_CLASSES: {
8
+ /** No tool has that name, or it's excluded */
9
+ readonly UNKNOWN_TOOL: 'unknown_tool';
10
+ /** An argument or option the model sent is missing or breaks its schema */
11
+ readonly INVALID_INPUT: 'invalid_input';
12
+ /** A value only the operator gives is missing, as an option's env var */
13
+ readonly NOT_CONFIGURED: 'not_configured';
14
+ /** The call failed before run(), as in a hook or a middleware */
15
+ readonly REJECTED: 'rejected';
16
+ /** The call ended well without running the command */
17
+ readonly NOT_RUN: 'not_run';
18
+ /** run() threw a CommandError: the failure the author wrote */
19
+ readonly COMMAND_FAILED: 'command_failed';
20
+ /** run() threw any other error, or the process ended without saying why */
21
+ readonly CRASHED: 'crashed';
22
+ /** run() returned a value its output schema rejects */
23
+ readonly INVALID_OUTPUT: 'invalid_output';
24
+ /** The result is over maxOutput */
25
+ readonly OUTPUT_TOO_LARGE: 'output_too_large';
26
+ /** Something failed after run() returned */
27
+ readonly AFTER_RUN_FAILED: 'after_run_failed';
28
+ /** The client cancelled the call, or the server closed */
29
+ readonly CANCELLED: 'cancelled';
30
+ };
31
+ /** One of the classes of a failed call. */
32
+ export type ErrorClass = (typeof ERROR_CLASSES)[keyof typeof ERROR_CLASSES];
33
+ /** The codes mcpPlugin throws at startup, with exit 1. */
34
+ export declare const MCP_ERROR_CODES: {
35
+ /** The tool settings can't be met */
36
+ readonly MCP_INVALID_TOOLS: 'MCP_INVALID_TOOLS';
37
+ /** The CLI can't start itself as a subprocess */
38
+ readonly MCP_SELF_CHECK_FAILED: 'MCP_SELF_CHECK_FAILED';
39
+ };
40
+ /** One of mcpPlugin's error codes. */
41
+ export type McpErrorCode = (typeof MCP_ERROR_CODES)[keyof typeof MCP_ERROR_CODES];
42
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iDAAiD;AACjD,eAAO,MAAM,aAAa;IACzB,8CAA8C;aAC9C,YAAY,EAAE,cAAc;IAC5B,2EAA2E;aAC3E,aAAa,EAAE,eAAe;IAC9B,yEAAyE;aACzE,cAAc,EAAE,gBAAgB;IAChC,iEAAiE;aACjE,QAAQ,EAAE,UAAU;IACpB,sDAAsD;aACtD,OAAO,EAAE,SAAS;IAClB,+DAA+D;aAC/D,cAAc,EAAE,gBAAgB;IAChC,2EAA2E;aAC3E,OAAO,EAAE,SAAS;IAClB,uDAAuD;aACvD,cAAc,EAAE,gBAAgB;IAChC,mCAAmC;aACnC,gBAAgB,EAAE,kBAAkB;IACpC,4CAA4C;aAC5C,gBAAgB,EAAE,kBAAkB;IACpC,0DAA0D;aAC1D,SAAS,EAAE,WAAW;CACb,CAAC;AAEX,2CAA2C;AAC3C,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAE5E,0DAA0D;AAC1D,eAAO,MAAM,eAAe;IAC3B,qCAAqC;aACrC,iBAAiB,EAAE,mBAAmB;IACtC,iDAAiD;aACjD,qBAAqB,EAAE,uBAAuB;CACrC,CAAC;AAEX,sCAAsC;AACtC,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,OAAO,eAAe,CAAC,CAAC"}
package/dist/errors.js ADDED
@@ -0,0 +1,38 @@
1
+ /**
2
+ * What a failed tool call reports in `_meta['runa/error']`, and the codes this
3
+ * plugin throws at startup. Both are contract; the README lists when each one
4
+ * comes up. Core's own codes are in `ERROR_CODES` from `@runa-cmd/core`.
5
+ */
6
+ /** The `class` of a failed call: what failed. */
7
+ export const ERROR_CLASSES = {
8
+ /** No tool has that name, or it's excluded */
9
+ UNKNOWN_TOOL: 'unknown_tool',
10
+ /** An argument or option the model sent is missing or breaks its schema */
11
+ INVALID_INPUT: 'invalid_input',
12
+ /** A value only the operator gives is missing, as an option's env var */
13
+ NOT_CONFIGURED: 'not_configured',
14
+ /** The call failed before run(), as in a hook or a middleware */
15
+ REJECTED: 'rejected',
16
+ /** The call ended well without running the command */
17
+ NOT_RUN: 'not_run',
18
+ /** run() threw a CommandError: the failure the author wrote */
19
+ COMMAND_FAILED: 'command_failed',
20
+ /** run() threw any other error, or the process ended without saying why */
21
+ CRASHED: 'crashed',
22
+ /** run() returned a value its output schema rejects */
23
+ INVALID_OUTPUT: 'invalid_output',
24
+ /** The result is over maxOutput */
25
+ OUTPUT_TOO_LARGE: 'output_too_large',
26
+ /** Something failed after run() returned */
27
+ AFTER_RUN_FAILED: 'after_run_failed',
28
+ /** The client cancelled the call, or the server closed */
29
+ CANCELLED: 'cancelled',
30
+ };
31
+ /** The codes mcpPlugin throws at startup, with exit 1. */
32
+ export const MCP_ERROR_CODES = {
33
+ /** The tool settings can't be met */
34
+ MCP_INVALID_TOOLS: 'MCP_INVALID_TOOLS',
35
+ /** The CLI can't start itself as a subprocess */
36
+ MCP_SELF_CHECK_FAILED: 'MCP_SELF_CHECK_FAILED',
37
+ };
38
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC5B,8CAA8C;IAC9C,YAAY,EAAE,cAAc;IAC5B,2EAA2E;IAC3E,aAAa,EAAE,eAAe;IAC9B,yEAAyE;IACzE,cAAc,EAAE,gBAAgB;IAChC,iEAAiE;IACjE,QAAQ,EAAE,UAAU;IACpB,sDAAsD;IACtD,OAAO,EAAE,SAAS;IAClB,+DAA+D;IAC/D,cAAc,EAAE,gBAAgB;IAChC,2EAA2E;IAC3E,OAAO,EAAE,SAAS;IAClB,uDAAuD;IACvD,cAAc,EAAE,gBAAgB;IAChC,mCAAmC;IACnC,gBAAgB,EAAE,kBAAkB;IACpC,4CAA4C;IAC5C,gBAAgB,EAAE,kBAAkB;IACpC,0DAA0D;IAC1D,SAAS,EAAE,WAAW;CACb,CAAC;AAKX,0DAA0D;AAC1D,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,qCAAqC;IACrC,iBAAiB,EAAE,mBAAmB;IACtC,iDAAiD;IACjD,qBAAqB,EAAE,uBAAuB;CACrC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@
3
3
  *
4
4
  * Barrel re-exports for the MCP plugin package.
5
5
  */
6
+ export { ERROR_CLASSES, type ErrorClass, MCP_ERROR_CODES, type McpErrorCode } from './errors.js';
6
7
  export { mcpPlugin } from './plugin.js';
7
8
  export type { McpPluginOptions, ToolOptions } from './types.js';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,KAAK,UAAU,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -3,5 +3,6 @@
3
3
  *
4
4
  * Barrel re-exports for the MCP plugin package.
5
5
  */
6
+ export { ERROR_CLASSES, MCP_ERROR_CODES } from './errors.js';
6
7
  export { mcpPlugin } from './plugin.js';
7
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAmB,eAAe,EAAqB,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -10,6 +10,15 @@ export interface OperatorValues {
10
10
  type ExposureOptions = Pick<McpPluginOptions, 'exclude' | 'tools' | 'maxOutput'>;
11
11
  /** The tools as the model will see them. Fails at startup on an invalid setup. */
12
12
  export declare function applyOperatorValues(registrations: ToolRegistration[], options: ExposureOptions, values: OperatorValues): ToolRegistration[];
13
+ export declare function missingValues(reg: ToolRegistration, withFlags?: boolean): string;
14
+ /** What the model reads first: what the operator has to set, and what to fix. */
15
+ export declare function operatorNote(reg: ToolRegistration): string;
16
+ /**
17
+ * What the operator has to set or fix before each tool can run. Said at
18
+ * startup, so it doesn't wait for a model to call the tool, and the server
19
+ * keeps serving: the other tools work.
20
+ */
21
+ export declare function unconfiguredWarnings(registrations: ToolRegistration[]): string[];
13
22
  /** Hide fixed values from text a command wrote without meaning to expose them. */
14
23
  export declare function redact(text: string, values: string[]): string;
15
24
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"operator.d.ts","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,YAAY,CAAC;AAOhE,MAAM,WAAW,cAAc;IAC9B,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IACnE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,KAAK,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC;AA4GjF,kFAAkF;AAClF,wBAAgB,mBAAmB,CAClC,aAAa,EAAE,gBAAgB,EAAE,EACjC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,cAAc,GACpB,gBAAgB,EAAE,CAapB;AAED,kFAAkF;AAClF,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAE7D"}
1
+ {"version":3,"file":"operator.d.ts","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,YAAY,CAAC;AAOhE,MAAM,WAAW,cAAc;IAC9B,0DAA0D;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IACnE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,KAAK,eAAe,GAAG,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC,CAAC;AAqIjF,kFAAkF;AAClF,wBAAgB,mBAAmB,CAClC,aAAa,EAAE,gBAAgB,EAAE,EACjC,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,cAAc,GACpB,gBAAgB,EAAE,CAapB;AAMD,wBAAgB,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,SAAS,UAAQ,GAAG,MAAM,CAI9E;AAWD,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CAK1D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,gBAAgB,EAAE,GAAG,MAAM,EAAE,CAUhF;AAED,kFAAkF;AAClF,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAE7D"}
package/dist/operator.js CHANGED
@@ -8,12 +8,13 @@
8
8
  * turn into a parameter the model can ask a person for.
9
9
  */
10
10
  import { RunaError } from '@runa-cmd/core';
11
- import { longFlag } from '@runa-cmd/core/internal';
11
+ import { longFlag, operatorValueProblem } from '@runa-cmd/core/internal';
12
+ import { MCP_ERROR_CODES } from './errors.js';
12
13
  const REDACTION = '[redacted]';
13
14
  /** Shorter values could be any word, and replacing them would mangle the text. */
14
15
  const MIN_REDACTED_LENGTH = 8;
15
16
  function invalidTools(message) {
16
- return new RunaError(`mcpPlugin: ${message}`, { code: 'MCP_INVALID_TOOLS' });
17
+ return new RunaError(`mcpPlugin: ${message}`, { code: MCP_ERROR_CODES.MCP_INVALID_TOOLS });
17
18
  }
18
19
  function assertValidLimit(limit, owner) {
19
20
  if (limit === undefined || (Number.isInteger(limit) && limit > 0))
@@ -66,6 +67,8 @@ function applyToTool(reg, options, maxOutput, values) {
66
67
  const inputShape = { ...reg.inputShape };
67
68
  const fixed = new Set();
68
69
  const fixedValues = [];
70
+ const unconfigured = [];
71
+ const misconfigured = [];
69
72
  for (const key of reg.optionKeys) {
70
73
  if (options.expose?.includes(key))
71
74
  continue;
@@ -75,9 +78,26 @@ function applyToTool(reg, options, maxOutput, values) {
75
78
  throw invalidTools(`option ${longFlag(key)} of tool '${reg.name}' is server-only and has no value. ` +
76
79
  'Set it through its env var or the config file.');
77
80
  }
78
- const belongsToOperator = value !== undefined || envNameOf(key, reg) !== undefined;
81
+ const envName = envNameOf(key, reg);
82
+ const belongsToOperator = value !== undefined || envName !== undefined;
79
83
  if (!belongsToOperator)
80
84
  continue;
85
+ // A model can't send it, so without a value no call can run (T-236)
86
+ const schema = inputShape[key];
87
+ const required = schema?.safeParse(undefined).success === false;
88
+ if (value === undefined && envName !== undefined && required) {
89
+ unconfigured.push({ key, env: envName });
90
+ }
91
+ // Nor with a value that breaks its schema: checked as the CLI checks it (T-255)
92
+ if (value !== undefined && schema) {
93
+ const fromEnv = envName !== undefined && values.env[envName] !== undefined;
94
+ const reason = operatorValueProblem(schema, value, fromEnv ? 'env' : 'config');
95
+ if (reason !== undefined) {
96
+ misconfigured.push(fromEnv
97
+ ? { key, env: envName, reason }
98
+ : { key, configKey: [...reg.path, key].join('.'), reason });
99
+ }
100
+ }
81
101
  delete inputShape[key];
82
102
  fixed.add(key);
83
103
  if (value !== undefined)
@@ -89,6 +109,8 @@ function applyToTool(reg, options, maxOutput, values) {
89
109
  annotations: options.annotations,
90
110
  inputShape,
91
111
  fixed,
112
+ unconfigured,
113
+ misconfigured,
92
114
  redactions: redactable([...fixedValues, ...Object.values(values.globals)]),
93
115
  maxOutput: options.maxOutput ?? maxOutput ?? reg.maxOutput,
94
116
  };
@@ -105,6 +127,37 @@ export function applyOperatorValues(registrations, options, values) {
105
127
  .filter((reg) => !exclude.includes(reg.name))
106
128
  .map((reg) => applyToTool(reg, tools[reg.name] ?? {}, maxOutput, values));
107
129
  }
130
+ /** The variables, as `NOTES_FILE` or `A (--a) and B (--b)` with their flags. */
131
+ const listOf = (names) => names.length > 1 ? `${names.slice(0, -1).join(', ')} and ${names.at(-1)}` : `${names[0]}`;
132
+ export function missingValues(reg, withFlags = false) {
133
+ return listOf(reg.unconfigured.map(({ key, env }) => (withFlags ? `${env} (${longFlag(key)})` : env)));
134
+ }
135
+ /** Where a wrong value is: its variable, or its key in the config file. Never the value. */
136
+ function wrongValueAt({ key, env, configKey }, withFlags) {
137
+ if (env !== undefined)
138
+ return withFlags ? `${env} (${longFlag(key)})` : env;
139
+ return `'${configKey}' in the config file`;
140
+ }
141
+ /** What the model reads first: what the operator has to set, and what to fix. */
142
+ export function operatorNote(reg) {
143
+ const set = reg.unconfigured.length > 0 ? [`set ${missingValues(reg)}`] : [];
144
+ const wrong = reg.misconfigured.map((item) => wrongValueAt(item, false));
145
+ const fix = wrong.length > 0 ? [`fix ${listOf(wrong)}`] : [];
146
+ return `The operator of this server has to ${[...set, ...fix].join(' and ')}. It isn't a value you can send.`;
147
+ }
148
+ /**
149
+ * What the operator has to set or fix before each tool can run. Said at
150
+ * startup, so it doesn't wait for a model to call the tool, and the server
151
+ * keeps serving: the other tools work.
152
+ */
153
+ export function unconfiguredWarnings(registrations) {
154
+ return registrations.flatMap((reg) => {
155
+ const prefix = `mcpPlugin: tool '${reg.name}' can't run until the operator`;
156
+ const missing = reg.unconfigured.length > 0 ? [`${prefix} sets ${missingValues(reg, true)}.`] : [];
157
+ const wrong = reg.misconfigured.map((item) => `${prefix} fixes ${wrongValueAt(item, true)}: ${item.reason}.`);
158
+ return [...missing, ...wrong];
159
+ });
160
+ }
108
161
  /** Hide fixed values from text a command wrote without meaning to expose them. */
109
162
  export function redact(text, values) {
110
163
  return values.reduce((result, value) => result.replaceAll(value, REDACTION), text);
@@ -1 +1 @@
1
- {"version":3,"file":"operator.js","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAmB,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAInD,MAAM,SAAS,GAAG,YAAY,CAAC;AAE/B,kFAAkF;AAClF,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAY9B,SAAS,YAAY,CAAC,OAAe;IACpC,OAAO,IAAI,SAAS,CAAC,cAAc,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAyB,EAAE,KAAa;IACjE,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;QAAE,OAAO;IAC1E,MAAM,YAAY,CAAC,gBAAgB,KAAK,sCAAsC,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,kBAAkB,CAC1B,EAAE,OAAO,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAmB,EAC7C,aAAiC;IAEjC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,YAAY,CAAC,kBAAkB,IAAI,eAAe,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,IAAI,IAAI,KAAK;YAAE,MAAM,YAAY,CAAC,SAAS,IAAI,2CAA2C,CAAC,CAAC;IACjG,CAAC;AACF,CAAC;AAED,SAAS,gBAAgB,CACxB,KAA6C,EAC7C,aAAiC;IAEjC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACvE,IAAI,CAAC,GAAG;YAAE,MAAM,YAAY,CAAC,kBAAkB,IAAI,IAAI,CAAC,CAAC;QACzD,gBAAgB,CAAC,OAAO,CAAC,SAAS,EAAE,SAAS,IAAI,GAAG,CAAC,CAAC;QAEtD,IAAI,OAAO,CAAC,WAAW,EAAE,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;YAC9E,MAAM,YAAY,CAAC,SAAS,IAAI,uCAAuC,CAAC,CAAC;QAC1E,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC9E,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,MAAM,YAAY,CAAC,SAAS,IAAI,oBAAoB,GAAG,IAAI,CAAC,CAAC;YAC9D,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxE,MAAM,YAAY,CAAC,WAAW,GAAG,cAAc,IAAI,qCAAqC,CAAC,CAAC;YAC3F,CAAC;QACF,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,GAAqB;IACpD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAiD,CAAC;IACtF,OAAO,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;AAC/B,CAAC;AAED,SAAS,UAAU,CAAC,GAAW,EAAE,GAAqB,EAAE,MAAsB;IAC7E,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACxE,OAAO,OAAO,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,UAAU,CAAC,MAAiB;IACpC,OAAO,MAAM;SACX,MAAM,CACN,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,IAAI,mBAAmB,CAC5F;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,WAAW,CACnB,GAAqB,EACrB,OAAoB,EACpB,SAA6B,EAC7B,MAAsB;IAEtB,MAAM,UAAU,GAAG,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,WAAW,GAAc,EAAE,CAAC;IAElC,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QAClC,IAAI,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QAE5C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC;QAEhE,IAAI,KAAK,KAAK,SAAS,IAAI,YAAY,EAAE,CAAC;YACzC,MAAM,YAAY,CACjB,UAAU,QAAQ,CAAC,GAAG,CAAC,aAAa,GAAG,CAAC,IAAI,qCAAqC;gBAChF,gDAAgD,CACjD,CAAC;QACH,CAAC;QAED,MAAM,iBAAiB,GAAG,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,SAAS,CAAC;QACnF,IAAI,CAAC,iBAAiB;YAAE,SAAS;QAEjC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,KAAK,KAAK,SAAS;YAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC;IAED,OAAO;QACN,GAAG,GAAG;QACN,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC,WAAW;QACnD,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU;QACV,KAAK;QACL,UAAU,EAAE,UAAU,CAAC,CAAC,GAAG,WAAW,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1E,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,SAAS,IAAI,GAAG,CAAC,SAAS;KAC1D,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,mBAAmB,CAClC,aAAiC,EACjC,OAAwB,EACxB,MAAsB;IAEtB,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAExD,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACzC,yEAAyE;IACzE,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IAC1E,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEjC,OAAO,OAAO;SACZ,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SAC5C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,MAAM,CAAC,IAAY,EAAE,MAAgB;IACpD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,CAAC;AACpF,CAAC"}
1
+ {"version":3,"file":"operator.js","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAMhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAOnD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,GAAE,gBAAqB,GAAG,YAAY,CAgDnE"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAMhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAOnD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,GAAE,gBAAqB,GAAG,YAAY,CAkDnE"}
package/dist/plugin.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { definePlugin } from '@runa-cmd/core';
2
2
  import { z } from 'zod';
3
- import { applyOperatorValues } from './operator.js';
3
+ import { applyOperatorValues, unconfiguredWarnings } from './operator.js';
4
4
  import { defaultSelfCommand } from './runner.js';
5
5
  import { buildToolRegistrations } from './schema.js';
6
6
  /** What a child repeats from the server's own start: everything but `--mcp`. */
@@ -36,6 +36,9 @@ export function mcpPlugin(opts = {}) {
36
36
  env: process.env,
37
37
  globals: ctx.globalOptions,
38
38
  });
39
+ // stderr reaches the client's logs, and stdout is the protocol
40
+ for (const warning of unconfiguredWarnings(registrations))
41
+ console.error(warning);
39
42
  // Loaded here so a plain CLI run doesn't pay for the MCP SDK
40
43
  const { serve } = await import('./server.js');
41
44
  await serve(registrations, {
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAGrD,gFAAgF;AAChF,SAAS,WAAW;IACnB,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;AAClG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,IAAI,GAAqB,EAAE;IACpD,OAAO,YAAY,CAAC;QACnB,IAAI,EAAE;YACL,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,yCAAyC;SACtD;QACD,YAAY,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE;QACxC,KAAK,CAAC,GAAG;YACR,uCAAuC;YACvC,uEAAuE;YACvE,iDAAiD;YACjD,GAAG,CAAC,eAAe,CAClB,KAAK,EACL,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAClE,EAAE,YAAY,EAAE,KAAK,EAAE,CACvB,CAAC;YAEF,mCAAmC;YACnC,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,GAAgB,EAAE,EAAE;gBACpD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG;oBAAE,OAAO;gBAEpC,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC/B,MAAM,KAAK,GAAG,sBAAsB,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC;gBAChE,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACrC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAU,CAAC,CACrF,CAAC;gBACF,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE;oBACtD,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC;oBAC9C,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,OAAO,EAAE,GAAG,CAAC,aAAa;iBAC1B,CAAC,CAAC;gBAEH,6DAA6D;gBAC7D,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;gBAE9C,MAAM,KAAK,CAAC,aAAa,EAAE;oBAC1B,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI;oBACnC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO;oBACvD,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,kBAAkB,EAAE;oBACrD,IAAI,EAAE,WAAW,EAAE;iBACnB,CAAC,CAAC;gBAEH,gDAAgD;gBAChD,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC;YACtB,CAAC,CAAC,CAAC;QACJ,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
package/dist/schema.d.ts CHANGED
@@ -29,6 +29,18 @@ export interface ToolRegistration {
29
29
  optionKeys: Set<string>;
30
30
  /** Options the operator fixed: out of the schema, and dropped from any call */
31
31
  fixed: Set<string>;
32
+ /** Required options only the operator can give, still without a value: the tool can't run */
33
+ unconfigured: Array<{
34
+ key: string;
35
+ env: string;
36
+ }>;
37
+ /** Values the operator gave that break their schema: the tool can't run either (T-255) */
38
+ misconfigured: Array<{
39
+ key: string;
40
+ env?: string;
41
+ configKey?: string;
42
+ reason: string;
43
+ }>;
32
44
  /** Text to hide from what the command writes */
33
45
  redactions: string[];
34
46
  /** Most bytes of output this tool can answer with */
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAiB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAKnC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,uCAAuC;IACvC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,kCAAkC;IAClC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,+EAA+E;IAC/E,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,gDAAgD;IAChD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,eAAe,CAAC;CAC9B;AA6FD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,SAAS,GACf,gBAAgB,EAAE,CAEpB"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAiB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AAKnC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,yCAAyC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,uCAAuC;IACvC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mDAAmD;IACnD,OAAO,EAAE,OAAO,CAAC;IACjB,wEAAwE;IACxE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,kCAAkC;IAClC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACxB,+EAA+E;IAC/E,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,6FAA6F;IAC7F,YAAY,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,0FAA0F;IAC1F,aAAa,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxF,gDAAgD;IAChD,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,WAAW,CAAC,EAAE,eAAe,CAAC;CAC9B;AA+FD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,SAAS,GACf,gBAAgB,EAAE,CAEpB"}
package/dist/schema.js CHANGED
@@ -61,6 +61,8 @@ function walkTree(tree, parentPath, cliSchema) {
61
61
  argKeys,
62
62
  optionKeys,
63
63
  fixed: new Set(),
64
+ unconfigured: [],
65
+ misconfigured: [],
64
66
  redactions: [],
65
67
  maxOutput: DEFAULT_MAX_OUTPUT,
66
68
  });
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,EAEN,KAAK,cAAc,EAEnB,KAAK,IAAI,EACT,MAAM,oCAAoC,CAAC;AAI5C,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgBpD,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAS1D;AA8FD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY,GAAG,cAAc,CAiBzF;AAID,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAiBD,wBAAgB,eAAe,CAAC,aAAa,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAkChG;AAED;;;GAGG;AACH,wBAAsB,KAAK,CAC1B,aAAa,EAAE,gBAAgB,EAAE,EACjC,OAAO,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAuBf"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAEnE,OAAO,EAEN,KAAK,cAAc,EAEnB,KAAK,IAAI,EACT,MAAM,oCAAoC,CAAC;AAM5C,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAgBpD,wBAAgB,cAAc,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAS1D;AAmHD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,gBAAgB,EAAE,OAAO,EAAE,YAAY,GAAG,cAAc,CAiBzF;AAID,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAiBD,wBAAgB,eAAe,CAAC,aAAa,EAAE,gBAAgB,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CAsChG;AAED;;;GAGG;AACH,wBAAsB,KAAK,CAC1B,aAAa,EAAE,gBAAgB,EAAE,EACjC,OAAO,EAAE,YAAY,GACnB,OAAO,CAAC,IAAI,CAAC,CAuBf"}
package/dist/server.js CHANGED
@@ -11,6 +11,8 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
11
11
  import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
12
12
  import { RunaError } from '@runa-cmd/core';
13
13
  import { z } from 'zod';
14
+ import { ERROR_CLASSES, MCP_ERROR_CODES } from './errors.js';
15
+ import { operatorNote } from './operator.js';
14
16
  import { childrenFinished, runChild } from './runner.js';
15
17
  const SELF_CHECK_TIMEOUT_MS = 10_000;
16
18
  // ─── Tool definitions ───────────────────────────────────────
@@ -44,29 +46,37 @@ const EFFECT_TEXT = {
44
46
  * The reports say how far the command got. Without one, a command may have done
45
47
  * anything: the safe reading of the unknown is never that nothing happened.
46
48
  */
47
- function findFailure({ reports, status, cancelled }) {
49
+ function findFailure({ reports, status, cancelled }, reg) {
48
50
  const reached = (kind) => reports.some((report) => report.kind === kind);
49
51
  const failed = reports.find((report) => report.kind === 'failed');
52
+ const { AFTER_RUN_FAILED, CANCELLED, COMMAND_FAILED, CRASHED, INVALID_INPUT } = ERROR_CLASSES;
53
+ const { INVALID_OUTPUT, NOT_CONFIGURED, NOT_RUN, OUTPUT_TOO_LARGE, REJECTED } = ERROR_CLASSES;
50
54
  if (cancelled)
51
- return { class: 'cancelled', effect: 'unknown' };
55
+ return { class: CANCELLED, effect: 'unknown' };
52
56
  if (reached('oversized'))
53
- return { class: 'output_too_large', effect: 'completed' };
57
+ return { class: OUTPUT_TOO_LARGE, effect: 'completed' };
54
58
  if (reached('result')) {
55
59
  if (!failed && status === 0)
56
60
  return undefined;
57
- return { class: 'after_run_failed', effect: 'completed' };
61
+ return { class: AFTER_RUN_FAILED, effect: 'completed' };
58
62
  }
59
63
  if (reached('ran')) {
60
64
  const invalid = failed?.reason === 'output';
61
- return { class: invalid ? 'invalid_output' : 'after_run_failed', effect: 'completed' };
65
+ return { class: invalid ? INVALID_OUTPUT : AFTER_RUN_FAILED, effect: 'completed' };
62
66
  }
63
67
  if (reached('running')) {
64
- return { class: failed ? 'command_failed' : 'crashed', effect: 'unknown' };
68
+ // Only a CommandError is a failure the author wrote: anything else is a bug
69
+ return { class: failed?.reason === 'command' ? COMMAND_FAILED : CRASHED, effect: 'unknown' };
65
70
  }
66
- if (failed) {
67
- return { class: failed.reason === 'input' ? 'invalid_input' : 'rejected', effect: 'none' };
71
+ if (failed?.reason === 'input') {
72
+ // What the operator didn't set is what's missing first, whatever the model sent
73
+ // Missing or wrong, a value of the operator is the operator's to fix (T-255)
74
+ const configured = reg.unconfigured.length === 0 && reg.misconfigured.length === 0;
75
+ return { class: configured ? INVALID_INPUT : NOT_CONFIGURED, effect: 'none' };
68
76
  }
69
- return { class: status === 0 ? 'not_run' : 'crashed', effect: 'none' };
77
+ if (failed)
78
+ return { class: REJECTED, effect: 'none' };
79
+ return { class: status === 0 ? NOT_RUN : CRASHED, effect: 'none' };
70
80
  }
71
81
  /** Anything the model has to read goes in the text: `_meta` is for the client. */
72
82
  const failure = (reason, found) => ({
@@ -75,11 +85,21 @@ const failure = (reason, found) => ({
75
85
  content: [
76
86
  {
77
87
  type: 'text',
78
- text: found.class === 'command_failed' ? reason : `${reason}\n\n${EFFECT_TEXT[found.effect]}`,
88
+ text: found.class === ERROR_CLASSES.COMMAND_FAILED
89
+ ? reason
90
+ : `${reason}\n\n${EFFECT_TEXT[found.effect]}`,
79
91
  },
80
92
  ],
81
93
  _meta: { 'runa/error': found },
82
94
  });
95
+ /** A call that sends options the operator fixed. It names them, never their values. */
96
+ function operatorSets(keys) {
97
+ const names = keys.map((key) => `'${key}'`);
98
+ const list = names.length > 1 ? `${names.slice(0, -1).join(', ')} and ${names.at(-1)}` : names[0];
99
+ const verb = names.length > 1 ? 'are' : 'is';
100
+ const pronoun = names.length > 1 ? 'they' : 'it';
101
+ return failure(`${list} ${verb} set by the operator of this server, so ${pronoun} can't be sent.`, { class: ERROR_CLASSES.INVALID_INPUT, effect: 'none' });
102
+ }
83
103
  function failedChild(reg, outcome, found) {
84
104
  const oversized = outcome.reports.find((report) => report.kind === 'oversized');
85
105
  if (oversized) {
@@ -87,10 +107,15 @@ function failedChild(reg, outcome, found) {
87
107
  }
88
108
  const written = outcome.stderr.trim();
89
109
  const printed = outcome.stdout.trim();
90
- return failure(written || printed || silentFailure(reg, outcome, found), found);
110
+ const reason = written || printed || silentFailure(reg, outcome, found);
111
+ if (found.class !== ERROR_CLASSES.NOT_CONFIGURED)
112
+ return failure(reason, found);
113
+ // The model reads this: it can't send the value, nor ask the user for it
114
+ const note = operatorNote(reg);
115
+ return failure(`${note}\n\n${reason}`, found);
91
116
  }
92
117
  function silentFailure(reg, outcome, found) {
93
- if (found.class === 'cancelled')
118
+ if (found.class === ERROR_CLASSES.CANCELLED)
94
119
  return `Command '${reg.name}' was cancelled.`;
95
120
  if (outcome.status !== 0)
96
121
  return `Command '${reg.name}' exited with code ${outcome.status}.`;
@@ -101,7 +126,7 @@ function silentFailure(reg, outcome, found) {
101
126
  * can exit on its own. Only the reports say how far it got.
102
127
  */
103
128
  export function toToolResult(reg, outcome) {
104
- const found = findFailure(outcome);
129
+ const found = findFailure(outcome, reg);
105
130
  if (found)
106
131
  return failedChild(reg, outcome, found);
107
132
  const finished = outcome.reports.find((report) => report.kind === 'result');
@@ -122,7 +147,7 @@ async function assertCanRunItself(options) {
122
147
  if (reports.some((report) => report.kind === 'pong'))
123
148
  return;
124
149
  throw new RunaError(`Cannot run this CLI as a subprocess with: ${options.selfCommand.join(' ')}. ` +
125
- 'If it is a compiled binary, set mcpPlugin({ selfCommand }).', { code: 'MCP_SELF_CHECK_FAILED' });
150
+ 'If it is a compiled binary, set mcpPlugin({ selfCommand }).', { code: MCP_ERROR_CODES.MCP_SELF_CHECK_FAILED });
126
151
  }
127
152
  export function createMcpServer(registrations, options) {
128
153
  const server = new Server({ name: options.name, version: options.version }, { capabilities: { tools: {} }, instructions: options.instructions });
@@ -132,10 +157,17 @@ export function createMcpServer(registrations, options) {
132
157
  server.setRequestHandler(CallToolRequestSchema, async ({ params }, extra) => {
133
158
  const reg = registrations.find((candidate) => candidate.name === params.name);
134
159
  if (!reg) {
135
- return failure(`Unknown tool: ${params.name}`, { class: 'unknown_tool', effect: 'none' });
160
+ return failure(`Unknown tool: ${params.name}`, {
161
+ class: ERROR_CLASSES.UNKNOWN_TOOL,
162
+ effect: 'none',
163
+ });
136
164
  }
137
- // A fixed option stays what the operator set, whatever the call says
138
- const input = Object.fromEntries(Object.entries(params.arguments ?? {}).filter(([key]) => !reg.fixed.has(key)));
165
+ // The operator's value wins, and the model has to know its own isn't used:
166
+ // running with another value and answering success told it otherwise (ADR-0049)
167
+ const input = params.arguments ?? {};
168
+ const fixed = Object.keys(input).filter((key) => reg.fixed.has(key));
169
+ if (fixed.length > 0)
170
+ return operatorSets(fixed);
139
171
  const outcome = await runChild({ kind: 'call', path: reg.path, input, maxResultBytes: reg.maxOutput }, {
140
172
  ...options,
141
173
  signal: options.signal ? AbortSignal.any([extra.signal, options.signal]) : extra.signal,
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@runa-cmd/mcp",
3
- "version": "0.2.0-beta.5",
3
+ "version": "0.2.0-beta.7",
4
4
  "description": "MCP (Model Context Protocol) server mode for Runa CLIs. Turn commands into AI-callable tools.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -25,7 +25,7 @@
25
25
  "@modelcontextprotocol/sdk": "^1.32.2"
26
26
  },
27
27
  "peerDependencies": {
28
- "@runa-cmd/core": "^0.2.0-beta.4",
28
+ "@runa-cmd/core": "^0.2.0-beta.7",
29
29
  "zod": "^4.0.0"
30
30
  },
31
31
  "engines": {
@@ -52,12 +52,12 @@
52
52
  "@types/node": "^24.19.2",
53
53
  "typescript": "^7.0.2",
54
54
  "zod": "^4.6.7",
55
- "@runa-cmd/core": "0.2.0-beta.5"
55
+ "@runa-cmd/core": "0.2.0-beta.7"
56
56
  },
57
57
  "scripts": {
58
58
  "build": "tsc",
59
59
  "dev": "tsc --watch --preserveWatchOutput",
60
- "typecheck": "tsc --noEmit",
60
+ "typecheck": "tsc --noEmit && tsc -p tsconfig.test.json",
61
61
  "test": "vitest run",
62
62
  "test:watch": "vitest",
63
63
  "lint": "biome check .",