Atlas / MCP servers / fellowship-dev / navvi

navviBLOCK

mcp/fellowship-dev/navvi

Turn a browser task into a reusable scraper.

Verdict
BLOCK
Grade
D
Trust score
64 /100
Exposed tools
7 7r · 0w · 0d
Transport
—
License
MIT
Stars
10
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Navvi

Give it to your agent. Get a scraper you can run forever.

Install · Why Jev · How it works · For agents · Choosers

  • Your agent asks in plain words. navvi "extract the title, price and availability" .
  • Navvi compiles a scraper, fast and accurately. Code finds the candidates on the

page; a model only picks among them. With Jev those picks are typed, cheap and several times faster than Haiku.

  • Re-runs make zero LLM calls. The compiled scraper is a JSON file of selectors

and fingerprints. Run it in cron, in CI, on Apify.

  • It heals itself when the site changes. A field that moved is found again and

the scraper is updated; a redesign is reported, never guessed.

Why use Jev

A scraper compiler makes a lot of small decisions: which element is the price, which control to click next, is the search done. Navvi never asks a model to write a selector or code; it enumerates the options and asks for a pick. That is exactly the shape Jev is built for

Read from source at commit be29e766a000OBSERVED · 2026-10-10
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add navvi --env AI_GATEWAY_API_KEY=${AI_GATEWAY_API_KEY} --env TYPESAFE_API_KEY=${TYPESAFE_API_KEY} -- npx -y [email protected]
claude-desktop
{
  "mcpServers": {
    "navvi": {
      "command": "npx",
      "args": [
        "-y",
        "[email protected]"
      ],
      "env": {
        "AI_GATEWAY_API_KEY": "${AI_GATEWAY_API_KEY}",
        "TYPESAFE_API_KEY": "${TYPESAFE_API_KEY}"
      }
    }
  }
}
03

Exposed tools (7)

7 read · 0 write · 0 destructive.

ToolRiskDescription
_9livesread9lives
namereaddescription
precio_ofertareadPrecio Oferta
product_namereadthe product
stock_totalreadunits in stock
tagsreadTags associated with the quote
titlereadtoken: unsafe
04

Trust audit

BLOCKgrade D · trust 64/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryWARN
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)FAIL
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (8 observation(s))
Network
declared (6 observation(s))
Shell
declared (4 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
src/browser/snapshot.ts:67
new Function("window", SNAPSHOT_SOURCE)(sandbox);
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHPrompt injection · prompt.override · CWE-94, CWE-1427
evals/injection/REPORT.md:25
97.5% recall at 1% FPR and AUC 0.998 on Meta's private direct-jailbreak
Why it matters. asks the agent to drop prior instructions or safety
Fix. remove the instruction
MEDIUMInventory / provenance · inv.binary · CWE-1104
src/navigate/trace.ts
trace.ts
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
MEDIUMNetwork egress · net.beacon_words · CWE-200, CWE-319
src/guard/rules.ts:163
id: "exfiltration",
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
tests/prompt.test.ts:50
expect(looksLikeCredential("use sk-ant-a1b2c3d4e5f6g7h8i9j0k1l2m3 for auth")).toBe("token-looking string");
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/secrets-bundle.test.ts:264
const SECRET = "hunter2-sealed-value";
LOWInventory / provenance · inv.suspicious_name · CWE-1104
tests/fixtures/compile/detail-payload.json
detail-payload.json
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInventory / provenance · inv.suspicious_name · CWE-1104
tests/fixtures/verify/payload-900201.json
payload-900201.json
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInventory / provenance · inv.suspicious_name · CWE-1104
tests/fixtures/verify/payload-900202.json
payload-900202.json
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInventory / provenance · inv.suspicious_name · CWE-1104
tests/fixtures/verify/payload-900203.json
payload-900203.json
Why it matters. member named after an attack tool
Fix. remove or justify
LOWInventory / provenance · inv.suspicious_name · CWE-1104
tests/fixtures/verify/payload-product.html
payload-product.html
Why it matters. member named after an attack tool
Fix. remove or justify
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
evals/injection/run.ts:22
import { sanitizeText } from "../../src/guard/index.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
evals/injection/run.ts:23
import { JEV_PRICE_PER_MILLION_INPUT_USD, TypeSafeEvaluationModel } from "../../src/chooser/jev.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/heuristics/rules/bind.ts:2
import { declares, declaredTypes } from "../../declared/json.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/heuristics/rules/bind.ts:3
import { normalize } from "../../util/text.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/heuristics/rules/investigate.ts:2
import { normalize } from "../../util/text.js";
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/crawler.test.ts:110
expect(guard("http://169.254.169.254/latest/meta-data/")).toBe(false);
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/policy.test.ts:68
it.each(["file:///etc/passwd", "http://169.254.169.254/", "http://localhost:9222/json", "javascript:alert(1)", "http://box.internal/", "http://10.0.0.5/", "http://[::1]/"])(
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
tests/policy.test.ts:134
for (const ip of ["10.0.0.5", "172.16.0.1", "192.168.1.1", "169.254.169.254", "::1", "::ffff:10.0.0.5", "::ffff:a00:5", "fe80::1", "fd00::1"]) expect(isPrivateAddress(ip), ip).toBe(true);
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/cli.test.ts:100
const route = routes[new URL(req.url ?? "/", "http://127.0.0.1").pathname];
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/cli.test.ts:113
ok({ baseUrl: `http://127.0.0.1:${port}`, close: () => new Promise((r) => srv.close(() => r())) });
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/cli.test.ts:386
expect(await main(["--mode", "record", "--fields", "a", "http://127.0.0.1:9/x"], io)).toBe(2);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/compile.test.ts:391
const base = "http://127.0.0.1:8080/fixtures/python-jobs.html";
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/compile.test.ts:393
{ id: "k1", selector: "a.next", text: "Next", href: "http://127.0.0.1:8080/fixtures/python-jobs.html?page=2", count: 1 },
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
zod, @types/node, tsx, typescript
Why it matters. 4 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: instruction_override, no_behavioural_pass.

Audited 2026-10-10 · audit v0.4.1 · source sha be29e766a000full audit observations/trust-audit/mcp-server/fellowship-dev__navvi.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-10be29e766a000BLOCKD64first audit
06

Questions

What is the navvi MCP server?

Turn a browser task into a reusable scraper.

What tools does navvi expose?

7 in total: 7 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is navvi safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (64/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does navvi need?

It reads AI_GATEWAY_API_KEY and TYPESAFE_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How current is this page?

The grade is for one exact copy of the source (be29e766a000), read on 2026-10-10. The repository is watched and re-audited when it changes.

Advertisement