loading…
Search for a command to run...
loading…
A lightweight Hono.js middleware for building Model Context Protocol servers using a simple, fluent API and supporting both SSE and HTTP transports. It enables
A lightweight Hono.js middleware for building Model Context Protocol servers using a simple, fluent API and supporting both SSE and HTTP transports. It enables developers to create type-safe, edge-ready MCP-compatible APIs with built-in session management.
Hono.js middleware for building Model Context Protocol (MCP) servers. Create MCP-compatible APIs with a simple, fluent interface — no decorators required.
server.tool(), server.resource(), server.prompt()npm install mcp-honojs hono
import { Hono } from 'hono';
import { McpServer } from 'mcp-honojs';
// Create MCP server
const mcp = new McpServer({
name: 'my-mcp-server',
version: '1.0.0',
});
// Register a tool
mcp.tool(
{
name: 'greet',
description: 'Greet someone by name',
inputSchema: {
type: 'object',
properties: {
name: { type: 'string', description: 'Name to greet' },
},
required: ['name'],
},
},
async (args) => {
return {
content: [{ type: 'text', text: `Hello, ${args.name}!` }],
};
}
);
// Create Hono app and attach MCP
const app = new Hono();
mcp.attach(app);
export default app;
Visit your endpoints:
GET /ssePOST /mcpconst mcp = new McpServer(options: McpServerOptions);
Options:
interface McpServerOptions {
name: string; // Server name
version: string; // Server version
session?: {
timeout?: number; // Session timeout in ms (default: 30min)
cleanupInterval?: number; // Cleanup interval in ms (default: 5min)
maxSessions?: number; // Max concurrent sessions (default: 1000)
};
}
tool(options, handler) — Register a tool
mcp.tool(
{
name: 'add',
description: 'Add two numbers',
inputSchema: {
type: 'object',
properties: {
a: { type: 'number' },
b: { type: 'number' },
},
required: ['a', 'b'],
},
},
async (args, context) => {
return {
content: [
{ type: 'text', text: `Result: ${args.a + args.b}` }
],
};
}
);
resource(options, handler) — Register a resource
mcp.resource(
{
uri: 'example://data',
name: 'example-data',
description: 'Example data resource',
mimeType: 'application/json',
},
async (uri, context) => {
return {
contents: [
{
uri,
mimeType: 'application/json',
text: JSON.stringify({ data: 'example' }),
},
],
};
}
);
prompt(options, handler) — Register a prompt
mcp.prompt(
{
name: 'welcome',
description: 'Welcome prompt',
arguments: [
{ name: 'username', description: 'User name', required: true }
],
},
async (args, context) => {
return {
messages: [
{
role: 'user',
content: {
type: 'text',
text: `Welcome, ${args.username}!`,
},
},
],
};
}
);
attach(app, transportOptions?) — Attach transports to Hono app
mcp.attach(app, {
ssePath: '/sse', // SSE endpoint (default: /sse)
httpPath: '/mcp', // HTTP endpoint (default: /mcp)
});
sseMiddleware(path?) — Get SSE middleware
app.use(mcp.sseMiddleware('/custom-sse'));
httpMiddleware(path?) — Get HTTP middleware
app.use(mcp.httpMiddleware('/custom-mcp'));
Both tool and resource handlers receive a McpContext object:
interface McpContext {
sessionId?: string; // Current session ID
honoContext?: Context; // Hono request context
metadata?: Record<string, any>; // Custom metadata
}
Access the Hono context for request details:
mcp.tool({ /* ... */ }, async (args, context) => {
const userAgent = context.honoContext?.req.header('user-agent');
// ...
});
interface ToolResult {
content: ToolResultContent[];
isError?: boolean;
}
interface ToolResultContent {
type: 'text' | 'image' | 'resource';
text?: string;
data?: string; // Base64 for images
mimeType?: string;
uri?: string; // For resource references
}
interface ResourceResult {
contents: ResourceContent[];
}
interface ResourceContent {
uri: string;
mimeType?: string;
text?: string;
blob?: string; // Base64 encoded binary
}
interface PromptResult {
description?: string;
messages: PromptMessage[];
}
interface PromptMessage {
role: 'user' | 'assistant';
content: PromptMessageContent;
}
The server implements MCP's JSON-RPC 2.0 protocol.
initialize — Initialize connectiontools/list — List available toolstools/call — Execute a toolresources/list — List resourcesresources/templates/list — List resource templatesresources/read — Read a resourceprompts/list — List promptsprompts/get — Get a promptping — Health checkInitialize:
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize"
}
Call a tool:
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "greet",
"arguments": { "name": "Alice" }
}
}
Sessions are automatically managed:
x-session-id header (HTTP) or endpoint event (SSE)HTTP: Pass session ID in x-session-id header
SSE: Session is bound to the connection
See the examples/ directory for complete examples:
Run examples:
cd examples
npm install
npm run dev
| Feature | mcp-honojs | mcp-nestjs |
|---|---|---|
| Framework | Hono.js | NestJS |
| API Style | Fluent/functional | Decorator-based |
| DI Container | ❌ (not needed) | ✅ (NestJS) |
| Auto-discovery | ❌ | ✅ |
| Edge-ready | ✅ | Depends |
| Bundle size | Tiny | Larger |
| Use case | APIs, edge, serverless | Enterprise apps |
import { serve } from '@hono/node-server';
import app from './app';
serve({ fetch: app.fetch, port: 3000 });
export default app;
import { serve } from 'https://deno.land/std/http/server.ts';
serve(app.fetch);
export default {
fetch: app.fetch,
port: 3000,
};
Contributions welcome! Please open an issue or PR.
MIT © zahidhasanaunto
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"mcp-honojs": {
"command": "npx",
"args": []
}
}
}PRs, issues, code search, CI status
Database, auth and storage
Reference / test server with prompts, resources, and tools.
Secure file operations with configurable access controls.