Skip to main content
Glama
Quest Browser MCP Server

Quest Browser MCP Server

by axe-work

Quest Browser MCP Server

An MCP (Model Context Protocol) server for controlling Oculus Browser via WebSocket CDP protocol. This server provides Playwright-like functionality using direct Chrome DevTools Protocol (CDP) commands, making it compatible with Oculus Browser's CDP 1.3 protocol.

Features

  • Reliable WebSocket CDP Connection - Bypasses Playwright's initialization issues

  • Full Playwright-like API - All common browser automation features

  • TypeScript Implementation - Type-safe and maintainable

  • MCP Protocol - Standard Model Context Protocol server

  • CDP 1.3 Compatible - Works with Oculus Browser's protocol version

Related MCP server: Chrome DevTools MCP

Prerequisites

  1. Oculus Quest with browser running

  2. ADB installed and in system PATH

  3. Device connected via USB or wireless ADB

Note: The MCP server automatically sets up port forwarding on startup. You don't need to run adb forward manually.

Installation

npm install
npm run build

Usage

As MCP Server

Add to your MCP client configuration:

{
  "mcpServers": {
    "quest-browser": {
      "command": "node",
      "args": ["dist/index.js"],
      "env": {
        "CDP_ENDPOINT": "http://localhost:9222",
        "ADB_PATH": "adb"
      }
    }
  }
}

Direct Usage

# Development mode
npm run dev

# Production mode
npm run build
npm start

Available Tools

ADB Management

  • adb_check - Check if ADB is available and get version

  • adb_list_devices - List all ADB devices (connected and disconnected)

  • adb_get_connected_devices - Get only connected ADB devices

  • adb_forward_port - Set up ADB port forwarding (default: tcp:9222 -> localabstract:chrome_devtools_remote)

  • adb_list_forwardings - List all active ADB port forwardings

  • adb_remove_forwarding - Remove ADB port forwarding

  • adb_ensure_forwarding - Ensure port forwarding is set up (check first, then set up if needed)

Browser Management

  • browser_initialize - Initialize browser connection and get available pages

  • browser_connect - Connect to a specific page by index

  • browser_list_pages - List all available pages

  • browser_get_current_page - Get information about the currently connected page

Navigation

  • browser_navigate - Navigate to a URL

  • browser_wait_for_load - Wait for page to finish loading

  • browser_get_url - Get the current page URL

  • browser_get_title - Get the page title

  • browser_go_back - Navigate back in browser history

  • browser_go_forward - Navigate forward in browser history

  • browser_reload - Reload the current page

  • browser_wait_for_navigation - Wait for navigation to complete

  • browser_wait_for_url - Wait for URL to match pattern

Interaction

  • browser_click - Click an element by CSS selector

  • browser_type - Type text into an input element

  • browser_wait_for_selector - Wait for an element to appear

  • browser_fill - Fill form field with value (more robust than type)

  • browser_select_option - Select option(s) in a dropdown

  • browser_check - Check a checkbox or radio button

  • browser_uncheck - Uncheck a checkbox

  • browser_hover - Hover over an element

  • browser_double_click - Double click an element

  • browser_right_click - Right click an element

  • browser_press_key - Press a keyboard key

  • browser_drag_and_drop - Drag and drop an element

Content & Evaluation

  • browser_evaluate - Evaluate JavaScript expression in page context

  • browser_get_content - Get the full HTML content of the page

  • browser_screenshot - Take a screenshot of the current page

  • browser_query_selector - Query a single element by CSS selector

  • browser_query_selector_all - Query multiple elements by CSS selector

  • browser_get_text - Get text content of an element

  • browser_get_attribute - Get attribute value of an element

  • browser_get_inner_html - Get inner HTML of an element

  • browser_get_outer_html - Get outer HTML of an element

Wait Features

  • browser_wait_for_timeout - Wait for specified time

Network Features

  • browser_wait_for_response - Wait for network response matching URL pattern

  • browser_get_network_logs - Get network activity logs

Advanced Features

  • browser_set_viewport_size - Set viewport size

  • browser_set_geolocation - Set geolocation

  • browser_set_permissions - Set browser permissions

  • browser_add_init_script - Add initialization script to run on every page load

Accessibility

  • browser_get_accessibility_tree - Get accessibility tree snapshot (Playwright MCP specific)

  • browser_snapshot - Get accessibility snapshot (alias for browser_get_accessibility_tree)

Additional Playwright MCP Tools

  • browser_close - Close the browser connection

  • browser_console_messages - Get console messages from the page

  • browser_file_upload - Upload a file to a file input element

  • browser_fill_form - Fill multiple form fields at once

  • browser_handle_dialog - Handle a JavaScript dialog (alert, confirm, prompt)

  • browser_network_requests - Get list of network requests

  • browser_resize - Resize the browser viewport (alias for browser_set_viewport_size)

Automatic ADB Setup

The MCP server automatically:

  1. Checks if ADB is available in system PATH

  2. Detects connected ADB devices

  3. Sets up port forwarding: tcp:9222 -> localabstract:chrome_devtools_remote

This happens on server startup, so you don't need to manually run adb forward.

Development

# Watch mode
npm run watch

# Development mode (with tsx)
npm run dev

# Build
npm run build

# Run
npm start

Environment Variables

  • CDP_ENDPOINT - CDP endpoint URL (default: http://localhost:9222)

  • ADB_PATH - Path to ADB executable (default: adb from system PATH)

Available Tools

57 tools
adb_checkA

Check if ADB is available and get version

Inputs: no named parameters.

adb_ensure_forwardingA

Ensure port forwarding is set up (check first, then set up if needed)

Inputs: localPort, remoteAbstract.

adb_forward_portA

Set up ADB port forwarding (default: tcp:9222 -> localabstract:chrome_devtools_remote)

Inputs: localPort, remoteAbstract.

adb_get_connected_devicesB

Get only connected ADB devices

Inputs: no named parameters.

adb_list_devicesA

List all ADB devices (connected and disconnected)

Inputs: no named parameters.

adb_list_forwardingsA

List all active ADB port forwardings

Inputs: no named parameters.

adb_remove_forwardingB

Remove ADB port forwarding

Inputs: localPort.

browser_add_init_scriptA

Add initialization script to run on every page load

Inputs: script (required).

browser_checkB

Check a checkbox or radio button

Inputs: selector (required).

browser_clickB

Click an element by CSS selector

Inputs: selector (required).

browser_closeB

Close the browser connection

Inputs: no named parameters.

browser_connectB

Connect to a specific page by index (default: 0)

Inputs: pageIndex.

browser_console_messagesA

Get console messages from the page

Inputs: no named parameters.

browser_double_clickC

Double click an element

Inputs: selector (required).

browser_drag_and_dropC

Drag and drop an element

Inputs: sourceSelector (required), targetSelector (required).

browser_evaluateB

Evaluate JavaScript expression in the page context

Inputs: expression (required).

browser_file_uploadB

Upload a file to a file input element

Inputs: filePath (required), selector (required).

browser_fillA

Fill form field with value (more robust than type)

Inputs: value (required), selector (required).

browser_fill_formA

Fill multiple form fields at once

Inputs: fields (required).

browser_get_accessibility_treeB

Get accessibility tree snapshot (Playwright MCP specific)

Inputs: no named parameters.

browser_get_attributeB

Get attribute value of an element

Inputs: selector (required), attribute (required).

browser_get_contentA

Get the full HTML content of the page

Inputs: no named parameters.

browser_get_current_pageC

Get information about the currently connected page

Inputs: no named parameters.

browser_get_inner_htmlB

Get inner HTML of an element

Inputs: selector (required).

browser_get_network_logsB

Get network activity logs

Inputs: no named parameters.

browser_get_outer_htmlB

Get outer HTML of an element

Inputs: selector (required).

browser_get_textC

Get text content of an element

Inputs: selector (required).

browser_get_titleA

Get the page title

Inputs: no named parameters.

browser_get_urlB

Get the current page URL

Inputs: no named parameters.

browser_go_backA

Navigate back in browser history

Inputs: no named parameters.

browser_go_forwardA

Navigate forward in browser history

Inputs: no named parameters.

browser_handle_dialogA

Handle a JavaScript dialog (alert, confirm, prompt)

Inputs: accept (required), promptText.

browser_hoverC

Hover over an element

Inputs: selector (required).

browser_initializeB

Initialize browser connection and get available pages

Inputs: no named parameters.

browser_list_pagesB

List all available pages

Inputs: no named parameters.

browser_navigateB

Navigate to a URL

Inputs: url (required).

browser_network_requestsC

Get list of network requests

Inputs: no named parameters.

browser_press_keyC

Press a keyboard key

Inputs: key (required).

browser_query_selectorC

Query a single element by CSS selector

Inputs: selector (required).

browser_query_selector_allB

Query multiple elements by CSS selector

Inputs: selector (required).

browser_reloadA

Reload the current page

Inputs: no named parameters.

browser_resizeB

Resize the browser viewport

Inputs: width (required), height (required).

browser_right_clickB

Right click an element

Inputs: selector (required).

browser_screenshotB

Take a screenshot of the current page

Inputs: format, quality.

browser_select_optionC

Select option(s) in a dropdown

Inputs: value (required), selector (required).

browser_set_geolocationC

Set geolocation

Inputs: latitude (required), longitude (required).

browser_set_permissionsC

Set browser permissions

Inputs: origin (required), permissions (required).

browser_set_viewport_sizeB

Set viewport size

Inputs: width (required), height (required).

browser_snapshotA

Get accessibility snapshot of the page (alias for browser_get_accessibility_tree)

Inputs: no named parameters.

browser_typeB

Type text into an element

Inputs: text (required), selector (required).

browser_uncheckC

Uncheck a checkbox

Inputs: selector (required).

browser_wait_for_loadC

Wait for page to finish loading

Inputs: timeout.

browser_wait_for_navigationC

Wait for navigation to complete

Inputs: timeout.

browser_wait_for_responseB

Wait for network response matching URL pattern

Inputs: urlPattern (required), timeout.

browser_wait_for_selectorB

Wait for an element to appear in the page

Inputs: selector (required), timeout.

browser_wait_for_timeoutB

Wait for specified time

Inputs: ms (required).

browser_wait_for_urlC

Wait for URL to match pattern

Inputs: urlPattern (required), timeout.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.7/5.0

    Scored across 57 tools

    Disambiguation2/5

    Multiple tools have overlapping purposes, such as browser_resize vs browser_set_viewport_size, browser_snapshot vs browser_get_accessibility_tree, and browser_get_network_logs vs browser_network_requests. The wait_for_* family also has several similar options (load, navigation, url, response) that can be confused.

    Naming Consistency4/5

    Tool names consistently follow the pattern of prefix (adb_ or browser_) plus verb_noun, e.g., browser_navigate, browser_get_title, browser_set_geolocation. Minor deviations like browser_resize (verb only) and browser_snapshot (noun) are exceptions but the overall pattern is readable and predictable.

    Tool Count1/5

    With 57 tools, the set is excessively large for a browser automation server. Many are near-duplicates (resize/set_viewport_size, snapshot/get_accessibility_tree, network_logs/network_requests), inflating the count without adding genuine functionality. This is well beyond the typical heavy range of 25+.

    Completeness4/5

    The tool set covers a broad range of browser automation needs, including navigation, interaction, waiting, network monitoring, accessibility, file upload, and ADB port forwarding. However, it lacks cookie management and cannot create new browser pages (only connects to existing ones), which are notable gaps for a fully complete browser automation surface.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables comprehensive browser automation and control through Playwright, including launching browsers, managing tabs, web navigation, element interaction, and screenshot capture. Supports detecting and controlling external browsers with remote debugging capabilities.
      ISC
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables AI coding assistants to control and inspect a live Chrome browser through DevTools for automated testing, performance analysis, debugging, and web scraping. Provides reliable browser automation using Puppeteer with comprehensive DevTools access.
      2,405,354 npm
      3
      Apache 2.0
    • A
      license
      B
      quality
      D
      maintenance
      A universal browser automation MCP server using Playwright, enabling programmatic control of Chrome with 63 tools for navigation, interaction, media control, and CDP-based diagnostics.
      63
      28 npm
      3
      MIT
    • A
      license
      A
      quality
      C
      maintenance
      Enables AI clients to control the user's already-open, logged-in browser pages in real time over a local WebSocket channel, without Playwright, Puppeteer, Selenium, or any browser driver. Exposes tools for navigation, semantic page snapshots, clicking, form filling, JavaScript evaluation, screenshots, network monitoring, cookie handling, and tab management via the CDP.
      20
      MIT