tools: reject invalid backendNodeId in tree tool

This commit is contained in:
Adrià Arrufat
2026-05-24 11:25:41 +02:00
parent d469fdc88c
commit 4a58a9043e
2 changed files with 15 additions and 6 deletions

View File

@@ -818,12 +818,7 @@ fn execTree(arena: std.mem.Allocator, session: *lp.Session, registry: *CDPNode.R
const args = try parseArgsOrDefault(TreeParams, arena, arguments);
const page = try ensurePage(session, registry, args.url, args.timeout, args.waitUntil);
var root_node = page.document.asNode();
if (args.backendNodeId) |node_id| {
if (registry.lookup_by_id.get(node_id)) |n| {
root_node = n.dom;
}
}
const root_node = (try resolveOptionalNode(registry, args.backendNodeId)) orelse page.document.asNode();
const st = lp.SemanticTree{
.dom_node = root_node,

View File

@@ -627,6 +627,20 @@ test "MCP - scriptStep accepts comment line" {
try testing.expect(std.mem.indexOf(u8, out.written(), "\"isError\":true") == null);
}
test "MCP - tree rejects stale backendNodeId instead of dumping whole document" {
defer testing.reset();
var out: std.io.Writer.Allocating = .init(testing.arena_allocator);
const server = try testLoadPage("about:blank", &out.writer);
defer server.deinit();
const msg =
\\{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"tree","arguments":{"backendNodeId":999999}}}
;
try router.handleMessage(server, testing.arena_allocator, msg);
const written = out.written();
try testing.expect(std.mem.indexOf(u8, written, "NodeNotFound") != null);
}
test "MCP - PascalCase argument keys from LLMs are normalized to canonical" {
defer testing.reset();
var out: std.io.Writer.Allocating = .init(testing.arena_allocator);