smoke-mcp.mjs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import path from 'node:path';
  2. import { Client } from '@modelcontextprotocol/sdk/client/index.js';
  3. import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
  4. import manifest from '../skill-package-manifest.json' with { type: 'json' };
  5. const root = path.resolve(import.meta.dirname, '..');
  6. const transport = new StdioClientTransport({
  7. command: process.execPath,
  8. args: [path.join(root, 'mcp', 'src', 'server.mjs')], cwd: root, stderr: 'pipe',
  9. env: { ...process.env, FMODE_PLAN_TOKEN_SECRET: 'smoke-only-plan-token-secret-32-bytes' }
  10. });
  11. const client = new Client({ name: 'fmode-image-set-smoke', version: '0.1.0' });
  12. try {
  13. await client.connect(transport);
  14. const listed = await client.listTools();
  15. const names = listed.tools.map(tool => tool.name).sort();
  16. const expected = [...manifest.mcpTools].sort();
  17. if (JSON.stringify(names) !== JSON.stringify(expected)) throw new Error(`Tool mismatch: ${JSON.stringify(names)}`);
  18. for (const tool of listed.tools) {
  19. if (!tool.inputSchema) throw new Error(`Missing input schema: ${tool.name}`);
  20. if (!tool.outputSchema) throw new Error(`Missing output schema: ${tool.name}`);
  21. if (!tool.annotations) throw new Error(`Missing annotations: ${tool.name}`);
  22. }
  23. const response = await client.callTool({
  24. name: 'fmode_image_set_plan',
  25. arguments: { request: '规划七张测试套图', sessionId: 'smoke-session', promptId: 'smoke-planning-prompt' }
  26. });
  27. const parsed = JSON.parse(response.content[0].text);
  28. if (parsed.status !== 'ok' || parsed.data.plan.items.length !== 7 || !parsed.data.planToken) throw new Error('MCP planning call failed.');
  29. const confirmation = await client.callTool({
  30. name: 'fmode_image_set_generate',
  31. arguments: {
  32. planToken: parsed.data.planToken, confirmedPlanId: parsed.data.plan.planId,
  33. confirmed: false, sessionId: 'smoke-session', promptId: 'smoke-confirmation-prompt'
  34. }
  35. });
  36. const confirmationParsed = JSON.parse(confirmation.content[0].text);
  37. if (confirmationParsed.status !== 'needs_confirmation') throw new Error('MCP plan-reference handoff failed.');
  38. console.log(JSON.stringify({ status: 'ok', tools: names.length, planId: parsed.data.plan.planId, planToken: true }, null, 2));
  39. } finally {
  40. await client.close();
  41. }