v2 ci: add Bun and Deno integration tests (#1607)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
26c7242d67
commit
049f26ef53
2 changed files with 176 additions and 6 deletions
57
test/integration/test/server/bun.test.ts
Normal file
57
test/integration/test/server/bun.test.ts
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
/**
|
||||
* Bun integration test
|
||||
*
|
||||
* Verifies the MCP server and client packages work natively on Bun.
|
||||
* Run with: bun test test/server/bun.test.ts
|
||||
*/
|
||||
|
||||
import { Client, StreamableHTTPClientTransport } from '@modelcontextprotocol/client';
|
||||
import { McpServer, WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/server';
|
||||
// eslint-disable-next-line import/no-unresolved
|
||||
import { afterAll, beforeAll, describe, expect, it } from 'bun:test';
|
||||
import * as z from 'zod/v4';
|
||||
|
||||
describe('MCP on Bun', () => {
|
||||
let httpServer: ReturnType<typeof Bun.serve>;
|
||||
let transport: WebStandardStreamableHTTPServerTransport;
|
||||
|
||||
beforeAll(async () => {
|
||||
const mcpServer = new McpServer({ name: 'test-server', version: '1.0.0' });
|
||||
|
||||
mcpServer.registerTool(
|
||||
'greet',
|
||||
{
|
||||
description: 'Greet someone',
|
||||
inputSchema: z.object({ name: z.string() })
|
||||
},
|
||||
async ({ name }) => ({
|
||||
content: [{ type: 'text' as const, text: `Hello, ${name}!` }]
|
||||
})
|
||||
);
|
||||
|
||||
transport = new WebStandardStreamableHTTPServerTransport();
|
||||
await mcpServer.connect(transport);
|
||||
|
||||
httpServer = Bun.serve({
|
||||
port: 0,
|
||||
fetch: req => transport.handleRequest(req)
|
||||
});
|
||||
});
|
||||
|
||||
afterAll(async () => {
|
||||
await transport?.close();
|
||||
httpServer?.stop();
|
||||
});
|
||||
|
||||
it('should handle MCP tool calls', async () => {
|
||||
const client = new Client({ name: 'test-client', version: '1.0.0' });
|
||||
const clientTransport = new StreamableHTTPClientTransport(new URL(`http://localhost:${httpServer.port}`));
|
||||
|
||||
await client.connect(clientTransport);
|
||||
|
||||
const result = await client.callTool({ name: 'greet', arguments: { name: 'Bun' } });
|
||||
expect(result.content).toEqual([{ type: 'text', text: 'Hello, Bun!' }]);
|
||||
|
||||
await client.close();
|
||||
});
|
||||
});
|
||||
53
test/integration/test/server/deno.test.ts
Normal file
53
test/integration/test/server/deno.test.ts
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
/**
|
||||
* Deno integration test
|
||||
*
|
||||
* Verifies the MCP server and client packages work natively on Deno.
|
||||
* Run with: deno test --no-check --allow-net --allow-read --allow-env test/server/deno.test.ts
|
||||
*/
|
||||
|
||||
import assert from 'node:assert/strict';
|
||||
|
||||
import { Client, StreamableHTTPClientTransport } from '@modelcontextprotocol/client';
|
||||
import { McpServer, WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/server';
|
||||
import * as z from 'zod/v4';
|
||||
|
||||
Deno.test({
|
||||
name: 'MCP tool calls work on Deno',
|
||||
sanitizeOps: false,
|
||||
sanitizeResources: false,
|
||||
async fn() {
|
||||
const mcpServer = new McpServer({ name: 'test-server', version: '1.0.0' });
|
||||
|
||||
mcpServer.registerTool(
|
||||
'greet',
|
||||
{
|
||||
description: 'Greet someone',
|
||||
inputSchema: z.object({ name: z.string() })
|
||||
},
|
||||
async ({ name }) => ({
|
||||
content: [{ type: 'text' as const, text: `Hello, ${name}!` }]
|
||||
})
|
||||
);
|
||||
|
||||
const transport = new WebStandardStreamableHTTPServerTransport();
|
||||
await mcpServer.connect(transport);
|
||||
|
||||
const httpServer = Deno.serve({ port: 0 }, req => transport.handleRequest(req));
|
||||
const port = httpServer.addr.port;
|
||||
|
||||
try {
|
||||
const client = new Client({ name: 'test-client', version: '1.0.0' });
|
||||
const clientTransport = new StreamableHTTPClientTransport(new URL(`http://localhost:${port}`));
|
||||
|
||||
await client.connect(clientTransport);
|
||||
|
||||
const result = await client.callTool({ name: 'greet', arguments: { name: 'Deno' } });
|
||||
assert.deepStrictEqual(result.content, [{ type: 'text', text: 'Hello, Deno!' }]);
|
||||
|
||||
await client.close();
|
||||
} finally {
|
||||
await transport.close();
|
||||
await httpServer.shutdown();
|
||||
}
|
||||
}
|
||||
});
|
||||
Loading…
Reference in a new issue