FoxMCP

io.github.ThinkerYzu由 GitHub 账号 ThinkerYzu 发布v1.7.0更新于 Nov 7, 2026

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

已验证STDIO仅桌面浏览器自动化文件与存储

概览

AI 生成的概览

把 AI 助手连接到你自己已登录的 Firefox,用于管理标签页、窗口、书签、历史记录和页面内容。

可以做什么
  • 发现已连接的 Firefox 配置文件,并列出、新建、关闭、聚焦和调整窗口
  • 列出、打开、关闭、切换、移动、分组和取消分组标签页,并可截取标签页截图
  • 让标签页跳转到指定网址、前进、后退和重新加载页面
  • 读取页面文本或 HTML、执行 JavaScript、运行预定义脚本,并加载本地文件用于上传
  • 列出、搜索、新建、修改、移动和删除书签与文件夹,搜索、列出或删除历史记录
  • 管理 Firefox 容器,并按网址模式监控网络请求
适用场景
适合让助手直接在你日常使用的浏览器里工作,使用你已打开的标签页、已登录的网站、书签和容器,而不是另开一个干净的浏览器。可用于整理标签页、保存页面、提取页面内容,或清理书签与历史记录。
运行要求
需要本地 Python 服务器(通过 uvx 启动,需 Python 3.10+ 和 uv),并在 Firefox 中安装版本匹配的 FoxMCP 扩展。扩展通过 WebSocket 端口 8765 连接,HTTP 模式使用端口 3000。原生标签页分组需要 Firefox 139+。可选环境变量 FOXMCP_EXT_SCRIPTS 指向预定义脚本目录。
安装前请注意
已连接的客户端能访问你真实浏览器会话中的一切,包括已登录的网站,并可执行页面脚本;请使用可信客户端,并考虑专用 Firefox 配置文件。工具会写入和删除数据:关闭标签页或窗口可能丢失未保存内容,历史记录和书签删除无法撤销。content_execute_script 可能需要按标签页逐次批准,为上传而加载的本地文件对服务器可读。

安装

在 SourceWeft 中

  1. 打开 控制台中的 FoxMCP,将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

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.

来源:README.md,提交 170ca3f

工具

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.

输入参数populate

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.

输入参数populateprofile_id必填

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.

输入参数populatewindow_id必填profile_id必填

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.

输入参数populateprofile_id必填

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.

输入参数topurlleftstatewidthheightfocusedincognitoprofile_id必填window_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.

输入参数window_id必填profile_id必填

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.

输入参数window_id必填profile_id必填

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.

输入参数topleftstatewidthheightfocusedwindow_id必填profile_id必填

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.

输入参数window_idprofile_id必填cookie_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.

输入参数url必填activepinnedwindow_idprofile_id必填cookie_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.

输入参数tab_id必填profile_id必填

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.

输入参数tab_id必填profile_id必填

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.

输入参数colortitletab_ids必填group_idprofile_id必填

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.

输入参数tab_ids必填profile_id必填

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.

输入参数colortitlegroup_id必填collapsedprofile_id必填

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.

输入参数colortitlecollapsedwindow_idprofile_id必填

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.

输入参数indextab_ids必填window_idprofile_id必填

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.

输入参数formattab_idqualityfilenamewindow_idprofile_id必填

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.

输入参数profile_id必填

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.

输入参数iconname必填colorprofile_id必填

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.

输入参数iconnamecolorprofile_id必填cookie_store_id必填

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.

输入参数profile_id必填cookie_store_id必填

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.

输入参数query必填end_timeprofile_id必填start_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.

输入参数countprofile_id必填

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.

输入参数url必填profile_id必填

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.

输入参数folder_idprofile_id必填

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.

输入参数url必填title必填parent_idprofile_id必填

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.

输入参数title必填parent_idprofile_id必填

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.

输入参数urltitleprofile_id必填bookmark_id必填

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.

输入参数indexparent_idprofile_id必填bookmark_id必填

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.

输入参数profile_id必填bookmark_id必填

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.

输入参数params必填profile_id必填

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.

输入参数params必填profile_id必填

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.

输入参数tab_id必填profile_id必填bypass_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.

输入参数url必填tab_id必填profile_id必填

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.

输入参数path必填tab_id必填mime_typeprofile_id必填

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.

输入参数tab_id必填max_lengthprofile_id必填

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.

输入参数tab_id必填profile_id必填

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.

输入参数code必填tab_id必填profile_id必填

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

输入参数tab_id必填profile_id必填script_argsscript_name必填

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.

输入参数tab_idoptionsprofile_id必填url_patterns必填

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.

输入参数monitor_id必填profile_id必填drain_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.

输入参数monitor_id必填profile_id必填

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.

输入参数monitor_id必填profile_id必填request_id必填include_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.

无需输入参数。

版本历史

1
  1. v1.7.0最新Nov 7, 2026

评分

已满足适用检查项的 90%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分
  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分