返回 MCP 目录
public公开dns本地运行

mcp-hono-stateless

一个基于Hono框架的无状态MCP服务器示例,支持Streamable HTTP,可部署到Cloudflare Workers等平台。

article

README

🚀 无状态 Hono MCP 服务器

这是一个基于 Hono 的 MCP 服务器示例,利用 Streamable HTTP 技术构建。它参考官方的 Express 示例 simpleStatelessStreamableHttp.ts 进行开发,并使用 fetch-to-node 完成转换。该服务器可部署到 Cloudflare Workers 以及其他支持 Hono 的环境中。

部署到 Cloudflare

✨ 主要特性

  • 基于 Hono 框架,具备高效的性能和简洁的开发体验。
  • 采用 Streamable HTTP,实现流式数据处理。
  • 可方便地部署到 Cloudflare Workers 及其他支持 Hono 的环境。

📦 安装指南

本项目未明确给出安装步骤,若需使用,可参考以下通用步骤:

  1. 克隆项目仓库:
git clone https://github.com/mhart/mcp-hono-stateless.git
cd mcp-hono-stateless
  1. 安装依赖:
npm install

💻 使用示例

基础用法

在第一个终端中启动服务器:

npm start

在第二个终端中使用 MCP 客户端进行测试:

node node_modules/@modelcontextprotocol/sdk/dist/esm/examples/client/simpleStreamableHttp.js

这将尝试连接到运行在 3000 端口的 MCP 服务器。你可以使用 connect <url>/mcp 来连接不同的主机或端口。

高级用法

启动服务器并连接成功后,你可以运行命令如 list-promptslist-tools 验证你的 MCP 服务器是否正常工作。以下是一个完整的示例会话:

> connect https://mcp-hono-stateless.michael.workers.dev/mcp
正在连接到 https://mcp-hono-stateless.michael.workers.dev/mcp...
创建传输通道,会话 ID: undefined
已连接到 MCP 服务器

> list-tools
可用工具:
  - start-notification-stream: 开始发送周期性通知以测试重连功能

> list-prompts
可用提示:
  - greeting-template: 简单的问候提示模板

> call-tool start-notification-stream
调用工具 'start-notification-stream',参数:{}

通知 #1: info - 周期性通知 #1 于 2025-04-27 16:31:00
通知 #2: info - 周期性通知 #2 于 2025-04-27 16:31:10
...
工具结果:
  已开始每 100ms 发送一次周期性通知

🔧 技术细节

该项目与 Express 示例的主要区别在于使用了 Hono 框架替代 Express,并且使用 fetch-to-node 进行转换。以下是关键代码的对比:

- import express, { Request, Response } from 'express';
+ import { Hono } from 'hono';
+ import { toFetchResponse, toReqRes } from 'fetch-to-node';

// ...

- const app = express();
- app.use(express.json());
+ const app = new Hono();

- app.post('/mcp', async (req: Request, res: Response) => {
+ app.post('/mcp', async (c) => {
+   const { req, res } = toReqRes(c.req.raw);

    const server = getServer();
    try {
      const transport: StreamableHTTPServerTransport = new StreamableHTTPServerTransport({
        sessionIdGenerator: undefined,
      });
      await server.connect(transport);
-     await transport.handleRequest(req, res, req.body);
+     await transport.handleRequest(req, res, await c.req.json());
      res.on('close', () => {
        console.log('请求关闭');
        transport.close();
        server.close();
      });
+     return toFetchResponse(res);
    } catch (error) {

🚀 部署

在项目根目录下运行以下命令进行部署:

npm run deploy

这将把项目部署到 Cloudflare Workers 上。

help

运行方式说明

cloud

托管运行

托管运行通常表示这个 MCP Server 由服务方环境承载,用户一般按页面提供的连接方式或授权流程接入,不需要在本地长期启动一个 MCP 进程

  1. 打开服务方连接页
  2. 完成授权或复制端点
  3. 在 MCP 客户端中连接
terminal

本地运行 / 其它方式

本地运行通常需要用户在自己的电脑或服务器上安装依赖,把 server_config 复制到 MCP 客户端,并按 env_schema 补齐环境变量、密钥或其它配置

  1. 复制 server_config
  2. 安装所需依赖
  3. 补齐环境变量后重启客户端