|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import { test, describe, before, after } from 'node:test'; |
|
|
import { strict as assert } from 'node:assert'; |
|
|
import { TestRig } from './test-helper.js'; |
|
|
import { spawn } from 'child_process'; |
|
|
import { join } from 'path'; |
|
|
import { fileURLToPath } from 'url'; |
|
|
import { writeFileSync, unlinkSync } from 'fs'; |
|
|
|
|
|
const __dirname = fileURLToPath(new URL('.', import.meta.url)); |
|
|
const serverScriptPath = join(__dirname, './temp-server.js'); |
|
|
|
|
|
const serverScript = ` |
|
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'; |
|
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; |
|
|
import { z } from 'zod'; |
|
|
|
|
|
const server = new McpServer({ |
|
|
name: 'addition-server', |
|
|
version: '1.0.0', |
|
|
}); |
|
|
|
|
|
server.registerTool( |
|
|
'add', |
|
|
{ |
|
|
title: 'Addition Tool', |
|
|
description: 'Add two numbers', |
|
|
inputSchema: { a: z.number(), b: z.number() }, |
|
|
}, |
|
|
async ({ a, b }) => ({ |
|
|
content: [{ type: 'text', text: String(a + b) }], |
|
|
}), |
|
|
); |
|
|
|
|
|
const transport = new StdioServerTransport(); |
|
|
await server.connect(transport); |
|
|
`; |
|
|
|
|
|
describe('simple-mcp-server', () => { |
|
|
const rig = new TestRig(); |
|
|
let child; |
|
|
|
|
|
before(() => { |
|
|
writeFileSync(serverScriptPath, serverScript); |
|
|
child = spawn('node', [serverScriptPath], { |
|
|
stdio: ['pipe', 'pipe', 'pipe'], |
|
|
}); |
|
|
child.stderr.on('data', (data) => { |
|
|
console.error(`stderr: ${data}`); |
|
|
}); |
|
|
|
|
|
return new Promise((resolve) => setTimeout(resolve, 500)); |
|
|
}); |
|
|
|
|
|
after(() => { |
|
|
child.kill(); |
|
|
unlinkSync(serverScriptPath); |
|
|
}); |
|
|
|
|
|
test('should add two numbers', () => { |
|
|
rig.setup('should add two numbers'); |
|
|
const output = rig.run('add 5 and 10'); |
|
|
assert.ok(output.includes('15')); |
|
|
}); |
|
|
}); |
|
|
|