@olib-ai/owl-browser-mcp 2.0.6 → 2.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +370 -46
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -20369,11 +20369,11 @@ var openapi_default = {
20369
20369
  info: {
20370
20370
  title: "Owl Browser API",
20371
20371
  description: "REST API for browser automation with anti-detection capabilities",
20372
- version: "1.0.9"
20372
+ version: "1.0.11"
20373
20373
  },
20374
20374
  servers: [
20375
20375
  {
20376
- url: "http://127.0.0.1:8080",
20376
+ url: "http://localhost",
20377
20377
  description: "Current server"
20378
20378
  }
20379
20379
  ],
@@ -20486,6 +20486,82 @@ var openapi_default = {
20486
20486
  }
20487
20487
  }
20488
20488
  },
20489
+ "/search": {
20490
+ get: {
20491
+ summary: "Browser Search",
20492
+ 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.",
20493
+ tags: [
20494
+ "Navigation"
20495
+ ],
20496
+ parameters: [
20497
+ {
20498
+ name: "query",
20499
+ in: "query",
20500
+ required: true,
20501
+ schema: {
20502
+ type: "string"
20503
+ },
20504
+ description: "The search query string (e.g., 'best restaurants in NYC', 'python tutorial')"
20505
+ },
20506
+ {
20507
+ name: "provider",
20508
+ in: "query",
20509
+ required: false,
20510
+ schema: {
20511
+ type: "string",
20512
+ enum: [
20513
+ "duckduckgo",
20514
+ "google"
20515
+ ]
20516
+ },
20517
+ description: "Search engine provider. 'duckduckgo' uses DuckDuckGo HTML-lite, 'google' uses Google Search. Default: duckduckgo"
20518
+ },
20519
+ {
20520
+ name: "page",
20521
+ in: "query",
20522
+ required: false,
20523
+ schema: {
20524
+ type: "integer"
20525
+ },
20526
+ description: "Page number for paginated results (1-based). Default: 1. For Google: appends &start=((page-1)*10). For DuckDuckGo: appends &s=((page-1)*10)"
20527
+ },
20528
+ {
20529
+ name: "os",
20530
+ in: "query",
20531
+ required: false,
20532
+ schema: {
20533
+ type: "string",
20534
+ enum: [
20535
+ "windows",
20536
+ "macos",
20537
+ "linux"
20538
+ ]
20539
+ },
20540
+ description: "Filter profiles by operating system. Options: 'windows', 'macos', 'linux'"
20541
+ },
20542
+ {
20543
+ name: "use_tor",
20544
+ in: "query",
20545
+ required: false,
20546
+ schema: {
20547
+ type: "boolean"
20548
+ },
20549
+ description: "Use TOR proxy for anonymous browsing. Each request gets a unique exit IP. Default: false"
20550
+ }
20551
+ ],
20552
+ responses: {
20553
+ "200": {
20554
+ description: "Successful response with structured search results JSON"
20555
+ },
20556
+ "400": {
20557
+ description: "Bad request"
20558
+ },
20559
+ "401": {
20560
+ description: "Unauthorized"
20561
+ }
20562
+ }
20563
+ }
20564
+ },
20489
20565
  "/api/execute/browser_create_context": {
20490
20566
  post: {
20491
20567
  summary: "Browser Create Context",
@@ -20500,29 +20576,47 @@ var openapi_default = {
20500
20576
  schema: {
20501
20577
  type: "object",
20502
20578
  properties: {
20503
- llm_enabled: {
20504
- type: "boolean",
20505
- 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"
20506
- },
20507
- llm_use_builtin: {
20508
- type: "boolean",
20509
- 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"
20579
+ profile_path: {
20580
+ type: "string",
20581
+ 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."
20510
20582
  },
20511
- llm_endpoint: {
20583
+ os: {
20512
20584
  type: "string",
20513
- description: "External LLM API endpoint URL (e.g., 'https://api.openai.com/v1' for OpenAI). Only used when llm_use_builtin is false"
20585
+ description: "Filter profiles by operating system. If set, only profiles matching this OS will be used. Options: 'windows', 'macos', 'linux'",
20586
+ enum: [
20587
+ "windows",
20588
+ "macos",
20589
+ "linux"
20590
+ ]
20514
20591
  },
20515
- llm_model: {
20592
+ gpu: {
20516
20593
  type: "string",
20517
- description: "External LLM model name (e.g., 'gpt-4-vision-preview' for OpenAI). Only used when llm_use_builtin is false"
20594
+ description: "Filter profiles by GPU vendor/model. If set, only profiles with matching GPU will be used. Examples: 'nvidia', 'amd', 'intel'"
20518
20595
  },
20519
- llm_api_key: {
20596
+ screen_size: {
20520
20597
  type: "string",
20521
- description: "API key for the external LLM provider. Required when using external LLM endpoint"
20598
+ description: "Screen resolution for the browser context. Format: 'WIDTHxHEIGHT'. If not set, a random screen size is selected from the monitor catalog.",
20599
+ enum: [
20600
+ "1920x1080",
20601
+ "2560x1440",
20602
+ "3440x1440",
20603
+ "3840x2160",
20604
+ "3840x1600",
20605
+ "5120x2160",
20606
+ "5120x1440"
20607
+ ]
20522
20608
  },
20523
- profile_path: {
20609
+ timezone: {
20524
20610
  type: "string",
20525
- 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."
20611
+ 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."
20612
+ },
20613
+ resource_blocking: {
20614
+ type: "boolean",
20615
+ description: "Enable or disable resource blocking (ads, trackers, analytics). When enabled, blocks requests to known ad networks, trackers, and analytics services. Default: true (enabled)"
20616
+ },
20617
+ agent_signature: {
20618
+ type: "boolean",
20619
+ description: "Enable Web Bot Auth (RFC 9421) request signing for this context. When enabled, every outgoing HTTP request is signed with Ed25519 Signature, Signature-Input, and Signature-Agent headers. Requires OWL_WBA_ENABLED=true and OWL_WBA_CONTACTS set. Default: false"
20526
20620
  },
20527
20621
  proxy_type: {
20528
20622
  type: "string",
@@ -20580,39 +20674,25 @@ var openapi_default = {
20580
20674
  type: "string",
20581
20675
  description: "Password for Tor control port authentication. Leave empty to use cookie authentication (default) or no auth"
20582
20676
  },
20583
- resource_blocking: {
20677
+ llm_enabled: {
20584
20678
  type: "boolean",
20585
- description: "Enable or disable resource blocking (ads, trackers, analytics). When enabled, blocks requests to known ad networks, trackers, and analytics services. Default: true (enabled)"
20679
+ 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"
20586
20680
  },
20587
- os: {
20588
- type: "string",
20589
- description: "Filter profiles by operating system. If set, only profiles matching this OS will be used. Options: 'windows', 'macos', 'linux'",
20590
- enum: [
20591
- "windows",
20592
- "macos",
20593
- "linux"
20594
- ]
20681
+ llm_use_builtin: {
20682
+ type: "boolean",
20683
+ 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"
20595
20684
  },
20596
- gpu: {
20685
+ llm_endpoint: {
20597
20686
  type: "string",
20598
- description: "Filter profiles by GPU vendor/model. If set, only profiles with matching GPU will be used. Examples: 'nvidia', 'amd', 'intel'"
20687
+ description: "External LLM API endpoint URL (e.g., 'https://api.openai.com/v1' for OpenAI). Only used when llm_use_builtin is false"
20599
20688
  },
20600
- timezone: {
20689
+ llm_model: {
20601
20690
  type: "string",
20602
- 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."
20691
+ description: "External LLM model name (e.g., 'gpt-4-vision-preview' for OpenAI). Only used when llm_use_builtin is false"
20603
20692
  },
20604
- screen_size: {
20693
+ llm_api_key: {
20605
20694
  type: "string",
20606
- description: "Screen resolution for the browser context. Format: 'WIDTHxHEIGHT'. If not set, a random screen size is selected from the monitor catalog.",
20607
- enum: [
20608
- "1920x1080",
20609
- "2560x1440",
20610
- "3440x1440",
20611
- "3840x2160",
20612
- "3840x1600",
20613
- "5120x2160",
20614
- "5120x1440"
20615
- ]
20695
+ description: "API key for the external LLM provider. Required when using external LLM endpoint"
20616
20696
  }
20617
20697
  }
20618
20698
  }
@@ -20705,7 +20785,7 @@ var openapi_default = {
20705
20785
  "/api/execute/browser_navigate": {
20706
20786
  post: {
20707
20787
  summary: "Browser Navigate",
20708
- 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.",
20788
+ 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.",
20709
20789
  tags: [
20710
20790
  "General"
20711
20791
  ],
@@ -23113,7 +23193,7 @@ var openapi_default = {
23113
23193
  },
23114
23194
  template: {
23115
23195
  type: "string",
23116
- description: "Extraction template name for known site types. Available: 'google_search', 'wikipedia', 'amazon_product', 'github_repo', 'twitter_feed', 'reddit_thread'. Leave empty for auto-detection based on URL"
23196
+ 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"
23117
23197
  },
23118
23198
  selector: {
23119
23199
  type: "string",
@@ -26614,11 +26694,12 @@ var openapi_default = {
26614
26694
  },
26615
26695
  action: {
26616
26696
  type: "string",
26617
- 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)",
26697
+ 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",
26618
26698
  enum: [
26619
26699
  "accept",
26620
26700
  "dismiss",
26621
- "accept_with_text"
26701
+ "accept_with_text",
26702
+ "wait"
26622
26703
  ]
26623
26704
  },
26624
26705
  prompt_text: {
@@ -28780,6 +28861,163 @@ var openapi_default = {
28780
28861
  }
28781
28862
  }
28782
28863
  }
28864
+ },
28865
+ "/api/execute/browser_webmcp_get_tools": {
28866
+ post: {
28867
+ summary: "Browser Webmcp Get Tools",
28868
+ 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.",
28869
+ tags: [
28870
+ "General"
28871
+ ],
28872
+ requestBody: {
28873
+ required: true,
28874
+ content: {
28875
+ "application/json": {
28876
+ schema: {
28877
+ type: "object",
28878
+ properties: {
28879
+ context_id: {
28880
+ type: "string",
28881
+ description: "The unique identifier of the browser context (e.g., 'ctx_000001')"
28882
+ }
28883
+ },
28884
+ required: [
28885
+ "context_id"
28886
+ ]
28887
+ }
28888
+ }
28889
+ }
28890
+ },
28891
+ responses: {
28892
+ "200": {
28893
+ description: "Successful response"
28894
+ },
28895
+ "400": {
28896
+ description: "Bad request"
28897
+ },
28898
+ "401": {
28899
+ description: "Unauthorized"
28900
+ }
28901
+ }
28902
+ }
28903
+ },
28904
+ "/api/execute/browser_webmcp_call_tool": {
28905
+ post: {
28906
+ summary: "Browser Webmcp Call Tool",
28907
+ 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.",
28908
+ tags: [
28909
+ "General"
28910
+ ],
28911
+ requestBody: {
28912
+ required: true,
28913
+ content: {
28914
+ "application/json": {
28915
+ schema: {
28916
+ type: "object",
28917
+ properties: {
28918
+ context_id: {
28919
+ type: "string",
28920
+ description: "The unique identifier of the browser context (e.g., 'ctx_000001')"
28921
+ },
28922
+ tool_name: {
28923
+ type: "string",
28924
+ description: "The name of the WebMCP tool to execute (as registered by the page via navigator.modelContext.registerTool)"
28925
+ },
28926
+ input: {
28927
+ type: "string",
28928
+ description: "JSON object containing input parameters for the tool, matching the tool's inputSchema"
28929
+ }
28930
+ },
28931
+ required: [
28932
+ "context_id",
28933
+ "tool_name"
28934
+ ]
28935
+ }
28936
+ }
28937
+ }
28938
+ },
28939
+ responses: {
28940
+ "200": {
28941
+ description: "Successful response"
28942
+ },
28943
+ "400": {
28944
+ description: "Bad request"
28945
+ },
28946
+ "401": {
28947
+ description: "Unauthorized"
28948
+ }
28949
+ }
28950
+ }
28951
+ },
28952
+ "/api/execute/browser_webmcp_refresh_tools": {
28953
+ post: {
28954
+ summary: "Browser Webmcp Refresh Tools",
28955
+ 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.",
28956
+ tags: [
28957
+ "General"
28958
+ ],
28959
+ requestBody: {
28960
+ required: true,
28961
+ content: {
28962
+ "application/json": {
28963
+ schema: {
28964
+ type: "object",
28965
+ properties: {
28966
+ context_id: {
28967
+ type: "string",
28968
+ description: "The unique identifier of the browser context (e.g., 'ctx_000001')"
28969
+ }
28970
+ },
28971
+ required: [
28972
+ "context_id"
28973
+ ]
28974
+ }
28975
+ }
28976
+ }
28977
+ },
28978
+ responses: {
28979
+ "200": {
28980
+ description: "Successful response"
28981
+ },
28982
+ "400": {
28983
+ description: "Bad request"
28984
+ },
28985
+ "401": {
28986
+ description: "Unauthorized"
28987
+ }
28988
+ }
28989
+ }
28990
+ },
28991
+ "/api/execute/browser_webmcp_get_all_tools": {
28992
+ post: {
28993
+ summary: "Browser Webmcp Get All Tools",
28994
+ 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.",
28995
+ tags: [
28996
+ "General"
28997
+ ],
28998
+ requestBody: {
28999
+ required: true,
29000
+ content: {
29001
+ "application/json": {
29002
+ schema: {
29003
+ type: "object",
29004
+ properties: {}
29005
+ }
29006
+ }
29007
+ }
29008
+ },
29009
+ responses: {
29010
+ "200": {
29011
+ description: "Successful response"
29012
+ },
29013
+ "400": {
29014
+ description: "Bad request"
29015
+ },
29016
+ "401": {
29017
+ description: "Unauthorized"
29018
+ }
29019
+ }
29020
+ }
28783
29021
  }
28784
29022
  }
28785
29023
  };
@@ -28789,11 +29027,97 @@ var API_ENDPOINT = process.env.OWL_API_ENDPOINT || "http://127.0.0.1:8080";
28789
29027
  var API_TOKEN = process.env.OWL_API_TOKEN || "";
28790
29028
  var activeContexts = /* @__PURE__ */ new Map();
28791
29029
  var toolIntegerFields = /* @__PURE__ */ new Map();
29030
+ var MCP_TOOL_WHITELIST = /* @__PURE__ */ new Set([
29031
+ // Context management
29032
+ "browser_create_context",
29033
+ "browser_close_context",
29034
+ "browser_list_contexts",
29035
+ // Navigation
29036
+ "browser_navigate",
29037
+ "browser_reload",
29038
+ "browser_go_back",
29039
+ "browser_go_forward",
29040
+ // Core interaction
29041
+ "browser_click",
29042
+ "browser_type",
29043
+ "browser_clear_input",
29044
+ "browser_press_key",
29045
+ "browser_keyboard_combo",
29046
+ "browser_pick",
29047
+ "browser_submit_form",
29048
+ "browser_focus",
29049
+ "browser_select_all",
29050
+ "browser_upload_file",
29051
+ // Content reading
29052
+ "browser_extract_text",
29053
+ "browser_screenshot",
29054
+ "browser_get_html",
29055
+ "browser_get_markdown",
29056
+ "browser_get_page_map",
29057
+ "browser_get_page_info",
29058
+ // Element state & discovery
29059
+ "browser_is_visible",
29060
+ "browser_is_enabled",
29061
+ "browser_is_checked",
29062
+ "browser_get_attribute",
29063
+ "browser_get_bounding_box",
29064
+ "browser_count_elements",
29065
+ "browser_find_element",
29066
+ // Scroll
29067
+ "browser_scroll_by",
29068
+ "browser_scroll_to_element",
29069
+ "browser_scroll_to_top",
29070
+ "browser_scroll_to_bottom",
29071
+ // Wait
29072
+ "browser_wait_for_selector",
29073
+ "browser_wait",
29074
+ "browser_wait_for_network_idle",
29075
+ "browser_wait_for_url",
29076
+ "browser_wait_for_function",
29077
+ // JavaScript & debug
29078
+ "browser_evaluate",
29079
+ "browser_get_console_log",
29080
+ "browser_clear_console_log",
29081
+ "browser_highlight",
29082
+ // Tabs
29083
+ "browser_get_tabs",
29084
+ "browser_switch_tab",
29085
+ "browser_new_tab",
29086
+ "browser_close_tab",
29087
+ "browser_get_active_tab",
29088
+ // Frames
29089
+ "browser_list_frames",
29090
+ "browser_switch_to_frame",
29091
+ "browser_switch_to_main_frame",
29092
+ // Dialogs
29093
+ "browser_set_dialog_action",
29094
+ "browser_handle_dialog",
29095
+ "browser_get_pending_dialog",
29096
+ // Cookies
29097
+ "browser_get_cookies",
29098
+ "browser_set_cookie",
29099
+ "browser_delete_cookies",
29100
+ // Network debug
29101
+ "browser_get_network_log",
29102
+ "browser_enable_network_logging",
29103
+ "browser_get_headers",
29104
+ // Viewport
29105
+ "browser_set_viewport",
29106
+ "browser_reset_viewport",
29107
+ // HTTP client
29108
+ "http_request",
29109
+ // WebMCP (page-declared tools management)
29110
+ "browser_webmcp_get_tools",
29111
+ "browser_webmcp_call_tool",
29112
+ "browser_webmcp_refresh_tools",
29113
+ "browser_webmcp_get_all_tools"
29114
+ ]);
28792
29115
  function convertOpenAPIToMCPTools(schema) {
28793
29116
  const tools = [];
28794
29117
  for (const [path, pathItem] of Object.entries(schema.paths)) {
28795
29118
  if (!pathItem.post) continue;
28796
29119
  const toolName = path.replace("/api/execute/", "");
29120
+ if (!MCP_TOOL_WHITELIST.has(toolName)) continue;
28797
29121
  const operation = pathItem.post;
28798
29122
  const requestSchema = operation.requestBody?.content?.["application/json"]?.schema;
28799
29123
  const inputSchema = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@olib-ai/owl-browser-mcp",
3
- "version": "2.0.6",
3
+ "version": "2.0.9",
4
4
  "description": "MCP server for Owl Browser HTTP API - 157 browser automation tools with anti-detection",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",