From 598fa254cf15f6a5bc8f7560299867ff062e4e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Sat, 21 Mar 2026 13:32:56 +0900 Subject: [PATCH] mcp: initialize server in mcpThread to avoid V8 isolate crashes When running mcp server, it initialized lp.mcp.Server in the main thread which also implicitly created the V8 isolate in the main thread. When processing requests (like calling the goto tool) inside mcpThread, V8 would assert that the isolate doesn't match the current thread. Fixes #1938 --- src/main.zig | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main.zig b/src/main.zig index ed5faa01..bf6468d6 100644 --- a/src/main.zig +++ b/src/main.zig @@ -150,12 +150,7 @@ fn run(allocator: Allocator, main_arena: Allocator) !void { log.opts.format = .logfmt; - var stdout = std.fs.File.stdout().writer(&.{}); - - var mcp_server: *lp.mcp.Server = try .init(allocator, app, &stdout.interface); - defer mcp_server.deinit(); - - var worker_thread = try std.Thread.spawn(.{}, mcpThread, .{ mcp_server, app }); + var worker_thread = try std.Thread.spawn(.{}, mcpThread, .{ allocator, app }); defer worker_thread.join(); app.network.run(); @@ -171,8 +166,16 @@ fn fetchThread(app: *App, url: [:0]const u8, fetch_opts: lp.FetchOpts) void { }; } -fn mcpThread(mcp_server: *lp.mcp.Server, app: *App) void { +fn mcpThread(allocator: std.mem.Allocator, app: *App) void { defer app.network.stop(); + + var stdout = std.fs.File.stdout().writer(&.{}); + var mcp_server: *lp.mcp.Server = lp.mcp.Server.init(allocator, app, &stdout.interface) catch |err| { + log.fatal(.mcp, "mcp init error", .{ .err = err }); + return; + }; + defer mcp_server.deinit(); + var stdin_buf: [64 * 1024]u8 = undefined; var stdin = std.fs.File.stdin().reader(&stdin_buf); lp.mcp.router.processRequests(mcp_server, &stdin.interface) catch |err| {