Better MCP server lifecycle

This commit is contained in:
Gregory Schier
2026-01-02 07:31:54 -08:00
parent 04eec0ee05
commit 2ccee0dc70
3 changed files with 24 additions and 15 deletions

View File

@@ -9,6 +9,7 @@ export const plugin: PluginDefinition = {
async init(ctx: Context) {
// Start the server after waiting, so there's an active window open to do things
// like show the startup toast.
console.log('Initializing MCP Server plugin');
setTimeout(() => {
mcpServer = createMcpServer({ yaak: ctx }, serverPort);
}, 5000);

View File

@@ -10,6 +10,7 @@ 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',
@@ -39,23 +40,32 @@ export function createMcpServer(ctx: McpServerContext, port: number) {
return transport.handleRequest(c);
});
const honoServer = serve({
port,
hostname: '127.0.0.1',
fetch: app.fetch,
});
ctx.yaak.toast.show({
message: `MCP Server running on port ${honoServer.address}`,
icon: 'info',
color: 'info',
timeout: 30000,
});
const honoServer = serve(
{
port,
hostname: '127.0.0.1',
fetch: app.fetch,
},
(info) => {
console.log('Started MCP server on ', info.address);
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 () => {
honoServer.close();
await new Promise<void>((resolve, reject) => {
honoServer.close((err) => {
if (err) reject(err);
else resolve();
});
});
await mcpServer.close();
},
};

View File

@@ -1,5 +1,4 @@
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import * as z from 'zod';
import type { McpServerContext } from '../types.js';
export function registerWorkspaceTools(server: McpServer, ctx: McpServerContext) {
@@ -8,7 +7,6 @@ export function registerWorkspaceTools(server: McpServer, ctx: McpServerContext)
{
title: 'List Workspaces',
description: 'List all open workspaces in Yaak',
inputSchema: z.object({}),
},
async () => {
const workspaces = await ctx.yaak.workspace.list();