@plurnk/plurnk-mcp 1.6.0 → 1.7.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 +6 -4
- package/README.md +110 -45
- package/SPEC.md +274 -30
- package/dist/McpExecutor.d.ts +25 -4
- package/dist/McpExecutor.d.ts.map +1 -1
- package/dist/McpExecutor.js +105 -31
- 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 +116 -26
- 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 +649 -35
- package/dist/Module.js.map +1 -1
- package/dist/ToolPresentation.d.ts +5 -0
- package/dist/ToolPresentation.d.ts.map +1 -0
- package/dist/ToolPresentation.js +134 -0
- package/dist/ToolPresentation.js.map +1 -0
- package/dist/client.d.ts +25 -7
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +478 -85
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +7 -13
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +114 -45
- 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/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 +7 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +7 -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 +10 -6
|
@@ -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"}
|
package/dist/tasks.js
ADDED
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
import { ProtocolError, ProtocolErrorCode, SdkError, SdkErrorCode, fromJsonSchema, specTypeSchemas, } from "@modelcontextprotocol/client";
|
|
2
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
3
|
+
import { resolveInputRequests, runInputRequiredRequest, } from "./inputRequired.js";
|
|
4
|
+
import { mcpParamHeaders } from "./protocolHeaders.js";
|
|
5
|
+
import { MCP_TASKS_EXTENSION_ID } from "./protocol.js";
|
|
6
|
+
const DEFAULT_POLL_INTERVAL_MS = 250;
|
|
7
|
+
const MINIMUM_POLL_INTERVAL_MS = 10;
|
|
8
|
+
const asRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value)
|
|
9
|
+
? value
|
|
10
|
+
: undefined;
|
|
11
|
+
const issueText = (issues) => issues.map((issue) => issue.path?.length
|
|
12
|
+
? `${issue.path.map(String).join(".")}: ${issue.message}`
|
|
13
|
+
: issue.message).join(", ");
|
|
14
|
+
const protocolShapeError = (surface, detail) => new ProtocolError(ProtocolErrorCode.InvalidRequest, `Invalid MCP Tasks ${surface}: ${detail}`);
|
|
15
|
+
const requireString = (record, field, surface) => {
|
|
16
|
+
const value = record[field];
|
|
17
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
18
|
+
throw protocolShapeError(surface, `'${field}' must be a non-empty string.`);
|
|
19
|
+
}
|
|
20
|
+
return value;
|
|
21
|
+
};
|
|
22
|
+
const parseTask = (value, surface, expectedTaskId) => {
|
|
23
|
+
const record = asRecord(value);
|
|
24
|
+
if (record === undefined)
|
|
25
|
+
throw protocolShapeError(surface, "expected an object.");
|
|
26
|
+
if (surface === "creation result" && record.resultType !== "task") {
|
|
27
|
+
throw protocolShapeError(surface, "expected resultType 'task'.");
|
|
28
|
+
}
|
|
29
|
+
if (surface === "tasks/get result" && record.resultType !== "complete") {
|
|
30
|
+
throw protocolShapeError(surface, "expected resultType 'complete'.");
|
|
31
|
+
}
|
|
32
|
+
if (surface === "notification" && record.resultType !== undefined) {
|
|
33
|
+
throw protocolShapeError(surface, "notifications do not carry resultType.");
|
|
34
|
+
}
|
|
35
|
+
const taskId = requireString(record, "taskId", surface);
|
|
36
|
+
if (expectedTaskId !== undefined && taskId !== expectedTaskId) {
|
|
37
|
+
throw protocolShapeError(surface, `taskId '${taskId}' does not match '${expectedTaskId}'.`);
|
|
38
|
+
}
|
|
39
|
+
const status = record.status;
|
|
40
|
+
if (![
|
|
41
|
+
"working",
|
|
42
|
+
"input_required",
|
|
43
|
+
"completed",
|
|
44
|
+
"failed",
|
|
45
|
+
"cancelled",
|
|
46
|
+
].includes(String(status))) {
|
|
47
|
+
throw protocolShapeError(surface, `'status' is not a current Tasks status.`);
|
|
48
|
+
}
|
|
49
|
+
const statusMessage = record.statusMessage;
|
|
50
|
+
if (statusMessage !== undefined && typeof statusMessage !== "string") {
|
|
51
|
+
throw protocolShapeError(surface, "'statusMessage' must be a string.");
|
|
52
|
+
}
|
|
53
|
+
const createdAt = requireString(record, "createdAt", surface);
|
|
54
|
+
const lastUpdatedAt = requireString(record, "lastUpdatedAt", surface);
|
|
55
|
+
const ttlMs = record.ttlMs;
|
|
56
|
+
if (ttlMs !== null && (!Number.isSafeInteger(ttlMs) || ttlMs < 0)) {
|
|
57
|
+
throw protocolShapeError(surface, "'ttlMs' must be a non-negative integer or null.");
|
|
58
|
+
}
|
|
59
|
+
const pollIntervalMs = record.pollIntervalMs;
|
|
60
|
+
if (pollIntervalMs !== undefined
|
|
61
|
+
&& (!Number.isSafeInteger(pollIntervalMs) || pollIntervalMs < 0)) {
|
|
62
|
+
throw protocolShapeError(surface, "'pollIntervalMs' must be a non-negative integer.");
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
taskId,
|
|
66
|
+
status: status,
|
|
67
|
+
createdAt,
|
|
68
|
+
lastUpdatedAt,
|
|
69
|
+
ttlMs: ttlMs,
|
|
70
|
+
...(statusMessage === undefined ? {} : { statusMessage }),
|
|
71
|
+
...(pollIntervalMs === undefined ? {} : { pollIntervalMs: pollIntervalMs }),
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
const parseDetailedTask = (value, surface, expectedTaskId) => {
|
|
75
|
+
const task = parseTask(value, surface, expectedTaskId);
|
|
76
|
+
const record = asRecord(value);
|
|
77
|
+
if (task.status === "input_required") {
|
|
78
|
+
const inputRequests = asRecord(record.inputRequests);
|
|
79
|
+
if (inputRequests === undefined) {
|
|
80
|
+
throw protocolShapeError(surface, "input_required status omitted 'inputRequests'.");
|
|
81
|
+
}
|
|
82
|
+
return { ...task, status: "input_required", inputRequests };
|
|
83
|
+
}
|
|
84
|
+
if (task.status === "completed") {
|
|
85
|
+
if (!("result" in record)) {
|
|
86
|
+
throw protocolShapeError(surface, "completed status omitted 'result'.");
|
|
87
|
+
}
|
|
88
|
+
return { ...task, status: "completed", result: record.result };
|
|
89
|
+
}
|
|
90
|
+
if (task.status === "failed") {
|
|
91
|
+
const error = asRecord(record.error);
|
|
92
|
+
if (error === undefined
|
|
93
|
+
|| !Number.isSafeInteger(error.code)
|
|
94
|
+
|| typeof error.message !== "string") {
|
|
95
|
+
throw protocolShapeError(surface, "failed status omitted its JSON-RPC error.");
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
...task,
|
|
99
|
+
status: "failed",
|
|
100
|
+
error: {
|
|
101
|
+
code: error.code,
|
|
102
|
+
message: error.message,
|
|
103
|
+
...(error.data === undefined ? {} : { data: error.data }),
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return task;
|
|
108
|
+
};
|
|
109
|
+
const parseInputRequiredResult = (value) => {
|
|
110
|
+
const record = asRecord(value);
|
|
111
|
+
if (record?.resultType !== "input_required") {
|
|
112
|
+
throw protocolShapeError("tools/call result", "expected resultType 'input_required'.");
|
|
113
|
+
}
|
|
114
|
+
const inputRequests = record.inputRequests;
|
|
115
|
+
const requestState = record.requestState;
|
|
116
|
+
if (inputRequests !== undefined && asRecord(inputRequests) === undefined) {
|
|
117
|
+
throw protocolShapeError("tools/call result", "'inputRequests' must be an object.");
|
|
118
|
+
}
|
|
119
|
+
if (requestState !== undefined && typeof requestState !== "string") {
|
|
120
|
+
throw protocolShapeError("tools/call result", "'requestState' must be a string.");
|
|
121
|
+
}
|
|
122
|
+
if (inputRequests === undefined && requestState === undefined) {
|
|
123
|
+
throw protocolShapeError("tools/call result", "input_required requires inputRequests or requestState.");
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
resultType: "input_required",
|
|
127
|
+
...(inputRequests === undefined
|
|
128
|
+
? {}
|
|
129
|
+
: { inputRequests: inputRequests }),
|
|
130
|
+
...(requestState === undefined ? {} : { requestState }),
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
const parseCallToolResult = async (value) => {
|
|
134
|
+
const record = asRecord(value);
|
|
135
|
+
if (record?.resultType !== "complete") {
|
|
136
|
+
throw protocolShapeError("tools/call result", "expected resultType 'complete'.");
|
|
137
|
+
}
|
|
138
|
+
const parsed = specTypeSchemas.CallToolResult["~standard"].validate(value);
|
|
139
|
+
if (parsed.issues !== undefined) {
|
|
140
|
+
throw protocolShapeError("tools/call result", issueText(parsed.issues));
|
|
141
|
+
}
|
|
142
|
+
return parsed.value;
|
|
143
|
+
};
|
|
144
|
+
const validateToolInput = async (tool, args) => {
|
|
145
|
+
const validator = fromJsonSchema(tool.inputSchema);
|
|
146
|
+
const parsed = await validator["~standard"].validate(args);
|
|
147
|
+
if (parsed.issues !== undefined) {
|
|
148
|
+
throw new ProtocolError(ProtocolErrorCode.InvalidParams, `Invalid arguments for MCP tool '${tool.name}': ${issueText(parsed.issues)}.`);
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
const validateToolOutput = async (tool, value) => {
|
|
152
|
+
const result = await parseCallToolResult({
|
|
153
|
+
...(asRecord(value) ?? {}),
|
|
154
|
+
resultType: "complete",
|
|
155
|
+
});
|
|
156
|
+
if (tool.outputSchema === undefined || result.isError === true)
|
|
157
|
+
return result;
|
|
158
|
+
if (result.structuredContent === undefined) {
|
|
159
|
+
throw new ProtocolError(ProtocolErrorCode.InvalidRequest, `Tool '${tool.name}' has an output schema but did not return structured content.`);
|
|
160
|
+
}
|
|
161
|
+
const validator = fromJsonSchema(tool.outputSchema);
|
|
162
|
+
const parsed = await validator["~standard"].validate(result.structuredContent);
|
|
163
|
+
if (parsed.issues !== undefined) {
|
|
164
|
+
throw new ProtocolError(ProtocolErrorCode.InvalidRequest, `Tool '${tool.name}' returned invalid structured content: ${issueText(parsed.issues)}.`);
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
};
|
|
168
|
+
const taskAwareToolLeg = async (channel, tool, params, signal, timeout, onProgress) => {
|
|
169
|
+
const value = await channel.request("tools/call", params, {
|
|
170
|
+
signal,
|
|
171
|
+
timeout,
|
|
172
|
+
onProgress,
|
|
173
|
+
cancelRequestOnSharedTransport: true,
|
|
174
|
+
headers: mcpParamHeaders(tool, params.arguments ?? {}),
|
|
175
|
+
});
|
|
176
|
+
const resultType = asRecord(value)?.resultType;
|
|
177
|
+
if (resultType === "task") {
|
|
178
|
+
return {
|
|
179
|
+
...parseTask(value, "creation result"),
|
|
180
|
+
resultType: "task",
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
if (resultType === "input_required")
|
|
184
|
+
return parseInputRequiredResult(value);
|
|
185
|
+
return parseCallToolResult(value);
|
|
186
|
+
};
|
|
187
|
+
const remainingTimeout = (deadline, operation) => {
|
|
188
|
+
const remaining = deadline - Date.now();
|
|
189
|
+
if (remaining <= 0) {
|
|
190
|
+
throw new SdkError(SdkErrorCode.RequestTimeout, `MCP '${operation}' exceeded its operation timeout.`);
|
|
191
|
+
}
|
|
192
|
+
return remaining;
|
|
193
|
+
};
|
|
194
|
+
const taskRequest = async (channel, method, params, timeout, signal) => channel.request(method, params, { signal, timeout });
|
|
195
|
+
const cancelTask = async (channel, taskId, timeout) => {
|
|
196
|
+
const result = asRecord(await taskRequest(channel, "tasks/cancel", { taskId }, timeout));
|
|
197
|
+
if (result?.resultType !== "complete") {
|
|
198
|
+
throw protocolShapeError("tasks/cancel result", "expected resultType 'complete'.");
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
class TaskInbox {
|
|
202
|
+
#taskId;
|
|
203
|
+
#queue = [];
|
|
204
|
+
#wake;
|
|
205
|
+
constructor(taskId) {
|
|
206
|
+
this.#taskId = taskId;
|
|
207
|
+
}
|
|
208
|
+
push(value) {
|
|
209
|
+
if (asRecord(value)?.taskId !== this.#taskId)
|
|
210
|
+
return;
|
|
211
|
+
this.#queue.push(value);
|
|
212
|
+
this.#wake?.();
|
|
213
|
+
}
|
|
214
|
+
async next(waitMs, signal) {
|
|
215
|
+
if (this.#queue.length > 0)
|
|
216
|
+
return this.#queue.shift();
|
|
217
|
+
const controller = new AbortController();
|
|
218
|
+
const wake = Promise.withResolvers();
|
|
219
|
+
this.#wake = wake.resolve;
|
|
220
|
+
const onAbort = () => controller.abort(signal?.reason);
|
|
221
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
222
|
+
try {
|
|
223
|
+
await Promise.race([
|
|
224
|
+
wake.promise,
|
|
225
|
+
delay(waitMs, undefined, { signal: controller.signal }).catch((cause) => {
|
|
226
|
+
if (!controller.signal.aborted)
|
|
227
|
+
throw cause;
|
|
228
|
+
}),
|
|
229
|
+
]);
|
|
230
|
+
}
|
|
231
|
+
finally {
|
|
232
|
+
this.#wake = undefined;
|
|
233
|
+
signal?.removeEventListener("abort", onAbort);
|
|
234
|
+
controller.abort();
|
|
235
|
+
}
|
|
236
|
+
signal?.throwIfAborted();
|
|
237
|
+
return this.#queue.shift();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
const driveTask = async (task, options, deadline) => {
|
|
241
|
+
const inbox = new TaskInbox(task.taskId);
|
|
242
|
+
const stopWatching = options.channel.onTaskNotification((value) => inbox.push(value));
|
|
243
|
+
const release = await options.subscriptions.selectTask(task.taskId);
|
|
244
|
+
const answered = new Set();
|
|
245
|
+
let state = task;
|
|
246
|
+
let terminal = false;
|
|
247
|
+
try {
|
|
248
|
+
while (true) {
|
|
249
|
+
options.signal?.throwIfAborted();
|
|
250
|
+
if (state.status === "completed" && "result" in state) {
|
|
251
|
+
terminal = true;
|
|
252
|
+
return validateToolOutput(options.tool, state.result);
|
|
253
|
+
}
|
|
254
|
+
if (state.status === "failed" && "error" in state) {
|
|
255
|
+
terminal = true;
|
|
256
|
+
throw ProtocolError.fromError(state.error.code, state.error.message, state.error.data);
|
|
257
|
+
}
|
|
258
|
+
if (state.status === "cancelled") {
|
|
259
|
+
terminal = true;
|
|
260
|
+
throw new Error(`MCP task '${state.taskId}' was cancelled${state.statusMessage === undefined ? "." : `: ${state.statusMessage}`}`);
|
|
261
|
+
}
|
|
262
|
+
if (state.status === "input_required" && "inputRequests" in state) {
|
|
263
|
+
const fresh = Object.fromEntries(Object.entries(state.inputRequests)
|
|
264
|
+
.filter(([key]) => !answered.has(key)));
|
|
265
|
+
if (Object.keys(fresh).length > 0) {
|
|
266
|
+
const responses = await resolveInputRequests({
|
|
267
|
+
server: options.server,
|
|
268
|
+
operation: "tasks/update",
|
|
269
|
+
inputRequests: fresh,
|
|
270
|
+
interact: options.interact,
|
|
271
|
+
arguments: { taskId: task.taskId },
|
|
272
|
+
});
|
|
273
|
+
options.signal?.throwIfAborted();
|
|
274
|
+
const update = asRecord(await taskRequest(options.channel, "tasks/update", { taskId: task.taskId, inputResponses: responses }, remainingTimeout(deadline, "tasks/update"), options.signal));
|
|
275
|
+
if (update?.resultType !== "complete") {
|
|
276
|
+
throw protocolShapeError("tasks/update result", "expected resultType 'complete'.");
|
|
277
|
+
}
|
|
278
|
+
for (const key of Object.keys(fresh))
|
|
279
|
+
answered.add(key);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
const interval = state.status === "working"
|
|
283
|
+
|| (state.status === "input_required" && "inputRequests" in state)
|
|
284
|
+
? Math.max(MINIMUM_POLL_INTERVAL_MS, state.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS)
|
|
285
|
+
: 0;
|
|
286
|
+
const remaining = remainingTimeout(deadline, "Task");
|
|
287
|
+
const notification = await inbox.next(Math.min(interval, remaining), options.signal);
|
|
288
|
+
if (notification !== undefined) {
|
|
289
|
+
state = parseDetailedTask(notification, "notification", task.taskId);
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
const result = await taskRequest(options.channel, "tasks/get", { taskId: task.taskId }, remainingTimeout(deadline, "tasks/get"), options.signal);
|
|
293
|
+
state = parseDetailedTask(result, "tasks/get result", task.taskId);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch (cause) {
|
|
297
|
+
if (!terminal) {
|
|
298
|
+
try {
|
|
299
|
+
await cancelTask(options.channel, task.taskId, options.timeout);
|
|
300
|
+
}
|
|
301
|
+
catch (cancellationFailure) {
|
|
302
|
+
throw new AggregateError([cause, cancellationFailure], `MCP task '${task.taskId}' failed and cancellation also failed.`);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
throw cause;
|
|
306
|
+
}
|
|
307
|
+
finally {
|
|
308
|
+
stopWatching();
|
|
309
|
+
await release();
|
|
310
|
+
}
|
|
311
|
+
};
|
|
312
|
+
export const serverSupportsTasks = (capabilities) => {
|
|
313
|
+
const extension = asRecord(asRecord(capabilities)?.extensions)?.[MCP_TASKS_EXTENSION_ID];
|
|
314
|
+
return asRecord(extension) !== undefined;
|
|
315
|
+
};
|
|
316
|
+
export const callToolWithTasks = async (options) => {
|
|
317
|
+
await validateToolInput(options.tool, options.args);
|
|
318
|
+
const startedAt = Date.now();
|
|
319
|
+
const initial = await runInputRequiredRequest({
|
|
320
|
+
server: options.server,
|
|
321
|
+
operation: "tools/call",
|
|
322
|
+
originalParams: { name: options.name, arguments: options.args },
|
|
323
|
+
signal: options.signal,
|
|
324
|
+
onProgress: options.onProgress,
|
|
325
|
+
interact: options.interact,
|
|
326
|
+
timeout: options.timeout,
|
|
327
|
+
requestLeg: (params, requestOptions) => taskAwareToolLeg(options.channel, options.tool, params, requestOptions.signal, requestOptions.timeout, requestOptions.onprogress),
|
|
328
|
+
});
|
|
329
|
+
if (initial.resultType === "task") {
|
|
330
|
+
return driveTask(initial, options, startedAt + options.timeout);
|
|
331
|
+
}
|
|
332
|
+
return validateToolOutput(options.tool, initial);
|
|
333
|
+
};
|
|
334
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/tasks.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plurnk/plurnk-mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "Current Model Context Protocol host module for Plurnk.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"plurnk",
|
|
@@ -46,7 +46,8 @@
|
|
|
46
46
|
"scripts": {
|
|
47
47
|
"test:lint": "tsc --noEmit",
|
|
48
48
|
"test:unit": "node --conditions=plurnk-dev --env-file-if-exists=../plurnk-execs/.env.defaults --test \"src/**/*.test.ts\"",
|
|
49
|
-
"test": "
|
|
49
|
+
"test:intg": "node --conditions=plurnk-dev --test \"test/intg/*.test.ts\"",
|
|
50
|
+
"test": "npm run test:lint && npm run test:unit && npm run test:intg",
|
|
50
51
|
"build:clean": "rm -rf dist",
|
|
51
52
|
"build:dist": "tsc -p tsconfig.build.json",
|
|
52
53
|
"build": "npm run build:clean && npm run build:dist",
|
|
@@ -54,13 +55,16 @@
|
|
|
54
55
|
"prepublishOnly": "npm audit --audit-level=moderate && npm test"
|
|
55
56
|
},
|
|
56
57
|
"dependencies": {
|
|
57
|
-
"@modelcontextprotocol/client": "2.0.0"
|
|
58
|
+
"@modelcontextprotocol/client": "2.0.0",
|
|
59
|
+
"@plurnk/plurnk-contracts": "1.7.0"
|
|
58
60
|
},
|
|
59
61
|
"devDependencies": {
|
|
60
|
-
"@modelcontextprotocol/
|
|
62
|
+
"@modelcontextprotocol/conformance": "0.2.0-alpha.11",
|
|
63
|
+
"@modelcontextprotocol/server": "2.0.0",
|
|
64
|
+
"zod": "4.4.3"
|
|
61
65
|
},
|
|
62
66
|
"peerDependencies": {
|
|
63
|
-
"@plurnk/plurnk-execs": "^1.
|
|
64
|
-
"@plurnk/plurnk-schemes": "^1.
|
|
67
|
+
"@plurnk/plurnk-execs": "^1.7.0",
|
|
68
|
+
"@plurnk/plurnk-schemes": "^1.7.0"
|
|
65
69
|
}
|
|
66
70
|
}
|