Browser Use
Browser agents and stealth cloud browsers for AI: run web tasks, fill forms, extract data.
제작자가 쓴 설명(영어 원문)
Hand browser work off to a server-side agent: read the page as a table, act, then verify.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
Claude Desktop → Settings → Developer → Edit Config를 열고 claude_desktop_config.json에 이 내용을 붙여 넣으세요
{
"mcpServers": {
"jev-ultrafast": {
"command": "uvx",
"args": [
"jev-ultrafast-mcp"
]
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add jev-ultrafast -- uvx jev-ultrafast-mcp프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"jev-ultrafast": {
"command": "uvx",
"args": [
"jev-ultrafast-mcp"
]
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"jev-ultrafast": {
"type": "stdio",
"command": "uvx",
"args": [
"jev-ultrafast-mcp"
]
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
이 서버는 내 컴퓨터에서 실행되는데, ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요. 다른 앱을 고르세요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
내 컴퓨터에서 실행돼요. 설치하면 AI 앱에 도구 목록이 나타나요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 10일 점검
레지스트리 이름이 GitHub 계정 jiawei686 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
내 컴퓨터에서 실행되는 서버라 인터넷 엔드포인트가 없어요
내 컴퓨터에서 실행되며, 대신 로컬 설정을 사용해요
내 컴퓨터에서 실행돼요. 도구 목록은 인터넷 엔드포인트가 있는 서버에서만 읽을 수 있어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
레지스트리에 필수 키가 나와 있지 않아요. 다만 처음 쓸 때 로그인을 요구하는 서버도 있어요.
내 컴퓨터에서 실행돼요. AI 앱이 필요할 때 실행하고, 데이터는 제작자의 서버를 거치지 않아요(서버 자체가 온라인 서비스를 호출하는 경우는 제외).
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.1.5)은 2개월 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. 내 컴퓨터에 Python (uv)도 있어야 해요.
같은 카테고리에는: Browser Use, Chrome DevTools MCP, MCP Server Browser
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:↓ 주간 다운로드i★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
Browser agents and stealth cloud browsers for AI: run web tasks, fill forms, extract data.
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
English · 简体中文
Hand the browser work off — an MCP server that drives the page for your agent.
Your agent should not be opening the browser at all. A browser task goes over whole — the URL, the goal, and the check that proves it — and the loop runs on the server. One tool call instead of twenty. Three seconds instead of a minute. A cent instead of a frontier model's context. And it never invents a target: it picks from what the page actually has, and the server refuses rather than guesses.
What it cost. A cent for the whole day, and a cent is all of it:
Three commands, then restart your client.
git clone https://github.com/jiawei686/jev-ultrafast-mcp.git
cd jev-ultrafast-mcp python3 -m venv .venv .venv/bin/pip install -e . # Windows: .venv\Scripts\pip install -e .
python scripts/install.py # finds your MCP clients and writes their config
install.py looks for WorkBuddy, Claude Code, Claude Desktop, Codex CLI, Cursor, VS Code, Cline, Windsurf and Gemini CLI, and writes the format each one expects — merging into your existing config and saving a .bak first. Needs Python ≥ 3.10 and any Chromium-family browser.
Restart the client, and then just say what you want:
You: Set this form to 3 adults, tick *Nonstop only*, then submit it.
Your agent:
browser_goal(goal=…, url=…, verify=[…])— one call; the page is opened and the
loop runs server-side, and the result is checked by code afterwards.
(what that costs)
You: Open example.com and tell me what the page says.
Your agent:
browser_open→ reads the element table → answers — a look is not a task, so it
does not need the model.
(verbatim run)
Restarted and the tools are not there? Some clients make you approve the server once. In WorkBuddy that is *Connectors → Custom connectors → Trust*. The approval is remembered against the config itself, so if you later edit the config it asks once more.
No checkout needed if you would rather install it as a package. It is on PyPI, so the name is enough:
uvx jev-ultrafast-mcp # run it straight from PyPI, nothing installed
pip install jev-ultrafast-mcp # or install it yourself
A client config wants a stable interpreter path rather than uvx's cache, so:
python3 -m venv ~/.jev-ultrafast-mcp/venv
~/.jev-ultrafast-mcp/venv/bin/pip install jev-ultrafast-mcp
That gives you a jev-ultrafast-mcp console script and a stable interpreter path to put in a client config — verified against the latest mcp SDK on Python 3.13, every one of the ten tools listed.
scripts/install.py is the other half: it finds your MCP clients and writes the config each one expects, merging into the existing file and saving a .bak first.
python scripts/install.py --list # what is installed, and the file each one reads
python scripts/install.py --print # show the config it would write, change nothing python scripts/install.py -c cursor,codex # only these two python scripts/install.py --headed # keep a visible browser window python scripts/install.py --allow-domains example.com,*.example.org python scripts/install.py --uninstall # take the entry back out
Runtime dependencies: mcp, websockets, httpx. No Playwright, no Selenium, no browser-harness.
A three-step goal on a real page, driven by browser_goal. This is everything your agent sent and everything it got back — one turn, and the page never entered its context:
browser_goal(
goal="On this flight search form: set Passengers to 3 adults, tick the 'Nonstop only' " "checkbox, then submit the search. Do not type into any city field.", verify=[{"type": "text_contains", "text": "3 adults · nonstop"}], )
goal: On this flight search form: set Passengers to 3 adults, … status: done steps: 3 turbo: 4 decisions · 14,626 tokens · 1.8s model + 1.1s page · 3.3s wall trace:
verified: PASS ok text_contains: '3 adults · nonstop' found in page text
What the second time costs. Nothing. The second time is a recorded macro, and a macro makes no model calls at all — it does not even need a key.
How long it took. 3.3 s wall for the whole goal: 1.8 s of model, 1.1 s of page. Every run prints that line itself, so the numbers are checkable rather than persuasive.
That run is not a mock-up. scripts/turbo_check.py reproduces it against a real Chrome and the real model, and then checks the page with code rather than trusting the model's account of its own work. The three actions — plus the reading and re-reading between them — all happened on the server. Your agent spent one turn and never saw an element table.
The division of labour is the whole design decision, so it is yours to make per task:
| agent drives | browser_goal drives | |
|---|---|---|
| Tool calls for a 3-step flow | 6+ (observe, act, observe, act…) | 1 |
| Who holds the page in context | your agent | the decision model, server-side |
| Per-step cost | one agent turn | one typed request, no screenshot |
| Who names the target | the model writes a selector | the model picks a `ref` from the page's own table |
| If it goes wrong | a wrong click, usually silent | the server refuses, with the reason |
| Knowing it worked | the model's summary | code-checked assertion, which wins the disagreement |
| Second time around | run the model again | macro replay, zero model calls |
Browser automation usually makes the *agent* do the driving: read the page, pick one element, act, read again to see whether that worked. Ten clicks is ten turns, the page passes through the agent's context every time, and a mis-click rarely announces itself.
This server can take that job instead. browser_goal is one tool call from your agent; the loop runs here, server-side, with Jev — TypeSafe's decision model — choosing each step. The model never writes a selector: it picks among the elements the page actually has, and the server refuses anything that is not on the page rather than guessing. When it stops, browser_assert checks the page it left behind in code, and a passing assertion outranks the model's own account of what it did.
Four things follow from that:
ref from a numbered table of what is on the page, not a selector or a coordinate the model invented, and the action is re-checked against the page before it runs.Everything *except* browser_goal — browser_open, browser_observe, browser_act, browser_assert, browser_macro — needs no key, no account, and no network beyond the page itself, from any MCP client: WorkBuddy, Claude Code, Codex, Cursor or VS Code. If you would rather keep your hands on the wheel, that whole surface is still here.
browser_open → element table → browser_act [refs] → browser_assert
Inspired by browser-use/jev-ultrafast and TypeSafe's typed-question API. Independent project, not affiliated with either — see docs/DESIGN.md for what is different and why.
Contents · Quick start · Cheap and fast · What it is · What a session looks like · Connecting an agent · What you can ask it to do · What the agent reads · Why another browser MCP? · Tools · Configuration · FAQ · Try it without an agent · See also
You say:
Open example.com and tell me what the page says.
Your agent does this, and this is everything it sees:
browser_open("https://example.com")
[obs#1] https://example.com/ "Example Domain" scroll=0/216 reachable=1/1 e1 lnk More information...
browser_observe() [delta#2] … 1 element = no change (1 element)
Then it answers. No screenshot was taken, no HTML was dumped, and the page never entered a model's context: your agent read the table and answered.
A more realistic one — searching a real site, with your agent doing the driving:
browser_open("https://duckduckgo.com")
e4 cmb* Search with DuckDuckGo ▸ ""
browser_act([{type, ref: "e4", text: "python asyncio tutorial"}, {keys, key: "Enter"}]) → 2/2 ops ok, one round trip, page navigated
browser_observe() [delta#3] https://duckduckgo.com/?…&q=python+asyncio+tutorial reachable=9/59
browser_assert([{url_contains, text: "q="}, {count_at_least, role: "link", min: 5}]) PASS
That is a verbatim run against the live web — scripts/live_check.py reproduces it end to end.
| Client | Config file install.py writes | After installing |
|---|---|---|
| WorkBuddy | ~/.workbuddy-ai/mcp.json (older installs: ~/.workbuddy/mcp.json) | restart, then Connectors → Custom connectors → Trust |
| Claude Code | ~/.claude.json (user scope) | or claude mcp add --scope user … |
| Claude Desktop | ~/Library/Application Support/Claude/claude_desktop_config.json | quit the app fully and reopen |
| Codex CLI | ~/.codex/config.toml | codex mcp list to confirm |
| Cursor | ~/.cursor/mcp.json | reload the window |
| VS Code (Copilot) | …/Code/User/mcp.json | Agent mode only — not Ask/Edit |
| Cline | …/Code/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json | reload the window |
| Windsurf | ~/.codeium/windsurf/mcp_config.json | reload the window |
| Gemini CLI | ~/.gemini/settings.json | gemini mcp list to confirm |
Manual setup — if you would rather not run the installer
Every client below needs the same three facts: an absolute interpreter path, the module, and one environment
앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요