From babe3c68ca3f47c01592a6ff211f586541b952f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A0=20Arrufat?= Date: Wed, 8 Apr 2026 13:01:21 +0200 Subject: [PATCH] tools: add getEnv tool to read environment variables --- src/browser/tools.zig | 12 ++++++++++++ src/mcp/tools.zig | 13 +++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/browser/tools.zig b/src/browser/tools.zig index 18c6b2c6..ad1213cb 100644 --- a/src/browser/tools.zig +++ b/src/browser/tools.zig @@ -55,6 +55,7 @@ const Action = enum { selectOption, setChecked, findElement, + getEnv, }; const action_map = std.StaticStringMap(Action).initComptime(.{ @@ -78,6 +79,7 @@ const action_map = std.StaticStringMap(Action).initComptime(.{ .{ "selectOption", .selectOption }, .{ "setChecked", .setChecked }, .{ "findElement", .findElement }, + .{ "getEnv", .getEnv }, }); /// Execute a tool by name. Returns the result text. @@ -113,6 +115,7 @@ pub fn call( .selectOption => execSelectOption(session, registry, arena, arguments), .setChecked => execSetChecked(session, registry, arena, arguments), .findElement => execFindElement(session, registry, arena, arguments), + .getEnv => execGetEnv(arena, arguments), }; } @@ -497,6 +500,15 @@ fn execFindElement(session: *lp.Session, registry: *CDPNode.Registry, arena: std return aw.written(); } +fn execGetEnv(arena: std.mem.Allocator, arguments: ?std.json.Value) ToolError![]const u8 { + const Params = struct { name: []const u8 }; + const args = parseArgsOrErr(Params, arena, arguments) orelse return ToolError.InvalidParams; + const name_z = arena.dupeZ(u8, args.name) catch return ToolError.InternalError; + const value = std.posix.getenv(name_z) orelse + return std.fmt.allocPrint(arena, "Environment variable '{s}' is not set", .{args.name}) catch ToolError.InternalError; + return value; +} + // --- Shared helpers --- fn ensurePage(session: *lp.Session, registry: *CDPNode.Registry, url: ?[:0]const u8, timeout: ?u32, waitUntil: ?lp.Config.WaitUntil) ToolError!*lp.Page { diff --git a/src/mcp/tools.zig b/src/mcp/tools.zig index e5160cdb..a824f6d3 100644 --- a/src/mcp/tools.zig +++ b/src/mcp/tools.zig @@ -241,6 +241,19 @@ pub const tool_list = [_]protocol.Tool{ \\} ), }, + .{ + .name = "getEnv", + .description = "Read the value of an environment variable. Useful for retrieving credentials or configuration without hardcoding them.", + .inputSchema = protocol.minify( + \\{ + \\ "type": "object", + \\ "properties": { + \\ "name": { "type": "string", "description": "The environment variable name to read." } + \\ }, + \\ "required": ["name"] + \\} + ), + }, }; pub fn handleList(server: *Server, arena: std.mem.Allocator, req: protocol.Request) !void {