Stateless Hono MCP Server

by mhart

102 stars
287 downloads
Not rated
GitHub

About

An example Hono MCP server using Streamable HTTP

Details

Author
mhart
GitHub stars
102
Downloads
287
Categories
Other

- Streamable HTTP transport for MCP
- Deployable to Cloudflare Workers
- Start-notification-stream tool included
- Greeting-template prompt included
- Stateless server example
- Based on official MCP Express example

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Stateless Hono MCP Server
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Run npm start to start the server locally on port 3000, then connect using an MCP client like the one at node node_modules/@modelcontextprotocol/sdk/dist/esm/examples/client/simpleStreamableHttp.js with the command connect http://localhost:3000/mcp. Deploy to Cloudflare Workers using npm run deploy.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "stateless hono mcp server": {
            "mcp-hono-stateless": {
                "command": "node",
                "args": [
                    "node_modules/@modelcontextprotocol/sdk/dist/esm/examples/client/simpleStreamableHttp.js"
                ]
            }
        }
    }
}

McpServers

{
    "mcp-hono-stateless": {
        "command": "node",
        "args": [
            "node_modules/@modelcontextprotocol/sdk/dist/esm/examples/client/simpleStreamableHttp.js"
        ]
    }
}

Stateless Hono MCP Server

Deploy to Cloudflare

An example Hono MCP server using Streamable HTTP, based off the official Express example,
using fetch-to-node to convert, deployable to Cloudflare Workers (and anywhere else Hono runs).

The only real changes to the Express example are:

- 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('Request closed');
transport.close();
server.close();
});
+ return toFetchResponse(res);
} catch (error) {

Testing with an example MCP client

In one terminal:

npm start

In another:

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

This will try to connect to the MCP server running on port 3000. You can use connect <url>/mcp to connect to a different host or port.

Then you can run commands like list-prompts or list-tools to verify your MCP server is working.

Deploying

npm run deploy

Here's an example session against a Hono MCP server deployed on Cloudflare Workers:

> connect https://mcp-hono-stateless.michael.workers.dev/mcp
Connecting to https://mcp-hono-stateless.michael.workers.dev/mcp...
Transport created with session ID: undefined
Connected to MCP server

> list-tools
Available tools:
- start-notification-stream: Starts sending periodic notifications for testing resumability

> list-prompts
Available prompts:
- greeting-template: A simple greeting prompt template

> call-tool start-notification-stream
Calling tool 'start-notification-stream' with args: {}

Notification #1: info - Periodic notification #1 at 2025-04-22T16:20:50.178Z
>
Notification #2: info - Periodic notification #2 at 2025-04-22T16:20:50.278Z
>
Notification #3: info - Periodic notification #3 at 2025-04-22T16:20:50.378Z
>
Notification #4: info - Periodic notification #4 at 2025-04-22T16:20:50.478Z
>
Notification #5: info - Periodic notification #5 at 2025-04-22T16:20:50.578Z
>
Notification #6: info - Periodic notification #6 at 2025-04-22T16:20:50.678Z
>
Notification #7: info - Periodic notification #7 at 2025-04-22T16:20:50.778Z
>
Notification #8: info - Periodic notification #8 at 2025-04-22T16:20:50.878Z
>
Notification #9: info - Periodic notification #9 at 2025-04-22T16:20:50.978Z
>
Notification #10: info - Periodic notification #10 at 2025-04-22T16:20:51.078Z
> Tool result:
Started sending periodic notifications every 100ms

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.