{
  "openapi": "3.0.3",
  "info": {
    "title": "Owl Browser API",
    "description": "REST API for browser automation with anti-detection capabilities",
    "version": "1.1.2"
  },
  "servers": [
    {
      "url": "http://localhost",
      "description": "Current server"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer"
      }
    }
  },
  "paths": {
    "/go": {
      "get": {
        "summary": "Browser Go",
        "description": "One-shot browser navigation tool. Creates a new context, navigates to the URL, waits for page load, extracts the HTML, and closes the context. Optimized for single-page scraping or rendering tasks. Supports both GET and POST requests.",
        "tags": [
          "Navigation"
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The full URL to navigate to, including protocol (e.g., 'https://example.com'). Supports http://, https://, file://, and data: URLs"
          },
          {
            "name": "wait_until",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "",
                "load",
                "domcontentloaded",
                "networkidle",
                "fullscroll"
              ]
            },
            "description": "When to consider navigation complete: '' (return immediately), 'load' (wait for load event), 'domcontentloaded' (wait for DOMContentLoaded), 'networkidle' (wait for network to be idle, default), 'fullscroll' (scroll full page to trigger lazy loading, then scroll back to top)"
          },
          {
            "name": "timeout",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Maximum time to wait for navigation in milliseconds. Default: 30000 (30 seconds)"
          },
          {
            "name": "output",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "html",
                "text",
                "markdown",
                "pngView",
                "pngFull"
              ]
            },
            "description": "Output format. html=raw HTML, text=extracted text, markdown=markdown conversion, pngView=viewport screenshot as PNG image, pngFull=fullpage screenshot as PNG image. Default: html"
          },
          {
            "name": "os",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "windows",
                "macos",
                "linux"
              ]
            },
            "description": "Filter profiles by operating system. Options: 'windows', 'macos', 'linux'"
          },
          {
            "name": "use_tor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Use TOR proxy for anonymous browsing. Each request gets a unique exit IP. Default: false"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/search": {
      "get": {
        "summary": "Browser Search",
        "description": "One-shot web search tool. Creates a new context, navigates to the search engine, waits for results, extracts structured JSON search results (titles, URLs, snippets), and closes the context. Supports Google and DuckDuckGo with pagination.",
        "tags": [
          "Navigation"
        ],
        "parameters": [
          {
            "name": "query",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "The search query string (e.g., 'best restaurants in NYC', 'python tutorial')"
          },
          {
            "name": "provider",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "duckduckgo",
                "google"
              ]
            },
            "description": "Search engine provider. 'duckduckgo' uses DuckDuckGo HTML-lite, 'google' uses Google Search. Default: duckduckgo"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Page number for paginated results (1-based). Default: 1. For Google: appends &start=((page-1)*10). For DuckDuckGo: appends &s=((page-1)*10)"
          },
          {
            "name": "os",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "windows",
                "macos",
                "linux"
              ]
            },
            "description": "Filter profiles by operating system. Options: 'windows', 'macos', 'linux'"
          },
          {
            "name": "use_tor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Use TOR proxy for anonymous browsing. Each request gets a unique exit IP. Default: false"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response with structured search results JSON"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_create_context": {
      "post": {
        "summary": "Browser Create Context",
        "description": "Create a new isolated browser context with its own cookies, storage, and optional proxy configuration. Each context acts as an independent browser session. Use this to create multiple isolated browsing sessions, configure proxy/Tor connections, load browser profiles with saved fingerprints, and enable/disable LLM features. Returns a context_id to use with other browser tools.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "profile_path": {
                    "type": "string",
                    "description": "Path to a browser profile JSON file (or upload file via multipart/form-data). If the file exists, loads fingerprints, cookies, and settings. If not, creates a new profile and saves it to this path. Encrypted profiles (from browser_download_profile) are automatically detected and decrypted."
                  },
                  "os": {
                    "type": "string",
                    "description": "Filter profiles by operating system. If set, only profiles matching this OS will be used. Options: 'windows', 'macos', 'linux'",
                    "enum": [
                      "windows",
                      "macos",
                      "linux"
                    ]
                  },
                  "gpu": {
                    "type": "string",
                    "description": "Filter profiles by GPU vendor/model. If set, only profiles with matching GPU will be used. Examples: 'nvidia', 'amd', 'intel'"
                  },
                  "screen_size": {
                    "type": "string",
                    "description": "Screen resolution for the browser context. Format: 'WIDTHxHEIGHT'. If not set, a random screen size is selected from the monitor catalog.",
                    "enum": [
                      "1920x1080",
                      "2560x1440",
                      "3440x1440",
                      "3840x2160",
                      "3840x1600",
                      "5120x2160",
                      "5120x1440"
                    ]
                  },
                  "timezone": {
                    "type": "string",
                    "description": "Override browser timezone. IANA timezone format (e.g., 'America/New_York', 'Europe/London', 'Asia/Tokyo'). If not set, falls back to: 1) proxy-detected timezone (if proxy configured with spoof_timezone), 2) VM profile timezone, 3) system default. This parameter works without proxy configuration."
                  },
                  "resource_blocking": {
                    "type": "boolean",
                    "description": "Enable or disable resource blocking (ads, trackers, analytics). When enabled, blocks requests to known ad networks, trackers, and analytics services. Default: true (enabled)"
                  },
                  "chrome_version_id": {
                    "type": "string",
                    "description": "Pin this context to a specific row in the chrome_versions table (FK by id, 1..N matching INSERT order sorted by major). Use chrome_version_major instead if you'd rather think in terms of '147'. Mutually exclusive with chrome_version_major; chrome_version_id wins when both are set. 0 / unset = random selection across all chrome_version_ids matching the os/gpu/screen filters."
                  },
                  "chrome_version_major": {
                    "type": "string",
                    "description": "Pin this context to a specific Chrome major. Resolved to chrome_version_id by looking up the chrome_versions row whose major matches. Options: '143', '144', '145', '146', '147', '148' (current 6-major roster).",
                    "enum": [
                      "143",
                      "144",
                      "145",
                      "146",
                      "147",
                      "148"
                    ]
                  },
                  "proxy_type": {
                    "type": "string",
                    "description": "Type of proxy server to use. Options: 'http', 'https', 'socks4', 'socks5', 'socks5h', 'gae'. Use 'socks5h' for remote DNS resolution (recommended for privacy). Use 'gae' for private app proxy",
                    "enum": [
                      "http",
                      "https",
                      "socks4",
                      "socks5",
                      "socks5h",
                      "gae"
                    ]
                  },
                  "proxy_host": {
                    "type": "string",
                    "description": "Proxy server hostname or IP address (e.g., '127.0.0.1' or 'proxy.example.com')"
                  },
                  "proxy_port": {
                    "type": "string",
                    "description": "Proxy server port number (e.g., 8080 for HTTP proxy, 9050 for Tor)"
                  },
                  "proxy_username": {
                    "type": "string",
                    "description": "Username for proxy authentication. Only required if the proxy server requires credentials"
                  },
                  "proxy_password": {
                    "type": "string",
                    "description": "Password for proxy authentication. Only required if the proxy server requires credentials"
                  },
                  "proxy_stealth": {
                    "type": "boolean",
                    "description": "Enable stealth mode to prevent proxy/VPN detection. Blocks WebRTC leaks and other detection vectors. Default: true when proxy is configured"
                  },
                  "proxy_ca_cert_path": {
                    "type": "string",
                    "description": "Path to custom CA certificate file (.pem, .crt, .cer) for SSL interception proxies. Required when using Charles Proxy, mitmproxy, or similar HTTPS inspection tools"
                  },
                  "proxy_ca_key_path": {
                    "type": "string",
                    "description": "Path to CA private key file for GAE/private app proxy MITM. Required for generating per-domain certificates when using 'gae' proxy type"
                  },
                  "proxy_trust_custom_ca": {
                    "type": "boolean",
                    "description": "Trust the custom CA certificate for SSL interception. Enable when using Charles Proxy, mitmproxy, or similar tools that intercept HTTPS traffic. Default: false"
                  },
                  "is_tor": {
                    "type": "boolean",
                    "description": "Explicitly mark this proxy as a Tor connection. Enables circuit isolation so each context gets a unique exit node IP. Auto-detected if proxy is localhost:9050 or localhost:9150 with socks5/socks5h"
                  },
                  "tor_control_port": {
                    "type": "string",
                    "description": "Tor control port for circuit isolation. Used to send SIGNAL NEWNYM to get a new exit node. Default: auto-detect (tries 9051 then 9151). Set to -1 to disable circuit isolation"
                  },
                  "tor_control_password": {
                    "type": "string",
                    "description": "Password for Tor control port authentication. Leave empty to use cookie authentication (default) or no auth"
                  },
                  "llm_enabled": {
                    "type": "boolean",
                    "description": "Enable or disable LLM features for this context. When enabled, allows using AI-powered tools like browser_query_page, browser_summarize_page, and browser_nla. Default: true"
                  },
                  "llm_use_builtin": {
                    "type": "boolean",
                    "description": "Use the built-in llama-server for LLM inference. When true, uses the bundled local model. Set to false to use an external LLM provider. Default: true"
                  },
                  "llm_endpoint": {
                    "type": "string",
                    "description": "External LLM API endpoint URL (e.g., 'https://api.openai.com/v1' for OpenAI). Only used when llm_use_builtin is false"
                  },
                  "llm_model": {
                    "type": "string",
                    "description": "External LLM model name (e.g., 'gpt-4-vision-preview' for OpenAI). Only used when llm_use_builtin is false"
                  },
                  "llm_api_key": {
                    "type": "string",
                    "description": "API key for the external LLM provider. Required when using external LLM endpoint"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_close_context": {
      "post": {
        "summary": "Browser Close Context",
        "description": "Close a browser context and release all associated resources including cookies, storage, and network connections. Always close contexts when done to free up memory. Any ongoing operations in the context will be terminated.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context to close (e.g., 'ctx_000001'). Obtained from browser_create_context or browser_list_contexts"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_list_contexts": {
      "post": {
        "summary": "Browser List Contexts",
        "description": "List all currently active browser contexts with their IDs, creation time, current URL, and state. Useful for managing multiple browser sessions and checking which contexts are still open.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_navigate": {
      "post": {
        "summary": "Browser Navigate",
        "description": "Navigate the browser to a specified URL. This is a non-blocking operation that starts navigation and returns immediately. Use browser_wait_for_network_idle or browser_wait_for_selector to wait for the page to fully load. Supports HTTP, HTTPS, file, and data URLs. When wait_until is set (load, networkidle, fullscroll, domcontentloaded) and the page declares WebMCP tools, the response includes a webmcp_tools array containing the full tool definitions (name, description, inputSchema). Use browser_webmcp_call_tool to execute any of these tools directly.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context to navigate (e.g., 'ctx_000001')"
                  },
                  "url": {
                    "type": "string",
                    "description": "The full URL to navigate to, including protocol (e.g., 'https://example.com'). Supports http://, https://, file://, and data: URLs"
                  },
                  "wait_until": {
                    "type": "string",
                    "description": "When to consider navigation complete: '' (return immediately, default), 'load' (wait for load event), 'domcontentloaded' (wait for DOMContentLoaded), 'networkidle' (wait for network to be idle), 'fullscroll' (scroll full page to trigger lazy loading, then scroll back to top)",
                    "enum": [
                      "",
                      "load",
                      "domcontentloaded",
                      "networkidle",
                      "fullscroll"
                    ]
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Maximum time to wait for navigation in milliseconds. Only used when wait_until is set. Default: 30000 (30 seconds)"
                  }
                },
                "required": [
                  "context_id",
                  "url"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_reload": {
      "post": {
        "summary": "Browser Reload",
        "description": "Reload the current page. Optionally bypass the browser cache for a hard reload that fetches all resources fresh from the server. Useful when testing changes or clearing stale cached content.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "ignore_cache": {
                    "type": "boolean",
                    "description": "When true, performs a hard reload that bypasses the browser cache and fetches all resources from the server. Equivalent to Ctrl+Shift+R. Default: false (normal reload using cache)"
                  },
                  "wait_until": {
                    "type": "string",
                    "description": "When to consider reload complete: '' (return immediately), 'load' (wait for load event, default), 'domcontentloaded' (wait for DOMContentLoaded), 'networkidle' (wait for network to be idle), 'fullscroll' (scroll full page to trigger lazy loading, then scroll back to top)",
                    "enum": [
                      "",
                      "load",
                      "domcontentloaded",
                      "networkidle",
                      "fullscroll"
                    ]
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Maximum time to wait for reload in milliseconds. Only used when wait_until is set. Default: 30000 (30 seconds)"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_go_back": {
      "post": {
        "summary": "Browser Go Back",
        "description": "Navigate back to the previous page in the browser's history stack. Equivalent to clicking the browser's back button. Does nothing if there is no previous page in history.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "wait_until": {
                    "type": "string",
                    "description": "When to consider navigation complete: '' (return immediately), 'load' (wait for load event, default), 'domcontentloaded' (wait for DOMContentLoaded), 'networkidle' (wait for network to be idle), 'fullscroll' (scroll full page to trigger lazy loading, then scroll back to top)",
                    "enum": [
                      "",
                      "load",
                      "domcontentloaded",
                      "networkidle",
                      "fullscroll"
                    ]
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Maximum time to wait for navigation in milliseconds. Only used when wait_until is set. Default: 30000 (30 seconds)"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_go_forward": {
      "post": {
        "summary": "Browser Go Forward",
        "description": "Navigate forward to the next page in the browser's history stack. Equivalent to clicking the browser's forward button. Only works after using browser_go_back. Does nothing if there is no forward history.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "wait_until": {
                    "type": "string",
                    "description": "When to consider navigation complete: '' (return immediately), 'load' (wait for load event, default), 'domcontentloaded' (wait for DOMContentLoaded), 'networkidle' (wait for network to be idle), 'fullscroll' (scroll full page to trigger lazy loading, then scroll back to top)",
                    "enum": [
                      "",
                      "load",
                      "domcontentloaded",
                      "networkidle",
                      "fullscroll"
                    ]
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Maximum time to wait for navigation in milliseconds. Only used when wait_until is set. Default: 30000 (30 seconds)"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_can_go_back": {
      "post": {
        "summary": "Browser Can Go Back",
        "description": "Check if navigation back is possible. Returns true if there is a previous page in the browser history, false otherwise. Use before calling browser_go_back to avoid no-op calls.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_can_go_forward": {
      "post": {
        "summary": "Browser Can Go Forward",
        "description": "Check if navigation forward is possible. Returns true if there is a next page in the browser history (after going back), false otherwise. Use before calling browser_go_forward.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_set_content": {
      "post": {
        "summary": "Browser Set Content",
        "description": "Set the page's HTML content directly. Replaces the current page content with the provided HTML. The page URL will be 'about:blank'. Useful for rendering HTML templates, testing, or injecting content without making a network request.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "html": {
                    "type": "string",
                    "description": "The HTML content to set as the page body. Can be a full HTML document or a fragment. The page URL will be set to 'about:blank'"
                  }
                },
                "required": [
                  "context_id",
                  "html"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_click": {
      "post": {
        "summary": "Browser Click",
        "description": "Click on an element using CSS selector, XY coordinates, or natural language description. Supports semantic element finding using AI - describe what you want to click (e.g., 'login button', 'search icon') and the system will locate the right element. Simulates a real mouse click with proper event dispatch. Optionally hold the mouse button for press-and-hold interactions using hold_ms.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "Target element to click. Accepts: CSS selector (e.g., '#submit-btn', '.nav-link'), XY coordinates as 'Xx Y' (e.g., '100x200'), or natural language description (e.g., 'login button', 'search icon'). Semantic descriptions use AI to find the element"
                  },
                  "hold_ms": {
                    "type": "string",
                    "description": "Duration in milliseconds to hold the mouse button down before releasing. Use for press-and-hold interactions (e.g., long press menus, drag initiation). Default: 0 (immediate click)"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, click the Nth element (0-based). Uses querySelectorAll()[index] instead of querySelector(). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_type": {
      "post": {
        "summary": "Browser Type",
        "description": "Type text into an input field with human-like keystroke simulation. Target the field using CSS selector, coordinates, or natural language (e.g., 'email field'). When selector is omitted, types into the currently focused element. Note: Does NOT clear existing content - use browser_clear_input first if you need to replace text rather than append.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "Target input field. Accepts: CSS selector (e.g., '#email', 'input[name=\"username\"]'), XY coordinates (e.g., '100x200'), or natural language description (e.g., 'email field', 'search box'). When omitted, types into the currently focused element (document.activeElement)"
                  },
                  "text": {
                    "type": "string",
                    "description": "The text to type into the input field. Simulates real keystrokes with human-like timing. Existing content is NOT cleared - use browser_clear_input first if needed"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, target the Nth element (0-based). Uses querySelectorAll()[index] instead of querySelector(). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "text"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_pick": {
      "post": {
        "summary": "Browser Pick",
        "description": "Select an option from a dropdown or select element. Works with native HTML select elements and dynamic/custom dropdowns (like select2, react-select). Specify the option by its value or visible text. Automatically handles opening the dropdown and selecting the option.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "Target dropdown/select element. Accepts CSS selector (e.g., '#country', 'select[name=\"size\"]') or natural language description (e.g., 'country dropdown', 'size selector')"
                  },
                  "value": {
                    "type": "string",
                    "description": "The option to select. Can be the option's value attribute OR the visible display text. Works with both native select elements and dynamic dropdowns (select2, etc.)"
                  }
                },
                "required": [
                  "context_id",
                  "selector",
                  "value"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_press_key": {
      "post": {
        "summary": "Browser Press Key",
        "description": "Press a keyboard key. Supports special keys (Enter, Tab, Escape, arrow keys, etc.) and single characters (a-z, A-Z, 0-9). The key is sent to the currently focused element. Common uses: Enter to submit forms, Tab to move between fields, Escape to close modals, Arrow keys for navigation in menus or sliders, or single characters for keyboard shortcuts.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "key": {
                    "type": "string",
                    "description": "Key to press. Supports special keys: 'Enter', 'Tab', 'Escape', 'Backspace', 'Delete', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Space', 'Home', 'End', 'PageUp', 'PageDown'. Also supports single characters: 'a'-'z', 'A'-'Z', '0'-'9'. The key is sent to the currently focused element"
                  }
                },
                "required": [
                  "context_id",
                  "key"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_submit_form": {
      "post": {
        "summary": "Browser Submit Form",
        "description": "Submit the currently focused form by simulating an Enter key press. Equivalent to pressing Enter in a form field. Useful for search boxes and forms that submit on Enter. The form must have a focused input element.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_drag_drop": {
      "post": {
        "summary": "Browser Drag Drop",
        "description": "Perform a mouse drag operation from start coordinates to end coordinates. Used for slider CAPTCHAs, puzzle solving, canvas drawing, and custom drag interactions. Uses realistic mouse movement with bezier curves. For HTML5 draggable elements, use browser_html5_drag_drop instead.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "start_x": {
                    "type": "number",
                    "description": "X coordinate (in pixels from left edge) where the drag starts. Use browser_get_bounding_box to find element positions"
                  },
                  "start_y": {
                    "type": "number",
                    "description": "Y coordinate (in pixels from top edge) where the drag starts"
                  },
                  "end_x": {
                    "type": "number",
                    "description": "X coordinate (in pixels from left edge) where the drag ends (drop location)"
                  },
                  "end_y": {
                    "type": "number",
                    "description": "Y coordinate (in pixels from top edge) where the drag ends (drop location)"
                  },
                  "mid_points": {
                    "type": "string",
                    "description": "Optional array of intermediate [x, y] coordinates for the drag path. Creates a more realistic drag movement through multiple waypoints. Format: [[x1, y1], [x2, y2], ...]. Example: [[300, 200], [400, 250]]"
                  }
                },
                "required": [
                  "context_id",
                  "start_x",
                  "start_y",
                  "end_x",
                  "end_y"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_html5_drag_drop": {
      "post": {
        "summary": "Browser Html5 Drag Drop",
        "description": "Perform HTML5 drag and drop using proper DragEvent dispatch. Use this for elements with draggable='true' attribute, sortable lists, and interfaces using the HTML5 Drag and Drop API. Dispatches dragstart, dragover, drop, and dragend events in the correct sequence.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "source_selector": {
                    "type": "string",
                    "description": "CSS selector for the draggable source element (must have draggable='true' attribute). Example: '.drag-item', '[data-id=\"item-1\"]'"
                  },
                  "target_selector": {
                    "type": "string",
                    "description": "CSS selector for the drop target element. The element that will receive the dropped item. Example: '.drop-zone', '#target-container'"
                  }
                },
                "required": [
                  "context_id",
                  "source_selector",
                  "target_selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_mouse_move": {
      "post": {
        "summary": "Browser Mouse Move",
        "description": "Move the mouse cursor along a natural curved path from start to end position. Uses bezier curves with random variation, micro-jitter, and easing for human-like movement. Essential for avoiding bot detection on sites that track mouse movement patterns.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "start_x": {
                    "type": "number",
                    "description": "Starting X coordinate (in pixels) - typically the current mouse position"
                  },
                  "start_y": {
                    "type": "number",
                    "description": "Starting Y coordinate (in pixels) - typically the current mouse position"
                  },
                  "end_x": {
                    "type": "number",
                    "description": "Target X coordinate (in pixels) where the mouse should move to"
                  },
                  "end_y": {
                    "type": "number",
                    "description": "Target Y coordinate (in pixels) where the mouse should move to"
                  },
                  "steps": {
                    "type": "number",
                    "description": "Number of intermediate points along the path. More steps = smoother movement. Default: auto-calculated based on distance. Recommended: 0 for auto, or 10-50 for custom"
                  },
                  "stop_points": {
                    "type": "string",
                    "description": "Optional array of [x, y] coordinates where the cursor pauses briefly (50-150ms). Useful for simulating human hesitation or visual scanning behavior. Format: [[x1, y1], [x2, y2], ...]. Example: [[200, 150], [350, 250]]"
                  }
                },
                "required": [
                  "context_id",
                  "start_x",
                  "start_y",
                  "end_x",
                  "end_y"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_hover": {
      "post": {
        "summary": "Browser Hover",
        "description": "Hover over an element without clicking. Triggers hover effects like tooltips, dropdown menus, and CSS :hover styles. Useful for revealing hidden content or previewing actions before clicking.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector, position coordinates (e.g., '100x200'), or natural language description of the element to hover over"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, target the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_double_click": {
      "post": {
        "summary": "Browser Double Click",
        "description": "Double-click an element. Common uses include selecting text, opening items in file managers, and triggering edit mode in editable interfaces.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector, position coordinates (e.g., '100x200'), or natural language description of the element to double-click"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, target the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_right_click": {
      "post": {
        "summary": "Browser Right Click",
        "description": "Right-click (context click) on an element to open the context menu. Useful for accessing secondary actions like 'Open in new tab', 'Copy link', or custom application menus.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector, position coordinates (e.g., '100x200'), or natural language description of the element to right-click"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, target the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_clear_input": {
      "post": {
        "summary": "Browser Clear Input",
        "description": "Clear all text content from an input field. Use this before browser_type to replace text rather than append to existing content. Selects all text and deletes it.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the input element to clear"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, target the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_focus": {
      "post": {
        "summary": "Browser Focus",
        "description": "Set focus to an element without clicking it. The element receives keyboard events and becomes the active element. Useful for preparing to type or when click would trigger unwanted actions.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the element to focus"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, target the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_blur": {
      "post": {
        "summary": "Browser Blur",
        "description": "Remove focus from an element. Often triggers validation on form fields. Useful for forcing validation or removing focus from the current element.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the element to remove focus from"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_select_all": {
      "post": {
        "summary": "Browser Select All",
        "description": "Select all text content within an input element. Equivalent to Ctrl+A within the field. Useful before typing to replace content or for copying the entire field value.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the input element to select all text in"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_keyboard_combo": {
      "post": {
        "summary": "Browser Keyboard Combo",
        "description": "Press a keyboard combination with modifiers. Supports Ctrl, Shift, Alt, Meta/Cmd modifiers. Examples: 'Ctrl+A' (select all), 'Ctrl+C' (copy), 'Ctrl+V' (paste), 'Ctrl+Shift+N' (new window).",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "combo": {
                    "type": "string",
                    "description": "Key combination string using modifiers and keys. Supports Ctrl, Shift, Alt, Meta/Cmd. Examples: 'Ctrl+A', 'Ctrl+Shift+N', 'Meta+V', 'Shift+Enter'"
                  }
                },
                "required": [
                  "context_id",
                  "combo"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_upload_file": {
      "post": {
        "summary": "Browser Upload File",
        "description": "Upload files to a file input element. Programmatically sets the files on an input[type='file'] element. Supports multiple files if the input accepts them. File paths must be absolute paths on the server.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector for the file input element (e.g., 'input[type=\"file\"]', '#file-upload')"
                  },
                  "file_paths": {
                    "type": "string",
                    "description": "Array of file paths to upload. Can be a JSON array string or actual array. For JSON input use server paths. For multipart upload, files are saved to temp paths automatically."
                  }
                },
                "required": [
                  "context_id",
                  "selector",
                  "file_paths"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_is_visible": {
      "post": {
        "summary": "Browser Is Visible",
        "description": "Check if an element is visible on the page. Returns true if the element exists, is displayed (not hidden), and has non-zero dimensions. Useful for conditional logic based on visibility.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the element to check visibility for"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, check the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_is_enabled": {
      "post": {
        "summary": "Browser Is Enabled",
        "description": "Check if an element is enabled (not disabled). Returns true if the element doesn't have the 'disabled' attribute. Useful for checking if buttons, inputs, or other controls can be interacted with.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the element to check enabled state for"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, check the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_is_checked": {
      "post": {
        "summary": "Browser Is Checked",
        "description": "Check if a checkbox or radio button is currently checked/selected. Returns true if the element has the 'checked' property set. Useful for verifying form state.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the checkbox or radio button to check"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, check the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_is_editable": {
      "post": {
        "summary": "Browser Is Editable",
        "description": "Check if an element is editable (not disabled AND not readOnly). Returns 'editable' if the element can accept user input, 'not_editable' if it is disabled or read-only. More comprehensive than browser_is_enabled which only checks the disabled attribute.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the element to check editability for"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, check the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_count_elements": {
      "post": {
        "summary": "Browser Count Elements",
        "description": "Count the number of elements matching a CSS selector. Returns the count as an integer. Useful for checking how many items exist (e.g., list items, search results, table rows) without extracting full element data.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector to count matching elements (e.g., 'li.item', 'input[type=\"text\"]', 'table tr')"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_dispatch_event": {
      "post": {
        "summary": "Browser Dispatch Event",
        "description": "Dispatch a DOM event on an element. Programmatically triggers events like 'input', 'change', 'focus', 'blur', 'submit', etc. Useful for triggering event handlers after programmatic value changes, or for simulating user interactions that don't involve mouse/keyboard input.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the element to dispatch the event on"
                  },
                  "event_type": {
                    "type": "string",
                    "description": "The DOM event type to dispatch (e.g., 'click', 'input', 'change', 'focus', 'blur', 'submit', 'mouseenter', 'mouseleave'). Any valid DOM event name is accepted"
                  },
                  "bubbles": {
                    "type": "boolean",
                    "description": "Whether the event should bubble up through the DOM tree. Default: true"
                  }
                },
                "required": [
                  "context_id",
                  "selector",
                  "event_type"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_attribute": {
      "post": {
        "summary": "Browser Get Attribute",
        "description": "Get the value of an HTML attribute from an element. Can retrieve any attribute including 'href', 'src', 'value', 'data-*' attributes, 'class', 'id', etc. Returns null if attribute doesn't exist.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the element"
                  },
                  "attribute": {
                    "type": "string",
                    "description": "The attribute name to retrieve (e.g., 'href', 'src', 'value', 'data-id', 'class')"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, get attribute from the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector",
                  "attribute"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_bounding_box": {
      "post": {
        "summary": "Browser Get Bounding Box",
        "description": "Get the position and size of an element. Returns {x, y, width, height} representing the element's bounding rectangle in viewport coordinates. Useful for positioning or calculating drag coordinates.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the element to get position and size for"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, get bounding box of the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_evaluate": {
      "post": {
        "summary": "Browser Evaluate",
        "description": "Execute arbitrary JavaScript code in the page context. Has full access to the DOM, window object, and all page JavaScript. Use return_value=true to get the result of an expression.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "script": {
                    "type": "string",
                    "description": "JavaScript code to execute in the page context. Can access DOM, window object, etc. Example: 'document.title' or 'window.scrollY'. Optional if expression is provided."
                  },
                  "expression": {
                    "type": "string",
                    "description": "JavaScript expression to evaluate and return (shorthand for script with return_value=true). If provided, script is optional and return_value is automatically true."
                  },
                  "return_value": {
                    "type": "boolean",
                    "description": "If true, treats the script as an expression and returns its value. If false (default), executes the script as statements. Automatically set to true when using expression."
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_clipboard_read": {
      "post": {
        "summary": "Browser Clipboard Read",
        "description": "Read text content from the system clipboard. Returns the current clipboard text content. Useful for getting content that was copied from the browser.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_clipboard_write": {
      "post": {
        "summary": "Browser Clipboard Write",
        "description": "Write text content to the system clipboard. Replaces any existing clipboard content. Useful for preparing content to paste into the browser.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "text": {
                    "type": "string",
                    "description": "Text content to write to the system clipboard"
                  }
                },
                "required": [
                  "context_id",
                  "text"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_clipboard_clear": {
      "post": {
        "summary": "Browser Clipboard Clear",
        "description": "Clear the system clipboard content. Removes all text and data from the clipboard.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_list_frames": {
      "post": {
        "summary": "Browser List Frames",
        "description": "List all frames (main frame and iframes) on the current page. Returns frame names, URLs, and indices. Use to discover iframes before switching context to interact with their content.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_switch_to_frame": {
      "post": {
        "summary": "Browser Switch To Frame",
        "description": "Switch the browser context to interact with an iframe. After switching, all subsequent operations (click, type, etc.) target elements within that frame. Use frame name, index, or CSS selector.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "frame_selector": {
                    "type": "string",
                    "description": "Frame identifier: name attribute, frame index as string (e.g., '0', '1'), or CSS selector for iframe element"
                  }
                },
                "required": [
                  "context_id",
                  "frame_selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_switch_to_main_frame": {
      "post": {
        "summary": "Browser Switch To Main Frame",
        "description": "Switch back to the main (top-level) frame after interacting with an iframe. Call this to return to the main document after browser_switch_to_frame operations.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_extract_text": {
      "post": {
        "summary": "Browser Extract Text",
        "description": "Extract visible text content from the page or a specific element. Returns plain text stripped of HTML tags. Optionally target a specific element using CSS selector or natural language description. When the selector matches multiple elements, returns a JSON array of text strings. Optionally apply a regex pattern to filter/extract specific content from the text (applied per-element when multiple matches). Useful for reading page content, extracting article text, getting form values, or extracting specific data like numbers, emails, or prices.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "Optional CSS selector or natural language description to extract text from a specific element. If omitted, extracts all visible text from the entire page. When the selector matches multiple elements, returns a JSON array of text strings (one per element). Examples: '#main-content', '.product-name', 'article'"
                  },
                  "regex": {
                    "type": "string",
                    "description": "Optional regex pattern to apply to the extracted text. When provided, only content matching the regex will be returned. If both selector and regex are provided, the selector extracts text first, then regex filters the result. Examples: '\\\\d+' to extract numbers, '(?<=Price: )\\\\$[\\\\d.]+' to extract prices, '[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\\\.[A-Z|a-z]{2,}' for emails"
                  },
                  "regex_group": {
                    "type": "string",
                    "description": "Which capture group to return from the regex match. 0 returns the full match (default), 1 returns the first capture group, 2 returns the second, etc. Example: with regex 'FP ID:\\\\s*(\\\\S+)' and regex_group=1, only the ID value is returned."
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, extract text from the Nth element (0-based) instead of returning all. Default: not set (returns all matches as array). Set to 0 for first, 1 for second, -1 for last."
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_screenshot": {
      "post": {
        "summary": "Browser Screenshot",
        "description": "Capture a PNG screenshot with configurable modes. 'viewport' (default) captures the current visible area, 'element' captures a specific element by CSS selector or natural language description, 'fullpage' captures the entire scrollable page. Returns base64-encoded image data. Screenshots capture exactly as rendered, including all dynamic content, images, and styling. Useful for visual verification, debugging, and AI vision analysis.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "mode": {
                    "type": "string",
                    "description": "Screenshot mode: 'viewport' (default, current visible view), 'element' (specific element by selector), 'fullpage' (entire scrollable page)",
                    "enum": [
                      "viewport",
                      "element",
                      "fullpage"
                    ]
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description for the element to capture. Required when mode is 'element'. Examples: 'div.profile', '#submit-btn', 'the login form'"
                  },
                  "scale": {
                    "type": "string",
                    "description": "Scale percentage for the output image (1-100). Default is 100 (no scaling). Example: 50 will return an image at 50%% of the original size (half width and height)."
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_highlight": {
      "post": {
        "summary": "Browser Highlight",
        "description": "Visually highlight an element on the page with a colored border and background overlay. Useful for debugging element selection - verify which element will be clicked before performing actions. The highlight persists until the page is navigated or refreshed.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the element to highlight. Useful for debugging element selection before clicking. Examples: '#submit', '.nav-item', 'the login button'"
                  },
                  "border_color": {
                    "type": "string",
                    "description": "CSS color for the highlight border. Default: '#FF0000' (red). Examples: 'blue', '#00FF00', 'rgb(255, 128, 0)'"
                  },
                  "background_color": {
                    "type": "string",
                    "description": "CSS color for the highlight background (use alpha for transparency). Default: 'rgba(255, 0, 0, 0.2)'. Examples: 'rgba(0, 255, 0, 0.3)', 'transparent'"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, highlight the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_show_grid_overlay": {
      "post": {
        "summary": "Browser Show Grid Overlay",
        "description": "Display an XY coordinate grid overlay on the page with position labels at intersections. Essential for finding exact pixel coordinates when using browser_click with coordinates or browser_drag_drop. The grid helps identify precise positions for mouse operations.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "horizontal_lines": {
                    "type": "number",
                    "description": "Number of horizontal lines to display from top to bottom. Default: 25. More lines = more precise coordinate reading but more visual clutter"
                  },
                  "vertical_lines": {
                    "type": "number",
                    "description": "Number of vertical lines to display from left to right. Default: 25"
                  },
                  "line_color": {
                    "type": "string",
                    "description": "CSS color for grid lines (use low alpha for visibility). Default: 'rgba(255, 0, 0, 0.15)'"
                  },
                  "text_color": {
                    "type": "string",
                    "description": "CSS color for coordinate labels at intersections. Default: 'rgba(255, 0, 0, 0.4)'"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_html": {
      "post": {
        "summary": "Browser Get Html",
        "description": "Extract HTML content with configurable cleaning levels. Optionally target a specific element using a CSS selector to get its innerHTML instead of the full page. When the selector matches multiple elements, returns a JSON array of HTML strings. 'minimal' preserves most structure, 'basic' removes scripts and styles, 'aggressive' strips to essential content. Useful for page analysis, content extraction, and feeding HTML to other processing tools.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "Optional CSS selector to get innerHTML of a specific element (e.g., '#content', '.article-body'). When the selector matches multiple elements, returns a JSON array of HTML strings (one per element). When omitted, returns the full page HTML"
                  },
                  "clean_level": {
                    "type": "string",
                    "description": "Level of HTML cleaning to apply. 'minimal': preserves most structure, 'basic': removes scripts/styles (default), 'aggressive': strips to essential content only. Choose based on how much structure you need",
                    "enum": [
                      "minimal",
                      "basic",
                      "aggressive"
                    ]
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_markdown": {
      "post": {
        "summary": "Browser Get Markdown",
        "description": "Convert the page content to clean Markdown format. Preserves headings, links, images, lists, and basic formatting. Much more readable than HTML for text analysis. Optionally control inclusion of links and images, and limit output length for large pages.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "include_links": {
                    "type": "boolean",
                    "description": "Include hyperlinks in markdown output as [text](url). Default: true. Set to false for cleaner text without links"
                  },
                  "include_images": {
                    "type": "boolean",
                    "description": "Include images in markdown output as ![alt](src). Default: true. Set to false to exclude image references"
                  },
                  "max_length": {
                    "type": "string",
                    "description": "Maximum length of the output in characters. Default: -1 (no limit). Useful for limiting output size when processing many pages"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_extract_site": {
      "post": {
        "summary": "Browser Extract Site",
        "description": "Extract content from multiple pages of a website. Crawls links starting from a URL and extracts content in the specified format. Returns a job_id immediately for async progress tracking. Use browser_extract_site_progress to monitor and browser_extract_site_result to get output.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "url": {
                    "type": "string",
                    "description": "Starting URL to begin extraction from"
                  },
                  "depth": {
                    "type": "string",
                    "description": "How many link levels to follow from the starting page. Default: 2. Higher values extract more pages but take longer"
                  },
                  "max_pages": {
                    "type": "string",
                    "description": "Maximum number of pages to extract. Default: 5. Limits total extraction to prevent runaway crawling"
                  },
                  "follow_external": {
                    "type": "boolean",
                    "description": "Whether to follow links to external domains. Default: false. When false, only links within the same domain are followed"
                  },
                  "output_format": {
                    "type": "string",
                    "description": "Output format for extracted content: 'markdown' (default), 'text', or 'json'. Markdown preserves structure, text is plain, JSON includes metadata",
                    "enum": [
                      "markdown",
                      "text",
                      "json"
                    ]
                  },
                  "include_images": {
                    "type": "boolean",
                    "description": "Include resolved image URLs in output. Default: true"
                  },
                  "include_metadata": {
                    "type": "boolean",
                    "description": "Include page title and description metadata. Default: true"
                  },
                  "exclude_patterns": {
                    "type": "string",
                    "description": "Array of URL patterns to skip (glob patterns). Example: [\"*/login*\", \"*/admin/*\"]"
                  },
                  "timeout_per_page": {
                    "type": "string",
                    "description": "Timeout per page in milliseconds. Default: 10000 (10 seconds)"
                  }
                },
                "required": [
                  "context_id",
                  "url"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_extract_site_progress": {
      "post": {
        "summary": "Browser Extract Site Progress",
        "description": "Get progress of a site extraction job. Returns pages_completed, pages_total, current_url, and status. Status can be: 'running', 'completed', 'cancelled', or 'error'.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_id": {
                    "type": "string",
                    "description": "The job ID returned from browser_extract_site"
                  }
                },
                "required": [
                  "job_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_extract_site_result": {
      "post": {
        "summary": "Browser Extract Site Result",
        "description": "Get the result of a completed site extraction job. Returns the formatted content based on the output_format specified when starting the job (markdown, text, or json).",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_id": {
                    "type": "string",
                    "description": "The job ID returned from browser_extract_site"
                  }
                },
                "required": [
                  "job_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_extract_site_cancel": {
      "post": {
        "summary": "Browser Extract Site Cancel",
        "description": "Cancel a running site extraction job. Returns success status.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "job_id": {
                    "type": "string",
                    "description": "The job ID to cancel"
                  }
                },
                "required": [
                  "job_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_extract_json": {
      "post": {
        "summary": "Browser Extract Json",
        "description": "Extract structured data from the page as JSON. For known sites (Google, Amazon, Wikipedia, etc.) uses predefined templates. For unknown sites, uses smart DOM analysis to detect repeating items (products, posts, search results) and extract fields (title, link, image, price, rating, date, description). Use 'selector' to scope extraction to a specific container. Returns page type, items array, structured LD+JSON data, and meta tags.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "template": {
                    "type": "string",
                    "description": "Extraction template name for known site types. Available: 'google_search', 'duckduckgo_search', 'wikipedia', 'amazon_product', 'github_repo', 'twitter_feed', 'reddit_thread'. Leave empty for auto-detection based on URL"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector to scope extraction to a specific container (e.g., 'div.product-grid', '#results'). When set, only elements within this container are analyzed for repeating patterns"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_detect_site": {
      "post": {
        "summary": "Browser Detect Site",
        "description": "Identify the type of website currently loaded (e.g., 'google_search', 'wikipedia', 'amazon_product'). Use before browser_extract_json to determine which template to apply, or for conditional page handling logic.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_list_templates": {
      "post": {
        "summary": "Browser List Templates",
        "description": "List all available JSON extraction templates with their names and descriptions. Use to discover which structured data extraction templates are available for browser_extract_json.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_summarize_page": {
      "post": {
        "summary": "Browser Summarize Page",
        "description": "Generate an intelligent, structured summary of the current page using the LLM. Returns key information about the page topic, main content, and interactive elements. Summaries are cached per URL for performance. Much better than raw text extraction for understanding page content.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "force_refresh": {
                    "type": "boolean",
                    "description": "Force regeneration of the page summary even if cached. Summaries are cached per URL for performance. Set to true after page content has changed. Default: false (use cached summary if available)"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_query_page": {
      "post": {
        "summary": "Browser Query Page",
        "description": "Ask a natural language question about the current page content. The LLM analyzes the page and answers questions like 'What is the main topic?', 'Are there any prices listed?', 'Extract all email addresses'. Uses intelligent page summarization for better context understanding.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "query": {
                    "type": "string",
                    "description": "Natural language question to ask about the page content. Examples: 'What is the main topic?', 'Does this page have pricing information?', 'What products are shown?', 'Extract all email addresses'"
                  }
                },
                "required": [
                  "context_id",
                  "query"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_llm_status": {
      "post": {
        "summary": "Browser Llm Status",
        "description": "Check if the LLM is ready to use. When context_id is provided, returns the LLM configuration and status for that specific context (which may use an external LLM provider like OpenAI). When context_id is omitted, returns the global built-in LLM status. Response includes: status ('ready', 'loading', 'unavailable'), type ('builtin', 'external', 'none'), and for external LLMs: endpoint and model name.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "Optional browser context ID. When provided, returns LLM status for that specific context (which may use an external LLM endpoint). When omitted, returns global built-in LLM status."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_nla": {
      "post": {
        "summary": "Browser Nla",
        "description": "Execute complex browser automation using natural language commands. The LLM interprets your instruction and automatically plans and executes multiple browser actions. Examples: 'search for shoes on Amazon', 'log in with test credentials', 'add the first item to cart'.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "command": {
                    "type": "string",
                    "description": "Natural language instruction for browser automation. The LLM will plan and execute multiple steps automatically. Examples: 'go to google.com and search for weather', 'click the first result', 'fill out the contact form with test data'"
                  }
                },
                "required": [
                  "context_id",
                  "command"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_ai_click": {
      "post": {
        "summary": "Browser Ai Click",
        "description": "Click an element described in natural language using AI vision. The AI analyzes the page screenshot to find and click the element matching your description. Example: 'the blue submit button'.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "description": {
                    "type": "string",
                    "description": "Natural language description of the element to click (e.g., 'search button', 'the login link at the top')"
                  }
                },
                "required": [
                  "context_id",
                  "description"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_ai_type": {
      "post": {
        "summary": "Browser Ai Type",
        "description": "Type text into an element described in natural language using AI vision. The AI finds the input field matching your description and enters the text. Example: 'email field', 'search box'.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "description": {
                    "type": "string",
                    "description": "Natural language description of the input element (e.g., 'search box', 'email input')"
                  },
                  "text": {
                    "type": "string",
                    "description": "Text to type into the input element"
                  }
                },
                "required": [
                  "context_id",
                  "description",
                  "text"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_ai_extract": {
      "post": {
        "summary": "Browser Ai Extract",
        "description": "Extract specific information from the page using AI. Describe what you want to extract and the AI will analyze the page content and return the relevant data. Example: 'all product prices'.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "what": {
                    "type": "string",
                    "description": "Description of what to extract (e.g., 'all product prices', 'main headline')"
                  }
                },
                "required": [
                  "context_id",
                  "what"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_ai_query": {
      "post": {
        "summary": "Browser Ai Query",
        "description": "Ask a natural language question about the current page. The AI analyzes the page and provides an intelligent answer. Example: 'Is there a login form on this page?'.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "query": {
                    "type": "string",
                    "description": "Natural language question about the page content"
                  }
                },
                "required": [
                  "context_id",
                  "query"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_ai_analyze": {
      "post": {
        "summary": "Browser Ai Analyze",
        "description": "Perform comprehensive AI analysis of the current page. Returns structured information about the page's topic, main content, structure, and interactive elements.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_find_element": {
      "post": {
        "summary": "Browser Find Element",
        "description": "Find an element on the page using natural language description. Returns the CSS selector, confidence score, and element details. Useful for locating elements before interaction.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "description": {
                    "type": "string",
                    "description": "Natural language description of elements to find (e.g., 'all buttons', 'form inputs')"
                  },
                  "max_results": {
                    "type": "string",
                    "description": "Maximum number of results to return (default: 10)"
                  }
                },
                "required": [
                  "context_id",
                  "description"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_scroll_by": {
      "post": {
        "summary": "Browser Scroll By",
        "description": "Scroll the page by a specified number of pixels vertically and/or horizontally. Positive Y scrolls down, negative scrolls up. Use for incremental scrolling to load lazy content or navigate long pages.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "y": {
                    "type": "string",
                    "description": "Vertical scroll amount in pixels. Positive values scroll down, negative values scroll up. Typical values: 300-500 for one viewport scroll"
                  },
                  "x": {
                    "type": "string",
                    "description": "Horizontal scroll amount in pixels. Positive values scroll right, negative scroll left. Default: 0 (no horizontal scroll)"
                  },
                  "verification_level": {
                    "type": "string",
                    "description": "Verification level for scroll action. Options: 'none' (no verification), 'basic', 'standard', 'strict'. Higher levels verify scroll position after scrolling. Default: 'none'"
                  }
                },
                "required": [
                  "context_id",
                  "y"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_scroll_to_element": {
      "post": {
        "summary": "Browser Scroll To Element",
        "description": "Scroll the page to bring a specific element into view. Uses smooth scrolling to center the element in the viewport. Target elements using CSS selector or natural language description.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the element to scroll into view. Examples: '#footer', '.product-reviews', 'the comments section'"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, scroll to the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_scroll_to_top": {
      "post": {
        "summary": "Browser Scroll To Top",
        "description": "Instantly scroll to the very top of the page. Equivalent to pressing Home key or clicking in the scrollbar track at the top.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_scroll_to_bottom": {
      "post": {
        "summary": "Browser Scroll To Bottom",
        "description": "Instantly scroll to the very bottom of the page. Useful for loading infinite scroll content or reaching footer elements.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_wait_for_selector": {
      "post": {
        "summary": "Browser Wait For Selector",
        "description": "Wait for an element matching the selector to appear and become visible on the page. Essential for handling dynamic content that loads after navigation. Times out with error if element doesn't appear.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "selector": {
                    "type": "string",
                    "description": "CSS selector or natural language description of the element to wait for. Waits until the element exists in the DOM and is visible. Examples: '#login-form', '.results', 'the search results'"
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Maximum time to wait in milliseconds. Returns error if element doesn't appear within this time. Default: 5000 (5 seconds)"
                  },
                  "index": {
                    "type": "string",
                    "description": "When multiple elements match the selector, wait for the Nth element (0-based). Default: -1 (first match)"
                  }
                },
                "required": [
                  "context_id",
                  "selector"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_wait": {
      "post": {
        "summary": "Browser Wait",
        "description": "Pause execution for a fixed number of milliseconds. Use sparingly - prefer browser_wait_for_selector or browser_wait_for_network_idle for more reliable synchronization.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Time to wait in milliseconds before continuing. Use for fixed delays when other wait methods aren't suitable. Examples: 1000 for 1 second, 3000 for 3 seconds"
                  }
                },
                "required": [
                  "context_id",
                  "timeout"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_wait_for_network_idle": {
      "post": {
        "summary": "Browser Wait For Network Idle",
        "description": "Wait until there are no pending network requests for a specified duration. The most reliable way to wait for a page to fully load, including AJAX requests, images, and dynamic content.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "idle_time": {
                    "type": "string",
                    "description": "Duration of network inactivity (no pending requests) required to consider the page 'idle'. Default: 500ms. Increase for pages with delayed/lazy loading"
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Maximum time to wait for network idle state. Returns error if network doesn't become idle within this time. Default: 30000 (30 seconds)"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_wait_for_function": {
      "post": {
        "summary": "Browser Wait For Function",
        "description": "Wait for a custom JavaScript condition to become true. Useful for waiting on application-specific state like 'window.appReady' or complex DOM conditions that can't be expressed with a selector.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "js_function": {
                    "type": "string",
                    "description": "JavaScript code that returns truthy value when condition is met. Executed repeatedly until true or timeout. Examples: 'return document.querySelector(\".loaded\") !== null', 'return window.dataReady === true'"
                  },
                  "polling": {
                    "type": "string",
                    "description": "Interval between function evaluations in milliseconds. Lower = more responsive but more CPU. Default: 100ms"
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Maximum time to wait for function to return true. Default: 30000 (30 seconds)"
                  }
                },
                "required": [
                  "context_id",
                  "js_function"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_wait_for_url": {
      "post": {
        "summary": "Browser Wait For Url",
        "description": "Wait for the page URL to match a specific pattern. Useful after clicking links or submitting forms to ensure navigation completed. Supports substring matching or glob patterns with wildcards.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "url_pattern": {
                    "type": "string",
                    "description": "URL pattern to match. By default uses substring matching. With is_regex=true, supports glob patterns with * (any chars) and ? (single char). Examples: '/dashboard', 'example.com/success', '*/order/*'"
                  },
                  "is_regex": {
                    "type": "boolean",
                    "description": "Enable glob-style pattern matching with * and ? wildcards. Default: false (simple substring match)"
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Maximum time to wait for URL to match. Default: 30000 (30 seconds)"
                  }
                },
                "required": [
                  "context_id",
                  "url_pattern"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_page_info": {
      "post": {
        "summary": "Browser Get Page Info",
        "description": "Get comprehensive information about the current page including URL, title, document state, can go back/forward status, and viewport dimensions. Useful for verifying navigation state.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_set_viewport": {
      "post": {
        "summary": "Browser Set Viewport",
        "description": "Set the browser viewport size for responsive testing. Changes the visible area dimensions, triggering any responsive CSS breakpoints. Common uses: testing mobile layouts, matching specific device sizes.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "width": {
                    "type": "string",
                    "description": "Viewport width in pixels. Common sizes: 1920 (desktop), 1366 (laptop), 768 (tablet), 375 (mobile)"
                  },
                  "height": {
                    "type": "string",
                    "description": "Viewport height in pixels. Common sizes: 1080 (desktop), 768 (laptop), 1024 (tablet), 812 (mobile)"
                  }
                },
                "required": [
                  "context_id",
                  "width",
                  "height"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_reset_viewport": {
      "post": {
        "summary": "Browser Reset Viewport",
        "description": "Reset the browser viewport to its original default size (from the VM profile screen dimensions, typically 1920x1080). Use this to undo any viewport changes made by browser_set_viewport.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_zoom_in": {
      "post": {
        "summary": "Browser Zoom In",
        "description": "Zoom in the page content by 10%. Uses CSS zoom property to scale the entire page. Maximum zoom is 300%. Current zoom level is returned.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_zoom_out": {
      "post": {
        "summary": "Browser Zoom Out",
        "description": "Zoom out the page content by 10%. Uses CSS zoom property to scale the entire page. Minimum zoom is 10%. Current zoom level is returned.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_zoom_reset": {
      "post": {
        "summary": "Browser Zoom Reset",
        "description": "Reset page zoom to 100% (default). Restores the page to its original size.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_console_log": {
      "post": {
        "summary": "Browser Get Console Log",
        "description": "Read console logs from the browser. Returns JavaScript console messages (console.log, console.warn, etc). Supports filtering by level and text. Useful for debugging and monitoring page behavior.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "level": {
                    "type": "string",
                    "description": "Filter by log level: 'debug', 'info', 'warn', 'error', 'verbose'. If not specified, returns all logs"
                  },
                  "filter": {
                    "type": "string",
                    "description": "Filter logs containing specific text (case-sensitive substring match)"
                  },
                  "limit": {
                    "type": "string",
                    "description": "Maximum number of log entries to return. If not specified, returns all logs"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_clear_console_log": {
      "post": {
        "summary": "Browser Clear Console Log",
        "description": "Clear all console logs from the browser context. Useful to reset log state between operations.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_start_video_recording": {
      "post": {
        "summary": "Browser Start Video Recording",
        "description": "Begin recording a video of the browser session. Captures all visual activity in the viewport. Recording continues until stopped with browser_stop_video_recording. Useful for debugging, demos, and documentation.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "fps": {
                    "type": "string",
                    "description": "Frames per second for the recording. Higher = smoother but larger file. Default: 30. Recommended: 15-30 for most use cases"
                  },
                  "codec": {
                    "type": "string",
                    "description": "Video codec for encoding. Default: 'libx264' (H.264, widely compatible). Options depend on system FFmpeg installation"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_pause_video_recording": {
      "post": {
        "summary": "Browser Pause Video Recording",
        "description": "Temporarily pause video recording without stopping it. The recording can be resumed later with browser_resume_video_recording. Paused segments are not included in the final video.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_resume_video_recording": {
      "post": {
        "summary": "Browser Resume Video Recording",
        "description": "Resume a paused video recording. Continues capturing from where it was paused. Only valid after browser_pause_video_recording.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_stop_video_recording": {
      "post": {
        "summary": "Browser Stop Video Recording",
        "description": "Stop video recording and save the video file. Returns the path to the saved MP4 file in /tmp. The file can then be downloaded or processed further.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_video_recording_stats": {
      "post": {
        "summary": "Browser Get Video Recording Stats",
        "description": "Get statistics about the current video recording including frames captured, duration, file size estimate, and recording state (recording/paused/stopped).",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_download_video_recording": {
      "post": {
        "summary": "Browser Download Video Recording",
        "description": "Get a download URL for a completed video recording. Returns a temporary URL that can be used to download the recorded MP4 video file. The recording must be stopped first using browser_stop_video_recording.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_start_live_stream": {
      "post": {
        "summary": "Browser Start Live Stream",
        "description": "Start a live MJPEG video stream of the browser session accessible via HTTP. Returns a stream URL that can be viewed in any browser or video player. Useful for real-time monitoring of browser activity.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "fps": {
                    "type": "string",
                    "description": "Target frames per second for the stream. Higher values give smoother video but more bandwidth. Default: 15. Recommended range: 5-30"
                  },
                  "quality": {
                    "type": "string",
                    "description": "JPEG compression quality from 1 (lowest/smallest) to 100 (highest/largest). Default: 75. Lower values reduce bandwidth but decrease image clarity"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_stop_live_stream": {
      "post": {
        "summary": "Browser Stop Live Stream",
        "description": "Stop an active live video stream. Terminates the MJPEG stream and frees associated resources.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_live_stream_stats": {
      "post": {
        "summary": "Browser Get Live Stream Stats",
        "description": "Get statistics about an active live stream including connected viewers, frames sent, bandwidth usage, and stream duration.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_list_live_streams": {
      "post": {
        "summary": "Browser List Live Streams",
        "description": "List all currently active live video streams across all contexts with their URLs and stats.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_live_frame": {
      "post": {
        "summary": "Browser Get Live Frame",
        "description": "Get the latest frame from a live video stream as a base64-encoded image. Useful for capturing single frames without recording a full video.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_demographics": {
      "post": {
        "summary": "Browser Get Demographics",
        "description": "Get comprehensive user demographics and context based on IP geolocation. Returns location, timezone, weather, date/time, and locale information. Useful for location-aware operations and personalizing interactions.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_location": {
      "post": {
        "summary": "Browser Get Location",
        "description": "Get user's current geographic location based on IP address. Returns city, country, coordinates (lat/lon), and timezone. Uses GeoIP database for lookup.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_datetime": {
      "post": {
        "summary": "Browser Get Datetime",
        "description": "Get current date and time information including date, time, day of week, and timezone. Reflects the server's local time.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_weather": {
      "post": {
        "summary": "Browser Get Weather",
        "description": "Get current weather conditions for the user's detected location. Returns temperature, conditions, humidity, and other weather data.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_detect_captcha": {
      "post": {
        "summary": "Browser Detect Captcha",
        "description": "Detect if the current page contains a CAPTCHA challenge using heuristic analysis (no vision model). Returns detection result with confidence score. Use before attempting CAPTCHA solving.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_classify_captcha": {
      "post": {
        "summary": "Browser Classify Captcha",
        "description": "Identify the type of CAPTCHA on the page. Classifies as text-based, image-selection, checkbox (reCAPTCHA v2), puzzle, audio, or custom. Returns element selectors for the CAPTCHA components.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_solve_text_captcha": {
      "post": {
        "summary": "Browser Solve Text Captcha",
        "description": "Solve a text-based CAPTCHA by using vision model to read distorted characters. Automatically finds the CAPTCHA image, extracts the text, enters it in the input field, and optionally submits.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "max_attempts": {
                    "type": "string",
                    "description": "Maximum number of attempts to solve the CAPTCHA before giving up. Each attempt re-analyzes the image and tries a new solution. Default: 3"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_solve_image_captcha": {
      "post": {
        "summary": "Browser Solve Image Captcha",
        "description": "Solve an image-selection CAPTCHA (e.g., 'select all images with traffic lights'). Uses vision model with numbered overlays for one-shot analysis. Supports reCAPTCHA, Cloudflare Turnstile, and hCaptcha.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "max_attempts": {
                    "type": "string",
                    "description": "Maximum number of attempts to solve the CAPTCHA. For image selection, each attempt may select different images. Default: 3"
                  },
                  "provider": {
                    "type": "string",
                    "description": "CAPTCHA provider hint for optimized solving: 'auto' (detect automatically), 'owl' (Owl test CAPTCHAs), 'recaptcha' (Google reCAPTCHA), 'cloudflare' (Turnstile), 'hcaptcha'. Default: 'auto'",
                    "enum": [
                      "auto",
                      "owl",
                      "recaptcha",
                      "cloudflare",
                      "hcaptcha"
                    ]
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_solve_captcha": {
      "post": {
        "summary": "Browser Solve Captcha",
        "description": "Auto-detect and solve any supported CAPTCHA type. Automatically detects whether it's text-based or image-selection and applies the appropriate solving strategy. Most convenient option when CAPTCHA type is unknown.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "max_attempts": {
                    "type": "string",
                    "description": "Maximum number of attempts to solve the CAPTCHA. For image selection, each attempt may select different images. Default: 3"
                  },
                  "provider": {
                    "type": "string",
                    "description": "CAPTCHA provider hint for optimized solving: 'auto' (detect automatically), 'owl' (Owl test CAPTCHAs), 'recaptcha' (Google reCAPTCHA), 'cloudflare' (Turnstile), 'hcaptcha'. Default: 'auto'",
                    "enum": [
                      "auto",
                      "owl",
                      "recaptcha",
                      "cloudflare",
                      "hcaptcha"
                    ]
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_cookies": {
      "post": {
        "summary": "Browser Get Cookies",
        "description": "Retrieve all cookies from the browser context with full details including httpOnly, secure, sameSite, domain, path, and expiration. Optionally filter by URL to get only relevant cookies.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "url": {
                    "type": "string",
                    "description": "Filter cookies to only those applicable to this URL. If not provided, returns all cookies in the context. Example: 'https://example.com' returns cookies for example.com domain"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_set_cookie": {
      "post": {
        "summary": "Browser Set Cookie",
        "description": "Set a cookie in the browser context with full control over all attributes. Supports domain, path, secure, httpOnly, sameSite, and expiration settings. Useful for injecting session tokens or test cookies.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "url": {
                    "type": "string",
                    "description": "URL to associate with the cookie for domain validation. The cookie's domain must match or be a parent of this URL's domain. Example: 'https://example.com'"
                  },
                  "name": {
                    "type": "string",
                    "description": "The cookie name. Case-sensitive identifier for the cookie. Example: 'session_id', 'auth_token'"
                  },
                  "value": {
                    "type": "string",
                    "description": "The cookie value. Can be any string data. For security tokens, use the exact value from authentication"
                  },
                  "domain": {
                    "type": "string",
                    "description": "Cookie domain scope. If empty, creates a host-only cookie. With leading dot (e.g., '.example.com'), the cookie is visible to all subdomains"
                  },
                  "path": {
                    "type": "string",
                    "description": "URL path that must exist in the request URL for the cookie to be sent. Default: '/' (all paths). Example: '/api' restricts cookie to /api/* paths"
                  },
                  "secure": {
                    "type": "boolean",
                    "description": "If true, cookie is only sent over HTTPS connections. Set to true for sensitive cookies. Default: false"
                  },
                  "httpOnly": {
                    "type": "boolean",
                    "description": "If true, cookie cannot be accessed via JavaScript (document.cookie). Protects against XSS. Default: false"
                  },
                  "sameSite": {
                    "type": "string",
                    "description": "Cross-site request restriction: 'strict' (only same-site), 'lax' (same-site + top-level navigation), 'none' (allow cross-site, requires secure=true). Default: 'lax'",
                    "enum": [
                      "none",
                      "lax",
                      "strict"
                    ]
                  },
                  "expires": {
                    "type": "string",
                    "description": "Unix timestamp (seconds since epoch) when the cookie expires. Use -1 or omit for session cookie (deleted when browser closes). Example: 1735689600 for a future date"
                  }
                },
                "required": [
                  "context_id",
                  "url",
                  "name",
                  "value"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_delete_cookies": {
      "post": {
        "summary": "Browser Delete Cookies",
        "description": "Delete cookies from the browser context. Can delete all cookies, cookies for a specific URL, or a specific cookie by name. Useful for testing login flows or clearing session state.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "url": {
                    "type": "string",
                    "description": "Delete only cookies applicable to this URL. If empty with empty cookie_name, deletes ALL cookies in context"
                  },
                  "cookie_name": {
                    "type": "string",
                    "description": "Delete only the cookie with this specific name. Can be combined with url parameter. If empty, deletes all cookies (or all for URL if url is provided)"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_headers": {
      "post": {
        "summary": "Browser Get Headers",
        "description": "Get HTTP response headers from the current page or a specific URL in the browser context. Network logging is automatically enabled when a context is created. Returns headers as a JSON object with header names as keys. Useful for extracting authentication tokens, content types, caching directives, and other response metadata.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "url": {
                    "type": "string",
                    "description": "Filter headers by URL. If not provided, returns headers from the main page's document response. If provided, searches recent network activity for a response matching this URL."
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_set_proxy": {
      "post": {
        "summary": "Browser Set Proxy",
        "description": "Configure proxy settings for the browser context after creation. Supports HTTP, HTTPS, SOCKS4, SOCKS5, and SOCKS5H proxies with optional authentication. Includes stealth features to prevent proxy detection.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "type": {
                    "type": "string",
                    "description": "Proxy protocol type: 'http' (HTTP proxy), 'https' (HTTPS proxy), 'socks4' (SOCKS4), 'socks5' (SOCKS5 with local DNS), 'socks5h' (SOCKS5 with remote DNS - most private), 'gae' (private app proxy)",
                    "enum": [
                      "http",
                      "https",
                      "socks4",
                      "socks5",
                      "socks5h",
                      "gae"
                    ]
                  },
                  "host": {
                    "type": "string",
                    "description": "Proxy server hostname or IP address. Examples: '127.0.0.1', 'proxy.example.com', 'localhost'"
                  },
                  "port": {
                    "type": "string",
                    "description": "Proxy server port number. Common ports: 8080 (HTTP), 3128 (Squid), 9050/9150 (Tor), 1080 (SOCKS)"
                  },
                  "username": {
                    "type": "string",
                    "description": "Username for proxy authentication. Only required if the proxy server requires credentials"
                  },
                  "password": {
                    "type": "string",
                    "description": "Password for proxy authentication. Only required if the proxy server requires credentials"
                  },
                  "stealth": {
                    "type": "boolean",
                    "description": "Enable stealth mode to prevent proxy/VPN detection. Blocks WebRTC leaks, DNS leaks, and other fingerprinting vectors. Default: true"
                  },
                  "block_webrtc": {
                    "type": "boolean",
                    "description": "Block WebRTC to prevent real IP address leaking through STUN/TURN requests. Essential for privacy. Default: true (enabled when stealth mode is on)"
                  },
                  "spoof_timezone": {
                    "type": "boolean",
                    "description": "Automatically spoof browser timezone to match proxy location (detected via IP geolocation). Default: false"
                  },
                  "spoof_language": {
                    "type": "boolean",
                    "description": "Automatically spoof browser language preferences to match proxy location. Default: false"
                  },
                  "timezone_override": {
                    "type": "string",
                    "description": "Manually set timezone instead of auto-detection. IANA format like 'America/New_York', 'Europe/London'. Takes precedence over spoof_timezone"
                  },
                  "language_override": {
                    "type": "string",
                    "description": "Manually set browser language instead of auto-detection. BCP47 format like 'en-US', 'de-DE'. Takes precedence over spoof_language"
                  },
                  "ca_cert_path": {
                    "type": "string",
                    "description": "Path to custom CA certificate file (.pem, .crt, .cer) for SSL interception proxies. Required when using Charles Proxy, mitmproxy, or similar HTTPS inspection tools"
                  },
                  "ca_key_path": {
                    "type": "string",
                    "description": "Path to CA private key file for GAE/private app proxy MITM. Required for generating per-domain certificates when using 'gae' proxy type"
                  },
                  "trust_custom_ca": {
                    "type": "boolean",
                    "description": "Trust the custom CA certificate for SSL interception. Enable when using Charles Proxy, mitmproxy, or similar tools that intercept HTTPS traffic. Default: false"
                  },
                  "is_tor": {
                    "type": "boolean",
                    "description": "Explicitly mark this proxy as a Tor connection. Enables circuit isolation so each context gets a unique exit node IP. Auto-detected if proxy is localhost:9050 or localhost:9150 with socks5/socks5h"
                  },
                  "tor_control_port": {
                    "type": "string",
                    "description": "Tor control port for circuit isolation. Used to send SIGNAL NEWNYM to get a new exit node. Default: auto-detect (tries 9051 then 9151). Set to -1 to disable circuit isolation"
                  },
                  "tor_control_password": {
                    "type": "string",
                    "description": "Password for Tor control port authentication. Leave empty to use cookie authentication (default) or no auth"
                  }
                },
                "required": [
                  "context_id",
                  "type",
                  "host",
                  "port"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_proxy_status": {
      "post": {
        "summary": "Browser Get Proxy Status",
        "description": "Get the current proxy configuration and connection status. Returns proxy type, host, port, and whether stealth features are enabled.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_connect_proxy": {
      "post": {
        "summary": "Browser Connect Proxy",
        "description": "Enable and connect the configured proxy for the browser context. Traffic will start routing through the proxy after this call.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_disconnect_proxy": {
      "post": {
        "summary": "Browser Disconnect Proxy",
        "description": "Disable the proxy and revert to direct connection. Useful for comparing behavior with and without proxy, or troubleshooting connection issues.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_set_timezone": {
      "post": {
        "summary": "Browser Set Timezone",
        "description": "Set or override the timezone for an existing browser context at runtime. Useful for adjusting timezone after detecting proxy exit IP location. The timezone is immediately applied to all frames in the context.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "timezone": {
                    "type": "string",
                    "description": "IANA timezone format (e.g., 'America/New_York', 'Europe/London', 'Asia/Tokyo'). This overrides any previously set timezone including VM profile defaults. Must contain '/' and be between 5-50 characters."
                  }
                },
                "required": [
                  "context_id",
                  "timezone"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_create_profile": {
      "post": {
        "summary": "Browser Create Profile",
        "description": "Create a new browser profile with randomized fingerprints (user agent, screen size, WebGL, Canvas, etc.). Returns the profile JSON that can be saved for later use. Each profile represents a unique browser identity.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "Optional browser context ID. If provided, associates the created profile with this context. If omitted, creates a standalone profile that can be applied to any context later."
                  },
                  "name": {
                    "type": "string",
                    "description": "Human-readable name for the profile to help identify it. Examples: 'Shopping Account', 'Test User 1'. Optional but recommended for managing multiple profiles"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_load_profile": {
      "post": {
        "summary": "Browser Load Profile",
        "description": "Load a saved browser profile from a JSON file into an existing context. Applies fingerprints, cookies, and settings from the profile. Use for maintaining consistent browser identity across sessions.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context to load the profile into (e.g., 'ctx_000001')"
                  },
                  "profile_path": {
                    "type": "string",
                    "description": "Path to the profile .json file to load (or upload file via multipart/form-data). Accepts both raw JSON profiles and encrypted profiles from browser_download_profile. Encrypted content (base64) is automatically detected and decrypted based on content, not extension. Example: '/home/user/profiles/shopping.json'"
                  }
                },
                "required": [
                  "context_id",
                  "profile_path"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_save_profile": {
      "post": {
        "summary": "Browser Save Profile",
        "description": "Save the current context state (fingerprints, cookies, settings) to a profile file on the server. Takes a profile_name (not path) and returns the filename. Use browser_download_profile to retrieve the file.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context to save (e.g., 'ctx_000001')"
                  },
                  "profile_name": {
                    "type": "string",
                    "description": "Name for the saved profile file (without path). Example: 'shopping_account', 'test_user_1'. The .json extension will be added automatically. Returns the filename that can be used with browser_download_profile."
                  }
                },
                "required": [
                  "context_id",
                  "profile_name"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_download_profile": {
      "post": {
        "summary": "Browser Download Profile",
        "description": "Download a saved profile file from the server. Takes the profile_name returned by browser_save_profile and returns the profile content as base64-encoded JSON. The same profile can be downloaded regardless of which context_id was used to save it.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "profile_name": {
                    "type": "string",
                    "description": "Name of the profile file to download (as returned by browser_save_profile). Example: 'shopping_account.json'. The .json extension is optional and will be added if missing. Returns base64-encoded profile content."
                  }
                },
                "required": [
                  "context_id",
                  "profile_name"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_profile": {
      "post": {
        "summary": "Browser Get Profile",
        "description": "Get the current profile state for the context as JSON. Includes fingerprints, current cookies, and all settings. Useful for inspecting profile details.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_update_profile_cookies": {
      "post": {
        "summary": "Browser Update Profile Cookies",
        "description": "Update the profile file with the current cookies from the browser. Call after login to persist session cookies. Only updates cookies, preserving other profile settings.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_context_info": {
      "post": {
        "summary": "Browser Get Context Info",
        "description": "Get context information including the VM profile and fingerprint hashes (canvas, audio, GPU) currently in use. Returns the stealth configuration for the browser context including vm_id, canvas hash seed, audio noise seed, and GPU profile details.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_add_network_rule": {
      "post": {
        "summary": "Browser Add Network Rule",
        "description": "Add a rule to intercept network requests matching a URL pattern. Rules can block requests (e.g., ads, trackers), mock responses with custom data (useful for testing), or redirect to different URLs. Supports glob patterns (*.js, *://api.example.com/*) or regex for flexible matching. Returns a rule_id for later removal.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "url_pattern": {
                    "type": "string",
                    "description": "URL pattern to match requests against. Supports glob patterns (e.g., '*://api.example.com/*', '*.js') or regex if is_regex=true. Glob uses * for any characters, ? for single character"
                  },
                  "action": {
                    "type": "string",
                    "description": "What to do with matching requests: 'allow' lets them through (useful with blocking enabled), 'block' drops the request, 'mock' returns a fake response, 'redirect' sends to different URL",
                    "enum": [
                      "allow",
                      "block",
                      "mock",
                      "redirect"
                    ]
                  },
                  "is_regex": {
                    "type": "boolean",
                    "description": "Treat url_pattern as a regular expression instead of glob pattern. Default: false (uses glob). Example regex: '^https://api\\\\.example\\\\.com/v[0-9]+/'"
                  },
                  "redirect_url": {
                    "type": "string",
                    "description": "The URL to redirect matching requests to. Only used when action='redirect'. Example: redirect tracking scripts to empty response"
                  },
                  "mock_body": {
                    "type": "string",
                    "description": "Response body to return for mocked requests. Only used when action='mock'. Can be JSON, HTML, or any text content. Example: '{\"success\": true}'"
                  },
                  "mock_status": {
                    "type": "string",
                    "description": "HTTP status code for mocked responses (e.g., 200, 404, 500). Only used when action='mock'. Default: 200"
                  },
                  "mock_content_type": {
                    "type": "string",
                    "description": "Content-Type header for mocked responses. Only used when action='mock'. Examples: 'application/json', 'text/html', 'text/plain'. Default: 'text/plain'"
                  }
                },
                "required": [
                  "context_id",
                  "url_pattern",
                  "action"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_remove_network_rule": {
      "post": {
        "summary": "Browser Remove Network Rule",
        "description": "Remove a previously added network interception rule by its ID. The rule immediately stops applying to new requests. Use browser_add_network_rule's returned rule_id to remove specific rules.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "rule_id": {
                    "type": "string",
                    "description": "The unique identifier of the rule to remove, returned by browser_add_network_rule when the rule was created"
                  }
                },
                "required": [
                  "context_id",
                  "rule_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_enable_network_interception": {
      "post": {
        "summary": "Browser Enable Network Interception",
        "description": "Enable or disable network interception for a context. When disabled, all rules are ignored and requests pass through normally. When enabled, rules start applying. Useful for toggling interception without removing rules.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "enable": {
                    "type": "boolean",
                    "description": "Set to true to enable network interception (rules start applying), false to disable. When disabled, all requests pass through normally regardless of rules"
                  }
                },
                "required": [
                  "context_id",
                  "enable"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_network_log": {
      "post": {
        "summary": "Browser Get Network Log",
        "description": "Retrieve the log of captured network requests and responses for debugging and analysis. Returns request URLs, methods, headers, status codes, and response sizes. Enable interception first to start capturing.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_network_rules": {
      "post": {
        "summary": "Browser Get Network Rules",
        "description": "List all network interception rules for a context. Returns an array of rules with their id, url_pattern, action (block/allow/mock/redirect), is_regex flag, and additional settings like redirect_url or mock_body depending on the action type.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_clear_network_log": {
      "post": {
        "summary": "Browser Clear Network Log",
        "description": "Clear all captured network log entries for the context. Use periodically to prevent memory buildup during long sessions with network interception enabled.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_enable_network_logging": {
      "post": {
        "summary": "Browser Enable Network Logging",
        "description": "Enable or disable network request/response logging for the context. When enabled, all network activity is captured and can be retrieved with get_network_log.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "enable": {
                    "type": "boolean",
                    "description": "Enable (true) or disable (false) network logging for this context"
                  }
                },
                "required": [
                  "context_id",
                  "enable"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_disable_network_interception": {
      "post": {
        "summary": "Browser Disable Network Interception",
        "description": "Disable network interception for a context. All network rules will be ignored and requests pass through normally. Equivalent to calling browser_enable_network_interception with enable=false.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_disable_network_logging": {
      "post": {
        "summary": "Browser Disable Network Logging",
        "description": "Disable network request/response logging for a context. Network activity will no longer be captured. Equivalent to calling browser_enable_network_logging with enable=false.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_set_download_path": {
      "post": {
        "summary": "Browser Set Download Path",
        "description": "Configure the directory where browser downloads will be saved. Must be set before triggering downloads. The directory must exist and be writable. Downloaded files are saved with their original filenames.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "path": {
                    "type": "string",
                    "description": "Absolute path to the directory where downloaded files will be saved. The directory must exist and be writable. Example: '/tmp/downloads' or '/home/user/Downloads'"
                  }
                },
                "required": [
                  "context_id",
                  "path"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_downloads": {
      "post": {
        "summary": "Browser Get Downloads",
        "description": "List all downloads for the context with their current status. Returns download ID, filename, URL, progress percentage, bytes downloaded, total size, and state (pending, in_progress, completed, failed, cancelled).",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_active_downloads": {
      "post": {
        "summary": "Browser Get Active Downloads",
        "description": "Get only currently active (in-progress) downloads for the context. More efficient than get_downloads when you only need to monitor ongoing transfers.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_wait_for_download": {
      "post": {
        "summary": "Browser Wait For Download",
        "description": "Block until a specific download completes or times out. Returns the final download status and file path on success. Use after triggering a download to ensure it finishes before proceeding.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "download_id": {
                    "type": "string",
                    "description": "The unique identifier of the download to wait for, obtained from browser_get_downloads or triggered download events"
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Maximum time to wait for download completion in milliseconds. Returns error if exceeded. Default: 30000 (30 seconds). Set higher for large files"
                  }
                },
                "required": [
                  "download_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_cancel_download": {
      "post": {
        "summary": "Browser Cancel Download",
        "description": "Cancel an in-progress download. Stops the download immediately and may delete partially downloaded content. The download will be marked as 'cancelled' in the downloads list.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "download_id": {
                    "type": "string",
                    "description": "The unique identifier of the in-progress download to cancel. Cancellation stops the download and may delete partially downloaded content"
                  }
                },
                "required": [
                  "download_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_set_dialog_action": {
      "post": {
        "summary": "Browser Set Dialog Action",
        "description": "Configure automatic handling for JavaScript dialogs (alert, confirm, prompt, beforeunload). Set once and all future dialogs of that type are handled automatically. Useful for preventing dialog interruptions during automated browsing. Each dialog type can have a different action.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "dialog_type": {
                    "type": "string",
                    "description": "Type of JavaScript dialog to configure: 'alert' (message display), 'confirm' (yes/no), 'prompt' (text input), 'beforeunload' (page leave warning)",
                    "enum": [
                      "alert",
                      "confirm",
                      "prompt",
                      "beforeunload"
                    ]
                  },
                  "action": {
                    "type": "string",
                    "description": "How to automatically handle this dialog type: 'accept' clicks OK/Yes, 'dismiss' clicks Cancel/No, 'accept_with_text' accepts and provides text input (for prompts), 'wait' holds the dialog for manual handling via browser_handle_dialog",
                    "enum": [
                      "accept",
                      "dismiss",
                      "accept_with_text",
                      "wait"
                    ]
                  },
                  "prompt_text": {
                    "type": "string",
                    "description": "Default text to enter when accepting prompt dialogs. Only used when dialog_type='prompt' and action='accept_with_text'. Leave empty for blank input"
                  }
                },
                "required": [
                  "context_id",
                  "dialog_type",
                  "action"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_pending_dialog": {
      "post": {
        "summary": "Browser Get Pending Dialog",
        "description": "Check if there's a JavaScript dialog currently waiting for user action. Returns dialog type, message, default prompt value, and dialog ID. Returns null/empty if no dialog is pending.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_dialogs": {
      "post": {
        "summary": "Browser Get Dialogs",
        "description": "Get all dialog events that have occurred in the context, including handled and pending dialogs. Useful for reviewing dialog history and debugging dialog handling.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_handle_dialog": {
      "post": {
        "summary": "Browser Handle Dialog",
        "description": "Manually accept or dismiss a specific dialog by its ID. Use for interactive dialog handling instead of automatic actions. For prompt dialogs, can provide response text when accepting.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "dialog_id": {
                    "type": "string",
                    "description": "The unique identifier of the dialog to handle, obtained from browser_get_pending_dialog or browser_wait_for_dialog"
                  },
                  "accept": {
                    "type": "boolean",
                    "description": "Set to true to accept (click OK/Yes) or false to dismiss (click Cancel/No) the dialog"
                  },
                  "response_text": {
                    "type": "string",
                    "description": "Text to enter in prompt dialogs before accepting. Only applicable for prompt dialogs when accept=true. Ignored for alert and confirm dialogs"
                  }
                },
                "required": [
                  "dialog_id",
                  "accept"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_wait_for_dialog": {
      "post": {
        "summary": "Browser Wait For Dialog",
        "description": "Wait for a JavaScript dialog to appear. Blocks until a dialog shows up or timeout expires. Useful when you know an action will trigger a dialog and need to handle it specifically.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Maximum time to wait for a dialog to appear in milliseconds. Returns error if no dialog appears. Default: 5000 (5 seconds)"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_set_popup_policy": {
      "post": {
        "summary": "Browser Set Popup Policy",
        "description": "Configure how popup windows are handled when JavaScript calls window.open() or links have target='_blank'. Options: 'allow' opens new window, 'block' prevents popup entirely, 'new_tab' opens in foreground tab, 'background' opens in background tab. Default behavior may vary by browser.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "policy": {
                    "type": "string",
                    "description": "How to handle popup windows opened by window.open() or target='_blank' links: 'allow' opens in new window, 'block' prevents popup, 'new_tab' opens in foreground tab, 'background' opens in background tab",
                    "enum": [
                      "allow",
                      "block",
                      "new_tab",
                      "background"
                    ]
                  }
                },
                "required": [
                  "context_id",
                  "policy"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_tabs": {
      "post": {
        "summary": "Browser Get Tabs",
        "description": "List all tabs/windows in the browser context. Returns tab ID, URL, title, and active status for each tab. Use to discover which tabs are open and get tab IDs for switching or closing.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_switch_tab": {
      "post": {
        "summary": "Browser Switch Tab",
        "description": "Switch focus to a specific tab by its ID. The tab becomes the active tab, and subsequent browser operations will interact with that tab's content. Other tabs continue running in the background.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "tab_id": {
                    "type": "string",
                    "description": "The unique identifier of the tab to activate/switch to, obtained from browser_get_tabs"
                  }
                },
                "required": [
                  "context_id",
                  "tab_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_close_tab": {
      "post": {
        "summary": "Browser Close Tab",
        "description": "Close a specific tab by its ID. The tab is destroyed and its resources freed. If the closed tab was active, another tab becomes active. Cannot close the last remaining tab.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "tab_id": {
                    "type": "string",
                    "description": "The unique identifier of the tab to close, obtained from browser_get_tabs. Cannot close the last remaining tab in a context"
                  }
                },
                "required": [
                  "context_id",
                  "tab_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_new_tab": {
      "post": {
        "summary": "Browser New Tab",
        "description": "Open a new tab in the browser context. Optionally navigate to a URL immediately. The new tab becomes active by default. Use for parallel browsing within a single context.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "url": {
                    "type": "string",
                    "description": "URL to navigate to in the new tab. If not provided, opens a blank tab (about:blank). Include full URL with protocol (e.g., 'https://example.com')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_active_tab": {
      "post": {
        "summary": "Browser Get Active Tab",
        "description": "Get information about the currently active (focused) tab. Returns tab ID, URL, and title. Browser operations target this tab unless you switch to another.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_tab_count": {
      "post": {
        "summary": "Browser Get Tab Count",
        "description": "Get the number of open tabs in the context. Quick way to check if multiple tabs exist without retrieving full tab details.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_blocked_popups": {
      "post": {
        "summary": "Browser Get Blocked Popups",
        "description": "Get a list of popup URLs that were blocked due to popup policy set to 'block'. Useful for discovering popups that would have opened and deciding whether to allow them.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_license_status": {
      "post": {
        "summary": "Browser Get License Status",
        "description": "Check if the browser has a valid license. Returns license status (valid, expired, missing, invalid), expiration date, and license type (trial, standard, enterprise). Quick check for license validity.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_license_info": {
      "post": {
        "summary": "Browser Get License Info",
        "description": "Get comprehensive license information including licensee name, license key (partially masked), features enabled, usage limits, support expiration, and full license metadata.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_hardware_fingerprint": {
      "post": {
        "summary": "Browser Get Hardware Fingerprint",
        "description": "Get the machine's hardware fingerprint used for license binding. Provide this to obtain a license file tied to your hardware. The fingerprint is a unique identifier based on hardware characteristics.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_add_license": {
      "post": {
        "summary": "Browser Add License",
        "description": "Install a license file to activate the browser. Provide either a file path or base64-encoded content. The license is validated against the hardware fingerprint. Returns success/failure with validation details.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "license_path": {
                    "type": "string",
                    "description": "Absolute path to the license file (.olic extension). Example: '/path/to/license.olic'"
                  }
                },
                "required": [
                  "license_path"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_remove_license": {
      "post": {
        "summary": "Browser Remove License",
        "description": "Remove the currently installed license. The browser reverts to unlicensed/trial mode. Use before installing a new license or to deactivate the browser on this machine.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_element_at_position": {
      "post": {
        "summary": "Browser Get Element At Position",
        "description": "Get detailed information about the DOM element at specific XY coordinates. Returns element tag, ID, classes, bounding box, text content, and computed styles. Use with browser_show_grid_overlay to find coordinates. Useful for debugging and building element picker UIs.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "x": {
                    "type": "number",
                    "description": "X coordinate in pixels from the left edge of the viewport. Use browser_show_grid_overlay to visualize coordinates on the page"
                  },
                  "y": {
                    "type": "number",
                    "description": "Y coordinate in pixels from the top edge of the viewport. Use browser_show_grid_overlay to visualize coordinates on the page"
                  }
                },
                "required": [
                  "context_id",
                  "x",
                  "y"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_interactive_elements": {
      "post": {
        "summary": "Browser Get Interactive Elements",
        "description": "Find all interactive elements on the page (buttons, links, inputs, selects, etc.). Returns position, size, and identifying info for each element. Used for building visual overlays showing clickable/interactable areas, or for automated element discovery.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_page_map": {
      "post": {
        "summary": "Browser Get Page Map",
        "description": "Get a compact structured map of all interactive elements on the page, grouped by sections. Returns a markdown table with numbered references, types, descriptions, current values, and selectors. Use element numbers as selectors in browser_click and browser_type (e.g., selector '5'). 10x cheaper than screenshots for AI agent page understanding.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "intent": {
                    "type": "string",
                    "description": "Task description to boost matching elements (e.g., 'buy nvidia jetson')"
                  },
                  "max_elements": {
                    "type": "string",
                    "description": "Maximum number of elements to return (0 = unlimited). Returns top N by importance score"
                  },
                  "region": {
                    "type": "string",
                    "description": "Filter to specific page region: 'main', 'nav', 'header', 'footer', 'sidebar', 'article', 'form', 'dialog'. Empty = all regions"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_get_blocker_stats": {
      "post": {
        "summary": "Browser Get Blocker Stats",
        "description": "Get statistics about blocked ads, trackers, and analytics. Returns counts for each category and total blocked/allowed requests. Useful for monitoring ad blocker effectiveness.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/ipc_tests_run": {
      "post": {
        "summary": "Ipc Tests Run",
        "description": "Start a new IPC test run to validate browser IPC communication. Supports multiple test modes: 'smoke' for quick validation (5 tests), 'full' for comprehensive testing (138+ methods), 'benchmark' for performance measurement, 'stress' for load testing, 'leak-check' for memory analysis, 'parallel' for concurrent context testing. Returns a run_id to track progress.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "mode": {
                    "type": "string",
                    "description": "Test mode to run. Options: 'smoke' (quick validation, 5 tests), 'full' (comprehensive, 138+ tests), 'benchmark' (performance testing), 'stress' (load testing), 'leak-check' (memory leak detection), 'parallel' (concurrent context testing). Default: 'full'",
                    "enum": [
                      "smoke",
                      "full",
                      "benchmark",
                      "stress",
                      "leak-check",
                      "parallel"
                    ]
                  },
                  "verbose": {
                    "type": "boolean",
                    "description": "Enable verbose output during test execution. Default: false"
                  },
                  "iterations": {
                    "type": "string",
                    "description": "Number of iterations for benchmark mode. Default: 1"
                  },
                  "contexts": {
                    "type": "string",
                    "description": "Number of browser contexts for stress mode. Default: 10"
                  },
                  "duration": {
                    "type": "string",
                    "description": "Duration in seconds for stress and leak-check modes. Default: 60"
                  },
                  "concurrency": {
                    "type": "string",
                    "description": "Number of concurrent threads for parallel mode. Default: 1"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/ipc_tests_status": {
      "post": {
        "summary": "Ipc Tests Status",
        "description": "Get the status of an IPC test run. Returns status (running/completed/failed/aborted), test results summary (total/passed/failed), duration, and commands per second. If run_id is not provided, returns status of the current or last run.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "run_id": {
                    "type": "string",
                    "description": "The unique run ID to query. If not provided, returns status of current/last run."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/ipc_tests_abort": {
      "post": {
        "summary": "Ipc Tests Abort",
        "description": "Abort a running IPC test. Sends SIGTERM to the test process and waits for graceful shutdown. Use when a test is taking too long or needs to be cancelled.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "run_id": {
                    "type": "string",
                    "description": "The unique run ID of the test to abort."
                  }
                },
                "required": [
                  "run_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/ipc_tests_list_reports": {
      "post": {
        "summary": "Ipc Tests List Reports",
        "description": "List all available IPC test reports. Returns an array of report metadata including run_id, timestamp, mode, test counts, and duration. Reports are stored in the reports directory.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/ipc_tests_get_report": {
      "post": {
        "summary": "Ipc Tests Get Report",
        "description": "Get a specific IPC test report by run_id. Returns JSON data, HTML dashboard, or raw log output depending on the format parameter. JSON includes detailed test results, latency stats, resource usage, and failure details. HTML is an interactive dashboard with charts. Log returns the test client's stdout/stderr output for debugging failures.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "run_id": {
                    "type": "string",
                    "description": "The unique run ID of the report to retrieve."
                  },
                  "format": {
                    "type": "string",
                    "description": "Report format to return. Options: 'json' (raw test data), 'html' (interactive dashboard), 'log' (test client stdout/stderr output). Default: 'json'",
                    "enum": [
                      "json",
                      "html",
                      "log"
                    ]
                  }
                },
                "required": [
                  "run_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/ipc_tests_delete_report": {
      "post": {
        "summary": "Ipc Tests Delete Report",
        "description": "Delete an IPC test report by run_id. Removes JSON, HTML, and log files from disk. Use to clean up old test results.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "run_id": {
                    "type": "string",
                    "description": "The unique run ID of the report to delete."
                  }
                },
                "required": [
                  "run_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/ipc_tests_clean_all": {
      "post": {
        "summary": "Ipc Tests Clean All",
        "description": "Delete all IPC test reports. Removes all JSON, HTML, and log files from the reports directory. Use to clean up all test history.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/server_restart_browser": {
      "post": {
        "summary": "Server Restart Browser",
        "description": "Restart the HTTP server and browser via s6-overlay process supervisor. This performs a clean restart of the entire service, ensuring both the HTTP server and browser processes are fully restarted. Useful for recovering from browser hangs, memory issues, or applying configuration changes. All active browser contexts will be terminated. The restart is non-blocking - the response is sent before the restart occurs (~1 second delay). In Docker containers, uses s6-svc for graceful restart. Falls back to browser-only restart in non-Docker environments.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "force": {
                    "type": "boolean",
                    "description": "Force restart even if browser appears healthy. Default: false"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/server_read_logs": {
      "post": {
        "summary": "Server Read Logs",
        "description": "Read log entries from either the browser process or HTTP server. By default reads from browser logs which contain detailed IPC commands, rendering events, and page interactions. Use source='server' for HTTP server logs. Supports head (first N lines), tail (last N lines), or range (specific line range) modes. Can filter logs by level (DEBUG, INFO, WARN, ERROR) and by pattern matching (regex or substring).",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "source": {
                    "type": "string",
                    "description": "Log source to read from: 'browser' (browser process logs with detailed IPC, rendering, and page events) or 'server' (HTTP server logs). Default: 'browser'",
                    "enum": [
                      "browser",
                      "server"
                    ]
                  },
                  "mode": {
                    "type": "string",
                    "description": "Read mode: 'head' (first N lines), 'tail' (last N lines), 'range' (specific line range). Default: 'tail'",
                    "enum": [
                      "head",
                      "tail",
                      "range"
                    ]
                  },
                  "lines": {
                    "type": "string",
                    "description": "Number of lines to return for head/tail mode. Default: 100"
                  },
                  "start_line": {
                    "type": "string",
                    "description": "Starting line number for range mode (1-indexed). Default: 1"
                  },
                  "end_line": {
                    "type": "string",
                    "description": "Ending line number for range mode (1-indexed). Default: start_line + 100"
                  },
                  "filter": {
                    "type": "string",
                    "description": "Filter pattern to match log lines. Supports regex or simple substring matching."
                  },
                  "level": {
                    "type": "string",
                    "description": "Filter by log level: 'DEBUG', 'INFO', 'WARN', 'ERROR'. Only lines with this level are returned.",
                    "enum": [
                      "DEBUG",
                      "INFO",
                      "WARN",
                      "ERROR"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/http_request": {
      "post": {
        "summary": "Http Request",
        "description": "Make an HTTP/HTTPS request with full control over method, headers, body, authentication, proxy, and TLS settings. Supports GET, POST, PUT, DELETE, PATCH, HEAD, and OPTIONS methods. Includes proxy support (HTTP, HTTPS, SOCKS4, SOCKS5, SOCKS5H) and built-in Tor integration for anonymous requests. Returns status code, response headers, body, timing information, and redirect details. Use 'output' parameter to control body format: 'text' for UTF-8, 'base64' for binary content, 'json' for parsed JSON.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "The full URL to request, including protocol (e.g., 'https://api.example.com/data'). Supports http:// and https:// protocols."
                  },
                  "method": {
                    "type": "string",
                    "description": "HTTP method to use. Options: 'GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS'. Default: 'GET'",
                    "enum": [
                      "GET",
                      "POST",
                      "PUT",
                      "DELETE",
                      "PATCH",
                      "HEAD",
                      "OPTIONS"
                    ]
                  },
                  "headers": {
                    "type": "string",
                    "description": "HTTP headers as a JSON object (e.g., {\"Content-Type\": \"application/json\", \"X-Custom\": \"value\"}) or as a string with one header per line. Each key-value pair becomes a request header."
                  },
                  "body": {
                    "type": "string",
                    "description": "Request body content. For JSON APIs, pass a JSON string and set Content-Type header to 'application/json'. For form data, use URL-encoded format with Content-Type 'application/x-www-form-urlencoded'."
                  },
                  "cookies": {
                    "type": "string",
                    "description": "Cookies to send with the request. Accepts either a string in 'name=value; name2=value2' format, or a JSON array of cookie objects from browser_get_cookies (e.g., [{\"name\": \"session\", \"value\": \"abc\"}, ...]). When using the array format, only 'name' and 'value' fields are used."
                  },
                  "auth_type": {
                    "type": "string",
                    "description": "Authentication type. Options: 'none', 'basic', 'bearer', 'digest'. Default: 'none'",
                    "enum": [
                      "none",
                      "basic",
                      "bearer",
                      "digest"
                    ]
                  },
                  "auth_username": {
                    "type": "string",
                    "description": "Username for basic or digest authentication."
                  },
                  "auth_password": {
                    "type": "string",
                    "description": "Password for basic or digest authentication."
                  },
                  "auth_token": {
                    "type": "string",
                    "description": "Bearer token for bearer authentication (without 'Bearer ' prefix)."
                  },
                  "proxy_type": {
                    "type": "string",
                    "description": "Type of proxy server. Options: 'http', 'https', 'socks4', 'socks5', 'socks5h'. Use 'socks5h' for remote DNS resolution (recommended for privacy).",
                    "enum": [
                      "http",
                      "https",
                      "socks4",
                      "socks5",
                      "socks5h"
                    ]
                  },
                  "proxy_host": {
                    "type": "string",
                    "description": "Proxy server hostname or IP address."
                  },
                  "proxy_port": {
                    "type": "string",
                    "description": "Proxy server port number."
                  },
                  "proxy_username": {
                    "type": "string",
                    "description": "Username for proxy authentication."
                  },
                  "proxy_password": {
                    "type": "string",
                    "description": "Password for proxy authentication."
                  },
                  "use_tor": {
                    "type": "boolean",
                    "description": "Use built-in Tor proxy (SOCKS5H at 127.0.0.1:9050) for anonymous requests. Overrides any proxy settings. Default: false"
                  },
                  "follow_redirects": {
                    "type": "boolean",
                    "description": "Follow HTTP redirects automatically. Default: true"
                  },
                  "max_redirects": {
                    "type": "string",
                    "description": "Maximum number of redirects to follow. Default: 10"
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Total request timeout in milliseconds. Default: 30000 (30 seconds)"
                  },
                  "connect_timeout": {
                    "type": "string",
                    "description": "Connection timeout in milliseconds. Default: 10000 (10 seconds)"
                  },
                  "ssl_verify": {
                    "type": "boolean",
                    "description": "Verify SSL/TLS certificates. Set to false for self-signed certificates. Default: true"
                  },
                  "ca_cert_path": {
                    "type": "string",
                    "description": "Path to custom CA certificate bundle file (.pem) for SSL verification."
                  },
                  "user_agent": {
                    "type": "string",
                    "description": "Custom User-Agent header string. Overrides default."
                  },
                  "output": {
                    "type": "string",
                    "description": "Response body output format. 'text' for UTF-8 text, 'base64' for binary content encoded as base64, 'json' to attempt JSON parsing. Default: 'text'",
                    "enum": [
                      "text",
                      "base64",
                      "json"
                    ]
                  }
                },
                "required": [
                  "url"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/http_download": {
      "post": {
        "summary": "Http Download",
        "description": "Download a file from an HTTP/HTTPS URL and save it to disk. Supports resume for interrupted downloads, custom output paths, proxy configuration, and Tor anonymization. If no output path is specified, the file is saved to /tmp/owl_downloads/ with a filename derived from the URL or Content-Disposition header. Returns the file path, size, content type, and download timing.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "The URL of the file to download. Supports http:// and https:// protocols."
                  },
                  "output_path": {
                    "type": "string",
                    "description": "Full path where the file should be saved. If not specified, saves to /tmp/owl_downloads/ with filename derived from URL or Content-Disposition header."
                  },
                  "headers": {
                    "type": "string",
                    "description": "HTTP headers as a JSON object or string."
                  },
                  "cookies": {
                    "type": "string",
                    "description": "Cookies to send with the request. Accepts 'name=value; name2=value2' string or a JSON array from browser_get_cookies."
                  },
                  "proxy_type": {
                    "type": "string",
                    "description": "Type of proxy server.",
                    "enum": [
                      "http",
                      "https",
                      "socks4",
                      "socks5",
                      "socks5h"
                    ]
                  },
                  "proxy_host": {
                    "type": "string",
                    "description": "Proxy server hostname or IP address."
                  },
                  "proxy_port": {
                    "type": "string",
                    "description": "Proxy server port number."
                  },
                  "proxy_username": {
                    "type": "string",
                    "description": "Username for proxy authentication."
                  },
                  "proxy_password": {
                    "type": "string",
                    "description": "Password for proxy authentication."
                  },
                  "use_tor": {
                    "type": "boolean",
                    "description": "Use built-in Tor proxy for anonymous download. Default: false"
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Download timeout in milliseconds. Default: 30000 (30 seconds)"
                  },
                  "ssl_verify": {
                    "type": "boolean",
                    "description": "Verify SSL/TLS certificates. Default: true"
                  },
                  "ca_cert_path": {
                    "type": "string",
                    "description": "Path to custom CA certificate bundle file."
                  },
                  "resume": {
                    "type": "boolean",
                    "description": "Resume an interrupted download if the server supports byte ranges. Default: false"
                  },
                  "user_agent": {
                    "type": "string",
                    "description": "Custom User-Agent header string."
                  }
                },
                "required": [
                  "url"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/ftp_list": {
      "post": {
        "summary": "Ftp List",
        "description": "List the contents of an FTP directory. Returns the directory listing as text. Supports authenticated FTP, FTPS (FTP over SSL/TLS), proxy configuration, and Tor anonymization. The URL must end with a trailing slash for directory listings.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "FTP URL to list (e.g., 'ftp://ftp.example.com/pub/'). Must end with / for directory listing."
                  },
                  "username": {
                    "type": "string",
                    "description": "FTP username. Default: anonymous"
                  },
                  "password": {
                    "type": "string",
                    "description": "FTP password. Default: empty"
                  },
                  "proxy_type": {
                    "type": "string",
                    "description": "Type of proxy server.",
                    "enum": [
                      "http",
                      "https",
                      "socks4",
                      "socks5",
                      "socks5h"
                    ]
                  },
                  "proxy_host": {
                    "type": "string",
                    "description": "Proxy server hostname or IP address."
                  },
                  "proxy_port": {
                    "type": "string",
                    "description": "Proxy server port number."
                  },
                  "proxy_username": {
                    "type": "string",
                    "description": "Username for proxy authentication."
                  },
                  "proxy_password": {
                    "type": "string",
                    "description": "Password for proxy authentication."
                  },
                  "use_tor": {
                    "type": "boolean",
                    "description": "Use built-in Tor proxy. Default: false"
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Timeout in milliseconds. Default: 30000"
                  },
                  "use_ssl": {
                    "type": "boolean",
                    "description": "Use FTPS (FTP over SSL/TLS). Default: false"
                  }
                },
                "required": [
                  "url"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/ftp_download": {
      "post": {
        "summary": "Ftp Download",
        "description": "Download a file from an FTP server. Supports authenticated FTP, FTPS (FTP over SSL/TLS), proxy configuration, and Tor anonymization. If no output path is specified, saves to /tmp/owl_downloads/. Returns file path, size, and download timing.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "FTP URL of the file to download (e.g., 'ftp://ftp.example.com/pub/file.tar.gz')."
                  },
                  "output_path": {
                    "type": "string",
                    "description": "Full path where the file should be saved. If not specified, saves to /tmp/owl_downloads/."
                  },
                  "username": {
                    "type": "string",
                    "description": "FTP username. Default: anonymous"
                  },
                  "password": {
                    "type": "string",
                    "description": "FTP password. Default: empty"
                  },
                  "proxy_type": {
                    "type": "string",
                    "description": "Type of proxy server.",
                    "enum": [
                      "http",
                      "https",
                      "socks4",
                      "socks5",
                      "socks5h"
                    ]
                  },
                  "proxy_host": {
                    "type": "string",
                    "description": "Proxy server hostname or IP address."
                  },
                  "proxy_port": {
                    "type": "string",
                    "description": "Proxy server port number."
                  },
                  "proxy_username": {
                    "type": "string",
                    "description": "Username for proxy authentication."
                  },
                  "proxy_password": {
                    "type": "string",
                    "description": "Password for proxy authentication."
                  },
                  "use_tor": {
                    "type": "boolean",
                    "description": "Use built-in Tor proxy. Default: false"
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Timeout in milliseconds. Default: 30000"
                  },
                  "use_ssl": {
                    "type": "boolean",
                    "description": "Use FTPS (FTP over SSL/TLS). Default: false"
                  }
                },
                "required": [
                  "url"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/ftp_upload": {
      "post": {
        "summary": "Ftp Upload",
        "description": "Upload a local file to an FTP server. Supports authenticated FTP, FTPS (FTP over SSL/TLS), proxy configuration, and Tor anonymization. Specify the FTP destination URL and local file path.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "description": "FTP URL where the file should be uploaded (e.g., 'ftp://ftp.example.com/uploads/file.txt')."
                  },
                  "file_path": {
                    "type": "string",
                    "description": "Local path of the file to upload."
                  },
                  "username": {
                    "type": "string",
                    "description": "FTP username. Default: anonymous"
                  },
                  "password": {
                    "type": "string",
                    "description": "FTP password. Default: empty"
                  },
                  "proxy_type": {
                    "type": "string",
                    "description": "Type of proxy server.",
                    "enum": [
                      "http",
                      "https",
                      "socks4",
                      "socks5",
                      "socks5h"
                    ]
                  },
                  "proxy_host": {
                    "type": "string",
                    "description": "Proxy server hostname or IP address."
                  },
                  "proxy_port": {
                    "type": "string",
                    "description": "Proxy server port number."
                  },
                  "proxy_username": {
                    "type": "string",
                    "description": "Username for proxy authentication."
                  },
                  "proxy_password": {
                    "type": "string",
                    "description": "Password for proxy authentication."
                  },
                  "use_tor": {
                    "type": "boolean",
                    "description": "Use built-in Tor proxy. Default: false"
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Timeout in milliseconds. Default: 30000"
                  },
                  "use_ssl": {
                    "type": "boolean",
                    "description": "Use FTPS (FTP over SSL/TLS). Default: false"
                  }
                },
                "required": [
                  "url",
                  "file_path"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/http_session_create": {
      "post": {
        "summary": "Http Session Create",
        "description": "Create a persistent HTTP session with automatic cookie management. Cookies received from servers are stored and automatically sent with subsequent requests in the same session. Configure default headers, proxy, user agent, and TLS settings that apply to all requests in the session. Returns a session_id for use with http_session_request and other session tools. Maximum 64 concurrent sessions.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "headers": {
                    "type": "string",
                    "description": "Default HTTP headers as a JSON object or string. Applied to all session requests unless overridden."
                  },
                  "user_agent": {
                    "type": "string",
                    "description": "Default User-Agent for all session requests."
                  },
                  "follow_redirects": {
                    "type": "boolean",
                    "description": "Default redirect following behavior. Default: true"
                  },
                  "max_redirects": {
                    "type": "string",
                    "description": "Default maximum redirects. Default: 10"
                  },
                  "ssl_verify": {
                    "type": "boolean",
                    "description": "Default SSL verification. Default: true"
                  },
                  "ca_cert_path": {
                    "type": "string",
                    "description": "Default CA certificate path for the session."
                  },
                  "proxy_type": {
                    "type": "string",
                    "description": "Default proxy type for the session.",
                    "enum": [
                      "http",
                      "https",
                      "socks4",
                      "socks5",
                      "socks5h"
                    ]
                  },
                  "proxy_host": {
                    "type": "string",
                    "description": "Default proxy host."
                  },
                  "proxy_port": {
                    "type": "string",
                    "description": "Default proxy port."
                  },
                  "proxy_username": {
                    "type": "string",
                    "description": "Default proxy username."
                  },
                  "proxy_password": {
                    "type": "string",
                    "description": "Default proxy password."
                  },
                  "use_tor": {
                    "type": "boolean",
                    "description": "Use built-in Tor proxy for all session requests. Default: false"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/http_session_request": {
      "post": {
        "summary": "Http Session Request",
        "description": "Make an HTTP request within a persistent session. Cookies from previous responses are automatically included. Session defaults (headers, proxy, user agent) are applied but can be overridden per-request. New cookies received are stored in the session for future requests. Ideal for multi-step workflows like login followed by authenticated API calls.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "session_id": {
                    "type": "string",
                    "description": "The session ID returned by http_session_create."
                  },
                  "url": {
                    "type": "string",
                    "description": "The full URL to request."
                  },
                  "method": {
                    "type": "string",
                    "description": "HTTP method. Default: 'GET'",
                    "enum": [
                      "GET",
                      "POST",
                      "PUT",
                      "DELETE",
                      "PATCH",
                      "HEAD",
                      "OPTIONS"
                    ]
                  },
                  "headers": {
                    "type": "string",
                    "description": "Additional HTTP headers as a JSON object or string. Merged with session default headers."
                  },
                  "body": {
                    "type": "string",
                    "description": "Request body content."
                  },
                  "cookies": {
                    "type": "string",
                    "description": "Additional cookies for this request. Accepts string or JSON array from browser_get_cookies."
                  },
                  "auth_type": {
                    "type": "string",
                    "description": "Authentication type for this request.",
                    "enum": [
                      "none",
                      "basic",
                      "bearer",
                      "digest"
                    ]
                  },
                  "auth_username": {
                    "type": "string",
                    "description": "Username for authentication."
                  },
                  "auth_password": {
                    "type": "string",
                    "description": "Password for authentication."
                  },
                  "auth_token": {
                    "type": "string",
                    "description": "Bearer token for authentication."
                  },
                  "follow_redirects": {
                    "type": "boolean",
                    "description": "Override session redirect behavior."
                  },
                  "timeout": {
                    "type": "string",
                    "description": "Request timeout in milliseconds."
                  },
                  "connect_timeout": {
                    "type": "string",
                    "description": "Connection timeout in milliseconds."
                  },
                  "ssl_verify": {
                    "type": "boolean",
                    "description": "Override session SSL verification."
                  },
                  "user_agent": {
                    "type": "string",
                    "description": "Override session User-Agent."
                  },
                  "output": {
                    "type": "string",
                    "description": "Response body output format. Default: 'text'",
                    "enum": [
                      "text",
                      "base64",
                      "json"
                    ]
                  }
                },
                "required": [
                  "session_id",
                  "url"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/http_session_get_cookies": {
      "post": {
        "summary": "Http Session Get Cookies",
        "description": "Get all cookies stored in a session. Optionally filter by URL to get only cookies that would be sent to a specific domain. Returns cookies as a JSON array with domain, name, value, path, expiry, secure, and httponly fields.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "session_id": {
                    "type": "string",
                    "description": "The session ID."
                  },
                  "url": {
                    "type": "string",
                    "description": "Optional URL filter. Only returns cookies that would be sent to this URL."
                  }
                },
                "required": [
                  "session_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/http_session_set_cookies": {
      "post": {
        "summary": "Http Session Set Cookies",
        "description": "Import cookies into a session. Accepts either a JSON array of cookie objects with domain, name, value, path fields, or Netscape cookie format lines. Useful for importing cookies from browser contexts (browser_get_cookies) into HTTP sessions for non-DOM operations.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "session_id": {
                    "type": "string",
                    "description": "The session ID."
                  },
                  "cookies": {
                    "type": "string",
                    "description": "Cookies to set. Accepts either a JSON array of cookie objects (e.g., '[{\"domain\": \".example.com\", \"name\": \"session\", \"value\": \"abc123\", \"path\": \"/\"}]') or Netscape cookie format lines."
                  }
                },
                "required": [
                  "session_id",
                  "cookies"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/http_session_close": {
      "post": {
        "summary": "Http Session Close",
        "description": "Close and destroy an HTTP session, freeing all stored cookies and resources. The session_id becomes invalid after this call.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "session_id": {
                    "type": "string",
                    "description": "The session ID to close and destroy."
                  }
                },
                "required": [
                  "session_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/http_session_list": {
      "post": {
        "summary": "Http Session List",
        "description": "List all active HTTP sessions with their IDs, creation time, last used time, request count, and configuration summary. Useful for managing multiple concurrent sessions.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_webmcp_get_tools": {
      "post": {
        "summary": "Browser Webmcp Get Tools",
        "description": "Get all WebMCP tools declared by the current page via navigator.modelContext.registerTool() or declarative <form toolname> elements. Returns a JSON array of tool definitions with name, description, and inputSchema. Use after navigating to a page to discover available page-level tools.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_webmcp_call_tool": {
      "post": {
        "summary": "Browser Webmcp Call Tool",
        "description": "Execute a WebMCP tool that was declared by the page. The tool's execute callback runs in the page's JavaScript context. For declarative form tools, this fills form fields with the input values and submits. Returns the tool's result as JSON. Timeout: 30 seconds.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  },
                  "tool_name": {
                    "type": "string",
                    "description": "The name of the WebMCP tool to execute (as registered by the page via navigator.modelContext.registerTool)"
                  },
                  "input": {
                    "type": "string",
                    "description": "JSON object containing input parameters for the tool, matching the tool's inputSchema"
                  }
                },
                "required": [
                  "context_id",
                  "tool_name"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_webmcp_refresh_tools": {
      "post": {
        "summary": "Browser Webmcp Refresh Tools",
        "description": "Trigger a re-scan of the page for declarative <form toolname> elements and return the updated tool list. Useful after SPA navigation or dynamic content changes that may have added new form-based tools.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "context_id": {
                    "type": "string",
                    "description": "The unique identifier of the browser context (e.g., 'ctx_000001')"
                  }
                },
                "required": [
                  "context_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    },
    "/api/execute/browser_webmcp_get_all_tools": {
      "post": {
        "summary": "Browser Webmcp Get All Tools",
        "description": "Get all WebMCP tools across all browser contexts. Returns a JSON object keyed by context_id, with each value being an array of tool definitions. Useful for discovering which pages have registered tools without querying each context individually.",
        "tags": [
          "General"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {}
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful response"
          },
          "400": {
            "description": "Bad request"
          },
          "401": {
            "description": "Unauthorized"
          }
        }
      }
    }
  }
}