Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
ANTHROPIC_API_KEYNoOptional API key for Anthropic to enable Haiku vision for navvi_browse. Without it, falls back to claude -p CLI or heuristics.
NAVVI_GPG_PASSPHRASEYesPassphrase for the credential vault (gopass). Required for credential management. Choose any random string.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
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

NameDescription
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 profile field stores voice, phrases, and writing style notes for the persona. This gets injected into generate_brief() so sessions adopt the right tone.

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:

  • "list": show available entries (no secrets)

  • "get": retrieve a non-secret field (username, url, email — refuses password)

  • "generate": create a new credential with a random password that NEVER leaves the container. Requires entry + username. Optional length (default 24). Use this for signups.

  • "import": bulk-import credentials from a JSON file on the host. Requires file_path pointing to a JSON array of {entry, username, password} objects. File is read and deleted after import.

  • "autofill": fill a login form from gopass — password goes gopass → xdotool → browser, NEVER in this response.

navvi_tabA

Manage browser tabs within a persona. Four actions:

  • "list": list all open tabs with handle, url, and title

  • "new": open a new tab (optionally navigate to url). Switches to the new tab.

  • "switch": switch to a tab by handle

  • "close": close a tab by handle (cannot close the last tab)

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 flow parameter uses the format "domain/action-name". Steps, caveats, and refs are JSON strings (arrays).

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:

  • navvi_browse(instruction="search for 'Python FastMCP'", url="https://duckduckgo.com")

  • navvi_browse(instruction="click the first link in the results")

  • navvi_browse(instruction="accept cookie banners and screenshot the clean page", url="https://example.com")

  • navvi_browse(instruction="read the inbox and list unread emails", url="https://app.tuta.com")

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

NameDescription
signup_flowCreate 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_flowLog 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_walkWalk 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

NameDescription
personas_list_resourceAll personas with account counts and last-used dates.
flows_list_resourceAll 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