mcp: use declarative static definitions for tools and resources

This commit is contained in:
Adrià Arrufat
2026-03-01 21:56:48 +09:00
parent 952dfbef36
commit e9c36fd6f8
4 changed files with 108 additions and 117 deletions

View File

@@ -9,12 +9,92 @@ const Selector = @import("../browser/webapi/selector/Selector.zig");
const protocol = @import("protocol.zig");
const Server = @import("Server.zig");
pub const tool_list = [_]protocol.Tool{
.{
.name = "goto",
.description = "Navigate to a specified URL and load the page in memory so it can be reused later for info extraction.",
.inputSchema = .{ .json =
\\{
\\ "type": "object",
\\ "properties": {
\\ "url": { "type": "string", "description": "The URL to navigate to, must be a valid URL." }
\\ },
\\ "required": ["url"]
\\}
},
},
.{
.name = "search",
.description = "Use a search engine to look for specific words, terms, sentences. The search page will then be loaded in memory.",
.inputSchema = .{ .json =
\\{
\\ "type": "object",
\\ "properties": {
\\ "text": { "type": "string", "description": "The text to search for, must be a valid search query." }
\\ },
\\ "required": ["text"]
\\}
},
},
.{
.name = "markdown",
.description = "Get the page content in markdown format. If a url is provided, it navigates to that url first.",
.inputSchema = .{ .json =
\\{
\\ "type": "object",
\\ "properties": {
\\ "url": { "type": "string", "description": "Optional URL to navigate to before fetching markdown." }
\\ }
\\}
},
},
.{
.name = "links",
.description = "Extract all links in the opened page. If a url is provided, it navigates to that url first.",
.inputSchema = .{ .json =
\\{
\\ "type": "object",
\\ "properties": {
\\ "url": { "type": "string", "description": "Optional URL to navigate to before extracting links." }
\\ }
\\}
},
},
.{
.name = "evaluate",
.description = "Evaluate JavaScript in the current page context. If a url is provided, it navigates to that url first.",
.inputSchema = .{ .json =
\\{
\\ "type": "object",
\\ "properties": {
\\ "script": { "type": "string" },
\\ "url": { "type": "string", "description": "Optional URL to navigate to before evaluating." }
\\ },
\\ "required": ["script"]
\\}
},
},
.{
.name = "over",
.description = "Used to indicate that the task is over and give the final answer if there is any. This is the last tool to be called in a task.",
.inputSchema = .{ .json =
\\{
\\ "type": "object",
\\ "properties": {
\\ "result": { "type": "string", "description": "The final result of the task." }
\\ },
\\ "required": ["result"]
\\}
},
},
};
pub fn handleList(server: *Server, arena: std.mem.Allocator, req: protocol.Request) !void {
_ = arena;
const result = struct {
tools: []const protocol.Tool,
}{
.tools = server.tools,
.tools = &tool_list,
};
try server.sendResult(req.id.?, result);