Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
FOXMCP_EXT_SCRIPTSNoDirectory 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

CapabilityDetails
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

NameDescription
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:

  • 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

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 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.

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.7/5.0

Scored across 46 tools

Disambiguation4/5

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.

Naming Consistency3/5

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.

Tool Count2/5

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.

Completeness4/5

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.

Maintenance

ActivityActive
ResponsivenessSyncing