import { StreamableHTTPTransport } from "@hono/mcp"; import { serve } from "@hono/node-server"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { Hono } from "hono"; import { registerFolderTools } from "./tools/folder.js"; import { registerHttpRequestTools } from "./tools/httpRequest.js"; import { registerToastTools } from "./tools/toast.js"; import { registerWindowTools } from "./tools/window.js"; import { registerWorkspaceTools } from "./tools/workspace.js"; import type { McpServerContext } from "./types.js"; export function createMcpServer(ctx: McpServerContext, port: number) { console.log("Creating MCP server on port", port); const mcpServer = new McpServer({ name: "yaak-mcp-server", version: "0.1.0", }); // Register all tools registerToastTools(mcpServer, ctx); registerHttpRequestTools(mcpServer, ctx); registerFolderTools(mcpServer, ctx); registerWindowTools(mcpServer, ctx); registerWorkspaceTools(mcpServer, ctx); const app = new Hono(); const transport = new StreamableHTTPTransport(); app.all("/mcp", async (c) => { if (!mcpServer.isConnected()) { // Connect the mcp with the transport await mcpServer.connect(transport); void ctx.yaak.toast.show({ message: `MCP Server connected`, icon: "info", color: "info", timeout: 5000, }); } return transport.handleRequest(c); }); const honoServer = serve( { port, hostname: "127.0.0.1", fetch: app.fetch, }, (info) => { console.log("Started MCP server on ", info.address); void ctx.yaak.toast.show({ message: `MCP Server running on http://127.0.0.1:${info.port}`, icon: "info", color: "secondary", timeout: 10000, }); }, ); return { server: mcpServer, close: async () => { await new Promise((resolve, reject) => { honoServer.close((err) => { if (err) reject(err); else resolve(); }); }); await mcpServer.close(); }, }; }