article
README
🚀 无状态 Hono MCP 服务器
这是一个基于 Hono 的 MCP 服务器示例,利用 Streamable HTTP 技术构建。它参考官方的 Express 示例 simpleStatelessStreamableHttp.ts 进行开发,并使用 fetch-to-node 完成转换。该服务器可部署到 Cloudflare Workers 以及其他支持 Hono 的环境中。
✨ 主要特性
- 基于 Hono 框架,具备高效的性能和简洁的开发体验。
- 采用 Streamable HTTP,实现流式数据处理。
- 可方便地部署到 Cloudflare Workers 及其他支持 Hono 的环境。
📦 安装指南
本项目未明确给出安装步骤,若需使用,可参考以下通用步骤:
- 克隆项目仓库:
git clone https://github.com/mhart/mcp-hono-stateless.git
cd mcp-hono-stateless
- 安装依赖:
npm install
💻 使用示例
基础用法
在第一个终端中启动服务器:
npm start
在第二个终端中使用 MCP 客户端进行测试:
node node_modules/@modelcontextprotocol/sdk/dist/esm/examples/client/simpleStreamableHttp.js
这将尝试连接到运行在 3000 端口的 MCP 服务器。你可以使用 connect <url>/mcp 来连接不同的主机或端口。
高级用法
启动服务器并连接成功后,你可以运行命令如 list-prompts 或 list-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 上。
微信扫一扫