|
|
@@ -0,0 +1,48 @@
|
|
|
+import { describe, expect, test } from "bun:test"
|
|
|
+import type { Client } from "@modelcontextprotocol/sdk/client/index.js"
|
|
|
+import { McpCatalog } from "@/mcp/catalog"
|
|
|
+
|
|
|
+const options = { toolCallId: "call_mcp", abortSignal: new AbortController().signal } as any
|
|
|
+
|
|
|
+function clientReturning(result: unknown) {
|
|
|
+ return {
|
|
|
+ callTool: async () => result,
|
|
|
+ } as unknown as Client
|
|
|
+}
|
|
|
+
|
|
|
+function mcpTool() {
|
|
|
+ return {
|
|
|
+ name: "screenshot",
|
|
|
+ description: "Take a screenshot",
|
|
|
+ inputSchema: {
|
|
|
+ type: "object",
|
|
|
+ properties: {},
|
|
|
+ additionalProperties: false,
|
|
|
+ },
|
|
|
+ } as any
|
|
|
+}
|
|
|
+
|
|
|
+describe("McpCatalog.convertTool", () => {
|
|
|
+ test("preserves content when structuredContent is also present", async () => {
|
|
|
+ const content = [{ type: "image" as const, mimeType: "image/png", data: "AAAA" }]
|
|
|
+ const structuredContent = { image: { mimeType: "image/png", data: "AAAA" } }
|
|
|
+ const converted = McpCatalog.convertTool(mcpTool(), clientReturning({ content, structuredContent }))
|
|
|
+
|
|
|
+ const output = await converted.execute?.({}, options)
|
|
|
+
|
|
|
+ expect(output).toMatchObject({ content, structuredContent })
|
|
|
+ })
|
|
|
+
|
|
|
+ test("falls back to structuredContent only when content is absent", async () => {
|
|
|
+ const structuredContent = { results: [{ title: "one" }] }
|
|
|
+ const converted = McpCatalog.convertTool(mcpTool(), clientReturning({ content: [], structuredContent }))
|
|
|
+
|
|
|
+ const output = await converted.execute?.({}, options)
|
|
|
+
|
|
|
+ expect(output).toMatchObject({
|
|
|
+ structuredContent,
|
|
|
+ content: [{ type: "text", text: JSON.stringify(structuredContent) }],
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+})
|