Mochi MCP server
2026년 11월 3일 커밋AI 어시스턴트가 브라우저 자동화를 수행하고, 지속적인 프로젝트 메모리를 유지하며, Chrome extension을 통해 페이지 내 힌트 메시지를 보낼 수 있도록 지원합니다.
다른 이름 DevZonayed/Mochi
- 스타
- 3
- Tools
- 50
- 다운로드, 30일
- —
- 최신 버전
- —
- 마지막 커밋
- 2026년 11월 3일
- 라이선스
- MIT
Mochi MCP란?
Mochi은(는) MCP server입니다. AI 어시스턴트가 브라우저 자동화를 수행하고, 지속적인 프로젝트 메모리를 유지하며, Chrome extension을 통해 페이지 내 힌트 메시지를 보낼 수 있도록 지원합니다. 50개 도구를 제공합니다. 예: browser_session_start, browser_session_end, browser_request_attention.
프로젝트 README에서 생성된 요약
Mochi MCP server 정보
Mochi는 Claude Code와 같은 AI 어시스턴트를 사용하는 개발자가 브라우저 기반의 품질 보증(QA)을 자동화하고 프로젝트 컨텍스트를 유지할 수 있도록 돕습니다. 이 시스템은 기존 브라우징 세션에 영향을 주지 않도록 전용 Chrome 탭 그룹 내에서 실행되는 종합적인 브라우저 컴패니언 역할을 합니다. Node 기반 MCP server와 Chrome Manifest V3 extension을 사용하여 AI의 추론 능력과 실시간 웹 상호작용 사이의 간극을 메웁니다.
사용자는 디자인 QA 수행, 자동화된 워크플로우 실행, 네트워크 응답 검증과 같은 복잡한 작업을 수행할 수 있습니다. 서버에는 셀렉터 캐시와 워크플로우를 로컬 .continuum 디렉토리에 저장하는 고유한 메모리 시스템이 포함되어 있습니다. 이를 통해 에이전트는 요소를 다시 탐색할 필요 없이 성공적인 동작을 재현할 수 있습니다. 웹사이트 디자인 변경으로 인해 셀렉터가 깨지더라도 엔진이 ARIA 역할과 이름을 사용하여 자동화를 스스로 복구(self-heal)합니다. 또한 특정 키보드 단축키를 사용하여 사용자가 AI에게 페이지 내 힌트와 스크린샷을 보낼 수 있는 기능도 제공합니다.
활용 사례
- 1자동 회귀 테스트AI 에이전트가 캐시된 셀렉터를 사용하여 저장된 워크플로우를 재현함으로써 로그인 흐름이나 기타 핵심 경로를 테스트할 수 있습니다.
- 2시각적 디자인 품질 보증개발자가 에이전트에게 디자인 QA를 수행하도록 지시하고 특정 이슈를 웹페이지에 직접 고정할 수 있습니다.
- 3대화형 Human-in-the-loop 피드백사용자가 어떤 탭에서든 키보드 단축키를 눌러 특정 요소와 스크린샷을 AI 어시스턴트에게 보낼 수 있습니다.
프로젝트의 README를 바탕으로 작성되었습니다. 모든 활용 사례는 해당 내용의 인용문과 대조하여 확인합니다.
Mochi MCP 도구 50
README에서 감지됨browser_session_startbrowser_session_endbrowser_request_attentionbrowser_navigatebrowser_open_tabbrowser_list_tabsbrowser_close_tabbrowser_textbrowser_linksbrowser_snapshotbrowser_snapshot_querybrowser_snapshot_node
| browser_session_start | — | |
| browser_session_end | — | |
| browser_request_attention | — | |
| browser_navigate | — | |
| browser_open_tab | — | |
| browser_list_tabs | — | |
| browser_close_tab | — | |
| browser_text | — | |
| browser_links | — | |
| browser_snapshot | — | |
| browser_snapshot_query | — | |
| browser_snapshot_node | — |
도구 50개 모두 보기도구 수 줄이기
browser_clickbrowser_click_atbrowser_typebrowser_press_keybrowser_scrollbrowser_waitbrowser_screenshotbrowser_window_resizebrowser_emulate_viewportbrowser_clear_emulationbrowser_assertbrowser_audit_interactivesbrowser_act_and_observebrowser_assert_no_errorsbrowser_wait_for_responsebrowser_page_assetsbrowser_set_storagebrowser_upload_stagebrowser_upload_filebrowser_playbook_listbrowser_playbook_getbrowser_playbook_savebrowser_playbook_deletebrowser_playbook_matchbrowser_playbook_runbrowser_playbook_propose_updatebrowser_playbook_secret_checkbrowser_playbook_seed_from_codebasebrowser_playbook_diff_acceptbrowser_playbook_exportbrowser_playbook_importbrowser_playbook_dashboardbrowser_recall_selectorbrowser_forget_selectorbrowser_list_selectorsbrowser_workflow_savebrowser_workflow_runbrowser_run_history
| browser_click | — | |
| browser_click_at | — | |
| browser_type | — | |
| browser_press_key | — | |
| browser_scroll | — | |
| browser_wait | — | |
| browser_screenshot | — | |
| browser_window_resize | — | |
| browser_emulate_viewport | — | |
| browser_clear_emulation | — | |
| browser_assert | — | |
| browser_audit_interactives | — | |
| browser_act_and_observe | — | |
| browser_assert_no_errors | — | |
| browser_wait_for_response | — | |
| browser_page_assets | — | |
| browser_set_storage | — | |
| browser_upload_stage | — | |
| browser_upload_file | — | |
| browser_playbook_list | — | |
| browser_playbook_get | — | |
| browser_playbook_save | — | |
| browser_playbook_delete | — | |
| browser_playbook_match | — | |
| browser_playbook_run | — | |
| browser_playbook_propose_update | — | |
| browser_playbook_secret_check | — | |
| browser_playbook_seed_from_codebase | — | |
| browser_playbook_diff_accept | — | |
| browser_playbook_export | — | |
| browser_playbook_import | — | |
| browser_playbook_dashboard | — | |
| browser_recall_selector | — | |
| browser_forget_selector | — | |
| browser_list_selectors | — | |
| browser_workflow_save | — | |
| browser_workflow_run | — | |
| browser_run_history | — |
자동 검사
2026년 11월 14일에 실행됨전체 보고서 →아직 인증되지 않았습니다. 서버는 80점 이상의 점수, 심각한 결함 없음, 그리고 검사에 충분한 데이터를 갖추어야 합니다. 검사 방식 · 점수를 높이기 위해 수정할 항목
- 소스 저장소 연결 및 접근 가능devzonayed/mochi is public and reachablegithub.com/devzonayed/mochi ↗통과
- 패키지가 이 저장소를 소스로 명시검사되지 않음
- 빌드 출처(Sigstore 증명)검사되지 않음
- 오픈 소스 라이선스 (OSI)MITspdx.org/licenses/MIT.html ↗통과
- 최근 1년 내 커밋 또는 릴리스Last commit or release 2026-11-03github.com/devzonayed/mochi ↗통과
- OpenSSF Scorecard검사되지 않음
- 패키지 이름이 인기 패키지와 유사하지 않음검사되지 않음
- 패키지 및 해당 종속성에 중요한 보안 권고 없음검사되지 않음
- 모델에 대한 숨겨진 지침 없음50 tool descriptions and the README read; no override phrases, credential paths or hidden characters통과
- 파괴적인 도구에 라벨 표시됨No tool named like delete, drop or exec통과
- 원격 엔드포인트가 MCP 핸드셰이크에 응답검사되지 않음
README
GitHub에서 보기Mochi
Browser companion for AI assistants. Browser automation MCP + persistent project memory + in-page hint messaging, all in one Claude Code plugin.
A QA-tester MCP for AI assistants — with memory.
Each AI session runs inside its own Chrome tab group (your other tabs are untouched). What's new: every successful action is auto-traced, and the agent can save the trace as a named workflow scoped to a domain. Next time you ask "test the login flow on staging", the agent replays the saved workflow with cached selectors — no re-discovery, no re-screenshotting. If a selector breaks (refactor, A/B test, redesign), the engine self-heals by ARIA role + name and updates the cache.
selector cache + workflow store
(file-based, <project>/.continuum/)
▲
AI client (Claude Code / Codex / Cursor)
│ stdio (MCP) ▲
▼ │
server/ ──── auto-launches Chrome ─┴─▶ Chrome
│ WebSocket │
▼ ▼
extension/ background.js ◀────────────── manifest V3 extension
│
▼
session = { tab group, primary tab, tab set, CDP }
Layout
| Directory | What it is |
|---|---|
server/ |
Node MCP server. WS server (port 9009) + file-based memory + workflow replay engine. |
extension/ |
Chrome MV3 extension. Owns the tab group, CDP attachments, and DOM helpers. |
mcp/ |
Reference clone of upstream Browser MCP (not used; archival). |
Memory (selector cache, workflows, runs) lives in <project>/.continuum/
alongside the Continuum chain data — pure files, no database. Override with
SUPER_TESTER_DATA_DIR.
Install (one plugin, one extension, done)
Mochi is a Claude Code plugin bundling browser automation, context-chain
memory, and popup hint messaging. The server is pre-bundled into a single
file (server/dist/server.bundle.mjs) by GitHub Actions on every push to
the default branch — so installing means cloning the repo. No npm install,
no native binaries, no setup script.
Install from GitHub (recommended)
# Inside any Claude Code session:
/plugin marketplace add DevZonayed/Mochi
/plugin install mochi@mochi
That's it for the plugin. Then load the Chrome extension once:
chrome://extensions → Developer mode → Load unpacked → select
~/.claude/plugins/cache/mochi/mochi/0.6.0/extension
Restart Claude Code. Press ⌘⇧M (macOS) or Ctrl+Shift+M (other) on any tab to send a hint with picked elements + screenshot.
Install from a local checkout (if hacking on the plugin itself)
/plugin marketplace add /absolute/path/to/your/Mochi/checkout
/plugin install mochi@mochi
If you change source files, rebuild the bundle before reloading:
cd /path/to/Mochi/server && npm install && npm run build
Then /reload-plugins inside Claude (or /plugin uninstall mochi && /plugin install mochi@mochi for a clean refresh).
The plugin auto-registers:
- Two MCP servers —
browser(automation tools) andcontinuum(recall tool) - Seven slash commands —
/continuum:checkpoint,/continuum:recall,/continuum:status,/continuum:dream,/continuum:feedback,/continuum:rename,/continuum:render - Seven hooks — SessionStart, PreCompact, SessionEnd, PreToolUse, PostToolUse, Stop, UserPromptSubmit
- The
/browserskill
For the in-page hint modal: press ⌘⇧M (macOS) or Ctrl+Shift+M on any page once the extension is loaded.
Migrating from the older super-tester plugin name
If you had an earlier install when the plugin was called super-tester, run:
/plugin uninstall super-tester
/plugin marketplace remove super-tester
…then follow the install steps above using the new mochi names. Your
.continuum/ chain data, screenshots, and feedback queue are tied to your
project dir (not the plugin name) — they survive the rename.
Updating
Whenever new versions of mochi land (bumped version in plugin.json):
/plugin update mochi
Claude Code re-copies the source files into its plugin cache and switches the
active install over. MCP servers respawn on next Claude restart. For hook /
command / skill changes only, /reload-plugins works mid-session.
Legacy install script
The older ./install.sh script (which edited ~/.claude.json directly) is
still in the repo but is now redundant with the plugin route. Don't use both
at the same time — pick one.
./install.sh --uninstall # remove the legacy .claude.json entry if present
Tools (MCP)
65 tools, grouped by purpose.
Design-QA loop (0.9.0+). An agent can run a design-QA pass and drop a comment on every issue via
browser_comment_add— those comments appear to you as pins in Comment Mode (they share the extension's storage). You review/edit them client-side, then the agent reads the session back (browser_comment_list) and fixes everything in bulk, marking eachbrowser_comment_resolve. Drive it with/mochi:design-qa [focus]and/mochi:design-qa fix.
Notifications, not focus-stealing (0.5.0+). Automation never raises the Chrome window to the OS foreground on its own — it posts a click-to-focus notification titled
Mochi · <project>instead, so it won't yank you out of your editor. Clicking the toast brings that session's window forward. The agent can ping you on purpose viabrowser_request_attention. Requires a one-time "reload unpacked extension" (newnotificationspermission); on macOS, enable Google Chrome under System Settings → Notifications (the popup walks you through it).
Session + tabs
| Tool | What it does |
|---|---|
browser_session_start |
New tab group + primary tab. Pass newWindow:true to spawn a fresh window. Posts a click-to-focus notification instead of stealing focus. |
browser_session_end |
Detach debugger, ungroup or close session tabs. |
browser_request_attention |
Post an OS notification asking the human to look (captcha, choice, or "done — come look"). Click focuses the window. |
browser_navigate |
Navigate primary tab, wait for load. |
browser_open_tab |
Open new tab inside the session group. |
browser_list_tabs |
List session tabs + CDP attachment state. |
browser_close_tab |
Close a specific session tab. |
Discovery + interaction
| Tool | What it does |
|---|---|
browser_text |
Compact visible text lines, optionally filtered by query. Use before snapshot for reading/searching content. |
browser_links |
Compact visible links with text, href, selector ref, and box. |
browser_snapshot |
ARIA tree with stable refs + pixel boxes. Defaults to compact, viewport-only, redacted, depth-limited, and 12KB capped. |
browser_snapshot_query |
Search the stored snapshot by text/name/role/ref/tag and return tiny excerpts. |
browser_snapshot_node |
Return one compact subtree from the stored snapshot by ref, text, or query path. |
browser_click |
Click by selector (CDP). Pass intent to cache the selector for next time. |
browser_click_at |
Click at pixel coords (CDP). |
browser_type |
Focus + clear + insertText. Pass intent to cache. |
browser_press_key |
Real keyboard event (CDP). |
browser_scroll |
Absolute {x,y} or relative {deltaX,deltaY}. |
browser_go_back / browser_go_forward |
History navigation. |
browser_wait |
Sleep up to 60s. |
browser_screenshot |
PNG/JPEG (viewport / fullPage / elementRef). |
Viewport + window
| Tool | What it does |
|---|---|
browser_window_resize |
Resize/move/maximize the actual window (only safe with newWindow). |
browser_emulate_viewport |
Device Mode via CDP. Presets + custom width/height/DPR/UA. |
browser_clear_emulation |
Reset viewport overrides. |
Assertions
| Tool | What it does |
|---|---|
browser_assert |
Verify url-contains, url-equals, title-contains, element-exists, element-missing, text-contains, text-equals. Returns {ok, got}. |
QA truth & coverage (0.5.0)
The verdict-driven core of an exhaustive QA pass. Render != Works: a control that paints on screen is not a verified control. These tools enumerate every actionable element, drive each one, and prove what actually happened.
| Tool | What it's for |
|---|---|
browser_audit_interactives |
Enumerate every actionable control on the page (scope:"all"|"viewport", limit, includeHidden). The coverage backbone — returns {selector, role, accessibleName, visible, inViewport, disabled, hasClickHandler, box} per element so nothing goes UNTESTED. |
browser_act_and_observe |
Perform one action (click/type/navigate/press_key/click_at) and classify the result: WORKS / NO-OP / ERROR / NAVIGATES. A NO-OP (clickable but nothing changed) is a dead control = defect. Returns urlChanged, domChanged, networkDelta, consoleDelta. |
browser_assert_no_errors |
One-call health gate: ok=false if any console error/uncaught exception or any >=400/failed request happened since the page loaded (sinceNavigation default, or sinceMs, with ignoreUrlContains). Failed-request entries include .body. |
browser_wait_for_response |
Block until a matching network response arrives (urlGlob/urlContains, method, statusGte/statusLt, timeoutMs). Proves a write actually persisted instead of guessing from the UI. |
browser_page_assets |
Hash the live page assets (script/css/document) with sha256 + a pageHash. Confirm the live bundle hash == the built hash so you never test a stale cached deploy. |
browser_set_storage |
Deterministic auth/state seeding — set localStorage, sessionStorage, and cookies (or clear) in one call so a flow starts from a known logged-in state. |
Enhancements to existing tools in 0.5.0:
browser_navigatenow acceptshardReload(cache-bypass load) anddisableCache(persist cache-off for the tab) — pair withbrowser_page_assetsto defeat stale bundles.browser_console_messagesacceptssinceNavigation:trueto scope to the current page (the fix for a stale pre-navigation buffer reading as a false "no errors");level:"error"includes uncaught exceptions.browser_network_requestsacceptssinceNavigation,sinceMs, andincludeBody; error responses (>=400/failed) include the captured response body automatically, so an "Internal server error" tells you why (e.g. SMTP misconfig) instead of guessing.browser_clicknow reports disabled controls (fails loudly with "element is disabled" rather than silently passing) and retries a transient not-found once.browser_session_healthacceptsheal:trueto re-attach the debugger to session tabs.
File uploads
| Tool | What it does |
|---|---|
browser_upload_stage |
Stage a file into the per-project library at .continuum/uploads/. Accepts path, https url, dataUrl, or base64. Returns a stable stashId (sha256-based, idempotent) reusable across many uploads. |
browser_upload_file |
Attach a file to a page target via a strategy chain: direct (DOM.setFileInputFiles) → intercept (file-chooser dialog) → drop (synthesized DataTransfer + DragEvent) → paste (synthesized ClipboardEvent). Bypasses the native OS file picker entirely. Target by selector, ref, trigger, or auto: { near }. Smart-wait confirms upload (preview thumbnail / 2xx upload response / custom successSelector). |
Sources can be inlined into browser_upload_file or pre-staged with
browser_upload_stage; staging dedupes by sha256, so the same logo across
ten sites is fetched/decoded once and reused. Frame-traversal handles
same-origin iframes automatically. See
docs/superpowers/specs/2026-05-19-browser-file-upload-design.md
for the full design.
Playbooks (personal ops memory)
| Tool | What it does |
|---|---|
browser_playbook_list |
List playbooks under .continuum/playbooks/, filter by origin/tag/verifiable. |
browser_playbook_get |
Return one playbook with meta + body sections + workflow JSON. |
browser_playbook_save |
Create/update a playbook (validates frontmatter and required sections). |
browser_playbook_delete |
Remove a playbook + workflow + screenshots. |
browser_playbook_match |
Score-match playbooks against a URL, intent, or task description. |
browser_playbook_run |
Replay a playbook (with self-heal) using provided inputs; recursively executes composes/next chains; returns verdict + evidence. |
browser_playbook_propose_update |
Given a successful trace, create or update the matching playbook. Inputs and steps auto-inferred. |
browser_playbook_secret_check |
Validate that a playbook's type: secret inputs are resolvable (env or .continuum/secrets/). Returns availability only — never values. |
browser_playbook_seed_from_codebase |
Static-analyze the project's frontend (Next.js / Vite / CRA) and emit draft playbooks per route + form. Solves cold-start on in-house apps. |
browser_playbook_diff_accept |
Bless a run's per-step screenshots as the new visual reference; bumps playbook_version. |
browser_playbook_export |
Export one or more playbooks to a single JSON bundle file. Includes embedded base64 screenshots. |
browser_playbook_import |
Import a playbook bundle (file / inline JSON / https URL). Supports overwrite + rewriteOrigin (e.g., staging → production). |
browser_playbook_dashboard |
Generate a self-contained HTML dashboard from the library; opens in the active browser session. |
v1.5 capabilities:
- Typed secrets:
inputs[].type: secretresolves at runtime from${env:VAR}or${secret:name}(reads.continuum/secrets/<name>.txt, which ischmod 0700with an auto-protective.gitignore). Secret values never appear in.continuum/runs/traces or promoted playbook bodies. - Codebase-derived drafts: point
browser_playbook_seed_from_codebaseat this project and it walks your routes (Next.js App/Pages Router, Vite, CRA), extracts forms +data-testids +aria-labels, and emits draft playbooks per route. Password fields auto-typed assecret. - Visual diff regression: during
browser_playbook_run, each step's screenshot is compared (pixelmatch) against the playbook's reference.warnbetween 5–20% diff;fail≥20% (configurable per playbook). Usebrowser_playbook_diff_acceptto bless intentional UI changes.
See docs/superpowers/specs/2026-05-20-playbooks-v1-5-design.md.
v2 capabilities (Sharing & Polish):
- 1Password integration:
inputs[].type: secretrefs accept${1password:vault/item/field}(alias${op:...}). When theopCLI is installed and signed in, values are resolved viaop readat run time and never logged. - Vue + SvelteKit codebase seeding: Nuxt projects (
nuxt.config.*) and SvelteKit projects (svelte.config.*+@sveltejs/kit) are detected bybrowser_playbook_seed_from_codebasein addition to Next.js / Vite / CRA. - Blocked-verdict UX:
browser_playbook_runreturnsverdict: "blocked"with aneeds[]array (one entry per missing required input + ahintper source) instead of throwing. The main agent uses the hints to prompt the user (or fix env) and then retries. - Cross-project playbook bundles:
browser_playbook_exportwrites a single JSON containing markdown + workflow + base64 screenshots;browser_playbook_importrestores them anywhere. Supports overwrite + origin rewrite for staging → production migration. - HTML dashboard:
/mochi:playbook ui(orbrowser_playbook_dashboard) generates a self-contained dashboard with search, tag filters, and inline drill-down per playbook.
See docs/superpowers/specs/2026-05-20-playbooks-v2-design.md.
Combined with the bundled qa-tester subagent and the smart-router rule in
plugins/qa/CLAUDE.md, the playbook library is your personal ops memory —
each browser task you do once becomes replayable, chainable, and
scheduleable. Main Claude routes verifiable + repeatable tasks to the
isolated qa-tester subagent (which returns a pass/fail verdict + evidence)
while operational tasks (multi-step, decisive, may need mid-flow input)
stay in the main conversation and use playbooks as guidance.
Slash commands:
/qa <task>— dispatch the qa-tester subagent for a verifiable browser task./mochi:playbook list|show|run|delete|match [args]— manage playbooks./mochi:schedule-playbook <id>— wire up cron via the host'sscheduleskill./mochi:unschedule-playbook <id>— cancel a scheduled playbook.
See docs/superpowers/specs/2026-05-20-personal-ops-playbooks-design.md
for the full design.
Memory: selector cache (per origin)
| Tool | What it does |
|---|---|
browser_recall_selector |
"Do I already know how to find X on this site?" Returns cached selector or null. |
browser_forget_selector |
Drop a cached entry. |
browser_list_selectors |
Inspect the cache. |
Memory: workflows
| Tool | What it does |
|---|---|
browser_workflow_save |
Persist current session's auto-traced actions as a named workflow. |
browser_workflow_run |
Replay. Cached selector → self-heal by role+name → screenshot on miss. |
browser_workflow_list / _get / _delete |
Manage workflows. |
browser_workflow_export / _import |
Portable JSON (commit alongside your app's tests). |
browser_run_history |
Last N runs of a workflow. |
Compact inspection ladder
Use the smallest inspection tool that can answer the current question:
browser_text {query?, limit?}for page copy, search results, lists, and visible facts.browser_links {query?, limit?}for navigation choices.browser_snapshotfor clickable refs and visible actionable UI.browser_snapshot_queryfor targeted search inside the stored snapshot.browser_snapshot_nodefor the one subtree you need.browser_snapshot {mode:"full", scope:"all", maxBytes:0}only as an explicit last resort.
This keeps Claude Code, Codex, and parallel agents from flooding their context with full-page accessibility trees.
Visual placement loop
browser_snapshot → compact tree with refs + boxes
browser_screenshot → image (viewport / fullPage / elementRef)
↓
agent correlates ref ↔ box ↔ pixel position
↓
browser_click {ref, intent:"…"} ← intent caches the selector
Resize vs. emulate — when to use which
Read this carefully — these two tools are NOT interchangeable:
browser_emulate_viewportchanges the page's real JS layout. It drives CDPEmulation.setDeviceMetricsOverride, so it does changewindow.innerWidth/window.innerHeightand does flipmatchMedia/ CSS media queries. This is the tool you use for responsive and media-query testing — breakpoints, mobile layouts,@mediarules all respond to it.browser_window_resizeonly moves/sizes the OS-level Chrome window. It does NOT affectwindow.innerWidthormatchMedia— the page's JS layout is unchanged. Use it only when you genuinely need real OS window dimensions (e.g. screenshotting the full chrome of a large monitor).
A common past mistake was conflating the two — or assuming
emulate_viewport"only affects screenshots." It does not; it changes JS layout.
| Goal | Tool |
|---|---|
| Test a real responsive layout at iPhone size | browser_emulate_viewport {preset:"iphone-15-pro"} (changes innerWidth/matchMedia, includes touch + UA) |
| Verify a layout breakpoint at exactly 768px wide | browser_emulate_viewport {width:768, height:1024} (media queries respond) |
| Test how the OS window behaves at a real 2560×1440 monitor | browser_window_resize {width:2560, height:1440} (only safe in a session-owned window; JS layout unchanged) |
| Reset back to native | browser_clear_emulation |
emulate_viewport is preferred for layout/responsive testing — it's
deterministic, doesn't disturb anything else, matches Chrome DevTools' Device
Mode, and actually changes what the page's JavaScript sees. window_resize is
for when you genuinely need real OS-level window dimensions.
Exhaustive QA coverage mode
Beyond one-off checks, Mochi can run an exhaustive QA pass (/qa exhaustive)
that enumerates every actionable control with browser_audit_interactives,
drives each one through browser_act_and_observe, gates every page and action
with browser_assert_no_errors, and assigns one of five verdicts to each
control: WORKS, NO-OP (defect), ERROR (defect), NAVIGATES, or
DISABLED. Results are recorded in a verification ledger with
provenance stamping, and a built-in honesty gate refuses to report a run as
"pass" while any control is still UNTESTED/UNCERTAIN — the rule is never "everything
works" but "N of M controls verified — here is each result, and here is what I
could NOT verify and why." Hard-won tooling quirks live in a persistent
tooling-gotchas note so they're never
re-learned.
Memory model
Two layers, stored as plain JSON files under <project>/.continuum/ (no
database, no native bindings).
1) Selector cache — keyed by (origin, intent)
Every browser_click / browser_type call may carry an intent ("click sign in
button", "email field"). On success, the resolved selector is cached at
(origin, intent). The agent can short-circuit discovery by calling
browser_recall_selector before snapshotting:
browser_recall_selector {intent:"click sign in button"}
→ {found:true, selector:'button[aria-label="Sign in"]', last_box:{...}}
browser_click {ref:'button[aria-label="Sign in"]', intent:"click sign in button"}
The cache survives Chrome restarts, project reloads, server restarts.
Mochi MCP 질문
Mochi MCP는 어떤 도구를 제공하나요?
50개 도구를 제공합니다. 예: browser_session_start, browser_session_end, browser_request_attention, browser_navigate, browser_open_tab.
Mochi는 UI의 셀렉터 변경을 어떻게 처리하나요?
엔진이 ARIA 역할과 이름을 기반으로 하는 self-healing 메커니즘을 사용하여, 디자인 변경이나 리팩토링이 발생할 때 셀렉터 캐시를 업데이트합니다.
프로젝트 메모리와 워크플로우 데이터는 어디에 저장되나요?
셀렉터 캐시, 워크플로우, 실행 기록을 포함한 모든 메모리는 <project>/.continuum/ 디렉토리에 순수 파일 형태로 저장됩니다.
브라우저 자동화가 현재 작업 중인 화면을 방해하나요?
아니요, 자동화는 OS 포커스를 뺏지 않습니다. 대신 주의가 필요한 경우 클릭하여 포커스를 맞출 수 있는 알림을 보냅니다.
Claude Code에서 Mochi를 어떻게 설치하나요?
플러그인 marketplace 명령어를 사용하여 Claude Code 세션 내에서 직접 설치할 수 있습니다.