import { randomBytes, randomUUID } from 'node:crypto'; import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; import { z } from 'zod'; function marker() { return randomBytes(12).toString('hex'); } function createServer() { const server = new McpServer({ name: 'mcp-output-probe', version: '1.0.0' }); const annotations = { readOnlyHint: true, destructiveHint: false, openWorldHint: false }; const outputSchema = { probe_id: z.string(), structured_marker: z.string() }; server.registerTool('probe_both', { description: 'Return independent diagnostic markers in text content and structured content. Report the exact markers you can see in the result.', inputSchema: {}, outputSchema, annotations, }, async () => { const probe_id = randomUUID(); return { content: [{ type: 'text', text: JSON.stringify({ probe_id, text_marker: marker() }) }], structuredContent: { probe_id, structured_marker: marker() }, }; }); server.registerTool('probe_text_only', { description: 'Control test: return a diagnostic marker using only text content. Report the exact marker you can see.', inputSchema: {}, annotations, }, async () => ({ content: [{ type: 'text', text: JSON.stringify({ probe_id: randomUUID(), text_marker: marker() }) }], })); server.registerTool('probe_structured_only', { description: 'Control test: return a diagnostic marker using only structured content. Report the exact marker you can see.', inputSchema: {}, outputSchema, annotations, }, async () => ({ content: [], structuredContent: { probe_id: randomUUID(), structured_marker: marker() }, })); return server; } export default async function handler(req, res) { res.setHeader('Cache-Control', 'no-store'); if (req.method !== 'POST') { res.setHeader('Allow', 'POST'); res.statusCode = 405; res.end(JSON.stringify({ jsonrpc: '2.0', error: { code: -32000, message: 'Use Streamable HTTP POST at /api/mcp' }, id: null })); return; } const server = createServer(); const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined, enableJsonResponse: true }); res.on('close', () => { void transport.close().catch(() => {}); void server.close().catch(() => {}); }); try { await server.connect(transport); await transport.handleRequest(req, res, req.body); } catch (error) { console.error('MCP request failed:', error.message); if (!res.headersSent) { res.statusCode = 500; res.end(JSON.stringify({ jsonrpc: '2.0', error: { code: -32603, message: 'MCP request failed' }, id: null })); } } }