loading…
Search for a command to run...
loading…
Provides a remote browser session and MCP tools for restricted search and extraction on sites like XHS, Yelp, and TripAdvisor, with human-in-the-loop login.
Provides a remote browser session and MCP tools for restricted search and extraction on sites like XHS, Yelp, and TripAdvisor, with human-in-the-loop login.
This project provides a minimal HITL (human-in-the-loop) remote browser session and an MCP tool gateway for restricted search/extraction. It currently supports XHS and includes real search adapters for Yelp and TripAdvisor.
npx playwright install chromium)npm install
npx playwright install chromium
Copy the environment template and adjust as needed:
cp .env.example .env
npm run dev
This starts:
http://HOST:PORTThis path is intended for a single user (or MAX_SESSIONS=1). It runs the browser inside Xvfb and streams the desktop via noVNC.
Build:
docker build -t browser-mcp-demo .
Run:
docker run --rm \
-p 3000:3000 -p 7900:7900 \
-e HOST=0.0.0.0 \
-e HEADLESS=false \
-e MAX_SESSIONS=1 \
-e VIEW_MODE=novnc \
-e PUBLIC_BASE_URL=http://YOUR_SERVER_IP:3000 \
-e NOVNC_URL_TEMPLATE="http://YOUR_SERVER_IP:7900/vnc.html?autoconnect=1&resize=scale&path=websockify" \
-e PROFILES_DIR=/data/profiles \
-e AUDIT_LOG_PATH=/data/logs/audit.log \
-e DELETE_PROFILE=false \
-v "$PWD/profiles:/data/profiles" \
-v "$PWD/logs:/data/logs" \
browser-mcp-demo
Notes:
VIEW_MODE=novnc makes /session/view/:id embed the live browser stream.PUBLIC_BASE_URL and NOVNC_URL_TEMPLATE with your public host or domain.create_session -> { sessionId, viewUrl }viewUrl in your browser.VIEW_MODE=novnc): the remote browser stream is embedded in the page.wait_for_login until status is READY (site-aware when site is provided).Tools:
create_sessionwait_for_login (optional site)platform_search (site-aware via site param)xhs_open_and_extract (site-aware via site param)destroy_sessionExample (pseudo):
const session = await client.callTool("create_session", {});
await client.callTool("wait_for_login", { sessionId: session.sessionId, timeoutSec: 120 });
const results = await client.callTool("platform_search", {
sessionId: session.sessionId,
query: "camping",
maxNotes: 10,
scrollTimes: 0,
site: "xhs" // xhs | yelp | tripadvisor
});
const detail = await client.callTool("xhs_open_and_extract", {
sessionId: session.sessionId,
url: results.notes[0]?.url,
site: "xhs"
});
logs/audit.log with redaction.POST /agent/run → start a run and execute until login required or donePOST /agent/continue → continue a run after user loginGET /agent/run/:id → fetch current run stateExample request body:
{
"query": "camping",
"maxNotes": 10,
"scrollTimes": 0,
"detailCount": 3,
"detailParallel": 4,
"site": "xhs"
}
Key environment variables:
HOST, PORT, PUBLIC_BASE_URLUI_DIST_DIR (serve built UI from the same server)VIEW_MODE (info | novnc)NOVNC_URL_TEMPLATE (supports {sessionId} placeholder)OPENAI_API_KEY, OPENAI_MODELAGENT_RUN_TTL_MINUTESMAX_SESSIONS, SESSION_TTL_MINUTESPROFILES_DIR, DELETE_PROFILEHEADLESSXHS_BASE_URLAUDIT_LOG_PATHsrc/browser/xhs.ts or src/sites/*.ts if extraction breaks.Выполни в терминале:
claude mcp add browser-mcp-demo -- npx Безопасность
Низкий рискАвтоматическая эвристика по публичным данным — не гарантия безопасности.