Hono应用MCP服务器传输

为需要连接到MCP服务器的Hono应用提供的传输实现,填补官方SDK对Hono支持的空白。

  • by NikaBuligini
  • TypeScript
  • 本地部署
  • 29 星标
  • 更新于
在 GitHub 查看 NikaBuligini/hono-mcp-server-sse-transport

使用说明

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,
  },
);