@olib-ai/owl-browser-mcp 1.0.4 → 2.0.0

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 (3) hide show
  1. package/README.md +4 -4
  2. package/dist/index.js +490 -36
  3. package/package.json +2 -2
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # Owl Browser MCP Server
2
2
 
3
- MCP (Model Context Protocol) server for Owl Browser HTTP API. This server dynamically generates 144 browser automation tools from the embedded OpenAPI schema.
3
+ MCP (Model Context Protocol) server for Owl Browser HTTP API. This server dynamically generates 157 browser automation tools from the embedded OpenAPI schema.
4
4
 
5
5
  ## Features
6
6
 
7
- - **144 Browser Tools**: Full browser automation including navigation, clicks, typing, screenshots, CAPTCHA solving, and more
7
+ - **157 Browser Tools**: Full browser automation including navigation, clicks, typing, screenshots, CAPTCHA solving, and more
8
8
  - **Multiple Contexts**: Create and manage multiple isolated browser contexts (sessions)
9
9
  - **Anti-Detection**: Built-in fingerprint management, proxy support, and stealth features
10
10
  - **HTTP API Backend**: Connects to Owl Browser's HTTP server (Docker or standalone)
@@ -149,7 +149,7 @@ If running from source instead of npm:
149
149
 
150
150
  ## Available Tools
151
151
 
152
- The server exposes 144 tools organized by category:
152
+ The server exposes 157 tools organized by category:
153
153
 
154
154
  ### Context Management
155
155
  - `browser_create_context` - Create isolated browser session
@@ -213,7 +213,7 @@ npx @modelcontextprotocol/inspector \
213
213
  ```
214
214
 
215
215
  The Inspector will open a web UI (default: http://localhost:6274) where you can:
216
- - Browse all 144 browser tools
216
+ - Browse all 157 browser tools
217
217
  - Execute tools with custom parameters
218
218
  - View JSON responses in real-time
219
219
 
package/dist/index.js CHANGED
@@ -20369,7 +20369,7 @@ 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.1.0"
20372
+ version: "1.0.4"
20373
20373
  },
20374
20374
  servers: [
20375
20375
  {
@@ -20427,17 +20427,18 @@ var openapi_default = {
20427
20427
  },
20428
20428
  profile_path: {
20429
20429
  type: "string",
20430
- description: "Path to a browser profile JSON file. If the file exists, loads fingerprints, cookies, and settings. If not, creates a new profile and saves it to this path. Useful for persistent browser sessions"
20430
+ 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."
20431
20431
  },
20432
20432
  proxy_type: {
20433
20433
  type: "string",
20434
- description: "Type of proxy server to use. Options: 'http', 'https', 'socks4', 'socks5', 'socks5h'. Use 'socks5h' for remote DNS resolution (recommended for privacy)",
20434
+ 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",
20435
20435
  enum: [
20436
20436
  "http",
20437
20437
  "https",
20438
20438
  "socks4",
20439
20439
  "socks5",
20440
- "socks5h"
20440
+ "socks5h",
20441
+ "gae"
20441
20442
  ]
20442
20443
  },
20443
20444
  proxy_host: {
@@ -20464,6 +20465,10 @@ var openapi_default = {
20464
20465
  type: "string",
20465
20466
  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"
20466
20467
  },
20468
+ proxy_ca_key_path: {
20469
+ type: "string",
20470
+ description: "Path to CA private key file for GAE/private app proxy MITM. Required for generating per-domain certificates when using 'gae' proxy type"
20471
+ },
20467
20472
  proxy_trust_custom_ca: {
20468
20473
  type: "boolean",
20469
20474
  description: "Trust the custom CA certificate for SSL interception. Enable when using Charles Proxy, mitmproxy, or similar tools that intercept HTTPS traffic. Default: false"
@@ -20496,6 +20501,10 @@ var openapi_default = {
20496
20501
  gpu: {
20497
20502
  type: "string",
20498
20503
  description: "Filter profiles by GPU vendor/model. If set, only profiles with matching GPU will be used. Examples: 'nvidia', 'amd', 'intel'"
20504
+ },
20505
+ timezone: {
20506
+ type: "string",
20507
+ 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."
20499
20508
  }
20500
20509
  }
20501
20510
  }
@@ -20609,12 +20618,13 @@ var openapi_default = {
20609
20618
  },
20610
20619
  wait_until: {
20611
20620
  type: "string",
20612
- 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)",
20621
+ 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)",
20613
20622
  enum: [
20614
20623
  "",
20615
20624
  "load",
20616
20625
  "domcontentloaded",
20617
- "networkidle"
20626
+ "networkidle",
20627
+ "fullscroll"
20618
20628
  ]
20619
20629
  },
20620
20630
  timeout: {
@@ -20667,12 +20677,13 @@ var openapi_default = {
20667
20677
  },
20668
20678
  wait_until: {
20669
20679
  type: "string",
20670
- 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)",
20680
+ 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)",
20671
20681
  enum: [
20672
20682
  "",
20673
20683
  "load",
20674
20684
  "domcontentloaded",
20675
- "networkidle"
20685
+ "networkidle",
20686
+ "fullscroll"
20676
20687
  ]
20677
20688
  },
20678
20689
  timeout: {
@@ -20720,12 +20731,13 @@ var openapi_default = {
20720
20731
  },
20721
20732
  wait_until: {
20722
20733
  type: "string",
20723
- 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)",
20734
+ 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)",
20724
20735
  enum: [
20725
20736
  "",
20726
20737
  "load",
20727
20738
  "domcontentloaded",
20728
- "networkidle"
20739
+ "networkidle",
20740
+ "fullscroll"
20729
20741
  ]
20730
20742
  },
20731
20743
  timeout: {
@@ -20773,12 +20785,13 @@ var openapi_default = {
20773
20785
  },
20774
20786
  wait_until: {
20775
20787
  type: "string",
20776
- 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)",
20788
+ 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)",
20777
20789
  enum: [
20778
20790
  "",
20779
20791
  "load",
20780
20792
  "domcontentloaded",
20781
- "networkidle"
20793
+ "networkidle",
20794
+ "fullscroll"
20782
20795
  ]
20783
20796
  },
20784
20797
  timeout: {
@@ -20980,7 +20993,7 @@ var openapi_default = {
20980
20993
  "/api/execute/browser_pick": {
20981
20994
  post: {
20982
20995
  summary: "Browser Pick",
20983
- 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.",
20996
+ 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.",
20984
20997
  tags: [
20985
20998
  "General"
20986
20999
  ],
@@ -21001,7 +21014,7 @@ var openapi_default = {
21001
21014
  },
21002
21015
  value: {
21003
21016
  type: "string",
21004
- 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.)"
21017
+ 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.)"
21005
21018
  }
21006
21019
  },
21007
21020
  required: [
@@ -21165,6 +21178,10 @@ var openapi_default = {
21165
21178
  end_y: {
21166
21179
  type: "number",
21167
21180
  description: "Y coordinate (in pixels from top edge) where the drag ends (drop location)"
21181
+ },
21182
+ mid_points: {
21183
+ type: "string",
21184
+ 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]]"
21168
21185
  }
21169
21186
  },
21170
21187
  required: [
@@ -21277,6 +21294,10 @@ var openapi_default = {
21277
21294
  steps: {
21278
21295
  type: "number",
21279
21296
  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"
21297
+ },
21298
+ stop_points: {
21299
+ type: "string",
21300
+ 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]]"
21280
21301
  }
21281
21302
  },
21282
21303
  required: [
@@ -21679,7 +21700,7 @@ var openapi_default = {
21679
21700
  },
21680
21701
  file_paths: {
21681
21702
  type: "string",
21682
- description: `Array of absolute file paths to upload, as JSON array string (e.g., '["/path/to/file1.pdf", "/path/to/file2.jpg"]')`
21703
+ 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."
21683
21704
  }
21684
21705
  },
21685
21706
  required: [
@@ -22299,8 +22320,8 @@ var openapi_default = {
22299
22320
  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'"
22300
22321
  },
22301
22322
  scale: {
22302
- type: "integer",
22303
- 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)."
22323
+ type: "string",
22324
+ 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)."
22304
22325
  }
22305
22326
  },
22306
22327
  required: [
@@ -22552,11 +22573,11 @@ var openapi_default = {
22552
22573
  description: "Starting URL to begin extraction from"
22553
22574
  },
22554
22575
  depth: {
22555
- type: "integer",
22576
+ type: "string",
22556
22577
  description: "How many link levels to follow from the starting page. Default: 2. Higher values extract more pages but take longer"
22557
22578
  },
22558
22579
  max_pages: {
22559
- type: "integer",
22580
+ type: "string",
22560
22581
  description: "Maximum number of pages to extract. Default: 5. Limits total extraction to prevent runaway crawling"
22561
22582
  },
22562
22583
  follow_external: {
@@ -22582,10 +22603,10 @@ var openapi_default = {
22582
22603
  },
22583
22604
  exclude_patterns: {
22584
22605
  type: "string",
22585
- description: `JSON array of URL patterns to skip (glob patterns). Example: '["*/login*", "*/admin/*"]'`
22606
+ description: 'Array of URL patterns to skip (glob patterns). Example: ["*/login*", "*/admin/*"]'
22586
22607
  },
22587
22608
  timeout_per_page: {
22588
- type: "integer",
22609
+ type: "string",
22589
22610
  description: "Timeout per page in milliseconds. Default: 10000 (10 seconds)"
22590
22611
  }
22591
22612
  },
@@ -22930,7 +22951,7 @@ var openapi_default = {
22930
22951
  "/api/execute/browser_llm_status": {
22931
22952
  post: {
22932
22953
  summary: "Browser Llm Status",
22933
- description: "Check if the on-device LLM is ready to use. Returns status: 'ready', 'loading', or 'unavailable'. Call this before using LLM-powered features to ensure the model is loaded.",
22954
+ 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.",
22934
22955
  tags: [
22935
22956
  "General"
22936
22957
  ],
@@ -22940,7 +22961,12 @@ var openapi_default = {
22940
22961
  "application/json": {
22941
22962
  schema: {
22942
22963
  type: "object",
22943
- properties: {}
22964
+ properties: {
22965
+ context_id: {
22966
+ type: "string",
22967
+ 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."
22968
+ }
22969
+ }
22944
22970
  }
22945
22971
  }
22946
22972
  }
@@ -23775,6 +23801,45 @@ var openapi_default = {
23775
23801
  }
23776
23802
  }
23777
23803
  },
23804
+ "/api/execute/browser_reset_viewport": {
23805
+ post: {
23806
+ summary: "Browser Reset Viewport",
23807
+ 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.",
23808
+ tags: [
23809
+ "General"
23810
+ ],
23811
+ requestBody: {
23812
+ required: true,
23813
+ content: {
23814
+ "application/json": {
23815
+ schema: {
23816
+ type: "object",
23817
+ properties: {
23818
+ context_id: {
23819
+ type: "string",
23820
+ description: "The unique identifier of the browser context (e.g., 'ctx_000001')"
23821
+ }
23822
+ },
23823
+ required: [
23824
+ "context_id"
23825
+ ]
23826
+ }
23827
+ }
23828
+ }
23829
+ },
23830
+ responses: {
23831
+ "200": {
23832
+ description: "Successful response"
23833
+ },
23834
+ "400": {
23835
+ description: "Bad request"
23836
+ },
23837
+ "401": {
23838
+ description: "Unauthorized"
23839
+ }
23840
+ }
23841
+ }
23842
+ },
23778
23843
  "/api/execute/browser_zoom_in": {
23779
23844
  post: {
23780
23845
  summary: "Browser Zoom In",
@@ -24185,6 +24250,45 @@ var openapi_default = {
24185
24250
  }
24186
24251
  }
24187
24252
  },
24253
+ "/api/execute/browser_download_video_recording": {
24254
+ post: {
24255
+ summary: "Browser Download Video Recording",
24256
+ 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.",
24257
+ tags: [
24258
+ "General"
24259
+ ],
24260
+ requestBody: {
24261
+ required: true,
24262
+ content: {
24263
+ "application/json": {
24264
+ schema: {
24265
+ type: "object",
24266
+ properties: {
24267
+ context_id: {
24268
+ type: "string",
24269
+ description: "The unique identifier of the browser context (e.g., 'ctx_000001')"
24270
+ }
24271
+ },
24272
+ required: [
24273
+ "context_id"
24274
+ ]
24275
+ }
24276
+ }
24277
+ }
24278
+ },
24279
+ responses: {
24280
+ "200": {
24281
+ description: "Successful response"
24282
+ },
24283
+ "400": {
24284
+ description: "Bad request"
24285
+ },
24286
+ "401": {
24287
+ description: "Unauthorized"
24288
+ }
24289
+ }
24290
+ }
24291
+ },
24188
24292
  "/api/execute/browser_start_live_stream": {
24189
24293
  post: {
24190
24294
  summary: "Browser Start Live Stream",
@@ -24926,13 +25030,14 @@ var openapi_default = {
24926
25030
  },
24927
25031
  type: {
24928
25032
  type: "string",
24929
- description: "Proxy protocol type: 'http' (HTTP proxy), 'https' (HTTPS proxy), 'socks4' (SOCKS4), 'socks5' (SOCKS5 with local DNS), 'socks5h' (SOCKS5 with remote DNS - most private)",
25033
+ 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)",
24930
25034
  enum: [
24931
25035
  "http",
24932
25036
  "https",
24933
25037
  "socks4",
24934
25038
  "socks5",
24935
- "socks5h"
25039
+ "socks5h",
25040
+ "gae"
24936
25041
  ]
24937
25042
  },
24938
25043
  host: {
@@ -24974,6 +25079,30 @@ var openapi_default = {
24974
25079
  language_override: {
24975
25080
  type: "string",
24976
25081
  description: "Manually set browser language instead of auto-detection. BCP47 format like 'en-US', 'de-DE'. Takes precedence over spoof_language"
25082
+ },
25083
+ ca_cert_path: {
25084
+ type: "string",
25085
+ 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"
25086
+ },
25087
+ ca_key_path: {
25088
+ type: "string",
25089
+ description: "Path to CA private key file for GAE/private app proxy MITM. Required for generating per-domain certificates when using 'gae' proxy type"
25090
+ },
25091
+ trust_custom_ca: {
25092
+ type: "boolean",
25093
+ description: "Trust the custom CA certificate for SSL interception. Enable when using Charles Proxy, mitmproxy, or similar tools that intercept HTTPS traffic. Default: false"
25094
+ },
25095
+ is_tor: {
25096
+ type: "boolean",
25097
+ 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"
25098
+ },
25099
+ tor_control_port: {
25100
+ type: "string",
25101
+ 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"
25102
+ },
25103
+ tor_control_password: {
25104
+ type: "string",
25105
+ description: "Password for Tor control port authentication. Leave empty to use cookie authentication (default) or no auth"
24977
25106
  }
24978
25107
  },
24979
25108
  required: [
@@ -25116,6 +25245,50 @@ var openapi_default = {
25116
25245
  }
25117
25246
  }
25118
25247
  },
25248
+ "/api/execute/browser_set_timezone": {
25249
+ post: {
25250
+ summary: "Browser Set Timezone",
25251
+ 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.",
25252
+ tags: [
25253
+ "General"
25254
+ ],
25255
+ requestBody: {
25256
+ required: true,
25257
+ content: {
25258
+ "application/json": {
25259
+ schema: {
25260
+ type: "object",
25261
+ properties: {
25262
+ context_id: {
25263
+ type: "string",
25264
+ description: "The unique identifier of the browser context (e.g., 'ctx_000001')"
25265
+ },
25266
+ timezone: {
25267
+ type: "string",
25268
+ 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."
25269
+ }
25270
+ },
25271
+ required: [
25272
+ "context_id",
25273
+ "timezone"
25274
+ ]
25275
+ }
25276
+ }
25277
+ }
25278
+ },
25279
+ responses: {
25280
+ "200": {
25281
+ description: "Successful response"
25282
+ },
25283
+ "400": {
25284
+ description: "Bad request"
25285
+ },
25286
+ "401": {
25287
+ description: "Unauthorized"
25288
+ }
25289
+ }
25290
+ }
25291
+ },
25119
25292
  "/api/execute/browser_create_profile": {
25120
25293
  post: {
25121
25294
  summary: "Browser Create Profile",
@@ -25130,6 +25303,10 @@ var openapi_default = {
25130
25303
  schema: {
25131
25304
  type: "object",
25132
25305
  properties: {
25306
+ context_id: {
25307
+ type: "string",
25308
+ 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."
25309
+ },
25133
25310
  name: {
25134
25311
  type: "string",
25135
25312
  description: "Human-readable name for the profile to help identify it. Examples: 'Shopping Account', 'Test User 1'. Optional but recommended for managing multiple profiles"
@@ -25172,7 +25349,7 @@ var openapi_default = {
25172
25349
  },
25173
25350
  profile_path: {
25174
25351
  type: "string",
25175
- description: "Absolute path to the profile JSON file to load. The file must exist and contain valid profile data. Example: '/home/user/profiles/shopping.json'"
25352
+ 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'"
25176
25353
  }
25177
25354
  },
25178
25355
  required: [
@@ -25199,7 +25376,7 @@ var openapi_default = {
25199
25376
  "/api/execute/browser_save_profile": {
25200
25377
  post: {
25201
25378
  summary: "Browser Save Profile",
25202
- description: "Save the current context state (fingerprints, cookies, settings) to a profile JSON file. Useful for persisting login sessions and browser identity for reuse.",
25379
+ 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.",
25203
25380
  tags: [
25204
25381
  "General"
25205
25382
  ],
@@ -25214,13 +25391,58 @@ var openapi_default = {
25214
25391
  type: "string",
25215
25392
  description: "The unique identifier of the browser context to save (e.g., 'ctx_000001')"
25216
25393
  },
25217
- profile_path: {
25394
+ profile_name: {
25218
25395
  type: "string",
25219
- description: "Absolute path where the profile JSON file will be saved. If the context was loaded from a profile, this can be omitted to save to the original path. Example: '/home/user/profiles/new_profile.json'"
25396
+ 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."
25220
25397
  }
25221
25398
  },
25222
25399
  required: [
25223
- "context_id"
25400
+ "context_id",
25401
+ "profile_name"
25402
+ ]
25403
+ }
25404
+ }
25405
+ }
25406
+ },
25407
+ responses: {
25408
+ "200": {
25409
+ description: "Successful response"
25410
+ },
25411
+ "400": {
25412
+ description: "Bad request"
25413
+ },
25414
+ "401": {
25415
+ description: "Unauthorized"
25416
+ }
25417
+ }
25418
+ }
25419
+ },
25420
+ "/api/execute/browser_download_profile": {
25421
+ post: {
25422
+ summary: "Browser Download Profile",
25423
+ 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.",
25424
+ tags: [
25425
+ "General"
25426
+ ],
25427
+ requestBody: {
25428
+ required: true,
25429
+ content: {
25430
+ "application/json": {
25431
+ schema: {
25432
+ type: "object",
25433
+ properties: {
25434
+ context_id: {
25435
+ type: "string",
25436
+ description: "The unique identifier of the browser context (e.g., 'ctx_000001')"
25437
+ },
25438
+ profile_name: {
25439
+ type: "string",
25440
+ 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."
25441
+ }
25442
+ },
25443
+ required: [
25444
+ "context_id",
25445
+ "profile_name"
25224
25446
  ]
25225
25447
  }
25226
25448
  }
@@ -25445,12 +25667,17 @@ var openapi_default = {
25445
25667
  schema: {
25446
25668
  type: "object",
25447
25669
  properties: {
25670
+ context_id: {
25671
+ type: "string",
25672
+ description: "The unique identifier of the browser context (e.g., 'ctx_000001')"
25673
+ },
25448
25674
  rule_id: {
25449
25675
  type: "string",
25450
25676
  description: "The unique identifier of the rule to remove, returned by browser_add_network_rule when the rule was created"
25451
25677
  }
25452
25678
  },
25453
25679
  required: [
25680
+ "context_id",
25454
25681
  "rule_id"
25455
25682
  ]
25456
25683
  }
@@ -25553,6 +25780,45 @@ var openapi_default = {
25553
25780
  }
25554
25781
  }
25555
25782
  },
25783
+ "/api/execute/browser_get_network_rules": {
25784
+ post: {
25785
+ summary: "Browser Get Network Rules",
25786
+ 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.",
25787
+ tags: [
25788
+ "General"
25789
+ ],
25790
+ requestBody: {
25791
+ required: true,
25792
+ content: {
25793
+ "application/json": {
25794
+ schema: {
25795
+ type: "object",
25796
+ properties: {
25797
+ context_id: {
25798
+ type: "string",
25799
+ description: "The unique identifier of the browser context (e.g., 'ctx_000001')"
25800
+ }
25801
+ },
25802
+ required: [
25803
+ "context_id"
25804
+ ]
25805
+ }
25806
+ }
25807
+ }
25808
+ },
25809
+ responses: {
25810
+ "200": {
25811
+ description: "Successful response"
25812
+ },
25813
+ "400": {
25814
+ description: "Bad request"
25815
+ },
25816
+ "401": {
25817
+ description: "Unauthorized"
25818
+ }
25819
+ }
25820
+ }
25821
+ },
25556
25822
  "/api/execute/browser_clear_network_log": {
25557
25823
  post: {
25558
25824
  summary: "Browser Clear Network Log",
@@ -25636,6 +25902,84 @@ var openapi_default = {
25636
25902
  }
25637
25903
  }
25638
25904
  },
25905
+ "/api/execute/browser_disable_network_interception": {
25906
+ post: {
25907
+ summary: "Browser Disable Network Interception",
25908
+ 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.",
25909
+ tags: [
25910
+ "General"
25911
+ ],
25912
+ requestBody: {
25913
+ required: true,
25914
+ content: {
25915
+ "application/json": {
25916
+ schema: {
25917
+ type: "object",
25918
+ properties: {
25919
+ context_id: {
25920
+ type: "string",
25921
+ description: "The unique identifier of the browser context (e.g., 'ctx_000001')"
25922
+ }
25923
+ },
25924
+ required: [
25925
+ "context_id"
25926
+ ]
25927
+ }
25928
+ }
25929
+ }
25930
+ },
25931
+ responses: {
25932
+ "200": {
25933
+ description: "Successful response"
25934
+ },
25935
+ "400": {
25936
+ description: "Bad request"
25937
+ },
25938
+ "401": {
25939
+ description: "Unauthorized"
25940
+ }
25941
+ }
25942
+ }
25943
+ },
25944
+ "/api/execute/browser_disable_network_logging": {
25945
+ post: {
25946
+ summary: "Browser Disable Network Logging",
25947
+ 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.",
25948
+ tags: [
25949
+ "General"
25950
+ ],
25951
+ requestBody: {
25952
+ required: true,
25953
+ content: {
25954
+ "application/json": {
25955
+ schema: {
25956
+ type: "object",
25957
+ properties: {
25958
+ context_id: {
25959
+ type: "string",
25960
+ description: "The unique identifier of the browser context (e.g., 'ctx_000001')"
25961
+ }
25962
+ },
25963
+ required: [
25964
+ "context_id"
25965
+ ]
25966
+ }
25967
+ }
25968
+ }
25969
+ },
25970
+ responses: {
25971
+ "200": {
25972
+ description: "Successful response"
25973
+ },
25974
+ "400": {
25975
+ description: "Bad request"
25976
+ },
25977
+ "401": {
25978
+ description: "Unauthorized"
25979
+ }
25980
+ }
25981
+ }
25982
+ },
25639
25983
  "/api/execute/browser_set_download_path": {
25640
25984
  post: {
25641
25985
  summary: "Browser Set Download Path",
@@ -26519,13 +26863,12 @@ var openapi_default = {
26519
26863
  properties: {
26520
26864
  license_path: {
26521
26865
  type: "string",
26522
- description: "Absolute path to the license file (.olic extension). Provide either this OR license_content, not both. Example: '/path/to/license.olic'"
26523
- },
26524
- license_content: {
26525
- type: "string",
26526
- description: "Base64-encoded license file content. Alternative to license_path for passing license data directly without writing to disk. Provide either this OR license_path, not both"
26866
+ description: "Absolute path to the license file (.olic extension). Example: '/path/to/license.olic'"
26527
26867
  }
26528
- }
26868
+ },
26869
+ required: [
26870
+ "license_path"
26871
+ ]
26529
26872
  }
26530
26873
  }
26531
26874
  }
@@ -26987,6 +27330,117 @@ var openapi_default = {
26987
27330
  }
26988
27331
  }
26989
27332
  }
27333
+ },
27334
+ "/api/execute/server_restart_browser": {
27335
+ post: {
27336
+ summary: "Server Restart Browser",
27337
+ description: "Restart the browser process. This stops the current browser subprocess and starts a new one. Useful after updating configuration, adding/removing licenses, or recovering from browser errors. All active browser contexts will be terminated. Returns success/failure status.",
27338
+ tags: [
27339
+ "General"
27340
+ ],
27341
+ requestBody: {
27342
+ required: true,
27343
+ content: {
27344
+ "application/json": {
27345
+ schema: {
27346
+ type: "object",
27347
+ properties: {
27348
+ force: {
27349
+ type: "boolean",
27350
+ description: "Force restart even if browser appears healthy. Default: false"
27351
+ }
27352
+ }
27353
+ }
27354
+ }
27355
+ }
27356
+ },
27357
+ responses: {
27358
+ "200": {
27359
+ description: "Successful response"
27360
+ },
27361
+ "400": {
27362
+ description: "Bad request"
27363
+ },
27364
+ "401": {
27365
+ description: "Unauthorized"
27366
+ }
27367
+ }
27368
+ }
27369
+ },
27370
+ "/api/execute/server_read_logs": {
27371
+ post: {
27372
+ summary: "Server Read Logs",
27373
+ 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).",
27374
+ tags: [
27375
+ "General"
27376
+ ],
27377
+ requestBody: {
27378
+ required: true,
27379
+ content: {
27380
+ "application/json": {
27381
+ schema: {
27382
+ type: "object",
27383
+ properties: {
27384
+ source: {
27385
+ type: "string",
27386
+ description: "Log source to read from: 'browser' (browser process logs with detailed IPC, rendering, and page events) or 'server' (HTTP server logs). Default: 'browser'",
27387
+ enum: [
27388
+ "browser",
27389
+ "server"
27390
+ ]
27391
+ },
27392
+ mode: {
27393
+ type: "string",
27394
+ description: "Read mode: 'head' (first N lines), 'tail' (last N lines), 'range' (specific line range). Default: 'tail'",
27395
+ enum: [
27396
+ "head",
27397
+ "tail",
27398
+ "range"
27399
+ ]
27400
+ },
27401
+ lines: {
27402
+ type: "string",
27403
+ description: "Number of lines to return for head/tail mode. Default: 100"
27404
+ },
27405
+ start_line: {
27406
+ type: "string",
27407
+ description: "Starting line number for range mode (1-indexed). Default: 1"
27408
+ },
27409
+ end_line: {
27410
+ type: "string",
27411
+ description: "Ending line number for range mode (1-indexed). Default: start_line + 100"
27412
+ },
27413
+ filter: {
27414
+ type: "string",
27415
+ description: "Filter pattern to match log lines. Supports regex or simple substring matching."
27416
+ },
27417
+ level: {
27418
+ type: "string",
27419
+ description: "Filter by log level: 'DEBUG', 'INFO', 'WARN', 'ERROR'. Only lines with this level are returned.",
27420
+ enum: [
27421
+ "DEBUG",
27422
+ "INFO",
27423
+ "WARN",
27424
+ "ERROR"
27425
+ ]
27426
+ }
27427
+ }
27428
+ }
27429
+ }
27430
+ }
27431
+ },
27432
+ responses: {
27433
+ "200": {
27434
+ description: "Successful response"
27435
+ },
27436
+ "400": {
27437
+ description: "Bad request"
27438
+ },
27439
+ "401": {
27440
+ description: "Unauthorized"
27441
+ }
27442
+ }
27443
+ }
26990
27444
  }
26991
27445
  }
26992
27446
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@olib-ai/owl-browser-mcp",
3
- "version": "1.0.4",
4
- "description": "MCP server for Owl Browser HTTP API - 144 browser automation tools with anti-detection",
3
+ "version": "2.0.0",
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",
7
7
  "bin": {