Co-authored-by: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Co-authored-by: Kit Langton <kit.langton@gmail.com> Co-authored-by: opencode-agent[bot] <opencode-agent[bot]@users.noreply.github.com> Co-authored-by: Affan Ali <93028901+affanali2k3@users.noreply.github.com> Co-authored-by: affanali2k3 <affanalikhanxx@gmail.com> Co-authored-by: Frank <frank@anoma.ly> Co-authored-by: opencode-agent[bot] <219766164+opencode-agent[bot]@users.noreply.github.com> Co-authored-by: 𝓛𝓲𝓽𝓽𝓵𝓮 𝓕𝓻𝓪𝓷𝓴 <little-frank@opencord.local> Co-authored-by: Aiden Cline <63023139+rekram1-node@users.noreply.github.com> Co-authored-by: Jay V <air@live.ca> Co-authored-by: Dax Raad <d@ironbay.co> Co-authored-by: Aarav Sareen <96787824+arvsrn@users.noreply.github.com> Co-authored-by: OpeOginni <107570612+OpeOginni@users.noreply.github.com> Co-authored-by: Luke Parker <10430890+Hona@users.noreply.github.com> Co-authored-by: Ben Guthrie <benjee.012@gmail.com> Co-authored-by: Dax <mail@thdxr.com> Co-authored-by: Filip <34747899+neriousy@users.noreply.github.com> Co-authored-by: Max Anderson <max.a.anderson95@gmail.com> Co-authored-by: Brendan Allan <git@brendonovich.dev> Co-authored-by: Jack <jack@anoma.ly> Co-authored-by: Shoubhit Dash <shoubhit2005@gmail.com> Co-authored-by: Dustin Deus <deusdustin@gmail.com> Co-authored-by: starptech <starptech@starptechs-MBP.fritz.box> Co-authored-by: Aiden Cline <aidenpcline@gmail.com> Co-authored-by: usrnk1 <7547651+usrnk1@users.noreply.github.com> Co-authored-by: Jay <53023+jayair@users.noreply.github.com> Co-authored-by: runvip <164729189+runvip@users.noreply.github.com> Co-authored-by: opencode <opencode@sst.dev> Co-authored-by: Julian Coy <julian@ex-machina.co> Co-authored-by: Vladimir Glafirov <vglafirov@gitlab.com>
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) }],
|
|
})
|
|
})
|
|
})
|