@superblocksteam/sdk-api 2.0.170 → 2.0.171-next.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 (49) hide show
  1. package/README.md +1 -0
  2. package/dist/index.d.ts +3 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +2 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/integrations/base/request-body.d.ts +1 -0
  7. package/dist/integrations/base/request-body.d.ts.map +1 -1
  8. package/dist/integrations/base/request-body.js +4 -4
  9. package/dist/integrations/base/request-body.js.map +1 -1
  10. package/dist/integrations/declarations.d.ts +10 -0
  11. package/dist/integrations/declarations.d.ts.map +1 -1
  12. package/dist/integrations/declarations.js +9 -0
  13. package/dist/integrations/declarations.js.map +1 -1
  14. package/dist/integrations/index.d.ts +3 -1
  15. package/dist/integrations/index.d.ts.map +1 -1
  16. package/dist/integrations/index.js +2 -1
  17. package/dist/integrations/index.js.map +1 -1
  18. package/dist/integrations/mcpintegration/client.d.ts +71 -0
  19. package/dist/integrations/mcpintegration/client.d.ts.map +1 -0
  20. package/dist/integrations/mcpintegration/client.js +353 -0
  21. package/dist/integrations/mcpintegration/client.js.map +1 -0
  22. package/dist/integrations/mcpintegration/client.test.d.ts +17 -0
  23. package/dist/integrations/mcpintegration/client.test.d.ts.map +1 -0
  24. package/dist/integrations/mcpintegration/client.test.js +432 -0
  25. package/dist/integrations/mcpintegration/client.test.js.map +1 -0
  26. package/dist/integrations/mcpintegration/index.d.ts +8 -0
  27. package/dist/integrations/mcpintegration/index.d.ts.map +1 -0
  28. package/dist/integrations/mcpintegration/index.js +7 -0
  29. package/dist/integrations/mcpintegration/index.js.map +1 -0
  30. package/dist/integrations/mcpintegration/types.d.ts +164 -0
  31. package/dist/integrations/mcpintegration/types.d.ts.map +1 -0
  32. package/dist/integrations/mcpintegration/types.js +9 -0
  33. package/dist/integrations/mcpintegration/types.js.map +1 -0
  34. package/dist/integrations/registry.d.ts +1 -0
  35. package/dist/integrations/registry.d.ts.map +1 -1
  36. package/dist/integrations/registry.js +5 -0
  37. package/dist/integrations/registry.js.map +1 -1
  38. package/package.json +3 -3
  39. package/src/index.ts +12 -0
  40. package/src/integrations/base/request-body.ts +7 -4
  41. package/src/integrations/declarations.ts +16 -0
  42. package/src/integrations/index.ts +14 -0
  43. package/src/integrations/mcpintegration/README.md +149 -0
  44. package/src/integrations/mcpintegration/client.test.ts +588 -0
  45. package/src/integrations/mcpintegration/client.ts +544 -0
  46. package/src/integrations/mcpintegration/docs.manifest.json +5 -0
  47. package/src/integrations/mcpintegration/index.ts +16 -0
  48. package/src/integrations/mcpintegration/types.ts +185 -0
  49. package/src/integrations/registry.ts +6 -0
@@ -0,0 +1,353 @@
1
+ /**
2
+ * MCP Server client implementation.
3
+ *
4
+ * Builds the JSON-RPC request carried by the MCP step and sends it through
5
+ * the orchestrator. The worker plugin owns the MCP handshake and session; the
6
+ * SDK shapes the request, hands the plugin's session back to it on later
7
+ * calls, and interprets the result.
8
+ */
9
+ import { z } from "zod";
10
+ import { RestApiValidationError, restApiValidationErrorFromZodError, } from "../../errors.js";
11
+ import { IntegrationError } from "../../runtime/errors.js";
12
+ import { describeJsonSerializationFailure } from "../base/request-body.js";
13
+ import { describeType } from "../utils.js";
14
+ const METHOD_CALL_TOOL = "tools/call";
15
+ const METHOD_LIST_TOOLS = "tools/list";
16
+ /**
17
+ * Upper bound on `tools/list` pages. A server that hands out a fresh cursor
18
+ * on every page would otherwise keep the API step running until it times out.
19
+ */
20
+ const MAX_LIST_TOOLS_PAGES = 50;
21
+ /**
22
+ * Headers the plugin reads (case-insensitively) to reuse the MCP session it
23
+ * opened on an earlier call instead of running the handshake again.
24
+ */
25
+ const SESSION_ID_HEADER = "Mcp-Session-Id";
26
+ const PROTOCOL_VERSION_HEADER = "MCP-Protocol-Version";
27
+ /**
28
+ * An optional MCP field. Servers built on Python's pydantic serialize an
29
+ * absent optional as `null`, so both `undefined` and `null` mean absent and
30
+ * both come out as `undefined`.
31
+ */
32
+ function absent(schema) {
33
+ return schema.nullish().transform((value) => value ?? undefined);
34
+ }
35
+ /**
36
+ * The plugin adds these keys to a result when the call opened a session with
37
+ * a handshake-era server. They are the plugin's to reuse, not the caller's.
38
+ */
39
+ const SessionFieldsSchema = z.object({
40
+ sessionId: absent(z.string()),
41
+ protocolVersion: absent(z.string()),
42
+ });
43
+ const ContentBlockSchema = z
44
+ .object({ type: z.string(), text: absent(z.string()) })
45
+ .passthrough();
46
+ const CallToolResultSchema = z
47
+ .object({
48
+ content: z.array(ContentBlockSchema),
49
+ structuredContent: absent(z.record(z.unknown())),
50
+ isError: absent(z.boolean()),
51
+ _meta: absent(z.record(z.unknown())),
52
+ })
53
+ .passthrough();
54
+ const ToolSchema = z
55
+ .object({
56
+ name: z.string().min(1),
57
+ title: absent(z.string()),
58
+ description: absent(z.string()),
59
+ inputSchema: z
60
+ .object({
61
+ type: z.literal("object"),
62
+ properties: absent(z.record(z.unknown())),
63
+ required: absent(z.array(z.string())),
64
+ })
65
+ .passthrough(),
66
+ outputSchema: absent(z.record(z.unknown())),
67
+ annotations: absent(z
68
+ .object({
69
+ title: absent(z.string()),
70
+ readOnlyHint: absent(z.boolean()),
71
+ destructiveHint: absent(z.boolean()),
72
+ idempotentHint: absent(z.boolean()),
73
+ openWorldHint: absent(z.boolean()),
74
+ })
75
+ .passthrough()),
76
+ _meta: absent(z.record(z.unknown())),
77
+ })
78
+ .passthrough();
79
+ const ListToolsResultSchema = z
80
+ .object({
81
+ tools: z.array(ToolSchema),
82
+ nextCursor: absent(z.string()),
83
+ })
84
+ .passthrough();
85
+ function isRecord(value) {
86
+ return typeof value === "object" && value !== null && !Array.isArray(value);
87
+ }
88
+ function isTextBlock(block) {
89
+ return block.type === "text" && typeof block.text === "string";
90
+ }
91
+ /**
92
+ * True for anything that behaves like a Zod schema, whichever zod copy built
93
+ * it. Used to catch a schema passed where tool arguments belong.
94
+ */
95
+ function looksLikeSchema(value) {
96
+ return (value instanceof z.ZodType ||
97
+ (isRecord(value) &&
98
+ typeof value.safeParse === "function" &&
99
+ typeof value.parse === "function"));
100
+ }
101
+ function hasHeader(headers, name) {
102
+ const wanted = name.toLowerCase();
103
+ return Object.keys(headers).some((key) => key.toLowerCase() === wanted);
104
+ }
105
+ /**
106
+ * Concatenates the text of every `text` content block.
107
+ */
108
+ function textContent(content) {
109
+ return content
110
+ .filter(isTextBlock)
111
+ .map((block) => block.text)
112
+ .join("\n");
113
+ }
114
+ /**
115
+ * Thrown by `callTool` when the server rejects the tool as unknown or not
116
+ * available to the caller, so API code can tell it apart from a failed call.
117
+ */
118
+ export class McpToolUnavailableError extends IntegrationError {
119
+ toolName;
120
+ constructor(integrationName, toolName, cause) {
121
+ super(integrationName, "callTool", cause);
122
+ this.message = `Tool "${toolName}" is not available on integration "${integrationName}"`;
123
+ this.name = "McpToolUnavailableError";
124
+ this.toolName = toolName;
125
+ }
126
+ }
127
+ // The spec answers an unknown tool with -32602; some servers use -32601 or an isError result.
128
+ function namesUnknownTool(text, tool) {
129
+ const name = tool.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
130
+ return new RegExp(`unknown tool:?\\s*["'\`]?${name}(?![\\w.-])|tool\\s+["'\`]?${name}["'\`]?\\s+not found`, "i").test(text);
131
+ }
132
+ function describeIssues(error) {
133
+ return error.issues
134
+ .slice(0, 3)
135
+ .map((issue) => `${issue.path.join(".") || "(root)"}: ${issue.message}`)
136
+ .join("; ");
137
+ }
138
+ /**
139
+ * Internal implementation of McpClient.
140
+ */
141
+ export class McpClientImpl {
142
+ name;
143
+ pluginId;
144
+ config;
145
+ executeQuery;
146
+ nextRequestId = 1;
147
+ /** Session the plugin opened on an earlier call, sent back on later ones. */
148
+ session;
149
+ constructor(config, executeQuery) {
150
+ this.name = config.name;
151
+ this.pluginId = config.pluginId;
152
+ this.config = config;
153
+ this.executeQuery = executeQuery;
154
+ }
155
+ async callTool(name, args, options) {
156
+ if (args && looksLikeSchema(args.schema)) {
157
+ throw new TypeError(`callTool("${name}"): a Zod schema was passed inside the tool arguments; ` +
158
+ "pass it as the third argument instead: callTool(name, args, { schema })");
159
+ }
160
+ const result = await this.send(METHOD_CALL_TOOL, { name, arguments: this.toPlainArguments(name, args) }, options, "callTool");
161
+ const toolResult = this.toCallToolResult(result, name);
162
+ if (toolResult.isError) {
163
+ const text = textContent(toolResult.content);
164
+ if (namesUnknownTool(text, name)) {
165
+ throw new McpToolUnavailableError(this.config.name, name, {
166
+ tool: name,
167
+ message: text,
168
+ result: toolResult,
169
+ });
170
+ }
171
+ throw new IntegrationError(this.config.name, "callTool", {
172
+ tool: name,
173
+ message: text
174
+ ? `Tool "${name}" failed: ${text}`
175
+ : `Tool "${name}" reported an error without text content`,
176
+ result: toolResult,
177
+ });
178
+ }
179
+ if (!options?.schema) {
180
+ return toolResult;
181
+ }
182
+ return this.validate(toolResult, options.schema, name);
183
+ }
184
+ async listTools(options) {
185
+ const tools = [];
186
+ const seenCursors = new Set();
187
+ let cursor;
188
+ for (let page = 1; page <= MAX_LIST_TOOLS_PAGES; page++) {
189
+ const result = await this.send(METHOD_LIST_TOOLS, cursor === undefined ? {} : { cursor }, options, "listTools");
190
+ const parsed = ListToolsResultSchema.safeParse(result);
191
+ if (!parsed.success) {
192
+ throw new IntegrationError(this.config.name, "listTools", `tools/list returned something other than a tools array (${describeType(result)}): ${describeIssues(parsed.error)}`);
193
+ }
194
+ this.rememberSession(SessionFieldsSchema.parse(parsed.data));
195
+ tools.push(...parsed.data.tools);
196
+ const next = parsed.data.nextCursor;
197
+ if (!next) {
198
+ return tools;
199
+ }
200
+ if (seenCursors.has(next)) {
201
+ throw new IntegrationError(this.config.name, "listTools", `tools/list repeated a cursor on page ${page}`);
202
+ }
203
+ seenCursors.add(next);
204
+ cursor = next;
205
+ }
206
+ throw new IntegrationError(this.config.name, "listTools", `tools/list did not finish within ${MAX_LIST_TOOLS_PAGES} pages`);
207
+ }
208
+ /**
209
+ * Builds the MCP step request for one JSON-RPC call.
210
+ *
211
+ * The session the plugin returned on an earlier call is sent back as
212
+ * headers so the plugin reuses it. Headers the caller passes win.
213
+ */
214
+ buildRequest(method, params, headers) {
215
+ const merged = {};
216
+ if (this.session && !hasHeader(headers ?? {}, SESSION_ID_HEADER)) {
217
+ merged[SESSION_ID_HEADER] = this.session.sessionId;
218
+ if (this.session.protocolVersion) {
219
+ merged[PROTOCOL_VERSION_HEADER] = this.session.protocolVersion;
220
+ }
221
+ }
222
+ Object.assign(merged, headers);
223
+ const request = {
224
+ request: {
225
+ method,
226
+ params,
227
+ id: this.nextRequestId++,
228
+ },
229
+ };
230
+ const entries = Object.entries(merged);
231
+ if (entries.length > 0) {
232
+ request.headers = entries.map(([key, value]) => ({ key, value }));
233
+ }
234
+ return request;
235
+ }
236
+ /**
237
+ * Sends one JSON-RPC request through the orchestrator and returns the
238
+ * server's result untyped.
239
+ */
240
+ async send(method, params, options, operation) {
241
+ const request = this.buildRequest(method, params, options?.headers);
242
+ const metadata = options?.label
243
+ ? { label: options.label }
244
+ : undefined;
245
+ try {
246
+ return await this.executeQuery({ ...request }, undefined, metadata);
247
+ }
248
+ catch (error) {
249
+ if (error instanceof IntegrationError ||
250
+ error instanceof RestApiValidationError) {
251
+ throw error;
252
+ }
253
+ if (method === METHOD_CALL_TOOL && error instanceof Error) {
254
+ const tool = String(params.name);
255
+ if (/error -3260[12] for tools\/call/.test(error.message) &&
256
+ namesUnknownTool(error.message, tool)) {
257
+ throw new McpToolUnavailableError(this.config.name, tool, error);
258
+ }
259
+ }
260
+ throw new IntegrationError(this.config.name, operation, error);
261
+ }
262
+ }
263
+ // Sandbox args can be proxies, which the worker cannot structured-clone.
264
+ toPlainArguments(tool, args) {
265
+ if (!args) {
266
+ return {};
267
+ }
268
+ try {
269
+ return JSON.parse(JSON.stringify(args));
270
+ }
271
+ catch (error) {
272
+ throw new IntegrationError(this.config.name, "callTool", `Tool "${tool}" arguments are not JSON-serializable: ${describeJsonSerializationFailure(error, "the arguments object")}`);
273
+ }
274
+ }
275
+ rememberSession(result) {
276
+ if (result.sessionId) {
277
+ this.session = {
278
+ sessionId: result.sessionId,
279
+ protocolVersion: result.protocolVersion,
280
+ };
281
+ }
282
+ }
283
+ /**
284
+ * Checks the shape of a `tools/call` result, records the session the
285
+ * plugin may have opened, and drops the plugin's session fields so they
286
+ * never reach API code. Optional fields sent as `null` count as absent.
287
+ */
288
+ toCallToolResult(raw, tool) {
289
+ const parsed = CallToolResultSchema.safeParse(raw);
290
+ if (!parsed.success) {
291
+ throw new IntegrationError(this.config.name, "callTool", `Tool "${tool}" returned something other than a CallToolResult (${describeType(raw)}): ${describeIssues(parsed.error)}`);
292
+ }
293
+ this.rememberSession(SessionFieldsSchema.parse(parsed.data));
294
+ const { sessionId, protocolVersion, structuredContent, ...rest } = parsed.data;
295
+ void sessionId;
296
+ void protocolVersion;
297
+ return {
298
+ ...rest,
299
+ structuredContent: isRecord(structuredContent)
300
+ ? structuredContent
301
+ : undefined,
302
+ };
303
+ }
304
+ /**
305
+ * Validates a tool result against the caller's schema.
306
+ *
307
+ * Uses `structuredContent` when the server returned an object. Otherwise
308
+ * takes the first `text` block: if the text is JSON, the parsed value is
309
+ * validated first and the raw string second, so a schema that wants a
310
+ * string still gets "12345" as a string; text that is not JSON is validated
311
+ * as a string.
312
+ */
313
+ validate(result, schema, tool) {
314
+ const candidates = [];
315
+ if (result.structuredContent !== undefined) {
316
+ candidates.push(result.structuredContent);
317
+ }
318
+ else {
319
+ const firstText = result.content.find(isTextBlock);
320
+ if (!firstText) {
321
+ throw new IntegrationError(this.config.name, "callTool", `Tool "${tool}" returned no structuredContent and no text block to validate against the schema`);
322
+ }
323
+ const parsedJson = tryParseJson(firstText.text);
324
+ if (parsedJson.ok && parsedJson.value !== firstText.text) {
325
+ candidates.push(parsedJson.value);
326
+ }
327
+ candidates.push(firstText.text);
328
+ }
329
+ let firstFailure;
330
+ for (const candidate of candidates) {
331
+ const parsed = schema.safeParse(candidate);
332
+ if (parsed.success) {
333
+ return parsed.data;
334
+ }
335
+ firstFailure ??= { error: parsed.error, candidate };
336
+ }
337
+ // candidates is never empty, so firstFailure is set when we get here.
338
+ const failure = firstFailure ?? {
339
+ error: new z.ZodError([]),
340
+ candidate: undefined,
341
+ };
342
+ throw restApiValidationErrorFromZodError(`Tool "${tool}" result validation failed`, failure.error, failure.candidate);
343
+ }
344
+ }
345
+ function tryParseJson(text) {
346
+ try {
347
+ return { ok: true, value: JSON.parse(text) };
348
+ }
349
+ catch {
350
+ return { ok: false };
351
+ }
352
+ }
353
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/integrations/mcpintegration/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Tests for McpClientImpl.
3
+ *
4
+ * Validates:
5
+ * - callTool() builds the MCP step request: a tools/call JSON-RPC request
6
+ * with a params object, a per-call id, optional headers as Property
7
+ * entries, and the label as trace metadata.
8
+ * - The session the plugin returns is sent back as headers on later calls
9
+ * and on later tools/list pages, and never reaches API code.
10
+ * - callTool() returns the CallToolResult without a schema, validates
11
+ * structuredContent or the first text block with one, and maps isError
12
+ * results to IntegrationError.
13
+ * - listTools() follows nextCursor, rejects malformed entries, and gives up
14
+ * on a repeated cursor or too many pages.
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../../../src/integrations/mcpintegration/client.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}