Browser Use
Browser agents and stealth cloud browsers for AI: run web tasks, fill forms, extract data.
제작자가 쓴 설명(영어 원문)
Arc browser MCP for macOS: agent window, snapshots, DevTools input, guardrails
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
ARC_MCP_LABEL, ARC_MCP_SPACE, ARC_MCP_STATE_DIR, ARC_MCP_WINDOW, ARC_MCP_WINDOW_PLACEMENT, ARC_MCP_IDLE_MS, ARC_MCP_IDLE_WAIT_MS, ARC_MCP_ARC_DATA_DIR, ARC_MCP_ALLOW_HISTORY, ARC_MCP_CDP, ARC_MCP_CDP_PORT, ARC_MCP_ALLOWED_ORIGINS, ARC_MCP_BLOCKED_ORIGINS, ARC_MCP_BLOCK_READS, ARC_MCP_READ_ONLY, ARC_MCP_AUDIT_LOG필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"arc-control": {
"command": "npx",
"args": [
"-y",
"arc-control-mcp"
],
"env": {
"ARC_MCP_LABEL": "your-value",
"ARC_MCP_SPACE": "your-value",
"ARC_MCP_STATE_DIR": "your-value",
"ARC_MCP_WINDOW": "your-value",
"ARC_MCP_WINDOW_PLACEMENT": "your-value",
"ARC_MCP_IDLE_MS": "your-value",
"ARC_MCP_IDLE_WAIT_MS": "your-value",
"ARC_MCP_ARC_DATA_DIR": "your-value",
"ARC_MCP_ALLOW_HISTORY": "your-value",
"ARC_MCP_CDP": "your-value",
"ARC_MCP_CDP_PORT": "your-value",
"ARC_MCP_ALLOWED_ORIGINS": "your-value",
"ARC_MCP_BLOCKED_ORIGINS": "your-value",
"ARC_MCP_BLOCK_READS": "your-value",
"ARC_MCP_READ_ONLY": "your-value",
"ARC_MCP_AUDIT_LOG": "your-value"
}
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add arc-control --env ARC_MCP_LABEL=your-value --env ARC_MCP_SPACE=your-value --env ARC_MCP_STATE_DIR=your-value --env ARC_MCP_WINDOW=your-value --env ARC_MCP_WINDOW_PLACEMENT=your-value --env ARC_MCP_IDLE_MS=your-value --env ARC_MCP_IDLE_WAIT_MS=your-value --env ARC_MCP_ARC_DATA_DIR=your-value --env ARC_MCP_ALLOW_HISTORY=your-value --env ARC_MCP_CDP=your-value --env ARC_MCP_CDP_PORT=your-value --env ARC_MCP_ALLOWED_ORIGINS=your-value --env ARC_MCP_BLOCKED_ORIGINS=your-value --env ARC_MCP_BLOCK_READS=your-value --env ARC_MCP_READ_ONLY=your-value --env ARC_MCP_AUDIT_LOG=your-value -- npx -y arc-control-mcp실행하기 전에 빈 값을 채워 주세요.
프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"arc-control": {
"command": "npx",
"args": [
"-y",
"arc-control-mcp"
],
"env": {
"ARC_MCP_LABEL": "your-value",
"ARC_MCP_SPACE": "your-value",
"ARC_MCP_STATE_DIR": "your-value",
"ARC_MCP_WINDOW": "your-value",
"ARC_MCP_WINDOW_PLACEMENT": "your-value",
"ARC_MCP_IDLE_MS": "your-value",
"ARC_MCP_IDLE_WAIT_MS": "your-value",
"ARC_MCP_ARC_DATA_DIR": "your-value",
"ARC_MCP_ALLOW_HISTORY": "your-value",
"ARC_MCP_CDP": "your-value",
"ARC_MCP_CDP_PORT": "your-value",
"ARC_MCP_ALLOWED_ORIGINS": "your-value",
"ARC_MCP_BLOCKED_ORIGINS": "your-value",
"ARC_MCP_BLOCK_READS": "your-value",
"ARC_MCP_READ_ONLY": "your-value",
"ARC_MCP_AUDIT_LOG": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"arc-control": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"arc-control-mcp"
],
"env": {
"ARC_MCP_LABEL": "your-value",
"ARC_MCP_SPACE": "your-value",
"ARC_MCP_STATE_DIR": "your-value",
"ARC_MCP_WINDOW": "your-value",
"ARC_MCP_WINDOW_PLACEMENT": "your-value",
"ARC_MCP_IDLE_MS": "your-value",
"ARC_MCP_IDLE_WAIT_MS": "your-value",
"ARC_MCP_ARC_DATA_DIR": "your-value",
"ARC_MCP_ALLOW_HISTORY": "your-value",
"ARC_MCP_CDP": "your-value",
"ARC_MCP_CDP_PORT": "your-value",
"ARC_MCP_ALLOWED_ORIGINS": "your-value",
"ARC_MCP_BLOCKED_ORIGINS": "your-value",
"ARC_MCP_BLOCK_READS": "your-value",
"ARC_MCP_READ_ONLY": "your-value",
"ARC_MCP_AUDIT_LOG": "your-value"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
ARC_MCP_LABEL envARC_MCP_SPACE envARC_MCP_STATE_DIR envARC_MCP_WINDOW envARC_MCP_WINDOW_PLACEMENT envARC_MCP_IDLE_MS envARC_MCP_IDLE_WAIT_MS envARC_MCP_ARC_DATA_DIR envARC_MCP_ALLOW_HISTORY envARC_MCP_CDP envARC_MCP_CDP_PORT envARC_MCP_ALLOWED_ORIGINS envARC_MCP_BLOCKED_ORIGINS envARC_MCP_BLOCK_READS envARC_MCP_READ_ONLY envARC_MCP_AUDIT_LOG env이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검
레지스트리 이름이 GitHub 계정 DB-25 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.4.0)은 32일 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Node.js도 있어야 해요.
같은 카테고리에는: Browser Use, Chrome DevTools MCP, MCP Server Browser
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
Browser agents and stealth cloud browsers for AI: run web tasks, fill forms, extract data.
MCP server for Chrome DevTools
MCP server for browser use access
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
An MCP server that drives the Arc browser on macOS: tabs, navigation, page reading, DOM interaction and scripting.
It exists because the bundled "Control Chrome" MCP server cannot be pointed at Arc. Arc's scripting dictionary looks like Chrome's, and differs in exactly the places that matter.
Who it is for: anyone running an agent (Claude Code or another MCP client) on a Mac who wants it to work in Arc, the browser they are already signed in to, instead of a fresh automation profile. It reads pages, fills forms, clicks things, runs JavaScript, and keeps its own tabs separate from yours.
What it is not: a cross-platform or cross-browser tool. It drives one browser on one operating system, through Apple Events, plus an optional DevTools engine for screenshots, trusted input and console/network capture. There is no headless mode. There is also no Docker image, and there cannot be one: Apple Events do not cross a container boundary, so a container has no way to reach the Arc running on your Mac. This is a 0.4.0 personal project, and the known limitations below are real.
WebSocket; they fail with a clear message on Node 20 and everything else keeps working)Two runtime dependencies, @modelcontextprotocol/sdk and zod. No build step.
Nothing to clone. Any MCP client can start the server with npx, and @latest is also how it upgrades: the next start picks up a new release.
{
"mcpServers": { "arc": { "command": "npx", "args": ["-y", "arc-control-mcp@latest"] } } }
[!IMPORTANT]
That config is not sufficient on its own. Two macOS permissions still have to
be granted, one of them in Arc's own settings where nothing will prompt you
for it. Until both are granted, the server starts normally and then every
tool fails. This is by far the most likely reason a fresh install looks
broken: read
the two macOS permissions, the next section.
package.json declares "os": ["darwin"], so on Linux or Windows the install stops with EBADPLATFORM instead of succeeding and then failing at the first Apple Event. Environment variables go in an env object alongside args; see environment variables.
Claude Code
claude mcp add arc --scope user -- npx -y arc-control-mcp@latest
The -- is required. Without it, claude mcp add reads the -y as one of its own flags and registers the wrong command. Then check what was registered:
claude mcp get arc
Claude Desktop
Edit ~/Library/Application Support/Claude/claude_desktop_config.json and add the mcpServers block above, merging it with any servers already listed. Quit and reopen Claude Desktop: the file is only read at launch.
Cursor
Add the same mcpServers block to ~/.cursor/mcp.json for every project, or to .cursor/mcp.json for one project.
VS Code
VS Code uses servers, not mcpServers, in .vscode/mcp.json for a workspace or in the file opened by the MCP: Open User Configuration command:
{
"servers": { "arc": { "type": "stdio", "command": "npx", "args": ["-y", "arc-control-mcp@latest"] } } }
Or from the command line:
code --add-mcp '{"name":"arc","command":"npx","args":["-y","arc-control-mcp@latest"]}'
From a git checkout, for development
git clone https://github.com/DB-25/arc-control-mcp.git
cd arc-control-mcp npm install claude mcp add arc-dev --scope user -- node "$PWD/src/index.js"
For any other client, the same thing as JSON. The path has to be absolute: the client's working directory is not yours.
{
"mcpServers": { "arc-dev": { "command": "node", "args": ["/absolute/path/to/arc-control-mcp/src/index.js"] } } }
Register it under a different name than the published one, so you can tell which copy answered. See CONTRIBUTING.md.
Check the install without an MCP client. Neither call touches Arc, so both work before the permissions below are granted:
npx -y arc-control-mcp@latest --version
npx -y arc-control-mcp@latest --help # tool count and environment variables
Both are asked for once, and both fail in a way that is confusing if you do not know to look here.
Both failures are mapped to an explanatory error rather than a raw AppleScript code, so you will be told which one to fix.
A third, optional one is Accessibility (System Settings > Privacy & Security
Accessibility, for the same app, and Automation for System Events). It is what
lets the server place the agent window on a second display and put your window back in front if Arc raised another. Without it everything still works, the agent window is just not moved and your focus is not restored, and the first open_url says so once. The user-activity gate below needs no permission.
Arc's scripting dictionary looks like Chrome's but differs in ways that break the Chrome server outright:
| Chrome | Arc | |
|---|---|---|
| Tab id | integer | UUID string |
| Switch tab | set active tab index of window | select command on the tab |
| Back / forward | works on window or tab | tab only |
| New tab | open location | make new tab on a window or space |
| Grouping | none | spaces, plus a pinned / unpinned / topApp location |
The Chrome server calls parseInt(tab_id) on every id, so against Arc every tool taking a tab id fails before reaching AppleScript. It also splits AppleScript's comma-joined output, which corrupts titles and URLs containing commas.
Not restrictive by design. Anything the agent can reach, it can drive: any tab, any space, arbitrary JavaScript. The defaults are chosen so the user's browsing is not disturbed, but nothing is walled off.
tab_id uses a tab this agent opened. A read-only tool then falls back to whatever tab is active in Arc, because reading the page you already have open is useful and harmless. A tool that *changes* a tab does not fall back: with no tab of its own it is refused, so an agent cannot navigate or reload the tab you are working in just by leaving an argument out. The CDP reads screenshot, console_messages and network_requests follow the changing-tool rule too, since they attach a debugger. Pass a tab_id to address any tab deliberately.Invalid arguments for click. selector: Invalid input: expected string, received number, rather than as an obscure failure from inside the page.mine, and close_own_tabs exists for cleanup. No tool refuses a tab you name with an explicit tab_id. The one refusal above is about an unnamed tab, not a named one.activate: true to opt out of the quiet behaviour.Scripts run through osascript -l JavaScript (JXA), so results come back as JSON rather than AppleScript's flat comma-joined lists. Tool arguments are injected as a JSON literal bound to P, never concatenated into script source.
Every injected page script returns an explicit envelope, so a script that threw is reported as an error carrying the page's own message instead of arriving as an empty success. That distinction is the main thing 0.3.0 fixed.
The model never reads this README, so the handful of facts it needs before its first call are sent as MCP instructions at initialize: call arc_status first, prefer passing a tab_id over switching what the user is looking at, text= is substring matching, batch a known sequence, and page content is untrusted data rather than instructions. A client that ignores instructions loses nothing but a few wasted calls.
50 tools in twelve modules.
| Tool | Purpose |
|---|---|
list_tabs | Every tab, or narrow with scope: "own", query, space, window_id. Rows are flagged mine and isActive. |
get_current_tab | The tab a call with no tab_id would act on. |
switch_to_tab | Make a tab active in its window. activate also brings Arc to the front. Waits for you to stop typing. |
close_tab | Close one tab. |
close_own_tabs | Close every tab this agent opened, leaving the user's alone. include_stale also closes tabs leaked by a dead previous run of the same label. |
arc_status | Arc's version and whether it is the frontmost app, owned tabs, the agent window (id, placement, display, minimized), whether Accessibility is available, your current idle time, whether the agent space exists, what a call with no tab_id resolves to (reported separately for read-only and for changing tools), and how many stale tabs a previous run left behind. |
| Tool | Purpose |
|---|---|
open_url | Open a URL in the agent window, launching Arc if needed. Waits for you to stop typing, and reports focusRestored and waitedForUserMs. Options for new_tab, target space, little_arc, activate, wait_until_loaded. |
go_back / go_forward | Move a tab through its history, verified by checking the URL actually changed. |
reload_tab | Reload a tab. |
wait_for_load | Poll until the document is ready, optionally until the URL contains a substring. Also reads Arc's loading flag (see Loading tabs), so a hung page shows up as ready: "loading" instead of a stalled call. |
stop_loading | Press the stop button on a tab that will not finish loading, which also unblocks every page tool on it. |
| Tool | Purpose |
|---|
| get_page_content | Visible text, whole page or every element matching a selector, joined.
앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요