Sitelooper
Record a browser flow once with a model, then compile it to a Playwright spec that needs no model.
Connector by restspace · GitHub account verified by the MCP Registry
Install
Works with Claude Code, Codex, VS Code, Cursor, Windsurf, Claude Desktop. Read the repository before you give any tool access to your data.
npx agentmarket install connector/restspace-sitelooper
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this server can do and what it asks for, from its tool list, install config and code. Checked Oct 26, 2026.
- Tools
- 11 read · 25 write · 3 delete · 9 not yet classified
- Secrets
- 1 (API keys, tokens or passwords)
- Install scripts
- None found
- Runs as
- Node.js package
Tools by what they do 48
Read from the source code; the running server may list different tools.
Read 11 · Look things up without changing anything.
assertdoctorfetch_sourcejob_statuslist_flowspeekreadscreenshotsessionssnapshottabs
Write 25 · Create, change, send or run things.
batchbuild_startclickdownloaddragfillgotohovermodifier_clickopenpressrename_values
Show 13 more tools
repair_applyrepair_proposererecordright_clickrun_skillsave_flowscroll_into_viewselectset_offlineset_varset_viewporttypeupload
Delete 3 · Delete, drop, revoke or wipe things.
evalrun_commandstop
Not yet classified 9 · We could not tell from the name and description.
backcheckdblclickdialog_expectdolocateread_allreportwait_for
Secrets and settings it asks for
Secrets: values you paste in that let it act as you.
OPENROUTER_API_KEY
Network hosts it talks to 11
ademchic3.restspace.io· found in codeapi.anthropic.com· found in codeapi.novita.ai· found in codeapi.openai.com· found in codeapi.typesafe.ai· found in codeapi.z.ai· found in codegithub.com· found in codehref.invalid· found in codejson.schemastore.org· found in codeopenrouter.ai· found in coderapiderit.com· found in code
Files it touches
/home/user/browser-pilot/bench/results/c0822ab-agent-browser-mutationlog.json/home/user/browser-pilot/bench/results/c0822ab-agent-browser-transcript.jsonl/home/user/browser-pilot/bench/results/c0822bp-browser-pilot-mutationlog.json/home/user/browser-pilot/bench/results/c0822bp-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/c0822bp2-browser-pilot-mutationlog.json/home/user/browser-pilot/bench/results/c0822bp2-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/c0822bp3-browser-pilot-mutationlog.json/home/user/browser-pilot/bench/results/c0822bp3-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/c0822bp4-browser-pilot-mutationlog.json/home/user/browser-pilot/bench/results/c0822bp4-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/c0822bp5-browser-pilot-mutationlog.json/home/user/browser-pilot/bench/results/c0822bp5-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/c0822or-browser-pilot-mutationlog.json/home/user/browser-pilot/bench/results/c0822or-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/c0822ora-agent-browser-mutationlog.json/home/user/browser-pilot/bench/results/c0822ora-agent-browser-transcript.jsonl/home/user/browser-pilot/bench/results/c0822orp-browser-pilot-mutationlog.json/home/user/browser-pilot/bench/results/c0822orp-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/fwgr16-n1-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/fwgr16-skills/home/user/browser-pilot/bench/results/fwgr17-n1-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/fwgr17-skills/home/user/browser-pilot/bench/results/fwgr18-n1-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/fwgr18-skills/home/user/browser-pilot/bench/results/fwgr19-n1-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/fwgr19-skills/home/user/browser-pilot/bench/results/fwkb1-n1-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/fwkb1-skills/home/user/browser-pilot/bench/results/fwkb2-n1-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/fwkb2-skills/home/user/browser-pilot/bench/results/fwod26-n1-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/fwod26-skills/home/user/browser-pilot/bench/results/fwod27-n1-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/fwod27-skills/home/user/browser-pilot/bench/results/fwod28-n1-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/fwod28-skills/home/user/browser-pilot/bench/results/fwod29-n1-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/fwod29-skills/home/user/browser-pilot/bench/results/fwod30-n1-browser-pilot-transcript.jsonl/home/user/browser-pilot/bench/results/fwod30-skills
Tools (48)
Read from the source code; the running server may differ. Descriptions are the server’s own words; hidden characters are shown as [U+…].
assertCheck a condition on the current page now; never acts. State the expected text in the sentence, e.g. "the order list shows a row with total 42.00". In a learn session a passing assert becomes a flow step that fails the run when it does not hold. Credentials: write each secret as one {{env:NAME}} marker ({{totp:NAME}} for a one-time code), exactly as written: the marker alone, never the value and never $NAME. NAME must be set in the environment the MCP server was started with. Never ask the user for a secret value. isError with exit 1 = the condition did not hold; exit 2 = could not be checked.
backGo back one history entry.
batchExecute several actions in ONE call when you already know each next step with certainty (e.g. filling a form you have just seen, then submitting it). Steps run in order and stop at the first error; the result lists each step's outcome, which steps did not run, and ONE combined [state: …] summary. Do not batch across a judgment point — anything whose outcome you must see before deciding the next action.
build_startStart a background job that compiles a saved flow (or bundle) into a Playwright .flow.ts/.spec.ts and verifies it (readiness: clean runs). With a reset command (sitelooper.config.json resetCommand) it first converges, re-recording failing steps with the model. Readiness needs a reset command or fixture_isolation. Returns a job_id at once: poll job_status until done/failed (minutes).
checkSet a checkbox/radio to checked or unchecked.
clickClick an element.
dblclickDouble-click an element.
dialog_expectArm handling for native dialogs (alert/confirm/prompt) triggered by your NEXT action: accept or dismiss, with optional prompt text. Call BEFORE the click that opens the dialog. Captured dialog messages are returned in that action's result.
doHave the agent perform ONE verifiable outcome in the session's browser and verify it, e.g. "create a customer named {{runid}} and confirm it appears in the list". One verifiable outcome per do: split multi-part tasks into several calls. State expected values in the sentence. Credentials: write each secret as one {{env:NAME}} marker ({{totp:NAME}} for a one-time code), exactly as written: the marker alone, never the value and never $NAME. NAME must be set in the environment the MCP server was started with. Never ask the user for a secret value. Needs a model API key in the server environment. R…
doctorread-onlyInspect the setup: browser, Node, and which model provider/API key is in use and why (never shows the key).
downloadClick an element and capture the download it triggers; saves to the session downloads dir (or save_path).
dragDrag one element onto another. Tries a real mouse drag, then falls back to synthetic HTML5 drag events (dragstart/dragover/drop with a DataTransfer).
evalEscape hatch: run a read-only JavaScript expression in the page and return its JSON-serialised result. Prefer the dedicated tools. Nothing an eval does or returns is replayed: never act through it or give elements ids, and never report or navigate by a value only an eval returned: read it with read/read_all, or click its link.
fetch_sourceFetch the raw HTTP response body for a URL (default: the current page's URL) using the browser's cookies, WITHOUT executing JavaScript. This is the SERVER-RENDERED source — every other tool shows the live post-hydration DOM instead. Use it before making any claim about what the server sent, and to tell an SSR bug (element missing from the source) apart from a hydration bug (present in the source, absent live).
fillSet the full value of an input/textarea. React-safe: works on controlled components and number inputs (clears first). Use for text fields; use select for <select>. A {{env:NAME}} secret marker or a {{totp:NAME}} one-time-code marker in value is resolved at execution time — pass it through verbatim.
Show 33 more tools
gotoNavigate the current tab to a URL and wait for load.
hoverHover an element (also dispatches synthetic mouseover/enter for JS-driven menus).
job_statusread-onlyReport a background job started by build_start, check (ready), repair_propose or rerecord: status running|done|failed, the last progress lines, and the final JSON result and exit code when finished. Waits up to wait_s seconds for the job to finish before answering.
list_flowsread-onlyList saved flows with their step counts, variables and origin.
locatePoint to where each listed value is shown on the current page, so it can be re-read later.
modifier_clickClick while holding modifier keys (e.g. Shift/Control-click gestures).
openNavigate a browser session to a URL (no model involved); starts the session if it is not running. learn and headed apply only when this call starts the session: learn=true records every later do/assert as a reusable flow step (needed before save_flow). Typical authoring: open (learn) → set_var → do/assert per outcome → save_flow → build_start.
peekread-onlyReturn the session page's URL, title and an accessibility snapshot (no model, no actions).
pressPress a key or chord (e.g. "Enter", "Escape", "Control+a") on an element or the page.
readRead text/value/attribute from ONE element — much cheaper than a full snapshot for spot checks. The target must match exactly one element, or the read fails: a snapshot ref (@e123) always does, and a bare tag like "h1" usually does not. Use read_all to read every match, or what=count to count them. If the value matters beyond this glance — a reference, id, name, or total the task or a later step will use — pass `label` NOW: a labelled value is published under that name automatically; an unlabelled one stays anonymous. what=url reads the current page URL (no target) — the way to report where a …
read_allLike read, but returns a JSON array of the value across EVERY element matching the selector — read a whole list of rows/cells in one call instead of many. what: text (visible text of each), value (input value of each), attr (an attribute of each), or count.
rename_valuesSubmit the value renames for this session. Rename ONLY names that mislead or say nothing (selector fragments like h1, role_radiogroup_aria_che, generic value/value_2, or a name that contradicts what the value is). Leave every adequate name alone — churn costs more than it buys.
repair_applyApply a proposal staged by repair_propose to its flow file exactly as checked (no browser run).
repair_proposeStart a background job that replays a compiled .flow.ts against the app, repairs drifted steps and stages a checked candidate as a proposal file for review (repair --propose); never rewrites the spec. Returns a job_id: poll job_status. Apply a good proposal with repair_apply.
reportREQUIRED final call: report the outcome of the instruction. Nothing after this is executed. Keep summary to one short paragraph.
rerecordStart a background job that re-records one step of a flow with the agent (optionally with a new instruction), then verifies it over several runs and re-pins it. Needs a model API key. Credentials: write each secret as one {{env:NAME}} marker ({{totp:NAME}} for a one-time code), exactly as written: the marker alone, never the value and never $NAME. NAME must be set in the environment the MCP server was started with. Never ask the user for a secret value. Returns a job_id: poll job_status.
right_clickRight-click (context menu) an element.
run_commandDescription is built at runtime.
run_skillReplay a stored procedure listed under [skills] in the instruction, deterministically and without further reasoning: every recorded step runs in order with its parameters filled in, stopping at the first step that no longer works. Returns each step's outcome and every value read back from the live page. If it stops part-way, the steps that ran HAVE changed the page — observe, then continue from there yourself. Call it as your FIRST action when a listed procedure matches the instruction.
save_flowStop a learn session, save what it recorded as a named flow, then export the flow with its pinned procedures to a bundle file (default .sitelooper/procedures.json in cwd). Closes the session's browser. Then call build_start with the flow name.
screenshotread-onlySave a screenshot to disk and return its path (for evidence; you cannot see images).
scroll_into_viewScroll an element into view.
selectChoose an option in a <select>, matching by visible label first, then by value.
sessionsread-onlyList browser sessions and whether each is running.
set_offlineToggle network offline mode.
set_varSet a session variable that later instructions reference as {{name}}; in a learn session it becomes a flow variable that build/check bind with vars. Not for secrets (use {{env:NAME}} markers).
set_viewportResize the viewport.
snapshotAccessibility snapshot of the current page with @ref handles for elements. Returns interactive/labelled elements only by default (what you need to pick something to act on); pass full:true for the complete tree including static text nodes. Call after navigation or DOM changes; refs from older snapshots go stale. For a specific value prefer read/read_all over a full tree.
stopcan change or delete dataStop a browser session (closes its browser and daemon) without saving a flow. Use save_flow instead to keep a learn session's recording.
tabsList open tabs, or switch the active tab by index.
typeType text key-by-key into an element (triggers per-keystroke handlers, e.g. autocomplete). A {{env:NAME}} secret marker or a {{totp:NAME}} one-time-code marker in text is resolved at execution time — pass it through verbatim.
uploadSet files on a file input.
wait_forWait for a condition on a selector: visible, hidden, text_equals, text_contains, or count. Use this instead of sleeping or polling. Returns immediately if the condition already holds. Use count/text only for a value you expect to CHANGE — counting rendered rows is unreliable on virtualised lists (only visible rows exist in the DOM), so wait on a stable indicator instead.
Compare and alternatives
Featured in
Signals
- Stars
- 1
- Forks
- 0
- Open issues
- 0
- Last commit
- Oct 22, 2026 (6 days ago)
- Last release
- Oct 22, 2026 (6 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- Registry name
io.github.restspace/sitelooper- Version
- 0.7.0
- Auth
- API key
- Packages
- npm sitelooper
- License
- MIT
- Repository
- github.com/restspace/sitelooper
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
Cite this page
Sitelooper MCP server. Agent Mart. https://agentmart.dev/connectors/restspace-sitelooper (last updated 2026-10-24)