// Test manual del MCP server: lanza el server por stdio, lista tools y llama una de lectura. import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'; const url = process.env.STORY_STUDIO_URL || 'https://story-studio.carlosnarro.com'; const transport = new StdioClientTransport({ command: 'node', args: ['dist/index.js'], env: { ...process.env, STORY_STUDIO_URL: url }, }); const client = new Client({ name: 'test-client', version: '1.0.0' }); await client.connect(transport); const { tools } = await client.listTools(); console.log(`\nTOOLS (${tools.length}):`); console.log(tools.map((t) => t.name).join(', ')); console.log('\n== call story_list_projects =='); const res = await client.callTool({ name: 'story_list_projects', arguments: {} }); const text = res.content?.[0]?.text ?? ''; console.log('isError:', res.isError === true); console.log(text.slice(0, 600)); // Prueba una segunda tool de lectura con un slug real si hay proyectos. try { const projs = JSON.parse(text); const slug = Array.isArray(projs) && projs[0]?.slug; if (slug) { console.log(`\n== call story_get_idea_motriz (slug=${slug}) ==`); const r2 = await client.callTool({ name: 'story_get_idea_motriz', arguments: { slug } }); console.log('isError:', r2.isError === true, '| len:', (r2.content?.[0]?.text ?? '').length); } } catch { /* ignore */ } await client.close(); console.log('\nOK');