feat: add tool respond helpers, test harness
This commit is contained in:
@@ -0,0 +1,13 @@
|
|||||||
|
import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'
|
||||||
|
|
||||||
|
export const ok = (payload: unknown): CallToolResult => ({
|
||||||
|
content: [{ type: 'text', text: JSON.stringify(payload, null, 2) }]
|
||||||
|
})
|
||||||
|
|
||||||
|
export const fail = (message: string): CallToolResult => ({
|
||||||
|
content: [{ type: 'text', text: message }],
|
||||||
|
isError: true
|
||||||
|
})
|
||||||
|
|
||||||
|
export const errorMessage = (error: unknown): string =>
|
||||||
|
error instanceof Error ? error.message : String(error)
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js'
|
||||||
|
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js'
|
||||||
|
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
||||||
|
import { type Mock, vi } from 'vitest'
|
||||||
|
import type { Manager } from '../../src/db/manager.js'
|
||||||
|
|
||||||
|
export type ToolResponse = {
|
||||||
|
isError: boolean
|
||||||
|
text: string
|
||||||
|
json: () => unknown
|
||||||
|
}
|
||||||
|
|
||||||
|
// Manager whose methods are also vitest mocks — no `as unknown as Manager` casts in tests.
|
||||||
|
export type FakeManager = Manager & {
|
||||||
|
get: Mock
|
||||||
|
invalidate: Mock
|
||||||
|
disposeAll: Mock
|
||||||
|
}
|
||||||
|
|
||||||
|
export const fakeManager = (): FakeManager => ({
|
||||||
|
get: vi.fn(),
|
||||||
|
invalidate: vi.fn(async () => {}),
|
||||||
|
disposeAll: vi.fn(async () => {})
|
||||||
|
})
|
||||||
|
|
||||||
|
export const connectClient = async (server: McpServer): Promise<Client> => {
|
||||||
|
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair()
|
||||||
|
const client = new Client({ name: 'test-client', version: '0.0.0' })
|
||||||
|
await Promise.all([client.connect(clientTransport), server.connect(serverTransport)])
|
||||||
|
return client
|
||||||
|
}
|
||||||
|
|
||||||
|
export const callTool = async (
|
||||||
|
client: Client,
|
||||||
|
name: string,
|
||||||
|
args: Record<string, unknown> = {}
|
||||||
|
): Promise<ToolResponse> => {
|
||||||
|
const result = await client.callTool({ name, arguments: args })
|
||||||
|
const content = result.content as Array<{ type: string; text: string }>
|
||||||
|
const text = content?.[0]?.text ?? ''
|
||||||
|
return {
|
||||||
|
isError: Boolean(result.isError),
|
||||||
|
text,
|
||||||
|
json: () => JSON.parse(text)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user