@chrischall/mcp-utils 2.15.0 → 3.0.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 +493 -26
- package/dist/auth/index.d.ts +25 -1
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +105 -14
- package/dist/auth/index.js.map +1 -1
- package/dist/config/index.d.ts +13 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +3 -2
- package/dist/config/index.js.map +1 -1
- package/dist/dates/index.d.ts +45 -5
- package/dist/dates/index.d.ts.map +1 -1
- package/dist/dates/index.js +64 -6
- package/dist/dates/index.js.map +1 -1
- package/dist/errors/index.d.ts +121 -7
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +154 -9
- package/dist/errors/index.js.map +1 -1
- package/dist/fs/output.d.ts +25 -8
- package/dist/fs/output.d.ts.map +1 -1
- package/dist/fs/output.js +27 -5
- package/dist/fs/output.js.map +1 -1
- package/dist/graphql/client.d.ts +8 -1
- package/dist/graphql/client.d.ts.map +1 -1
- package/dist/graphql/client.js +11 -3
- package/dist/graphql/client.js.map +1 -1
- package/dist/healthcheck/index.d.ts +11 -9
- package/dist/healthcheck/index.d.ts.map +1 -1
- package/dist/healthcheck/index.js +39 -23
- package/dist/healthcheck/index.js.map +1 -1
- package/dist/http/body-limit.d.ts +37 -0
- package/dist/http/body-limit.d.ts.map +1 -0
- package/dist/http/body-limit.js +86 -0
- package/dist/http/body-limit.js.map +1 -0
- package/dist/http/fetch-bounded.d.ts +91 -0
- package/dist/http/fetch-bounded.d.ts.map +1 -0
- package/dist/http/fetch-bounded.js +138 -0
- package/dist/http/fetch-bounded.js.map +1 -0
- package/dist/http/index.d.ts +231 -6
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +432 -56
- package/dist/http/index.js.map +1 -1
- package/dist/http/response-cache.d.ts +36 -3
- package/dist/http/response-cache.d.ts.map +1 -1
- package/dist/http/response-cache.js +84 -8
- package/dist/http/response-cache.js.map +1 -1
- package/dist/http/throttle.d.ts +37 -4
- package/dist/http/throttle.d.ts.map +1 -1
- package/dist/http/throttle.js +65 -6
- package/dist/http/throttle.js.map +1 -1
- package/dist/http/url-safety.d.ts +142 -0
- package/dist/http/url-safety.d.ts.map +1 -0
- package/dist/http/url-safety.js +211 -0
- package/dist/http/url-safety.js.map +1 -0
- package/dist/netguard/index.d.ts +196 -0
- package/dist/netguard/index.d.ts.map +1 -0
- package/dist/netguard/index.js +365 -0
- package/dist/netguard/index.js.map +1 -0
- package/dist/server/confirm-env.d.ts +17 -8
- package/dist/server/confirm-env.d.ts.map +1 -1
- package/dist/server/confirm-env.js +22 -13
- package/dist/server/confirm-env.js.map +1 -1
- package/dist/server/confirm-write.js +1 -1
- package/dist/server/confirm-write.js.map +1 -1
- package/dist/server/index.d.ts +6 -2
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +24 -9
- package/dist/server/index.js.map +1 -1
- package/dist/session/index.d.ts +6 -0
- package/dist/session/index.d.ts.map +1 -1
- package/dist/session/index.js +12 -1
- package/dist/session/index.js.map +1 -1
- package/dist/zod/index.d.ts +6 -0
- package/dist/zod/index.d.ts.map +1 -1
- package/dist/zod/index.js +8 -1
- package/dist/zod/index.js.map +1 -1
- package/package.json +11 -2
package/dist/errors/index.d.ts
CHANGED
|
@@ -12,19 +12,74 @@
|
|
|
12
12
|
export declare const DEFAULT_BOT_WALL_RETRY_AFTER_S = 30;
|
|
13
13
|
/** Default truncation budget for upstream error bodies surfaced to clients. */
|
|
14
14
|
export declare const DEFAULT_ERROR_MESSAGE_MAX = 500;
|
|
15
|
+
/**
|
|
16
|
+
* What kind of failure an {@link McpToolError} is, in the vocabulary of the
|
|
17
|
+
* credential healthcheck's arms (`@chrischall/mcp-utils/healthcheck`'s
|
|
18
|
+
* `CredentialHealthcheckArm`, minus `'ok'`):
|
|
19
|
+
*
|
|
20
|
+
* - `'no_credential'` — nothing to authenticate with;
|
|
21
|
+
* - `'credential_rejected'` — the far side refused the credential (401/403,
|
|
22
|
+
* a rejected grant, a GraphQL `UNAUTHENTICATED`);
|
|
23
|
+
* - `'edge_blocked'` — a CDN/WAF refused the request before the API saw it;
|
|
24
|
+
* - `'session_expired'` — credentials are fine, but no session is live;
|
|
25
|
+
* - `'verification_pending'` — a second factor is outstanding;
|
|
26
|
+
* - `'timeout'` — the far side did not answer in time;
|
|
27
|
+
* - `'http'` — the far side answered with an error status that is not an
|
|
28
|
+
* auth rejection (see `status` for which);
|
|
29
|
+
* - `'transport'` — the far side could not be reached at all;
|
|
30
|
+
* - `'too_large'` — the far side answered, but with a body larger than the
|
|
31
|
+
* caller's byte cap (`ResponseTooLargeError`);
|
|
32
|
+
* - `'unknown'` — none of the above is known.
|
|
33
|
+
*
|
|
34
|
+
* Fleet audit 2026-09, cluster 8: without this, repos classified failures by
|
|
35
|
+
* regex over the message text (`/401|403|forbidden/`, `/auth|sign/` matching
|
|
36
|
+
* "assign"). Branch on `err.kind` / `err.status` (or {@link errorKindOf} /
|
|
37
|
+
* {@link errorStatusOf}) instead.
|
|
38
|
+
*/
|
|
39
|
+
export type McpToolErrorKind = 'no_credential' | 'credential_rejected' | 'edge_blocked' | 'session_expired' | 'verification_pending' | 'timeout' | 'http' | 'transport' | 'too_large' | 'unknown';
|
|
40
|
+
/** Every {@link McpToolErrorKind}, for validating a `kind` read off an unknown error. */
|
|
41
|
+
export declare const MCP_TOOL_ERROR_KINDS: ReadonlySet<McpToolErrorKind>;
|
|
42
|
+
/** Constructor options for {@link McpToolError}. Every field is optional. */
|
|
43
|
+
export interface McpToolErrorOptions {
|
|
44
|
+
/** Actionable remediation text. */
|
|
45
|
+
hint?: string;
|
|
46
|
+
/** The underlying error, chained as `cause`. */
|
|
47
|
+
cause?: unknown;
|
|
48
|
+
/** The upstream HTTP status this failure came from, when there was one. */
|
|
49
|
+
status?: number;
|
|
50
|
+
/** What kind of failure this is. See {@link McpToolErrorKind}. */
|
|
51
|
+
kind?: McpToolErrorKind;
|
|
52
|
+
}
|
|
15
53
|
/**
|
|
16
54
|
* Base class for every tool-facing error. Carries an optional `hint` —
|
|
17
55
|
* actionable remediation text ("set ZOLA_REFRESH_TOKEN", "sign in at compass.com")
|
|
18
|
-
* the tool surface can present separately from the message
|
|
56
|
+
* the tool surface can present separately from the message — and, when the
|
|
57
|
+
* thrower knows them, the upstream HTTP `status` and a {@link McpToolErrorKind}
|
|
58
|
+
* `kind`, so callers classify a failure by structure rather than by matching
|
|
59
|
+
* its text. The library's own throwers (http, graphql, auth/session) set them.
|
|
19
60
|
*/
|
|
20
61
|
export declare class McpToolError extends Error {
|
|
21
62
|
/** Actionable remediation text, when one applies. */
|
|
22
63
|
readonly hint?: string;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
64
|
+
/** The upstream HTTP status this failure came from, when known. */
|
|
65
|
+
readonly status?: number;
|
|
66
|
+
/** What kind of failure this is, when the thrower knows. */
|
|
67
|
+
readonly kind?: McpToolErrorKind;
|
|
68
|
+
constructor(message: string, opts?: McpToolErrorOptions);
|
|
27
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* The HTTP status a thrown error carries: a numeric `status` (or `statusCode`)
|
|
72
|
+
* on the error or, failing that, on a short `cause` chain — so a hint-adding
|
|
73
|
+
* wrapper around an `ApiError` still answers 401. The outermost link that has
|
|
74
|
+
* one wins. `undefined` when none does. Duck-typed: any error class qualifies.
|
|
75
|
+
*/
|
|
76
|
+
export declare function errorStatusOf(err: unknown): number | undefined;
|
|
77
|
+
/**
|
|
78
|
+
* The {@link McpToolErrorKind} a thrown error declares, on itself or a short
|
|
79
|
+
* `cause` chain (outermost wins). A `kind` outside the vocabulary — another
|
|
80
|
+
* library's own `kind` field — is ignored, not returned. Duck-typed.
|
|
81
|
+
*/
|
|
82
|
+
export declare function errorKindOf(err: unknown): McpToolErrorKind | undefined;
|
|
28
83
|
/**
|
|
29
84
|
* The user's browser session isn't signed in to the upstream service. Distinct
|
|
30
85
|
* from a transient bot-wall — this is a stable "go authenticate" condition.
|
|
@@ -55,8 +110,10 @@ export declare class RateLimitError extends McpToolError {
|
|
|
55
110
|
}
|
|
56
111
|
/** Upstream is unreachable (5xx / transport failure) — not the caller's fault. */
|
|
57
112
|
export declare class UnreachableError extends McpToolError {
|
|
58
|
-
/**
|
|
59
|
-
|
|
113
|
+
/**
|
|
114
|
+
* @param status The upstream HTTP status, when one was observed. It becomes
|
|
115
|
+
* `status`, and the `kind` is `'http'` with one and `'transport'` without.
|
|
116
|
+
*/
|
|
60
117
|
constructor(service: string, status?: number);
|
|
61
118
|
}
|
|
62
119
|
/**
|
|
@@ -69,6 +126,59 @@ export declare class ModeMismatchError extends McpToolError {
|
|
|
69
126
|
readonly feature: string;
|
|
70
127
|
constructor(currentMode: string, requiredMode: string, feature: string);
|
|
71
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* What an upstream body turned out to be, as {@link UpstreamFormatError}
|
|
131
|
+
* reports it: `'non-json'` when it did not parse at all, `'empty'` for an empty
|
|
132
|
+
* (or whitespace-only) body or a 204, otherwise the JSON kind it parsed to.
|
|
133
|
+
*/
|
|
134
|
+
export type UpstreamBodyKind = 'non-json' | 'empty' | 'null' | 'array' | 'object' | 'string' | 'number' | 'boolean';
|
|
135
|
+
/** The JSON shape a caller can require of an upstream body. */
|
|
136
|
+
export type ExpectedJsonShape = 'object' | 'array';
|
|
137
|
+
/** Constructor input for {@link UpstreamFormatError}. Every field but `received` is optional. */
|
|
138
|
+
export interface UpstreamFormatErrorDetails {
|
|
139
|
+
/** What the body turned out to be. */
|
|
140
|
+
received: UpstreamBodyKind;
|
|
141
|
+
/** The shape the caller required, when it required one. */
|
|
142
|
+
expected?: ExpectedJsonShape;
|
|
143
|
+
/** The upstream's display name. Defaults to "The upstream service". */
|
|
144
|
+
service?: string;
|
|
145
|
+
/** The request method, named in the message alongside `path`. */
|
|
146
|
+
method?: string;
|
|
147
|
+
/** The request path, named in the message alongside `method`. */
|
|
148
|
+
path?: string;
|
|
149
|
+
/** The response status. */
|
|
150
|
+
status?: number;
|
|
151
|
+
/** The response `Content-Type`. */
|
|
152
|
+
contentType?: string;
|
|
153
|
+
/** The parse failure, chained as `cause` (never put in the message). */
|
|
154
|
+
cause?: unknown;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* An upstream answered with a body that is not the JSON the caller needs: an
|
|
158
|
+
* HTML sign-in page or interstitial served with a 200, an empty body, or a
|
|
159
|
+
* `null`/scalar/wrong-container where an object or array was required.
|
|
160
|
+
*
|
|
161
|
+
* Consolidates the fleet's raw `SyntaxError: Unexpected token '<'` and
|
|
162
|
+
* `TypeError: Cannot read properties of null` failures (alltrails, etix, resy,
|
|
163
|
+
* skylight, tripadvisor, accessoticketing, angi, ofw): those reach the model as
|
|
164
|
+
* parser noise carrying a fragment of the upstream page. This one names the
|
|
165
|
+
* service, request, status and content type instead, and never the body —
|
|
166
|
+
* the parser's own error is kept as `cause`. The message is redacted, so a
|
|
167
|
+
* credential in the path's query cannot leak through it.
|
|
168
|
+
*
|
|
169
|
+
* Thrown by `createApiClient`'s `fetchJson` and by `parseJsonBody` (both in
|
|
170
|
+
* `http`), which check for a CDN/WAF challenge first and throw
|
|
171
|
+
* `EdgeBlockedError` for that instead.
|
|
172
|
+
*/
|
|
173
|
+
export declare class UpstreamFormatError extends McpToolError {
|
|
174
|
+
/** What the body turned out to be. */
|
|
175
|
+
readonly received: UpstreamBodyKind;
|
|
176
|
+
/** The shape the caller required, when it required one. */
|
|
177
|
+
readonly expected?: ExpectedJsonShape;
|
|
178
|
+
/** The response `Content-Type`, when known. (`status` is the base class's.) */
|
|
179
|
+
readonly contentType?: string;
|
|
180
|
+
constructor(details: UpstreamFormatErrorDetails);
|
|
181
|
+
}
|
|
72
182
|
/** Factory for an {@link McpToolError} with a remediation hint. */
|
|
73
183
|
export declare function createHelpfulError(message: string, opts?: {
|
|
74
184
|
hint?: string;
|
|
@@ -151,6 +261,10 @@ export declare function isTimeoutError(err: unknown): boolean;
|
|
|
151
261
|
* preserving any `hint` and chaining the original via `cause`. The message is
|
|
152
262
|
* run through {@link truncateErrorMessage} (redaction + truncation). Re-wrapping
|
|
153
263
|
* an already-prefixed error does not double-prefix.
|
|
264
|
+
*
|
|
265
|
+
* The wrapped error's HTTP status and {@link McpToolErrorKind} carry over too
|
|
266
|
+
* (read with {@link errorStatusOf} / {@link errorKindOf}), so wrapping an
|
|
267
|
+
* `ApiError` for its tool-name prefix does not lose the 404 a caller branches on.
|
|
154
268
|
*/
|
|
155
269
|
export declare function wrapToolError(toolName: string, err: unknown): McpToolError;
|
|
156
270
|
/** Options for {@link maskSecret}. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAQH,qFAAqF;AACrF,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD,+EAA+E;AAC/E,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAE7C
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"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"}
|
package/dist/errors/index.js
CHANGED
|
@@ -17,23 +17,87 @@
|
|
|
17
17
|
export const DEFAULT_BOT_WALL_RETRY_AFTER_S = 30;
|
|
18
18
|
/** Default truncation budget for upstream error bodies surfaced to clients. */
|
|
19
19
|
export const DEFAULT_ERROR_MESSAGE_MAX = 500;
|
|
20
|
+
/** Every {@link McpToolErrorKind}, for validating a `kind` read off an unknown error. */
|
|
21
|
+
export const MCP_TOOL_ERROR_KINDS = new Set([
|
|
22
|
+
'no_credential',
|
|
23
|
+
'credential_rejected',
|
|
24
|
+
'edge_blocked',
|
|
25
|
+
'session_expired',
|
|
26
|
+
'verification_pending',
|
|
27
|
+
'timeout',
|
|
28
|
+
'http',
|
|
29
|
+
'transport',
|
|
30
|
+
'too_large',
|
|
31
|
+
'unknown',
|
|
32
|
+
]);
|
|
20
33
|
/**
|
|
21
34
|
* Base class for every tool-facing error. Carries an optional `hint` —
|
|
22
35
|
* actionable remediation text ("set ZOLA_REFRESH_TOKEN", "sign in at compass.com")
|
|
23
|
-
* the tool surface can present separately from the message
|
|
36
|
+
* the tool surface can present separately from the message — and, when the
|
|
37
|
+
* thrower knows them, the upstream HTTP `status` and a {@link McpToolErrorKind}
|
|
38
|
+
* `kind`, so callers classify a failure by structure rather than by matching
|
|
39
|
+
* its text. The library's own throwers (http, graphql, auth/session) set them.
|
|
24
40
|
*/
|
|
25
41
|
export class McpToolError extends Error {
|
|
26
42
|
/** Actionable remediation text, when one applies. */
|
|
27
43
|
hint;
|
|
44
|
+
/** The upstream HTTP status this failure came from, when known. */
|
|
45
|
+
status;
|
|
46
|
+
/** What kind of failure this is, when the thrower knows. */
|
|
47
|
+
kind;
|
|
28
48
|
constructor(message, opts) {
|
|
29
49
|
super(message, opts?.cause !== undefined ? { cause: opts.cause } : undefined);
|
|
30
50
|
this.name = 'McpToolError';
|
|
31
51
|
if (opts?.hint !== undefined)
|
|
32
52
|
this.hint = opts.hint;
|
|
53
|
+
if (opts?.status !== undefined)
|
|
54
|
+
this.status = opts.status;
|
|
55
|
+
if (opts?.kind !== undefined)
|
|
56
|
+
this.kind = opts.kind;
|
|
33
57
|
// Restore the prototype chain for transpiled `extends Error`.
|
|
34
58
|
Object.setPrototypeOf(this, new.target.prototype);
|
|
35
59
|
}
|
|
36
60
|
}
|
|
61
|
+
/** How many `cause` links {@link errorStatusOf} / {@link errorKindOf} follow (also bounds a cyclic chain). */
|
|
62
|
+
const DECLARATION_CAUSE_DEPTH = 4;
|
|
63
|
+
/** The first value `read` finds on `err` or its short `cause` chain, outside-in. */
|
|
64
|
+
function firstDeclared(err, read) {
|
|
65
|
+
let cur = err;
|
|
66
|
+
for (let depth = 0; depth < DECLARATION_CAUSE_DEPTH && cur !== null && typeof cur === 'object'; depth++) {
|
|
67
|
+
const found = read(cur);
|
|
68
|
+
if (found !== undefined)
|
|
69
|
+
return found;
|
|
70
|
+
cur = cur.cause;
|
|
71
|
+
}
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* The HTTP status a thrown error carries: a numeric `status` (or `statusCode`)
|
|
76
|
+
* on the error or, failing that, on a short `cause` chain — so a hint-adding
|
|
77
|
+
* wrapper around an `ApiError` still answers 401. The outermost link that has
|
|
78
|
+
* one wins. `undefined` when none does. Duck-typed: any error class qualifies.
|
|
79
|
+
*/
|
|
80
|
+
export function errorStatusOf(err) {
|
|
81
|
+
return firstDeclared(err, (link) => {
|
|
82
|
+
const e = link;
|
|
83
|
+
if (typeof e.status === 'number')
|
|
84
|
+
return e.status;
|
|
85
|
+
return typeof e.statusCode === 'number' ? e.statusCode : undefined;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* The {@link McpToolErrorKind} a thrown error declares, on itself or a short
|
|
90
|
+
* `cause` chain (outermost wins). A `kind` outside the vocabulary — another
|
|
91
|
+
* library's own `kind` field — is ignored, not returned. Duck-typed.
|
|
92
|
+
*/
|
|
93
|
+
export function errorKindOf(err) {
|
|
94
|
+
return firstDeclared(err, (link) => {
|
|
95
|
+
const k = link.kind;
|
|
96
|
+
return typeof k === 'string' && MCP_TOOL_ERROR_KINDS.has(k)
|
|
97
|
+
? k
|
|
98
|
+
: undefined;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
37
101
|
/**
|
|
38
102
|
* The user's browser session isn't signed in to the upstream service. Distinct
|
|
39
103
|
* from a transient bot-wall — this is a stable "go authenticate" condition.
|
|
@@ -43,7 +107,7 @@ export class SessionNotAuthenticatedError extends McpToolError {
|
|
|
43
107
|
const name = service ?? 'the service';
|
|
44
108
|
const where = signInHost ? `Open ${signInHost} in your browser and sign in, then try again.` : 'Sign in in your browser, then try again.';
|
|
45
109
|
super(`Not signed in to ${name}. ${where} ` +
|
|
46
|
-
'Saved searches, saved homes, and other account data require a signed-in session.', { hint: where });
|
|
110
|
+
'Saved searches, saved homes, and other account data require a signed-in session.', { hint: where, kind: 'session_expired' });
|
|
47
111
|
this.name = 'SessionNotAuthenticatedError';
|
|
48
112
|
}
|
|
49
113
|
}
|
|
@@ -75,7 +139,7 @@ export class RateLimitError extends McpToolError {
|
|
|
75
139
|
retryAfterSeconds;
|
|
76
140
|
constructor(service, retryAfterSeconds) {
|
|
77
141
|
const wait = retryAfterSeconds !== undefined ? ` Retry after ${retryAfterSeconds}s.` : ' Back off and retry.';
|
|
78
|
-
super(`Rate limited by ${service}.${wait}`, { hint: wait.trim() });
|
|
142
|
+
super(`Rate limited by ${service}.${wait}`, { hint: wait.trim(), status: 429, kind: 'http' });
|
|
79
143
|
this.name = 'RateLimitError';
|
|
80
144
|
if (retryAfterSeconds !== undefined)
|
|
81
145
|
this.retryAfterSeconds = retryAfterSeconds;
|
|
@@ -83,16 +147,18 @@ export class RateLimitError extends McpToolError {
|
|
|
83
147
|
}
|
|
84
148
|
/** Upstream is unreachable (5xx / transport failure) — not the caller's fault. */
|
|
85
149
|
export class UnreachableError extends McpToolError {
|
|
86
|
-
/**
|
|
87
|
-
|
|
150
|
+
/**
|
|
151
|
+
* @param status The upstream HTTP status, when one was observed. It becomes
|
|
152
|
+
* `status`, and the `kind` is `'http'` with one and `'transport'` without.
|
|
153
|
+
*/
|
|
88
154
|
constructor(service, status) {
|
|
89
155
|
const suffix = status !== undefined ? ` (status ${status})` : '';
|
|
90
156
|
super(`${service} unreachable${suffix}. The service may be down — try again later.`, {
|
|
91
157
|
hint: 'The upstream service is temporarily unavailable; retry later.',
|
|
158
|
+
kind: status !== undefined ? 'http' : 'transport',
|
|
159
|
+
...(status !== undefined ? { status } : {}),
|
|
92
160
|
});
|
|
93
161
|
this.name = 'UnreachableError';
|
|
94
|
-
if (status !== undefined)
|
|
95
|
-
this.status = status;
|
|
96
162
|
}
|
|
97
163
|
}
|
|
98
164
|
/**
|
|
@@ -112,6 +178,70 @@ export class ModeMismatchError extends McpToolError {
|
|
|
112
178
|
this.name = 'ModeMismatchError';
|
|
113
179
|
}
|
|
114
180
|
}
|
|
181
|
+
const UPSTREAM_BODY_PHRASE = {
|
|
182
|
+
'non-json': 'a non-JSON response',
|
|
183
|
+
empty: 'an empty body',
|
|
184
|
+
null: 'null',
|
|
185
|
+
array: 'an array',
|
|
186
|
+
object: 'an object',
|
|
187
|
+
string: 'a string',
|
|
188
|
+
number: 'a number',
|
|
189
|
+
boolean: 'a boolean',
|
|
190
|
+
};
|
|
191
|
+
/**
|
|
192
|
+
* An upstream answered with a body that is not the JSON the caller needs: an
|
|
193
|
+
* HTML sign-in page or interstitial served with a 200, an empty body, or a
|
|
194
|
+
* `null`/scalar/wrong-container where an object or array was required.
|
|
195
|
+
*
|
|
196
|
+
* Consolidates the fleet's raw `SyntaxError: Unexpected token '<'` and
|
|
197
|
+
* `TypeError: Cannot read properties of null` failures (alltrails, etix, resy,
|
|
198
|
+
* skylight, tripadvisor, accessoticketing, angi, ofw): those reach the model as
|
|
199
|
+
* parser noise carrying a fragment of the upstream page. This one names the
|
|
200
|
+
* service, request, status and content type instead, and never the body —
|
|
201
|
+
* the parser's own error is kept as `cause`. The message is redacted, so a
|
|
202
|
+
* credential in the path's query cannot leak through it.
|
|
203
|
+
*
|
|
204
|
+
* Thrown by `createApiClient`'s `fetchJson` and by `parseJsonBody` (both in
|
|
205
|
+
* `http`), which check for a CDN/WAF challenge first and throw
|
|
206
|
+
* `EdgeBlockedError` for that instead.
|
|
207
|
+
*/
|
|
208
|
+
export class UpstreamFormatError extends McpToolError {
|
|
209
|
+
/** What the body turned out to be. */
|
|
210
|
+
received;
|
|
211
|
+
/** The shape the caller required, when it required one. */
|
|
212
|
+
expected;
|
|
213
|
+
/** The response `Content-Type`, when known. (`status` is the base class's.) */
|
|
214
|
+
contentType;
|
|
215
|
+
constructor(details) {
|
|
216
|
+
const service = details.service ?? 'The upstream service';
|
|
217
|
+
const request = details.method !== undefined && details.path !== undefined
|
|
218
|
+
? `${details.method.toUpperCase()} ${details.path}`
|
|
219
|
+
: undefined;
|
|
220
|
+
const meta = [
|
|
221
|
+
details.status !== undefined ? `HTTP ${details.status}` : undefined,
|
|
222
|
+
details.contentType || undefined,
|
|
223
|
+
].filter((p) => p !== undefined);
|
|
224
|
+
const what = details.expected !== undefined
|
|
225
|
+
? `${UPSTREAM_BODY_PHRASE[details.received]} where a JSON ${details.expected} was expected` +
|
|
226
|
+
(request ? ` for ${request}` : '')
|
|
227
|
+
: `${UPSTREAM_BODY_PHRASE[details.received]}` + (request ? ` to ${request}` : '');
|
|
228
|
+
const message = `${service} returned ${what}${meta.length > 0 ? ` (${meta.join(', ')})` : ''}.`;
|
|
229
|
+
const hint = details.received === 'non-json'
|
|
230
|
+
? 'The service answered with something other than JSON, usually a sign-in page or interstitial, or its API has changed. Check the session, then retry.'
|
|
231
|
+
: 'The service answered with a body of the wrong shape: the resource may be missing or its API may have changed.';
|
|
232
|
+
super(truncateErrorMessage(message), {
|
|
233
|
+
hint,
|
|
234
|
+
cause: details.cause,
|
|
235
|
+
...(details.status !== undefined ? { status: details.status } : {}),
|
|
236
|
+
});
|
|
237
|
+
this.name = 'UpstreamFormatError';
|
|
238
|
+
this.received = details.received;
|
|
239
|
+
if (details.expected !== undefined)
|
|
240
|
+
this.expected = details.expected;
|
|
241
|
+
if (details.contentType)
|
|
242
|
+
this.contentType = details.contentType;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
115
245
|
/** Factory for an {@link McpToolError} with a remediation hint. */
|
|
116
246
|
export function createHelpfulError(message, opts) {
|
|
117
247
|
return new McpToolError(message, opts);
|
|
@@ -188,7 +318,10 @@ const GOOGLE_OAUTH_TOKEN_RE = /(?<![A-Za-z0-9+/])(?:ya29\.|1\/\/)[A-Za-z0-9._-]{
|
|
|
188
318
|
// used as params (`?x-api-key=…`), which the colon-anchored HEADER_SECRET_RE
|
|
189
319
|
// never sees (fleet audit 2026-09-24 PRIV-1). The `x-` branch reuses the
|
|
190
320
|
// bounded HEADER_NAME_RUN so it stays linear.
|
|
191
|
-
|
|
321
|
+
// A PKCE `code_verifier` (and Canvas's bare `?verifier=` file capability) is a
|
|
322
|
+
// bearer secret: whoever holds it can complete the exchange or fetch the file
|
|
323
|
+
// (fleet audit library-candidates §16 — canvas-parent #380 quoted one in a 404).
|
|
324
|
+
const QUERY_SECRET_RE = new RegExp(`([?&](?:(?:access|refresh|id|auth|session|csrf|xsrf)[_-]?token|client[_-]?secret|api[_-]?secret|api[_-]?key|password|passwd|signature|token|key|sig|(?:code[_-]?)?verifier|(?:php|j)?sess(?:ion)?[_-]?id|sid|x[-_]${HEADER_NAME_RUN}?(?:api[-_]?key|token|secret|auth)${HEADER_NAME_RUN})=)[^&#\\s"'<>\`]+`, 'gi');
|
|
192
325
|
// An OAuth authorization code (`?code=…` on a redirect). Only values of 16+
|
|
193
326
|
// characters: real authorization codes are long opaque strings, while a short
|
|
194
327
|
// `code=E123` is an error/status code worth keeping for diagnosis.
|
|
@@ -240,6 +373,7 @@ const JSON_SECRET_KEYS = [
|
|
|
240
373
|
'api[_-]?secret',
|
|
241
374
|
'(?:x[_-])?api[_-]?key',
|
|
242
375
|
'private[_-]?key',
|
|
376
|
+
'code[_-]?verifier', // PKCE; a bare `verifier` key is too generic for JSON
|
|
243
377
|
`x[_-]${HEADER_NAME_RUN}?(?:api[_-]?key|token|secret|auth)${HEADER_NAME_RUN}`, // bounded like HEADER_SECRET_RE
|
|
244
378
|
'(?:proxy-)?authorization',
|
|
245
379
|
'password',
|
|
@@ -416,13 +550,24 @@ export function isTimeoutError(err) {
|
|
|
416
550
|
* preserving any `hint` and chaining the original via `cause`. The message is
|
|
417
551
|
* run through {@link truncateErrorMessage} (redaction + truncation). Re-wrapping
|
|
418
552
|
* an already-prefixed error does not double-prefix.
|
|
553
|
+
*
|
|
554
|
+
* The wrapped error's HTTP status and {@link McpToolErrorKind} carry over too
|
|
555
|
+
* (read with {@link errorStatusOf} / {@link errorKindOf}), so wrapping an
|
|
556
|
+
* `ApiError` for its tool-name prefix does not lose the 404 a caller branches on.
|
|
419
557
|
*/
|
|
420
558
|
export function wrapToolError(toolName, err) {
|
|
421
559
|
const inner = messageOf(err);
|
|
422
560
|
const prefix = `[${toolName}]`;
|
|
423
561
|
const message = inner.includes(prefix) ? inner : `${prefix} ${inner}`;
|
|
424
562
|
const hint = err instanceof McpToolError ? err.hint : undefined;
|
|
425
|
-
|
|
563
|
+
const status = errorStatusOf(err);
|
|
564
|
+
const kind = errorKindOf(err);
|
|
565
|
+
return new McpToolError(truncateErrorMessage(message), {
|
|
566
|
+
hint,
|
|
567
|
+
cause: err,
|
|
568
|
+
...(status !== undefined ? { status } : {}),
|
|
569
|
+
...(kind !== undefined ? { kind } : {}),
|
|
570
|
+
});
|
|
426
571
|
}
|
|
427
572
|
/**
|
|
428
573
|
* Mask a credential for display in a confirmation message: keep the first
|
package/dist/errors/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/errors/index.ts"],"names":[],"mappings":"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"}
|
package/dist/fs/output.d.ts
CHANGED
|
@@ -5,26 +5,43 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Consolidates the duplicated trio in gemini (`images.ts#resolveOutputDir` /
|
|
7
7
|
* `uniquePath` / `writeImage`) and flightaware (`shared.ts#resolveOutputDir` /
|
|
8
|
-
* `writePng`): per-call dir → `<SVC>_OUTPUT_DIR` env →
|
|
8
|
+
* `writePng`): per-call dir → `<SVC>_OUTPUT_DIR` env → `~/Downloads/<name>`
|
|
9
|
+
* (never the cwd — `/` under Claude Desktop, the user's repo under Claude
|
|
10
|
+
* Code), non-overwriting
|
|
9
11
|
* filenames, extension derived from the MIME type. The fleet convention (see
|
|
10
12
|
* the mcp-fleet-builder skill) is that every binary-output tool uses this shape.
|
|
11
13
|
*/
|
|
12
14
|
import { type EnvSource } from '../config/index.js';
|
|
15
|
+
/** Options for {@link resolveOutputDir}. */
|
|
16
|
+
export interface ResolveOutputDirOptions {
|
|
17
|
+
/** Where to read `envVar` from. Defaults to `process.env`. */
|
|
18
|
+
env?: EnvSource;
|
|
19
|
+
/** Confine the per-call directory to these roots (see below). */
|
|
20
|
+
allowedRoots?: readonly string[];
|
|
21
|
+
/**
|
|
22
|
+
* The server's name, e.g. `'splitwise-mcp'`. When neither the per-call dir
|
|
23
|
+
* nor `envVar` is set, the output goes to `~/Downloads/<name>` (created
|
|
24
|
+
* `0700`). Without it, that case throws a config error naming `envVar`. Must
|
|
25
|
+
* be a single path segment.
|
|
26
|
+
*/
|
|
27
|
+
name?: string;
|
|
28
|
+
}
|
|
13
29
|
/**
|
|
14
30
|
* Resolve the directory a binary-output tool should write into:
|
|
15
|
-
* the per-call argument → the named env var →
|
|
31
|
+
* the per-call argument → the named env var → `~/Downloads/<name>` (when
|
|
32
|
+
* `opts.name` is given) → a config error ({@link McpToolError}) naming the env
|
|
33
|
+
* var. It **never** falls back to the current working directory: that is `/`
|
|
34
|
+
* (unwritable) under Claude Desktop/.mcpb and the user's repo under Claude
|
|
35
|
+
* Code (fleet audit 2026-09, cluster 12 — receipts and images landed there).
|
|
16
36
|
* `~` and relative paths are expanded ({@link expandPath}) and the directory is
|
|
17
37
|
* created recursively so the subsequent write can't ENOENT.
|
|
18
38
|
*
|
|
19
39
|
* `allowedRoots` (opt-in) confines the **per-call** directory — the value a
|
|
20
40
|
* tool argument supplies — to those roots, checked through symlinks before
|
|
21
|
-
* anything is created. The env var and
|
|
22
|
-
* not constrained.
|
|
41
|
+
* anything is created. The env var and the `name` fallback are operator
|
|
42
|
+
* configuration and are not constrained.
|
|
23
43
|
*/
|
|
24
|
-
export declare function resolveOutputDir(perCall: string | undefined, envVar: string, opts?:
|
|
25
|
-
env?: EnvSource;
|
|
26
|
-
allowedRoots?: readonly string[];
|
|
27
|
-
}): string;
|
|
44
|
+
export declare function resolveOutputDir(perCall: string | undefined, envVar: string, opts?: ResolveOutputDirOptions): string;
|
|
28
45
|
/**
|
|
29
46
|
* A non-overwriting path for `base.ext` in `dir`: the bare name when free,
|
|
30
47
|
* else `base-2.ext`, `base-3.ext`, … (gemini's numbering). `ext` is passed
|
package/dist/fs/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/fs/output.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/fs/output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAK5E,4CAA4C;AAC5C,MAAM,WAAW,uBAAuB;IACtC,8DAA8D;IAC9D,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,iEAAiE;IACjE,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,uBAA4B,GACjC,MAAM,CAaR;AAiBD;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAQzE;AAkBD,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC,iFAAiF;IACjF,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB,GAAG,MAAM,CAGxE"}
|
package/dist/fs/output.js
CHANGED
|
@@ -5,30 +5,38 @@
|
|
|
5
5
|
*
|
|
6
6
|
* Consolidates the duplicated trio in gemini (`images.ts#resolveOutputDir` /
|
|
7
7
|
* `uniquePath` / `writeImage`) and flightaware (`shared.ts#resolveOutputDir` /
|
|
8
|
-
* `writePng`): per-call dir → `<SVC>_OUTPUT_DIR` env →
|
|
8
|
+
* `writePng`): per-call dir → `<SVC>_OUTPUT_DIR` env → `~/Downloads/<name>`
|
|
9
|
+
* (never the cwd — `/` under Claude Desktop, the user's repo under Claude
|
|
10
|
+
* Code), non-overwriting
|
|
9
11
|
* filenames, extension derived from the MIME type. The fleet convention (see
|
|
10
12
|
* the mcp-fleet-builder skill) is that every binary-output tool uses this shape.
|
|
11
13
|
*/
|
|
12
14
|
import { existsSync, mkdirSync } from 'node:fs';
|
|
15
|
+
import { homedir } from 'node:os';
|
|
13
16
|
import { join } from 'node:path';
|
|
14
17
|
import { expandPath, readEnvVar } from '../config/index.js';
|
|
18
|
+
import { McpToolError } from '../errors/index.js';
|
|
15
19
|
import { assertPathWithinRoots } from './confine.js';
|
|
16
20
|
import { sanitizeBaseName, writeUniqueFileSync } from './write.js';
|
|
17
21
|
/**
|
|
18
22
|
* Resolve the directory a binary-output tool should write into:
|
|
19
|
-
* the per-call argument → the named env var →
|
|
23
|
+
* the per-call argument → the named env var → `~/Downloads/<name>` (when
|
|
24
|
+
* `opts.name` is given) → a config error ({@link McpToolError}) naming the env
|
|
25
|
+
* var. It **never** falls back to the current working directory: that is `/`
|
|
26
|
+
* (unwritable) under Claude Desktop/.mcpb and the user's repo under Claude
|
|
27
|
+
* Code (fleet audit 2026-09, cluster 12 — receipts and images landed there).
|
|
20
28
|
* `~` and relative paths are expanded ({@link expandPath}) and the directory is
|
|
21
29
|
* created recursively so the subsequent write can't ENOENT.
|
|
22
30
|
*
|
|
23
31
|
* `allowedRoots` (opt-in) confines the **per-call** directory — the value a
|
|
24
32
|
* tool argument supplies — to those roots, checked through symlinks before
|
|
25
|
-
* anything is created. The env var and
|
|
26
|
-
* not constrained.
|
|
33
|
+
* anything is created. The env var and the `name` fallback are operator
|
|
34
|
+
* configuration and are not constrained.
|
|
27
35
|
*/
|
|
28
36
|
export function resolveOutputDir(perCall, envVar, opts = {}) {
|
|
29
37
|
const raw = perCall ?? readEnvVar(envVar, opts.env ? { env: opts.env } : {});
|
|
30
38
|
if (!raw)
|
|
31
|
-
return
|
|
39
|
+
return defaultOutputDir(envVar, opts.name);
|
|
32
40
|
const dir = expandPath(raw);
|
|
33
41
|
if (perCall !== undefined && opts.allowedRoots) {
|
|
34
42
|
assertPathWithinRoots(dir, opts.allowedRoots);
|
|
@@ -40,6 +48,20 @@ export function resolveOutputDir(perCall, envVar, opts = {}) {
|
|
|
40
48
|
mkdirSync(dir, { recursive: true });
|
|
41
49
|
return dir;
|
|
42
50
|
}
|
|
51
|
+
/** `~/Downloads/<name>` (created 0700), or a config error naming `envVar`. */
|
|
52
|
+
function defaultOutputDir(envVar, name) {
|
|
53
|
+
if (name === undefined) {
|
|
54
|
+
throw new McpToolError(`No output directory is configured: ${envVar} is not set.`, {
|
|
55
|
+
hint: `Set ${envVar} to a writable directory, or pass an output directory with the call.`,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (!name || name === '.' || name === '..' || /[/\\]/.test(name)) {
|
|
59
|
+
throw new TypeError(`resolveOutputDir: name must be a single path segment, got ${JSON.stringify(name)}`);
|
|
60
|
+
}
|
|
61
|
+
const dir = join(homedir(), 'Downloads', name);
|
|
62
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
63
|
+
return dir;
|
|
64
|
+
}
|
|
43
65
|
/**
|
|
44
66
|
* A non-overwriting path for `base.ext` in `dir`: the bare name when free,
|
|
45
67
|
* else `base-2.ext`, `base-3.ext`, … (gemini's numbering). `ext` is passed
|
package/dist/fs/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/fs/output.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/fs/output.ts"],"names":[],"mappings":"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"}
|