arc-control-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ARC_MCP_LABEL | No | Names this agent's tab ownership. Two agents with different labels never see each other's owned tabs. | default |
| ARC_MCP_SPACE | No | The Arc space new tabs open into, when a space with that name exists. | Agent |
| ARC_MCP_STATE_DIR | No | Where tab ownership is recorded, so a restarted agent can clean up the tabs its previous run left behind. | ~/Library/Application Support/arc-control-mcp |
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 | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_tabsA | List Arc tabs. Rows are flagged 'mine' for tabs this agent opened and 'isActive' for the tab the user is on. Defaults to every tab; pass scope 'own' to narrow. |
| get_current_tabA | Get the tab a call with no tab_id would act on: this agent's current tab, or the active tab if it has none. |
| switch_to_tabA | Make a tab the active tab in its window. Changes what the user sees, so prefer reading a tab by id when you only need its content. |
| close_tabA | Close one tab. With no tab_id this closes whatever a bare call resolves to, which is this agent's current tab or, if it has none yet, the tab the user is actively looking at. Pass an explicit tab_id from list_tabs unless you are certain. Closing cannot be undone and tab ids are not reused. To clean up after yourself, prefer close_own_tabs. |
| close_own_tabsA | Close every tab this agent opened, leaving the user's tabs alone. Tabs leaked by a previous run of this label are left alone too unless include_stale is set. |
| arc_statusA | Report Arc state: which tabs this agent owns, whether the agent space exists, what a call with no tab_id resolves to, and how many tabs a previous run of this label left behind. |
| open_urlA | Open a URL in Arc. Launches Arc if needed. New tabs go into the agent space when one exists, otherwise the main window. Arc auto-selects new tabs, so the previous selection is put back unless you pass activate. |
| go_backA | Navigate a tab back in history. Goes through the page, so it works on a background tab, which Arc's own back command does not, and the result is checked against the tab url rather than assumed. |
| go_forwardA | Navigate a tab forward in history. Goes through the page and confirms the tab really moved before reporting success. |
| reload_tabA | Reload a tab, then confirm the document really was replaced rather than assume it. Works on a background tab. Takes wait_until_loaded and timeout_ms like the other navigating tools, and returns from, to and the tab. Fails with ok false when the tab is still showing the document that was there before, which is what a slow server or a page holding on to unload looks like from outside. |
| wait_for_loadA | Poll until a tab has finished loading and the document is ready. Use after an action that triggers navigation. |
| get_page_contentA | Get the visible text of a page, or of every element matching a selector joined with blank lines. Always reports "matched", so a partial answer is never silent. Nested matches repeat their text, so prefer a leaf-ish selector. |
| get_htmlA | Get the HTML of a page or element. Use when you need markup, attributes or structure rather than text. Returns one element only: it reports how many matched and takes nth to pick a different one. |
| query_elementsA | Find elements and return structured details: text, value, href, visibility, disabled state and attributes. The main way to see what is on a page before acting on it. "text=" matching is substring, with exact matches ranked first; pass exact to require an exact match. |
| get_linksA | List links on the page with their text and resolved href. Pass unique to collapse repeated href and text pairs, which navigation and footers produce in bulk. |
| get_page_infoA | Page overview: title, url, ready state, meta description, headings, form and frame counts. Cheap orientation before deciding what to do. |
| clickA | Click an element. Accepts a CSS selector or "text=Label". Scrolls it into view and dispatches a real pointer sequence, so framework handlers fire. "text=Label" matches on visible text as a substring, with exact matches ranked first, so a short label also matches longer ones. Check the returned "matches" count, and pass exact when it is above 1. Returns urlBefore, the url as it was immediately before the click: the tab snapshot can be taken before a navigation settles, so follow with wait_for_load when the click navigates. |
| fillA | Set the value of an input, textarea or contenteditable. Uses the native setter and fires input and change, so React and similar frameworks register it. Fails with an error naming the tag when the target cannot be filled: a heading or other non-input, a disabled or readonly field, or a (use select_option for those). "text=Label" matches on visible text as a substring, with exact matches ranked first, so a short label also matches longer ones. Check the returned "matches" count, and pass exact when it is above 1. |
| select_optionA | Choose an option in a select element, by exact option value or exact visible label. When nothing matches, the failure lists the options that do exist, so the next call can pick a real one. |
| press_keyA | Dispatch a key press to an element, or to the focused element when no selector is given. Handles named keys (Enter, Escape, Tab, ArrowDown) and single printable characters. Returns only a minimal identity for the element that received the key (tag plus whichever of id, name, type and aria-label exist); use query_elements when you need the full picture. |
| scrollA | Scroll the page, or scroll an element into view. Page scrolls report scrollY, pageHeight and viewport, so you can tell how much is left. |
| wait_for_selectorA | Poll until an element appears, becomes visible, or disappears. Use after a click that loads content. On timeout it says so explicitly with waitedMs and the last counts, and a broken selector or page error fails straight away instead of burning the whole timeout. The visible state ignores screen-reader clipping (boxes under 2x2 px, inset clip-path), which nothing can actually click. |
| list_spacesA | List Arc spaces in the front window, with tab counts and which is active. Tabs pinned to the top of the sidebar (location topApp) belong to no space, so the reported tabsInSpaces plus topAppCount is what reconciles with totalTabs. Counts cover the front window only, while list_tabs covers every window. |
| focus_spaceA | Switch the front Arc window to a space. This changes what the user sees, so it is rarely needed: tabs in an unfocused space are still fully readable and scriptable. |
| execute_javascriptA | Run JavaScript in a tab and return the result. A bare expression, or a statement body that uses return, both work. The helper library is available as A (A.all, A.one, A.click, A.setValue, A.describe, A.visible). |
| batchA | Run several tools in order in one call, passing the same tab through. Stops at the first failure unless continue_on_error is set. Use this to cut round trips: fill, fill, click, wait. Results are capped at 60000 characters across all steps: past that the batch stops early and reports truncated, so pass max_chars to reading steps or split a read-heavy sequence across calls. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/DB-25/arc-control-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server