Skip to content
Agentmart
Submit a tool

invisible_playwright_mcp

AI browser agent: browses, clicks, types, and reads real web pages from plain-English instructions.

Connector by feder-cr · GitHub account verified by the MCP Registry

IndexedMITLocal (stdio)★ 877
Write a review

Install

Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.

npx agentmarket install connector/feder-cr-invisible-playwright-mcp

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

AI browser agent: browses, clicks, types, and reads real web pages from plain-English instructions.

Use cases: browser-automation, web-scraping

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this server can do and what it asks for, from its tool list and install config. Checked Oct 25, 2026.

Tools
8 read · 8 write · 0 delete · 1 not yet classified
Secrets
None asked for
Install scripts
None found
Runs as
Python package

Tools by what they do 17

Read from the source code; the running server may list different tools.

Read 8 · Look things up without changing anything.

  • browser_evaluate
  • browser_list
  • browser_read_html
  • browser_read_text
  • browser_snapshot
  • browser_status
  • browser_take_screenshot
  • browser_watch

Write 8 · Create, change, send or run things.

  • browser_click
  • browser_click_at
  • browser_close
  • browser_navigate
  • browser_press_key
  • browser_select_option
  • browser_type
  • browser_upload_files

Not yet classified 1 · We could not tell from the name and description.

  • browser_open

Files it touches

  • Any path the agent passes to its tools

Tools (17)

Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].

  • browser_click

    Click the first element matching a CSS selector. Scrolls it into view and waits for it to be clickable. When no selector can describe the target, use browser_click_at with coordinates from browser_snapshot.

  • browser_click_at

    Click (or press-and-hold) a raw viewport coordinate instead of a selector - for targets a selector cannot reliably reach: a slider track, a canvas-drawn captcha, a precise point inside a wider element. Moves the pointer there first (no teleport), then down, then up, holding first if hold_seconds is set. Returns a screenshot taken right after release. Coordinates are relative to the VIEWPORT, not to the page, so the ones in a snapshot go stale the moment anything scrolls. Nothing raises when that happens: the click lands on whatever is at that spot now. Take a fresh snapshot after anything tha…

  • browser_close

    Close one browser and free what it was holding. The page it had is gone with it. The other browser is not touched. Who it was is kept: browser_open with no arguments brings the same person back. To be somebody else, pass a seed, a proxy or a profile.

  • browser_evaluate

    READ from the page with JavaScript and get the result as JSON. Last, for what other tools cannot see: a computed style, a value held in a framework's state, the length of a list. Text, a heading or a price is browser_read_text's, markup browser_read_html's, a control browser_snapshot's: a script runs in the page, and they do not. Acting on the page is refused, and the refusal names the tool to use. Assigning to `value`, `checked` or `selected`, or calling `click()`, `dispatchEvent()`, `submit()` or `requestSubmit()`, changes the page without a real keystroke or pointer, and a page can tell. …

  • browser_list

    Which of the two browsers are open, where each one is, and which one you are working in. Answers JSON: `focus`, the browser your last command acted in, or "" when none is open; `note`, which says how many are open and that a command naming no browser goes to `main`; and `browsers` - each row `id`, `url` (the page it is on) and `urls` (every page it holds, which is more than one only when a site opened one). Only open browsers are listed, so every row is one you can act on. Starts nothing: it reports what is open, so asking is free.

  • browser_navigate

    Go to a url in this browser's page, opening it if none exists. Answers with the HTTP status the server gave and the url actually landed on, which is not always the one asked for: a redirect to a login wall or a regional domain shows up here. Read the status before trusting the page - a 404 or a 403 still has a document, and reading it as content is the mistake this reply exists to prevent. If the page you were on navigates itself at that moment (a redirect on a timer), Firefox can follow it instead, and the answer is an error saying "interrupted by another navigation to" a url. The browser i…

  • browser_open

    Open `main` or `support`, or reopen one as somebody else. `support` is yours to manage: open it when the task needs a second identity, and close it with browser_close as soon as the task no longer needs it, before you answer. It is not saved. Called on a browser that is already up, this REOPENS it with the settings given, and what it held is gone. seed the identity; same seed, same fingerprint. Left out, one is drawn. profile a directory keeping cookies, logins and the seed between opens; "" means none. It keeps the SEED too, so a login does not come back on different…

  • browser_press_key

    Press a key on whatever has focus: "Enter", "Tab", "Escape", "ArrowDown", "Control+a", or a single character.

  • browser_read_html

    The page's HTML, cleaned down to what is worth reading. Use this when the STRUCTURE matters - a form and its labels, a table, what a control is wired to. `browser_snapshot` gives a flat inventory of things to click; this keeps the markup and the relationships inside it. mode="form" keeps the interactive surface and the text explaining it, mode="text" returns the prose alone, mode="full" keeps the structure with the noise and the attribute soup removed. Unlike browser_read_text this is NOT capped: it returns the whole reduced page, tens of thousands of characters on a large one. Cutting mark…

  • browser_read_text

    The visible text of an element, with the markup gone, whole. The cheapest way to read a page. Narrow the selector when you know where the answer is; use browser_read_html instead when the structure matters, or browser_snapshot when you need something to click.

  • browser_select_option

    Choose an option in a dropdown (`<select>`), by its visible label or by its value. Use this rather than clicking the dropdown and pressing arrow keys: a click plus arrows cannot tell you which row it landed on, and setting the value through browser_evaluate changes it without the page seeing a real interaction.

  • browser_snapshot

    Title, url, and the interactive elements that are actually visible. Each element carries a `selector` when one can reach it: pass that string to browser_click or browser_type VERBATIM rather than writing your own. It is built to match exactly ONE element, which the obvious selector often does not, and the driver acts on the first match - so a caller aiming at the third of five identical links would silently hit the first and be told it succeeded. Elements with no `selector` carry `at`, the centre coordinates, for browser_click_at. It lists what a caller can act on, and it is not the accessi…

  • browser_status

    Who is browsing right now: the identity, the exit, the profile and the page. Ask whenever you need to know which person the browser currently is, or from where its traffic leaves. The seed is what you would pass to `browser_open` to become this person again, so this is also how you record an identity worth repeating. It starts nothing: a browser that is not open, or gone, is answered with the sentence that says which.

  • browser_take_screenshot

    One screenshot of this browser's page, on demand.

  • browser_type

    Type into a field, replacing what it holds, key by key at a human pace. The answer says what the field kept: all of it, a maxlength's cut, the page's reformatting, nothing (the page took it out), or one box of a code the page spreads over several. Nothing is retyped on its own. Text too long to finish within one answer goes on in the background; until it ends, actions on that browser are refused with its progress, and reads work.

Show 2 more tools
  • browser_upload_files

    Attach local files to a file input, the way a person picks them. `selector` is the `<input type=file>` itself, or the button or label that opens its chooser: that is clicked with the real pointer and the chooser answered with `paths`. A hidden input is opened through its label; with none, pass the button that opens it. Several files need an input that takes several; otherwise upload them one call at a time. Each path is absolute and names a regular file inside a directory listed in INVISIBLE_MCP_UPLOAD_DIRS, through no hidden directory; with none listed, uploads are off. Never use browser_ev…

  • browser_watch

    The whole browser window as a person at the machine sees it: tab strip, address bar, the page and the pointer, from a live capture kept running on that page. For watching the work, not for acting on it: the picture is window pixels, so do not feed its coordinates to browser_click_at; use browser_take_screenshot for that. Starts nothing. A browser that is not open has no window, so this answers the sentence that says so, and the live panes - which call this many times a second - read that sentence as the idle pane.

Compare and alternatives

    Featured in

    Signals

    Stars
    877
    Forks
    117
    Open issues
    2
    Contributors
    12
    Weekly downloads
    1,394
    Last commit
    Oct 21, 2026 (7 days ago)
    Last release
    Oct 21, 2026 (8 days ago)
    Last package publish
    Oct 21, 2026 (8 days ago)

    From GitHub (fetched Oct 24, 2026) and the package registry.

    Details

    Registry name
    io.github.feder-cr/invisible-playwright-mcp
    Version
    0.73.0
    Auth
    No auth
    License
    MIT
    First seen
    Oct 24, 2026
    Last checked
    Oct 24, 2026

    More from feder-cr

    Cite this page

    invisible_playwright_mcp MCP server. Agent Mart. https://agentmart.dev/connectors/feder-cr-invisible-playwright-mcp (last updated 2026-10-24)