50 lines
1.7 KiB
TypeScript
50 lines
1.7 KiB
TypeScript
import { Client } from "@modelcontextprotocol/sdk/client/index.js"
|
|
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"
|
|
import { LATEST_PROTOCOL_VERSION } from "@modelcontextprotocol/sdk/types.js"
|
|
|
|
const posts: Array<{ method: string; session: string | null }> = []
|
|
let initializeCount = 0
|
|
let pingCount = 0
|
|
const server = Bun.serve({
|
|
port: 0,
|
|
async fetch(request) {
|
|
if (request.method === "GET") return new Response(null, { status: 405 })
|
|
if (request.method === "DELETE") return new Response(null, { status: 200 })
|
|
|
|
const message = (await request.json()) as { id?: number; method: string }
|
|
const session = request.headers.get("mcp-session-id")
|
|
posts.push({ method: message.method, session })
|
|
|
|
if (message.method === "initialize") {
|
|
initializeCount++
|
|
return Response.json(
|
|
{
|
|
jsonrpc: "2.0",
|
|
id: message.id,
|
|
result: {
|
|
protocolVersion: LATEST_PROTOCOL_VERSION,
|
|
capabilities: {},
|
|
serverInfo: { name: "test", version: "1" },
|
|
},
|
|
},
|
|
{ headers: { "mcp-session-id": initializeCount === 1 ? "expired" : "replacement" } },
|
|
)
|
|
}
|
|
|
|
if (message.method === "notifications/initialized") return new Response(null, { status: 202 })
|
|
|
|
pingCount++
|
|
if (pingCount === 1) return new Response("Session not found", { status: 404 })
|
|
return Response.json({ jsonrpc: "2.0", id: message.id, result: {} })
|
|
},
|
|
})
|
|
const client = new Client({ name: "test", version: "1" })
|
|
|
|
try {
|
|
await client.connect(new StreamableHTTPClientTransport(server.url))
|
|
await client.ping()
|
|
process.stdout.write(JSON.stringify(posts))
|
|
} finally {
|
|
await client.close()
|
|
server.stop(true)
|
|
}
|