diff --git a/src/browser/tools.zig b/src/browser/tools.zig index 550de743..0de9441a 100644 --- a/src/browser/tools.zig +++ b/src/browser/tools.zig @@ -1290,7 +1290,7 @@ fn execGetCookies(arena: std.mem.Allocator, session: *lp.Session, arguments: ?st if (args.all) break :blk null; if (args.url) |u| break :blk arena.dupeZ(u8, u) catch return ToolError.InternalError; if (session.currentFrame()) |f| break :blk f.url; - break :blk null; + return "No current page. Pass `url` to filter by host or `all=true` to list every cookie."; }; const host: ?[]const u8 = if (filter_url) |u| lp.URL.getHostname(u) else null; diff --git a/src/mcp/tools.zig b/src/mcp/tools.zig index 8dd05356..96443b05 100644 --- a/src/mcp/tools.zig +++ b/src/mcp/tools.zig @@ -1006,6 +1006,23 @@ test "MCP - getCookies: defaults to current page, url filter, all flag" { try testing.expect(std.mem.indexOf(u8, out.written(), "No cookies for http://nope.test/") != null); } +test "MCP - getCookies without a loaded page refuses instead of dumping the jar" { + defer testing.reset(); + var out: std.io.Writer.Allocating = .init(testing.arena_allocator); + var server = try Server.init(testing.allocator, testing.test_app, &out.writer); + defer server.deinit(); + + try server.session.cookie_jar.populateFromResponse("http://example.com/", "session=abc; Path=/"); + + const msg = + \\{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"getCookies"}} + ; + try router.handleMessage(server, testing.arena_allocator, msg); + const written = out.written(); + try testing.expect(std.mem.indexOf(u8, written, "session=abc") == null); + try testing.expect(std.mem.indexOf(u8, written, "No current page") != null); +} + test "MCP - goto with bad waitUntil surfaces rich error" { defer testing.reset(); var out: std.io.Writer.Allocating = .init(testing.arena_allocator);