import { describe, expect, it } from 'vitest' import { Client } from '@modelcontextprotocol/sdk/client/index.js' import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js' import { FIELDLENS_MCP_OAUTH_SCOPES, captureLimit, createFieldLensMcpServer } from './mcp.js' describe('FieldLens MCP telemetry', () => { it('exposes only a bounded read-only diagnostic tool', async () => { const server = createFieldLensMcpServer() const client = new Client({ name: 'fieldlens-test', version: '1.0.0' }) const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair() try { await Promise.all([server.connect(serverTransport), client.connect(clientTransport)]) const { tools } = await client.listTools() expect(tools.map((tool) => tool.name)).toEqual(['list_print_captures']) expect(tools[0]?.annotations?.readOnlyHint).toBe(true) expect(tools[0]?.inputSchema.properties?.limit).toBeDefined() expect(tools[0]?._meta?.securitySchemes).toEqual([ { type: 'oauth2', scopes: [...FIELDLENS_MCP_OAUTH_SCOPES] }, ]) } finally { await client.close() await server.close() } }) it('clamps row count to a hard limit', () => { expect(captureLimit(0)).toBe(1) expect(captureLimit(500)).toBe(200) expect(captureLimit(Number.NaN)).toBe(50) }) })