{"name":"io.github.Mehmoodqureshi/chrome-mcp","slug":"mehmoodqureshi-chrome-mcp","title":"chrome-mcp","description":"Drive your real Chrome over MCP: real logins and cookies, multi-tab automation, deny-all by default.","url":"https://mcp.market/server/mehmoodqureshi-chrome-mcp","rating":null,"grade":"A","score":85,"certified":false,"status":"active","category":"productivity","tags":["productivity"],"presence":{"score":40,"stars":6,"forks":0,"downloads_week":639,"last_push_at":"2026-09-23T11:47:29.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/Mehmoodqureshi/chrome-mcp","website":"https://chrome-mcp-omega.vercel.app","version":"0.9.11","remotes":[],"packages":[{"registryType":"npm","identifier":"@mehmoodqureshi/chrome-mcp","version":"0.9.11","transport":{"type":"stdio"},"packageArguments":[{"description":"A site the browser may be driven on (e.g. example.com or *.example.com). Repeat for more; nothing is reachable until one is allowed.","type":"named","name":"--allow-domain","valueHint":"domain","isRepeated":true}]}],"tools":[{"name":"auth_check","description":"Is the tab sitting on a sign-in wall? Reads the page (URL, title, password fields, sign-in controls) and returns { authRequired, confidence, signals }. Use it after a navigate, or whenever a step fails unexpectedly, to tell \"the session expired\" apart from \"the agent got lost\". Pass failOnAuthWall:true to get an [AUTH_REQUIRED] error instead of a verdict, so a harness can bucket the run as an auth","write_action":false,"price_micros":0,"input_schema":null},{"name":"back","description":"Go back in history.","write_action":false,"price_micros":0,"input_schema":null},{"name":"batch","description":"Run multiple tool calls in one request — parallel (default) or serial. Each op is { tool, args } and goes through the same policy gate, rate limit, and error handling as a direct call. In parallel mode, tab-scoped ops MUST pass an explicit tabId (the active-tab default is unsafe under concurrency). Use to drive several tabs at once (e.g. open tabs, then batch get_text across them). Cannot be neste","write_action":true,"price_micros":0,"input_schema":null},{"name":"chrome_status","description":"Report backend/session status: paired browser profiles and how each was named, and flags for switched-off capabilities.","write_action":false,"price_micros":0,"input_schema":null},{"name":"click","description":"Click an element. Target by selector, a snapshot ref, or role+name (e.g. role:\"button\", name:\"Sign in\") - the locator needs no snapshot first. trusted=true uses real OS-level input.","write_action":false,"price_micros":0,"input_schema":null},{"name":"console_logs","description":"Console output and uncaught errors recorded on the page (requires --enable-observers). This is how you find out WHY a page misbehaved rather than only what it looks like afterwards. Pass sinceSeq to poll for what is new, clear:true to drain.","write_action":false,"price_micros":0,"input_schema":null},{"name":"dialogs","description":"Native dialogs (alert/confirm/prompt/beforeunload) the page raised, and how they were answered (requires --enable-observers). With observers on, dialogs are intercepted rather than left to block the renderer - which is what otherwise turns a click that opens a confirm() into a mystery TIMEOUT. Set policy:'accept' to answer confirms with true.","write_action":false,"price_micros":0,"input_schema":null},{"name":"download_file","description":"Download a file by URL or from a link element.","write_action":false,"price_micros":0,"input_schema":null},{"name":"eval","description":"Evaluate JavaScript in the page (disabled in safe-mode).","write_action":false,"price_micros":0,"input_schema":null},{"name":"extract_links","description":"Extract anchors from the page or a subtree. dedupe=true collapses links sharing an href (nav/footer noise); limit caps the count.","write_action":false,"price_micros":0,"input_schema":null},{"name":"fill_form","description":"Fill multiple fields (keyed by selector) and optionally submit.","write_action":false,"price_micros":0,"input_schema":null},{"name":"forward","description":"Go forward in history.","write_action":false,"price_micros":0,"input_schema":null},{"name":"frames_list","description":"List the tab's frames (the top document plus every iframe the extension can reach), with each frame's id and URL. Use it when a selector that should match does not: the element is probably in one of these frames, and you can then pass frameId (or allFrames:true) to act inside it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_cookies","description":"Read cookies visible to the tab's URL (or a given url).","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_html","description":"Get HTML of the page or an element. Output is capped (see maxBytes) and cut at a tag boundary; narrow it with `selector` rather than raising the cap when you can. Password field values are always blanked.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_text","description":"Get visible text of the page or an element.","write_action":false,"price_micros":0,"input_schema":null},{"name":"hover","description":"Hover over an element.","write_action":false,"price_micros":0,"input_schema":null},{"name":"navigate","description":"Navigate a tab to a URL, REPLACING its current page. Acts on the active tab unless tabId is given — to open a site without losing the current page, use `tab_new` instead.","write_action":false,"price_micros":0,"input_schema":null},{"name":"network_log","description":"Requests the page made - fetch and XMLHttpRequest with method, URL, status and duration (requires --enable-observers). Set includeResources:true to also list scripts/images/styles from Resource Timing (those carry timing and size but no status). Does not include the document request or headers.","write_action":false,"price_micros":0,"input_schema":null},{"name":"press","description":"Press a key (with optional modifiers).","write_action":false,"price_micros":0,"input_schema":null},{"name":"print_pdf","description":"Render the page to PDF through Chrome's own print pipeline and save it to the task's results/ dir. Returns the path and size, not the bytes - a PDF is not something to spend context on.","write_action":false,"price_micros":0,"input_schema":null},{"name":"profile_rename","description":"Rename an automatically named browser profile (e.g. \"profile-2\" -> \"work\"). The name sticks across restarts; its saved artifacts move with it.","write_action":false,"price_micros":0,"input_schema":null},{"name":"profile_use","description":"Switch the active browser profile (identity). Subsequent downloads, results, screenshots, and the action log are stored under profiles/<name>/. Resets the active task to \"default\" unless you then call task_new.","write_action":false,"price_micros":0,"input_schema":null},{"name":"read_as_markdown","description":"Read the page (or subtree) as readable markdown.","write_action":false,"price_micros":0,"input_schema":null},{"name":"reload","description":"Reload the active (or given) tab.","write_action":false,"price_micros":0,"input_schema":null},{"name":"screenshot","description":"Capture a screenshot (page or element). Default is JPEG (quality 70) at CSS-pixel size, which is several times smaller than PNG and reads fine. Pass format:\"png\" for lossless, quality 1-100 for JPEG, scale 2 for device pixels on a Retina display or 0.5 to shrink.","write_action":false,"price_micros":0,"input_schema":null},{"name":"scroll","description":"Scroll the page or to an element.","write_action":false,"price_micros":0,"input_schema":null},{"name":"select_option","description":"Select option(s) of a <select> by value or visible label.","write_action":false,"price_micros":0,"input_schema":null},{"name":"snapshot","description":"Accessibility snapshot: interactive elements with refs to target by `ref` (more reliable than guessing CSS selectors). Pass diff:true to get only what changed since the last snapshot of this tab - far cheaper in a click/read loop. Password fields appear as secret:true with no value.","write_action":false,"price_micros":0,"input_schema":null},{"name":"storage","description":"Read/write localStorage (or sessionStorage). op: get|set|remove|clear.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tab_close","description":"Close a tab by tabId.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tab_new","description":"Open a NEW tab (optionally at a URL) and focus it. Prefer this over `navigate` when the user says \"open\"/\"go to\" a site — `navigate` REPLACES the current tab. Pass active:false to open in the background (used by parallel batches).","write_action":false,"price_micros":0,"input_schema":null},{"name":"tab_select","description":"Make a tab active by tabId.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tabs_list","description":"List open browser tabs.","write_action":false,"price_micros":0,"input_schema":null},{"name":"task_new","description":"Start a new task (run) under the active profile. Creates profiles/<profile>/tasks/<name>/ with downloads/, results/, screenshots/ and makes it the active task so all captured artifacts land there.","write_action":false,"price_micros":0,"input_schema":null},{"name":"task_status","description":"Report the active profile/task and the folder paths where this run's artifacts are stored.","write_action":false,"price_micros":0,"input_schema":null},{"name":"tasks_list","description":"List every task across all profiles under the data dir, with sizes and download counts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"type","description":"Type text into an element (target by selector, ref, or role+name). trusted=true sends real keystrokes (works on React/Vue controlled inputs).","write_action":false,"price_micros":0,"input_schema":null},{"name":"upload_file","description":"Set local file(s) on a file <input> (target by selector or ref) — uploads without the OS dialog. Requires --enable-uploads. `files` are absolute local paths.","write_action":true,"price_micros":0,"input_schema":null},{"name":"wait_for","description":"Wait for a selector or text to appear/disappear.","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":85,"grade":"A","scanned_at":"2026-09-23T11:49:59.399Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-23T11:49:59.366Z","components":{"code":{"score":20,"max":25,"notes":["91 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":15,"max":15,"notes":["last push 0 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"exec.eval","severity":"medium","component":"code","title":"eval / new Function used","evidence":"dist/src/executor/cdp-executor.js: … }; }); } async eval(expression, opts) { return this.…"}],"inputs":{"packages":[{"registryType":"npm","identifier":"@mehmoodqureshi/chrome-mcp","version":"0.9.11","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-09-23T11:17:44.044Z","repositoryUrl":"git+https://github.com/Mehmoodqureshi/chrome-mcp.git","weeklyDownloads":639}],"repo":{"found":true,"owner":"Mehmoodqureshi","repo":"chrome-mcp","archived":false,"pushedAt":"2026-09-23T11:47:29Z","stars":6,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/44443770?v=4","ownerCreatedAt":"2018-10-24T16:53:53Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/44443770?v=4&s=128","source":"github"},"presence":{"stars":6,"forks":0,"downloadsWeek":639,"license":"MIT","lastPushAt":"2026-09-23T11:47:29.000Z","score":40}}}},"grade_history":[],"reviews":[]}