@plurnk/plurnk-mcp 3.2.1 → 3.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -15
- package/SPEC.md +193 -97
- package/dist/McpExecutor.d.ts +10 -1
- package/dist/McpExecutor.d.ts.map +1 -1
- package/dist/McpExecutor.js +45 -11
- package/dist/McpExecutor.js.map +1 -1
- package/dist/McpResources.d.ts +2 -1
- package/dist/McpResources.d.ts.map +1 -1
- package/dist/McpResources.js +7 -3
- package/dist/McpResources.js.map +1 -1
- package/dist/Module.d.ts.map +1 -1
- package/dist/Module.js +142 -43
- package/dist/Module.js.map +1 -1
- package/dist/PluginConfiguration.d.ts +8 -10
- package/dist/PluginConfiguration.d.ts.map +1 -1
- package/dist/PluginConfiguration.js +4 -4
- package/dist/PluginConfiguration.js.map +1 -1
- package/dist/capabilityMatrix.d.ts.map +1 -1
- package/dist/capabilityMatrix.js +1 -0
- package/dist/capabilityMatrix.js.map +1 -1
- package/dist/client.d.ts +7 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +180 -83
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/definition.js.map +1 -1
- package/dist/extensionChannel.d.ts.map +1 -1
- package/dist/extensionChannel.js +2 -3
- package/dist/extensionChannel.js.map +1 -1
- package/dist/inputRequired.d.ts.map +1 -1
- package/dist/inputRequired.js +11 -4
- package/dist/inputRequired.js.map +1 -1
- package/dist/oauth.d.ts +28 -4
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +83 -36
- package/dist/oauth.js.map +1 -1
- package/dist/protocol.d.ts +1 -1
- package/dist/protocol.js +1 -1
- package/dist/protocolHeaders.d.ts.map +1 -1
- package/dist/protocolHeaders.js +3 -2
- package/dist/protocolHeaders.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +8 -3
- package/dist/registry.js.map +1 -1
- package/dist/subscriptions.js.map +1 -1
- package/dist/tasks.d.ts +2 -2
- package/dist/tasks.d.ts.map +1 -1
- package/dist/tasks.js +23 -26
- package/dist/tasks.js.map +1 -1
- package/docs/mcp.md +9 -9
- package/package.json +9 -8
package/dist/capabilityMatrix.js
CHANGED
|
@@ -395,6 +395,7 @@ export const CONDITIONAL_EXTENSION_IDS = CAPABILITY_MATRIX
|
|
|
395
395
|
// {§mcp-capability-matrix} — advertisement derives from the matrix by
|
|
396
396
|
// construction; an extension is on the wire only because a row says "always".
|
|
397
397
|
export const staticClientCapabilities = () => ({
|
|
398
|
+
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- the advertised modes are exactly the record's keys
|
|
398
399
|
elicitation: Object.fromEntries(ADVERTISED_ELICITATION_MODES.map((mode) => [mode, {}])),
|
|
399
400
|
extensions: Object.fromEntries(CAPABILITY_MATRIX
|
|
400
401
|
.filter((row) => row.authority === "extension" && row.advertised === "always")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilityMatrix.js","sourceRoot":"","sources":["../src/capabilityMatrix.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"capabilityMatrix.js","sourceRoot":"","sources":["../src/capabilityMatrix.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { Client, type CallToolResult, type CompleteRequest, type CompleteResult,
|
|
|
2
2
|
import { type McpServerDefinition } from "@plurnk/plurnk-contracts";
|
|
3
3
|
import { type PreparationDiagnostic } from "./PreparationDiagnostics.ts";
|
|
4
4
|
import { type ClientInteractionHandler } from "./inputRequired.ts";
|
|
5
|
+
import { OAuthGrant } from "./oauth.ts";
|
|
5
6
|
import { type PluginContext } from "./PluginConfiguration.ts";
|
|
6
7
|
export interface ServerCatalog {
|
|
7
8
|
readonly protocolVersion: string;
|
|
@@ -16,13 +17,16 @@ export interface ServerCatalog {
|
|
|
16
17
|
}
|
|
17
18
|
export interface ServerConnectionOptions {
|
|
18
19
|
readonly oauthRedirectUrl?: string;
|
|
20
|
+
readonly oauthGrant?: OAuthGrant;
|
|
19
21
|
readonly plugin?: PluginContext;
|
|
20
22
|
readonly environment?: NodeJS.ProcessEnv;
|
|
21
23
|
readonly cwd?: string;
|
|
22
24
|
readonly onCatalogChanged?: (error: Error | null) => void;
|
|
23
25
|
readonly onInfrastructureError?: (error: Error) => void;
|
|
26
|
+
readonly onAuthorizationRequired?: () => void;
|
|
24
27
|
}
|
|
25
28
|
export type { ClientInteractionHandler } from "./inputRequired.ts";
|
|
29
|
+
export declare const causeOf: <T>(error: unknown, type: abstract new (...args: never[]) => T, seen?: Set<unknown>) => T | undefined;
|
|
26
30
|
export declare const isClientCredentialsRejection: (error: unknown) => boolean;
|
|
27
31
|
export declare class CatalogNonConvergenceError extends Error {
|
|
28
32
|
readonly method: string;
|
|
@@ -34,6 +38,7 @@ export declare class McpRedirectError extends Error {
|
|
|
34
38
|
readonly location: string | null;
|
|
35
39
|
constructor(url: string, location: string | null);
|
|
36
40
|
}
|
|
41
|
+
export declare const awaitsSignIn: (server: string) => string;
|
|
37
42
|
export declare class AuthorizationRequiredError extends Error {
|
|
38
43
|
readonly authorizationUrl: string | undefined;
|
|
39
44
|
constructor(authorizationUrl?: string, cause?: unknown);
|
|
@@ -44,8 +49,10 @@ export default class ServerConnection {
|
|
|
44
49
|
get definition(): McpServerDefinition;
|
|
45
50
|
get activeRequests(): number;
|
|
46
51
|
get authorizationUrl(): string | null;
|
|
52
|
+
get oauthGrant(): OAuthGrant | undefined;
|
|
47
53
|
preparationDiagnostic(cause: unknown): PreparationDiagnostic;
|
|
48
54
|
connect(): Promise<Client>;
|
|
55
|
+
beginAuthorization(): Promise<string | undefined>;
|
|
49
56
|
finishAuthorization(callbackUrl: string): Promise<void>;
|
|
50
57
|
tools(signal?: AbortSignal): Promise<Tool[]>;
|
|
51
58
|
catalog(signal?: AbortSignal): Promise<ServerCatalog>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAOH,MAAM,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/client.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { isAbsolute } from "node:path";
|
|
2
|
-
import { OAuthClientFlowError, OAuthError, UnauthorizedError, SdkHttpError, ProtocolError, METHOD_NOT_FOUND, Client, ClientCredentialsProvider, StreamableHTTPClientTransport, } from "@modelcontextprotocol/client";
|
|
2
|
+
import { OAuthClientFlowError, OAuthError, UnauthorizedError, SdkHttpError, ProtocolError, METHOD_NOT_FOUND, Client, ClientCredentialsProvider, StreamableHTTPClientTransport, auth, createFetchWithInit, } from "@modelcontextprotocol/client";
|
|
3
3
|
import { StdioClientTransport, getDefaultEnvironment, } from "@modelcontextprotocol/client/stdio";
|
|
4
|
-
import {
|
|
4
|
+
import { CallToolRequestParamsSchema, GetPromptRequestParamsSchema, ReadResourceRequestParamsSchema } from "@modelcontextprotocol/core";
|
|
5
|
+
import { isRecord, Validator, } from "@plurnk/plurnk-contracts";
|
|
5
6
|
import packageJson from "../package.json" with { type: "json" };
|
|
6
7
|
import { ErrorDetail } from "@plurnk/plurnk-execs";
|
|
7
8
|
import PreparationDiagnostics, {} from "./PreparationDiagnostics.js";
|
|
8
9
|
import { connectTimeoutMs, expandReferences, requestTimeoutMs, retryPacing, } from "./config.js";
|
|
9
10
|
import { readDefinition } from "./definition.js";
|
|
10
11
|
import { INPUT_REQUIRED_MAX_ROUNDS, runInputRequiredRequest, } from "./inputRequired.js";
|
|
11
|
-
import InteractiveOAuthProvider from "./oauth.js";
|
|
12
|
+
import InteractiveOAuthProvider, { OAuthGrant } from "./oauth.js";
|
|
12
13
|
import ExtensionChannel from "./extensionChannel.js";
|
|
13
14
|
import { assertHeaderDeclarations, mcpRoutingHeaderValue } from "./protocolHeaders.js";
|
|
14
15
|
import { MCP_OAUTH_CLIENT_CREDENTIALS_EXTENSION_ID, MCP_PROTOCOL_VERSION, } from "./protocol.js";
|
|
@@ -16,11 +17,30 @@ import { staticClientCapabilities } from "./capabilityMatrix.js";
|
|
|
16
17
|
import Subscriptions from "./subscriptions.js";
|
|
17
18
|
import PluginConfiguration, {} from "./PluginConfiguration.js";
|
|
18
19
|
import { callToolWithTasks, serverSupportsTasks, } from "./tasks.js";
|
|
20
|
+
// A request leg's params are proved by the protocol's schema and forwarded whole: the continuation state an
|
|
21
|
+
// input-required round appends rides beside the fields the schema names ({§mcp-host-composition}).
|
|
22
|
+
const CALL_TOOL_PARAMS = CallToolRequestParamsSchema.loose();
|
|
23
|
+
const READ_RESOURCE_PARAMS = ReadResourceRequestParamsSchema.loose();
|
|
24
|
+
const GET_PROMPT_PARAMS = GetPromptRequestParamsSchema.loose();
|
|
19
25
|
// {§mcp-authority} — capability source: the modern discover result when the
|
|
20
26
|
// server offered it, else the legacy initialize result the SDK already folded.
|
|
21
27
|
const serverCapabilities = (client) => client.getDiscoverResult()?.capabilities
|
|
22
28
|
?? client.getServerCapabilities();
|
|
23
29
|
const message = (error) => error instanceof Error ? error.message : String(error);
|
|
30
|
+
// The first error of a type anywhere in a cause chain or aggregate.
|
|
31
|
+
export const causeOf = (error, type, seen = new Set()) => {
|
|
32
|
+
if (error === null || typeof error !== "object" || seen.has(error))
|
|
33
|
+
return undefined;
|
|
34
|
+
seen.add(error);
|
|
35
|
+
if (error instanceof type)
|
|
36
|
+
return error;
|
|
37
|
+
for (const inner of error instanceof AggregateError ? error.errors : []) {
|
|
38
|
+
const found = causeOf(inner, type, seen);
|
|
39
|
+
if (found !== undefined)
|
|
40
|
+
return found;
|
|
41
|
+
}
|
|
42
|
+
return causeOf(error.cause, type, seen);
|
|
43
|
+
};
|
|
24
44
|
const errorsOf = (error) => error instanceof AggregateError ? [...error.errors] : [error];
|
|
25
45
|
// {§oauth-client-credentials} — a rejected client-credentials grant is an
|
|
26
46
|
// authorization fact, never a generic unavailability.
|
|
@@ -38,7 +58,7 @@ export const isClientCredentialsRejection = (error) => errorsOf(error).some((can
|
|
|
38
58
|
});
|
|
39
59
|
// {§mcp-transports} Protocol headers are transport-owned; application authentication is not.
|
|
40
60
|
const clientOwnedHeader = (name) => ["accept", "content-type", "last-event-id"].includes(name.toLowerCase()) || name.toLowerCase().startsWith("mcp-");
|
|
41
|
-
const resolveDefinition = (source, environ, defaultCwd, plugin, oauthRedirectUrl) => {
|
|
61
|
+
const resolveDefinition = (source, environ, { cwd: defaultCwd, plugin, oauthRedirectUrl, oauthGrant }) => {
|
|
42
62
|
const definition = readDefinition(source);
|
|
43
63
|
const field = `MCP server '${definition.name}'`;
|
|
44
64
|
if (definition.type === "stdio") {
|
|
@@ -60,8 +80,14 @@ const resolveDefinition = (source, environ, defaultCwd, plugin, oauthRedirectUrl
|
|
|
60
80
|
const headers = configured.length === 0 ? undefined : Object.fromEntries(configured.map(([name, value]) => [name, plugin === undefined ? expandReferences(value, environ, `${field}.headers.${name}`) : value]));
|
|
61
81
|
const url = definition.url;
|
|
62
82
|
const authorization = definition.authorization;
|
|
63
|
-
const
|
|
64
|
-
|
|
83
|
+
const configuredRedirect = authorization?.type === "oauth" ? authorization.redirectUrl : undefined;
|
|
84
|
+
const redirectUrl = configuredRedirect ?? oauthRedirectUrl;
|
|
85
|
+
// {§oauth-grant} A client's callback begins a new grant; any other connection carries the alias's accepted one, or
|
|
86
|
+
// begins one at the redirect the definition configures.
|
|
87
|
+
const grant = oauthRedirectUrl === undefined && oauthGrant !== undefined
|
|
88
|
+
? oauthGrant
|
|
89
|
+
: redirectUrl === undefined ? undefined : new OAuthGrant(redirectUrl);
|
|
90
|
+
if ((authorization === undefined || authorization.type === "oauth") && grant === undefined) {
|
|
65
91
|
return {
|
|
66
92
|
type: "streamable-http",
|
|
67
93
|
url,
|
|
@@ -70,10 +96,10 @@ const resolveDefinition = (source, environ, defaultCwd, plugin, oauthRedirectUrl
|
|
|
70
96
|
};
|
|
71
97
|
}
|
|
72
98
|
if (authorization?.type === "bearer") {
|
|
73
|
-
const
|
|
74
|
-
const token = expandReferences(authorization.token, environ,
|
|
99
|
+
const tokenField = `MCP server '${definition.name}'.authorization.token`;
|
|
100
|
+
const token = expandReferences(authorization.token, environ, tokenField);
|
|
75
101
|
if (token.length === 0)
|
|
76
|
-
throw new Error(`${
|
|
102
|
+
throw new Error(`${tokenField} resolved empty.`);
|
|
77
103
|
return {
|
|
78
104
|
type: "streamable-http",
|
|
79
105
|
url,
|
|
@@ -91,6 +117,7 @@ const resolveDefinition = (source, environ, defaultCwd, plugin, oauthRedirectUrl
|
|
|
91
117
|
url,
|
|
92
118
|
...(headers === undefined ? {} : { headers }),
|
|
93
119
|
clientCredentials: true,
|
|
120
|
+
// oxlint-disable-next-line typescript/no-deprecated -- {§oauth-client-credentials} keeps `issuer` optional; without one the SDK's unbound overload, which it deprecates, is the declared behaviour
|
|
94
121
|
authProvider: new ClientCredentialsProvider({
|
|
95
122
|
clientId: authorization.clientId,
|
|
96
123
|
clientSecret: secret,
|
|
@@ -103,11 +130,14 @@ const resolveDefinition = (source, environ, defaultCwd, plugin, oauthRedirectUrl
|
|
|
103
130
|
cachePartition: `client:${authorization.clientId}`,
|
|
104
131
|
};
|
|
105
132
|
}
|
|
106
|
-
// {§oauth-lifetime} — registration
|
|
107
|
-
// callback state
|
|
133
|
+
// {§oauth-lifetime} — the registration and tokens are the grant's, which outlives this connection; the PKCE
|
|
134
|
+
// verifier and callback state are this provider's. All of it is process memory.
|
|
108
135
|
const oauthProvider = new InteractiveOAuthProvider({
|
|
109
|
-
|
|
136
|
+
grant: grant,
|
|
137
|
+
redirectConfigured: configuredRedirect !== undefined,
|
|
110
138
|
...(authorization?.scope === undefined ? {} : { scope: authorization.scope }),
|
|
139
|
+
...(authorization?.issuer === undefined ? {} : { issuer: authorization.issuer }),
|
|
140
|
+
...(authorization?.authorizationParams === undefined ? {} : { authorizationParams: authorization.authorizationParams }),
|
|
111
141
|
...(authorization !== undefined && "clientMetadataUrl" in authorization ? { clientMetadataUrl: authorization.clientMetadataUrl } : {}),
|
|
112
142
|
...(authorization !== undefined && "clientId" in authorization
|
|
113
143
|
? { clientId: authorization.clientId, clientSecret: expandReferences(authorization.clientSecret, environ, `${field}.clientSecret`) }
|
|
@@ -131,49 +161,52 @@ const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
|
|
|
131
161
|
// The SDK re-wraps a transport failure without keeping it as a cause, so each HTTP transport's refused
|
|
132
162
|
// redirect is kept beside it for the connection failure to carry.
|
|
133
163
|
const refusedRedirects = new WeakMap();
|
|
164
|
+
// The fetch each HTTP transport authorizes through, as the SDK composes it, for a sign-in this host starts itself.
|
|
165
|
+
const authorizationFetches = new WeakMap();
|
|
134
166
|
const openTransport = (definition, environment = getDefaultEnvironment()) => {
|
|
135
167
|
if (definition.type === "streamable-http") {
|
|
168
|
+
const requestInit = definition.headers === undefined ? undefined : { headers: definition.headers };
|
|
169
|
+
const transportFetch = async (url, init) => {
|
|
170
|
+
const body = typeof init?.body === "string"
|
|
171
|
+
? (() => {
|
|
172
|
+
try {
|
|
173
|
+
return JSON.parse(init.body);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
})()
|
|
179
|
+
: undefined;
|
|
180
|
+
const request = body !== null && typeof body === "object" && !Array.isArray(body)
|
|
181
|
+
? body
|
|
182
|
+
: undefined;
|
|
183
|
+
let sent = init;
|
|
184
|
+
if (["tasks/get", "tasks/update", "tasks/cancel"].includes(String(request?.method))
|
|
185
|
+
&& typeof request?.params?.taskId === "string") {
|
|
186
|
+
const headers = new Headers(init?.headers);
|
|
187
|
+
headers.set("Mcp-Name", mcpRoutingHeaderValue(request.params.taskId));
|
|
188
|
+
sent = { ...init, headers };
|
|
189
|
+
}
|
|
190
|
+
// {§mcp-redirect-refused} — configured headers never reach another origin: no
|
|
191
|
+
// redirect is followed, and a redirected endpoint fails naming where it pointed.
|
|
192
|
+
const response = await fetch(url, { ...sent, redirect: "manual" });
|
|
193
|
+
if (REDIRECT_STATUSES.has(response.status)) {
|
|
194
|
+
const location = response.headers.get("location");
|
|
195
|
+
await response.body?.cancel();
|
|
196
|
+
const refused = new McpRedirectError(String(url), location === null ? null : new URL(location, String(url)).href);
|
|
197
|
+
refusedRedirects.set(transport, refused);
|
|
198
|
+
throw refused;
|
|
199
|
+
}
|
|
200
|
+
return response;
|
|
201
|
+
};
|
|
136
202
|
const transport = new StreamableHTTPClientTransport(new URL(definition.url), {
|
|
137
|
-
...(
|
|
138
|
-
? {}
|
|
139
|
-
: { requestInit: { headers: definition.headers } }),
|
|
203
|
+
...(requestInit === undefined ? {} : { requestInit }),
|
|
140
204
|
...(definition.authProvider === undefined
|
|
141
205
|
? {}
|
|
142
206
|
: { authProvider: definition.authProvider }),
|
|
143
|
-
fetch:
|
|
144
|
-
const body = typeof init?.body === "string"
|
|
145
|
-
? (() => {
|
|
146
|
-
try {
|
|
147
|
-
return JSON.parse(init.body);
|
|
148
|
-
}
|
|
149
|
-
catch {
|
|
150
|
-
return undefined;
|
|
151
|
-
}
|
|
152
|
-
})()
|
|
153
|
-
: undefined;
|
|
154
|
-
const request = body !== null && typeof body === "object" && !Array.isArray(body)
|
|
155
|
-
? body
|
|
156
|
-
: undefined;
|
|
157
|
-
let sent = init;
|
|
158
|
-
if (["tasks/get", "tasks/update", "tasks/cancel"].includes(String(request?.method))
|
|
159
|
-
&& typeof request?.params?.taskId === "string") {
|
|
160
|
-
const headers = new Headers(init?.headers);
|
|
161
|
-
headers.set("Mcp-Name", mcpRoutingHeaderValue(request.params.taskId));
|
|
162
|
-
sent = { ...init, headers };
|
|
163
|
-
}
|
|
164
|
-
// {§mcp-redirect-refused} — configured headers never reach another origin: no
|
|
165
|
-
// redirect is followed, and a redirected endpoint fails naming where it pointed.
|
|
166
|
-
const response = await fetch(url, { ...sent, redirect: "manual" });
|
|
167
|
-
if (REDIRECT_STATUSES.has(response.status)) {
|
|
168
|
-
const location = response.headers.get("location");
|
|
169
|
-
await response.body?.cancel();
|
|
170
|
-
const refused = new McpRedirectError(String(url), location === null ? null : new URL(location, String(url)).href);
|
|
171
|
-
refusedRedirects.set(transport, refused);
|
|
172
|
-
throw refused;
|
|
173
|
-
}
|
|
174
|
-
return response;
|
|
175
|
-
},
|
|
207
|
+
fetch: transportFetch,
|
|
176
208
|
});
|
|
209
|
+
authorizationFetches.set(transport, createFetchWithInit(transportFetch, requestInit));
|
|
177
210
|
return transport;
|
|
178
211
|
}
|
|
179
212
|
// {§mcp-stdio-process-ownership} — stdio servers spawn through the
|
|
@@ -192,6 +225,7 @@ const openTransport = (definition, environment = getDefaultEnvironment()) => {
|
|
|
192
225
|
],
|
|
193
226
|
cwd: definition.cwd,
|
|
194
227
|
stderr: "pipe",
|
|
228
|
+
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- the SDK types the env narrower than spawn's contract; an undefined value omits a key
|
|
195
229
|
env: {
|
|
196
230
|
// The SDK merges its defaults even with an explicit env. Node spawn
|
|
197
231
|
// accepts undefined to omit a key; the SDK's narrower type does not.
|
|
@@ -228,38 +262,46 @@ class CatalogClient extends Client {
|
|
|
228
262
|
// the SDK's cursorless first page.
|
|
229
263
|
#returned = new Map();
|
|
230
264
|
#unsupported = new Set();
|
|
265
|
+
constructor(...args) {
|
|
266
|
+
super(...args);
|
|
267
|
+
// {§mcp-header-declarations} — retain listed definitions so callTool scans them on both legs
|
|
268
|
+
// and refuses invalid declarations with HeaderDeclarationError rather than proceeding unlisted.
|
|
269
|
+
Object.defineProperty(this, "_excludeInvalidXMcpHeaderTools", { value: () => { } });
|
|
270
|
+
}
|
|
231
271
|
get unsupportedLists() {
|
|
232
|
-
return [...this.#unsupported].
|
|
272
|
+
return [...this.#unsupported].toSorted();
|
|
233
273
|
}
|
|
234
274
|
async request(...args) {
|
|
235
275
|
const sent = args[0];
|
|
236
|
-
const
|
|
276
|
+
const method = isRecord(sent) && typeof sent.method === "string" ? sent.method : undefined;
|
|
277
|
+
const cursor = isRecord(sent) && isRecord(sent.params) ? sent.params.cursor : undefined;
|
|
278
|
+
const collection = method === undefined ? undefined : LIST_COLLECTIONS.get(method);
|
|
237
279
|
let result;
|
|
238
280
|
try {
|
|
281
|
+
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- the SDK's overloaded request is forwarded verbatim with the caller's arguments
|
|
239
282
|
result = await super.request(...args);
|
|
240
283
|
}
|
|
241
284
|
catch (error) {
|
|
242
285
|
// {§mcp-catalog-list-absence} — never turn a later-page error into a partial success.
|
|
243
|
-
if (collection === undefined ||
|
|
244
|
-
||
|
|
286
|
+
if (collection === undefined || method === undefined
|
|
287
|
+
|| cursor !== undefined
|
|
245
288
|
|| !ProtocolError.isInstance(error) || error.code !== METHOD_NOT_FOUND)
|
|
246
289
|
throw error;
|
|
247
|
-
this.#unsupported.add(
|
|
290
|
+
this.#unsupported.add(method);
|
|
248
291
|
return { resultType: "complete", [collection]: [], ttlMs: 0, cacheScope: "private" };
|
|
249
292
|
}
|
|
250
|
-
if (collection === undefined ||
|
|
293
|
+
if (collection === undefined || method === undefined)
|
|
251
294
|
return result;
|
|
252
|
-
this.#unsupported.delete(
|
|
253
|
-
const cursor = sent.params?.cursor;
|
|
295
|
+
this.#unsupported.delete(method);
|
|
254
296
|
if (cursor === undefined)
|
|
255
|
-
this.#returned.set(
|
|
256
|
-
const returned = this.#returned.get(
|
|
257
|
-
this.#returned.set(
|
|
258
|
-
const next = result
|
|
297
|
+
this.#returned.set(method, new Set());
|
|
298
|
+
const returned = this.#returned.get(method) ?? new Set();
|
|
299
|
+
this.#returned.set(method, returned);
|
|
300
|
+
const next = isRecord(result) ? result.nextCursor : undefined;
|
|
259
301
|
if (typeof next !== "string")
|
|
260
302
|
return result;
|
|
261
303
|
if (next === cursor || returned.has(next))
|
|
262
|
-
throw new CatalogNonConvergenceError(
|
|
304
|
+
throw new CatalogNonConvergenceError(method, next);
|
|
263
305
|
returned.add(next);
|
|
264
306
|
return result;
|
|
265
307
|
}
|
|
@@ -275,6 +317,8 @@ export class McpRedirectError extends Error {
|
|
|
275
317
|
this.location = location;
|
|
276
318
|
}
|
|
277
319
|
}
|
|
320
|
+
// {§mcp-request-unauthorized} The sentence each surface refuses a request awaiting a sign-in with.
|
|
321
|
+
export const awaitsSignIn = (server) => `MCP server '${server}' awaits the operator's sign-in; the request was not completed.`;
|
|
278
322
|
export class AuthorizationRequiredError extends Error {
|
|
279
323
|
authorizationUrl;
|
|
280
324
|
constructor(authorizationUrl, cause) {
|
|
@@ -339,8 +383,8 @@ const openClient = async (definition, environ, options, transport) => {
|
|
|
339
383
|
catch (failure) {
|
|
340
384
|
const refused = transport instanceof StreamableHTTPClientTransport ? refusedRedirects.get(transport) : undefined;
|
|
341
385
|
const cause = refused ?? failure;
|
|
342
|
-
const
|
|
343
|
-
? definition.oauthProvider?.
|
|
386
|
+
const authorization = definition.type === "streamable-http"
|
|
387
|
+
? definition.oauthProvider?.takeAuthorization()
|
|
344
388
|
: undefined;
|
|
345
389
|
let closeFailure;
|
|
346
390
|
try {
|
|
@@ -349,8 +393,8 @@ const openClient = async (definition, environ, options, transport) => {
|
|
|
349
393
|
catch (error) {
|
|
350
394
|
closeFailure = error;
|
|
351
395
|
}
|
|
352
|
-
if (
|
|
353
|
-
throw new AuthorizationRequiredError(
|
|
396
|
+
if (authorization !== undefined) {
|
|
397
|
+
throw new AuthorizationRequiredError(authorization.url?.href, closeFailure === undefined ? cause : new AggregateError([cause, closeFailure]));
|
|
354
398
|
}
|
|
355
399
|
if (closeFailure === undefined && definition.type === "streamable-http"
|
|
356
400
|
&& definition.authProvider === undefined
|
|
@@ -412,7 +456,7 @@ export default class ServerConnection {
|
|
|
412
456
|
#closed = false;
|
|
413
457
|
constructor(definition, environ = process.env, options = {}) {
|
|
414
458
|
this.#definition = structuredClone(Validator.assertMcpServerDefinition(definition));
|
|
415
|
-
this.#resolved = resolveDefinition(this.#definition, environ, options
|
|
459
|
+
this.#resolved = resolveDefinition(this.#definition, environ, options);
|
|
416
460
|
this.#environ = environ;
|
|
417
461
|
this.#options = options;
|
|
418
462
|
const symbolic = JSON.stringify(definition);
|
|
@@ -431,6 +475,10 @@ export default class ServerConnection {
|
|
|
431
475
|
get authorizationUrl() {
|
|
432
476
|
return this.#pendingAuthorization?.authorizationUrl ?? null;
|
|
433
477
|
}
|
|
478
|
+
// {§oauth-grant} The grant this connection presents, or begins.
|
|
479
|
+
get oauthGrant() {
|
|
480
|
+
return this.#resolved.type === "streamable-http" ? this.#resolved.oauthProvider?.grant : undefined;
|
|
481
|
+
}
|
|
434
482
|
preparationDiagnostic(cause) {
|
|
435
483
|
return this.#diagnostics.describe(cause);
|
|
436
484
|
}
|
|
@@ -483,6 +531,34 @@ export default class ServerConnection {
|
|
|
483
531
|
async connect() {
|
|
484
532
|
return (await this.#open()).client;
|
|
485
533
|
}
|
|
534
|
+
// {§oauth-begin-unchallenged} A server whose catalog answers anonymously challenges no connection, so the SDK never
|
|
535
|
+
// starts its authorization; a sign-in the client begins starts it here, as the transport would on a challenge.
|
|
536
|
+
async beginAuthorization() {
|
|
537
|
+
const resolved = this.#resolved;
|
|
538
|
+
if (resolved.type !== "streamable-http" || resolved.oauthProvider === undefined) {
|
|
539
|
+
throw new Error(`MCP server '${this.#definition.name}' has no interactive OAuth sign-in.`);
|
|
540
|
+
}
|
|
541
|
+
const opened = await this.#open();
|
|
542
|
+
if (!(opened.transport instanceof StreamableHTTPClientTransport)) {
|
|
543
|
+
throw new Error(`MCP server '${this.#definition.name}' is not connected over Streamable HTTP.`);
|
|
544
|
+
}
|
|
545
|
+
const result = await auth(resolved.oauthProvider, {
|
|
546
|
+
serverUrl: new URL(resolved.url),
|
|
547
|
+
fetchFn: authorizationFetches.get(opened.transport),
|
|
548
|
+
});
|
|
549
|
+
if (result === "AUTHORIZED")
|
|
550
|
+
return undefined;
|
|
551
|
+
const authorizationUrl = resolved.oauthProvider.takeAuthorization()?.url;
|
|
552
|
+
if (authorizationUrl === undefined)
|
|
553
|
+
throw new Error("OAuth authorization redirected without an authorization URL.");
|
|
554
|
+
this.#pendingAuthorization = {
|
|
555
|
+
transport: opened.transport,
|
|
556
|
+
provider: resolved.oauthProvider,
|
|
557
|
+
authorizationUrl: authorizationUrl.href,
|
|
558
|
+
standaloneTransport: false,
|
|
559
|
+
};
|
|
560
|
+
return authorizationUrl.href;
|
|
561
|
+
}
|
|
486
562
|
async finishAuthorization(callbackUrl) {
|
|
487
563
|
const pending = this.#pendingAuthorization;
|
|
488
564
|
if (pending === undefined) {
|
|
@@ -511,9 +587,14 @@ export default class ServerConnection {
|
|
|
511
587
|
return await run(opened, signal);
|
|
512
588
|
}
|
|
513
589
|
catch (cause) {
|
|
514
|
-
|
|
515
|
-
if (
|
|
590
|
+
// A nested request already took its authorization and said so.
|
|
591
|
+
if (cause instanceof AuthorizationRequiredError)
|
|
592
|
+
throw cause;
|
|
593
|
+
const authorization = this.#takeAuthorization(opened, cause) ?? this.#refusedUnsigned(cause);
|
|
594
|
+
if (authorization !== null) {
|
|
595
|
+
this.#options.onAuthorizationRequired?.();
|
|
516
596
|
throw authorization;
|
|
597
|
+
}
|
|
517
598
|
throw cause;
|
|
518
599
|
}
|
|
519
600
|
}
|
|
@@ -522,15 +603,31 @@ export default class ServerConnection {
|
|
|
522
603
|
settled.resolve();
|
|
523
604
|
}
|
|
524
605
|
}
|
|
606
|
+
// {§mcp-request-unauthorized} A request the server refused with HTTP 401, on a definition that configures no credential
|
|
607
|
+
// of its own, awaits a sign-in exactly as a challenge at connection does.
|
|
608
|
+
#refusedUnsigned(cause) {
|
|
609
|
+
if (this.#resolved.type !== "streamable-http")
|
|
610
|
+
return null;
|
|
611
|
+
const configured = (this.#resolved.authProvider !== undefined && this.#resolved.oauthProvider === undefined)
|
|
612
|
+
|| Object.keys(this.#resolved.headers ?? {}).some((name) => name.toLowerCase() === "authorization");
|
|
613
|
+
if (configured)
|
|
614
|
+
return null;
|
|
615
|
+
const refused = causeOf(cause, SdkHttpError)?.status === 401 || causeOf(cause, UnauthorizedError) !== undefined;
|
|
616
|
+
return refused ? new AuthorizationRequiredError(undefined, cause) : null;
|
|
617
|
+
}
|
|
525
618
|
#takeAuthorization(opened, cause) {
|
|
526
619
|
if (this.#resolved.type !== "streamable-http"
|
|
527
620
|
|| this.#resolved.oauthProvider === undefined
|
|
528
621
|
|| !(opened.transport instanceof StreamableHTTPClientTransport)) {
|
|
529
622
|
return null;
|
|
530
623
|
}
|
|
531
|
-
const
|
|
532
|
-
if (
|
|
624
|
+
const authorization = this.#resolved.oauthProvider.takeAuthorization();
|
|
625
|
+
if (authorization === undefined)
|
|
533
626
|
return null;
|
|
627
|
+
// {§oauth-grant} The grant no longer answers, and no client waits at its redirect.
|
|
628
|
+
const authorizationUrl = authorization.url;
|
|
629
|
+
if (authorizationUrl === undefined)
|
|
630
|
+
return new AuthorizationRequiredError(undefined, cause);
|
|
534
631
|
this.#pendingAuthorization = {
|
|
535
632
|
transport: opened.transport,
|
|
536
633
|
provider: this.#resolved.oauthProvider,
|
|
@@ -617,11 +714,11 @@ export default class ServerConnection {
|
|
|
617
714
|
}, signal);
|
|
618
715
|
}
|
|
619
716
|
async callTool(name, args, signal, onProgress, interact, toolDefinition) {
|
|
620
|
-
return this.#request(async ({ client, subscriptions, extensions },
|
|
717
|
+
return this.#request(async ({ client, subscriptions, extensions }, requestSignal) => {
|
|
621
718
|
const timeout = requestTimeoutMs(this.#environ);
|
|
622
719
|
// {§mcp-header-declarations} — the definition is scanned before either leg; an invalid declaration
|
|
623
720
|
// refuses the call here and nothing reaches the transport.
|
|
624
|
-
const listed = async () => (await this.tools(
|
|
721
|
+
const listed = async () => (await this.tools(requestSignal))
|
|
625
722
|
.find((candidate) => candidate.name === name);
|
|
626
723
|
if (serverSupportsTasks(serverCapabilities(client))) {
|
|
627
724
|
const tool = toolDefinition ?? await listed();
|
|
@@ -634,7 +731,7 @@ export default class ServerConnection {
|
|
|
634
731
|
name,
|
|
635
732
|
args,
|
|
636
733
|
tool,
|
|
637
|
-
signal,
|
|
734
|
+
signal: requestSignal,
|
|
638
735
|
onProgress,
|
|
639
736
|
interact,
|
|
640
737
|
timeout,
|
|
@@ -645,7 +742,7 @@ export default class ServerConnection {
|
|
|
645
742
|
// The direct leg never waits on a failed listing ({§mcp-catalog-deadline}): a definition at hand is
|
|
646
743
|
// scanned, and a call with none to scan proceeds as it always has, with no routing headers.
|
|
647
744
|
const tool = toolDefinition ?? await listed().catch(() => {
|
|
648
|
-
|
|
745
|
+
requestSignal.throwIfAborted();
|
|
649
746
|
return undefined;
|
|
650
747
|
});
|
|
651
748
|
if (tool !== undefined)
|
|
@@ -658,37 +755,37 @@ export default class ServerConnection {
|
|
|
658
755
|
interact,
|
|
659
756
|
onProgress,
|
|
660
757
|
timeout,
|
|
661
|
-
requestLeg: (params, options) => client.callTool(params, { ...options, ...(tool === undefined ? {} : { toolDefinition: tool }) }),
|
|
758
|
+
requestLeg: (params, options) => client.callTool(CALL_TOOL_PARAMS.parse(params), { ...options, ...(tool === undefined ? {} : { toolDefinition: tool }) }),
|
|
662
759
|
});
|
|
663
760
|
}, signal);
|
|
664
761
|
}
|
|
665
762
|
async readResource(uri, signal, interact) {
|
|
666
|
-
return this.#request(async ({ client, subscriptions },
|
|
667
|
-
await subscriptions.selectResource(uri,
|
|
763
|
+
return this.#request(async ({ client, subscriptions }, requestSignal) => {
|
|
764
|
+
await subscriptions.selectResource(uri, requestSignal);
|
|
668
765
|
return runInputRequiredRequest({
|
|
669
766
|
server: this.#definition.name,
|
|
670
767
|
operation: "resources/read",
|
|
671
768
|
originalParams: { uri },
|
|
672
|
-
signal,
|
|
769
|
+
signal: requestSignal,
|
|
673
770
|
interact,
|
|
674
771
|
timeout: requestTimeoutMs(this.#environ),
|
|
675
|
-
requestLeg: (params, options, retry) => client.readResource(params, retry ? { ...options, cacheMode: "refresh" } : options),
|
|
772
|
+
requestLeg: (params, options, retry) => client.readResource(READ_RESOURCE_PARAMS.parse(params), retry ? { ...options, cacheMode: "refresh" } : options),
|
|
676
773
|
});
|
|
677
774
|
}, signal);
|
|
678
775
|
}
|
|
679
776
|
async getPrompt(name, args, signal, interact) {
|
|
680
|
-
return this.#request(async ({ client },
|
|
777
|
+
return this.#request(async ({ client }, requestSignal) => runInputRequiredRequest({
|
|
681
778
|
server: this.#definition.name,
|
|
682
779
|
operation: "prompts/get",
|
|
683
780
|
originalParams: { name, ...(args === undefined ? {} : { arguments: args }) },
|
|
684
|
-
signal,
|
|
781
|
+
signal: requestSignal,
|
|
685
782
|
interact,
|
|
686
783
|
timeout: requestTimeoutMs(this.#environ),
|
|
687
|
-
requestLeg: (params, options) => client.getPrompt(params, options),
|
|
784
|
+
requestLeg: (params, options) => client.getPrompt(GET_PROMPT_PARAMS.parse(params), options),
|
|
688
785
|
}), signal);
|
|
689
786
|
}
|
|
690
787
|
async complete(params, signal) {
|
|
691
|
-
return this.#request(async ({ client },
|
|
788
|
+
return this.#request(async ({ client }, requestSignal) => client.complete(params, this.#requestOptions(requestSignal)), signal);
|
|
692
789
|
}
|
|
693
790
|
#requestOptions(signal, onProgress) {
|
|
694
791
|
const timeout = requestTimeoutMs(this.#environ);
|