@plurnk/plurnk-mcp 1.6.1 → 1.8.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/.env.defaults +31 -4
- package/README.md +161 -42
- package/SPEC.md +486 -28
- package/dist/McpExecutor.d.ts +28 -5
- package/dist/McpExecutor.d.ts.map +1 -1
- package/dist/McpExecutor.js +144 -32
- package/dist/McpExecutor.js.map +1 -1
- package/dist/McpResources.d.ts +2 -2
- package/dist/McpResources.d.ts.map +1 -1
- package/dist/McpResources.js +114 -24
- package/dist/McpResources.js.map +1 -1
- package/dist/Module.d.ts +30 -5
- package/dist/Module.d.ts.map +1 -1
- package/dist/Module.js +857 -36
- package/dist/Module.js.map +1 -1
- package/dist/ToolPresentation.d.ts +7 -0
- package/dist/ToolPresentation.d.ts.map +1 -0
- package/dist/ToolPresentation.js +224 -0
- package/dist/ToolPresentation.js.map +1 -0
- package/dist/capabilityMatrix.d.ts +23 -0
- package/dist/capabilityMatrix.d.ts.map +1 -0
- package/dist/capabilityMatrix.js +403 -0
- package/dist/capabilityMatrix.js.map +1 -0
- package/dist/client.d.ts +27 -8
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +537 -91
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +14 -13
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +257 -51
- package/dist/config.js.map +1 -1
- package/dist/extensionChannel.d.ts +25 -0
- package/dist/extensionChannel.d.ts.map +1 -0
- package/dist/extensionChannel.js +195 -0
- package/dist/extensionChannel.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/inputRequired.d.ts +36 -0
- package/dist/inputRequired.d.ts.map +1 -0
- package/dist/inputRequired.js +171 -0
- package/dist/inputRequired.js.map +1 -0
- package/dist/mcp-watchdog.mjs +106 -0
- package/dist/oauth.d.ts +28 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +149 -0
- package/dist/oauth.js.map +1 -0
- package/dist/protocol.d.ts +8 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +8 -0
- package/dist/protocol.js.map +1 -0
- package/dist/protocolHeaders.d.ts +4 -0
- package/dist/protocolHeaders.d.ts.map +1 -0
- package/dist/protocolHeaders.js +87 -0
- package/dist/protocolHeaders.js.map +1 -0
- package/dist/subscriptions.d.ts +15 -0
- package/dist/subscriptions.d.ts.map +1 -0
- package/dist/subscriptions.js +188 -0
- package/dist/subscriptions.js.map +1 -0
- package/dist/tasks.d.ts +19 -0
- package/dist/tasks.d.ts.map +1 -0
- package/dist/tasks.js +334 -0
- package/dist/tasks.js.map +1 -0
- package/package.json +12 -7
package/dist/oauth.js
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import packageJson from "../package.json" with { type: "json" };
|
|
3
|
+
export default class InteractiveOAuthProvider {
|
|
4
|
+
redirectUrl;
|
|
5
|
+
clientMetadataUrl;
|
|
6
|
+
#scope;
|
|
7
|
+
#configuredClientInformation;
|
|
8
|
+
#clientInformation = new Map();
|
|
9
|
+
#tokens = new Map();
|
|
10
|
+
#configuredIssuer;
|
|
11
|
+
#activeIssuer;
|
|
12
|
+
#currentTokens;
|
|
13
|
+
#presentedToken = false;
|
|
14
|
+
#awaitingAuthorizationCallback = false;
|
|
15
|
+
#state;
|
|
16
|
+
#authorizationUrl;
|
|
17
|
+
#codeVerifier;
|
|
18
|
+
#discoveryState;
|
|
19
|
+
constructor({ redirectUrl, clientMetadataUrl, clientId, clientSecret, scope, }) {
|
|
20
|
+
this.redirectUrl = redirectUrl;
|
|
21
|
+
this.clientMetadataUrl = clientMetadataUrl;
|
|
22
|
+
this.#scope = scope;
|
|
23
|
+
this.#configuredClientInformation = clientId === undefined
|
|
24
|
+
? undefined
|
|
25
|
+
: { client_id: clientId, ...(clientSecret === undefined ? {} : { client_secret: clientSecret }) };
|
|
26
|
+
}
|
|
27
|
+
get clientMetadata() {
|
|
28
|
+
return {
|
|
29
|
+
client_name: packageJson.name,
|
|
30
|
+
redirect_uris: [this.redirectUrl],
|
|
31
|
+
grant_types: ["authorization_code", "refresh_token"],
|
|
32
|
+
response_types: ["code"],
|
|
33
|
+
token_endpoint_auth_method: "none",
|
|
34
|
+
...(this.#scope === undefined ? {} : { scope: this.#scope }),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
state() {
|
|
38
|
+
this.#state = randomUUID();
|
|
39
|
+
return this.#state;
|
|
40
|
+
}
|
|
41
|
+
clientInformation(context) {
|
|
42
|
+
const issuer = context?.issuer ?? this.#activeIssuer;
|
|
43
|
+
if (issuer === undefined)
|
|
44
|
+
return undefined;
|
|
45
|
+
this.#activeIssuer = issuer;
|
|
46
|
+
const stored = this.#clientInformation.get(issuer);
|
|
47
|
+
if (stored !== undefined)
|
|
48
|
+
return stored;
|
|
49
|
+
if (this.#configuredClientInformation === undefined
|
|
50
|
+
|| (this.#configuredIssuer !== undefined && this.#configuredIssuer !== issuer)) {
|
|
51
|
+
const metadata = this.#discoveryState?.authorizationServerMetadata;
|
|
52
|
+
const cimdAvailable = this.clientMetadataUrl !== undefined
|
|
53
|
+
&& metadata?.client_id_metadata_document_supported === true;
|
|
54
|
+
if (!cimdAvailable && metadata?.registration_endpoint === undefined) {
|
|
55
|
+
throw new Error(`MCP authorization server '${issuer}' exposes no usable client registration: `
|
|
56
|
+
+ "configure pre-registration or advertised CIMD; its metadata does not advertise "
|
|
57
|
+
+ "a Dynamic Client Registration endpoint.");
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
this.#configuredIssuer = issuer;
|
|
62
|
+
const configured = { ...this.#configuredClientInformation, issuer };
|
|
63
|
+
this.#clientInformation.set(issuer, configured);
|
|
64
|
+
return configured;
|
|
65
|
+
}
|
|
66
|
+
saveClientInformation(clientInformation, context) {
|
|
67
|
+
const issuer = context?.issuer ?? clientInformation.issuer;
|
|
68
|
+
if (issuer === undefined) {
|
|
69
|
+
throw new Error("MCP OAuth client information is missing its authorization-server issuer.");
|
|
70
|
+
}
|
|
71
|
+
this.#activeIssuer = issuer;
|
|
72
|
+
this.#clientInformation.set(issuer, { ...clientInformation, issuer });
|
|
73
|
+
}
|
|
74
|
+
tokens(context) {
|
|
75
|
+
if (context === undefined) {
|
|
76
|
+
this.#presentedToken = this.#currentTokens !== undefined;
|
|
77
|
+
return this.#currentTokens;
|
|
78
|
+
}
|
|
79
|
+
this.#activeIssuer = context.issuer;
|
|
80
|
+
return this.#tokens.get(context.issuer);
|
|
81
|
+
}
|
|
82
|
+
saveTokens(tokens, context) {
|
|
83
|
+
const issuer = context?.issuer ?? tokens.issuer;
|
|
84
|
+
if (issuer === undefined) {
|
|
85
|
+
throw new Error("MCP OAuth tokens are missing their authorization-server issuer.");
|
|
86
|
+
}
|
|
87
|
+
const stored = { ...tokens, issuer };
|
|
88
|
+
this.#activeIssuer = issuer;
|
|
89
|
+
this.#currentTokens = stored;
|
|
90
|
+
this.#presentedToken = false;
|
|
91
|
+
this.#awaitingAuthorizationCallback = false;
|
|
92
|
+
this.#tokens.set(issuer, stored);
|
|
93
|
+
}
|
|
94
|
+
redirectToAuthorization(authorizationUrl) {
|
|
95
|
+
this.#awaitingAuthorizationCallback = true;
|
|
96
|
+
this.#authorizationUrl = authorizationUrl;
|
|
97
|
+
}
|
|
98
|
+
takeAuthorizationUrl() {
|
|
99
|
+
const authorizationUrl = this.#authorizationUrl;
|
|
100
|
+
this.#authorizationUrl = undefined;
|
|
101
|
+
return authorizationUrl;
|
|
102
|
+
}
|
|
103
|
+
assertCallbackState(callback) {
|
|
104
|
+
if (this.#state === undefined || callback.searchParams.get("state") !== this.#state) {
|
|
105
|
+
throw new Error("OAuth callback state does not match the pending authorization request.");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
saveCodeVerifier(codeVerifier) {
|
|
109
|
+
this.#codeVerifier = codeVerifier;
|
|
110
|
+
}
|
|
111
|
+
codeVerifier() {
|
|
112
|
+
if (this.#codeVerifier === undefined) {
|
|
113
|
+
throw new Error("OAuth authorization has no pending PKCE verifier.");
|
|
114
|
+
}
|
|
115
|
+
return this.#codeVerifier;
|
|
116
|
+
}
|
|
117
|
+
saveDiscoveryState(state) {
|
|
118
|
+
if (state.authorizationServerMetadata === undefined) {
|
|
119
|
+
throw new Error("MCP OAuth requires validated authorization-server metadata; "
|
|
120
|
+
+ "legacy endpoint inference is not supported.");
|
|
121
|
+
}
|
|
122
|
+
this.#discoveryState = state;
|
|
123
|
+
}
|
|
124
|
+
discoveryState() {
|
|
125
|
+
if (!this.#awaitingAuthorizationCallback && this.#presentedToken) {
|
|
126
|
+
this.#presentedToken = false;
|
|
127
|
+
this.#discoveryState = undefined;
|
|
128
|
+
}
|
|
129
|
+
return this.#discoveryState;
|
|
130
|
+
}
|
|
131
|
+
invalidateCredentials(scope) {
|
|
132
|
+
if ((scope === "all" || scope === "client") && this.#activeIssuer !== undefined) {
|
|
133
|
+
this.#clientInformation.delete(this.#activeIssuer);
|
|
134
|
+
}
|
|
135
|
+
if (scope === "all" || scope === "tokens") {
|
|
136
|
+
if (this.#activeIssuer !== undefined)
|
|
137
|
+
this.#tokens.delete(this.#activeIssuer);
|
|
138
|
+
this.#currentTokens = undefined;
|
|
139
|
+
this.#presentedToken = false;
|
|
140
|
+
}
|
|
141
|
+
if (scope === "all" || scope === "verifier") {
|
|
142
|
+
this.#codeVerifier = undefined;
|
|
143
|
+
this.#awaitingAuthorizationCallback = false;
|
|
144
|
+
}
|
|
145
|
+
if (scope === "all" || scope === "discovery")
|
|
146
|
+
this.#discoveryState = undefined;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const MCP_PROTOCOL_VERSION = "2026-07-28";
|
|
2
|
+
export declare const MCP_SPECIFICATION_COMMIT = "5f5440bb26a62e2cf3440b92da5a667efa03b267";
|
|
3
|
+
export declare const MCP_TASKS_EXTENSION_ID = "io.modelcontextprotocol/tasks";
|
|
4
|
+
export declare const MCP_OAUTH_CLIENT_CREDENTIALS_EXTENSION_ID = "io.modelcontextprotocol/oauth-client-credentials";
|
|
5
|
+
export declare const MCP_TASKS_SPECIFICATION_COMMIT = "2c1425d9a288b9b1f489430fe1e00bb392b47e48";
|
|
6
|
+
export declare const MCP_CLIENT_VERSION = "2.0.0";
|
|
7
|
+
export declare const MCP_CONFORMANCE_VERSION = "0.2.0-alpha.11";
|
|
8
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD,eAAO,MAAM,wBAAwB,6CAA6C,CAAC;AACnF,eAAO,MAAM,sBAAsB,kCAAkC,CAAC;AACtE,eAAO,MAAM,yCAAyC,qDAAqD,CAAC;AAC5G,eAAO,MAAM,8BAA8B,6CAA6C,CAAC;AACzF,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAC1C,eAAO,MAAM,uBAAuB,mBAAmB,CAAC"}
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const MCP_PROTOCOL_VERSION = "2026-07-28";
|
|
2
|
+
export const MCP_SPECIFICATION_COMMIT = "5f5440bb26a62e2cf3440b92da5a667efa03b267";
|
|
3
|
+
export const MCP_TASKS_EXTENSION_ID = "io.modelcontextprotocol/tasks";
|
|
4
|
+
export const MCP_OAUTH_CLIENT_CREDENTIALS_EXTENSION_ID = "io.modelcontextprotocol/oauth-client-credentials";
|
|
5
|
+
export const MCP_TASKS_SPECIFICATION_COMMIT = "2c1425d9a288b9b1f489430fe1e00bb392b47e48";
|
|
6
|
+
export const MCP_CLIENT_VERSION = "2.0.0";
|
|
7
|
+
export const MCP_CONFORMANCE_VERSION = "0.2.0-alpha.11";
|
|
8
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,oBAAoB,GAAG,YAAY,CAAC;AACjD,MAAM,CAAC,MAAM,wBAAwB,GAAG,0CAA0C,CAAC;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG,+BAA+B,CAAC;AACtE,MAAM,CAAC,MAAM,yCAAyC,GAAG,kDAAkD,CAAC;AAC5G,MAAM,CAAC,MAAM,8BAA8B,GAAG,0CAA0C,CAAC;AACzF,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAC1C,MAAM,CAAC,MAAM,uBAAuB,GAAG,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Tool } from "@modelcontextprotocol/client";
|
|
2
|
+
export declare const mcpRoutingHeaderValue: (value: string) => string;
|
|
3
|
+
export declare const mcpParamHeaders: (tool: Tool, args: Record<string, unknown>) => Readonly<Record<string, string>>;
|
|
4
|
+
//# sourceMappingURL=protocolHeaders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocolHeaders.d.ts","sourceRoot":"","sources":["../src/protocolHeaders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,8BAA8B,CAAC;AAoBzD,eAAO,MAAM,qBAAqB,UAAW,MAAM,KAAG,MAE3C,CAAC;AA8DZ,eAAO,MAAM,eAAe,SAClB,IAAI,QACJ,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC9B,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CASjC,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
const BASE64_PREFIX = "=?base64?";
|
|
2
|
+
const BASE64_SUFFIX = "?=";
|
|
3
|
+
const RFC9110_TOKEN = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/;
|
|
4
|
+
const HEADER_TYPES = new Set(["string", "integer", "number", "boolean"]);
|
|
5
|
+
const requiresEncoding = (value) => {
|
|
6
|
+
if (value.length === 0 || value !== value.trim())
|
|
7
|
+
return true;
|
|
8
|
+
if (value.startsWith(BASE64_PREFIX) && value.endsWith(BASE64_SUFFIX))
|
|
9
|
+
return true;
|
|
10
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
11
|
+
const codePoint = value.codePointAt(index);
|
|
12
|
+
if (codePoint === 9 || (codePoint !== undefined && codePoint >= 32 && codePoint <= 126)) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
return false;
|
|
18
|
+
};
|
|
19
|
+
export const mcpRoutingHeaderValue = (value) => requiresEncoding(value)
|
|
20
|
+
? `${BASE64_PREFIX}${Buffer.from(value, "utf8").toString("base64")}${BASE64_SUFFIX}`
|
|
21
|
+
: value;
|
|
22
|
+
const headerDeclarations = (tool) => {
|
|
23
|
+
const declarations = [];
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
const visit = (schema, path) => {
|
|
26
|
+
if (schema === null || typeof schema !== "object" || Array.isArray(schema))
|
|
27
|
+
return;
|
|
28
|
+
const node = schema;
|
|
29
|
+
const header = node["x-mcp-header"];
|
|
30
|
+
if (header !== undefined) {
|
|
31
|
+
if (path.length === 0
|
|
32
|
+
|| typeof header !== "string"
|
|
33
|
+
|| !RFC9110_TOKEN.test(header)
|
|
34
|
+
|| typeof node.type !== "string"
|
|
35
|
+
|| !HEADER_TYPES.has(node.type)) {
|
|
36
|
+
throw new Error(`MCP tool '${tool.name}' has an invalid x-mcp-header declaration.`);
|
|
37
|
+
}
|
|
38
|
+
const folded = header.toLowerCase();
|
|
39
|
+
if (seen.has(folded)) {
|
|
40
|
+
throw new Error(`MCP tool '${tool.name}' repeats x-mcp-header '${header}'.`);
|
|
41
|
+
}
|
|
42
|
+
seen.add(folded);
|
|
43
|
+
declarations.push({ name: header, path, type: node.type });
|
|
44
|
+
}
|
|
45
|
+
const properties = node.properties;
|
|
46
|
+
if (properties === null || typeof properties !== "object" || Array.isArray(properties))
|
|
47
|
+
return;
|
|
48
|
+
for (const [name, child] of Object.entries(properties)) {
|
|
49
|
+
visit(child, [...path, name]);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
visit(tool.inputSchema, []);
|
|
53
|
+
return declarations;
|
|
54
|
+
};
|
|
55
|
+
const valueAt = (root, path) => {
|
|
56
|
+
let value = root;
|
|
57
|
+
for (const segment of path) {
|
|
58
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
59
|
+
return undefined;
|
|
60
|
+
value = value[segment];
|
|
61
|
+
}
|
|
62
|
+
return value;
|
|
63
|
+
};
|
|
64
|
+
const primitiveHeaderValue = (value, type) => {
|
|
65
|
+
if (type === "string")
|
|
66
|
+
return typeof value === "string" ? value : undefined;
|
|
67
|
+
if (type === "boolean")
|
|
68
|
+
return typeof value === "boolean" ? String(value) : undefined;
|
|
69
|
+
if (typeof value !== "number" || !Number.isFinite(value))
|
|
70
|
+
return undefined;
|
|
71
|
+
if (Number.isInteger(value) && !Number.isSafeInteger(value))
|
|
72
|
+
return undefined;
|
|
73
|
+
if (type === "integer" && (!Number.isSafeInteger(value) || !Number.isInteger(value))) {
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
return String(value);
|
|
77
|
+
};
|
|
78
|
+
export const mcpParamHeaders = (tool, args) => Object.fromEntries(headerDeclarations(tool).flatMap((declaration) => {
|
|
79
|
+
const value = valueAt(args, declaration.path);
|
|
80
|
+
if (value === undefined || value === null)
|
|
81
|
+
return [];
|
|
82
|
+
const primitive = primitiveHeaderValue(value, declaration.type);
|
|
83
|
+
return primitive === undefined
|
|
84
|
+
? []
|
|
85
|
+
: [[`Mcp-Param-${declaration.name}`, mcpRoutingHeaderValue(primitive)]];
|
|
86
|
+
}));
|
|
87
|
+
//# sourceMappingURL=protocolHeaders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocolHeaders.js","sourceRoot":"","sources":["../src/protocolHeaders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Client } from "@modelcontextprotocol/client";
|
|
2
|
+
export interface SubscriptionOptions {
|
|
3
|
+
readonly timeout: number;
|
|
4
|
+
readonly tasks?: boolean;
|
|
5
|
+
readonly onError?: (error: Error) => void;
|
|
6
|
+
}
|
|
7
|
+
/** Owns the one current modern subscription filter for a server connection. */
|
|
8
|
+
export default class Subscriptions {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(client: Client, options: SubscriptionOptions);
|
|
11
|
+
selectTask(taskId: string): Promise<() => Promise<void>>;
|
|
12
|
+
selectResource(uri: string): Promise<void>;
|
|
13
|
+
retire(): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=subscriptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.d.ts","sourceRoot":"","sources":["../src/subscriptions.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,KAAK,MAAM,EAGd,MAAM,8BAA8B,CAAC;AAKtC,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAC7C;AAuCD,+EAA+E;AAC/E,MAAM,CAAC,OAAO,OAAO,aAAa;;IAY9B,YAAY,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EASvD;IAEK,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAuB7D;IAWK,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/C;IAyFD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAOtB;CACJ"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
const RETRY_FLOOR_MS = 250;
|
|
2
|
+
const RETRY_CEILING_MS = 5_000;
|
|
3
|
+
const asError = (cause) => cause instanceof Error
|
|
4
|
+
? cause
|
|
5
|
+
: new Error(String(cause));
|
|
6
|
+
const filterFor = (client, resources, tasks, tasksEnabled) => {
|
|
7
|
+
const capabilities = client.getDiscoverResult()?.capabilities;
|
|
8
|
+
return {
|
|
9
|
+
...(capabilities?.tools?.listChanged === true
|
|
10
|
+
? { toolsListChanged: true }
|
|
11
|
+
: {}),
|
|
12
|
+
...(capabilities?.prompts?.listChanged === true
|
|
13
|
+
? { promptsListChanged: true }
|
|
14
|
+
: {}),
|
|
15
|
+
...(capabilities?.resources?.listChanged === true
|
|
16
|
+
? { resourcesListChanged: true }
|
|
17
|
+
: {}),
|
|
18
|
+
...(capabilities?.resources?.subscribe === true && resources.size > 0
|
|
19
|
+
? { resourceSubscriptions: [...resources].toSorted() }
|
|
20
|
+
: {}),
|
|
21
|
+
...(tasksEnabled && tasks.size > 0
|
|
22
|
+
? { taskIds: [...tasks.keys()].toSorted() }
|
|
23
|
+
: {}),
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
const hasSelections = (filter) => Object.keys(filter).length > 0;
|
|
27
|
+
/** Owns the one current modern subscription filter for a server connection. */
|
|
28
|
+
export default class Subscriptions {
|
|
29
|
+
#client;
|
|
30
|
+
#options;
|
|
31
|
+
#resources = new Set();
|
|
32
|
+
#tasks = new Map();
|
|
33
|
+
#current;
|
|
34
|
+
#work = Promise.resolve();
|
|
35
|
+
#retryTimer;
|
|
36
|
+
#retryAttempt = 0;
|
|
37
|
+
#listenAbort;
|
|
38
|
+
#closed = false;
|
|
39
|
+
constructor(client, options) {
|
|
40
|
+
this.#client = client;
|
|
41
|
+
this.#options = options;
|
|
42
|
+
this.#current = client.autoOpenedSubscription;
|
|
43
|
+
if (this.#current === undefined) {
|
|
44
|
+
if (hasSelections(this.#filter()))
|
|
45
|
+
this.#scheduleRetry();
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
this.#observe(this.#current);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async selectTask(taskId) {
|
|
52
|
+
if (this.#closed)
|
|
53
|
+
throw new Error("MCP subscriptions are closed.");
|
|
54
|
+
if (this.#options.tasks !== true)
|
|
55
|
+
return async () => undefined;
|
|
56
|
+
const count = this.#tasks.get(taskId) ?? 0;
|
|
57
|
+
this.#tasks.set(taskId, count + 1);
|
|
58
|
+
if (count === 0) {
|
|
59
|
+
this.#clearRetry();
|
|
60
|
+
await this.#enqueueReplacement();
|
|
61
|
+
}
|
|
62
|
+
let released = false;
|
|
63
|
+
return async () => {
|
|
64
|
+
if (released || this.#closed)
|
|
65
|
+
return;
|
|
66
|
+
released = true;
|
|
67
|
+
const current = this.#tasks.get(taskId);
|
|
68
|
+
if (current === undefined)
|
|
69
|
+
return;
|
|
70
|
+
if (current > 1) {
|
|
71
|
+
this.#tasks.set(taskId, current - 1);
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
this.#tasks.delete(taskId);
|
|
75
|
+
this.#clearRetry();
|
|
76
|
+
await this.#enqueueReplacement();
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
#filter() {
|
|
80
|
+
return filterFor(this.#client, this.#resources, this.#tasks, this.#options.tasks === true);
|
|
81
|
+
}
|
|
82
|
+
async selectResource(uri) {
|
|
83
|
+
if (this.#closed)
|
|
84
|
+
throw new Error("MCP subscriptions are closed.");
|
|
85
|
+
if (this.#client.getDiscoverResult()?.capabilities.resources?.subscribe !== true)
|
|
86
|
+
return;
|
|
87
|
+
if (this.#resources.has(uri))
|
|
88
|
+
return;
|
|
89
|
+
this.#resources.add(uri);
|
|
90
|
+
this.#clearRetry();
|
|
91
|
+
await this.#enqueueReplacement();
|
|
92
|
+
}
|
|
93
|
+
#enqueueReplacement() {
|
|
94
|
+
const replacement = this.#work.then(() => this.#replace());
|
|
95
|
+
this.#work = replacement.catch(() => undefined);
|
|
96
|
+
return replacement;
|
|
97
|
+
}
|
|
98
|
+
async #replace() {
|
|
99
|
+
if (this.#closed)
|
|
100
|
+
return;
|
|
101
|
+
const filter = this.#filter();
|
|
102
|
+
if (!hasSelections(filter)) {
|
|
103
|
+
const prior = this.#current;
|
|
104
|
+
this.#current = undefined;
|
|
105
|
+
if (prior !== undefined)
|
|
106
|
+
await prior.close();
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const prior = this.#current;
|
|
110
|
+
const controller = new AbortController();
|
|
111
|
+
this.#listenAbort = controller;
|
|
112
|
+
let next;
|
|
113
|
+
try {
|
|
114
|
+
next = await this.#client.listen(filter, {
|
|
115
|
+
timeout: this.#options.timeout,
|
|
116
|
+
signal: controller.signal,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (cause) {
|
|
120
|
+
if (!this.#closed && !controller.signal.aborted) {
|
|
121
|
+
this.#report(cause);
|
|
122
|
+
this.#scheduleRetry();
|
|
123
|
+
}
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
if (this.#listenAbort === controller)
|
|
128
|
+
this.#listenAbort = undefined;
|
|
129
|
+
}
|
|
130
|
+
if (this.#closed)
|
|
131
|
+
return;
|
|
132
|
+
this.#clearRetry();
|
|
133
|
+
this.#retryAttempt = 0;
|
|
134
|
+
this.#current = next;
|
|
135
|
+
this.#observe(next);
|
|
136
|
+
if (prior !== undefined && prior !== next) {
|
|
137
|
+
try {
|
|
138
|
+
await prior.close();
|
|
139
|
+
}
|
|
140
|
+
catch (cause) {
|
|
141
|
+
this.#report(cause);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
#observe(subscription) {
|
|
146
|
+
void subscription.closed.then((reason) => {
|
|
147
|
+
if (this.#closed
|
|
148
|
+
|| reason === "local"
|
|
149
|
+
|| this.#current !== subscription)
|
|
150
|
+
return;
|
|
151
|
+
this.#current = undefined;
|
|
152
|
+
this.#scheduleRetry();
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
#scheduleRetry() {
|
|
156
|
+
if (this.#closed || this.#retryTimer !== undefined)
|
|
157
|
+
return;
|
|
158
|
+
const delay = Math.min(RETRY_FLOOR_MS * (2 ** this.#retryAttempt), RETRY_CEILING_MS);
|
|
159
|
+
this.#retryAttempt += 1;
|
|
160
|
+
this.#retryTimer = setTimeout(() => {
|
|
161
|
+
this.#retryTimer = undefined;
|
|
162
|
+
void this.#enqueueReplacement().catch((cause) => {
|
|
163
|
+
if (!this.#closed)
|
|
164
|
+
this.#report(cause);
|
|
165
|
+
});
|
|
166
|
+
}, delay);
|
|
167
|
+
this.#retryTimer.unref();
|
|
168
|
+
}
|
|
169
|
+
#clearRetry() {
|
|
170
|
+
if (this.#retryTimer === undefined)
|
|
171
|
+
return;
|
|
172
|
+
clearTimeout(this.#retryTimer);
|
|
173
|
+
this.#retryTimer = undefined;
|
|
174
|
+
}
|
|
175
|
+
#report(cause) {
|
|
176
|
+
this.#options.onError?.(asError(cause));
|
|
177
|
+
}
|
|
178
|
+
retire() {
|
|
179
|
+
if (this.#closed)
|
|
180
|
+
return this.#work;
|
|
181
|
+
this.#closed = true;
|
|
182
|
+
this.#clearRetry();
|
|
183
|
+
this.#listenAbort = undefined;
|
|
184
|
+
this.#current = undefined;
|
|
185
|
+
return this.#work;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=subscriptions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscriptions.js","sourceRoot":"","sources":["../src/subscriptions.ts"],"names":[],"mappings":"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"}
|
package/dist/tasks.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type CallToolResult, type Progress, type Tool } from "@modelcontextprotocol/client";
|
|
2
|
+
import ExtensionChannel from "./extensionChannel.ts";
|
|
3
|
+
import { type ClientInteractionHandler } from "./inputRequired.ts";
|
|
4
|
+
import Subscriptions from "./subscriptions.ts";
|
|
5
|
+
export interface TaskCallOptions {
|
|
6
|
+
readonly server: string;
|
|
7
|
+
readonly name: string;
|
|
8
|
+
readonly args: Record<string, unknown>;
|
|
9
|
+
readonly tool: Tool;
|
|
10
|
+
readonly signal?: AbortSignal;
|
|
11
|
+
readonly onProgress?: (progress: Progress) => void;
|
|
12
|
+
readonly interact?: ClientInteractionHandler;
|
|
13
|
+
readonly timeout: number;
|
|
14
|
+
readonly channel: ExtensionChannel;
|
|
15
|
+
readonly subscriptions: Subscriptions;
|
|
16
|
+
}
|
|
17
|
+
export declare const serverSupportsTasks: (capabilities: unknown) => boolean;
|
|
18
|
+
export declare const callToolWithTasks: (options: TaskCallOptions) => Promise<CallToolResult>;
|
|
19
|
+
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAQH,KAAK,cAAc,EAGnB,KAAK,QAAQ,EACb,KAAK,IAAI,EACZ,MAAM,8BAA8B,CAAC;AAEtC,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAGH,KAAK,wBAAwB,EAChC,MAAM,oBAAoB,CAAC;AAG5B,OAAO,aAAa,MAAM,oBAAoB,CAAC;AA0C/C,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;CACzC;AAgZD,eAAO,MAAM,mBAAmB,iBAAkB,OAAO,KAAG,OAG3D,CAAC;AAEF,eAAO,MAAM,iBAAiB,YAAmB,eAAe,KAAG,OAAO,CAAC,cAAc,CA2BxF,CAAC"}
|