index.ts•2.11 kB
import { Hono } from "hono";
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
import { toFetchResponse, toReqRes } from "fetch-to-node";
import renderReadme from "./readme";
import registerTools from "./tools";
import registerResources from "./resources";
const app = new Hono();
app.post("/mcp", async (c) => {
const { req, res } = toReqRes(c.req.raw);
const server = new McpServer(
{
name: `${process.env.MCP_OWNER_NAME} ME-MCP`,
version: "1.0.0",
},
{ capabilities: { logging: {} } }
);
server.server.onerror = console.error.bind(console);
registerTools(server);
registerResources(server);
try {
const transport: StreamableHTTPServerTransport =
new StreamableHTTPServerTransport({
sessionIdGenerator: undefined,
});
// Added for extra debuggability
transport.onerror = console.error.bind(console);
await server.connect(transport);
await transport.handleRequest(req, res, await c.req.json());
res.on("close", () => {
console.log("Request closed");
transport.close();
server.close();
});
return toFetchResponse(res);
} catch (e) {
console.error(e);
return c.json(
{
jsonrpc: "2.0",
error: {
code: -32603,
message: "Internal server error",
},
id: null,
},
{ status: 500 }
);
}
});
app.get("/mcp", async (c) => {
return c.json(
{
jsonrpc: "2.0",
error: {
code: -32000,
message: "Method not allowed.",
},
id: null,
},
{ status: 405 }
);
});
app.delete("/mcp", async (c) => {
return c.json(
{
jsonrpc: "2.0",
error: {
code: -32000,
message: "Method not allowed.",
},
id: null,
},
{ status: 405 }
);
});
// Static html server with instructions for using the server
app.get("/", (c) => {
return renderReadme(c, process.env.MCP_OWNER_NAME || "Owner");
});
export default app;