@clipform/mcp-server 4.2.0 → 4.2.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/dist/api-client.js +1 -1
- package/dist/{chunk-YKJV5LZQ.js → chunk-BKTCQ5HS.js} +76 -26
- package/dist/{chunk-YKJV5LZQ.js.map → chunk-BKTCQ5HS.js.map} +1 -1
- package/dist/{chunk-4IAURGG7.js → chunk-GZZGKW5A.js} +15 -1
- package/dist/chunk-GZZGKW5A.js.map +1 -0
- package/dist/{chunk-PDI6VJYQ.js → chunk-O4LOUBGW.js} +2 -2
- package/dist/{chunk-5RUWQOYD.js → chunk-QG354AVT.js} +3 -3
- package/dist/{chunk-TXUWAYBZ.js → chunk-RKMGVU57.js} +3 -3
- package/dist/index.js +5 -5
- package/dist/prompts.js +3 -3
- package/dist/resources.js +3 -3
- package/dist/server.js +5 -5
- package/package.json +3 -3
- package/server.json +2 -2
- package/dist/chunk-4IAURGG7.js.map +0 -1
- /package/dist/{chunk-PDI6VJYQ.js.map → chunk-O4LOUBGW.js.map} +0 -0
- /package/dist/{chunk-5RUWQOYD.js.map → chunk-QG354AVT.js.map} +0 -0
- /package/dist/{chunk-TXUWAYBZ.js.map → chunk-RKMGVU57.js.map} +0 -0
package/dist/api-client.js
CHANGED
|
@@ -29,7 +29,7 @@ import {
|
|
|
29
29
|
union,
|
|
30
30
|
unknown,
|
|
31
31
|
url
|
|
32
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-QG354AVT.js";
|
|
33
33
|
import {
|
|
34
34
|
GUIDE_TYPES,
|
|
35
35
|
QUIZ_VARIANTS,
|
|
@@ -38,13 +38,13 @@ import {
|
|
|
38
38
|
getGuideUri,
|
|
39
39
|
guideFallbackText,
|
|
40
40
|
registerResources
|
|
41
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-RKMGVU57.js";
|
|
42
42
|
import {
|
|
43
43
|
ANON_PREVIEW_NOTICE,
|
|
44
44
|
FULL_CAPS,
|
|
45
45
|
anonPreviewNotice,
|
|
46
46
|
capsFromToolsets
|
|
47
|
-
} from "./chunk-
|
|
47
|
+
} from "./chunk-O4LOUBGW.js";
|
|
48
48
|
import {
|
|
49
49
|
ACTIVE_NODE_TYPES,
|
|
50
50
|
CONTACT_FIELDS,
|
|
@@ -66,7 +66,7 @@ import {
|
|
|
66
66
|
resolveFormType,
|
|
67
67
|
structuredResult,
|
|
68
68
|
textResult
|
|
69
|
-
} from "./chunk-
|
|
69
|
+
} from "./chunk-GZZGKW5A.js";
|
|
70
70
|
import {
|
|
71
71
|
getMcpAuth,
|
|
72
72
|
runWithMcpAuth,
|
|
@@ -4774,6 +4774,37 @@ var inputRequired = Object.assign(buildInputRequired, {
|
|
|
4774
4774
|
return { method: "roots/list" };
|
|
4775
4775
|
}
|
|
4776
4776
|
});
|
|
4777
|
+
function acceptedContent(responses, key, schema) {
|
|
4778
|
+
const view = inputResponse(responses, key);
|
|
4779
|
+
if (view.kind !== "elicit" || view.action !== "accept" || view.content === void 0) return void 0;
|
|
4780
|
+
if (schema === void 0) return view.content;
|
|
4781
|
+
const outcome = schema["~standard"].validate(view.content);
|
|
4782
|
+
if (outcome instanceof Promise) throw new TypeError("acceptedContent(responses, key, schema) requires a synchronously-validating schema");
|
|
4783
|
+
return outcome.issues === void 0 ? outcome.value : void 0;
|
|
4784
|
+
}
|
|
4785
|
+
function inputResponse(responses, key) {
|
|
4786
|
+
if (responses === void 0 || typeof responses !== "object" || responses === null) return { kind: "missing" };
|
|
4787
|
+
const entry = responses[key];
|
|
4788
|
+
if (entry === null || typeof entry !== "object" || Array.isArray(entry)) return { kind: "missing" };
|
|
4789
|
+
const candidate = entry;
|
|
4790
|
+
if (candidate["action"] === "accept" || candidate["action"] === "decline" || candidate["action"] === "cancel") {
|
|
4791
|
+
const content = candidate["content"];
|
|
4792
|
+
return {
|
|
4793
|
+
kind: "elicit",
|
|
4794
|
+
action: candidate["action"],
|
|
4795
|
+
...content !== null && typeof content === "object" && !Array.isArray(content) && { content }
|
|
4796
|
+
};
|
|
4797
|
+
}
|
|
4798
|
+
if (Array.isArray(candidate["roots"])) return {
|
|
4799
|
+
kind: "roots",
|
|
4800
|
+
roots: candidate["roots"]
|
|
4801
|
+
};
|
|
4802
|
+
if (typeof candidate["role"] === "string" && candidate["content"] !== void 0) return {
|
|
4803
|
+
kind: "sampling",
|
|
4804
|
+
result: candidate
|
|
4805
|
+
};
|
|
4806
|
+
return { kind: "missing" };
|
|
4807
|
+
}
|
|
4777
4808
|
var REQUEST_STATE_ONLY_LEG_PACING_MS = 250;
|
|
4778
4809
|
function inputRequiredRoundsExceededMessage(method, maxRounds) {
|
|
4779
4810
|
return `Multi-round-trip request '${method}' still required input after ${maxRounds} rounds (inputRequired.maxRounds)`;
|
|
@@ -17179,23 +17210,42 @@ ${anonNotice}`;
|
|
|
17179
17210
|
|
|
17180
17211
|
// src/lib/confirm.ts
|
|
17181
17212
|
var CONFIRM_FIELD_DESCRIPTION = "Set to true ONLY after the user has explicitly confirmed this destructive action. Leave unset otherwise - hosts that support confirmation dialogs will prompt the user automatically.";
|
|
17182
|
-
|
|
17213
|
+
var CONFIRM_RESPONSE_SCHEMA = external_exports.object({ confirm: external_exports.boolean() });
|
|
17214
|
+
var CANCELLED = "Cancelled - nothing was changed.";
|
|
17215
|
+
async function confirmDestructive(server, ctx, opts) {
|
|
17183
17216
|
if (opts.alreadyConfirmed === true) return { proceed: true };
|
|
17217
|
+
const mcpReq = ctx?.mcpReq;
|
|
17218
|
+
const responses = mcpReq?.inputResponses;
|
|
17219
|
+
if (responses && responses.confirm !== void 0) {
|
|
17220
|
+
const answer = acceptedContent(responses, "confirm", CONFIRM_RESPONSE_SCHEMA);
|
|
17221
|
+
if (answer?.confirm === true) return { proceed: true };
|
|
17222
|
+
return { proceed: false, message: CANCELLED };
|
|
17223
|
+
}
|
|
17224
|
+
const requestedSchema = {
|
|
17225
|
+
type: "object",
|
|
17226
|
+
properties: {
|
|
17227
|
+
confirm: { type: "boolean", title: "Confirm", description: opts.message }
|
|
17228
|
+
},
|
|
17229
|
+
required: ["confirm"]
|
|
17230
|
+
};
|
|
17231
|
+
const envelope = mcpReq?.envelope;
|
|
17232
|
+
if (envelope) {
|
|
17233
|
+
if (envelope["io.modelcontextprotocol/clientCapabilities"]?.elicitation) {
|
|
17234
|
+
return {
|
|
17235
|
+
proceed: false,
|
|
17236
|
+
result: inputRequired({
|
|
17237
|
+
inputRequests: { confirm: inputRequired.elicit({ message: opts.message, requestedSchema }) }
|
|
17238
|
+
})
|
|
17239
|
+
};
|
|
17240
|
+
}
|
|
17241
|
+
return { proceed: false, message: opts.relay };
|
|
17242
|
+
}
|
|
17184
17243
|
const lowLevel = server.server;
|
|
17185
17244
|
const caps = lowLevel?.getClientCapabilities?.();
|
|
17186
17245
|
if (caps?.elicitation) {
|
|
17187
|
-
const r = await lowLevel.elicitInput({
|
|
17188
|
-
message: opts.message,
|
|
17189
|
-
requestedSchema: {
|
|
17190
|
-
type: "object",
|
|
17191
|
-
properties: {
|
|
17192
|
-
confirm: { type: "boolean", title: "Confirm", description: opts.message }
|
|
17193
|
-
},
|
|
17194
|
-
required: ["confirm"]
|
|
17195
|
-
}
|
|
17196
|
-
});
|
|
17246
|
+
const r = await lowLevel.elicitInput({ message: opts.message, requestedSchema });
|
|
17197
17247
|
if (r.action === "accept" && r.content?.confirm === true) return { proceed: true };
|
|
17198
|
-
return { proceed: false, message:
|
|
17248
|
+
return { proceed: false, message: CANCELLED };
|
|
17199
17249
|
}
|
|
17200
17250
|
return { proceed: false, message: opts.relay };
|
|
17201
17251
|
}
|
|
@@ -17223,14 +17273,14 @@ function registerDeleteFormTool(server) {
|
|
|
17223
17273
|
openWorldHint: true
|
|
17224
17274
|
}
|
|
17225
17275
|
},
|
|
17226
|
-
async ({ form_id, confirm }) => {
|
|
17227
|
-
const decision = await confirmDestructive(server, {
|
|
17276
|
+
async ({ form_id, confirm }, ctx) => {
|
|
17277
|
+
const decision = await confirmDestructive(server, ctx, {
|
|
17228
17278
|
alreadyConfirmed: confirm,
|
|
17229
17279
|
message: `Move form ${form_id} to the trash? It stops accepting responses immediately and can be restored later.`,
|
|
17230
17280
|
relay: `Confirmation required: moving form ${form_id} to the trash stops it accepting responses immediately. It can be restored later. Ask the user to confirm, then call clipform_delete_form again with confirm: true.`
|
|
17231
17281
|
});
|
|
17232
17282
|
if (!decision.proceed) {
|
|
17233
|
-
return textResult(decision.message);
|
|
17283
|
+
return decision.result ?? textResult(decision.message);
|
|
17234
17284
|
}
|
|
17235
17285
|
const result = await callApi(`/forms/${form_id}`, {
|
|
17236
17286
|
method: "DELETE"
|
|
@@ -17797,14 +17847,14 @@ function registerDeleteNodeTool(server) {
|
|
|
17797
17847
|
openWorldHint: false
|
|
17798
17848
|
}
|
|
17799
17849
|
},
|
|
17800
|
-
async ({ form_id, node_id, confirm }) => {
|
|
17801
|
-
const decision = await confirmDestructive(server, {
|
|
17850
|
+
async ({ form_id, node_id, confirm }, ctx) => {
|
|
17851
|
+
const decision = await confirmDestructive(server, ctx, {
|
|
17802
17852
|
alreadyConfirmed: confirm,
|
|
17803
17853
|
message: `Delete node ${node_id} from this form? This cannot be undone.`,
|
|
17804
17854
|
relay: `Confirmation required: deleting node ${node_id} cannot be undone. Ask the user to confirm, then call clipform_delete_node again with confirm: true.`
|
|
17805
17855
|
});
|
|
17806
17856
|
if (!decision.proceed) {
|
|
17807
|
-
return textResult(decision.message);
|
|
17857
|
+
return decision.result ?? textResult(decision.message);
|
|
17808
17858
|
}
|
|
17809
17859
|
const result = await callApi(
|
|
17810
17860
|
`/forms/${form_id}/nodes/${node_id}`,
|
|
@@ -18290,14 +18340,14 @@ function registerDeleteNodeMediaTool(server) {
|
|
|
18290
18340
|
openWorldHint: true
|
|
18291
18341
|
}
|
|
18292
18342
|
},
|
|
18293
|
-
async ({ form_id, node_id, confirm }) => {
|
|
18294
|
-
const decision = await confirmDestructive(server, {
|
|
18343
|
+
async ({ form_id, node_id, confirm }, ctx) => {
|
|
18344
|
+
const decision = await confirmDestructive(server, ctx, {
|
|
18295
18345
|
alreadyConfirmed: confirm,
|
|
18296
18346
|
message: `Remove the media attached to node ${node_id}? This deletes the underlying video/file and cannot be undone.`,
|
|
18297
18347
|
relay: `Confirmation required: removing media from node ${node_id} deletes the underlying video/file and cannot be undone. Ask the user to confirm, then call clipform_delete_node_media again with confirm: true.`
|
|
18298
18348
|
});
|
|
18299
18349
|
if (!decision.proceed) {
|
|
18300
|
-
return textResult(decision.message);
|
|
18350
|
+
return decision.result ?? textResult(decision.message);
|
|
18301
18351
|
}
|
|
18302
18352
|
const result = await callApi(
|
|
18303
18353
|
`/forms/${form_id}/nodes/${node_id}/media`,
|
|
@@ -20097,4 +20147,4 @@ export {
|
|
|
20097
20147
|
* MIT Licensed
|
|
20098
20148
|
*)
|
|
20099
20149
|
*/
|
|
20100
|
-
//# sourceMappingURL=chunk-
|
|
20150
|
+
//# sourceMappingURL=chunk-BKTCQ5HS.js.map
|