feat: P0 LLM-readiness — Chrome aislado (9333), tab_select determinista, page_get_text, page_perceive

This commit is contained in:
agent
2026-06-06 11:15:12 +02:00
parent 6ecaf9a969
commit 9af2e75246
7 changed files with 272 additions and 36 deletions
+23
View File
@@ -16,6 +16,7 @@ func registerNavTools(s *server.MCPServer, d *deps) {
// Tab tools use HTTP /json directly (no pool) — list/activate are read-only.
s.AddTool(tabListTool(), mcp.NewTypedToolHandler(d.handleTabList))
s.AddTool(tabActivateTool(), mcp.NewTypedToolHandler(d.handleTabActivate))
s.AddTool(tabSelectTool(), mcp.NewTypedToolHandler(d.handleTabSelect))
s.AddTool(pageWaitLoadTool(), mcp.NewTypedToolHandler(d.handlePageWaitLoad))
s.AddTool(pageWaitIdleTool(), mcp.NewTypedToolHandler(d.handlePageWaitIdle))
@@ -152,6 +153,28 @@ func (d *deps) handleTabActivate(_ context.Context, _ mcp.CallToolRequest, a tab
return mcp.NewToolResultText("activated tab " + a.TabID), nil
}
// ---- tab_select ----
type tabSelectArgs struct {
Port int `json:"port"`
Match string `json:"match"`
}
func tabSelectTool() mcp.Tool {
return mcp.NewTool("tab_select",
mcp.WithDescription("Fija la pestaña sobre la que operan las siguientes tools, eligiéndola por id o por substring de su URL (determinista). Úsala tras tab_list para no operar sobre la pestaña equivocada."),
mcp.WithNumber("port", mcp.Description("CDP port. Default 9333 (Chrome isolated del MCP); usa 9222 explícito solo para adjuntarte al navegador diario.")),
mcp.WithString("match", mcp.Description("Target id exacto o substring de la URL de la pestaña. Vacío = primera page.")),
)
}
func (d *deps) handleTabSelect(_ context.Context, _ mcp.CallToolRequest, a tabSelectArgs) (*mcp.CallToolResult, error) {
if _, err := d.pool.connectTarget(portOr(a.Port), a.Match); err != nil {
return mcp.NewToolResultError(err.Error()), nil
}
return mcp.NewToolResultText("selected target matching: " + a.Match), nil
}
// ---- nav_back (MUTA) ----
type navBackArgs struct {