@chrischall/mcp-utils 2.4.0 → 2.5.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 CHANGED
@@ -156,6 +156,77 @@ 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
+ **It is weaker than elicitation.** The approval is a tool argument, so "a human
223
+ approved" rests on the model following the instruction. The token guarantees a
224
+ preview call came first, that what happens is exactly what was previewed, and
225
+ that it happens once. That is still stronger than a bare `confirm: true`, which
226
+ a model can pass on its first call. Make it opt-in. `issueConfirmToken`,
227
+ `verifyConfirmToken` and `hashConfirmPayload` are exported for a flow that
228
+ needs the primitives directly.
229
+
159
230
  ### `response` — tool-result formatting
160
231
 
161
232
  `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":"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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":"AAoCA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AACvG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,EAAuB,KAAK,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAEzF,2FAA2F;AAC3F,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG,eAAe,GAAG,cAAc,GAAG,eAAe,CAAC;AAErG,8DAA8D;AAC9D,MAAM,MAAM,kBAAkB,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAExE,mEAAmE;AACnE,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,2DAA2D;AAC3D,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,kBAAkB,CAAA;CAAE,GACjE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAA;CAAE,CAAC;AAEtE;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,8CAA8C;IAC9C,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,iDAAiD;AACjD,wBAAgB,qBAAqB,IAAI,eAAe,CASvD;AA6BD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAE3D;AAED,kFAAkF;AAClF,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,0CAA0C;AAC1C,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,GAAG,UAAU,EACxB,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE,iBAAiB,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACxD;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAetC;AAWD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,GAAG,UAAU,EACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE,iBAAiB,GAAG;IAAE,KAAK,CAAC,EAAE,eAAe,CAAA;CAAO,GAC5D,mBAAmB,CA0BrB;AAED,yEAAyE;AACzE,eAAO,MAAM,yBAAyB,QAEE,CAAC;AAEzC,gEAAgE;AAChE,eAAO,MAAM,iBAAiB,4BAK7B,CAAC;AAEF,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,+EAA+E;AAC/E,MAAM,WAAW,oBAAoB;IACnC,oFAAoF;IACpF,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC;IACzB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,OAAO,EAAE,MAAM,cAAc,GAAG,cAAc,GAAG,OAAO,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC;IAC1F,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,2EAA2E;AAC3E,MAAM,WAAW,sCAAuC,SAAQ,0BAA0B;IACxF;;;;OAIG;IACH,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC;AA8DD;;;;;;;;;GASG;AACH,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,sCAAsC,GAC9C,OAAO,CAAC,mBAAmB,GAAG,cAAc,GAAG,SAAS,CAAC,CAM3D"}
@@ -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;AAWtC,+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;AAgHD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,0BAA0B,GAClC,mBAAmB,GAAG,cAAc,GAAG,SAAS,CAgFlD"}
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":"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"}
1
+ {"version":3,"file":"confirmation.js","sourceRoot":"","sources":["../../src/server/confirmation.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ 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';
5
6
  /**
6
7
  * The handle {@link runMcp} returns — re-exported so a caller can name the
7
8
  * 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":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,7 @@ 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';
41
42
  import { withCallSignal } from '../cancel/index.js';
42
43
  import { withCallerCapabilities } from '../caller/index.js';
43
44
  /** Protocol revisions supported by servers and the shared test harness. */
@@ -1 +1 @@
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,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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/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.4.0",
3
+ "version": "2.5.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",