@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.
Files changed (65) hide show
  1. package/.env.defaults +31 -4
  2. package/README.md +161 -42
  3. package/SPEC.md +486 -28
  4. package/dist/McpExecutor.d.ts +28 -5
  5. package/dist/McpExecutor.d.ts.map +1 -1
  6. package/dist/McpExecutor.js +144 -32
  7. package/dist/McpExecutor.js.map +1 -1
  8. package/dist/McpResources.d.ts +2 -2
  9. package/dist/McpResources.d.ts.map +1 -1
  10. package/dist/McpResources.js +114 -24
  11. package/dist/McpResources.js.map +1 -1
  12. package/dist/Module.d.ts +30 -5
  13. package/dist/Module.d.ts.map +1 -1
  14. package/dist/Module.js +857 -36
  15. package/dist/Module.js.map +1 -1
  16. package/dist/ToolPresentation.d.ts +7 -0
  17. package/dist/ToolPresentation.d.ts.map +1 -0
  18. package/dist/ToolPresentation.js +224 -0
  19. package/dist/ToolPresentation.js.map +1 -0
  20. package/dist/capabilityMatrix.d.ts +23 -0
  21. package/dist/capabilityMatrix.d.ts.map +1 -0
  22. package/dist/capabilityMatrix.js +403 -0
  23. package/dist/capabilityMatrix.js.map +1 -0
  24. package/dist/client.d.ts +27 -8
  25. package/dist/client.d.ts.map +1 -1
  26. package/dist/client.js +537 -91
  27. package/dist/client.js.map +1 -1
  28. package/dist/config.d.ts +14 -13
  29. package/dist/config.d.ts.map +1 -1
  30. package/dist/config.js +257 -51
  31. package/dist/config.js.map +1 -1
  32. package/dist/extensionChannel.d.ts +25 -0
  33. package/dist/extensionChannel.d.ts.map +1 -0
  34. package/dist/extensionChannel.js +195 -0
  35. package/dist/extensionChannel.js.map +1 -0
  36. package/dist/index.d.ts +3 -3
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +2 -2
  39. package/dist/index.js.map +1 -1
  40. package/dist/inputRequired.d.ts +36 -0
  41. package/dist/inputRequired.d.ts.map +1 -0
  42. package/dist/inputRequired.js +171 -0
  43. package/dist/inputRequired.js.map +1 -0
  44. package/dist/mcp-watchdog.mjs +106 -0
  45. package/dist/oauth.d.ts +28 -0
  46. package/dist/oauth.d.ts.map +1 -0
  47. package/dist/oauth.js +149 -0
  48. package/dist/oauth.js.map +1 -0
  49. package/dist/protocol.d.ts +8 -0
  50. package/dist/protocol.d.ts.map +1 -0
  51. package/dist/protocol.js +8 -0
  52. package/dist/protocol.js.map +1 -0
  53. package/dist/protocolHeaders.d.ts +4 -0
  54. package/dist/protocolHeaders.d.ts.map +1 -0
  55. package/dist/protocolHeaders.js +87 -0
  56. package/dist/protocolHeaders.js.map +1 -0
  57. package/dist/subscriptions.d.ts +15 -0
  58. package/dist/subscriptions.d.ts.map +1 -0
  59. package/dist/subscriptions.js +188 -0
  60. package/dist/subscriptions.js.map +1 -0
  61. package/dist/tasks.d.ts +19 -0
  62. package/dist/tasks.d.ts.map +1 -0
  63. package/dist/tasks.js +334 -0
  64. package/dist/tasks.js.map +1 -0
  65. package/package.json +12 -7
@@ -0,0 +1,195 @@
1
+ import { CLIENT_CAPABILITIES_META_KEY, CLIENT_INFO_META_KEY, PROTOCOL_VERSION_META_KEY, ProtocolError, SdkError, SdkErrorCode, } from "@modelcontextprotocol/client";
2
+ const REQUEST_ID_PREFIX = "plurnk-extension:";
3
+ const asRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value)
4
+ ? value
5
+ : undefined;
6
+ const asError = (cause) => cause instanceof Error
7
+ ? cause
8
+ : new Error(String(cause));
9
+ export default class ExtensionChannel {
10
+ #transport;
11
+ #options;
12
+ #pending = new Map();
13
+ #taskHandlers = new Set();
14
+ #priorMessage;
15
+ #priorClose;
16
+ #messageHandler;
17
+ #closeHandler;
18
+ #nextId = 0;
19
+ #closed = false;
20
+ constructor(transport, options) {
21
+ this.#transport = transport;
22
+ this.#options = options;
23
+ this.#priorMessage = transport.onmessage;
24
+ this.#priorClose = transport.onclose;
25
+ this.#messageHandler = (message) => this.#receive(message);
26
+ this.#closeHandler = () => {
27
+ this.#rejectAll(new SdkError(SdkErrorCode.ConnectionClosed, "MCP extension channel closed."));
28
+ this.#priorClose?.();
29
+ };
30
+ transport.onmessage = this.#messageHandler;
31
+ transport.onclose = this.#closeHandler;
32
+ }
33
+ onTaskNotification(handler) {
34
+ if (this.#closed)
35
+ throw new Error("MCP extension channel is closed.");
36
+ this.#taskHandlers.add(handler);
37
+ return () => this.#taskHandlers.delete(handler);
38
+ }
39
+ async request(method, params, options) {
40
+ if (this.#closed)
41
+ throw new Error("MCP extension channel is closed.");
42
+ options.signal?.throwIfAborted();
43
+ const id = `${REQUEST_ID_PREFIX}${this.#nextId += 1}`;
44
+ const requestAbort = new AbortController();
45
+ const result = new Promise((resolve, reject) => {
46
+ const timer = setTimeout(() => {
47
+ this.#settle(id, new SdkError(SdkErrorCode.RequestTimeout, `MCP extension request '${method}' exceeded its ${options.timeout}ms timeout.`, { method, timeout: options.timeout }));
48
+ requestAbort.abort(new Error(`MCP extension request '${method}' timed out.`));
49
+ if (options.cancelRequestOnSharedTransport === true
50
+ && this.#transport.hasPerRequestStream !== true) {
51
+ void this.#cancelSharedRequest(id);
52
+ }
53
+ }, options.timeout);
54
+ timer.unref();
55
+ const onAbort = options.signal === undefined
56
+ ? undefined
57
+ : () => {
58
+ const reason = options.signal?.reason ?? new Error("MCP extension request aborted.");
59
+ this.#settle(id, reason);
60
+ requestAbort.abort(reason);
61
+ if (options.cancelRequestOnSharedTransport === true
62
+ && this.#transport.hasPerRequestStream !== true) {
63
+ void this.#cancelSharedRequest(id);
64
+ }
65
+ };
66
+ this.#pending.set(id, {
67
+ resolve,
68
+ reject,
69
+ requestAbort,
70
+ timer,
71
+ signal: options.signal,
72
+ onAbort,
73
+ onProgress: options.onProgress,
74
+ });
75
+ options.signal?.addEventListener("abort", onAbort, { once: true });
76
+ });
77
+ const message = {
78
+ jsonrpc: "2.0",
79
+ id,
80
+ method,
81
+ params: {
82
+ ...params,
83
+ _meta: {
84
+ [PROTOCOL_VERSION_META_KEY]: this.#options.protocolVersion,
85
+ [CLIENT_INFO_META_KEY]: this.#options.clientInfo,
86
+ [CLIENT_CAPABILITIES_META_KEY]: this.#options.clientCapabilities,
87
+ ...(options.onProgress === undefined ? {} : { progressToken: id }),
88
+ ...asRecord(params._meta),
89
+ },
90
+ },
91
+ };
92
+ void this.#transport.send(message, {
93
+ requestSignal: requestAbort.signal,
94
+ headers: options.headers,
95
+ onRequestStreamEnd: () => this.#settle(id, new SdkError(SdkErrorCode.ConnectionClosed, `MCP extension request '${method}' stream ended before its response.`)),
96
+ }).catch((cause) => this.#settle(id, cause));
97
+ return result;
98
+ }
99
+ async #cancelSharedRequest(id) {
100
+ try {
101
+ await this.#options.cancelRequest(id);
102
+ }
103
+ catch (cause) {
104
+ this.#options.onError?.(asError(cause));
105
+ }
106
+ }
107
+ #receive(message) {
108
+ const record = asRecord(message);
109
+ if (record === undefined) {
110
+ this.#priorMessage?.(message);
111
+ return;
112
+ }
113
+ const id = record.id;
114
+ if (typeof id === "string" && id.startsWith(REQUEST_ID_PREFIX)) {
115
+ const pending = this.#pending.get(id);
116
+ if (pending === undefined)
117
+ return;
118
+ if ("error" in record) {
119
+ const error = asRecord(record.error);
120
+ this.#settle(id, ProtocolError.fromError(typeof error?.code === "number" ? error.code : -32603, typeof error?.message === "string" ? error.message : "MCP extension request failed.", error?.data));
121
+ return;
122
+ }
123
+ if (!("result" in record)) {
124
+ this.#settle(id, new ProtocolError(-32600, "MCP extension response omitted its result."));
125
+ return;
126
+ }
127
+ this.#settle(id, undefined, record.result);
128
+ return;
129
+ }
130
+ if (record.method === "notifications/tasks") {
131
+ for (const handler of this.#taskHandlers) {
132
+ try {
133
+ handler(record.params);
134
+ }
135
+ catch (cause) {
136
+ this.#options.onError?.(asError(cause));
137
+ }
138
+ }
139
+ return;
140
+ }
141
+ if (record.method === "notifications/progress") {
142
+ const params = asRecord(record.params);
143
+ const token = params?.progressToken;
144
+ if (typeof token === "string" && token.startsWith(REQUEST_ID_PREFIX)) {
145
+ const pending = this.#pending.get(token);
146
+ if (pending === undefined)
147
+ return;
148
+ if (params !== undefined && typeof params.progress === "number") {
149
+ pending.onProgress?.({
150
+ progress: params.progress,
151
+ ...(typeof params.total === "number" ? { total: params.total } : {}),
152
+ ...(typeof params.message === "string" ? { message: params.message } : {}),
153
+ });
154
+ }
155
+ else {
156
+ this.#options.onError?.(new Error("MCP extension progress omitted numeric progress."));
157
+ }
158
+ return;
159
+ }
160
+ }
161
+ this.#priorMessage?.(message);
162
+ }
163
+ #settle(id, error, value) {
164
+ const pending = this.#pending.get(id);
165
+ if (pending === undefined)
166
+ return;
167
+ this.#pending.delete(id);
168
+ clearTimeout(pending.timer);
169
+ if (pending.onAbort !== undefined) {
170
+ pending.signal?.removeEventListener("abort", pending.onAbort);
171
+ }
172
+ if (error === undefined)
173
+ pending.resolve(value);
174
+ else
175
+ pending.reject(error);
176
+ }
177
+ #rejectAll(error) {
178
+ for (const id of [...this.#pending.keys()])
179
+ this.#settle(id, error);
180
+ }
181
+ close() {
182
+ if (this.#closed)
183
+ return;
184
+ this.#closed = true;
185
+ this.#taskHandlers.clear();
186
+ this.#rejectAll(new SdkError(SdkErrorCode.ConnectionClosed, "MCP extension channel closed."));
187
+ if (this.#transport.onmessage === this.#messageHandler) {
188
+ this.#transport.onmessage = this.#priorMessage;
189
+ }
190
+ if (this.#transport.onclose === this.#closeHandler) {
191
+ this.#transport.onclose = this.#priorClose;
192
+ }
193
+ }
194
+ }
195
+ //# sourceMappingURL=extensionChannel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensionChannel.js","sourceRoot":"","sources":["../src/extensionChannel.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export { default as Module } from "./Module.ts";
2
2
  export { default } from "./Module.ts";
3
- export { MCP_PROTOCOL_VERSION } from "./client.ts";
4
- export { connectTimeoutMs, requestTimeoutMs, serverConfig, serverNames, } from "./config.ts";
5
- export type { HttpServerConfig, ServerConfig, StdioServerConfig, } from "./config.ts";
3
+ export { MCP_CLIENT_VERSION, MCP_CONFORMANCE_VERSION, MCP_PROTOCOL_VERSION, MCP_SPECIFICATION_COMMIT, MCP_TASKS_EXTENSION_ID, MCP_TASKS_SPECIFICATION_COMMIT, } from "./protocol.ts";
4
+ export { connectTimeoutMs, expandReferences, requestTimeoutMs, serverDefinition, serverNames, serviceDefinitions, serviceEnabledNames, } from "./config.ts";
5
+ export type { ToolPolicy } from "./config.ts";
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,WAAW,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EACR,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,GACpB,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EACH,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,8BAA8B,GACjC,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,GACtB,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  export { default as Module } from "./Module.js";
2
2
  export { default } from "./Module.js";
3
- export { MCP_PROTOCOL_VERSION } from "./client.js";
4
- export { connectTimeoutMs, requestTimeoutMs, serverConfig, serverNames, } from "./config.js";
3
+ export { MCP_CLIENT_VERSION, MCP_CONFORMANCE_VERSION, MCP_PROTOCOL_VERSION, MCP_SPECIFICATION_COMMIT, MCP_TASKS_EXTENSION_ID, MCP_TASKS_SPECIFICATION_COMMIT, } from "./protocol.js";
4
+ export { connectTimeoutMs, expandReferences, requestTimeoutMs, serverDefinition, serverNames, serviceDefinitions, serviceEnabledNames, } from "./config.js";
5
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,WAAW,GACd,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EACH,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACtB,8BAA8B,GACjC,MAAM,eAAe,CAAC;AACvB,OAAO,EACH,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,GACtB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,36 @@
1
+ import { type CallToolRequest, type CallToolResult, type GetPromptRequest, type GetPromptResult, type InputRequiredResult, type InputResponse, type Progress, type ReadResourceRequest, type ReadResourceResult } from "@modelcontextprotocol/client";
2
+ import type { ClientInteractionRequest, ClientInteractionResolution } from "@plurnk/plurnk-contracts";
3
+ export type ClientInteractionHandler = (request: ClientInteractionRequest) => Promise<ClientInteractionResolution>;
4
+ type InputRequiredMethod = "tools/call" | "resources/read" | "prompts/get" | "tasks/update";
5
+ type CoreInputRequiredParams = CallToolRequest["params"] | ReadResourceRequest["params"] | GetPromptRequest["params"];
6
+ type InputRequiredCompleteResult = CallToolResult | ReadResourceResult | GetPromptResult;
7
+ interface InputRequiredLegOptions {
8
+ readonly signal?: AbortSignal;
9
+ readonly timeout: number;
10
+ readonly maxTotalTimeout: number;
11
+ readonly allowInputRequired: true;
12
+ readonly onprogress?: (progress: Progress) => void;
13
+ }
14
+ type InputRequiredLeg<T, P extends object> = (params: P, options: InputRequiredLegOptions, retry: boolean) => Promise<T | InputRequiredResult>;
15
+ interface InputRequiredRequestOptions<T, P extends object> {
16
+ readonly server: string;
17
+ readonly operation: InputRequiredMethod;
18
+ readonly originalParams: P;
19
+ readonly signal?: AbortSignal;
20
+ readonly onProgress?: (progress: Progress) => void;
21
+ readonly interact?: ClientInteractionHandler;
22
+ readonly timeout: number;
23
+ readonly requestLeg: InputRequiredLeg<T, P>;
24
+ }
25
+ interface ResolveInputRequestsOptions {
26
+ readonly server: string;
27
+ readonly operation: InputRequiredMethod;
28
+ readonly inputRequests: Readonly<Record<string, unknown>>;
29
+ readonly interact?: ClientInteractionHandler;
30
+ readonly arguments?: Readonly<Record<string, unknown>>;
31
+ }
32
+ export declare const INPUT_REQUIRED_MAX_ROUNDS = 10;
33
+ export declare const resolveInputRequests: ({ server, operation, inputRequests, interact, arguments: args, }: ResolveInputRequestsOptions) => Promise<Record<string, InputResponse>>;
34
+ export declare const runInputRequiredRequest: <T = InputRequiredCompleteResult, P extends object = CoreInputRequiredParams>({ server, operation, originalParams, signal, onProgress, interact, timeout, requestLeg, }: InputRequiredRequestOptions<T, P>) => Promise<T>;
35
+ export {};
36
+ //# sourceMappingURL=inputRequired.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputRequired.d.ts","sourceRoot":"","sources":["../src/inputRequired.ts"],"names":[],"mappings":"AAAA,OAAO,EAMH,KAAK,eAAe,EACpB,KAAK,cAAc,EAGnB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAElB,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACR,wBAAwB,EACxB,2BAA2B,EAC9B,MAAM,0BAA0B,CAAC;AAGlC,MAAM,MAAM,wBAAwB,GAAG,CACnC,OAAO,EAAE,wBAAwB,KAChC,OAAO,CAAC,2BAA2B,CAAC,CAAC;AAE1C,KAAK,mBAAmB,GAAG,YAAY,GAAG,gBAAgB,GAAG,aAAa,GAAG,cAAc,CAAC;AAC5F,KAAK,uBAAuB,GAAG,eAAe,CAAC,QAAQ,CAAC,GAClD,mBAAmB,CAAC,QAAQ,CAAC,GAC7B,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AACjC,KAAK,2BAA2B,GAAG,cAAc,GAAG,kBAAkB,GAAG,eAAe,CAAC;AAEzF,UAAU,uBAAuB;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,CAAC;IAClC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;CACtD;AAED,KAAK,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CACzC,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,uBAAuB,EAChC,KAAK,EAAE,OAAO,KACb,OAAO,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC;AAEtC,UAAU,2BAA2B,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;IAC3B,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,UAAU,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CAC/C;AAED,UAAU,2BAA2B;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,mBAAmB,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,QAAQ,CAAC,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1D;AAED,eAAO,MAAM,yBAAyB,KAAK,CAAC;AA8F5C,eAAO,MAAM,oBAAoB,qEAM9B,2BAA2B,KAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAUrE,CAAC;AAyCF,eAAO,MAAM,uBAAuB,GAChC,CAAC,GAAG,2BAA2B,EAC/B,CAAC,SAAS,MAAM,GAAG,uBAAuB,6FAU3C,2BAA2B,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAyE/C,CAAC"}
@@ -0,0 +1,171 @@
1
+ import { fromJsonSchema, isInputRequiredResult, SdkError, SdkErrorCode, specTypeSchemas, } from "@modelcontextprotocol/client";
2
+ import { setTimeout as delay } from "node:timers/promises";
3
+ export const INPUT_REQUIRED_MAX_ROUNDS = 10;
4
+ const REQUEST_STATE_ONLY_PACING_MS = 250;
5
+ const INPUT_REQUIRED_TOOL = "mcp_input_required";
6
+ const formatValidationIssues = (issues) => issues.map((issue) => issue.path?.length
7
+ ? `${issue.path.map(String).join(".")}: ${issue.message}`
8
+ : issue.message).join(", ");
9
+ const elicitationResponseSchema = (request) => {
10
+ const params = request.params;
11
+ if (params.mode === "url") {
12
+ return {
13
+ type: "object",
14
+ required: ["action"],
15
+ additionalProperties: false,
16
+ properties: {
17
+ action: { enum: ["accept", "decline", "cancel"] },
18
+ },
19
+ };
20
+ }
21
+ return {
22
+ oneOf: [
23
+ {
24
+ type: "object",
25
+ required: ["action", "content"],
26
+ additionalProperties: false,
27
+ properties: {
28
+ action: { const: "accept" },
29
+ content: params.requestedSchema,
30
+ },
31
+ },
32
+ {
33
+ type: "object",
34
+ required: ["action"],
35
+ additionalProperties: false,
36
+ properties: {
37
+ action: { enum: ["decline", "cancel"] },
38
+ },
39
+ },
40
+ ],
41
+ };
42
+ };
43
+ const supportedElicitations = (server, operation, inputRequests) => Object.entries(inputRequests).map(([key, candidate]) => {
44
+ const request = candidate;
45
+ if (request.method !== "elicitation/create") {
46
+ throw new Error(`MCP server '${server}' requested unsupported embedded input method '${String(request.method)}' during '${operation}'; Plurnk advertises only elicitation form and URL modes.`);
47
+ }
48
+ const parsed = specTypeSchemas.ElicitRequest["~standard"].validate(candidate);
49
+ if (parsed.issues !== undefined) {
50
+ throw new Error(`MCP server '${server}' supplied invalid elicitation '${key}' during '${operation}': ${formatValidationIssues(parsed.issues)}.`);
51
+ }
52
+ return [key, parsed.value];
53
+ });
54
+ const interactionRequest = (server, operation, entries, args = {}) => {
55
+ const properties = Object.fromEntries(entries.map(([key, request]) => [
56
+ key,
57
+ elicitationResponseSchema(request),
58
+ ]));
59
+ return {
60
+ toolName: INPUT_REQUIRED_TOOL,
61
+ arguments: {
62
+ server,
63
+ operation,
64
+ ...args,
65
+ requests: Object.fromEntries(entries),
66
+ },
67
+ message: entries.length === 1
68
+ ? entries[0][1].params.message
69
+ : `MCP server '${server}' requires ${entries.length} responses to continue '${operation}'.`,
70
+ responseSchema: {
71
+ type: "object",
72
+ required: entries.map(([key]) => key),
73
+ additionalProperties: false,
74
+ properties,
75
+ },
76
+ };
77
+ };
78
+ export const resolveInputRequests = async ({ server, operation, inputRequests, interact, arguments: args, }) => {
79
+ const entries = supportedElicitations(server, operation, inputRequests);
80
+ if (entries.length === 0)
81
+ return {};
82
+ if (interact === undefined) {
83
+ throw new Error(`MCP server '${server}' requires client input during '${operation}', but this operation has no client interaction owner.`);
84
+ }
85
+ const request = interactionRequest(server, operation, entries, args);
86
+ return resolvedInputResponses(request, await interact(request));
87
+ };
88
+ const cancelledInputResponses = (entries) => Object.fromEntries(entries.map(([key]) => [
89
+ key,
90
+ { action: "cancel" },
91
+ ]));
92
+ const resolvedInputResponses = async (request, resolution) => {
93
+ if (resolution.status === "cancelled") {
94
+ const entries = Object.entries(request.arguments.requests);
95
+ return cancelledInputResponses(entries);
96
+ }
97
+ const validator = fromJsonSchema(request.responseSchema);
98
+ const validation = await validator["~standard"].validate(resolution.payload);
99
+ if (validation.issues !== undefined) {
100
+ throw new Error(`MCP client interaction response is invalid: ${formatValidationIssues(validation.issues)}.`);
101
+ }
102
+ const responses = {};
103
+ for (const [key, value] of Object.entries(validation.value)) {
104
+ const parsed = specTypeSchemas.ElicitResult["~standard"].validate(value);
105
+ if (parsed.issues !== undefined) {
106
+ throw new Error(`MCP client interaction response '${key}' is invalid: ${formatValidationIssues(parsed.issues)}.`);
107
+ }
108
+ responses[key] = parsed.value;
109
+ }
110
+ return responses;
111
+ };
112
+ export const runInputRequiredRequest = async ({ server, operation, originalParams, signal, onProgress, interact, timeout, requestLeg, }) => {
113
+ const startedAt = Date.now();
114
+ const options = {
115
+ signal,
116
+ timeout,
117
+ maxTotalTimeout: timeout,
118
+ allowInputRequired: true,
119
+ ...(onProgress === undefined ? {} : { onprogress: onProgress }),
120
+ };
121
+ let result = await requestLeg(originalParams, options, false);
122
+ let round = 0;
123
+ while (isInputRequiredResult(result)) {
124
+ round += 1;
125
+ if (round > INPUT_REQUIRED_MAX_ROUNDS) {
126
+ throw new SdkError(SdkErrorCode.InputRequiredRoundsExceeded, `Multi-round-trip request '${operation}' still required input after ${INPUT_REQUIRED_MAX_ROUNDS} rounds.`, {
127
+ rounds: INPUT_REQUIRED_MAX_ROUNDS,
128
+ lastResult: result,
129
+ });
130
+ }
131
+ onProgress?.({
132
+ progress: round,
133
+ message: `Fulfilling input required by '${operation}' (round ${round})`,
134
+ });
135
+ let inputResponses;
136
+ const inputRequests = result.inputRequests ?? {};
137
+ if (Object.keys(inputRequests).length === 0) {
138
+ await delay(REQUEST_STATE_ONLY_PACING_MS, undefined, signal === undefined ? {} : { signal });
139
+ }
140
+ else {
141
+ inputResponses = await resolveInputRequests({
142
+ server,
143
+ operation,
144
+ inputRequests,
145
+ interact,
146
+ });
147
+ signal?.throwIfAborted();
148
+ }
149
+ const elapsed = Date.now() - startedAt;
150
+ const remaining = timeout - elapsed;
151
+ if (remaining <= 0) {
152
+ throw new SdkError(SdkErrorCode.RequestTimeout, `MCP '${operation}' exceeded its ${timeout}ms operation timeout.`, { maxTotalTimeout: timeout, totalElapsed: elapsed });
153
+ }
154
+ const retryParams = {
155
+ ...originalParams,
156
+ ...(inputResponses === undefined || Object.keys(inputResponses).length === 0
157
+ ? {}
158
+ : { inputResponses }),
159
+ ...(result.requestState === undefined
160
+ ? {}
161
+ : { requestState: result.requestState }),
162
+ };
163
+ result = await requestLeg(retryParams, {
164
+ ...options,
165
+ timeout: Math.min(timeout, remaining),
166
+ maxTotalTimeout: remaining,
167
+ }, true);
168
+ }
169
+ return result;
170
+ };
171
+ //# sourceMappingURL=inputRequired.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputRequired.js","sourceRoot":"","sources":["../src/inputRequired.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env node
2
+ // {§mcp-stdio-process-ownership} — the parent-death watchdog wrapper.
3
+ // plurnk-mcp spawns stdio servers through this wrapper so no server (or its
4
+ // grandchildren, e.g. chromium) can outlive the daemon:
5
+ //
6
+ // - the real server is spawned DETACHED (its own process group), so the
7
+ // wrapper can group-kill the whole tree, grandchildren included;
8
+ // - ordinary transport closure forwards EOF and gives the server a bounded
9
+ // graceful exit; parent death or an expired grace group-SIGKILLs the tree;
10
+ // - a ppid poll covers SIGKILL of the daemon, where close() never runs;
11
+ // - stdio is forwarded verbatim, so the MCP protocol is untouched.
12
+ //
13
+ // Usage (internal): mcp-watchdog.mjs <ppid> -- <command> [args...]
14
+ // The wrapper is a process-lifecycle tool, not a protocol participant.
15
+ import { spawn } from "node:child_process";
16
+
17
+ const args = process.argv.slice(2);
18
+ const sep = args.indexOf("--");
19
+ if (sep < 1) {
20
+ process.stderr.write("mcp-watchdog: usage: mcp-watchdog.mjs <ppid> -- <command> [args...]\n");
21
+ process.exit(64);
22
+ }
23
+ const parentPid = Number(args[0]);
24
+ const command = args[sep + 1];
25
+ const rest = args.slice(sep + 2);
26
+ if (!Number.isSafeInteger(parentPid) || parentPid <= 1 || typeof command !== "string" || command.length === 0) {
27
+ process.stderr.write("mcp-watchdog: invalid invocation\n");
28
+ process.exit(64);
29
+ }
30
+
31
+ const SHUTDOWN_GRACE_MS = 2_000;
32
+
33
+ const child = spawn(command, rest, {
34
+ stdio: ["pipe", "pipe", "inherit"],
35
+ env: process.env,
36
+ detached: true, // own process group: kill(-pid) reaches grandchildren
37
+ });
38
+ const killChildGroup = () => {
39
+ if (child.pid === undefined) return;
40
+ try { process.kill(-child.pid, "SIGKILL"); } catch { /* already gone */ }
41
+ };
42
+ let state = "running";
43
+ let grace;
44
+ const die = (reason, code = 0) => {
45
+ if (state === "exited") return;
46
+ state = "exited";
47
+ clearTimeout(grace);
48
+ killChildGroup();
49
+ process.stderr.write(`mcp-watchdog: exiting (${reason})\n`);
50
+ process.exit(code);
51
+ };
52
+
53
+ const alive = () => {
54
+ try { process.kill(parentPid, 0); return true; } catch { return false; }
55
+ };
56
+ const closeInput = () => {
57
+ if (state !== "running") return;
58
+ if (!alive()) {
59
+ die("parent gone");
60
+ return;
61
+ }
62
+ state = "closing";
63
+ child.stdin.end();
64
+ grace = setTimeout(() => die("graceful shutdown deadline"), SHUTDOWN_GRACE_MS);
65
+ };
66
+
67
+ // The daemon owns our stdin. Ordinary transport shutdown closes it while the
68
+ // daemon remains alive; parent death closes it after the owner disappears.
69
+ process.stdin.on("end", closeInput);
70
+ process.stdin.on("close", closeInput);
71
+ process.stdin.resume();
72
+
73
+ // Parent-death signal 2: poll the ppid. Covers a reparented-but-open-fd edge
74
+ // (e.g. a grandchild accidentally inheriting our stdin) at 2s granularity.
75
+ const poll = setInterval(() => {
76
+ if (!alive()) die("parent gone");
77
+ }, 2_000);
78
+ poll.unref();
79
+
80
+ // Forward the protocol verbatim.
81
+ process.stdin.on("data", (chunk) => {
82
+ if (state === "running") child.stdin.write(chunk);
83
+ });
84
+ child.stdout.on("data", (chunk) => process.stdout.write(chunk));
85
+ child.stdout.on("end", () => { if (state !== "exited") process.stdout.end(); });
86
+ child.stdin.on("error", (error) => {
87
+ if (state === "closing" && error.code === "EPIPE") return;
88
+ die(`server stdin failed: ${error.message}`, 66);
89
+ });
90
+
91
+ child.on("exit", (code, signal) => {
92
+ clearInterval(poll);
93
+ if (state === "exited") return;
94
+ state = "exited";
95
+ clearTimeout(grace);
96
+ // A server that exits does not get to strand descendants in its group.
97
+ killChildGroup();
98
+ process.exit(code ?? (signal === null ? 0 : 1));
99
+ });
100
+ child.on("error", (error) => {
101
+ die(`spawn failed: ${error.message}`, 66);
102
+ });
103
+
104
+ for (const signal of ["SIGINT", "SIGHUP", "SIGTERM"]) {
105
+ process.on(signal, () => die(`received ${signal}`, 128));
106
+ }
@@ -0,0 +1,28 @@
1
+ import type { OAuthClientInformationContext, OAuthClientMetadata, OAuthClientProvider, OAuthDiscoveryState, StoredOAuthClientInformation, StoredOAuthTokens } from "@modelcontextprotocol/client";
2
+ export default class InteractiveOAuthProvider implements OAuthClientProvider {
3
+ #private;
4
+ readonly redirectUrl: string;
5
+ readonly clientMetadataUrl: string | undefined;
6
+ constructor({ redirectUrl, clientMetadataUrl, clientId, clientSecret, scope, }: {
7
+ redirectUrl: string;
8
+ clientMetadataUrl?: string;
9
+ clientId?: string;
10
+ clientSecret?: string;
11
+ scope?: string;
12
+ });
13
+ get clientMetadata(): OAuthClientMetadata;
14
+ state(): string;
15
+ clientInformation(context?: OAuthClientInformationContext): StoredOAuthClientInformation | undefined;
16
+ saveClientInformation(clientInformation: StoredOAuthClientInformation, context?: OAuthClientInformationContext): void;
17
+ tokens(context?: OAuthClientInformationContext): StoredOAuthTokens | undefined;
18
+ saveTokens(tokens: StoredOAuthTokens, context?: OAuthClientInformationContext): void;
19
+ redirectToAuthorization(authorizationUrl: URL): void;
20
+ takeAuthorizationUrl(): URL | undefined;
21
+ assertCallbackState(callback: URL): void;
22
+ saveCodeVerifier(codeVerifier: string): void;
23
+ codeVerifier(): string;
24
+ saveDiscoveryState(state: OAuthDiscoveryState): void;
25
+ discoveryState(): OAuthDiscoveryState | undefined;
26
+ invalidateCredentials(scope: "all" | "client" | "tokens" | "verifier" | "discovery"): void;
27
+ }
28
+ //# sourceMappingURL=oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,6BAA6B,EAC7B,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,4BAA4B,EAC5B,iBAAiB,EACpB,MAAM,8BAA8B,CAAC;AAGtC,MAAM,CAAC,OAAO,OAAO,wBAAyB,YAAW,mBAAmB;;IACxE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IAe/C,YAAY,EACR,WAAW,EACX,iBAAiB,EACjB,QAAQ,EACR,YAAY,EACZ,KAAK,GACR,EAAE;QACC,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,EAOA;IAED,IAAI,cAAc,IAAI,mBAAmB,CASxC;IAED,KAAK,IAAI,MAAM,CAGd;IAED,iBAAiB,CACb,OAAO,CAAC,EAAE,6BAA6B,GACxC,4BAA4B,GAAG,SAAS,CA0B1C;IAED,qBAAqB,CACjB,iBAAiB,EAAE,4BAA4B,EAC/C,OAAO,CAAC,EAAE,6BAA6B,GACxC,IAAI,CAON;IAED,MAAM,CAAC,OAAO,CAAC,EAAE,6BAA6B,GAAG,iBAAiB,GAAG,SAAS,CAO7E;IAED,UAAU,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,6BAA6B,GAAG,IAAI,CAWnF;IAED,uBAAuB,CAAC,gBAAgB,EAAE,GAAG,GAAG,IAAI,CAGnD;IAED,oBAAoB,IAAI,GAAG,GAAG,SAAS,CAItC;IAED,mBAAmB,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI,CAIvC;IAED,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAE3C;IAED,YAAY,IAAI,MAAM,CAKrB;IAED,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,CAQnD;IAED,cAAc,IAAI,mBAAmB,GAAG,SAAS,CAMhD;IAED,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,IAAI,CAczF;CACJ"}