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