FoxMCP

io.github.ThinkerYzuPublished by GitHub account ThinkerYzuv1.7.0Updated Nov 7, 2026

Let your AI assistant use your real, logged-in Firefox: tabs, pages, bookmarks, history.

VerifiedSTDIODesktop onlyBrowser AutomationFiles & Storage

Overview

AI-generated overview

Connects an AI assistant to your own logged-in Firefox to manage tabs, windows, bookmarks, history and page content.

What you can do
  • Discover connected Firefox profiles and list, create, close, focus and arrange windows
  • List, open, close, switch, move, group and ungroup tabs, and capture tab screenshots
  • Navigate tabs to a URL, go back or forward, and reload pages
  • Read page text or HTML, execute JavaScript, run predefined scripts and load local files for uploads
  • List, search, create, update, move and delete bookmarks and folders, and search, list or delete history entries
  • Manage Firefox containers and monitor network requests by URL pattern
When to use it
Use it when the assistant should work inside the browser you already use, with your open tabs, logged-in sites, bookmarks and containers, rather than a fresh disposable browser. Suited to organizing tabs, saving pages, extracting page content, or tidying bookmarks and history.
Requirements
A local Python server started via uvx (Python 3.10+ and uv), plus the matching FoxMCP Firefox extension installed in Firefox. The extension connects over WebSocket port 8765; HTTP mode uses port 3000. Native tab groups need Firefox 139+. Optional FOXMCP_EXT_SCRIPTS points at a directory of predefined scripts.
Before you install
A connected client can reach whatever your real browser session can, including logged-in sites, and can run page scripts; use a trusted client and consider a dedicated Firefox profile. Tools write and delete data: closing tabs or windows may lose unsaved state, and history and bookmark deletions cannot be undone. content_execute_script may require per-tab approval, and local files loaded for upload are readable by the server.

Installation

In SourceWeft

  1. Open FoxMCP in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

[Claude Code prepares Firefox for a FoxMCP meeting by organizing tabs, saving bookmarks, and closing distractions.]

Prepare for a FoxMCP meeting with Claude Code: organize tabs, save the project pages, and clear away distractions.

[FoxMCP fox logo]

FoxMCP — Firefox Browser Automation via MCP

[Glama score]

Connect an MCP-compatible AI assistant to Firefox. Manage tabs and windows, read pages, upload local files, organize bookmarks, search history, and inspect network requests.

FoxMCP has two parts: a Firefox extension and a local Python server. Your AI client talks to the server, which sends commands to the extension.

Privacy: Connected AI clients can access your browser data and run page scripts. Use trusted clients and consider a dedicated Firefox profile. See SECURITY.md for the threat model.

Version 1.7.0 is published on PyPI and GitHub. The 1.7.0 extension update is awaiting Mozilla review; Firefox Add-ons currently serves 1.6.0. See release status.

Upgrading: Update the server and extension together, restart shared workers, and refresh your client's tool schemas. Call profiles_list and pass its integer profile_id to every browser tool, even with one profile connected. Rediscover targets after reconnection. See release notes.

FoxMCP or firefox-devtools-mcp?

Both let an AI agent use Firefox. They suit different jobs.

Use FoxMCP to work in your own browser. It is an extension in the Firefox you already run, so the agent sees your open tabs, logged-in sites, bookmarks, history, and containers. Nothing needs a restart, and several agents can share the same Firefox.

Use firefox-devtools-mcp to test or debug a web page. It starts its own Firefox, so the browser is clean and disposable. It offers console, network, debugger, and profiler tools, and it works with Firefox for Android.

FoxMCPfirefox-devtools-mcp
BrowserThe Firefox you already useIts own instance, started for the agent
Logins and cookiesYoursOnly what its own profile holds
Several agents at onceYes, in one FirefoxOne at a time per Firefox
SetupAdd the extension, then uvx foxmcp --stdionpx @mozilla/firefox-devtools-mcp
Best atTabs, windows, bookmarks, history, containers, several profilesConsole, network, debugger, profiler, Android

firefox-devtools-mcp can also attach to a Firefox that is already running (--connect-existing), but only one started with special remote-control flags. Plain Firefox needs a restart, or a second profile, first.

Sharing Firefox between agents. Start each client with uvx foxmcp --stdio --single-instance so they share one connection. FoxMCP does not lock tabs, so give each agent its own window to keep them from stepping on each other.

Mind the access. In your real session, a connected AI client can reach whatever you can. Use a trusted client, consider a dedicated Firefox profile, and read SECURITY.md.

Quick start

You need Firefox, an MCP client, and uv. Your client starts FoxMCP with uvx foxmcp --stdio; uv manages the Python environment and downloads the package automatically. FoxMCP requires Python 3.10+.

1. Install the Firefox extension

Open FoxMCP on Firefox Add-ons and click Add to Firefox.

Use matching server and extension versions. Click the FoxMCP toolbar icon to see a mismatch warning with both versions inside the popup. No automatic dialog or notification opens. The server also logs a warning. Release-version differences are advisory when protocol IDs match; incompatible protocol IDs prevent the browser connection. Mozilla review can delay the Add-ons version after a GitHub release; to try a version awaiting approval, use the temporary add-on instructions.

2. Connect your AI client

For Claude Code:

bash
claude mcp add foxmcp -- uvx foxmcp --stdio

For Codex:

bash
codex mcp add foxmcp -- uvx foxmcp --stdio

For another MCP client, add a stdio server with command uvx and arguments ["foxmcp", "--stdio"].

Open your AI client so it starts the server. Click the FoxMCP toolbar icon in Firefox and check that it shows a connected status. The extension connects on WebSocket port 8765. If the first browser call arrives before Firefox reconnects, retry it.

For multiple clients or chats, add --single-instance after --stdio to share one browser connection. See stdio setup.

The packaged command includes and enables the example scripts. An explicit FOXMCP_EXT_SCRIPTS overrides them; an empty value disables scripts. To match a particular extension release, use uvx --from foxmcp==VERSION foxmcp --stdio, replacing VERSION with that release's version.

3. Try it

Ask your assistant to discover profiles and choose the intended one before performing browser actions. For example:

text
List the connected Firefox profiles and their windows/tabs.Use the profile named Personal for the following task. If the name is ambiguous,show me the candidates first.List all open Firefox tabs in that profile.Open https://example.org in a new tab.Get the text from the current page.Take a screenshot of the current tab.

To target a particular tab, right-click it in Firefox's tab bar and choose Tab ID = … (click to copy). Paste the copied tab_id = … into your request. Tab IDs are local to their profile. The copied tab ID does not identify its profile; give the assistant that context too. Rediscover after Firefox restarts.

What you can do

AreaCapabilities
ProfilesDiscover connected Firefox profiles and address browser calls explicitly
Tabs and groupsList, open, close, switch, reorder, move between windows, group and ungroup; take screenshots
WindowsCreate, close, focus, resize, position, minimize and maximize
Page contentRead text or HTML, execute JavaScript, run predefined scripts, load local files for uploads
NavigationGo to a URL, go back or forward, reload
BookmarksList, search, create, update, move and delete bookmarks and folders
HistorySearch, list recent visits and delete entries
NetworkMonitor requests by URL pattern; inspect headers and captured text response bodies

Native tab groups require Firefox 139+. Local file uploads use files readable by the Python server; see loading local files. See the API reference for tool names and parameters.

Other setup options

Install from GitHub release archives

The GitHub installers create a local installation directory. On Linux/macOS, you need Python 3.10+, venv, bash, curl, unzip and sha256sum. On Debian/Ubuntu, install missing prerequisites with sudo apt install python3 python3-venv curl unzip coreutils.

For the GitHub archive installation, run this in a new directory where you want FoxMCP installed:

bash
mkdir foxmcp && cd foxmcpcurl -fSL https://github.com/ThinkerYzu/foxmcp/releases/download/v1.7.0/install-from-github.sh | bash

The installer verifies the release archive checksums, creates venv/, installs Python dependencies, and creates start-foxmcp.sh. It also installs example scripts and a CLAUDE.md template, and offers to connect Claude Code.

For unattended setup, save the installer outside the target directory and run bash /path/to/install-from-github.sh --non-interactive from an empty directory.

Windows (PowerShell 5.1 or newer):
Download both installer scripts into a separate folder, then run the installer from an empty installation folder.
An empty folder has no installer yet, and the installer needs install-xpi.ps1 beside it.
Keeping both outside the target also satisfies the unattended installer's empty-folder check.

Use separate commands below: PowerShell 5.1 cannot parse &&, which was added in PowerShell 7.

powershell
New-Item -ItemType Directory foxmcp-installer$installerBase = 'https://github.com/ThinkerYzu/foxmcp/releases/download/v1.7.0'Invoke-WebRequest -UseBasicParsing "$installerBase/install-from-github.ps1" -OutFile foxmcp-installer/install-from-github.ps1Invoke-WebRequest -UseBasicParsing "$installerBase/install-xpi.ps1" -OutFile foxmcp-installer/install-xpi.ps1New-Item -ItemType Directory foxmcpSet-Location foxmcp& ..\foxmcp-installer\install-from-github.ps1 -NonInteractive

Keep the two scripts together and outside the installation folder. If you already have a source checkout, run its scripts/install-from-github.ps1 by absolute path from an empty folder instead. Omit -NonInteractive to enable interactive prompts. The installer creates venv/, installs Python dependencies, creates start-foxmcp.ps1, installs example scripts, and creates a CLAUDE.md template.

Use start-foxmcp.ps1 for a manually started HTTP server. For MCP stdio, configure the client to launch the installed venv\Scripts\python.exe with server\server.py --stdio as arguments, using absolute paths. Set FOXMCP_EXT_SCRIPTS to the installed predefined-scripts directory in the client environment to enable the examples. The PowerShell helper reports the direct Python command if invoked with --stdio.

Start the installed server manually with ./start-foxmcp.sh on Linux/macOS or .\start-foxmcp.ps1 in PowerShell, then use the HTTP setup below.

Run a shared HTTP server

Start one server and leave it running:

bash
uvx foxmcp

With a GitHub archive installation, use its startup script instead. The default ports are 8765 for the extension's WebSocket connection and 3000 for the MCP HTTP endpoint. Check the connected status in the Firefox extension popup.

Register the HTTP endpoint with Claude Code:

bash
claude mcp add --transport http foxmcp http://localhost:3000/mcp/

Or with Codex:

bash
codex mcp add foxmcp --url http://localhost:3000/mcp/

For another MCP client, add an HTTP server with URL http://localhost:3000/mcp/. If the GitHub installer already connected your client, skip registration.

Install from source

You also need Git, make, and zip (on Debian/Ubuntu: sudo apt install git make zip).

bash
git clone https://github.com/ThinkerYzu/foxmcp.gitcd foxmcpmake installmake package

Load the built extension in Firefox, then start the server with make run-server. Continue with HTTP setup above.

Let your client start the server

Use stdio with --single-instance to start the server automatically and share it across chats. Configure each client to launch venv/bin/python server/server.py --stdio --single-instance, using absolute paths. Clients discover and share the browser connection on the extension port. They join an existing server or start a background worker automatically. Closing one chat leaves the others connected. Automatic workers stop after 60 seconds without clients; manually started servers keep running. On Windows, use venv\Scripts\python.exe. See stdio setup.

Configuration

Click the FoxMCP toolbar icon to change extension connection settings. If you change the WebSocket port, change it on both the extension and the server. Host/Port and Reconnect Interval save automatically after a 500ms pause. Reset persists defaults immediately. Retries use a constant interval (1000ms by default, configurable from 100 to 30000ms); there is no manual Reconnect button. Both Popup and Options show actual connection and protocol status. See extension configuration.

With uvx, pass server options after foxmcp:

bash
# Custom WebSocket and MCP HTTP portsuvx foxmcp --port 9000 --mcp-port 4000
# Hide tool groups from clientsuvx foxmcp --disable-tools bookmarks,history
# Hide a group but keep its screenshot tooluvx foxmcp --disable-tools tabs --enable-tools tabs_capture_screenshot

For a client-managed stdio server, include the same options in its launch command, for example:

bash
uvx foxmcp --stdio --single-instance --disable-tools bookmarks,history

For a GitHub archive or source installation, the same options follow venv/bin/python server/server.py. Run from that installation directory:

bash
venv/bin/python server/server.py --port 9000 --mcp-port 4000

Use profiles_list first to inspect all connected Firefox profiles, their real names, windows and tabs. Every browser command requires the chosen profile_id alongside its window/tab IDs. Profiles can share the same server port without replacing each other. The server assigns positive integer IDs from 1. IDs change on every reconnect; rediscover after a disconnect or server restart. Update both extension and server for protocol 3. Follow the multiple-profile setup to connect each Firefox instance, then use profile discovery to choose a target.

All 46 tools are enabled by default. Available groups are profiles, windows, tabs, containers, bookmarks, navigation, content, requests, history, and debug. See configuration for client examples and other options.

Firefox containers

Use containers_list to discover named containers and their opaque cookie_store_id values. Pass one to tabs_create to open in that container, or to tabs_list to filter. Use firefox-default for normal browsing. Omission keeps existing behavior; invalid selections fail without opening a fallback tab.

containers_create, containers_update and containers_remove manage persistent profile containers. Removal clears stored site data and refuses containers with open tabs. Containers survive client disconnects. See the API reference for details.

The extension requires contextualIdentities and cookies permissions for container APIs and tab selection. Installation can enable Firefox containers; subsequent disabling is respected. Update both extension and server together.

Predefined scripts

External executable scripts can generate JavaScript for FoxMCP to run in a tab. The release installer configures the examples in predefined-scripts/; the packaged foxmcp command uses its bundled examples by default. Both include DOM summaries, YouTube controls, calendar extraction, and a file-input helper. Ask your assistant which predefined scripts are available.

For your own scripts, set FOXMCP_EXT_SCRIPTS to their directory before starting the server. For example, save this as get-title.sh in that directory and run chmod +x get-title.sh:

bash
#!/bin/bash# Return the current page title.echo 'document.title'

Then ask your assistant to run get-title.sh in a tab. Restart the server after adding scripts to refresh the list shown to clients. See the script guide for arguments, setup, and file upload examples.

Troubleshooting

ProblemCheck
Extension disconnectedStart the server and check the host/port in the FoxMCP popup. curl -i http://localhost:8765 should return 426 Upgrade Required.
MCP client cannot connectCheck its URL. curl -i http://localhost:3000/mcp/ should return a 307 redirect when using HTTP mode.
Server logs “address already in use”Another service owns a port. FoxMCP can keep running even when its MCP listener fails; use different ports and check both listeners.
Server reports missing Python packagesUse venv/bin/python, or the provided startup script.
Built extension will not installFollow the Firefox channel and signing guidance.

For other errors, run the server in the foreground and inspect its output.

Documentation and development

See CONTRIBUTING.md for contribution and test setup guidelines.

Coding agents: Read CLAUDE.md before making changes.

Licensed under the MIT License.

Source: README.md at commit 170ca3f

Tools

46

profiles_list

Discover connected Firefox profiles, their real names and windows. Use this first to choose a profile_id for browser commands, and again after a disconnect or server restart: IDs change on every reconnect. Window, tab, group, container and monitor IDs belong to that profile only. With populate=True, inspect tab titles/URLs to choose a target; False omits tabs. Use list_windows for windows in one known profile. Read-only; does not switch profiles or focus windows. Names may repeat or be unavailable; per-profile window errors are reported separately.

Parameterspopulate

list_windows

List all browser windows profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterspopulateprofile_idrequired

get_window

Get information about a specific window profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterspopulatewindow_idrequiredprofile_idrequired

get_current_window

Read this profile's current (most recently focused) Firefox window. Does not focus or change the window. Use get_window for a known window_id, or list_windows to inspect all windows in this profile. populate controls whether the result includes the window's tabs. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterspopulateprofile_idrequired

create_window

Create a new browser window profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterstopurlleftstatewidthheightfocusedincognitoprofile_idrequiredwindow_type

close_window

Close a browser window profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterswindow_idrequiredprofile_idrequired

focus_window

Bring a window to front and focus it profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterswindow_idrequiredprofile_idrequired

update_window

Update window properties profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterstopleftstatewidthheightfocusedwindow_idrequiredprofile_idrequired

tabs_list

List open browser tabs, optionally filtered by window and cookie store Each line includes "[window {id}, index {n}] [cookie store {cookie_store_id}]", and carries "(active)" for the active tab of its window and "(pinned)" for a pinned one. The window, the index and the pinned mark are what tabs_move needs: the window to move a tab out of or into, the position it currently holds, and whether a leading run of pinned tabs blocks the low indexes. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterswindow_idprofile_idrequiredcookie_store_id

tabs_create

Create a new browser tab profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersurlrequiredactivepinnedwindow_idprofile_idrequiredcookie_store_id

tabs_close

Close one browser tab, removing its live page and possibly unsaved state. Use tabs_list to identify the tab first. Use tabs_switch to select a tab without closing it, or close_window to close an entire window. Closing the last tab may close its window. There is no FoxMCP tool to restore a closed tab; an invalid or already closed tab ID fails. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterstab_idrequiredprofile_idrequired

tabs_switch

Switch to a specific browser tab profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterstab_idrequiredprofile_idrequired

tabs_group

Group existing tabs, optionally setting the group's title and colour Never activates a tab or focuses a window. Requires Firefox 139+. Omit group_id to create a group in the first tab's window, which moves tabs from other windows into it; pass a group_id from tabs_groups_query to add tabs to that group instead. Firefox unpins a pinned tab before grouping it, and refuses to mix private and non-private tabs. Grouping and styling are separate steps in Firefox. If the tabs were grouped but the title or colour could not be set, the result still names the group, and tabs_groups_update can retry the styling. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterscolortitletab_idsrequiredgroup_idprofile_idrequired

tabs_ungroup

Remove tabs from their tab group Never activates a tab or focuses a window. Requires Firefox 138+. Firefox deletes a group once its last tab leaves it. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterstab_idsrequiredprofile_idrequired

tabs_groups_update

Change a tab group's title, colour or collapsed state Leaves the group's tabs where they are. Requires Firefox 139+. Give at least one of title, color or collapsed. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterscolortitlegroup_idrequiredcollapsedprofile_idrequired

tabs_groups_query

List tab groups with their IDs, in every window or filtered Requires Firefox 139+. tabs_group reports a group's ID only when it creates the group, so this is how to find the ID of any other group. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterscolortitlecollapsedwindow_idprofile_idrequired

tabs_move

Move tabs to a new position, optionally into another window Reorders tabs within their window, or gathers them into a different window — to collect every tab for one site into a window of its own, create the window with create_window and pass its ID here. Succeeding partially is normal, so check the result: it reads "Moved {n} of {m}", and a tab missing from the list did not move. Firefox declines some moves without raising an error, and the common one is that **an unpinned tab cannot be placed in front of a pinned tab** — with 3 pinned tabs, the lowest index an unpinned tab can reach is 3, and asking for 0, 1 or 2 moves nothing. Use tabs_list to see which tabs are pinned and what index each tab currently holds. A pinned tab can be moved to index 0 freely. Moving between windows requires both to be normal windows, not popups, and either both private or both non-private. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersindextab_idsrequiredwindow_idprofile_idrequired

tabs_capture_screenshot

Capture a screenshot of the visible tab, or of the tab given by tab_id What comes back depends on whether you pass a filename: with one, the image is written to disk and you get a success message and the path; without one, you get the image inline as a base64 data URL, which for a full window is large. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersformattab_idqualityfilenamewindow_idprofile_idrequired

containers_list

List Firefox containers as JSON with opaque cookie_store_id, name, color and icon; default_cookie_store_id identifies normal browsing separately. IDs belong to the connected profile. Names may repeat. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersprofile_idrequired

containers_create

Create a persistent Firefox container. Return JSON container metadata. Duplicate names are permitted. Firefox validates color and icon. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersiconnamerequiredcolorprofile_idrequired

containers_update

Update a named Firefox container, preserving its ID and omitted properties. Supply at least one of name, color or icon. Return JSON container metadata. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersiconnamecolorprofile_idrequiredcookie_store_idrequired

containers_remove

Remove a named Firefox container and its stored site data. Refuses open tabs with CONTAINER_IN_USE and tab_ids. Close tabs explicitly first. The check cannot exclude races with browser UI. No automatic cleanup. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersprofile_idrequiredcookie_store_idrequired

history_query

Search browser history profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersqueryrequiredend_timeprofile_idrequiredstart_timemax_results

history_get_recent

Get recent browser history profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterscountprofile_idrequired

history_delete_item

Delete all history visits for one exact URL in this profile. Use history_query to find the URL first. This removes history records, not the open tab, bookmarks or cookies, and FoxMCP has no history restore tool. Use tabs_close if the goal is to close a page instead. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersurlrequiredprofile_idrequired

bookmarks_list

List browser bookmarks Folders are marked 📁 and bookmarks 🔖. Every line carries its own ID, its parent folder's ID and its index, its position within that folder counting from 0. The IDs are what bookmarks_update, bookmarks_delete, bookmarks_move and the parent_id of bookmarks_create take, so this listing is how you find them. With folder_id, the lines are that folder's direct children in order. Without it, the whole tree is listed and a folder's children are interleaved with everything nested under them, so read positions from Index, not line order. An empty folder returns "No bookmarks found". profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersfolder_idprofile_idrequired

bookmarks_create

Create a new bookmark profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersurlrequiredtitlerequiredparent_idprofile_idrequired

bookmarks_create_folder

Create a new bookmark folder profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterstitlerequiredparent_idprofile_idrequired

bookmarks_update

Update a bookmark or folder's title and/or URL profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersurltitleprofile_idrequiredbookmark_idrequired

bookmarks_move

Move a bookmark or folder into another folder, or to another position The bookmark keeps its ID, unlike deleting and recreating it. A folder moves with everything in it. Give at least one of parent_id and index. Use bookmarks_list to find IDs and the current index of each entry. Firefox refuses to move the hidden bookmark root, or a folder into itself or one of its own subfolders. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersindexparent_idprofile_idrequiredbookmark_idrequired

bookmarks_delete

Delete a bookmark profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersprofile_idrequiredbookmark_idrequired

navigation_back

Navigate back in browser history for a tab profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersparamsrequiredprofile_idrequired

navigation_forward

Navigate forward in browser history for a tab profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersparamsrequiredprofile_idrequired

navigation_reload

Reload a page in a tab Use this to refresh the tab's current URL; use navigation_go_to_url to choose a different URL. Reloading may discard unsaved page state and triggers new network requests. bypass_cache requests a fresh load. Returns as soon as the reload is issued, not when the page has finished loading. Code that watches for what the reload does - a request monitor, a content read - has to wait for the page itself. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterstab_idrequiredprofile_idrequiredbypass_cache

navigation_go_to_url

Navigate to a specific URL in a tab profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersurlrequiredtab_idrequiredprofile_idrequired

content_load_file

Load a server-local file for website uploads/imports; does not submit it. Waits for downloading to finish, then returns JSON with file_id and metadata. In the SAME tab, use content_execute_script or a predefined script: const file = globalThis.foxmcpFiles.get(file_id); For file inputs, use cloneInto(file, window), the page's window.wrappedJSObject.DataTransfer, and input/change events. Return metadata, not the File. Release: globalThis.foxmcpFiles.delete(file_id). Handle expires five minutes after loading or on navigation; assigned inputs remain valid. Download timeout: 110s. Private tabs unsupported. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterspathrequiredtab_idrequiredmime_typeprofile_idrequired

content_get_text

Read the current page body's rendered text (document.body.innerText). Use this for readable page content, or content_get_html for markup. Reads the main document without changing it; does not include iframe documents or wait for future lazy-loaded content. Restricted Firefox pages that block content scripts cannot be read. max_length slices the extracted text by character count and adds an ellipsis when truncated; omission returns all extracted text. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterstab_idrequiredmax_lengthprofile_idrequired

content_get_html

Read the main document's current HTML, limited to 2,000 characters. Use this for markup, or content_get_text for rendered text. Reads document.documentElement.outerHTML without changing the page; adds an ellipsis if truncated. Does not include iframe documents. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterstab_idrequiredprofile_idrequired

content_execute_script

Execute JavaScript code in a tab An optional extension setting requires user approval per tab/origin. Each approval prompt expires after 60 seconds; queued tabs wait in turn. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterscoderequiredtab_idrequiredprofile_idrequired

content_execute_predefined

Execute a predefined external script and run its JavaScript output in a tab Generated JavaScript obeys the extension's per-tab/origin script consent. Each approval prompt expires after 60 seconds; queued tabs wait in turn. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile. Available scripts: - dom-summarize.sh [onscreen [withpos]]: List the page's visible interactive elements as an indented tree, tagging each with a persistent dsid attribute to select it by later - gcal-cal-event-js.sh "Event Title" day time: In a Google Calendar tab, return one event's details (time, meeting links, attendees, attachments) as JSON - gcal-daily-events-js.sh day [month] [year]: In a Google Calendar tab, return one day's events in time order with RSVP status, as JSON - gcal-monthly-events-js.sh: In a Google Calendar month view, return every event grouped by day, with per-day counts, as JSON - set-file-input.py [file_id, CSS selector]: Assign a file loaded by content_load_file to a page's file input and release its handle - youtube-play-pause.sh [play|pause|toggle]: In a YouTube tab, play, pause or toggle the video and report its state; toggles by default

Parameterstab_idrequiredprofile_idrequiredscript_argsscript_namerequired

requests_start_monitoring

Start capturing future web requests matching URL patterns in a profile. Start before triggering navigation or other traffic. Each call starts a monitor; use requests_list_captured to read an existing one instead. Keep the returned monitor_id for requests_list_captured, requests_get_content and requests_stop_monitoring; monitors cannot be listed. Omit tab_id to capture matching traffic across this profile. Capturing uses memory. Stop when finished; summaries remain readable until the profile disconnects, but only the latest 200 response bodies across all monitors are kept. Client disconnection stops its monitors; profile disconnection clears monitors and captured data. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parameterstab_idoptionsprofile_idrequiredurl_patternsrequired

requests_stop_monitoring

Stop one monitor immediately and return its capture totals. Use the monitor_id returned by requests_start_monitoring when no more traffic needs capturing. drain_timeout is ignored: this does not wait for in-flight requests. Already captured records remain available to requests_list_captured and requests_get_content until the profile disconnects, subject to the response-body limit. An unknown monitor_id returns a "not found" error. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersmonitor_idrequiredprofile_idrequireddrain_timeout

requests_list_captured

List all captured request summaries from a monitoring session A request appears here once it has completed, so a page navigation started a moment ago will not be in the list yet. Start with requests_start_monitoring, then reuse its monitor_id here. This reads stored summaries without starting or stopping capture. Use a returned request_id with requests_get_content to inspect its stored body. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersmonitor_idrequiredprofile_idrequired

requests_get_content

Read a captured request's stored metadata and text body. Use monitor_id from requests_start_monitoring and request_id from requests_list_captured. This reads captured data, without making a new network request. Bodies can be truncated by the monitor's max_body_size option. The response carries **response_body.included** and **note**: a body that was not text, or not one of the monitored content types, comes back with `content: null` and its size filled in. `request_headers` is always empty. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile.

Parametersmonitor_idrequiredprofile_idrequiredrequest_idrequiredinclude_binarysave_request_body_tosave_response_body_to

debug_websocket_status

Read the server's connected Firefox profile IDs and names. Use this for a quick connection check, including when no extension is connected. It reads server connection state without changing browser state or reconnecting anything. Use profiles_list for windows/tabs and target discovery before browser commands.

Takes no parameters.

Version history

1
  1. v1.7.0LatestNov 7, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts