Hono应用程序的MCP服务器传输
概述
该项目为需要连接到MCP服务器的Hono应用程序提供了一种传输方式。 TypeScript官方SDK 设计用于 express. 如果你试着按照他们的指示去做,但改变了 express 随着 hono,你会发现它不起作用。即使你设置了 HttpBinding 作为env(参见 @HONO/无差异), 它仍然不起作用,因为一些标头在发送后被添加到响应中。
此实现受以下启发 拉取请求
您可以使用此传输,直到官方SDK中对Hono有适当的支持。
入门
安装
pnpm add -D hono-mcp-server-sse-transport用法
import { Hono } from 'hono';
import { serve } from '@hono/node-server';
import { streamSSE } from 'hono/streaming';
import { SSETransport } from 'hono-mcp-server-sse-transport';
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
const mcpServer = new McpServer(
{
name: 'your-mcp-server-name',
version: '1.0.0',
},
{
capabilities: {
tools: {},
},
},
);
// here you add your tools
// ...
const app = new Hono();
// to support multiple simultaneous connections we have a lookup object from
// sessionId to transport
const transports: { [sessionId: string]: SSETransport } = {};
app.get('/sse', (c) => {
return streamSSE(c, async (stream) => {
const transport = new SSETransport('/messages', stream);
transports[transport.sessionId] = transport;
stream.onAbort(() => {
delete transports[transport.sessionId];
});
await mcpServer.connect(transport);
while (true) {
// This will keep the connection alive
// You can also await for a promise that never resolves
await stream.sleep(60_000);
}
});
});
app.post('/messages', async (c) => {
const sessionId = c.req.query('sessionId');
const transport = transports[sessionId];
if (transport == null) {
return c.text('No transport found for sessionId', 400);
}
return await transport.handlePostMessage(c);
});
serve(
{
fetch: app.fetch,
port: 3000,
},
);