Runtime Environments
StreamableHttpTransport runs anywhere the Fetch API is available.
Hono + Bun
Section titled “Hono + Bun”import { Hono } from "hono"import { McpServer, StreamableHttpTransport } from "mcp-lite"import { z } from "zod"
const server = new McpServer({ name: "my-server", version: "1.0.0", schemaAdapter: (schema) => z.toJSONSchema(schema as z.ZodType)}).tool("echo", { inputSchema: z.object({ message: z.string() }), handler: (args) => ({ content: [{ type: "text", text: args.message }] })})
const transport = new StreamableHttpTransport()const handler = transport.bind(server)const app = new Hono()app.all("/mcp", (c) => handler(c.req.raw))export default appRun with:
bun run server.tsCloudflare Workers
Section titled “Cloudflare Workers”Stateless starter (plug adapters into KV / Durable Objects for production):
import { McpServer, StreamableHttpTransport } from "mcp-lite"import { z } from "zod"
export default { async fetch(request: Request): Promise<Response> { const server = new McpServer({ name: "worker-server", version: "1.0.0", schemaAdapter: (schema) => z.toJSONSchema(schema as z.ZodType) }).tool("echo", { inputSchema: z.object({ message: z.string() }), handler: (args) => ({ content: [{ type: "text", text: args.message }] }) })
const transport = new StreamableHttpTransport() return transport.bind(server)(request) }}Deploy with:
wrangler deployNext.js App Router
Section titled “Next.js App Router”import { McpServer, StreamableHttpTransport } from "mcp-lite"import { z } from "zod"
const server = new McpServer({ name: "nextjs-server", version: "1.0.0", schemaAdapter: (schema) => z.toJSONSchema(schema as z.ZodType)}).tool("echo", { inputSchema: z.object({ message: z.string() }), handler: (args) => ({ content: [{ type: "text", text: args.message }] })})
const handler = new StreamableHttpTransport().bind(server)
export const POST = handlerexport const GET = handlerPlace in app/api/mcp/route.ts.
Node.js with Express
Section titled “Node.js with Express”import express from "express"import { McpServer, StreamableHttpTransport } from "mcp-lite"import { z } from "zod"
const server = new McpServer({ name: "express-server", version: "1.0.0", schemaAdapter: (schema) => z.toJSONSchema(schema as z.ZodType)}).tool("echo", { inputSchema: z.object({ message: z.string() }), handler: (args) => ({ content: [{ type: "text", text: args.message }] })})
const transport = new StreamableHttpTransport()const mcpHandler = transport.bind(server)
const app = express()
app.all("/mcp", async (req, res) => { const response = await mcpHandler( new Request(`http://localhost:${req.socket.localPort}${req.url}`, { method: req.method, headers: req.headers as HeadersInit, body: req.method !== "GET" && req.method !== "HEAD" ? JSON.stringify(req.body) : undefined, }) )
res.status(response.status) response.headers.forEach((value, key) => { res.setHeader(key, value) })
const body = await response.text() res.send(body)})
app.listen(3000)import { McpServer, StreamableHttpTransport } from "mcp-lite"import { z } from "zod"
const server = new McpServer({ name: "deno-server", version: "1.0.0", schemaAdapter: (schema) => z.toJSONSchema(schema as z.ZodType)}).tool("echo", { inputSchema: z.object({ message: z.string() }), handler: (args) => ({ content: [{ type: "text", text: args.message }] })})
const transport = new StreamableHttpTransport()const handler = transport.bind(server)
Deno.serve(handler)Run with:
deno run --allow-net server.tsNext Steps
Section titled “Next Steps”- Deployment Patterns - Learn scaling strategies
- Adapters - Add persistence