Navvi
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ANTHROPIC_API_KEY | No | Optional API key for Anthropic to enable Haiku vision for navvi_browse. Without it, falls back to claude -p CLI or heuristics. | |
| NAVVI_GPG_PASSPHRASE | Yes | Passphrase for the credential vault (gopass). Required for credential management. Choose any random string. |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| navvi_personaA | Manage browser personas. Actions: create, get, update, list, delete. Create: navvi_persona(action="create", name="mybot", description="GitHub admin", stealth="high") List: navvi_persona(action="list") Get: navvi_persona(action="get", name="mybot") Update: navvi_persona(action="update", name="mybot", purpose="new purpose", profile="Casual tone, uses emoji") Delete: navvi_persona(action="delete", name="mybot") The Personas store config (locale, timezone, stealth, purpose) and track accounts + action history. Each persona maps to a persistent Docker volume (navvi-profile-). Read persona state via resource: persona:///state |
| navvi_accountA | Manage accounts linked to a persona. Actions: add, list, update, delete. Add: navvi_account(action="add", persona="mybot", service="github", email="bot@x.com", creds_ref="gopass://navvi/mybot/github") List: navvi_account(action="list", persona="mybot") Update: navvi_account(action="update", account_id=1, status="blocked", notes="captcha") Delete: navvi_account(action="delete", account_id=1) Accounts track which services a persona has registered on, with credential references (gopass://) and status. |
| navvi_milestoneA | Curated lifetime timeline for a persona — milestones with evidence. Actions: add, list, export, delete. Add: navvi_milestone(action="add", persona="chet", event="Signed up for Reddit", detail="Username: chestertownwilliams. Subscribed to r/selfhosted.", url="https://reddit.com/user/chestertownwilliams", tags="first,reddit,signup", screenshot=true) Import (retroactive): navvi_milestone(action="add", persona="chet", event="Created Outlook account", detail="Email: chester.town.williams@outlook.com", ts="2026-03-27T11:00:00", screenshot_file="/path/to/old-screenshot.png", source="import") List: navvi_milestone(action="list", persona="chet") or navvi_milestone(action="list", persona="chet", tag="reddit", limit=10) Export: navvi_milestone(action="export", persona="chet") — generates full markdown timeline Brief: navvi_milestone(action="brief", persona="chet") — generates persona brief (who am I, my accounts, my email, my history, my writing style). READ THIS BEFORE ACTING AS A PERSONA. Delete: navvi_milestone(action="delete", milestone_id=3) Tags: comma-separated string. Use 'first' tag for firsts (first post, first signup, etc.). Screenshot: if true, captures current browser screen and attaches it. For retroactive imports, use screenshot_file to attach an existing image. Detail: include FULL content — exact post text, comment body, form values. This builds the persona's voice and style for consistency. |
| navvi_contextA | Persistent knowledge store for a persona — what they know. Actions: add, list, search, update, remove, digest, save_digest. Add: navvi_context(action="add", persona="chet", summary="InboxGuard: email deliverability scanner with SPF/DMARC checks", source="https://inboxguard.me/", tags="competitor,inbox-angel") List: navvi_context(action="list", persona="chet") or navvi_context(action="list", persona="chet", tags="competitor") Search: navvi_context(action="search", persona="chet", query="email deliverability", tags="competitor") Update: navvi_context(action="update", context_id=3, summary="Updated finding", tags="competitor,updated") Remove: navvi_context(action="remove", context_id=3) — soft-deletes, included in next digest Digest: navvi_context(action="digest", persona="chet") — returns current summary + undigested entries for LLM synthesis Save digest: navvi_context(action="save_digest", persona="chet", summary="Synthesized knowledge summary...") — stores digest, marks entries processed Milestones = what a persona did. Context = what a persona knows. |
| navvi_startA | Start a Navvi browser container (Firefox + Xvfb + xdotool). Local=Docker, Remote=Codespace. Workflow: navvi_open(url) -> navvi_find(selector) -> navvi_click/navvi_fill -> navvi_screenshot to verify. All input is OS-level (isTrusted:true). If you hit a CAPTCHA you cannot solve (Arkose/FunCaptcha, image puzzles, reCAPTCHA), call navvi_vnc and send the user the noVNC URL so they can solve it manually. |
| navvi_stopA | Stop a Navvi container. Stops all if no persona specified. Firefox profile is preserved in the Docker volume. |
| navvi_statusA | Show current Navvi state -- running containers, API health, active persona. |
| navvi_listA | List available Codespaces for Navvi (remote mode). |
| navvi_openB | Navigate to a URL in the active browser. After navigating, use navvi_find to locate elements on the page, then navvi_click/navvi_fill to interact. |
| navvi_clickA | Click at (x, y) screen coordinates using OS-level xdotool input (isTrusted: true). IMPORTANT: Use navvi_find to get coordinates -- it returns screen-ready (x, y) values. Do NOT use raw JS getBoundingClientRect() -- those are viewport coords that miss the browser chrome offset. |
| navvi_fillA | Click at (x, y) to focus an input field, then type text using OS-level xdotool. Selects existing text before typing to replace any current value. Uses triple-click to select all text in the field (works in all input contexts), then types the new value which replaces the selection. |
| navvi_pressA | Press a keyboard key (Enter, Tab, Escape, Backspace, ArrowDown, etc.). Sends to currently focused element. |
| navvi_dragA | Drag from (x1,y1) to (x2,y2) with interpolated mouse moves. Uses OS-level input -- works on CAPTCHAs and canvases. Get coordinates from navvi_find. |
| navvi_holdA | Press and hold at (x, y) for duration_ms milliseconds. Use for press-and-hold CAPTCHAs. Get coordinates from navvi_find. |
| navvi_mousedownA | Press mouse button at (x, y). Pair with navvi_mouseup for manual hold control. For simple press-and-hold, use navvi_hold instead. |
| navvi_mouseupA | Release mouse button at (x, y). Pair with navvi_mousedown. |
| navvi_mousemoveA | Move mouse to (x, y) without clicking. Useful for hover effects. |
| navvi_scrollC | Scroll the page in a given direction (up, down, left, right). |
| navvi_screenshotA | Take a screenshot of the virtual display. Returns file path to a PNG image -- use Read tool to view it. Use for VISUAL VERIFICATION only (confirming what happened). To get clickable coordinates, use navvi_find instead -- screenshot pixel positions include browser chrome and are not reliable for targeting elements. |
| navvi_urlC | Get the current page URL. |
| navvi_vncA | Get the noVNC URL for live browser view. Share with the user when human intervention is needed: visual CAPTCHAs that require image recognition, OAuth consent screens, or 2FA code entry. The user opens this URL in their real browser to interact directly. |
| navvi_findA | Find element(s) by CSS selector and return screen-ready (x, y) coordinates. THIS IS THE PRIMARY WAY TO GET COORDINATES -- use before navvi_click, navvi_fill, navvi_drag, navvi_mousedown. Automatically corrects for browser chrome offset. Workflow: navvi_find -> get (x, y) -> navvi_click/navvi_fill at those coords -> navvi_screenshot to verify. For dropdowns: navvi_find the button -> navvi_click to open -> navvi_find the options (selector="[role=option]", all=true) -> navvi_click the desired option. |
| navvi_credsA | Manage credentials stored in gopass inside the container. Five actions:
|
| navvi_tabA | Manage browser tabs within a persona. Four actions:
|
| navvi_record_startC | Start recording the browser via screenshot polling. Captures frames in background, assembles to MP4 on stop. |
| navvi_record_stopA | Stop recording and assemble frames into MP4. Optionally trims dead time between actions. |
| navvi_record_gifC | Convert a recorded video to an optimized GIF (1600px wide, 8fps, palette-optimized). |
| navvi_atomicA | Quick reference for atomic browser tools (navvi_click, navvi_find, navvi_fill, etc.). Atomic tools are always available. Call this for a summary of tools and workflow. Example: navvi_atomic() → lists all atomic tools with parameters |
| navvi_flowA | Manage flow recipes — reusable browser workflows that improve over time. Actions: list — list all flows, or filter by domain navvi_flow(action="list") navvi_flow(action="list", domain="outlook.live.com") show — show full detail for a specific flow navvi_flow(action="show", flow="outlook.live.com/read-email") save — store a verified flow recipe (call after navvi_browse prompts you) navvi_flow(action="save", flow="outlook.live.com/read-email", description="Read emails from inbox", steps='[{"action":"navigate","url":"https://outlook.live.com"}, ...]', caveats='["Login required first"]', refs='["outlook.live.com/login"]') delete — remove a flow recipe navvi_flow(action="delete", flow="outlook.live.com/read-email") The Flows are automatically loaded by navvi_browse when it visits a matching domain. High-confidence flows execute via fast path (no screenshots); low-confidence flows serve as guidance while still using visual analysis. |
| navvi_browseA | PRIMARY BROWSING TOOL — use this for ANY web interaction instead of manually calling navvi_open, navvi_find, navvi_click, navvi_fill. Give a natural language instruction and optional URL; it handles navigation, element finding, clicking, typing, and screenshots internally. Examples:
Handles cookie banners, login detection, CAPTCHAs (escalates to VNC), and multi-step flows automatically. Returns screenshots and a step-by-step log. If a stored flow recipe exists for the target domain, it will be used to guide or fast-track execution depending on confidence level. After completion, you'll be prompted to save new flows for reuse. Only fall back to atomic tools (navvi_open, navvi_find, navvi_click) if this tool explicitly asks for guidance. |
| navvi_loginA | Log into a service using stored credentials — use this instead of manually navigating to a login page and calling navvi_creds autofill. Give it a service name (e.g. "tuta.com", "github.com") and it reads gopass credentials, navigates to the login page, fills the form, submits, and verifies login success. Handles 2FA by providing a VNC URL for human intervention. Example: navvi_login(service="tuta.com", persona="default") Requires: an account registered via navvi_account with a creds_ref pointing to a gopass entry. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| signup_flow | Create a new account on a service using a Navvi persona. Structured workflow: check existing accounts, navigate to signup page, fill forms, store credentials in gopass, log the new account. |
| login_flow | Log into a service using stored credentials for a Navvi persona. Reads credentials from persona state and gopass, navigates to login page, fills form, verifies successful login. |
| qa_walk | Walk a web page or flow for QA — screenshot each step, report findings. Navigate to URL, explore the page, take screenshots, and produce a friction report with improvement suggestions. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| personas_list_resource | All personas with account counts and last-used dates. |
| flows_list_resource | All stored flow recipes grouped by domain. |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/fellowship-dev/navvi'
If you have feedback or need assistance with the MCP directory API, please join our Discord server