package main import ( "context" "fmt" "math/rand" "time" "github.com/mark3labs/mcp-go/mcp" "github.com/mark3labs/mcp-go/server" "fn-registry/functions/browser" ) // registerDomTools wires DOM interaction tools. find/wait stay on under --read-only. func registerDomTools(s *server.MCPServer, d *deps) { s.AddTool(domFindByTextTool(), mcp.NewTypedToolHandler(d.handleDomFindByText)) s.AddTool(domFindRefByTextTool(), mcp.NewTypedToolHandler(d.handleDomFindRefByText)) s.AddTool(domWaitElementTool(), mcp.NewTypedToolHandler(d.handleDomWaitElement)) if !d.readOnly { s.AddTool(domClickTool(), mcp.NewTypedToolHandler(d.handleDomClick)) s.AddTool(domClickHumanTool(), mcp.NewTypedToolHandler(d.handleDomClickHuman)) s.AddTool(domClickTextTool(), mcp.NewTypedToolHandler(d.handleDomClickText)) s.AddTool(domTypeTool(), mcp.NewTypedToolHandler(d.handleDomType)) s.AddTool(domClickRefTool(), mcp.NewTypedToolHandler(d.handleDomClickRef)) s.AddTool(domTypeRefTool(), mcp.NewTypedToolHandler(d.handleDomTypeRef)) s.AddTool(domHoverRefTool(), mcp.NewTypedToolHandler(d.handleDomHoverRef)) s.AddTool(domClickXYTool(), mcp.NewTypedToolHandler(d.handleDomClickXY)) s.AddTool(domSelectOptionTool(), mcp.NewTypedToolHandler(d.handleDomSelectOption)) s.AddTool(domSetFilesTool(), mcp.NewTypedToolHandler(d.handleDomSetFiles)) } } // ---- dom_select_option (MUTA) ---- type domSelectOptionArgs struct { Port int `json:"port"` Selector string `json:"selector"` Value string `json:"value"` } func domSelectOptionTool() mcp.Tool { return mcp.NewTool("dom_select_option", mcp.WithDescription("Select an