FoxMCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FOXMCP_EXT_SCRIPTS | No | Directory containing external executable scripts for FoxMCP to run in a tab. The packaged command includes and enables the bundled example scripts by default; an explicit FOXMCP_EXT_SCRIPTS value overrides them, and an empty value disables scripts. Set before starting the server. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| profiles_listA | 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. |
| list_windowsA | 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. |
| get_windowA | 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. |
| get_current_windowA | 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. |
| create_windowA | 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. |
| close_windowA | 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. |
| focus_windowA | 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. |
| update_windowA | 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. |
| tabs_listA | 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. |
| tabs_createA | 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. |
| tabs_closeA | 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. |
| tabs_switchA | 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. |
| tabs_groupA | 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. |
| tabs_ungroupA | 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. |
| tabs_groups_updateA | 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. |
| tabs_groups_queryA | 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. |
| tabs_moveA | 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. |
| tabs_capture_screenshotA | 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. |
| containers_listA | 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. |
| containers_createA | 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. |
| containers_updateA | 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. |
| containers_removeA | 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. |
| history_queryA | 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. |
| history_get_recentA | 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. |
| history_delete_itemA | 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. |
| bookmarks_listA | 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. |
| bookmarks_searchA | Search browser bookmarks by title or URL Matches bookmarks only — folders are never returned, so a folder cannot be found this way; use bookmarks_list to walk the tree instead. Each result carries its own ID and its parent folder's ID, which is what bookmarks_update and bookmarks_delete take. No matches 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. |
| bookmarks_createA | 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. |
| bookmarks_create_folderA | 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. |
| bookmarks_updateA | 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. |
| bookmarks_moveA | 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. |
| bookmarks_deleteA | 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. |
| navigation_backA | 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. |
| navigation_forwardA | 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. |
| navigation_reloadA | 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. |
| navigation_go_to_urlA | 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. |
| content_load_fileA | 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. |
| content_get_textA | 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. |
| content_get_htmlA | 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. |
| content_execute_scriptA | 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. |
| content_execute_predefinedA | 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:
|
| requests_start_monitoringA | 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; stored captures remain readable until the profile disconnects. 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. |
| requests_stop_monitoringA | 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. An unknown monitor_id fails with MONITOR_NOT_FOUND. profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile. |
| requests_list_capturedA | 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. |
| requests_get_contentA | 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
profile_id is required: obtain it from profiles_list. All object IDs are local to that profile; never reuse them in another profile. |
| debug_websocket_statusA | 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 46 tools
Tools are grouped by browser resource and mostly target clear, distinct operations. The main overlaps are profiles_list vs debug_websocket_status for connection/profile discovery and content_execute_script vs content_execute_predefined for JavaScript execution, but the descriptions make these separable with care.
Most domains use resource_action names such as tabs_list, bookmarks_create, navigation_reload, and containers_update. However, the window cluster reverses the convention to verb_noun names like list_windows, get_window, and create_window, so the overall set mixes two readable but inconsistent patterns.
At 46 tools, the surface is very large and exceeds the typical well-scoped range. The breadth reflects full browser automation, but several granular tab, window, and bookmark operations could be consolidated to reduce selection burden.
Coverage spans profiles, windows, tabs and tab groups, bookmarks, history, containers, navigation, content access, screenshots, and request capture, which is substantial for a browser automation server. Minor gaps exist around pinning/unpinning tabs and explicit bookmark-folder deletion, but core lifecycle workflows are present.