by Perzian

Mantis review, pricing and verdict

A local browser for agents that returns compact numbered text, not screenshots.

Best for
Developers building browsing agents
Not for
Teams that need canvas, map or drawing-app control
  • Browser control
  • Developer

Should you use Mantis?

Pick Mantis if your agent spends too many tokens on screenshots or accessibility trees for read, navigate and form-fill work on public sites. The author reports 29 to 47 percent fewer input tokens on long tasks. Skip it for canvas apps, or if you want a hosted browser with proxies.

Pages arrive as short numbered text, so an agent clicks by #number without screenshots.

The edge is a compact page view tuned to cut tokens, which a rival could copy, and there is no hosted service or network effect behind it.

Also for

  • AI engineers watching token cost
  • Developers building browsing agents who want smaller observations per step
Show 2 more
  • Claude Code, Codex and Cursor users who want a free local browser tool
  • Teams cutting model-token spend on form-fill and research tasks

Main trade-off

A v0.1 beta benchmarked only on read, navigate and form-fill tasks with two models.

Mantis pricing

MIT licence. Free to install from npm and run on your own machine. The repository lists no paid tier and no hosted service.

Install Mantis

npx -y -p mantis-browser mantis install && claude mcp add mantis -- npx -y -p mantis-browser mantis-mcp

Before you start

  • Node 20 or newer
  • Run mantis install once to fetch Chromium and English OCR data; on a bare Linux server add --with-deps (needs sudo)
  • An MCP client such as Claude Code, Codex or Cursor
  • On native Windows, register it with: claude mcp add mantis -- cmd /c npx -y -p mantis-browser mantis-mcp
  • A display, only if you want ask_human to open a window

Works with

  • Claude Code
  • Codex
  • Cursor
  • Any MCP client

Required runtime

  • Node.js 20 or newer
  • Chromium, fetched by mantis install
  • A display, only for ask_human

Where it runs

  • Desktop
  • CLI

Data it can reach

  • Web pages you open
  • Open tabs and sign-ins in an attached Chrome profile
  • Local files you choose to upload
  • Site memory: hashes, counts and timestamps per site

The permissions this connector asks for, as its own documentation states them.

What Mantis can do

20 actions an agent can call. Open one for its parameters and an example.

openOpens a URL and returns the page as numbered text.

Example call

{"tool":"open","arguments":{"url":"https://example.com"}}

Parameters

ParameterTypeNeededDescription
urlstringRequiredThe address to open.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
readReturns the current page as numbered text; repeat reads say "same as before" and keep the #numbers.

Example call

{"tool":"read","arguments":{"region":"nav"}}

Parameters

ParameterTypeNeededDescription
regionstringOptionalA label substring such as "nav"; if none matches, text inside a region also works.
fullbooleanOptionalUntrimmed bounded excerpt of the page; use offset to get the next excerpt.
offsetnumberOptionalCharacter offset for the next full excerpt.
freshbooleanOptionalExpand regions already seen, for this call only.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
findCase-insensitive search of the whole page text, including trimmed content; returns #numbers with a little local context and scrolls long lists when nothing matches.

Example call

{"tool":"find","arguments":{"text":["Add to cart","Checkout"]}}

Parameters

ParameterTypeNeededDescription
textstring or arrayRequiredThe text to search for, or a list of texts to search in one call.
context_charsnumberOptionalLocal context to return around each match, from 80 to 800 characters.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
forgetClears the region memory so the next read shows everything again.

Example call

{"tool":"forget","arguments":{}}

Returns

FieldTypeDescription
observationstringA confirmation that region memory was cleared.
clickClicks the element with the given #number.

Example call

{"tool":"click","arguments":{"id":12}}

Parameters

ParameterTypeNeededDescription
idnumberRequiredThe #number of the element, from the last read.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
typeReplaces the text of an input and optionally presses Enter.

Example call

{"tool":"type","arguments":{"id":7,"text":"mechanical keyboard","submit":true}}

Parameters

ParameterTypeNeededDescription
idnumberRequiredWhich input to fill.
textstringRequiredThe text to enter, replacing what is there.
submitbooleandefault falseOptionalPress Enter after typing.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
selectChooses an option in a select or combobox; matching ignores case, accents and punctuation.

Example call

{"tool":"select","arguments":{"id":9,"option":"Large"}}

Parameters

ParameterTypeNeededDescription
idnumberRequiredWhich select or combobox to change.
optionstring or arrayRequiredThe option text; a multiple select takes a list and its selection becomes exactly that list.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
fillSets several related fields (text, dropdown, checkbox) in one call and stops with a partial report if a field fails or the page re-renders.

Example call

{"tool":"fill","arguments":{"fields":[{"id":3,"value":"Ada Lovelace"},{"id":4,"value":"ada@example.com"},{"id":5,"value":true}]}}

Parameters

ParameterTypeNeededDescription
fieldsarrayRequiredA list of {id, value} objects; value is text, an option, a list of options, or true/false.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
Show all 20 actions
pressPresses a key; End, Home, PageDown, PageUp, Space and the arrows report how far the page scrolled.

Example call

{"tool":"press","arguments":{"key":"Enter"}}

Parameters

ParameterTypeNeededDescription
keystringRequiredThe key to press, for example Enter or End.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
scrollScrolls the page, or a list, panel or table, or brings an element into view; reports when the page grew.

Example call

{"tool":"scroll","arguments":{"direction":"down"}}

Parameters

ParameterTypeNeededDescription
directionstringdefault downOptionalOne of up, down, left or right.
idnumberOptionalThe #number of an element: alone it scrolls into view, with a direction it scrolls that element's container.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
backGoes back one page in history.

Example call

{"tool":"back","arguments":{}}

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
wait_forWaits up to 10 seconds for text or an element to reach a state, then returns the current observation.

Example call

{"tool":"wait_for","arguments":{"state":"appears","text":"Order confirmed","timeout_seconds":10}}

Parameters

ParameterTypeNeededDescription
textstringOptionalText to wait for.
idnumberOptionalThe #number of an element to wait for.
statestringOptionalOne of appears, disappears, present or enabled (the last two apply to an #id).
timeout_secondsnumberOptionalHow long to wait, at most 10.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
hoverHovers over an element and shows what changed.

Example call

{"tool":"hover","arguments":{"id":15}}

Parameters

ParameterTypeNeededDescription
idnumberRequiredWhich element to hover over.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
uploadSelects local files on a file input; it does not submit the form.

Example call

{"tool":"upload","arguments":{"id":20,"path":"C:/Users/me/report.pdf"}}

Parameters

ParameterTypeNeededDescription
idnumberRequiredWhich file input receives the files.
pathstringOptionalOne local file path. Give exactly one of path, paths or files.
pathsarrayOptionalA list of local file paths.
filesarrayOptionalA list of local file paths (alternative spelling of paths).

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
tabsLists the open tabs, or switches to or closes a tab.

Example call

{"tool":"tabs","arguments":{"action":"switch","id":2}}

Parameters

ParameterTypeNeededDescription
actionstringOptionalOne of list, switch or close.
idnumberOptionalThe tab #number for switch or close.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.
mediaFirst rung of the fallback ladder: lists the numbered images, canvases and charts on the page.

Example call

{"tool":"media","arguments":{}}

Returns

FieldTypeDescription
observationstringA numbered list of images, canvases and charts.
dataExtracts text from an image, SVG or chart (alt text, caption, Chart.js, ECharts or Highcharts values); a table gives its rows.

Example call

{"tool":"data","arguments":{"id":4}}

Parameters

ParameterTypeNeededDescription
idnumberOptionalThe item number shown by read or media.
selectorstringOptionalA CSS selector or #N reference to use instead of id.

Returns

FieldTypeDescription
observationstringThe extracted text or values.
ocrRuns text-only OCR on an image or canvas; meant for when data found nothing.

Example call

{"tool":"ocr","arguments":{"id":5}}

Parameters

ParameterTypeNeededDescription
idnumberOptionalWhich image or canvas to read.
selectorstringOptionalCSS selector for the image or canvas.

Returns

FieldTypeDescription
observationstringThe text recognised in the image.
lookLast resort: returns a PNG of the element (at most 800 px wide) plus text, for spatial or visual comparisons.

Example call

{"tool":"look","arguments":{"id":6}}

Parameters

ParameterTypeNeededDescription
idnumberOptionalWhich element to capture, by number.
selectorstringOptionalCSS selector of the element, used when there is no id.

Returns

FieldTypeDescription
imageimage/pngA PNG of the element, at most 800 px.
textstringText that accompanies the image.
ask_humanHands a CAPTCHA, 2FA, payment or login step to a person in a headed browser window and waits for the page to change; it never solves CAPTCHAs. Only registered when a display is available.

Example call

{"tool":"ask_human","arguments":{"reason":"Please solve the CAPTCHA and sign in","timeout_seconds":300}}

Parameters

ParameterTypeNeededDescription
reasonstringRequiredWhat the person must do.
untilstringdefault URL or content changeOptionalWhen to stop waiting: url_change, selector_gone:<css> or selector_present:<css>.
timeout_secondsnumberdefault 300OptionalHow long to wait.

Returns

FieldTypeDescription
observationstringThe page after the action, as numbered text; elements are addressed by #number.

What Mantis is for

Mantis is an open-source MCP server from Perzian that lets AI agents browse the web as short numbered text instead of screenshots. It runs locally on Node 20 or newer with Chromium, needs no account, and works with Claude Code, Codex, Cursor or any MCP client. Version 0.1.14 shipped on 8 November 2026.

  • Pages as numbered text

    The agent reads a compact numbered view of each page and acts by #number, with no screenshot step.

  • A fallback ladder for visuals

    media, data, ocr and look step from text-only extraction up to a PNG capped at 800 px, used only when read is not enough.

  • Whole-form fill

    fill takes a list of id and value pairs and sets text, dropdown and checkbox fields in one call.

  • Attach to your own Chrome

    The mantis chrome command opens Chrome on its own profile with a local debugging port, and Mantis then drives that browser.

Show all 6 features
  • Human handoff

    ask_human opens a headed window for CAPTCHA, 2FA, payment or login and waits 300 seconds by default; Mantis does not solve CAPTCHAs.

  • Site memory that stores no page text

    Regions already seen are shortened on later reads; the memory holds hashes, counts and timestamps, expires after 30 days and is off with MANTIS_MEMORY=0.

What people use it for

  • Cut the calls on a multi-page task

    In the selected README example the agent needed 11 to 12 tool calls with Mantis against 21 to 29 with the accessibility tree over 5 runs, as the author reports it.

  • Fill a signup or checkout form

    fill takes every field in one call and, if the page re-renders half way, stops and reports what already landed, so the agent does not retype fields.

  • Keep an agent signed in to internal tools

    Sign in once in the profile that mantis chrome opens and the sign-ins persist there; anything logged in there is also open to the agent, so use a profile you are willing to expose.

  • Read the numbers in a chart

    data returns Chart.js, ECharts or Highcharts values as text; ocr and look are for when that finds nothing, and look returns an 800 px PNG at most.

  • Pause for a person on a CAPTCHA or payment

    ask_human pauses the run until the page changes, but it needs a display, so it is not available on a headless server.

Strengths and limits

Strengths

  • The README publishes a benchmark you can re-run from bench/README.md; on the keyed long tasks the author reports answers within one run of the accessibility-tree approach.
  • It runs on your own machine with no account or key, so a first test is one npx command and the MIT source is readable.
  • ask_human and attach mode cover the cases a headless run cannot: a CAPTCHA, a 2FA prompt, or a site where you are already signed in.
  • SECURITY.md states its own limits plainly: Mantis does not sanitise page text, and upload reads any local path.

Limits

  • The README Limitations list calls it a small v0.1.x beta, so there is little track record to judge it by.
  • The benchmark covers only read, navigate and form-fill tasks on public sites with two models, and the screenshot baseline is the maker's own tool, so results for other work are untested (README).
  • There is no canvas input: canvas, WebGL, maps and drawing apps are described only as canvas, with no coordinate click or draw tool (README, Limitations).
  • Page text reaches the agent unsanitised, so prompt injection is possible; this affects agents that browse untrusted sites (SECURITY.md).

Mantis alternatives

SkillWorks withConnects byChecked
Mantis This pageClaude · Codex · CursorMCP11 Nov
KernelPick Mantis if you want a free browser on your own machine that returns compact text; pick Kernel if you need hosted cloud browsers with stealth proxies and CAPTCHA solving.Claude · Cursor · Windsurf · Gemini +1MCP16 Aug
NottePick Mantis if you want one local MCP server and no account; pick Notte if you want cloud browsers plus browser agents and deployable browser functions.Claude · Cursor · WindsurfMCP11 Oct
OlostepScrape, crawl, map, search and answer from the web, as an API, a CLI and an MCP server.Claude · Cursor · Windsurf · VS CodeMCP11 Oct

Mantis facts

Protocol
MCP
Latency class
Fast
Open source
Yes
Maintainer founded
2026

What changed

  • New feature 0.1.14: automatic attach to Chrome on port 9222 source
  • New feature 0.1.12: find scrolls infinite feeds, ratings read as numbers source
  • New feature 0.1.13: attach to a running Chrome source

Questions about Mantis

What does Mantis cost to run?

The maker charges nothing: Mantis is MIT-licensed, published on npm, and the README and setup guide list no paid tier or hosted service (read 11 November 2026). Your own costs are the model tokens your agent uses and the machine that runs Chromium.

Do I need an account or API key to use Mantis?

No. The README and setup guide list no signup or key; you install it with npx and the server runs on your machine. The only downloads are Chromium and English OCR language data during mantis install, and a failed OCR download is only a warning. For offline OCR, point MANTIS_TESSDATA at a folder holding eng.traineddata.

Can Mantis use my signed-in Chrome instead of a fresh browser?

Yes. The mantis chrome command starts Chrome on 127.0.0.1:9222 with a dedicated profile, and since 0.1.14 Mantis attaches on its own while that Chrome is running. Sign in once in that profile and the sign-ins persist. The maker warns that the agent then controls those real tabs and every logged-in session in the profile; set MANTIS_AUTO_ATTACH=0 to always launch a fresh browser.

Is the claim that Mantis beats Playwright MCP backed by a test?

It is the author's claim, backed by a benchmark in the repository that bench/README.md explains how to re-run. With claude-haiku-5-5 on the long tasks, 40 of 42 runs were correct for both approaches, at a median 268k input tokens for Mantis against 506k for the tree. The README discloses that a few tasks were swapped after results, and no independent test is published.

Is it safe to let Mantis read pages I do not trust?

Not by itself. SECURITY.md says Mantis does not sanitise page text, so prompt injection is possible, and the one-time note it sends the MCP client that tool output is untrusted is a hint to the model, not a guarantee. The upload tool reads any existing local file path, so upload only files you mean to disclose. Vulnerabilities go through a private GitHub security advisory.

About Mantis

Mantis is an open-source browser for AI agents, made by Perzian (the package lists Aadit Singal as author). It is a skill, not an app: you register it in an MCP client such as Claude Code, Cursor or Codex, and the agent gets tools to open pages, click, type and fill forms. Instead of screenshots or a full accessibility tree, each page comes back as short numbered text, and the agent acts by number. The repository was created on 14 October 2026 and the current version is 0.1.14.

Read the full background

It runs over stdio as a Node 20+ process that drives Chromium through Playwright, with no account or API key. The tools cover navigation (open, read, find, back, tabs), actions (click, type, select, fill, press, scroll, hover, upload, wait_for), a fallback ladder for images and charts (media, data, ocr, look) and ask_human for CAPTCHA, login and payment steps. An optional attach mode drives your own Chrome on 127.0.0.1:9222. On 11 November 2026 Hokai started the published 0.1.14 package as an MCP server and it listed 20 tools under the same names as the Actions below; no browsing task was run.

The maker's README measures Mantis against Playwright MCP's accessibility-tree view on public sites, using two models, gpt-6-luna and claude-haiku-5-5. On 14 keyed long tasks, the Luna runs answered 35 of 42 correctly with Mantis and 34 of 42 with the tree, at a median of 244k against 345k input tokens. These are the author's figures from a benchmark the repository lets you re-run. The README also says the screenshot baseline is the project's own tool and that a few tasks were swapped after results.

Look elsewhere if you need canvas, WebGL, maps or drawing apps, since Mantis has no coordinate click or draw tool. If you want a hosted browser that does not run on your machine, Kernel and Notte offer cloud browsers over MCP. If you want a finished agent that completes the task for you, look at Browser Use. Playwright MCP, the baseline Mantis measures itself against, is the other local option. Mantis is a v0.1 beta with 14 GitHub stars on 11 November 2026, and the maker states that page text reaches the agent unsanitised. More choices are on the browser skills list.

Version 0.1.13 (5 November 2026) added the attach-to-Chrome mode, and 0.1.14 (8 November 2026) made Mantis attach on its own when Chrome is listening on port 9222.

Sources and guides

More Agent Skills on Hokai

  • AisyncAdvisory file claims and a shared journal for your AI coding agents.
  • CloakroomMasks secrets and personal data before your coding agent sees them.
  • Dryplate MCPLocal image tools for agents: convert HEIC, resize, strip metadata.
  • Mitra MCPLets Claude or ChatGPT ask your Mitra assistant to make calls and report back.
  • Resend MCP ServerOfficial MCP server that lets an AI agent send mail and work Resend inboxes
  • Personal Agent ProtocolOpen standard for how personal AI agents sign in and act for customers.