47 lines
1.5 KiB
TypeScript
47 lines
1.5 KiB
TypeScript
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) }],
|
|
})
|
|
})
|
|
})
|