Gecko MCP vs Selenium MCP

A side-by-side look at the Gecko MCP and Selenium MCP MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.

Gecko MCP logoGecko MCPBrowser Automation · Local subprocess (stdio)Control Firefox browsers (Floorp, LibreWolf, Zen, Firefox) from any MCP client.57GoodAuth: not declaredSelenium MCP logoSelenium MCPBrowser Automation · Local subprocess (stdio)Selenium MCP server for AI agents — 38 browser automation tools with snapshots and sessions.59GoodAuth: not declared

Verdict: choose Gecko MCP for browser automation work as a local process; choose Selenium MCP for browser automation as a local process. You can also run both side by side in one mcpServers block.

Which MCP server should you choose?

Gecko MCP logoChoose Gecko MCP when

  • You need dedicated capabilities in the Browser Automation domain.
  • You prefer a local stdio subprocess transport.
  • You want tools like list_tabs, open_tab, get_active_tab.
Explore Gecko MCP

Selenium MCP logoChoose Selenium MCP when

  • You need dedicated capabilities in the Browser Automation domain.
  • You prefer a local stdio subprocess transport.
  • You want tools like start_browser, navigate, history.
Explore Selenium MCP

Feature & specification comparison

Rows where the two servers differ are marked.

SpecGecko MCP logoGecko MCPSelenium MCP logoSelenium MCP
CategoryBrowser AutomationBrowser Automation
Quality signal57/100 · Good59/100 · Good
Install commandConfirmedConfirmed
TransportLocal subprocess (stdio)Local subprocess (stdio)
AuthNot declaredNot declared
PricingNot declaredNot declared
Required env varsNone listedNone listed
Verified ownerCommunity listingCommunity listing
GitHub stars20
Directory activity 1 views 0 installs 0 upvotes 2 views 0 installs 0 upvotes
Tools4141

Tools & capabilities

Gecko MCP tools 41

  • list_tabsList all open tabs in Floorp (title, URL, browserId, and whether each is active or pinned). Use the browserId to target other tools.
  • open_tabOpen a URL in a new Floorp tab.
  • get_active_tabReturn the active tab's title, URL and browserId. Note: with multiple browser windows open, 'active' is ambiguous — prefer the browserId returned by open_tab, or pick from list_tabs.
  • navigate_tabNavigate a tab to a new URL. Targets the active tab unless a browserId is given.
  • close_tabClose a tab by its browserId (from list_tabs).
  • read_pageRead a tab's content. Returns clean Markdown by default; can also return raw HTML or the accessibility tree. Output is capped (default 25 KB) to protect the context — to LOCATE a specific element use `find` (cheaper) instead. Targets the active tab unless a browserId is given.
  • screenshotTake a screenshot of a tab and return it as a PNG image. Targets the active tab unless a browserId is given.
  • findLocate elements on a tab by visible text and/or tag and get a ready-to-use CSS `selector` for each — one fast call that searches the page server-side and returns ~1 KB instead of the whole HTML. Use this INSTEAD of read_page to find a button, link, or field, then pass the returned selector straight to click/type/etc. Provide `text`, `tag`, or both. Active tab unless browserId given.
  • clickClick an element by CSS selector OR by a `ref` (fingerprint) from `snapshot`. Auto-scrolls the element into view first (fixes off-screen 'not actionable'). Targets the active tab unless a browserId is given.
  • snapshotCapture a structured snapshot of a tab: clean Markdown with inline fingerprint refs (`<!--fp:...-->`) and an 'Element Selector Map' (fp | tag | text). Use this instead of read_page+grep to locate elements, then pass a `ref` to `click`. Targets the active tab unless a browserId is given.
  • type_textType text into an input or textarea by CSS selector (clears it first by default). Targets the active tab unless a browserId is given.
  • fill_formFill multiple form fields at once. `fields` maps CSS selectors (or field names) to values. Targets the active tab unless a browserId is given.
  • +29 more on the listing page

Selenium MCP tools 41

  • start_browserStart a browser session (Chrome, Firefox, or Edge) that all other tools act on. Call this first. Only one session can be started this way: call stop_browser before starting another, or use session_create to run several browsers at once. The matching driver is downloaded automatically by Selenium Manager. Returns the session status.
  • navigateOpen a URL in the current tab and wait for the page to load (up to the pageLoadTimeoutMs set in start_browser). Returns the final URL after any redirects, and the page title. Use history to go back, forward, or refresh; use wait_for_page when a later redirect or client-side route change still has to happen.
  • historyBrowser history navigation: go back to the previous page (like the Back button), go forward to the next page, or refresh/reload the current page (like F5). Waits for the page to load and returns the new URL and title. To open a specific URL, use navigate instead. Element refs from an earlier capture_page may be stale afterwards, so capture the page again before using refs. Refresh can reset unsaved form input.
  • clickClick an element: waits until it is visible and enabled, then clicks it (scrolling it into view). Target it by selector or by a ref from capture_page. If clicks fail intermittently because of overlays, animations, or re-rendering, use retry_click; for double-click, right-click, or hover, use interact. Fails with the reason if the element does not become clickable within timeoutMs.
  • interactMouse actions beyond a plain click: double_click, right_click (opens a context menu), hover (reveals menus and tooltips), or click performed as a real mouse move-and-click. Waits for the element to be visible (hover) or visible and enabled (clicks). Target it by selector or by a ref from capture_page. For an ordinary click, prefer click.
  • typeType text into an input, textarea, or other editable element. Waits for it to be visible, clears the current value first (clearFirst: false appends instead), then sends the text as keystrokes so the page's input events fire; submit: true presses Enter afterwards. Target it by selector or by a ref from capture_page. For dropdowns use select_option; for single keys like Tab or Escape use press_key.
  • select_optionSelect an option in a native <select> dropdown by visible text, value, or zero-based index, and return the resulting selection. Waits for the dropdown to be visible, then clicks the option like a user so change events fire; on a multi-select it adds to the current selection. If nothing matches, the error lists the available options so you can retry. Only for real <select> elements; for custom dropdowns built from other elements, click the trigger and then the option.
  • scrollScroll the page: scroll down or up by pixels, jump to the top or bottom, or scroll an element into view (to the middle of the screen). Also scrolls inside a scrollable container (chat panels, tables, sidebars with their own scrollbar) when you pass that container as selector/ref together with to or deltaX/deltaY. Returns the scroll position with atTop/atBottom flags. For lazy-loaded or infinite-scroll pages ('load more' on scroll), scroll to the bottom, wait_for_element for the new items, and repeat until atBottom stays true and nothing new appears. click and type already scroll their target into view, so use this to reveal content or trigger lazy loading.
  • get_textRead the visible text of an element: what a user sees, not hidden text or an input's value. Waits for the element to be visible, then returns its text (trimmed by default). Target it by selector or by a ref from capture_page. To read an input's value or any attribute, use get_attribute; to check text as a pass/fail test step, use assert_text.
  • get_attributeRead an attribute or property of an element, e.g. an input's value, a link's href, or whether it is disabled, checked, or aria-expanded. Waits for the element to exist (it does not need to be visible). Returns the value, or null if it is not set; the live property wins when one exists, so 'value' gives the text currently in an input. Use get_text for visible text, and assert_attribute to check a value as a test step.
  • assert_textTest step: check that an element's visible text equals, contains (default), or matches a regular expression. Waits for the element to be visible, then checks once (it does not wait for the text to change). Passes with the actual text, or fails as a tool error showing expected vs actual, so it works as an acceptance check. Use get_text to just read text without a pass/fail.
  • assert_visibleTest step: check that an element becomes visible within timeoutMs, e.g. a success banner or a cart badge. Passes as soon as it is displayed; fails as a tool error if it is missing or stays hidden. Similar to wait_for_element with visible: true, but phrased as a pass/fail assertion.
  • +29 more on the listing page

Ready-to-paste client configs

Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.

Gecko MCP

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "gecko-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "gecko-mcp"
      ]
    }
  }
}

Selenium MCP

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "selenium-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@gaforov/selenium-mcp@latest"
      ]
    }
  }
}

Frequently asked questions

Gecko MCP is categorized under Browser Automation and uses a local stdio subprocess. Selenium MCP belongs to Browser Automation and uses a local stdio subprocess. Pick Gecko MCP for browser automation work and Selenium MCP for browser automation.

Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.

Gecko MCP has no declared pricing — check the project's own site. Selenium MCP has no declared pricing — check the project's own site. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.

Yes. MCP clients support multiple servers: add gecko-mcp and selenium-mcp as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, Gecko MCP has a quality signal of 57/100 (Good) with 1 views, 0 installs and 2 GitHub stars. Selenium MCP has 59/100 (Good) with 2 views, 0 installs and 0 GitHub stars.