@chrischall/mcp-utils 2.4.0 → 2.6.0
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/README.md +93 -0
- package/dist/server/canonical.d.ts +15 -0
- package/dist/server/canonical.d.ts.map +1 -0
- package/dist/server/canonical.js +67 -0
- package/dist/server/canonical.js.map +1 -0
- package/dist/server/confirm-env.d.ts +49 -0
- package/dist/server/confirm-env.d.ts.map +1 -0
- package/dist/server/confirm-env.js +103 -0
- package/dist/server/confirm-env.js.map +1 -0
- package/dist/server/confirm-token.d.ts +131 -0
- package/dist/server/confirm-token.d.ts.map +1 -0
- package/dist/server/confirm-token.js +229 -0
- package/dist/server/confirm-token.js.map +1 -0
- package/dist/server/confirmation.d.ts.map +1 -1
- package/dist/server/confirmation.js +1 -62
- package/dist/server/confirmation.js.map +1 -1
- package/dist/server/index.d.ts +2 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/zod/index.d.ts +7 -1
- package/dist/zod/index.d.ts.map +1 -1
- package/dist/zod/index.js +7 -1
- package/dist/zod/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -156,6 +156,99 @@ single-use**: within `ttlSeconds` (default 600) the same acceptance can be
|
|
|
156
156
|
replayed for identical arguments, never for different ones. If the action must
|
|
157
157
|
not run twice (a payment, a send), record consumed states and refuse repeats.
|
|
158
158
|
|
|
159
|
+
#### Clients that cannot be prompted: the confirm-token fallback
|
|
160
|
+
|
|
161
|
+
A caller that declares no elicitation (claude.ai, measured) cannot see the
|
|
162
|
+
prompt, so `requireConfirmation` refuses it (`"reason":
|
|
163
|
+
"confirmation-unsupported"`). `requireConfirmationWithFallback` takes the same
|
|
164
|
+
options plus an opt-in `tokenFallback`, and runs a two-phase flow there instead.
|
|
165
|
+
A client that can be prompted is still prompted, and the fallback's `subject`
|
|
166
|
+
is never called.
|
|
167
|
+
|
|
168
|
+
1. **Phase 1**: called without `confirmToken`, nothing happens. The result has
|
|
169
|
+
`status: "confirmation-required"`, the full `preview`, a `confirmToken`, and
|
|
170
|
+
an instruction to show the preview to the user and call again only after
|
|
171
|
+
they approve in chat.
|
|
172
|
+
2. **Phase 2**: the same call plus `confirmToken`. `subject()` re-reads what the
|
|
173
|
+
tool would act on, and the helper returns `undefined` (proceed) only if that
|
|
174
|
+
still matches the token.
|
|
175
|
+
|
|
176
|
+
```ts
|
|
177
|
+
import { confirmTokenParam, requireConfirmationWithFallback, textResult } from '@chrischall/mcp-utils';
|
|
178
|
+
|
|
179
|
+
server.registerTool('draft_send', {
|
|
180
|
+
inputSchema: z.object({ draftId: z.string(), confirmToken: confirmTokenParam }),
|
|
181
|
+
}, async ({ draftId, confirmToken }, ctx) => {
|
|
182
|
+
const draft = await api.getDraft(draftId); // read on EVERY call
|
|
183
|
+
const gate = await requireConfirmationWithFallback(ctx, {
|
|
184
|
+
action: 'draft.send',
|
|
185
|
+
message: 'Review and confirm this send.',
|
|
186
|
+
details: { to: draft.to, subject: draft.subject },
|
|
187
|
+
// Opt-in: omit tokenFallback to keep the refusal.
|
|
188
|
+
tokenFallback: process.env.CONFIRM_FALLBACK === 'token' ? {
|
|
189
|
+
key: confirmKey, // >= 32 bytes
|
|
190
|
+
tool: 'draft_send',
|
|
191
|
+
account,
|
|
192
|
+
confirmToken,
|
|
193
|
+
subject: () => ({
|
|
194
|
+
target: draftId,
|
|
195
|
+
revision: draft.messageId, // rotates on edit
|
|
196
|
+
payload: draft, // hashed into the token
|
|
197
|
+
preview: draft, // shown to the user
|
|
198
|
+
}),
|
|
199
|
+
} : undefined,
|
|
200
|
+
});
|
|
201
|
+
if (gate) return gate;
|
|
202
|
+
await api.sendDraft(draftId);
|
|
203
|
+
return textResult({ sent: true });
|
|
204
|
+
});
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
The token is an HMAC over the tool, account, target, revision and a hash of the
|
|
208
|
+
canonical payload (the same canonical form `binding` commits to), expires after
|
|
209
|
+
`ttlSeconds` (default 600), and is **single-use** through a spent-token store
|
|
210
|
+
(process-wide by default; pass `spent: createSpentTokenStore()` to scope it).
|
|
211
|
+
The store is in memory, so with a key shared across processes a restart or
|
|
212
|
+
another instance accepts a spent token again until it expires. A refused token
|
|
213
|
+
returns `isError: true` and acts on nothing:
|
|
214
|
+
|
|
215
|
+
| `error` | meaning |
|
|
216
|
+
|---|---|
|
|
217
|
+
| `DRAFT_CHANGED` | `reason: "revision-changed"` or `"payload-changed"`: the target moved since the preview. Carries the new preview and a fresh token. |
|
|
218
|
+
| `TOKEN_EXPIRED` | older than `ttlSeconds` |
|
|
219
|
+
| `TOKEN_REUSED` | already used |
|
|
220
|
+
| `TOKEN_INVALID` | tampered, issued for another tool, account or target, or signed with another key |
|
|
221
|
+
|
|
222
|
+
**Fleet env layer.** `confirmationFromEnv({ ...requireConfirmationOptions, tool,
|
|
223
|
+
account?, confirmToken, subject, instruction?, spent? })` turns three standard
|
|
224
|
+
variables into those options, so every server reads and documents them the same
|
|
225
|
+
way:
|
|
226
|
+
|
|
227
|
+
| variable | default | |
|
|
228
|
+
|---|---|---|
|
|
229
|
+
| `MCP_CONFIRM_MODE` | `ask-user` | What a gated write does on a client that cannot show a prompt. `ask-user`: two steps, and the model must get the user's approval in chat before using the token. `auto`: two steps, but the model may use the token after reviewing the preview itself. `refuse`: refused on such clients. An unrecognised value is treated as `refuse` (with a stderr warning). A client that can be prompted always is. |
|
|
230
|
+
| `MCP_CONFIRM_TTL_SECONDS` | `600` | token lifetime |
|
|
231
|
+
| `MCP_CONFIRM_SECRET` | random per process | HMAC key (any length, stretched through SHA-256); set only if tokens must survive a restart |
|
|
232
|
+
|
|
233
|
+
```ts
|
|
234
|
+
const gate = await requireConfirmationWithFallback(ctx, confirmationFromEnv({
|
|
235
|
+
action: 'thing.delete', message: 'Review and confirm this deletion.', details: { id },
|
|
236
|
+
tool: 'thing_delete', confirmToken,
|
|
237
|
+
subject: () => ({ target: id, payload: { id }, preview: { id } }),
|
|
238
|
+
}));
|
|
239
|
+
if (gate) return gate;
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
This replaces `schemaConfirm` (`confirm: true`), which is deprecated.
|
|
243
|
+
|
|
244
|
+
**It is weaker than elicitation.** The approval is a tool argument, so "a human
|
|
245
|
+
approved" rests on the model following the instruction. The token guarantees a
|
|
246
|
+
preview call came first, that what happens is exactly what was previewed, and
|
|
247
|
+
that it happens once. That is still stronger than a bare `confirm: true`, which
|
|
248
|
+
a model can pass on its first call. Make it opt-in. `issueConfirmToken`,
|
|
249
|
+
`verifyConfirmToken` and `hashConfirmPayload` are exported for a flow that
|
|
250
|
+
needs the primitives directly.
|
|
251
|
+
|
|
159
252
|
### `response` — tool-result formatting
|
|
160
253
|
|
|
161
254
|
`textResult` / `jsonResult` (alias), `rawTextResult`, `imageResult`,
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A canonical, type-tagged serialisation of tool arguments for the binding
|
|
3
|
+
* commitment. Object keys are sorted, so `{a,b}` and `{b,a}` hash the same.
|
|
4
|
+
* Values JSON would flatten to `{}` are serialised faithfully instead — a
|
|
5
|
+
* `Date` as its ISO string, bytes (`Buffer`, typed arrays, `ArrayBuffer`) as
|
|
6
|
+
* base64, a `Map`/`Set` as its entries sorted by canonical form, a `bigint` as
|
|
7
|
+
* its digits — so two calls that differ only in such a value never share a
|
|
8
|
+
* commitment. Each typed value is a one-key `{"$tag":…}` object; a plain
|
|
9
|
+
* object's `$`-prefixed keys are escaped (see {@link escapeKey}), so a plain
|
|
10
|
+
* object that imitates a tag (`{ $bytes: 'dHdv' }`) never encodes the same as
|
|
11
|
+
* the typed value it imitates (`Buffer.from('two')`). Anything else that is not plain data (a class instance, a
|
|
12
|
+
* function, a symbol) cannot be compared honestly and is refused.
|
|
13
|
+
*/
|
|
14
|
+
export declare function canonicalJson(value: unknown): string;
|
|
15
|
+
//# sourceMappingURL=canonical.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../src/server/canonical.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAgCpD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Internal (not re-exported from the barrel): the one canonical form both
|
|
2
|
+
// confirmation mechanisms commit to — requireConfirmation's `binding` state and
|
|
3
|
+
// the confirm-token fallback — so two calls that differ in any value never
|
|
4
|
+
// share a commitment in either.
|
|
5
|
+
/**
|
|
6
|
+
* A canonical, type-tagged serialisation of tool arguments for the binding
|
|
7
|
+
* commitment. Object keys are sorted, so `{a,b}` and `{b,a}` hash the same.
|
|
8
|
+
* Values JSON would flatten to `{}` are serialised faithfully instead — a
|
|
9
|
+
* `Date` as its ISO string, bytes (`Buffer`, typed arrays, `ArrayBuffer`) as
|
|
10
|
+
* base64, a `Map`/`Set` as its entries sorted by canonical form, a `bigint` as
|
|
11
|
+
* its digits — so two calls that differ only in such a value never share a
|
|
12
|
+
* commitment. Each typed value is a one-key `{"$tag":…}` object; a plain
|
|
13
|
+
* object's `$`-prefixed keys are escaped (see {@link escapeKey}), so a plain
|
|
14
|
+
* object that imitates a tag (`{ $bytes: 'dHdv' }`) never encodes the same as
|
|
15
|
+
* the typed value it imitates (`Buffer.from('two')`). Anything else that is not plain data (a class instance, a
|
|
16
|
+
* function, a symbol) cannot be compared honestly and is refused.
|
|
17
|
+
*/
|
|
18
|
+
export function canonicalJson(value) {
|
|
19
|
+
if (value === null || typeof value === 'string' || typeof value === 'boolean')
|
|
20
|
+
return JSON.stringify(value);
|
|
21
|
+
if (value === undefined)
|
|
22
|
+
return 'null';
|
|
23
|
+
if (typeof value === 'number')
|
|
24
|
+
return Number.isFinite(value) ? JSON.stringify(value) : `{"$num":"${String(value)}"}`;
|
|
25
|
+
if (typeof value === 'bigint')
|
|
26
|
+
return `{"$bigint":"${value.toString()}"}`;
|
|
27
|
+
if (typeof value === 'function' || typeof value === 'symbol') {
|
|
28
|
+
throw new TypeError(`confirmation: cannot bind a ${typeof value} argument value.`);
|
|
29
|
+
}
|
|
30
|
+
if (Array.isArray(value))
|
|
31
|
+
return `[${value.map(canonicalJson).join(',')}]`;
|
|
32
|
+
if (value instanceof Date) {
|
|
33
|
+
return `{"$date":${JSON.stringify(Number.isNaN(value.getTime()) ? 'Invalid Date' : value.toISOString())}}`;
|
|
34
|
+
}
|
|
35
|
+
if (ArrayBuffer.isView(value)) {
|
|
36
|
+
const bytes = Buffer.from(value.buffer, value.byteOffset, value.byteLength);
|
|
37
|
+
return `{"$bytes":${JSON.stringify(bytes.toString('base64'))}}`;
|
|
38
|
+
}
|
|
39
|
+
if (value instanceof ArrayBuffer)
|
|
40
|
+
return `{"$bytes":${JSON.stringify(Buffer.from(value).toString('base64'))}}`;
|
|
41
|
+
if (value instanceof Map) {
|
|
42
|
+
const entries = [...value.entries()].map(([k, v]) => `[${canonicalJson(k)},${canonicalJson(v)}]`).sort();
|
|
43
|
+
return `{"$map":[${entries.join(',')}]}`;
|
|
44
|
+
}
|
|
45
|
+
if (value instanceof Set) {
|
|
46
|
+
return `{"$set":[${[...value].map(canonicalJson).sort().join(',')}]}`;
|
|
47
|
+
}
|
|
48
|
+
const proto = Object.getPrototypeOf(value);
|
|
49
|
+
if (proto !== Object.prototype && proto !== null) {
|
|
50
|
+
throw new TypeError('confirmation: cannot bind a non-plain object argument value (class instance).');
|
|
51
|
+
}
|
|
52
|
+
const entries = Object.entries(value)
|
|
53
|
+
.filter(([, v]) => v !== undefined)
|
|
54
|
+
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
55
|
+
return `{${entries.map(([k, v]) => `${JSON.stringify(escapeKey(k))}:${canonicalJson(v)}`).join(',')}}`;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Escape a plain-object key so it can never collide with a type tag. Tags are
|
|
59
|
+
* `$` followed by a letter (`$bytes`, `$date`, …); every plain key that starts
|
|
60
|
+
* with `$` gains one more, so plain keys starting with `$` always start with
|
|
61
|
+
* `$$` and never match a tag. Prefixing is injective, so distinct keys stay
|
|
62
|
+
* distinct (`$x` → `$$x`, `$$x` → `$$$x`).
|
|
63
|
+
*/
|
|
64
|
+
function escapeKey(key) {
|
|
65
|
+
return key.startsWith('$') ? `$${key}` : key;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=canonical.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/server/canonical.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,gFAAgF;AAChF,2EAA2E;AAC3E,gCAAgC;AAEhC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC5G,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IACrH,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,eAAe,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC;IAC1E,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC7D,MAAM,IAAI,SAAS,CAAC,+BAA+B,OAAO,KAAK,kBAAkB,CAAC,CAAC;IACrF,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC3E,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC;IAC7G,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QAC5E,OAAO,aAAa,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,YAAY,WAAW;QAAE,OAAO,aAAa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC;IAC/G,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACzG,OAAO,YAAY,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3C,CAAC;IACD,IAAI,KAAK,YAAY,GAAG,EAAE,CAAC;QACzB,OAAO,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACxE,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAY,CAAC;IACtD,IAAI,KAAK,KAAK,MAAM,CAAC,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACjD,MAAM,IAAI,SAAS,CAAC,+EAA+E,CAAC,CAAC;IACvG,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;SAC7D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACzG,CAAC;AAED;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type EnvSource } from '../config/index.js';
|
|
2
|
+
import type { RequireConfirmationOptions } from './confirmation.js';
|
|
3
|
+
import { type ConfirmTokenFallback, type RequireConfirmationWithFallbackOptions, type SpentTokenStore } from './confirm-token.js';
|
|
4
|
+
/** See the module header. */
|
|
5
|
+
export type ConfirmMode = 'ask-user' | 'auto' | 'refuse';
|
|
6
|
+
/** `MCP_CONFIRM_MODE`, defaulting to `ask-user`; an unrecognised value is `refuse`. */
|
|
7
|
+
export declare function readConfirmMode(env?: EnvSource): ConfirmMode;
|
|
8
|
+
/** `MCP_CONFIRM_TTL_SECONDS` as a positive integer, else 600. */
|
|
9
|
+
export declare function confirmTtlFromEnv(env?: EnvSource): number;
|
|
10
|
+
/**
|
|
11
|
+
* The HMAC key: `MCP_CONFIRM_SECRET` of any length stretched through SHA-256 to
|
|
12
|
+
* the 32 bytes the token functions require, or 32 random bytes fixed for the
|
|
13
|
+
* life of the process (so a restart invalidates every outstanding token).
|
|
14
|
+
*/
|
|
15
|
+
export declare function confirmKeyFromEnv(env?: EnvSource): Uint8Array;
|
|
16
|
+
/** Phase 1's instruction under `MCP_CONFIRM_MODE=auto`. */
|
|
17
|
+
export declare const CONFIRM_TOKEN_AUTO_INSTRUCTION: string;
|
|
18
|
+
/** {@link confirmationFromEnv}'s input: the confirmation options plus what the token binds. */
|
|
19
|
+
export interface ConfirmationFromEnvOptions extends RequireConfirmationOptions {
|
|
20
|
+
/** The tool name the token is bound to. */
|
|
21
|
+
tool: string;
|
|
22
|
+
/** The account the action runs as. */
|
|
23
|
+
account?: string;
|
|
24
|
+
/** The phase-2 token from the tool's input, or undefined on phase 1. */
|
|
25
|
+
confirmToken?: string;
|
|
26
|
+
/** Builds the subject from a FRESH read; see {@link ConfirmTokenFallback.subject}. */
|
|
27
|
+
subject: ConfirmTokenFallback['subject'];
|
|
28
|
+
/** Phase 1's instruction in `ask-user` mode; defaults to {@link CONFIRM_TOKEN_INSTRUCTION}. */
|
|
29
|
+
instruction?: string;
|
|
30
|
+
/** Spent-token store; defaults to the process-wide one. */
|
|
31
|
+
spent?: SpentTokenStore;
|
|
32
|
+
/** Environment to read; defaults to `process.env`. */
|
|
33
|
+
env?: EnvSource;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Turn the fleet env settings into {@link requireConfirmationWithFallback}
|
|
37
|
+
* options:
|
|
38
|
+
*
|
|
39
|
+
* ```ts
|
|
40
|
+
* const gate = await requireConfirmationWithFallback(ctx, confirmationFromEnv({
|
|
41
|
+
* action: 'thing.delete', message: 'Review and confirm this deletion.', details: { id },
|
|
42
|
+
* tool: 'thing_delete', confirmToken,
|
|
43
|
+
* subject: () => ({ target: id, payload: { id }, preview: { id } }),
|
|
44
|
+
* }));
|
|
45
|
+
* if (gate) return gate;
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export declare function confirmationFromEnv(options: ConfirmationFromEnvOptions): RequireConfirmationWithFallbackOptions;
|
|
49
|
+
//# sourceMappingURL=confirm-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-env.d.ts","sourceRoot":"","sources":["../../src/server/confirm-env.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,sCAAsC,EAC3C,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAE5B,6BAA6B;AAC7B,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAMzD,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,GAAG,GAAE,SAAuB,GAAG,WAAW,CAWzE;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,SAAuB,GAAG,MAAM,CAGtE;AAID;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,SAAuB,GAAG,UAAU,CAK1E;AAED,2DAA2D;AAC3D,eAAO,MAAM,8BAA8B,QAE6E,CAAC;AAIzH,+FAA+F;AAC/F,MAAM,WAAW,0BAA2B,SAAQ,0BAA0B;IAC5E,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,OAAO,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACzC,+FAA+F;IAC/F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,sDAAsD;IACtD,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,0BAA0B,GAAG,sCAAsC,CAsB/G"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The fleet's env layer over the confirm-token fallback: the three variables
|
|
3
|
+
* every server documents identically, read in one place so 30 servers cannot
|
|
4
|
+
* spell or interpret them 30 ways.
|
|
5
|
+
*
|
|
6
|
+
* | variable | default | |
|
|
7
|
+
* |---|---|---|
|
|
8
|
+
* | `MCP_CONFIRM_MODE` | `ask-user` | what a gated write does on a client that CANNOT show a confirmation prompt |
|
|
9
|
+
* | `MCP_CONFIRM_TTL_SECONDS` | `600` | how long a token stays valid |
|
|
10
|
+
* | `MCP_CONFIRM_SECRET` | random per process | HMAC key; set only if tokens must survive a restart |
|
|
11
|
+
*
|
|
12
|
+
* `MCP_CONFIRM_MODE`:
|
|
13
|
+
* - `ask-user`: two steps. Phase 1 returns the preview and a token and tells the
|
|
14
|
+
* model to show it to the user and continue only after they approve in chat.
|
|
15
|
+
* - `auto`: the same two steps, but the model may use the token itself after
|
|
16
|
+
* reviewing the preview. The token still forces a preview first, binds the
|
|
17
|
+
* exact arguments and is single-use — strictly more than `confirm: true`.
|
|
18
|
+
* - `refuse`: no fallback; the write is refused on such clients.
|
|
19
|
+
* A client that CAN be prompted always gets the real prompt, whatever the mode.
|
|
20
|
+
* An unrecognised value fails CLOSED to `refuse` (fleet convention: a typo must
|
|
21
|
+
* not widen what the server will do), with a warning on stderr.
|
|
22
|
+
*
|
|
23
|
+
* The confirm-token module itself stays env-free; this is the opt-in layer a
|
|
24
|
+
* server uses when it wants the fleet defaults.
|
|
25
|
+
*/
|
|
26
|
+
import { createHash, randomBytes } from 'node:crypto';
|
|
27
|
+
import { readEnvVar } from '../config/index.js';
|
|
28
|
+
import { CONFIRM_TOKEN_INSTRUCTION, } from './confirm-token.js';
|
|
29
|
+
const MODES = new Set(['ask-user', 'auto', 'refuse']);
|
|
30
|
+
const DEFAULT_TTL_SECONDS = 600;
|
|
31
|
+
const warned = new Set();
|
|
32
|
+
/** `MCP_CONFIRM_MODE`, defaulting to `ask-user`; an unrecognised value is `refuse`. */
|
|
33
|
+
export function readConfirmMode(env = process.env) {
|
|
34
|
+
const raw = readEnvVar('MCP_CONFIRM_MODE', { env })?.trim().toLowerCase();
|
|
35
|
+
if (!raw)
|
|
36
|
+
return 'ask-user';
|
|
37
|
+
if (MODES.has(raw))
|
|
38
|
+
return raw;
|
|
39
|
+
if (!warned.has(raw)) {
|
|
40
|
+
warned.add(raw);
|
|
41
|
+
process.stderr.write(`MCP_CONFIRM_MODE="${raw}" is not one of ask-user, auto, refuse; treating it as refuse.\n`);
|
|
42
|
+
}
|
|
43
|
+
return 'refuse';
|
|
44
|
+
}
|
|
45
|
+
/** `MCP_CONFIRM_TTL_SECONDS` as a positive integer, else 600. */
|
|
46
|
+
export function confirmTtlFromEnv(env = process.env) {
|
|
47
|
+
const raw = readEnvVar('MCP_CONFIRM_TTL_SECONDS', { env })?.trim();
|
|
48
|
+
return raw && /^[1-9]\d*$/.test(raw) ? Number(raw) : DEFAULT_TTL_SECONDS;
|
|
49
|
+
}
|
|
50
|
+
let processKey;
|
|
51
|
+
/**
|
|
52
|
+
* The HMAC key: `MCP_CONFIRM_SECRET` of any length stretched through SHA-256 to
|
|
53
|
+
* the 32 bytes the token functions require, or 32 random bytes fixed for the
|
|
54
|
+
* life of the process (so a restart invalidates every outstanding token).
|
|
55
|
+
*/
|
|
56
|
+
export function confirmKeyFromEnv(env = process.env) {
|
|
57
|
+
const secret = readEnvVar('MCP_CONFIRM_SECRET', { env });
|
|
58
|
+
if (secret)
|
|
59
|
+
return createHash('sha256').update(secret, 'utf8').digest();
|
|
60
|
+
processKey ??= randomBytes(32);
|
|
61
|
+
return processKey;
|
|
62
|
+
}
|
|
63
|
+
/** Phase 1's instruction under `MCP_CONFIRM_MODE=auto`. */
|
|
64
|
+
export const CONFIRM_TOKEN_AUTO_INSTRUCTION = 'Nothing has been done yet. Review this preview; if it is what was intended, call again with the same arguments '
|
|
65
|
+
+ 'plus confirmToken. (This server runs with MCP_CONFIRM_MODE=auto, so the user\'s approval in chat is not required.)';
|
|
66
|
+
const REFUSE_HINT = 'Set MCP_CONFIRM_MODE=ask-user on the server to allow two-step confirmation instead.';
|
|
67
|
+
/**
|
|
68
|
+
* Turn the fleet env settings into {@link requireConfirmationWithFallback}
|
|
69
|
+
* options:
|
|
70
|
+
*
|
|
71
|
+
* ```ts
|
|
72
|
+
* const gate = await requireConfirmationWithFallback(ctx, confirmationFromEnv({
|
|
73
|
+
* action: 'thing.delete', message: 'Review and confirm this deletion.', details: { id },
|
|
74
|
+
* tool: 'thing_delete', confirmToken,
|
|
75
|
+
* subject: () => ({ target: id, payload: { id }, preview: { id } }),
|
|
76
|
+
* }));
|
|
77
|
+
* if (gate) return gate;
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export function confirmationFromEnv(options) {
|
|
81
|
+
const { tool, account, confirmToken, subject, instruction, spent, env = process.env, ...confirmation } = options;
|
|
82
|
+
const mode = readConfirmMode(env);
|
|
83
|
+
if (mode === 'refuse') {
|
|
84
|
+
return {
|
|
85
|
+
...confirmation,
|
|
86
|
+
unsupportedNote: confirmation.unsupportedNote ? `${confirmation.unsupportedNote} ${REFUSE_HINT}` : REFUSE_HINT,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
...confirmation,
|
|
91
|
+
tokenFallback: {
|
|
92
|
+
key: confirmKeyFromEnv(env),
|
|
93
|
+
tool,
|
|
94
|
+
...(account === undefined ? {} : { account }),
|
|
95
|
+
...(confirmToken === undefined ? {} : { confirmToken }),
|
|
96
|
+
subject,
|
|
97
|
+
ttlSeconds: confirmTtlFromEnv(env),
|
|
98
|
+
instruction: mode === 'auto' ? CONFIRM_TOKEN_AUTO_INSTRUCTION : (instruction ?? CONFIRM_TOKEN_INSTRUCTION),
|
|
99
|
+
...(spent === undefined ? {} : { spent }),
|
|
100
|
+
},
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=confirm-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-env.js","sourceRoot":"","sources":["../../src/server/confirm-env.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import type { CallToolResult, InputRequiredResult, ServerContext } from '@modelcontextprotocol/server';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { type RequireConfirmationOptions } from './confirmation.js';
|
|
4
|
+
/** Why a phase-2 token was refused. `DRAFT_CHANGED` covers any target, not only drafts. */
|
|
5
|
+
export type ConfirmTokenError = 'DRAFT_CHANGED' | 'TOKEN_EXPIRED' | 'TOKEN_REUSED' | 'TOKEN_INVALID';
|
|
6
|
+
/** Which part of the binding moved, for a `DRAFT_CHANGED`. */
|
|
7
|
+
export type ConfirmTokenChange = 'revision-changed' | 'payload-changed';
|
|
8
|
+
/** What a token is bound to. Every field must match on phase 2. */
|
|
9
|
+
export interface ConfirmTokenBinding {
|
|
10
|
+
/** The tool that issued it; a token never crosses tools. */
|
|
11
|
+
tool: string;
|
|
12
|
+
/** The account / principal the action runs as. Absent binds as absent. */
|
|
13
|
+
account?: string;
|
|
14
|
+
/** The draftId / messageId / fileId / query the action targets. */
|
|
15
|
+
target: string;
|
|
16
|
+
/** A version of the target that rotates on edit. Absent binds as absent. */
|
|
17
|
+
revision?: string;
|
|
18
|
+
/** {@link hashConfirmPayload} of the canonical payload. */
|
|
19
|
+
payloadHash: string;
|
|
20
|
+
}
|
|
21
|
+
/** The verdict on a phase-2 token. Only `ok` spends it. */
|
|
22
|
+
export type ConfirmTokenVerdict = {
|
|
23
|
+
ok: true;
|
|
24
|
+
} | {
|
|
25
|
+
ok: false;
|
|
26
|
+
error: 'DRAFT_CHANGED';
|
|
27
|
+
reason: ConfirmTokenChange;
|
|
28
|
+
} | {
|
|
29
|
+
ok: false;
|
|
30
|
+
error: Exclude<ConfirmTokenError, 'DRAFT_CHANGED'>;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Tokens already used, keyed by nonce until they would have expired anyway.
|
|
34
|
+
* In memory: with a key shared across processes, a restart or a second instance
|
|
35
|
+
* would accept a spent token again until it expires.
|
|
36
|
+
*/
|
|
37
|
+
export interface SpentTokenStore {
|
|
38
|
+
has(nonce: string): boolean;
|
|
39
|
+
add(nonce: string, expiresAtMs: number): void;
|
|
40
|
+
/** Drop entries that expired before `now`. */
|
|
41
|
+
prune(now: number): void;
|
|
42
|
+
clear(): void;
|
|
43
|
+
readonly size: number;
|
|
44
|
+
}
|
|
45
|
+
/** A fresh in-memory {@link SpentTokenStore}. */
|
|
46
|
+
export declare function createSpentTokenStore(): SpentTokenStore;
|
|
47
|
+
/**
|
|
48
|
+
* SHA-256 (base64url) of a payload's canonical form: keys sorted, undefined
|
|
49
|
+
* dropped, bytes/Dates/Maps/Sets typed. The same canonical form
|
|
50
|
+
* `requireConfirmation`'s `binding` commits to.
|
|
51
|
+
*/
|
|
52
|
+
export declare function hashConfirmPayload(payload: unknown): string;
|
|
53
|
+
/** Options shared by {@link issueConfirmToken} and {@link verifyConfirmToken}. */
|
|
54
|
+
export interface ConfirmTokenClock {
|
|
55
|
+
/** Epoch ms; defaults to `Date.now()`. */
|
|
56
|
+
now?: number;
|
|
57
|
+
}
|
|
58
|
+
/** Mint a phase-1 token for `binding`. */
|
|
59
|
+
export declare function issueConfirmToken(key: string | Uint8Array, binding: ConfirmTokenBinding, options?: ConfirmTokenClock & {
|
|
60
|
+
ttlSeconds?: number;
|
|
61
|
+
}): {
|
|
62
|
+
token: string;
|
|
63
|
+
expiresAt: string;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Check a phase-2 token against the binding recomputed from a FRESH read. Only
|
|
67
|
+
* an `ok` verdict spends it; a `DRAFT_CHANGED` leaves it unspent, since the
|
|
68
|
+
* approval it carries is still true of the content it names.
|
|
69
|
+
*/
|
|
70
|
+
export declare function verifyConfirmToken(key: string | Uint8Array, token: string, binding: ConfirmTokenBinding, options?: ConfirmTokenClock & {
|
|
71
|
+
spent?: SpentTokenStore;
|
|
72
|
+
}): ConfirmTokenVerdict;
|
|
73
|
+
/** The phase-1 instruction a tool returns unless it supplies its own. */
|
|
74
|
+
export declare const CONFIRM_TOKEN_INSTRUCTION: string;
|
|
75
|
+
/** The `confirmToken` input a gated tool adds to its schema. */
|
|
76
|
+
export declare const confirmTokenParam: z.ZodOptional<z.ZodString>;
|
|
77
|
+
/** What a token binds, recomputed from a fresh read on every call. */
|
|
78
|
+
export interface ConfirmSubject {
|
|
79
|
+
/** The draftId / messageId / fileId / query the action targets. */
|
|
80
|
+
target: string;
|
|
81
|
+
/** A version of the target that rotates on edit. */
|
|
82
|
+
revision?: string;
|
|
83
|
+
/** Canonical payload; its hash is bound into the token. */
|
|
84
|
+
payload: unknown;
|
|
85
|
+
/** The complete preview shown to the user. */
|
|
86
|
+
preview: Record<string, unknown>;
|
|
87
|
+
}
|
|
88
|
+
/** Enables the token fallback. See {@link requireConfirmationWithFallback}. */
|
|
89
|
+
export interface ConfirmTokenFallback {
|
|
90
|
+
/** HMAC key, at least 32 bytes; the same for every process that may see phase 2. */
|
|
91
|
+
key: string | Uint8Array;
|
|
92
|
+
/** The tool name the token is bound to. */
|
|
93
|
+
tool: string;
|
|
94
|
+
/** The account the action runs as. */
|
|
95
|
+
account?: string;
|
|
96
|
+
/** The phase-2 token, or undefined on phase 1. */
|
|
97
|
+
confirmToken?: string;
|
|
98
|
+
/**
|
|
99
|
+
* Build the subject from a FRESH read. Called only when the fallback runs,
|
|
100
|
+
* so an extra read here never touches the elicitation path. May return an
|
|
101
|
+
* error result (a failed read), which is passed back unchanged.
|
|
102
|
+
*/
|
|
103
|
+
subject: () => ConfirmSubject | CallToolResult | Promise<ConfirmSubject | CallToolResult>;
|
|
104
|
+
/** Token lifetime; default 600 s. */
|
|
105
|
+
ttlSeconds?: number;
|
|
106
|
+
/** Phase 1's instruction; defaults to {@link CONFIRM_TOKEN_INSTRUCTION}. */
|
|
107
|
+
instruction?: string;
|
|
108
|
+
/** Spent-token store; defaults to a process-wide one. */
|
|
109
|
+
spent?: SpentTokenStore;
|
|
110
|
+
}
|
|
111
|
+
/** {@link RequireConfirmationOptions} plus the optional token fallback. */
|
|
112
|
+
export interface RequireConfirmationWithFallbackOptions extends RequireConfirmationOptions {
|
|
113
|
+
/**
|
|
114
|
+
* Pass to replace the refusal a caller that cannot be prompted would get
|
|
115
|
+
* with the two-phase token flow. Omit to keep the refusal. Whether it is on
|
|
116
|
+
* is the caller's decision (typically an opt-in env var).
|
|
117
|
+
*/
|
|
118
|
+
tokenFallback?: ConfirmTokenFallback;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* {@link requireConfirmation}, with an opt-in second rail for a caller that
|
|
122
|
+
* cannot be prompted.
|
|
123
|
+
*
|
|
124
|
+
* Elicitation stays primary and is untouched: a caller that can be asked is
|
|
125
|
+
* asked, and `tokenFallback.subject` is never called. Only when the caller
|
|
126
|
+
* declares it cannot be prompted AND `tokenFallback` is given does the
|
|
127
|
+
* two-phase token flow run instead of the refusal. `undefined` means proceed;
|
|
128
|
+
* anything else is the result to return unchanged.
|
|
129
|
+
*/
|
|
130
|
+
export declare function requireConfirmationWithFallback(ctx: ServerContext, options: RequireConfirmationWithFallbackOptions): Promise<InputRequiredResult | CallToolResult | undefined>;
|
|
131
|
+
//# sourceMappingURL=confirm-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-token.d.ts","sourceRoot":"","sources":["../../src/server/confirm-token.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The confirm-token fallback: a human-approval step for a client that cannot
|
|
3
|
+
* show an MCP elicitation prompt.
|
|
4
|
+
*
|
|
5
|
+
* {@link requireConfirmation} asks through elicitation and REFUSES a caller that
|
|
6
|
+
* declares none. Measured: claude.ai declares none, so every confirmation-gated
|
|
7
|
+
* tool is inert there. This module is the opt-in way through, hoisted out of
|
|
8
|
+
* gogcli-mcp, where it was first built for its Gmail/Chat/Drive/Classroom/
|
|
9
|
+
* Calendar dispatches:
|
|
10
|
+
*
|
|
11
|
+
* 1. Phase 1: the tool is called without a token. Nothing happens. It returns
|
|
12
|
+
* `status: "confirmation-required"`, the full preview and a `confirmToken`,
|
|
13
|
+
* with an instruction to show the preview to the user and call again only
|
|
14
|
+
* after they approve in chat.
|
|
15
|
+
* 2. Phase 2: the same call plus `confirmToken`. The tool RE-READS what it would
|
|
16
|
+
* act on, and proceeds only if that still matches what the token was issued
|
|
17
|
+
* for.
|
|
18
|
+
*
|
|
19
|
+
* A token is an HMAC-SHA256 over the tool, account, target, the target's
|
|
20
|
+
* revision (a draft's messageId, an event's etag) and a SHA-256 of the
|
|
21
|
+
* canonical payload, with an expiry. It is single-use through a spent-token
|
|
22
|
+
* store. A mismatch returns `DRAFT_CHANGED` with a fresh preview and token;
|
|
23
|
+
* otherwise `TOKEN_EXPIRED`, `TOKEN_REUSED` or `TOKEN_INVALID`. None of them acts.
|
|
24
|
+
*
|
|
25
|
+
* WHAT THIS DOES AND DOES NOT PROVE. With elicitation the host asks the user and
|
|
26
|
+
* the model never holds the approval. Here the approval IS a tool argument, so
|
|
27
|
+
* the check that a human approved is the model following the instruction. The
|
|
28
|
+
* token guarantees what happens is exactly what was previewed, once, for that
|
|
29
|
+
* tool, account and target, and that a preview call came first (unlike a bare
|
|
30
|
+
* `confirm: true`). It cannot prove a human said yes, which is why callers
|
|
31
|
+
* should make it opt-in.
|
|
32
|
+
*
|
|
33
|
+
* Deliberately env-free: the caller supplies the key, the TTL and whether the
|
|
34
|
+
* fallback is on, as {@link ConfirmationBinding} does.
|
|
35
|
+
*/
|
|
36
|
+
import { createHash, createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
37
|
+
import { z } from 'zod';
|
|
38
|
+
import { callerAcceptsFormElicitation } from '../caller/index.js';
|
|
39
|
+
import { textResult } from '../response/index.js';
|
|
40
|
+
import { canonicalJson } from './canonical.js';
|
|
41
|
+
import { requireConfirmation } from './confirmation.js';
|
|
42
|
+
/** A fresh in-memory {@link SpentTokenStore}. */
|
|
43
|
+
export function createSpentTokenStore() {
|
|
44
|
+
const spent = new Map();
|
|
45
|
+
return {
|
|
46
|
+
has: (nonce) => spent.has(nonce),
|
|
47
|
+
add: (nonce, exp) => { spent.set(nonce, exp); },
|
|
48
|
+
prune: (now) => { for (const [nonce, exp] of spent)
|
|
49
|
+
if (exp < now)
|
|
50
|
+
spent.delete(nonce); },
|
|
51
|
+
clear: () => spent.clear(),
|
|
52
|
+
get size() { return spent.size; },
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// The default store: process-wide, so one approval acts once however many
|
|
56
|
+
// tools in this process verify tokens. Pass `spent` to scope or reset it.
|
|
57
|
+
const PROCESS_SPENT = createSpentTokenStore();
|
|
58
|
+
const PREFIX = 'mcpu.token.v1.';
|
|
59
|
+
const DEFAULT_TTL_SECONDS = 600;
|
|
60
|
+
function tokenKey(key) {
|
|
61
|
+
const bytes = typeof key === 'string' ? Buffer.from(key, 'utf8') : Buffer.from(key);
|
|
62
|
+
if (bytes.length < 32)
|
|
63
|
+
throw new RangeError('confirm token: key must be at least 32 bytes.');
|
|
64
|
+
return bytes;
|
|
65
|
+
}
|
|
66
|
+
function ttlOf(ttlSeconds) {
|
|
67
|
+
if (ttlSeconds === undefined)
|
|
68
|
+
return DEFAULT_TTL_SECONDS;
|
|
69
|
+
if (!(Number.isFinite(ttlSeconds) && ttlSeconds > 0)) {
|
|
70
|
+
throw new RangeError('confirm token: ttlSeconds must be a finite number greater than 0.');
|
|
71
|
+
}
|
|
72
|
+
return ttlSeconds;
|
|
73
|
+
}
|
|
74
|
+
function sign(key, body) {
|
|
75
|
+
return createHmac('sha256', key).update(`${PREFIX}${body}`).digest();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* SHA-256 (base64url) of a payload's canonical form: keys sorted, undefined
|
|
79
|
+
* dropped, bytes/Dates/Maps/Sets typed. The same canonical form
|
|
80
|
+
* `requireConfirmation`'s `binding` commits to.
|
|
81
|
+
*/
|
|
82
|
+
export function hashConfirmPayload(payload) {
|
|
83
|
+
return createHash('sha256').update(canonicalJson(payload)).digest('base64url');
|
|
84
|
+
}
|
|
85
|
+
/** Mint a phase-1 token for `binding`. */
|
|
86
|
+
export function issueConfirmToken(key, binding, options = {}) {
|
|
87
|
+
const k = tokenKey(key);
|
|
88
|
+
const now = options.now ?? Date.now();
|
|
89
|
+
const exp = now + ttlOf(options.ttlSeconds) * 1000;
|
|
90
|
+
const claims = {
|
|
91
|
+
t: binding.tool,
|
|
92
|
+
...(binding.account === undefined ? {} : { a: binding.account }),
|
|
93
|
+
g: binding.target,
|
|
94
|
+
...(binding.revision === undefined ? {} : { r: binding.revision }),
|
|
95
|
+
h: binding.payloadHash,
|
|
96
|
+
exp,
|
|
97
|
+
n: randomBytes(16).toString('base64url'),
|
|
98
|
+
};
|
|
99
|
+
const body = Buffer.from(JSON.stringify(claims), 'utf8').toString('base64url');
|
|
100
|
+
return { token: `${PREFIX}${body}.${sign(k, body).toString('base64url')}`, expiresAt: new Date(exp).toISOString() };
|
|
101
|
+
}
|
|
102
|
+
function parseClaims(body) {
|
|
103
|
+
try {
|
|
104
|
+
const claims = JSON.parse(Buffer.from(body, 'base64url').toString('utf8'));
|
|
105
|
+
return claims && typeof claims === 'object' ? claims : undefined;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Check a phase-2 token against the binding recomputed from a FRESH read. Only
|
|
113
|
+
* an `ok` verdict spends it; a `DRAFT_CHANGED` leaves it unspent, since the
|
|
114
|
+
* approval it carries is still true of the content it names.
|
|
115
|
+
*/
|
|
116
|
+
export function verifyConfirmToken(key, token, binding, options = {}) {
|
|
117
|
+
const k = tokenKey(key);
|
|
118
|
+
const now = options.now ?? Date.now();
|
|
119
|
+
const spent = options.spent ?? PROCESS_SPENT;
|
|
120
|
+
spent.prune(now);
|
|
121
|
+
if (!token.startsWith(PREFIX))
|
|
122
|
+
return { ok: false, error: 'TOKEN_INVALID' };
|
|
123
|
+
const rest = token.slice(PREFIX.length);
|
|
124
|
+
const dot = rest.indexOf('.');
|
|
125
|
+
const body = dot < 0 ? '' : rest.slice(0, dot);
|
|
126
|
+
const mac = Buffer.from(dot < 0 ? '' : rest.slice(dot + 1), 'base64url');
|
|
127
|
+
const expected = sign(k, body);
|
|
128
|
+
if (!body || mac.length !== expected.length || !timingSafeEqual(mac, expected))
|
|
129
|
+
return { ok: false, error: 'TOKEN_INVALID' };
|
|
130
|
+
const claims = parseClaims(body);
|
|
131
|
+
if (!claims)
|
|
132
|
+
return { ok: false, error: 'TOKEN_INVALID' };
|
|
133
|
+
if (claims.t !== binding.tool || claims.a !== binding.account || claims.g !== binding.target) {
|
|
134
|
+
return { ok: false, error: 'TOKEN_INVALID' };
|
|
135
|
+
}
|
|
136
|
+
if (spent.has(claims.n))
|
|
137
|
+
return { ok: false, error: 'TOKEN_REUSED' };
|
|
138
|
+
if (now > claims.exp)
|
|
139
|
+
return { ok: false, error: 'TOKEN_EXPIRED' };
|
|
140
|
+
if (claims.r !== binding.revision)
|
|
141
|
+
return { ok: false, error: 'DRAFT_CHANGED', reason: 'revision-changed' };
|
|
142
|
+
if (claims.h !== binding.payloadHash)
|
|
143
|
+
return { ok: false, error: 'DRAFT_CHANGED', reason: 'payload-changed' };
|
|
144
|
+
spent.add(claims.n, claims.exp);
|
|
145
|
+
return { ok: true };
|
|
146
|
+
}
|
|
147
|
+
/** The phase-1 instruction a tool returns unless it supplies its own. */
|
|
148
|
+
export const CONFIRM_TOKEN_INSTRUCTION = 'Show this preview to the user verbatim and proceed only after they explicitly approve in chat. '
|
|
149
|
+
+ 'Then call again with confirmToken.';
|
|
150
|
+
/** The `confirmToken` input a gated tool adds to its schema. */
|
|
151
|
+
export const confirmTokenParam = z.string().optional().describe('ONLY for the two-step confirmation fallback (a client without MCP elicitation). The confirmToken from this same '
|
|
152
|
+
+ 'tool\'s phase-1 "confirmation-required" response, passed back ONLY after the user has seen that preview and '
|
|
153
|
+
+ 'explicitly approved it in chat — never on the first call, never invented, never reused. Call again with the '
|
|
154
|
+
+ 'same arguments. Ignored when the client supports elicitation.');
|
|
155
|
+
const TOKEN_ERROR_NOTE = {
|
|
156
|
+
TOKEN_EXPIRED: 'Nothing was sent or changed: the confirmToken expired. Call again WITHOUT confirmToken for a fresh '
|
|
157
|
+
+ 'preview, and ask the user to approve it again.',
|
|
158
|
+
TOKEN_REUSED: 'Nothing was sent or changed by this call: this confirmToken was already used, and one approval acts '
|
|
159
|
+
+ 'once. If doing it again is really intended, call again WITHOUT confirmToken and get a new approval.',
|
|
160
|
+
TOKEN_INVALID: 'Nothing was sent or changed: this confirmToken was not issued by this server for this tool, account '
|
|
161
|
+
+ 'and target (or the server has restarted since). Call again WITHOUT confirmToken for a fresh preview and approval.',
|
|
162
|
+
};
|
|
163
|
+
const CHANGED_NOTE = {
|
|
164
|
+
'revision-changed': 'Nothing was sent or changed: the target was edited since the user approved it (its version '
|
|
165
|
+
+ 'rotated), so what would happen is not what they saw.',
|
|
166
|
+
'payload-changed': 'Nothing was sent or changed: what would happen no longer matches what the user approved.',
|
|
167
|
+
};
|
|
168
|
+
function isToolResult(value) {
|
|
169
|
+
return Array.isArray(value.content);
|
|
170
|
+
}
|
|
171
|
+
function rejection(data) {
|
|
172
|
+
return { ...textResult({ status: 'confirmation-rejected', confirmed: false, dispatched: false, ...data }), isError: true };
|
|
173
|
+
}
|
|
174
|
+
async function tokenConfirmation(action, fb) {
|
|
175
|
+
const subject = await fb.subject();
|
|
176
|
+
if (isToolResult(subject))
|
|
177
|
+
return subject;
|
|
178
|
+
const binding = {
|
|
179
|
+
tool: fb.tool,
|
|
180
|
+
...(fb.account === undefined ? {} : { account: fb.account }),
|
|
181
|
+
target: subject.target,
|
|
182
|
+
...(subject.revision === undefined ? {} : { revision: subject.revision }),
|
|
183
|
+
payloadHash: hashConfirmPayload(subject.payload),
|
|
184
|
+
};
|
|
185
|
+
const phaseOne = () => {
|
|
186
|
+
const { token, expiresAt } = issueConfirmToken(fb.key, binding, { ttlSeconds: fb.ttlSeconds });
|
|
187
|
+
return {
|
|
188
|
+
action,
|
|
189
|
+
preview: subject.preview,
|
|
190
|
+
confirmToken: token,
|
|
191
|
+
expiresAt,
|
|
192
|
+
ttlSeconds: ttlOf(fb.ttlSeconds),
|
|
193
|
+
instruction: fb.instruction ?? CONFIRM_TOKEN_INSTRUCTION,
|
|
194
|
+
};
|
|
195
|
+
};
|
|
196
|
+
if (!fb.confirmToken) {
|
|
197
|
+
return textResult({ status: 'confirmation-required', confirmed: false, dispatched: false, ...phaseOne() });
|
|
198
|
+
}
|
|
199
|
+
const verdict = verifyConfirmToken(fb.key, fb.confirmToken, binding, { spent: fb.spent });
|
|
200
|
+
if (verdict.ok)
|
|
201
|
+
return undefined;
|
|
202
|
+
if (verdict.error === 'DRAFT_CHANGED') {
|
|
203
|
+
return rejection({
|
|
204
|
+
error: 'DRAFT_CHANGED',
|
|
205
|
+
reason: verdict.reason,
|
|
206
|
+
note: `${CHANGED_NOTE[verdict.reason]} The current preview and a fresh confirmToken are below.`,
|
|
207
|
+
...phaseOne(),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
return rejection({ error: verdict.error, action, note: TOKEN_ERROR_NOTE[verdict.error] });
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* {@link requireConfirmation}, with an opt-in second rail for a caller that
|
|
214
|
+
* cannot be prompted.
|
|
215
|
+
*
|
|
216
|
+
* Elicitation stays primary and is untouched: a caller that can be asked is
|
|
217
|
+
* asked, and `tokenFallback.subject` is never called. Only when the caller
|
|
218
|
+
* declares it cannot be prompted AND `tokenFallback` is given does the
|
|
219
|
+
* two-phase token flow run instead of the refusal. `undefined` means proceed;
|
|
220
|
+
* anything else is the result to return unchanged.
|
|
221
|
+
*/
|
|
222
|
+
export async function requireConfirmationWithFallback(ctx, options) {
|
|
223
|
+
const { tokenFallback, ...confirmation } = options;
|
|
224
|
+
if (tokenFallback && callerAcceptsFormElicitation(ctx) === false) {
|
|
225
|
+
return tokenConfirmation(options.action, tokenFallback);
|
|
226
|
+
}
|
|
227
|
+
return requireConfirmation(ctx, confirmation);
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=confirm-token.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confirm-token.js","sourceRoot":"","sources":["../../src/server/confirm-token.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirmation.d.ts","sourceRoot":"","sources":["../../src/server/confirmation.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"confirmation.d.ts","sourceRoot":"","sources":["../../src/server/confirmation.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AAYtC,+CAA+C;AAC/C,MAAM,WAAW,0BAA0B;IACzC,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B;AAED,sDAAsD;AACtD,MAAM,WAAW,mBAAmB;IAClC,+DAA+D;IAC/D,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC;IACzB,+EAA+E;IAC/E,IAAI,EAAE,OAAO,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAsDD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,0BAA0B,GAClC,mBAAmB,GAAG,cAAc,GAAG,SAAS,CAgFlD"}
|
|
@@ -2,74 +2,13 @@ import { acceptedContent, inputRequired, inputResponse, } from '@modelcontextpro
|
|
|
2
2
|
import { createHash, createHmac, timingSafeEqual } from 'node:crypto';
|
|
3
3
|
import { z } from 'zod';
|
|
4
4
|
import { callerAcceptsFormElicitation } from '../caller/index.js';
|
|
5
|
+
import { canonicalJson } from './canonical.js';
|
|
5
6
|
import { errorResult, textResult } from '../response/index.js';
|
|
6
7
|
const DEFAULT_REQUEST_KEY = 'confirmation';
|
|
7
8
|
const DEFAULT_CONFIRMATION_LABEL = 'Confirm this action should proceed.';
|
|
8
9
|
const UNSUPPORTED_NOTE = 'Nothing was done because this client cannot show a confirmation prompt '
|
|
9
10
|
+ '(it declares no MCP elicitation capability), and this action is never taken without one';
|
|
10
11
|
const STATE_PREFIX = 'mcpu.confirm.v1.';
|
|
11
|
-
/**
|
|
12
|
-
* A canonical, type-tagged serialisation of tool arguments for the binding
|
|
13
|
-
* commitment. Object keys are sorted, so `{a,b}` and `{b,a}` hash the same.
|
|
14
|
-
* Values JSON would flatten to `{}` are serialised faithfully instead — a
|
|
15
|
-
* `Date` as its ISO string, bytes (`Buffer`, typed arrays, `ArrayBuffer`) as
|
|
16
|
-
* base64, a `Map`/`Set` as its entries sorted by canonical form, a `bigint` as
|
|
17
|
-
* its digits — so two calls that differ only in such a value never share a
|
|
18
|
-
* commitment. Each typed value is a one-key `{"$tag":…}` object; a plain
|
|
19
|
-
* object's `$`-prefixed keys are escaped (see {@link escapeKey}), so a plain
|
|
20
|
-
* object that imitates a tag (`{ $bytes: 'dHdv' }`) never encodes the same as
|
|
21
|
-
* the typed value it imitates (`Buffer.from('two')`). Anything else that is not plain data (a class instance, a
|
|
22
|
-
* function, a symbol) cannot be compared honestly and is refused.
|
|
23
|
-
*/
|
|
24
|
-
function canonicalJson(value) {
|
|
25
|
-
if (value === null || typeof value === 'string' || typeof value === 'boolean')
|
|
26
|
-
return JSON.stringify(value);
|
|
27
|
-
if (value === undefined)
|
|
28
|
-
return 'null';
|
|
29
|
-
if (typeof value === 'number')
|
|
30
|
-
return Number.isFinite(value) ? JSON.stringify(value) : `{"$num":"${String(value)}"}`;
|
|
31
|
-
if (typeof value === 'bigint')
|
|
32
|
-
return `{"$bigint":"${value.toString()}"}`;
|
|
33
|
-
if (typeof value === 'function' || typeof value === 'symbol') {
|
|
34
|
-
throw new TypeError(`requireConfirmation: cannot bind a ${typeof value} argument value.`);
|
|
35
|
-
}
|
|
36
|
-
if (Array.isArray(value))
|
|
37
|
-
return `[${value.map(canonicalJson).join(',')}]`;
|
|
38
|
-
if (value instanceof Date) {
|
|
39
|
-
return `{"$date":${JSON.stringify(Number.isNaN(value.getTime()) ? 'Invalid Date' : value.toISOString())}}`;
|
|
40
|
-
}
|
|
41
|
-
if (ArrayBuffer.isView(value)) {
|
|
42
|
-
const bytes = Buffer.from(value.buffer, value.byteOffset, value.byteLength);
|
|
43
|
-
return `{"$bytes":${JSON.stringify(bytes.toString('base64'))}}`;
|
|
44
|
-
}
|
|
45
|
-
if (value instanceof ArrayBuffer)
|
|
46
|
-
return `{"$bytes":${JSON.stringify(Buffer.from(value).toString('base64'))}}`;
|
|
47
|
-
if (value instanceof Map) {
|
|
48
|
-
const entries = [...value.entries()].map(([k, v]) => `[${canonicalJson(k)},${canonicalJson(v)}]`).sort();
|
|
49
|
-
return `{"$map":[${entries.join(',')}]}`;
|
|
50
|
-
}
|
|
51
|
-
if (value instanceof Set) {
|
|
52
|
-
return `{"$set":[${[...value].map(canonicalJson).sort().join(',')}]}`;
|
|
53
|
-
}
|
|
54
|
-
const proto = Object.getPrototypeOf(value);
|
|
55
|
-
if (proto !== Object.prototype && proto !== null) {
|
|
56
|
-
throw new TypeError('requireConfirmation: cannot bind a non-plain object argument value (class instance).');
|
|
57
|
-
}
|
|
58
|
-
const entries = Object.entries(value)
|
|
59
|
-
.filter(([, v]) => v !== undefined)
|
|
60
|
-
.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
|
|
61
|
-
return `{${entries.map(([k, v]) => `${JSON.stringify(escapeKey(k))}:${canonicalJson(v)}`).join(',')}}`;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Escape a plain-object key so it can never collide with a type tag. Tags are
|
|
65
|
-
* `$` followed by a letter (`$bytes`, `$date`, …); every plain key that starts
|
|
66
|
-
* with `$` gains one more, so plain keys starting with `$` always start with
|
|
67
|
-
* `$$` and never match a tag. Prefixing is injective, so distinct keys stay
|
|
68
|
-
* distinct (`$x` → `$$x`, `$$x` → `$$$x`).
|
|
69
|
-
*/
|
|
70
|
-
function escapeKey(key) {
|
|
71
|
-
return key.startsWith('$') ? `$${key}` : key;
|
|
72
|
-
}
|
|
73
12
|
function bindingKey(binding) {
|
|
74
13
|
if (binding.ttlSeconds !== undefined && !(Number.isFinite(binding.ttlSeconds) && binding.ttlSeconds > 0)) {
|
|
75
14
|
throw new RangeError('requireConfirmation: binding.ttlSeconds must be a finite number greater than 0.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../../src/server/confirmation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,GAId,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE/D,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAC3C,MAAM,0BAA0B,GAAG,qCAAqC,CAAC;AACzE,MAAM,gBAAgB,GAAG,yEAAyE;MAC9F,yFAAyF,CAAC;AAiE9F,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAExC
|
|
1
|
+
{"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../../src/server/confirmation.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -2,6 +2,8 @@ import type { StdioServerHandle } from '@modelcontextprotocol/server/stdio';
|
|
|
2
2
|
import { McpServer } from '@modelcontextprotocol/server';
|
|
3
3
|
import type { Transport } from '@modelcontextprotocol/server';
|
|
4
4
|
export * from './confirmation.js';
|
|
5
|
+
export * from './confirm-token.js';
|
|
6
|
+
export * from './confirm-env.js';
|
|
5
7
|
/**
|
|
6
8
|
* The handle {@link runMcp} returns — re-exported so a caller can name the
|
|
7
9
|
* type without importing the SDK's `/stdio` subpath itself.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,SAAS,EAA+B,MAAM,8BAA8B,CAAC;AACtF,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,8BAA8B,CAAC;AAI9E,cAAc,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.js
CHANGED
|
@@ -38,6 +38,8 @@ import { McpServer, SUPPORTED_PROTOCOL_VERSIONS } from '@modelcontextprotocol/se
|
|
|
38
38
|
import { McpToolError, redactSecrets } from '../errors/index.js';
|
|
39
39
|
import { errorResult } from '../response/index.js';
|
|
40
40
|
export * from './confirmation.js';
|
|
41
|
+
export * from './confirm-token.js';
|
|
42
|
+
export * from './confirm-env.js';
|
|
41
43
|
import { withCallSignal } from '../cancel/index.js';
|
|
42
44
|
import { withCallerCapabilities } from '../caller/index.js';
|
|
43
45
|
/** Protocol revisions supported by servers and the shared test harness. */
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EAAE,SAAS,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAEtF,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAsB5D,2EAA2E;AAC3E,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC;IACpD,YAAY;IACZ,GAAG,2BAA2B;CAC/B,CAAC,CAAC;AAoCH;;;;;;;GAOG;AACH,SAAS,mBAAmB,CAAC,GAAY;IACvC,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;QAC5C,OAAO,WAAW,CAAC,GAAG,GAAG,CAAC,OAAO,aAAa,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,GAAG,CAAC;AACZ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,cAAc,CAAC,IAAwB;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,GAAG,GAAI,GAA4B,CAAC,MAAM,CAAC;IACjD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC9D,0EAA0E;IAC1E,yEAAyE;IACzE,OAAO,OAAQ,GAA4B,CAAC,MAAM,KAAK,UAAU;QAC/D,CAAC,CAAE,GAA4C;QAC/C,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAS,cAAc,CAAC,IAAwB;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,GAAG,GAAI,GAA4B,CAAC,MAAM,CAAC;IACjD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,MAAM,GAAI,GAA4B,CAAC,MAAM,CAAC;IACpD,OAAO,MAAM,YAAY,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5D,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,wBAAwB,CAAC,MAAiB;IACjD,MAAM,KAAK,GAAI,MAA0C,CAAC,MAAM,CAAC;IACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAClE,MAAM,IAAI,GAAI,KAA6C,CAAC,qBAAqB,CAAC;IAClF,IAAI,OAAO,IAAI,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAI,IAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI;YACtD,CAAC,CAAE,QAA+B;YAClC,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAEpC,CAAC;IAEb,6EAA6E;IAC7E,uEAAuE;IACvE,kEAAkE;IACjE,MAA+C,CAAC,YAAY,GAAG,CAC9D,IAAa,EACb,MAAe,EACf,EAAoE,EAC3D,EAAE,CACX,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;IAC5C,gEAAgE;IAChE,qEAAqE;IACrE,mEAAmE;IACnE,mEAAmE;IACnE,oEAAoE;IACpE,mEAAmE;IACnE,gEAAgE;IAChE,2CAA2C;IAC3C,EAAE;IACF,iEAAiE;IACjE,mEAAmE;IACnE,8DAA8D;IAC9D,cAAc,CACZ,cAAc,CAAC,IAAI,CAAC,EACpB,GAAG,EAAE;IACH,kEAAkE;IAClE,mEAAmE;IACnE,oEAAoE;IACpE,oEAAoE;IACpE,qEAAqE;IACrE,iEAAiE;IACjE,mCAAmC;IACnC,sBAAsB,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE;QAC5D,IAAI,MAAgD,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,MAAM,YAAY,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAChF,CAAC,CAAC,EACJ,cAAc,CAAC,IAAI,CAAC,CACrB,CACF,CAAC;AACN,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAmC;IAEnC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAC1C,EAAE,yBAAyB,EAAE,CAAC,GAAG,wBAAwB,CAAC,EAAE,CAC7D,CAAC;IAEF,qEAAqE;IACrE,IAAI,IAAI,CAAC,YAAY,KAAK,KAAK;QAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAE1D,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,wEAAwE;QACxE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,6EAA6E;IAC7E,2EAA2E;IAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAa,CAAC;IAChC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAClC,MAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AA6CD,kDAAkD;AAClD,MAAM,2BAA2B,GAAG,IAAI,CAAC;AACzC,kFAAkF;AAClF,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAE3C;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAiB,EACjB,IAAI,GAA4B,EAAE;IAElC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IACrC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;QAC7F,MAAM,IAAI,UAAU,CAAC,yEAAyE,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,2BAA2B,CAAC;IAChE,IACE,IAAI,CAAC,mBAAmB,KAAK,SAAS;QACtC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,mBAAmB,IAAI,CAAC,CAAC,EAC7E,CAAC;QACD,MAAM,IAAI,UAAU,CAAC,yEAAyE,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,IAAI,8BAA8B,CAAC;IACjF,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,MAAM,QAAQ,GAAG,GAAS,EAAE;QAC1B,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,GAAG,IAAI,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,CAAC,MAAsB,EAAQ,EAAE;QAC/C,IAAI,YAAY,EAAE,CAAC;YACjB,uEAAuE;YACvE,wEAAwE;YACxE,0CAA0C;YAC1C,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,aAAa;gBAAE,OAAO;YACvD,iDAAiD;YACjD,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,sBAAsB,MAAM,gCAAgC,CAAC,CAAC;gBAC5E,QAAQ,EAAE,CAAC;YACb,CAAC;YACD,OAAO;QACT,CAAC;QACD,YAAY,GAAG,IAAI,CAAC;QACpB,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,KAAgD,CAAC;QACrD,IAAI,UAAU,EAAE,CAAC;YACf,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,OAAO,CAAC,KAAK,CAAC,oCAAoC,MAAM,sBAAsB,SAAS,cAAc,CAAC,CAAC;gBACvG,QAAQ,EAAE,CAAC;YACb,CAAC,EAAE,SAAS,CAAC,CAAC;YACd,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QAClB,CAAC;QACD,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC/C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACvB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CACX,iDAAiD,MAAM,KACrD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,IAAI,KAAK,KAAK,SAAS;oBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,UAAU;oBAAE,QAAQ,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;AAClD,CAAC;AA+CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,MAAM,CAAkB,IAA0B;IAChE,2EAA2E;IAC3E,0DAA0D;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC9B,wEAAwE;QACxE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,IAAI,GAAkB,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;IAEtD,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE;QAC/E,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,OAAO;QAC9B,OAAO,EACL,IAAI,CAAC,OAAO;YACZ,CAAC,CAAC,KAAY,EAAE,EAAE;gBAChB,uEAAuE;gBACvE,kEAAkE;gBAClE,kEAAkE;gBAClE,qEAAqE;gBACrE,gEAAgE;gBAChE,oEAAoE;gBACpE,+DAA+D;gBAC/D,OAAO,CAAC,KAAK,CAAC,mCAAmC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACnF,CAAC,CAAC;QACJ,wEAAwE;QACxE,0EAA0E;QAC1E,qEAAqE;QACrE,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;KACjD,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC;IACvC,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,oBAAoB,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/zod/index.d.ts
CHANGED
|
@@ -63,7 +63,13 @@ export declare const schemaOrigin: z.ZodOptional<z.ZodString>;
|
|
|
63
63
|
* `confirm: true` the tool returns a preview instead of performing the action.
|
|
64
64
|
* (honeybook pay_invoice / sign_contract)
|
|
65
65
|
*
|
|
66
|
-
* @deprecated
|
|
66
|
+
* @deprecated Use `requireConfirmationWithFallback(ctx, confirmationFromEnv({...}))`
|
|
67
|
+
* with `confirmTokenParam` instead: a real prompt where the client supports
|
|
68
|
+
* one, and elsewhere a preview token that forces a preview call first, binds
|
|
69
|
+
* the exact arguments and is single-use (MCP_CONFIRM_MODE: ask-user | auto |
|
|
70
|
+
* refuse). The fleet moved off this parameter in September 2026.
|
|
71
|
+
*
|
|
72
|
+
* Previously: prefer `requireConfirmation` where the client supports it — the
|
|
67
73
|
* confirmation is then a protocol exchange rather than a tool argument, so a
|
|
68
74
|
* model cannot satisfy the gate itself by setting a boolean. The description
|
|
69
75
|
* below is the weakness made literal: it tells an attacker-controlled model
|
package/dist/zod/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/zod/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,2CAA2C;AAC3C,eAAO,MAAM,WAAW,aAA8B,CAAC;AAEvD,uCAAuC;AACvC,eAAO,MAAM,SAAS,aAAiC,CAAC;AAExD,uEAAuE;AACvE,eAAO,MAAM,cAAc,aAAoB,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,OAAO,cAAe,CAAC;AAEpC;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,aAEqD,CAAC;AAE1E;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,aAG0D,CAAC;AAEvF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,eAAe,aAOzB,CAAC;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,YAAY,4BAKtB,CAAC;AAEJ
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/zod/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,2CAA2C;AAC3C,eAAO,MAAM,WAAW,aAA8B,CAAC;AAEvD,uCAAuC;AACvC,eAAO,MAAM,SAAS,aAAiC,CAAC;AAExD,uEAAuE;AACvE,eAAO,MAAM,cAAc,aAAoB,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,OAAO,cAAe,CAAC;AAEpC;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,aAEqD,CAAC;AAE1E;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,aAG0D,CAAC;AAEvF;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,eAAe,aAOzB,CAAC;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,YAAY,4BAKtB,CAAC;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,aAAa,6BAGuD,CAAC;AAMlF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB;aAC3B,MAAM;aACN,KAAK;CAOG,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,UAAU;aACrB,QAAQ;aACR,SAAS;CAOD,CAAC;AAEX;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAIlE;AAMD,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,2CAA2C;AAC3C,MAAM,WAAW,oBAAoB;IACnC,oFAAoF;IACpF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;;;;;;OAiBG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,oBAAyB,GAAG,eAAe,CAchF;AAMD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAOpE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS,CAuBlF;AAED,cAAc,oBAAoB,CAAC"}
|
package/dist/zod/index.js
CHANGED
|
@@ -79,7 +79,13 @@ export const schemaOrigin = z
|
|
|
79
79
|
* `confirm: true` the tool returns a preview instead of performing the action.
|
|
80
80
|
* (honeybook pay_invoice / sign_contract)
|
|
81
81
|
*
|
|
82
|
-
* @deprecated
|
|
82
|
+
* @deprecated Use `requireConfirmationWithFallback(ctx, confirmationFromEnv({...}))`
|
|
83
|
+
* with `confirmTokenParam` instead: a real prompt where the client supports
|
|
84
|
+
* one, and elsewhere a preview token that forces a preview call first, binds
|
|
85
|
+
* the exact arguments and is single-use (MCP_CONFIRM_MODE: ask-user | auto |
|
|
86
|
+
* refuse). The fleet moved off this parameter in September 2026.
|
|
87
|
+
*
|
|
88
|
+
* Previously: prefer `requireConfirmation` where the client supports it — the
|
|
83
89
|
* confirmation is then a protocol exchange rather than a tool argument, so a
|
|
84
90
|
* model cannot satisfy the gate itself by setting a boolean. The description
|
|
85
91
|
* below is the weakness made literal: it tells an attacker-controlled model
|
package/dist/zod/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/zod/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,2CAA2C;AAC3C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AAEvD,uCAAuC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;AAExD,uEAAuE;AACvE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;AAEpC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC;KACrB,MAAM,EAAE;KACR,KAAK,CAAC,4BAA4B,EAAE,iCAAiC,CAAC,CAAC;AAE1E;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,EAAE;KACR,KAAK,CAAC,OAAO,EAAE,oCAAoC,CAAC;KACpD,QAAQ,CAAC,yEAAyE,CAAC,CAAC;AAEvF;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,CAAC;KACN,KAAK,CAAC,aAAa,EAAE,+CAA+C,CAAC;KACrE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC;KACzD,QAAQ,CACP,wFAAwF,CACzF,CAAC;AAEJ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC;KAC1B,MAAM,EAAE;KACR,QAAQ,EAAE;KACV,QAAQ,CACP,mIAAmI,CACpI,CAAC;AAEJ
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/zod/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chrischall/mcp-utils",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.6.0",
|
|
4
4
|
"description": "Shared scaffolding for the chrischall MCP fleet — server bootstrap, tool-result formatting, helpful errors, hardened env/config, a bearer API-client kit, zod atoms, session registries, a fetchproxy transport adapter, auth resolver skeletons, an in-memory test harness, and opt-in HTML helpers. The generic MCP glue hoisted out of ~19 sibling servers.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|