ZenLink MCP
Browser automation for MCP clients via Zen Browser.
Connector by JayQuan-McCleary · GitHub account verified by the MCP Registry
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/jayquan-mccleary-zenlink-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.
About
Reviews
Write a reviewNo 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, install config and code. Checked Oct 26, 2026.
- Tools
- 37 read · 42 write · 4 delete · 24 not yet classified
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Python package
Tools by what they do 107
Read from the source code; the running server may list different tools.
Read 37 · Look things up without changing anything.
zen_auditzen_boundszen_capture_networkzen_clipboardzen_computed_stylezen_console_logszen_domzen_element_screenshotzen_explain_selectorzen_findzen_formszen_full_page_metrics
Show 25 more tools
zen_get_policyzen_get_zoomzen_healthzen_htmlzen_iframeszen_imageszen_linkszen_list_sessionszen_list_tagszen_logszen_markdownzen_metazen_page_infozen_pool_acquirezen_queryzen_readabilityzen_schedulerzen_screenshotzen_statuszen_structured_datazen_tabszen_wait_for_resultzen_windowszen_workflowszen_wp_html
Write 42 · Create, change, send or run things.
_save_pngzen_batchzen_broadcastzen_clickzen_click_and_wait_navigationzen_close_tabzen_close_windowzen_create_windowzen_detach_tabzen_double_clickzen_downloadszen_fill
Show 30 more tools
zen_focuszen_form_fillzen_forwardzen_hoverzen_jszen_keep_alive_stopzen_load_sessionzen_move_tabzen_mute_tabzen_navigatezen_page_textzen_page_text_by_tab_idzen_parallelzen_pin_tabzen_pool_releasezen_resolve_tagzen_retryzen_save_sessionzen_scrollzen_select_optionzen_set_editable_contentzen_set_policyzen_set_zoomzen_submit_formzen_sync_barrierzen_tag_tabzen_trusted_clickzen_typezen_upload_filezen_workflow
Delete 4 · Delete, drop, revoke or wipe things.
zen_clear_browsing_datazen_delete_sessionzen_dragzen_untag_tab
Not yet classified 24 · We could not tell from the name and description.
zen_backzen_blurzen_cachezen_checkzen_cookieszen_duplicate_tabzen_focus_windowzen_full_page_screenshotzen_highlightzen_interceptzen_keep_alivezen_keypress
Show 12 more tools
zen_new_tabzen_reload_extensionzen_reload_tabzen_storagezen_switch_tabzen_tab_poolzen_wait_for_elementzen_wait_for_network_idlezen_wait_for_titlezen_wait_for_urlzen_wake_tabzen_watch_console
Network hosts it talks to 2
github.com· found in codethankyouexperiences.com· found in code
Files it touches
- Your home directory (~)
- Any path the agent passes to its tools
Tools (107)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
_save_pngWrite the bridge's PNG data URL to a file and return the path instead of the image data. (2.1.2: a returned data URL is ~100K+ characters and blew straight into the caller's context.)
zen_auditReturn recent command audit entries: action, params (JS code stripped), success flag, error, duration. Useful for "what did the agent do?" reviews.
zen_backGo back in history (browser back button).
zen_batchRun multiple commands in a single request for speed. Each command is a dict with "action" and parameters. Add "tabId" to any command to target a specific tab instead of the active one. For true concurrency across tabs, prefer zen_parallel. Available actions: navigate, newTab, closeTab, switchTab, click, type, setEditableContent, fill, scroll, hover, find, js, pageInfo, pageText, screenshot, tabs, forms, dom, sleep, waitForElement, pageTextByTabId, wakeTab, parallel Args: commands: List of command dicts, e.g. [{"action": "navigate", "url": "..."}, {"action": "waitForElement", "selector":…
zen_blurBlur an element (or document.activeElement if no selector).
zen_boundsReturn getBoundingClientRect + viewport/page sizes for an element.
zen_broadcastFire the same command at every listed tab in parallel. Each tab gets the command with its own tabId injected. Returns per-tab results keyed by tab id. Args: tab_ids: Tabs to target. command: Command dict, e.g. {"action": "pageInfo"} or {"action": "getReadability"}. timeout: Per-tab timeout in seconds.
zen_cacheControl the ZenLink bridge response cache. Args: action: "clear", "status", or "ttl" seconds: TTL value when action is "ttl"
zen_capture_networkCapture network requests via the page's PerformanceObserver. Args: op: "start" begins capturing fresh, "stop" pauses, "read" returns the buffer (default), "clear" empties it. since: When reading, only return entries with startTime >= since (ms). tab_id: Optional tab; defaults to active.
zen_checkSet a checkbox or radio's checked state.
zen_clear_browsing_dataClear browsing data of the given types. Args: types: Which to clear. Subset of ["cache","cookies","history", "localStorage","passwords","downloads"]. Default = all of those. since_ms: Only data created since this epoch-ms timestamp.
zen_clickClick an element on the page by CSS selector or coordinates. Args: selector: CSS selector to click (e.g. "#submit", ".btn-primary") x: X coordinate (used if selector is empty) y: Y coordinate (used if selector is empty) tab_id: Optional tab to target. Defaults to active tab.
zen_click_and_wait_navigationClick an element, then wait for the resulting navigation to complete. Atomic operation — far more reliable than `zen_click` followed by `zen_wait_for_url` for links/submit buttons. Listens for tabs.onUpdated(status='complete').
zen_clipboardRead or write the system clipboard. Args: op: "read" or "write". text: Text to write when op="write".
zen_close_tabClose a browser tab by its ID. Args: tab_id: The tab ID to close (get IDs from zen_tabs) force: Disarm "Leave page?" (beforeunload) prompts first - upload/editor pages otherwise hold the tab open and the close times out.
Show 92 more tools
zen_close_windowClose a browser window by ID (from zen_windows).
zen_computed_styleReturn computed CSS for an element. Defaults to the layout-relevant set.
zen_console_logsReturn buffered console logs from a tab (requires zen_watch_console first).
zen_cookiesCookie operations: "get", "set", "remove", "clear". - get: returns matching cookies (use url/domain/name to filter). - set: requires url + name + value. - remove: requires url + name. - clear: clears all cookies for url or domain.
zen_create_windowOpen a new browser window. Pass a URL to load it at start.
zen_delete_sessionDelete a saved session file.
zen_detach_tabPop a tab out into its own new window.
zen_domGet the accessibility tree of interactive elements on the page. Args: tab_id: Optional tab to target. Defaults to active tab.
zen_double_clickDispatch a synthetic double-click on the matched element.
zen_downloadsDownloads operations. Args: op: "download" | "list" | "cancel". url: For "download", the URL to fetch. filename: Optional output filename. query: For "list", a downloads.search query dict.
zen_dragSynthetic drag-and-drop from one element to another (HTML5 drag events).
zen_duplicate_tabDuplicate a tab. Returns the new tab id.
zen_element_screenshotScreenshot a single element. Scrolls into view, captures, crops in the extension via OffscreenCanvas. Saves a PNG and returns its path (saved_to). Args: selector: CSS selector of the element tab_id: Optional tab to target. Defaults to active tab. save_to: Optional file path (default: ~/claude-zen-screenshots/element_<time>.png) data_url: Also return the PNG data URL (large - only if you really need the bytes inline) scale: 1-4 output pixels per CSS pixel. 2 = genuinely sharper capture at twice the size (needs extension 2.1.1+; older extensions ignore it)
zen_explain_selectorDiagnose a CSS selector: match count, sample matches, suggestions for a more-specific selector if you got too many.
zen_fillSet a form field's value directly (faster than typing). Args: selector: CSS selector of the input/select element value: Value to set tab_id: Optional tab to target. Defaults to active tab.
zen_findFind elements on the page using natural language description. Args: query: What to find (e.g. "login button", "search bar", "email input") tab_id: Optional tab to target. Defaults to active tab.
zen_focusMove focus to the matched element.
zen_focus_windowBring a browser window to the foreground.
zen_form_fillFill many fields at once via fuzzy matching. Each key in `fields` is matched as: CSS selector → name attribute → label text (case-insensitive contains) → placeholder. Each value is applied via the appropriate setter (.value for inputs/textareas, .checked for checkboxes/radios, value for selects). Returns per-key results. Args: fields: {"email": "foo@bar", "Password": "...", "#submit-target": true}
zen_formsGet all form fields on the current page with their labels and values. Args: tab_id: Optional tab to target. Defaults to active tab.
zen_forwardGo forward in history.
zen_full_page_metricsReturn document/viewport sizes + scroll position + devicePixelRatio.
zen_full_page_screenshotScroll-and-stitch screenshot covering the full document height (up to 30 viewports tall). Saves one PNG of the entire page and returns its path (saved_to). Args: tab_id: Optional tab to target. Defaults to active tab. save_to: Optional file path (default: ~/claude-zen-screenshots/fullpage_<time>.png) data_url: Also return the PNG data URL (large)
zen_get_policyReturn the active URL/readonly policy.
zen_get_zoomReturn the current zoom factor (1.0 = 100%).
zen_healthExtended health/status: bridge version, ports, keep-alive list, pool state, tags, policy, sessions dir, audit/log sizes.
zen_highlightHighlight an element on the page with a visual overlay. Args: selector: CSS selector of the element to highlight tab_id: Optional tab to target. Defaults to active tab.
zen_hoverHover over an element on the page. Args: selector: CSS selector of the element to hover over tab_id: Optional tab to target. Defaults to active tab.
zen_htmlReturn the outerHTML of a specific element. Cap 100KB.
zen_iframesList all iframes with src + same-origin/accessible flags.
zen_imagesReturn every <img> with src, alt, and natural dimensions.
zen_interceptBlock, log, or redirect HTTP requests by URL regex. Useful to suppress analytics/ads during agent runs (3–10× page speed-up) or to log what an SPA actually fetches. Args: op: "add" | "clear" | "list" | "log" | "clearLog". patterns: For "add", regex patterns to match against request URLs. effect: For "add", "block" (cancel request) or "redirect".
zen_jsExecute JavaScript in the current page context. Args: code: JavaScript code to run (e.g. "document.title" or "document.querySelectorAll('a').length") tab_id: Optional tab to target. Defaults to active tab. full: Results are capped at 8 MB (50 KB on extensions older than 2.1.0). full=True runs the code once and reads the result back in slices, so any size comes back complete.
zen_keep_aliveKeep tabs warm so Zen's Tab Unloader won't discard them mid-workflow. Starts a background pinger in the bridge that fires a no-op JS evaluation at each listed tab on the given interval. Any script access resets Zen's idle timer, so the tabs stay loaded. Replaces any existing keep-alive for the same tabs (use a new interval to change cadence). Use this at the start of parallel multi-tab work: open your tabs, call zen_keep_alive with their IDs, drive them in parallel via zen_parallel or by passing tab_id to individual commands, then zen_keep_alive_stop when done. The pinger auto-stops if the b…
zen_keep_alive_stopStop the keep-alive pinger for some or all tabs. Args: tab_ids: Tabs to stop pinging. Omit (or pass null) to stop all.
zen_keypressDispatch a synthetic keyboard event. Use modifiers like `{"ctrl": True, "shift": True}`. Pass `text` to also insert characters into editable targets. Args: key: Key name, e.g. "Enter", "Tab", "Escape", "ArrowDown", "a". selector: Optional element to target. Defaults to document.activeElement. modifiers: {"ctrl"|"shift"|"alt"|"meta": True}. text: If set, also insert this text into editable targets.
zen_linksReturn every anchor with href + text. Useful as a crawler primitive.
zen_list_sessionsList saved sessions with their metadata.
zen_list_tagsList all tag → tab id mappings.
zen_load_sessionRestore cookies + localStorage from a previously saved session.
zen_logsReturn recent bridge log lines (in-memory ring buffer).
zen_markdownConvert the page (or a selector subtree) to Markdown. Cap 80KB.
zen_metaReturn all meta tags + link rels (canonical, RSS, icons, etc.).
zen_move_tabMove a tab to a position (and optionally to a different window). -1 = end.
zen_mute_tabMute or unmute a tab.
zen_navigateNavigate the active tab to a URL. Args: url: The URL to navigate to (e.g. "https://example.com") tab_id: Optional tab to navigate. Defaults to active tab. raw: Bare image URLs (.jpg/.png/...) open inside a small local viewer page (image = #zlimg) so the extension can still script them. True opens the raw image.
zen_new_tabOpen a new browser tab. Args: url: URL to open in the new tab (default: blank page) raw: Bare image URLs open inside a local viewer page (image = #zlimg) unless raw=True.
zen_page_infoGet current page URL, title, dimensions, and scroll position. Args: tab_id: Optional tab to target. Defaults to active tab.
zen_page_textExtract all readable text from the current page. Args: tab_id: Optional tab to target. Defaults to active tab. For non-active tabs, prefer this with tab_id over zen_page_text_by_tab_id — they do the same thing now.
zen_page_text_by_tab_idGet page text from a specific tab by ID without switching to it. Args: tab_id: The tab ID to read from (get IDs from zen_tabs) Returns the full visible text content of the specified tab.
zen_parallelRun command sequences in parallel — typically one sequence per tab. Each inner list is a sequence that runs serially; all sequences run concurrently. Commands that target a specific tab (navigate, switchTab, or any tab-aware action) MUST include "tabId" inside the parallel batch to avoid race conditions over the active tab. Returns a list of result lists, one per input sequence. Args: sequences: List of command sequences. Each command is a dict with "action" and parameters — same shape as zen_batch commands. Example for driving two tabs at once: [ …
zen_pin_tabPin or unpin a tab.
zen_pool_acquireCheck out a warm tab from the pool. Returns its tab_id.
zen_pool_releaseReturn a tab to the pool for reuse.
zen_queryExtract multiple fields from every element matching a CSS selector. Much faster and cheaper than calling zen_js per element. The default fields cover the common ones (text, href, value, src, alt, id, name); pass `fields=["text","data-foo","bounds","attrs"]` to get arbitrary attributes or `bounds`/`attrs`/`html` extras. Args: selector: CSS selector. fields: Field names to extract per element. Defaults to a useful set. limit: Max elements to return (capped at 500). tab_id: Optional tab; defaults to active.
zen_readabilityExtract the main article on the page (title, byline, clean text). Heuristic: score candidate containers (`article`, `main`, `.post`, etc.) by text density × paragraph count × inverse link density, strip nav/aside, return the winner. Falls back to densest section/div, then body.
zen_reload_extensionHot-reload the ZenLink extension in the browser. Use this after editing the extension source to pick up changes without going through `about:addons` and toggling the extension by hand. The extension acks the request, then reloads itself ~100ms later; the background script's existing reconnect logic re-establishes the bridge WebSocket immediately. Content scripts in open tabs survive — they re- inject lazily on the next command (see forwardToContent in background.js). Note: only works once you're already on a version of the extension that has this action handler. The very first install of tha…
zen_reload_tabReload a tab. Pass `bypass_cache=True` for a hard reload.
zen_resolve_tagLook up the tab id for a tag set via zen_tag_tab.
zen_retryWrap any command in exponential-backoff retry. Args: command: A command dict (same shape as zen_batch entries). max_attempts: Total tries including the first. backoff_ms: Initial wait between attempts (doubles each retry). on_errors: Only retry if the error string contains one of these substrings. Default: retry on any error.
zen_save_sessionSnapshot cookies (and per-origin localStorage if urls given) to disk. Use case: log into a service interactively once, save the session, then have parallel agents load it for authenticated work. Args: name: A label for the session (becomes filename under ~/claude-zen-sessions/). urls: Origins whose cookies + localStorage to snapshot. Each gets opened briefly in a temp tab so localStorage can be read.
zen_schedulerReturn bridge scheduler state for multi-agent/tab work. Shows active per-tab/global command scopes, pending WebSocket commands, and known tab locks. Useful when several agents are driving separate tabs.
zen_screenshotCapture a screenshot of the current page. Returns the saved file path. Note: screenshots are inherently visual and capture the active tab of the focused window. To screenshot a specific tab, switch to it first with zen_switch_tab.
zen_scrollScroll the page. Args: direction: Scroll direction - "up", "down", "left", or "right" amount: Pixels to scroll tab_id: Optional tab to target. Defaults to active tab.
zen_select_optionChoose an <option> in a <select>. Default matches by value; pass `by_text=True` to match by visible text.
zen_set_editable_contentSet text or HTML in a contenteditable editor, input, or textarea in one fast operation. Use this for rich editors such as Gmail compose bodies where typing long text is slow. Args: selector: CSS selector or ZenLink ref for the editable element value: Text or HTML to place into the editor format: "text" for plain text or "html" for trusted HTML clear: Whether to replace existing content instead of appending tab_id: Optional tab to target. Defaults to active tab.
zen_set_policySet URL allow/deny regex lists and/or read-only mode. Read-only mode blocks write actions (click/type/navigate/cookies set/etc.) while still allowing read ops. Useful for "let the agent observe only."
zen_set_zoomSet zoom factor. 0.3 to 5.0 typical; 1.0 = 100%.
zen_statusCheck if ZenLink bridge and browser extension are connected.
zen_storagelocalStorage / sessionStorage ops. Args: kind: "local" or "session". op: "get" | "set" | "remove" | "clear" | "list" | "snapshot" | "restore". key: Required for get/set/remove. value: For set, the string value. For restore, a dict of key→value. tab_id: Tab to run against. Storage is per-origin, so prefer driving it on a tab already at the right origin.
zen_structured_dataExtract JSON-LD blocks, OpenGraph (og:*), and Twitter card meta.
zen_submit_formSubmit a form. If selector is omitted, submits the first <form> found.
zen_switch_tabSwitch focus to a specific browser tab. Args: tab_id: The tab ID to focus (get IDs from zen_tabs)
zen_sync_barrierBlock until a JS predicate returns truthy on every listed tab. Replaces hand-rolled "wait for everything to be ready" loops. Args: tab_ids: Tabs to monitor. predicate: JS expression that returns truthy when the tab is ready, e.g. "!!document.querySelector('.results')". timeout: Overall timeout in ms. poll_interval: Per-poll interval in ms.
zen_tab_poolMaintain a warm pool of N tabs always ready to be acquired. Grows or shrinks to `size`. Acquire/release via zen_pool_acquire and zen_pool_release. Auto-grows by one if you acquire from an empty pool.
zen_tabsList all open browser tabs with their IDs, titles, and URLs.
zen_tag_tabGive a tab a memorable name. Refer to it later via zen_resolve_tag. Names survive bridge restarts only if you re-tag — they live in memory.
zen_trusted_clickClick using the real OS mouse pointer for pages that reject synthetic DOM events. This is slower and moves the user's cursor, so prefer zen_click unless a page specifically ignores synthetic clicks. Args: selector: CSS selector to click. If provided, ZenLink clicks its center. x: X coordinate, used if selector is empty. y: Y coordinate, used if selector is empty. coordinate_space: "viewport" for browser viewport coords or "screen" for desktop coords. focus: Whether to try to foreground the browser first. Defaults to false. tab_id: Optional tab to resolve the selector …
zen_typeType text into an input field. Args: selector: CSS selector of the input element text: Text to type clear: Whether to clear existing text first tab_id: Optional tab to target. Defaults to active tab.
zen_untag_tabRemove a tag.
zen_upload_fileAttach local file(s) to a page's upload control - no OS file dialog. The bridge reads the file from disk and streams it into the page, which builds real File objects and sets them on the <input type=file> (firing input + change). If the selector is a drop zone with no input inside, it fires dragenter/dragover/drop. Args: path: absolute file path, or a list of paths for multi-file inputs. selector: the file input, an element containing it, or a drop zone. Omit to use the first input[type=file] on the page. mode: "auto" (input if found, else drop), "input", or "drop".…
zen_wait_for_elementWait for a CSS selector to appear and become visible on the page. Returns immediately when the element is found, rather than sleeping a fixed duration. Use this instead of sleep when waiting for dynamic/JS-rendered content. Args: selector: CSS selector to wait for (e.g. ".tracking-events", "#results", "[data-loaded]") timeout: Maximum time to wait in milliseconds (default: 10000 = 10s) poll_interval: How often to check in milliseconds (default: 200ms) tab_id: Optional tab to target. Defaults to active tab.
zen_wait_for_network_idleWait until no new network resources have started for `idle_ms`.
zen_wait_for_resultPoll a JavaScript expression until it returns a non-empty result. Args: code: JavaScript expression to evaluate repeatedly timeout: Maximum time to wait in milliseconds poll_interval: How often to check in milliseconds tab_id: Optional tab to target. Defaults to active tab.
zen_wait_for_titleWait until document.title matches a JS regex pattern.
zen_wait_for_urlWait until the tab's URL matches a JS regex pattern.
zen_wake_tabRevive a tab that Zen's Tab Unloader may have discarded. Zen aggressively unloads inactive tabs to save RAM. An unloaded tab still appears in zen_tabs but has no live content script — commands targeting it will hang or fail until it's reloaded. zen_wake_tab is idempotent: if the tab is already alive it returns immediately; otherwise it reloads the tab and waits for the page to finish loading. Use before targeting a tab that might have been idle for a while. Prefer zen_keep_alive for tabs you'll touch repeatedly. Args: tab_id: The tab ID to wake (get IDs from zen_tabs)
zen_watch_consoleToggle console capture on a tab. Once enabled, browser console messages (log/info/warn/error/debug + window errors) are buffered up to 500 entries; retrieve via zen_console_logs.
zen_windowsList all open browser windows with their tabs.
zen_workflowExecute a named ZenLink workflow from the bridge workflow directory. Args: name: Workflow file name without .md variables: Optional template variables for the workflow
zen_workflowsList available named ZenLink workflows from the bridge workflow directory.
zen_wp_htmlExtract HTML widget content from a WordPress Elementor page. Navigates to the Elementor editor for the given page, waits for load, then extracts the innerHTML of all HTML widgets from the Elementor preview iframe. Returns clean HTML/CSS/JS content. The browser must already be logged into WP admin for this to work. Args: site_url: WordPress site URL (e.g. "https://thankyouexperiences.com") page_id: WordPress page/post ID (e.g. 5719 for Team page)
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 0
- Weekly downloads
- 108
- Last commit
- Oct 6, 2026 (23 days ago)
- Last release
- Oct 6, 2026 (23 days ago)
- Last package publish
- Oct 6, 2026 (23 days ago)
From GitHub (fetched Oct 24, 2026) and the package registry.
Details
- Registry name
io.github.JayQuan-McCleary/zenlink-mcp- Version
- 2.1.2
- Auth
- No auth
- Packages
- pypi zenlink-mcp
- License
- MIT
- Repository
- github.com/JayQuan-McCleary/ZenLink-MCP
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
Cite this page
ZenLink MCP. Agent Mart. https://agentmart.dev/connectors/jayquan-mccleary-zenlink-mcp (last updated 2026-10-24)