TestivAI
NPM · @TESTIVAI/MCP
Local-first visual regression for AI agents: verdicts, diff images, explain_snapshot. No API key.
Available components
Last scanned (6 hours ago)
Scores higher than 99% of npm servers
Category Testing and QA
Recent critical change
CVE-2026-102828 affects this package (6 Oct 2026). See the changelog before you install this server.
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security98
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- No install/post-install scripts declared.Pass
- 57 of 163 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency100
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to testivai/testivai-oss). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 0 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability80
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 1381 tokens (~172/item across 8 items; 8 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 8 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 8 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 4 Nov 26 0
- Stability: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 0.9.1 → 0.9.2 functional
- 3 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- 2 Nov 26 −10
- Malware scan: pass → unverified ▼ security
- CVE-2023-54404 no longer affects this package ▲ security
- Known CVEs: fail → pass ▲ security
- Package version: 0.9.0 → 0.9.1 functional
- 27 Oct 26 +1
- Stability: 0.97 → pass security
- 26 Oct 26 −1
- Stability: pass → 0.97 functional
- 24 Oct 26 −5
- CVE-2023-54404 affects this package: high ▼ security
- Known CVEs: pass → fail ▼ security
- 20 Oct 26 0
- Stability: 0.97 → pass security
- 19 Oct 26 −1
- Stability: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Schema quality: pass → fail ▼ functional
- Stability: pass → 0.97 functional
- Package version: 0.8.3 → 0.9.0 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Nov 2026 · Analysed npm/@testivai/mcp@0.9.2
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | npm |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | testivai/testivai-oss |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/testivai/testivai-oss/.github/workflows/release.yml@refs/heads/main |
| Rekor log index | 3691609653 |
| Predicate type | SLSA build provenance https://slsa.dev/provenance/v1 |
| Subject digest | sha512:090eec86ef6956d3b6c590edb3874828b79ec79b799100182beb8658a033366454d0683ab7e0c42dc846663761dbcce9ae70837b8956679594e0f362b |
Background: How many MCP packages publish verified provenance →
Dependencies 163 packages
| Packages resolved | 163 |
|---|---|
| Stale | 57 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
approve_all Approve all pending snapshots as baselines ~55
Promote every pending capture under .testivai/temp/ to committed baselines (same as `testivai approve --all`). Only run this after a reviewer has confirmed the changes; then commit .testivai/baselines/.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
approve_snapshot Approve one snapshot as the new baseline ~64
Promote .testivai/temp/<name>/ to the committed baseline (same as `testivai approve <name>`). Only approve changes a reviewer has confirmed are intended; then commit .testivai/baselines/.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Snapshot name to approve |
No output schema declared.
No examples provided.
explain_snapshot Explain what changed in one snapshot ~99
Layered evidence for one snapshot: pixel regions with bounding boxes, element attribution (which selectors shifted vs changed, whole-page shift detection), the DOM/style signal, and interpretation guidance. Use this to explain WHY a diff happened — pair with get_diff for the images. For a missing baseline (no capture this run) it returns status "missing", the committed baseline files and what to check instead.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | Snapshot name from the results |
No output schema declared.
No examples provided.
get_diff View snapshot diff images ~340
Return the baseline, current, and diff images for one changed snapshot so you can see what changed visually: the full page downscaled to fit (it shows where the changes are), then, when it had to be downscaled, each changed region cropped at native scale with 32 px around it and as wide as the page (up to 1280 px), so you can read text, wrapping and clipping there (up to 3 crops, each at most 1280×1024 px and 2,000,000 px in all; nearby regions share a crop, changes come before shifts, a wider area is sampled at 1/2 scale or smaller, and a taller one shows its top rows). Pass `region` (an index the response lists) for another region, or `y` and `height` for any band of the page: those return only that crop; for a missing baseline (no capture this run), only the committed baseline image, since there is no current capture. Use get_report / get_visual_results first to find snapshot names.
| Name | Type | Req | Description |
|---|---|---|---|
| height | integer | – | Rows of the band from y (default: what one crop shows, 1024 at native scale); a taller band shows its top rows and says where to continue |
| name | string | yes | Snapshot name from the results |
| region | integer | – | Index of one of the snapshot's regions, as get_diff lists them (results.json order): returns only that region, cropped at native scale |
| y | integer | – | Top of a full-width band of the page, in pixels: returns only that band, at native scale |
No output schema declared.
No examples provided.
get_report Get the raw visual report (results.json) ~58
Return the machine-readable results.json payload verbatim (summary + per-snapshot status, diff %, DOM signal, and region→selector attribution, plus missingBaselines: committed baselines with no capture this run). Parse this instead of scraping CLI output.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_snapshot_diff View snapshot diff images ~341
Return the baseline, current, and diff images for one changed snapshot so you can see what changed visually: the full page downscaled to fit (it shows where the changes are), then, when it had to be downscaled, each changed region cropped at native scale with 32 px around it and as wide as the page (up to 1280 px), so you can read text, wrapping and clipping there (up to 3 crops, each at most 1280×1024 px and 2,000,000 px in all; nearby regions share a crop, changes come before shifts, a wider area is sampled at 1/2 scale or smaller, and a taller one shows its top rows). Pass `region` (an index the response lists) for another region, or `y` and `height` for any band of the page: those return only that crop; for a missing baseline (no capture this run), only the committed baseline image, since there is no current capture. Use get_report / get_visual_results first to find snapshot names.
| Name | Type | Req | Description |
|---|---|---|---|
| height | integer | – | Rows of the band from y (default: what one crop shows, 1024 at native scale); a taller band shows its top rows and says where to continue |
| name | string | yes | Snapshot name from the results |
| region | integer | – | Index of one of the snapshot's regions, as get_diff lists them (results.json order): returns only that region, cropped at native scale |
| y | integer | – | Top of a full-width band of the page, in pixels: returns only that band, at native scale |
No output schema declared.
No examples provided.
get_visual_results Get visual test results ~400
Read the latest TestivAI visual regression results (visual-report/results.json). Returns a per-snapshot verdict combining the pixel diff with the DOM and computed-style signals. A pixel diff is likely render noise when the DOM and the computed styles both match and the diff is small and scattered; a diff whose DOM and computed styles match but that is concentrated in one area or over 1% of pixels gets its own verdict, not noise: it is a bad capture or a change the style check does not cover (size, overflow, transform, images…), so look at the diff (get_diff) before approving; when the environment the snapshot was captured in changed since the baseline (a browser build, OS or distro, device scale, capture method…) and the DOM and computed styles match, the verdict is rendering drift: the machine changed, not the page, never noise; when a web font or stylesheet failed to load in the current capture or the baseline (captureHealth), the verdict is unhealthy capture, said before anything else: a glitch of the capture or a broken asset, never noise even when the DOM and computed styles match, and never to be approved as a baseline; a style-only change (identical DOM, different computed styles) is a real change, not noise, and so is any DOM change — both need human review. When the styles were not compared (style check unavailable), the verdict says so and does not call the diff noise: with an identical DOM it could be render noise or a stylesheet-only change, so look at the diff (get_diff) before approving. Missing baselines (committed baselines that got no capture this run: a test removed, renamed or skipped, or one that failed before it captured) get their own line: there is nothing to approve, and an intended removal deletes the baseline directory. Run the test suite first (e.g. `npx playwright test`) if results are stale or missing.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
list_baselines List committed baselines ~24
List the snapshot baselines committed under .testivai/baselines/.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
How do I install the TestivAI MCP server?
TestivAI runs locally as an npm package, launched with npx -y @testivai/mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
npm · @testivai/mcp
claude mcp add ai-testiv-mcp -- npx -y @testivai/mcp
What is the TestivAI MCP server?
TestivAI is an MCP server listed in the public MCP registry as ai.testiv/mcp. Local-first visual regression for AI agents: verdicts, diff images, explain_snapshot. No API key. This page covers its npm package (@testivai/mcp).
Is the TestivAI MCP server safe to use?
TestivAI scores 96 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. It declares no install or post-install scripts. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the TestivAI MCP server expose?
TestivAI exposes 8 tools: get_visual_results, get_diff, get_snapshot_diff, get_report, approve_snapshot, and 3 more. Their descriptions and schemas cost roughly 1,381 tokens of context every time the server is loaded.
Is the TestivAI MCP server still maintained?
TestivAI is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the TestivAI MCP server under?
TestivAI declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.