diff --git a/mcp/chrome_bookmark_add.json b/mcp/chrome_bookmark_add.json
new file mode 100644
index 0000000..161f7dc
--- /dev/null
+++ b/mcp/chrome_bookmark_add.json
@@ -0,0 +1,26 @@
+{
+ "name": "chrome_bookmark_add",
+ "description": "Add a new bookmark to Chrome",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string",
+ "description": "URL to bookmark. If not provided, uses the current active tab URL."
+ },
+ "title": {
+ "type": "string",
+ "description": "Title for the bookmark. If not provided, uses the page title from the URL."
+ },
+ "parentId": {
+ "type": "string",
+ "description": "Parent folder path or ID to add the bookmark to. Can be a path string (e.g., \"Work/Projects\") or a folder ID. If not provided, adds to the \"Bookmarks Bar\" folder."
+ },
+ "createFolder": {
+ "type": "boolean",
+ "description": "Whether to create the parent folder if it does not exist (default: false)"
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_bookmark_delete.json b/mcp/chrome_bookmark_delete.json
new file mode 100644
index 0000000..e9cd389
--- /dev/null
+++ b/mcp/chrome_bookmark_delete.json
@@ -0,0 +1,22 @@
+{
+ "name": "chrome_bookmark_delete",
+ "description": "Delete a bookmark from Chrome",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "bookmarkId": {
+ "type": "string",
+ "description": "ID of the bookmark to delete. Either bookmarkId or url must be provided."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the bookmark to delete. Used if bookmarkId is not provided."
+ },
+ "title": {
+ "type": "string",
+ "description": "Title of the bookmark to help with matching when deleting by URL."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_bookmark_move.json b/mcp/chrome_bookmark_move.json
new file mode 100644
index 0000000..610a4ab
--- /dev/null
+++ b/mcp/chrome_bookmark_move.json
@@ -0,0 +1,26 @@
+{
+ "name": "chrome_bookmark_move",
+ "description": "Move a bookmark or folder to a different parent folder and/or position",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "bookmarkId": {
+ "type": "string",
+ "description": "ID of the bookmark/folder to move. Either bookmarkId or url must be provided."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL of the bookmark to move, used to locate it when bookmarkId is omitted."
+ },
+ "parentId": {
+ "type": "string",
+ "description": "Destination folder path (e.g. \"Work/Projects\") or folder ID. Required."
+ },
+ "index": {
+ "type": "number",
+ "description": "Position within the destination folder (0-based). Omit to append."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_bookmark_search.json b/mcp/chrome_bookmark_search.json
new file mode 100644
index 0000000..ed38c18
--- /dev/null
+++ b/mcp/chrome_bookmark_search.json
@@ -0,0 +1,22 @@
+{
+ "name": "chrome_bookmark_search",
+ "description": "Search Chrome bookmarks by title and URL",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "query": {
+ "type": "string",
+ "description": "Search query to match against bookmark titles and URLs. Leave empty to retrieve all bookmarks."
+ },
+ "maxResults": {
+ "type": "number",
+ "description": "Maximum number of bookmarks to return (default: 50)"
+ },
+ "folderPath": {
+ "type": "string",
+ "description": "Optional folder path or ID to limit search to a specific bookmark folder. Can be a path string (e.g., \"Work/Projects\") or a folder ID."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_bookmark_update.json b/mcp/chrome_bookmark_update.json
new file mode 100644
index 0000000..96ce9dc
--- /dev/null
+++ b/mcp/chrome_bookmark_update.json
@@ -0,0 +1,26 @@
+{
+ "name": "chrome_bookmark_update",
+ "description": "Update a bookmark or folder: change its title and/or URL",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "bookmarkId": {
+ "type": "string",
+ "description": "ID of the bookmark/folder to update. Either bookmarkId or url must be provided."
+ },
+ "url": {
+ "type": "string",
+ "description": "Current URL of the bookmark, used to locate it when bookmarkId is omitted."
+ },
+ "title": {
+ "type": "string",
+ "description": "New title."
+ },
+ "newUrl": {
+ "type": "string",
+ "description": "New URL (bookmarks only, not folders)."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_click_element.json b/mcp/chrome_click_element.json
new file mode 100644
index 0000000..e913c2f
--- /dev/null
+++ b/mcp/chrome_click_element.json
@@ -0,0 +1,83 @@
+{
+ "name": "chrome_click_element",
+ "description": "Click on an element in a web page. Supports multiple targeting methods: CSS selector, XPath, element ref (from chrome_read_page), or viewport coordinates. More focused than chrome_computer for simple click operations.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "selector": {
+ "type": "string",
+ "description": "CSS selector or XPath for the element to click."
+ },
+ "selectorType": {
+ "type": "string",
+ "enum": ["css", "xpath"],
+ "description": "Type of selector (default: \"css\")."
+ },
+ "ref": {
+ "type": "string",
+ "description": "Element ref from chrome_read_page (takes precedence over selector)."
+ },
+ "coordinates": {
+ "type": "object",
+ "description": "Viewport coordinates to click at.",
+ "properties": {
+ "x": {
+ "type": "number"
+ },
+ "y": {
+ "type": "number"
+ }
+ },
+ "required": ["x", "y"]
+ },
+ "double": {
+ "type": "boolean",
+ "description": "Perform double click when true (default: false)."
+ },
+ "button": {
+ "type": "string",
+ "enum": ["left", "right", "middle"],
+ "description": "Mouse button to click (default: \"left\")."
+ },
+ "modifiers": {
+ "type": "object",
+ "description": "Modifier keys to hold during click.",
+ "properties": {
+ "altKey": {
+ "type": "boolean"
+ },
+ "ctrlKey": {
+ "type": "boolean"
+ },
+ "metaKey": {
+ "type": "boolean"
+ },
+ "shiftKey": {
+ "type": "boolean"
+ }
+ }
+ },
+ "waitForNavigation": {
+ "type": "boolean",
+ "description": "Wait for navigation to complete after click (default: false)."
+ },
+ "timeout": {
+ "type": "number",
+ "description": "Timeout in milliseconds for waiting (default: 5000)."
+ },
+ "tabId": {
+ "type": "number",
+ "description": "Target tab ID. If omitted, uses the current active tab."
+ },
+ "windowId": {
+ "type": "number",
+ "description": "Window ID to select active tab from (when tabId is omitted)."
+ },
+ "frameId": {
+ "type": "number",
+ "description": "Target frame ID for iframe support."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_close_tabs.json b/mcp/chrome_close_tabs.json
new file mode 100644
index 0000000..c9dc24d
--- /dev/null
+++ b/mcp/chrome_close_tabs.json
@@ -0,0 +1,21 @@
+{
+ "name": "chrome_close_tabs",
+ "description": "Close one or more browser tabs",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "tabIds": {
+ "type": "array",
+ "items": {
+ "type": "number"
+ },
+ "description": "Array of tab IDs to close. If not provided, will close the active tab."
+ },
+ "url": {
+ "type": "string",
+ "description": "Close tabs matching this URL. Can be used instead of tabIds."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_computer.json b/mcp/chrome_computer.json
new file mode 100644
index 0000000..92241da
--- /dev/null
+++ b/mcp/chrome_computer.json
@@ -0,0 +1,165 @@
+{
+ "name": "chrome_computer",
+ "description": "Use a mouse and keyboard to interact with a web browser, and take screenshots.\n* Whenever you intend to click on an element like an icon, you should consult a read_page to determine the ref of the element before moving the cursor.\n* If you tried clicking on a program or link but it failed to load, even after waiting, try screenshot and then adjusting your click location so that the tip of the cursor visually falls on the element that you want to click.\n* Make sure to click any buttons, links, icons, etc with the cursor tip in the center of the element. Don't click boxes on their edges unless asked.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "tabId": {
+ "type": "number",
+ "description": "Target tab ID (default: active tab)"
+ },
+ "background": {
+ "type": "boolean",
+ "description": "Avoid focusing/activating tab/window for certain operations (best-effort). Default: false"
+ },
+ "action": {
+ "type": "string",
+ "description": "Action to perform: left_click | right_click | double_click | triple_click | left_click_drag | scroll | scroll_to | type | key | fill | fill_form | hover | wait | resize_page | zoom | screenshot"
+ },
+ "ref": {
+ "type": "string",
+ "description": "Element ref from chrome_read_page. For click/scroll/scroll_to/key/type and drag end when provided; takes precedence over coordinates."
+ },
+ "coordinates": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number",
+ "description": "X coordinate"
+ },
+ "y": {
+ "type": "number",
+ "description": "Y coordinate"
+ }
+ },
+ "description": "Coordinates for actions (in screenshot space if a recent screenshot was taken, otherwise viewport). Required for click/scroll and as end point for drag."
+ },
+ "startCoordinates": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number"
+ },
+ "y": {
+ "type": "number"
+ }
+ },
+ "description": "Starting coordinates for drag action"
+ },
+ "startRef": {
+ "type": "string",
+ "description": "Drag start ref from chrome_read_page (alternative to startCoordinates)."
+ },
+ "scrollDirection": {
+ "type": "string",
+ "description": "Scroll direction: up | down | left | right"
+ },
+ "scrollAmount": {
+ "type": "number",
+ "description": "Scroll ticks (1-10), default 3"
+ },
+ "text": {
+ "type": "string",
+ "description": "Text to type (for action=type) or keys/chords separated by space (for action=key, e.g. \"Backspace Enter\" or \"cmd+a\")"
+ },
+ "repeat": {
+ "type": "number",
+ "description": "For action=key: number of times to repeat the key sequence (integer 1-100, default 1)."
+ },
+ "modifiers": {
+ "type": "object",
+ "description": "Modifier keys for click actions (left_click/right_click/double_click/triple_click).",
+ "properties": {
+ "altKey": {
+ "type": "boolean"
+ },
+ "ctrlKey": {
+ "type": "boolean"
+ },
+ "metaKey": {
+ "type": "boolean"
+ },
+ "shiftKey": {
+ "type": "boolean"
+ }
+ }
+ },
+ "region": {
+ "type": "object",
+ "description": "For action=zoom: rectangular region to capture (x0,y0)-(x1,y1) in viewport pixels (or screenshot-space if a recent screenshot context exists).",
+ "properties": {
+ "x0": {
+ "type": "number"
+ },
+ "y0": {
+ "type": "number"
+ },
+ "x1": {
+ "type": "number"
+ },
+ "y1": {
+ "type": "number"
+ }
+ },
+ "required": ["x0", "y0", "x1", "y1"]
+ },
+ "selector": {
+ "type": "string",
+ "description": "CSS selector for fill (alternative to ref)."
+ },
+ "value": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "number"
+ }
+ ],
+ "description": "Value to set for action=fill (string | boolean | number)"
+ },
+ "elements": {
+ "type": "array",
+ "description": "For action=fill_form: list of elements to fill (ref + value)",
+ "items": {
+ "type": "object",
+ "properties": {
+ "ref": {
+ "type": "string",
+ "description": "Element ref from chrome_read_page"
+ },
+ "value": {
+ "type": "string",
+ "description": "Value to set (stringified if non-string)"
+ }
+ },
+ "required": ["ref", "value"]
+ }
+ },
+ "width": {
+ "type": "number",
+ "description": "For action=resize_page: viewport width"
+ },
+ "height": {
+ "type": "number",
+ "description": "For action=resize_page: viewport height"
+ },
+ "appear": {
+ "type": "boolean",
+ "description": "For action=wait with text: whether to wait for the text to appear (true, default) or disappear (false)"
+ },
+ "timeout": {
+ "type": "number",
+ "description": "For action=wait with text: timeout in milliseconds (default 10000, max 120000)"
+ },
+ "duration": {
+ "type": "number",
+ "description": "Seconds to wait for action=wait (max 30s)"
+ }
+ },
+ "required": ["action"]
+ }
+}
diff --git a/mcp/chrome_console.json b/mcp/chrome_console.json
new file mode 100644
index 0000000..a4af118
--- /dev/null
+++ b/mcp/chrome_console.json
@@ -0,0 +1,63 @@
+{
+ "name": "chrome_console",
+ "description": "Capture console output from a browser tab. Supports snapshot mode (default; one-time capture with ~2s wait) and buffer mode (persistent per-tab buffer you can read/clear instantly without waiting).",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string",
+ "description": "URL to navigate to and capture console from. If not provided, uses the current active tab"
+ },
+ "tabId": {
+ "type": "number",
+ "description": "Target an existing tab by ID (default: active tab)."
+ },
+ "windowId": {
+ "type": "number",
+ "description": "Target window ID to pick active tab when tabId is omitted."
+ },
+ "background": {
+ "type": "boolean",
+ "description": "Do not activate tab/focus window when capturing via CDP. Default: false"
+ },
+ "includeExceptions": {
+ "type": "boolean",
+ "description": "Include uncaught exceptions in the output (default: true)"
+ },
+ "maxMessages": {
+ "type": "number",
+ "description": "Maximum number of console messages to capture in snapshot mode (default: 100). If limit is provided, it takes precedence."
+ },
+ "mode": {
+ "type": "string",
+ "enum": ["snapshot", "buffer"],
+ "description": "Console capture mode: snapshot (default; waits ~2s for messages) or buffer (persistent per-tab buffer; reads from memory instantly)."
+ },
+ "buffer": {
+ "type": "boolean",
+ "description": "Alias for mode=\"buffer\" (default: false)."
+ },
+ "clear": {
+ "type": "boolean",
+ "description": "Buffer mode only: clear the buffered logs for this tab before reading (default: false). Use clearAfterRead instead to clear after reading (mcp-tools.js style)."
+ },
+ "clearAfterRead": {
+ "type": "boolean",
+ "description": "Buffer mode only: clear the buffered logs for this tab AFTER reading, to avoid duplicate messages on subsequent calls (default: false). This matches mcp-tools.js behavior."
+ },
+ "pattern": {
+ "type": "string",
+ "description": "Optional regex filter applied to message/exception text. Supports /pattern/flags syntax."
+ },
+ "onlyErrors": {
+ "type": "boolean",
+ "description": "Only return error-level console messages (and exceptions when includeExceptions=true). Default: false."
+ },
+ "limit": {
+ "type": "number",
+ "description": "Limit returned console messages. In snapshot mode this is an alias for maxMessages; in buffer mode it limits returned messages from the buffer."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_csp.json b/mcp/chrome_csp.json
new file mode 100644
index 0000000..0eb3456
--- /dev/null
+++ b/mcp/chrome_csp.json
@@ -0,0 +1,28 @@
+{
+ "name": "chrome_csp",
+ "description": "Enable/disable Content-Security-Policy for ONE tab. WHEN TO USE: only when injecting code that runs in the page's own context is blocked by the site's CSP \u2014 i.e. MAIN-world userscripts (chrome_userscripts) or page-context script injection on a strict-CSP site. You do NOT need this for chrome_javascript (its CDP/ISOLATED paths already bypass page CSP) or for normal reads/clicks/nav. A (re)load is unavoidable: CSP is fixed at page load, so disabling it always reloads the tab (it can't retroactively un-enforce the current document). Typical flow: chrome_csp{action:'disable',tabId} -> (tab reloads) -> inject -> chrome_csp{action:'enable',tabId} when done. Default method 'dnr' handles header-based CSP (the common case); use method 'cdp' only if the page sets CSP via an in-HTML tag.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "action": {
+ "type": "string",
+ "enum": ["disable", "enable", "status"],
+ "description": "disable: remove CSP response headers for this tab on subsequent loads; enable: restore CSP for this tab (idempotent); status: report whether CSP is currently disabled for this tab."
+ },
+ "tabId": {
+ "type": "number",
+ "description": "Target tab ID. Omit to use the active tab in the current window."
+ },
+ "reload": {
+ "type": "boolean",
+ "description": "Reload the tab so the change takes effect (default true, applies to BOTH methods \u2014 CSP is bound at page load and cannot be changed for the already-rendered document). Pass false only if you will navigate this tab yourself right after (the new navigation then carries the change)."
+ },
+ "method": {
+ "type": "string",
+ "enum": ["dnr", "cdp", "auto"],
+ "description": "Default 'dnr' \u2014 strips CSP *response headers* via a per-tab declarativeNetRequest session rule; no debugger infobar; persists for the browser session; does NOT affect in-HTML CSP. 'cdp' \u2014 CDP Page.setBypassCSP; ALSO removes CSP (use only when the site sets CSP via a tag); attaches chrome.debugger (shows the 'being debugged' infobar) and is ephemeral (lost on service-worker restart). 'auto' \u2014 try cdp, fall back to dnr if the debugger can't attach (e.g. chrome:// page). Both methods reload by default. The response's `method` field reports which was actually used."
+ }
+ },
+ "required": ["action"]
+ }
+}
diff --git a/mcp/chrome_extension_config.json b/mcp/chrome_extension_config.json
new file mode 100644
index 0000000..adf76f4
--- /dev/null
+++ b/mcp/chrome_extension_config.json
@@ -0,0 +1,22 @@
+{
+ "name": "chrome_extension_config",
+ "description": "Get or set whitelisted extension configuration stored in chrome.storage.local. action=get returns a single key (or all whitelisted keys when key is omitted); action=set writes a writable key. Only a safe subset of settings is exposed.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "action": {
+ "type": "string",
+ "enum": ["get", "set"],
+ "description": "get: read a whitelisted config value (or all when key omitted); set: write a writable config value."
+ },
+ "key": {
+ "type": "string",
+ "description": "Config key. One of: nativeServerPort, nativeAutoConnectEnabled, selectedModel, userPreferences (writable), serverStatus (read-only). Omit for action=get to return all whitelisted values."
+ },
+ "value": {
+ "description": "New value for action=set. Type depends on the key (number for nativeServerPort, boolean for nativeAutoConnectEnabled, etc.)."
+ }
+ },
+ "required": ["action"]
+ }
+}
diff --git a/mcp/chrome_extension_reload.json b/mcp/chrome_extension_reload.json
new file mode 100644
index 0000000..c9fdffc
--- /dev/null
+++ b/mcp/chrome_extension_reload.json
@@ -0,0 +1,9 @@
+{
+ "name": "chrome_extension_reload",
+ "description": "Reload the running extension via runtime.reload(). This terminates the service worker; the native messaging bridge drops and Chrome respawns the extension on reconnect. The response is returned before the reload fires.",
+ "parameters": {
+ "type": "object",
+ "properties": {},
+ "required": []
+ }
+}
diff --git a/mcp/chrome_extension_status.json b/mcp/chrome_extension_status.json
new file mode 100644
index 0000000..0f9b713
--- /dev/null
+++ b/mcp/chrome_extension_status.json
@@ -0,0 +1,9 @@
+{
+ "name": "chrome_extension_status",
+ "description": "Report the *running* mcp-chrome extension itself: its actual loaded manifest version, id, name, enabled/installType, declared and currently-granted permissions, and native-bridge connectivity. Authoritative source of \"which version is live\" \u2014 read this instead of trusting the chrome://extensions number.",
+ "parameters": {
+ "type": "object",
+ "properties": {},
+ "required": []
+ }
+}
diff --git a/mcp/chrome_extension_update.json b/mcp/chrome_extension_update.json
new file mode 100644
index 0000000..7541bc3
--- /dev/null
+++ b/mcp/chrome_extension_update.json
@@ -0,0 +1,14 @@
+{
+ "name": "chrome_extension_update",
+ "description": "Check for an available update of the running extension via the update server, and optionally apply it. Applying reloads the extension (terminates the service worker; the native bridge connection drops and the response may not return). Chrome throttles update checks (~hourly) \u2014 a throttled result is reported, not an error.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "apply": {
+ "type": "boolean",
+ "description": "After a check, if an update is available, apply it via runtime.reload() (terminates the extension; the response may not return). Default false."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_fill_or_select.json b/mcp/chrome_fill_or_select.json
new file mode 100644
index 0000000..e499289
--- /dev/null
+++ b/mcp/chrome_fill_or_select.json
@@ -0,0 +1,39 @@
+{
+ "name": "chrome_fill_or_select",
+ "description": "Fill or select a form element on a web page. Supports input, textarea, select, checkbox, and radio elements. Use CSS selector, XPath, or element ref to target the element.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "selector": {
+ "type": "string",
+ "description": "CSS selector or XPath for the form element."
+ },
+ "selectorType": {
+ "type": "string",
+ "enum": ["css", "xpath"],
+ "description": "Type of selector (default: \"css\")."
+ },
+ "ref": {
+ "type": "string",
+ "description": "Element ref from chrome_read_page (takes precedence over selector)."
+ },
+ "value": {
+ "type": ["string", "number", "boolean"],
+ "description": "Value to fill. For text inputs: string. For checkboxes/radios: boolean. For selects: option value or text."
+ },
+ "tabId": {
+ "type": "number",
+ "description": "Target tab ID. If omitted, uses the current active tab."
+ },
+ "windowId": {
+ "type": "number",
+ "description": "Window ID to select active tab from (when tabId is omitted)."
+ },
+ "frameId": {
+ "type": "number",
+ "description": "Target frame ID for iframe support."
+ }
+ },
+ "required": ["value"]
+ }
+}
diff --git a/mcp/chrome_get_web_content.json b/mcp/chrome_get_web_content.json
new file mode 100644
index 0000000..a5651ee
--- /dev/null
+++ b/mcp/chrome_get_web_content.json
@@ -0,0 +1,34 @@
+{
+ "name": "chrome_get_web_content",
+ "description": "Fetch content from a web page",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string",
+ "description": "URL to fetch content from. If not provided, uses the current active tab"
+ },
+ "tabId": {
+ "type": "number",
+ "description": "Target an existing tab by ID (default: active tab)."
+ },
+ "background": {
+ "type": "boolean",
+ "description": "Do not activate tab/focus window while fetching (default: false)"
+ },
+ "htmlContent": {
+ "type": "boolean",
+ "description": "Get the visible HTML content of the page. If true, textContent will be ignored (default: false)"
+ },
+ "textContent": {
+ "type": "boolean",
+ "description": "Get the visible text content of the page with metadata. Ignored if htmlContent is true (default: true)"
+ },
+ "selector": {
+ "type": "string",
+ "description": "CSS selector to get content from a specific element. If provided, only content from this element will be returned"
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_gif_recorder.json b/mcp/chrome_gif_recorder.json
new file mode 100644
index 0000000..f76d14e
--- /dev/null
+++ b/mcp/chrome_gif_recorder.json
@@ -0,0 +1,224 @@
+{
+ "name": "chrome_gif_recorder",
+ "description": "Record browser tab activity as an animated GIF.\n\nModes:\n- Fixed FPS mode (action=\"start\"): Captures frames at regular intervals. Good for animations/videos.\n- Auto-capture mode (action=\"auto_start\"): Captures frames automatically when chrome_computer or chrome_navigate actions succeed. Better for interaction recordings with natural pacing.\n\nUse \"stop\" to end recording and save the GIF.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "action": {
+ "type": "string",
+ "enum": [
+ "start",
+ "stop",
+ "status",
+ "auto_start",
+ "capture",
+ "clear",
+ "export"
+ ],
+ "description": "Action to perform:\n- \"start\": Begin fixed-FPS recording (captures frames at regular intervals)\n- \"auto_start\": Begin auto-capture mode (frames captured on tool actions)\n- \"stop\": End recording and save GIF\n- \"status\": Get current recording state\n- \"capture\": Manually trigger a frame capture in auto mode\n- \"clear\": Clear all recording state and cached GIF without saving\n- \"export\": Export the last recorded GIF (download or drag&drop upload)"
+ },
+ "tabId": {
+ "type": "number",
+ "description": "Target tab ID (default: active tab). Used with \"start\"/\"auto_start\" for recording, and with \"export\" (download=false) for drag&drop upload target."
+ },
+ "fps": {
+ "type": "number",
+ "description": "Frames per second for fixed-FPS mode (1-30, default: 5). Higher values = smoother but larger file."
+ },
+ "durationMs": {
+ "type": "number",
+ "description": "Maximum recording duration in milliseconds (default: 5000, max: 60000). Only for fixed-FPS mode."
+ },
+ "maxFrames": {
+ "type": "number",
+ "description": "Maximum number of frames to capture (default: 50 for fixed-FPS, 100 for auto mode, max: 300)."
+ },
+ "width": {
+ "type": "number",
+ "description": "Output GIF width in pixels (default: 800, max: 1920)."
+ },
+ "height": {
+ "type": "number",
+ "description": "Output GIF height in pixels (default: 600, max: 1080)."
+ },
+ "maxColors": {
+ "type": "number",
+ "description": "Maximum colors in palette (default: 256). Lower values = smaller file size."
+ },
+ "filename": {
+ "type": "string",
+ "description": "Output filename (without extension). Defaults to timestamped name."
+ },
+ "captureDelayMs": {
+ "type": "number",
+ "description": "Auto-capture mode only: Delay in ms after action before capturing frame (default: 150). Allows UI to stabilize."
+ },
+ "frameDelayCs": {
+ "type": "number",
+ "description": "Auto-capture mode only: Display duration per frame in centiseconds (default: 20 = 200ms per frame)."
+ },
+ "annotation": {
+ "type": "string",
+ "description": "Auto-capture mode only (action=\"capture\"): Optional text label to render on the captured frame."
+ },
+ "download": {
+ "type": "boolean",
+ "description": "Export action only: Set to true (default) to download the GIF, or false to upload via drag&drop."
+ },
+ "coordinates": {
+ "type": "object",
+ "description": "Export action only (when download=false): Target coordinates for drag&drop upload.",
+ "properties": {
+ "x": {
+ "type": "number"
+ },
+ "y": {
+ "type": "number"
+ }
+ },
+ "required": ["x", "y"]
+ },
+ "ref": {
+ "type": "string",
+ "description": "Export action only (when download=false): Element ref from chrome_read_page for drag&drop target."
+ },
+ "selector": {
+ "type": "string",
+ "description": "Export action only (when download=false): CSS selector for drag&drop target element."
+ },
+ "enhancedRendering": {
+ "type": "object",
+ "description": "Auto-capture mode only: Configure visual overlays for recorded actions (click indicators, drag paths, labels). Pass `true` to enable all defaults.",
+ "properties": {
+ "clickIndicators": {
+ "oneOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean",
+ "description": "Enable click indicators (default: true)"
+ },
+ "color": {
+ "type": "string",
+ "description": "CSS color for click indicator (default: \"rgba(255, 87, 34, 0.8)\")"
+ },
+ "radius": {
+ "type": "number",
+ "description": "Initial radius in px (default: 20)"
+ },
+ "animationDurationMs": {
+ "type": "number",
+ "description": "Animation duration in ms (default: 400)"
+ },
+ "animationFrames": {
+ "type": "number",
+ "description": "Number of animation frames (default: 3)"
+ },
+ "animationIntervalMs": {
+ "type": "number",
+ "description": "Interval between animation frames in ms (default: 80)"
+ }
+ }
+ }
+ ],
+ "description": "Click indicator overlay config (true for defaults, or object for custom)."
+ },
+ "dragPaths": {
+ "oneOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean",
+ "description": "Enable drag path rendering (default: true)"
+ },
+ "color": {
+ "type": "string",
+ "description": "CSS color for drag path (default: \"rgba(33, 150, 243, 0.7)\")"
+ },
+ "lineWidth": {
+ "type": "number",
+ "description": "Line width in px (default: 3)"
+ },
+ "lineDash": {
+ "type": "array",
+ "items": {
+ "type": "number"
+ },
+ "description": "Dash pattern (default: [6, 4])"
+ },
+ "arrowSize": {
+ "type": "number",
+ "description": "Arrow head size in px (default: 10)"
+ }
+ }
+ }
+ ],
+ "description": "Drag path overlay config (true for defaults, or object for custom)."
+ },
+ "labels": {
+ "oneOf": [
+ {
+ "type": "boolean"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean",
+ "description": "Enable action labels (default: true)"
+ },
+ "font": {
+ "type": "string",
+ "description": "Font for labels (default: \"bold 12px sans-serif\")"
+ },
+ "textColor": {
+ "type": "string",
+ "description": "Text color (default: \"#fff\")"
+ },
+ "bgColor": {
+ "type": "string",
+ "description": "Background color (default: \"rgba(0,0,0,0.7)\")"
+ },
+ "padding": {
+ "type": "number",
+ "description": "Padding in px (default: 4)"
+ },
+ "borderRadius": {
+ "type": "number",
+ "description": "Border radius in px (default: 4)"
+ },
+ "offset": {
+ "type": "object",
+ "properties": {
+ "x": {
+ "type": "number"
+ },
+ "y": {
+ "type": "number"
+ }
+ },
+ "description": "Offset from action position (default: {x: 10, y: -20})"
+ }
+ }
+ }
+ ],
+ "description": "Action label overlay config (true for defaults, or object for custom)."
+ },
+ "durationMs": {
+ "type": "number",
+ "description": "How long overlays remain visible in ms (default: 1500)."
+ }
+ }
+ }
+ },
+ "required": ["action"]
+ }
+}
diff --git a/mcp/chrome_handle_dialog.json b/mcp/chrome_handle_dialog.json
new file mode 100644
index 0000000..8c5039e
--- /dev/null
+++ b/mcp/chrome_handle_dialog.json
@@ -0,0 +1,18 @@
+{
+ "name": "chrome_handle_dialog",
+ "description": "Handle JavaScript dialogs (alert/confirm/prompt) via CDP",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "action": {
+ "type": "string",
+ "description": "accept | dismiss"
+ },
+ "promptText": {
+ "type": "string",
+ "description": "Optional prompt text when accepting a prompt"
+ }
+ },
+ "required": ["action"]
+ }
+}
diff --git a/mcp/chrome_handle_download.json b/mcp/chrome_handle_download.json
new file mode 100644
index 0000000..517576f
--- /dev/null
+++ b/mcp/chrome_handle_download.json
@@ -0,0 +1,22 @@
+{
+ "name": "chrome_handle_download",
+ "description": "Wait for a browser download and return details (id, filename, url, state, size)",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "filenameContains": {
+ "type": "string",
+ "description": "Filter by substring in filename or URL"
+ },
+ "timeoutMs": {
+ "type": "number",
+ "description": "Timeout in ms (default 60000, max 300000)"
+ },
+ "waitForComplete": {
+ "type": "boolean",
+ "description": "Wait until completed (default true)"
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_history.json b/mcp/chrome_history.json
new file mode 100644
index 0000000..0529ffe
--- /dev/null
+++ b/mcp/chrome_history.json
@@ -0,0 +1,30 @@
+{
+ "name": "chrome_history",
+ "description": "Retrieve and search browsing history from Chrome",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "text": {
+ "type": "string",
+ "description": "Text to search for in history URLs and titles. Leave empty to retrieve all history entries within the time range."
+ },
+ "startTime": {
+ "type": "string",
+ "description": "Start time as a date string. Supports ISO format (e.g., \"2023-10-01\", \"2023-10-01T14:30:00\"), relative times (e.g., \"1 day ago\", \"2 weeks ago\", \"3 months ago\", \"1 year ago\"), and special keywords (\"now\", \"today\", \"yesterday\"). Default: 24 hours ago"
+ },
+ "endTime": {
+ "type": "string",
+ "description": "End time as a date string. Supports ISO format (e.g., \"2023-10-31\", \"2023-10-31T14:30:00\"), relative times (e.g., \"1 day ago\", \"2 weeks ago\", \"3 months ago\", \"1 year ago\"), and special keywords (\"now\", \"today\", \"yesterday\"). Default: current time"
+ },
+ "maxResults": {
+ "type": "number",
+ "description": "Maximum number of history entries to return. Use this to limit results for performance or to focus on the most relevant entries. (default: 100)"
+ },
+ "excludeCurrentTabs": {
+ "type": "boolean",
+ "description": "When set to true, filters out URLs that are currently open in any browser tab. Useful for finding pages you've visited but don't have open anymore. (default: false)"
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_javascript.json b/mcp/chrome_javascript.json
new file mode 100644
index 0000000..14ee424
--- /dev/null
+++ b/mcp/chrome_javascript.json
@@ -0,0 +1,26 @@
+{
+ "name": "chrome_javascript",
+ "description": "Execute JavaScript code in a browser tab and return the result. Uses CDP Runtime.evaluate with awaitPromise and returnByValue; automatically falls back to chrome.scripting.executeScript if the debugger is busy. Output is sanitized (sensitive data redacted) and truncated by default.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "string",
+ "description": "JavaScript code to execute. Runs inside an async function body, so top-level await and \"return ...\" are supported. A single bare expression is auto-returned, so \"2+2\" yields 4 \u2014 but a MULTI-STATEMENT snippet needs an explicit \"return\", since only the last value of a one-expression snippet can be inferred (e.g. \"const t = document.title; return t;\")."
+ },
+ "tabId": {
+ "type": "number",
+ "description": "Target tab ID. If omitted, uses the current active tab."
+ },
+ "timeoutMs": {
+ "type": "number",
+ "description": "Execution timeout in milliseconds (default: 15000)."
+ },
+ "maxOutputBytes": {
+ "type": "number",
+ "description": "Maximum output size in bytes after sanitization (default: 51200). Output exceeding this limit will be truncated."
+ }
+ },
+ "required": ["code"]
+ }
+}
diff --git a/mcp/chrome_keyboard.json b/mcp/chrome_keyboard.json
new file mode 100644
index 0000000..63a4342
--- /dev/null
+++ b/mcp/chrome_keyboard.json
@@ -0,0 +1,39 @@
+{
+ "name": "chrome_keyboard",
+ "description": "Simulate keyboard input on a web page. Supports single keys (Enter, Tab, Escape), key combinations (Ctrl+C, Ctrl+V), and text input. Can target a specific element or send to the focused element.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "keys": {
+ "type": "string",
+ "description": "Keys or key combinations to simulate. Examples: \"Enter\", \"Tab\", \"Ctrl+C\", \"Shift+Tab\", \"Hello World\"."
+ },
+ "selector": {
+ "type": "string",
+ "description": "CSS selector or XPath for target element to receive keyboard events."
+ },
+ "selectorType": {
+ "type": "string",
+ "enum": ["css", "xpath"],
+ "description": "Type of selector (default: \"css\")."
+ },
+ "delay": {
+ "type": "number",
+ "description": "Delay between keystrokes in milliseconds (default: 50)."
+ },
+ "tabId": {
+ "type": "number",
+ "description": "Target tab ID. If omitted, uses the current active tab."
+ },
+ "windowId": {
+ "type": "number",
+ "description": "Window ID to select active tab from (when tabId is omitted)."
+ },
+ "frameId": {
+ "type": "number",
+ "description": "Target frame ID for iframe support."
+ }
+ },
+ "required": ["keys"]
+ }
+}
diff --git a/mcp/chrome_list_profiles.json b/mcp/chrome_list_profiles.json
new file mode 100644
index 0000000..d8bc6a8
--- /dev/null
+++ b/mcp/chrome_list_profiles.json
@@ -0,0 +1,14 @@
+{
+ "name": "chrome_list_profiles",
+ "description": "List the Chrome profiles found on disk by reading the Local State file in the Chrome user-data directory. Returns each profile's directory name (e.g. \"Default\", \"Profile 1\"), display name, and GAIA (Google account) email if present. Profile enumeration is handled entirely by the native host and does not require the extension to be connected.\n\nEach profile also carries an \"attached\" field: true for the profile that currently holds the MCP bridge, false for the others, or the string \"unknown\" when attachment could not be determined (the extension has not completed its handshake, the profile is not signed in, or the identity permission is missing). Top-level \"attachmentKnown\" says which case you are in, and \"attachmentUnknownReason\" says why when it is unknown. When attachment is unknown, DO NOT infer which profile the bridge is on \u2014 an unknown answer is a real answer; treat it as such and say so rather than guessing.\n\nThis tool does NOT switch profiles: every other browser tool acts on the attached profile only. Selecting which profile the bridge drives is not yet implemented (see oleks/mcp-chrome#13).",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "userDataDir": {
+ "type": "string",
+ "description": "Absolute path to the Chrome user-data directory. If omitted, the platform default is used (e.g. ~/.config/google-chrome on Linux, ~/Library/Application Support/Google/Chrome on macOS, %LOCALAPPDATA%\\Google\\Chrome\\User Data on Windows)."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_move_tab.json b/mcp/chrome_move_tab.json
new file mode 100644
index 0000000..e62f279
--- /dev/null
+++ b/mcp/chrome_move_tab.json
@@ -0,0 +1,25 @@
+{
+ "name": "chrome_move_tab",
+ "description": "Move one or more tabs to a different window and/or position. Use this to relocate a tab into another window or reorder it within a window.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "tabIds": {
+ "type": "array",
+ "items": {
+ "type": "number"
+ },
+ "description": "IDs of the tabs to move. If omitted, the active tab is moved."
+ },
+ "windowId": {
+ "type": "number",
+ "description": "Target window ID to move the tab(s) into. If omitted, tabs stay in their current window (reorder only)."
+ },
+ "index": {
+ "type": "number",
+ "description": "Position within the target window (0-based). -1 (default) appends to the end."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_navigate.json b/mcp/chrome_navigate.json
new file mode 100644
index 0000000..3c3f215
--- /dev/null
+++ b/mcp/chrome_navigate.json
@@ -0,0 +1,42 @@
+{
+ "name": "chrome_navigate",
+ "description": "Navigate to a URL, refresh the current tab, or navigate browser history (back/forward)",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string",
+ "description": "URL to navigate to. Special values: \"back\" or \"forward\" to navigate browser history in the target tab."
+ },
+ "newWindow": {
+ "type": "boolean",
+ "description": "Create a new window to navigate to the URL or not. Defaults to false"
+ },
+ "tabId": {
+ "type": "number",
+ "description": "Target an existing tab by ID (if provided, navigate/refresh/back/forward that tab instead of the active tab)."
+ },
+ "windowId": {
+ "type": "number",
+ "description": "Target an existing window by ID (when creating a new tab in existing window, or picking active tab if tabId is not provided)."
+ },
+ "background": {
+ "type": "boolean",
+ "description": "Perform the operation without stealing focus (do not activate the tab or focus the window). Default: false"
+ },
+ "width": {
+ "type": "number",
+ "description": "Window width in pixels (default: 1280). When width or height is provided, a new window will be created."
+ },
+ "height": {
+ "type": "number",
+ "description": "Window height in pixels (default: 720). When width or height is provided, a new window will be created."
+ },
+ "refresh": {
+ "type": "boolean",
+ "description": "Refresh the current active tab instead of navigating to a URL. When true, the url parameter is ignored. Defaults to false"
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_network_capture.json b/mcp/chrome_network_capture.json
new file mode 100644
index 0000000..7ca57f3
--- /dev/null
+++ b/mcp/chrome_network_capture.json
@@ -0,0 +1,35 @@
+{
+ "name": "chrome_network_capture",
+ "description": "Unified network capture tool. Use action=\"start\" to begin capturing, action=\"stop\" to end and retrieve results. Set needResponseBody=true to capture response bodies (uses Debugger API, may conflict with DevTools). Default mode uses webRequest API (lightweight, no debugger conflict, but no response body).",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "action": {
+ "type": "string",
+ "enum": ["start", "stop"],
+ "description": "Action to perform: \"start\" begins capture, \"stop\" ends and returns results"
+ },
+ "needResponseBody": {
+ "type": "boolean",
+ "description": "When true, captures response body using Debugger API (default: false). Only use when you need to inspect response content."
+ },
+ "url": {
+ "type": "string",
+ "description": "URL to capture network requests from. For action=\"start\". If not provided, uses the current active tab."
+ },
+ "maxCaptureTime": {
+ "type": "number",
+ "description": "Maximum capture time in milliseconds (default: 180000)"
+ },
+ "inactivityTimeout": {
+ "type": "number",
+ "description": "Stop after inactivity in milliseconds (default: 60000). Set 0 to disable."
+ },
+ "includeStatic": {
+ "type": "boolean",
+ "description": "Include static resources like images/scripts/styles (default: false)"
+ }
+ },
+ "required": ["action"]
+ }
+}
diff --git a/mcp/chrome_network_request.json b/mcp/chrome_network_request.json
new file mode 100644
index 0000000..e8839b5
--- /dev/null
+++ b/mcp/chrome_network_request.json
@@ -0,0 +1,34 @@
+{
+ "name": "chrome_network_request",
+ "description": "Send a network request from the browser with cookies and other browser context",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string",
+ "description": "URL to send the request to"
+ },
+ "method": {
+ "type": "string",
+ "description": "HTTP method to use (default: GET)"
+ },
+ "headers": {
+ "type": "object",
+ "description": "Headers to include in the request"
+ },
+ "body": {
+ "type": "string",
+ "description": "Body of the request (for POST, PUT, etc.)"
+ },
+ "timeout": {
+ "type": "number",
+ "description": "Timeout in milliseconds (default: 30000)"
+ },
+ "formData": {
+ "type": "object",
+ "description": "Multipart/form-data descriptor. If provided, overrides body and builds FormData with optional file attachments. Shape: { fields?: Record, files?: Array<{ name: string, fileUrl?: string, filePath?: string, base64Data?: string, filename?: string, contentType?: string }> }. Also supports a compact array form: [ [name, fileSpec, filename?], ... ] where fileSpec may be url:, file:, or base64:."
+ }
+ },
+ "required": ["url"]
+ }
+}
diff --git a/mcp/chrome_read_page.json b/mcp/chrome_read_page.json
new file mode 100644
index 0000000..f4d296e
--- /dev/null
+++ b/mcp/chrome_read_page.json
@@ -0,0 +1,30 @@
+{
+ "name": "chrome_read_page",
+ "description": "Get an accessibility tree representation of visible elements on the page. Only returns elements that are visible in the viewport. Optionally filter for only interactive elements.\nTip: If the returned elements do not include the specific element you need, use the computer tool's screenshot (action=\"screenshot\") to capture the element's on-screen coordinates, then operate by coordinates.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "filter": {
+ "type": "string",
+ "description": "Filter elements: \"interactive\" for such as buttons/links/inputs only (default: all visible elements)"
+ },
+ "depth": {
+ "type": "number",
+ "description": "Maximum DOM depth to traverse (integer >= 0). Lower values reduce output size and can improve performance."
+ },
+ "refId": {
+ "type": "string",
+ "description": "Focus on the subtree rooted at this element refId (e.g., \"ref_12\"). The refId must come from a recent chrome_read_page response in the same tab (refs may expire)."
+ },
+ "tabId": {
+ "type": "number",
+ "description": "Target an existing tab by ID (default: active tab)."
+ },
+ "windowId": {
+ "type": "number",
+ "description": "Target window ID to pick active tab when tabId is omitted."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_request_element_selection.json b/mcp/chrome_request_element_selection.json
new file mode 100644
index 0000000..759fa28
--- /dev/null
+++ b/mcp/chrome_request_element_selection.json
@@ -0,0 +1,45 @@
+{
+ "name": "chrome_request_element_selection",
+ "description": "Request the user to manually select one or more elements on the current page. Use this as a human-in-the-loop fallback when you cannot reliably locate the target element after approximately 3 attempts using chrome_read_page combined with chrome_click_element/chrome_fill_or_select/chrome_computer. The user will see a panel with instructions and can click on the requested elements. Returns element refs compatible with chrome_click_element/chrome_fill_or_select (including iframe frameId for cross-frame support).",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "requests": {
+ "type": "array",
+ "description": "A list of element selection requests. Each request produces exactly one picked element. The user will see these requests in a panel and select each element by clicking on the page.",
+ "minItems": 1,
+ "items": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "description": "Optional stable request id for correlation. If omitted, an id is auto-generated (e.g., \"req_1\")."
+ },
+ "name": {
+ "type": "string",
+ "description": "Short label shown to the user describing what element to select (e.g., \"Login button\", \"Email input field\")."
+ },
+ "description": {
+ "type": "string",
+ "description": "Optional longer instruction shown to the user with more context (e.g., \"Click on the primary login button in the top-right corner\")."
+ }
+ },
+ "required": ["name"]
+ }
+ },
+ "timeoutMs": {
+ "type": "number",
+ "description": "Timeout in milliseconds for the user to complete all selections. Default: 180000 (3 minutes). Maximum: 600000 (10 minutes)."
+ },
+ "tabId": {
+ "type": "number",
+ "description": "Target tab ID. If omitted, uses the current active tab."
+ },
+ "windowId": {
+ "type": "number",
+ "description": "Window ID to select active tab from (when tabId is omitted)."
+ }
+ },
+ "required": ["requests"]
+ }
+}
diff --git a/mcp/chrome_rr.json b/mcp/chrome_rr.json
new file mode 100644
index 0000000..6ccd66f
--- /dev/null
+++ b/mcp/chrome_rr.json
@@ -0,0 +1,27 @@
+{
+ "name": "chrome_rr",
+ "description": "Record/Replay management (read-mostly). list: flows + published + schedules + triggers (summaries); get: full flow definition by id or slug; delete: a flow by id (also keeps published/schedules/triggers consistent); runs: recent run history (summarized). Does not start/stop recording and never mutates internal recording state.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "action": {
+ "type": "string",
+ "enum": ["list", "get", "delete", "runs"],
+ "description": "list: summaries of flows/published/schedules/triggers; get: full flow by id/slug; delete: remove a flow by id; runs: recent run history."
+ },
+ "id": {
+ "type": "string",
+ "description": "Flow id. Required for delete; used by get and to filter runs."
+ },
+ "slug": {
+ "type": "string",
+ "description": "Flow slug (alternative to id for action=get)."
+ },
+ "limit": {
+ "type": "number",
+ "description": "action=runs: max number of recent runs to return (default: 20)."
+ }
+ },
+ "required": ["action"]
+ }
+}
diff --git a/mcp/chrome_screenshot.json b/mcp/chrome_screenshot.json
new file mode 100644
index 0000000..57d4d26
--- /dev/null
+++ b/mcp/chrome_screenshot.json
@@ -0,0 +1,50 @@
+{
+ "name": "chrome_screenshot",
+ "description": "[Prefer read_page over taking a screenshot and Prefer chrome_computer] Take a screenshot of the current page or a specific element. For new usage, use chrome_computer with action=\"screenshot\". Use this tool if you need advanced options.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name for the screenshot, if saving as PNG"
+ },
+ "selector": {
+ "type": "string",
+ "description": "CSS selector for element to screenshot"
+ },
+ "tabId": {
+ "type": "number",
+ "description": "Target tab ID to capture from (default: active tab)."
+ },
+ "windowId": {
+ "type": "number",
+ "description": "Target window ID to pick active tab from when tabId is not provided."
+ },
+ "background": {
+ "type": "boolean",
+ "description": "Deprecated and no longer required: simple viewport captures now always use CDP, which targets the tab directly and never brings it to the foreground. This parameter is accepted for compatibility and ignored. Element and full-page capture use the content-script path, which may scroll the page but does not focus the window."
+ },
+ "width": {
+ "type": "number",
+ "description": "Width in pixels (default: 800)"
+ },
+ "height": {
+ "type": "number",
+ "description": "Height in pixels (default: 600)"
+ },
+ "storeBase64": {
+ "type": "boolean",
+ "description": "Return screenshot inline as a base64 data URL (default: false). WARNING: base64 payloads are large and can exceed the tool-result token limit and are not renderable as an image by most MCP clients. Leave this false; use savePng + fullPath and Read the file instead."
+ },
+ "fullPage": {
+ "type": "boolean",
+ "description": "Store screenshot of the entire page (default: true)"
+ },
+ "savePng": {
+ "type": "boolean",
+ "description": "Save screenshot as a PNG file and return its fullPath (default: true). Recommended: keep this true and storeBase64 false, then Read the returned fullPath to view the image \u2014 this avoids blowing the context/token budget with an inline base64 blob."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/chrome_switch_profile.json b/mcp/chrome_switch_profile.json
new file mode 100644
index 0000000..db8a0c3
--- /dev/null
+++ b/mcp/chrome_switch_profile.json
@@ -0,0 +1,14 @@
+{
+ "name": "chrome_switch_profile",
+ "description": "Choose which Chrome profile subsequent browser tool calls act on. Pass the profile's signed-in email (as reported by chrome_list_profiles), or null to reset to the profile this native host is itself bridged to.\n\nOnly profiles with a LIVE bridge can be selected \u2014 that means a Chrome window is currently open in that profile and its extension has connected. A profile that exists on disk but has no open window cannot be selected; the error names the profiles that are currently selectable. Call chrome_list_profiles first to see which those are.\n\nUse this before navigating or reading pages when the work belongs to a specific profile (e.g. keep personal browsing out of a managed corp profile). The selection persists until changed, and resets automatically if the chosen profile's window closes.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "profile": {
+ "type": ["string", "null"],
+ "description": "Signed-in email of the target profile, or null to reset to this host's own profile."
+ }
+ },
+ "required": ["profile"]
+ }
+}
diff --git a/mcp/chrome_switch_tab.json b/mcp/chrome_switch_tab.json
new file mode 100644
index 0000000..f6f65a9
--- /dev/null
+++ b/mcp/chrome_switch_tab.json
@@ -0,0 +1,18 @@
+{
+ "name": "chrome_switch_tab",
+ "description": "Switch to a specific browser tab",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "tabId": {
+ "type": "number",
+ "description": "The ID of the tab to switch to."
+ },
+ "windowId": {
+ "type": "number",
+ "description": "The ID of the window where the tab is located."
+ }
+ },
+ "required": ["tabId"]
+ }
+}
diff --git a/mcp/chrome_tab_groups.json b/mcp/chrome_tab_groups.json
new file mode 100644
index 0000000..5fcad65
--- /dev/null
+++ b/mcp/chrome_tab_groups.json
@@ -0,0 +1,57 @@
+{
+ "name": "chrome_tab_groups",
+ "description": "Manage Chrome tab groups: create a group from tabs, update its title/color/collapsed state, move it, ungroup tabs, or list existing groups.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "action": {
+ "type": "string",
+ "enum": ["create", "update", "ungroup", "list", "move"],
+ "description": "create: group tabIds (optionally into existing groupId); update: set title/color/collapsed on groupId; ungroup: remove tabIds from their group; list: return all groups; move: relocate groupId to windowId/index."
+ },
+ "tabIds": {
+ "type": "array",
+ "items": {
+ "type": "number"
+ },
+ "description": "Tab IDs \u2014 required for action=create and action=ungroup."
+ },
+ "groupId": {
+ "type": "number",
+ "description": "Existing group ID \u2014 required for update/move; optional for create (adds tabs to this group)."
+ },
+ "title": {
+ "type": "string",
+ "description": "Group title (action=create/update)."
+ },
+ "color": {
+ "type": "string",
+ "enum": [
+ "grey",
+ "blue",
+ "red",
+ "yellow",
+ "green",
+ "pink",
+ "purple",
+ "cyan",
+ "orange"
+ ],
+ "description": "Group color (action=create/update)."
+ },
+ "collapsed": {
+ "type": "boolean",
+ "description": "Collapse (true) or expand (false) the group (action=create/update)."
+ },
+ "windowId": {
+ "type": "number",
+ "description": "Target window for action=move, or the window to create the group in."
+ },
+ "index": {
+ "type": "number",
+ "description": "Position for action=move (-1 appends to the end)."
+ }
+ },
+ "required": ["action"]
+ }
+}
diff --git a/mcp/chrome_upload_file.json b/mcp/chrome_upload_file.json
new file mode 100644
index 0000000..f7af1cd
--- /dev/null
+++ b/mcp/chrome_upload_file.json
@@ -0,0 +1,42 @@
+{
+ "name": "chrome_upload_file",
+ "description": "Upload files to web forms with file input elements using Chrome DevTools Protocol",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "tabId": {
+ "type": "number",
+ "description": "Target tab ID (default: active tab)"
+ },
+ "windowId": {
+ "type": "number",
+ "description": "Target window ID to pick active tab when tabId is omitted"
+ },
+ "selector": {
+ "type": "string",
+ "description": "CSS selector for the file input element (input[type=\"file\"])"
+ },
+ "filePath": {
+ "type": "string",
+ "description": "Local file path to upload"
+ },
+ "fileUrl": {
+ "type": "string",
+ "description": "URL to download file from before uploading"
+ },
+ "base64Data": {
+ "type": "string",
+ "description": "Base64 encoded file data to upload"
+ },
+ "fileName": {
+ "type": "string",
+ "description": "Optional filename when using base64 or URL (default: \"uploaded-file\")"
+ },
+ "multiple": {
+ "type": "boolean",
+ "description": "Whether the input accepts multiple files (default: false)"
+ }
+ },
+ "required": ["selector"]
+ }
+}
diff --git a/mcp/chrome_userscripts.json b/mcp/chrome_userscripts.json
new file mode 100644
index 0000000..f46e51f
--- /dev/null
+++ b/mcp/chrome_userscripts.json
@@ -0,0 +1,47 @@
+{
+ "name": "chrome_userscripts",
+ "description": "Manage persisted user scripts (full CRUD). Persists/injects user scripts that run on matching pages; a write is persistent code injection. Actions: list (stored scripts: id/name/matches/enabled; bodies only with includeCode), get (full code by id), set (create/update by id?/name/matches/code/world?/enabled? \u2014 persisted and registered so it activates), delete (by id), enable/disable (toggle by id).",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "action": {
+ "type": "string",
+ "enum": ["list", "get", "set", "delete", "enable", "disable"],
+ "description": "list: stored scripts (no bodies unless includeCode); get: full code by id; set: persistent code injection (create/update); delete: remove by id; enable/disable: toggle by id."
+ },
+ "id": {
+ "type": "string",
+ "description": "Userscript id. Required for get/delete/enable/disable; optional for set (omit to create, provide to update)."
+ },
+ "name": {
+ "type": "string",
+ "description": "Userscript name (action=set)."
+ },
+ "matches": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Match patterns the script applies to (e.g. https://*.example.com/*). action=set; defaults to ."
+ },
+ "code": {
+ "type": "string",
+ "description": "Script source. Required for action=set \u2014 this is persistent code injection that runs on matching pages."
+ },
+ "world": {
+ "type": "string",
+ "enum": ["ISOLATED", "MAIN"],
+ "description": "Execution world for action=set (default: ISOLATED)."
+ },
+ "enabled": {
+ "type": "boolean",
+ "description": "Initial enabled state for action=set (default: true)."
+ },
+ "includeCode": {
+ "type": "boolean",
+ "description": "action=list: include full script bodies (default: false)."
+ }
+ },
+ "required": ["action"]
+ }
+}
diff --git a/mcp/chrome_vector_index.json b/mcp/chrome_vector_index.json
new file mode 100644
index 0000000..f6da72d
--- /dev/null
+++ b/mcp/chrome_vector_index.json
@@ -0,0 +1,15 @@
+{
+ "name": "chrome_vector_index",
+ "description": "Manage the semantic content vector index. stats: entry/doc count, approx size in bytes, model name, lastUpdated (never returns raw vectors); clear: reset the index; rebuild: trigger a re-index (long-running; returns immediately with started:true).",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "action": {
+ "type": "string",
+ "enum": ["stats", "clear", "rebuild"],
+ "description": "stats: summarize the index without raw vectors; clear: reset the index; rebuild: kick off a re-index and return immediately."
+ }
+ },
+ "required": ["action"]
+ }
+}
diff --git a/mcp/get_windows_and_tabs.json b/mcp/get_windows_and_tabs.json
new file mode 100644
index 0000000..e33d85b
--- /dev/null
+++ b/mcp/get_windows_and_tabs.json
@@ -0,0 +1,9 @@
+{
+ "name": "get_windows_and_tabs",
+ "description": "Get all currently open browser windows and tabs",
+ "parameters": {
+ "type": "object",
+ "properties": {},
+ "required": []
+ }
+}
diff --git a/mcp/performance_analyze_insight.json b/mcp/performance_analyze_insight.json
new file mode 100644
index 0000000..b23d006
--- /dev/null
+++ b/mcp/performance_analyze_insight.json
@@ -0,0 +1,18 @@
+{
+ "name": "performance_analyze_insight",
+ "description": "Provides a lightweight summary of the last recorded trace. For deep insights (CWV, breakdowns), integrate native-side DevTools trace engine.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "insightName": {
+ "type": "string",
+ "description": "Optional insight name for future deep analysis (e.g., \"DocumentLatency\"). Currently informational only."
+ },
+ "timeoutMs": {
+ "type": "number",
+ "description": "Timeout for deep analysis via native host (milliseconds). Default 60000. Increase for large traces."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/performance_start_trace.json b/mcp/performance_start_trace.json
new file mode 100644
index 0000000..6cbfee7
--- /dev/null
+++ b/mcp/performance_start_trace.json
@@ -0,0 +1,22 @@
+{
+ "name": "performance_start_trace",
+ "description": "Starts a performance trace recording on the selected page. Optionally reloads the page and/or auto-stops after a short duration.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "reload": {
+ "type": "boolean",
+ "description": "Determines if, once tracing has started, the page should be automatically reloaded (ignore cache)."
+ },
+ "autoStop": {
+ "type": "boolean",
+ "description": "Determines if the trace should be automatically stopped (default false)."
+ },
+ "durationMs": {
+ "type": "number",
+ "description": "Auto-stop duration in milliseconds when autoStop is true (default 5000)."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/performance_stop_trace.json b/mcp/performance_stop_trace.json
new file mode 100644
index 0000000..84f367d
--- /dev/null
+++ b/mcp/performance_stop_trace.json
@@ -0,0 +1,18 @@
+{
+ "name": "performance_stop_trace",
+ "description": "Stops the active performance trace recording on the selected page.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "saveToDownloads": {
+ "type": "boolean",
+ "description": "Whether to save the trace as a JSON file in Downloads (default true)."
+ },
+ "filenamePrefix": {
+ "type": "string",
+ "description": "Optional filename prefix for the downloaded trace JSON."
+ }
+ },
+ "required": []
+ }
+}
diff --git a/mcp/search_tabs_content.json b/mcp/search_tabs_content.json
new file mode 100644
index 0000000..2af9b0c
--- /dev/null
+++ b/mcp/search_tabs_content.json
@@ -0,0 +1,14 @@
+{
+ "name": "search_tabs_content",
+ "description": "Semantic search over the locally-indexed content of visited pages (vector DB). Returns the most relevant pages for a natural-language query. Requires the embedding model to be initialized and pages to have been indexed \u2014 check chrome_vector_index {action:stats} if results are empty.",
+ "parameters": {
+ "type": "object",
+ "properties": {
+ "query": {
+ "type": "string",
+ "description": "Natural-language query to semantically match against indexed page content."
+ }
+ },
+ "required": ["query"]
+ }
+}