Applitools
NPM · @APPLITOOLS/MCP
Create, update, review, and resolve visual tests with Applitools Eyes across any supported SDK.
Available components
Last scanned (21 hours ago)
Scores higher than 50% of npm servers
Category Testing and QA
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
- 44 of 151 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency32
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Licence could not be checked: the licence is shipped as a file inside the package, not declared as a standard (SPDX) licence identifier, so we cannot tell whether it is OSI-approved.Unverified
- Actively maintained (last published 1 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability74
- 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 9387 tokens (~391/item across 24 items; 22 tools + 2 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 Management57
- Stability check failed: the tool surface changed between 0.5.4 and 0.10.1: 3 tool removals, 0 breaking changes, 18 additions. See how to fix → Fail
Tool Coverage99
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 98% of tool parameters carry a description.Partial
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 22 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 23 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.
- 3 Nov 26 +15
- Malware scan: unverified → pass ▲ security
- 2 Nov 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 0.10.0 → 0.10.1 functional
- 1 Nov 26 0
- Stability: fail → 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.2 → 0.10.0 functional
- 29 Oct 26 0
- Stability: fail → 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
- 27 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 26 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 0.9.0 → 0.9.1 functional
- 25 Oct 26 0
- Stability: fail → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Package version: 0.8.9 → 0.9.0 functional
- 19 Oct 26 −4
- Stability: pass → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Stability: pass → fail ▼ security
- GHSA-rgj7-g3m4-5g8c no longer affects this package ▲ security
- GHSA-wq5f-xc86-pv6w no longer affects this package ▲ security
- GHSA-f88m-g3jw-g9cj no longer affects this package ▲ security
- Known CVEs: fail → pass ▲ security
- Schema quality: 267 → 391 ▼ functional
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: 100 → unverified ▼ functional
- Schema quality: good → excellent functional
- Package version: 0.5.4 → 0.8.9 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/@applitools/mcp@0.10.1
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | npm |
Background: How many MCP packages publish verified provenance →
Dependencies 151 packages
| Packages resolved | 151 |
|---|---|
| Stale | 38 |
| No linked repository | 6 |
| 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 →
eyes_add_checkpoints_to_test ~225
Setup step: add eyes.check() visual checkpoints to an existing Playwright test file. Edits source, not results.
| Name | Type | Req | Description |
|---|---|---|---|
| activeFile | string | – | Path to the currently active file or folder in the IDE (optional). Used to improve framework detection in Node.js monorepos by finding the nearest package.json relative to the active context. |
| fileContent | string | – | Test file content (optional if filePath provided or if IDE provides it) |
| filePath | string | – | Path to the test file that will be edited (optional if fileContent provided) |
| selection | object | – | Selected code range from IDE (pass if provided to get better context, optional if not provided will process entire file) |
| workspaceRoot | string | – | Workspace root directory (optional, defaults to current directory). If the workspace root is a Node.js monorepo (contains a package.json with a "workspaces" field), ask the user which package they wa… |
No output schema declared.
No examples provided.
eyes_inspect_changed_areas ~270
Coarse diff regions for a step, clustered from raw pixel-level differences. Each region includes a diffCount. Already reflects any match regions added during resolution — a masked area no longer shows up here. Run this before fetching any images or DOM data for a step. Resolution can happen between calls, so never reuse an earlier result in this conversation — call it again. A low-level primitive: for a driven step-level review, call eyes_review_progress with scope: "step" instead — it calls this internally for every changed area.
| Name | Type | Req | Description |
|---|---|---|---|
| rect | object | – | Optional crop/filter rectangle in pixels. Use image sizes from eyes_inspect_steps to construct it (e.g. top quarter of a 1020×600 image = {left:0,top:0,width:1020,height:150}). |
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| stepIndex | integer | yes | Zero-based index of the step, as returned by eyes_inspect_steps |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_inspect_dom ~259
Export a DOM capture as JSON, saved to a file. `domId` comes from eyes_inspect_steps (baseline.domId or checkpoint.domId per step). Use to inspect exact computed styles/structure, or to locate an element's rect/id for use elsewhere (e.g. as an eyes_inspect_history nodeId). Returns a file path — pass it directly to the Read tool, or search it with eyes_inspect_dom_search rather than writing an ad-hoc script.
| Name | Type | Req | Description |
|---|---|---|---|
| domId | string | yes | Baseline or checkpoint domId from eyes_inspect_steps |
| rect | object | – | Optional crop/filter rectangle in pixels. Use image sizes from eyes_inspect_steps to construct it (e.g. top quarter of a 1020×600 image = {left:0,top:0,width:1020,height:150}). Don't pad it. |
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_inspect_dom_diff ~541
Structural DOM diff between a step's baseline and checkpoint. `rect`, if given, only filters the output, not the comparison itself. Entries are tagged `changed`/`new`/`missing`/`displaced`. Already omits any structural difference that doesn't correspond to an actual visual diff under the step's current match settings/regions — masking a change elsewhere no longer produces DOM-diff noise. Always run this for a step before concluding a visual diff is rendering noise, and before summarizing large diffs (which are often caused by displacement — this reveals the root cause directly). The diff is computed server-side and this call may take up to ~20 seconds before responding — that is normal, do not abort early; if the call is interrupted anyway, the computation continues server-side — call this tool again with the same arguments and it resumes, usually instantly. A large diff can outlive the wait budget, in which case the result is `{"status":"computing","taskId",...}` instead of the diff — always follow its `next` field exactly (re-call this tool with the same arguments plus that taskId); the diff is ONLY available through that follow-up call, never by inferring it from images or prior context. If a diff here is the exact same underlying change you've already recorded elsewhere in this scenario, eyes_review_diff_report's `sameAs` argument lets you skip straight to reviewing just the checkpoint image for it. Resolution can happen between calls, so never reuse an earlier result in this conversation — call it again.
| Name | Type | Req | Description |
|---|---|---|---|
| rect | object | – | Optional crop/filter rectangle in pixels. Use image sizes from eyes_inspect_steps to construct it (e.g. top quarter of a 1020×600 image = {left:0,top:0,width:1020,height:150}). |
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| stepIndex | integer | yes | Zero-based index of the step, as returned by eyes_inspect_steps |
| taskId | string | – | ONLY a taskId from a prior {"status":"computing"} response for the same sessionUrl/stepIndex — from this tool or from eyes_inspect_evidence's composed `domDiff` — resumes checking that computation in… |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_inspect_dom_search ~404
Search a DOM capture file (written by eyes_inspect_dom) for elements matching a boolean predicate — always use this instead of writing an ad-hoc script (Python/Node/jq/grep/manual JSON.parse) to search a capture. Full predicate grammar and examples: read the "eyes-inspect://dom-search-grammar" resource. Condensed cheat-sheet below for clients that don't fetch resources. Searches a DOM capture file (written by eyes_inspect_dom) for elements matching a boolean predicate, printing one compact line per match, indented by tree depth. Predicate kinds (combine with 'and'/'or'/'not' and parentheses): - Property comparison: tagName = 'DIV', attributes.class contains 'btn', rect.width > 200, style.display != 'none', attributes.href starts-with 'https://', tagName =~ /^H[1-6]$/, attributes.type in ('button','submit') - Geometry: bounds contains 400,300 | bounds contains 0,0,500,200 | bounds intersects node 12 | bounds contained-by node 12 - Relationship: child-of (tagName = 'UL'), descendant-of node 5, sibling-of node 7 - Shortcut keywords: image, gif, logo, button, hidden (and others) - Reference another element by its 'id' field with 'node <id>' Values with spaces must be single-quoted; string comparisons are case-insensitive. Every matched element also exposes a virtual 'text' property (its own concatenated text content).
| Name | Type | Req | Description |
|---|---|---|---|
| filePath | string | yes | A file path previously written by eyes_inspect_dom |
| predicate | string | yes | Boolean predicate, e.g. "tagName = 'HEADER'" or "child-of (tagName = 'UL') and tagName = 'LI'" |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_inspect_evidence ~669
Everything needed to review a step's changed areas, in one call: for each area, the image diff (checkpoint with differences highlighted in pink) plus the baseline and checkpoint screenshots, fetched together. Pass EVERY area you still have to review in a single call's `areaRects` — one call per area is exactly what this tool exists to avoid. Pass each rect exactly as eyes_review_progress gave it to you — do NOT pad it, the server pads it and clamps it to each image. Prefer this over calling eyes_inspect_image_diff and eyes_inspect_image separately; it is what eyes_review_diff_report's gate checks for. It also returns the whole step's structural DOM diff under `domDiff` and the match regions currently in effect under `regions`, so do not call eyes_inspect_dom_diff or eyes_inspect_regions separately for this step — the one exception is a `domDiff` or `regions` reporting `status: "computing"` or `status: "error"` (with the failure's own message under `error`), whose own `next` says where to pick it up. The composed `domDiff` waits only briefly, so `status: "computing"` is common and expected here — the images ship without waiting for it; follow its `next` to eyes_inspect_dom_diff, which is where the diff is waited out. Returns `evidence`, one entry per area in the order asked for, each with a labelled file path per image, plus the images themselves for clients that render them — read each `path` only for an image whose `inline` is false, and `notInlined` says why it was not. Inlined images arrive as image blocks in the same order as the `inline: true` entries, reading `evidence` top to bottom; `inlining` reports how much of the budget the response spent. Each image carries the `rect` it was actually cropped at: the two sides of a step can differ in size, so the crops are near-identical but NOT guaranteed equal — compare by content, and check the rects before reading anything into a difference in position or extent. Any image this step cannot produce for an area is lis…
| Name | Type | Req | Description |
|---|---|---|---|
| areaRects | array | yes | Every changed area of this step you still need evidence for — from eyes_inspect_changed_areas or eyes_review_progress, verbatim and unpadded. Up to 7 per call; if a step has more, review these first… |
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| stepIndex | integer | yes | Zero-based index of the step, as returned by eyes_inspect_steps |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_inspect_history ~302
For each given node id, a changelog of non-empty diffs against prior runs of the same test scenario and environment, keyed by node id. Use before concluding whether a changed or drifted element is dynamic (recurring changes) versus a one-time real change — never guess this from a single run alone. An empty array for a node means no change was found across however much history was searched; that alone is not proof of anything either way. Each historic comparison is computed server-side, so this call can take up to ~20 seconds per comparison — do not abort early; if the call is interrupted or reports a still-computing comparison, call it again with the same arguments and the walk resumes from cache.
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | – | Target number of non-empty diffs to collect per node; defaults to 3 |
| nodeIds | array | yes | DOM node ids to check, from a prior eyes_inspect_dom or eyes_inspect_dom_diff result |
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| stepIndex | integer | yes | Zero-based index of the step, as returned by eyes_inspect_steps |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_inspect_image ~219
Export a baseline or checkpoint screenshot as a PNG, cropped to `rect` if provided. `imageId` comes from eyes_inspect_steps (baseline.id or checkpoint.id per step). Returns a file path, self-identifying by imageId and crop rect — pass it directly to the Read tool.
| Name | Type | Req | Description |
|---|---|---|---|
| imageId | string | yes | Baseline or checkpoint image id from eyes_inspect_steps |
| rect | object | – | Optional crop/filter rectangle in pixels. Use image sizes from eyes_inspect_steps to construct it (e.g. top quarter of a 1020×600 image = {left:0,top:0,width:1020,height:150}). |
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_inspect_image_diff ~265
Export the checkpoint screenshot with visual differences highlighted in pink, cropped to `rect` if provided. Returns a file path — pass it directly to the Read tool to view the image. Pad a changed-area rect by 10px on every side before requesting it here; the region may exceed the image bounds, which is fine. Already reflects any match regions added during resolution — a masked area is no longer highlighted. Resolution can happen between calls, so never reuse an earlier result in this conversation — call it again.
| Name | Type | Req | Description |
|---|---|---|---|
| rect | object | – | Optional crop/filter rectangle in pixels. Use image sizes from eyes_inspect_steps to construct it (e.g. top quarter of a 1020×600 image = {left:0,top:0,width:1020,height:150}). |
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| stepIndex | integer | yes | Zero-based index of the step, as returned by eyes_inspect_steps |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_inspect_regions ~269
The match regions currently in effect for a step (ignore/strict/layout/dynamic/etc.), optionally filtered to those intersecting `rect` on either side. Returns `{ regions, codedRegions }`: `regions` are the regions defined on the step's baseline, or changed by a reviewer through resolution (a domSelector present on one side but empty on the other means that side's anchor is stale, or its target genuinely doesn't exist there); `codedRegions` are regions provided by the test code itself, keyed by regionId instead.
| Name | Type | Req | Description |
|---|---|---|---|
| rect | object | – | Optional crop/filter rectangle in pixels. Use image sizes from eyes_inspect_steps to construct it (e.g. top quarter of a 1020×600 image = {left:0,top:0,width:1020,height:150}). |
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| stepIndex | integer | yes | Zero-based index of the step, as returned by eyes_inspect_steps |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_inspect_sessions ~255
List sessions in an Applitools Eyes batch plus batch-wide stats. `filter` narrows to unresolved/unsaved/mismatching sessions; `format` shapes the output (`full` default: stats+session list; `stats`: stats only; `scenarios`: deduplicated, sorted session names only). A low-level primitive: for reviewing or resolving a batch's results, call eyes_review_progress with scope: "batch" instead — it drives the full investigation and calls this internally.
| Name | Type | Req | Description |
|---|---|---|---|
| batchUrl | string | yes | Eyes batch URL: https://eyes.applitools.com/app/test-results/{batchId}/?accountId=... (a trailing /{sessionId}[/steps/{N}] is fine too and is ignored — pass a session/step URL here as-is, no need to… |
| filter | string | – | Narrow to sessions matching this state — "mismatching" keeps sessions with at least one step that's non-matching, missing a checkpoint, or new |
| format | string | – | Shape of the response; defaults to "full" |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_inspect_steps ~205
Session summary (sessionId, sessionName, appName, status, isUnsaved, isAborted, environment, startedAt) plus every test step with baseline/checkpoint image IDs, domIds, sizes, match status (isMatching), resolution, and per-step isUnsaved. A low-level primitive: for reviewing or resolving a session's results, call eyes_review_progress with scope: "session" instead — it drives the full investigation and calls this internally. Call this directly only when you need raw step data outside a driven review, e.g. an image id for eyes_inspect_image.
| Name | Type | Req | Description |
|---|---|---|---|
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_resolve_checkpoint ~425
Marks a step's checkpoint image as accepted or rejected, per `action` — see its own description for what each one does to the baseline. Only call this once the step's differences have actually been investigated and judged (see the eyes_inspect_* tools). By default also accepts (or rejects) every other still-unresolved step that genuinely shares this step's diff, across this session and same-scenario siblings — see propagate; a candidate that already has its own accept/reject decision is left alone. A low-level primitive: for a driven review that also resolves what it finds, use eyes_review_progress with mode: "resolve" instead — it calls this deterministically from its own findings. Call this directly only for a one-off manual decision outside that review.
| Name | Type | Req | Description |
|---|---|---|---|
| action | string | yes | Which decision to mark. "accept": its baseline image will be replaced by the checkpoint the next time eyes_resolve_save runs. "reject": its baseline image is retained. |
| propagate | string | – | Which other steps also get this exact change, applied together in the same tool call. Omitted (default): every other step of this session, plus every step of every other session sharing this session'… |
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| stepIndex | integer | yes | Zero-based index of the step, as returned by eyes_inspect_steps |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_resolve_regions ~639
Adds/removes/updates a step's ignore or match regions, with every regionOp's ids/rects read against the BASELINE or CHECKPOINT image/DOM per `target` (mapped onto whichever side the step's current resolution actually needs). Does not itself change accept/reject. Propagates by default (see propagate) since masking confirmed-dynamic content applies regardless of a sibling's own accept/reject verdict. Returns one entry per touched step, each listing the regions actually changed by each input regionOp (a clear op is reported as the concrete regions it removed). A low-level primitive: for a driven review that also resolves what it finds, use eyes_review_progress with mode: "resolve" instead — it calls this deterministically from its own findings. Call this directly only for a one-off manual fix outside that review.
| Name | Type | Req | Description |
|---|---|---|---|
| propagate | string | – | Which other steps also get this exact change, applied together in the same tool call. Omitted (default): every other step of this session, plus every step of every other session sharing this session'… |
| regionOps | array | yes | A compact match-region change: (+|-)<matchLevel>-(<rect>|<id>). matchLevel, strictest to loosest: strict (near pixel-perfect), ignorecolors (color-only drift tolerated), layout (content may change bu… |
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| stepIndex | integer | yes | Zero-based index of the step, as returned by eyes_inspect_steps |
| target | string | yes | Which side every regionOp's ids/rects are read against. "baseline": the BASELINE image/DOM. "checkpoint": the CHECKPOINT image/DOM instead. |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_resolve_reset ~382
Restores every in-scope session's baseline to the revision the test originally ran against, and clears any pending (unsaved) accept/reject/region resolution back to unresolved. Unlike every other eyes_resolve_*/eyes_inspect_* tool, the URL's shape is not just a locator — it IS the scope: a session URL (even with a /steps/N suffix) resets only that one session, while a bare batch URL resets every session in the batch. If the user asks to reset "the batch"/"everything"/"all sessions" but only a session or step URL is on hand (e.g. reused from an earlier call in this conversation), strip it down to the bare batch form first — passing the session URL as-is will silently under-scope the reset. Destructive and not undoable — only call it with explicit user approval of that exact scope.
| Name | Type | Req | Description |
|---|---|---|---|
| url | string | yes | Either a session URL or a batch URL — whichever shape you pass IS the scope, and the two are not interchangeable; choose deliberately based on the scope the user approved. Eyes session URL: https://e… |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_resolve_save ~157
Saves every accepted/rejected step and region change in the WHOLE BATCH to the baseline — all of its tests, not just the session in the URL (the server save is batch-scoped; the session part only identifies the batch). A potentially destructive, hard-to-reverse operation. Only call it once the user has explicitly approved committing the changes just made.
| Name | Type | Req | Description |
|---|---|---|---|
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_review_diff_report ~911
Records the rich per-diff evidence for the changed areas of one step — one `reports` entry per area, every unreviewed area of the step in a single call, and every finding fully specified for its claimed category. Each entry is verified on its own, against its own areaRect: it hard-throws if eyes_inspect_evidence wasn't actually fetched for that areaRect, a finding claims dynamic.justification:"History" with no matching eyes_inspect_history call, a finding proposes a dynamic.mask fix with no eyes_inspect_regions call for this step, its mask's `before` doesn't match a region actually in effect right now, or its mask's `after` doesn't cover the finding's own area. Entries are processed in order and stop at the first rejection — the ones before it stay recorded, and the error names exactly which areas to send back. If an area is the exact same underlying change as an area already recorded in the same scenario, set its entry's `sameAs` instead of redoing the full trio — see its own description. In mode "resolve" each finding's `dynamic.mask` is turned into an actual checkpoint match-region change right here — `mask.after.area`, if left null/omitted, defaults to the finding's own `area` — and the response reports per finding what was added/adjusted (or why it could not be), on `regions` and appended to `description`. Always follow the returned `next` field — it tells you exactly what to do next, whether that's reporting more changed areas or moving up to the step level.
| Name | Type | Req | Description |
|---|---|---|---|
| mode | string | – | What this investigation is for. "resolve" (the default — used whenever mode is left unspecified, including for a plain "review"/"check"/"look at" request with no further qualification) additionally a… |
| reports | – | yes | – |
| restart | boolean | – | Defaults to false — omit this to reuse whatever is already cached for this node. Pass true only to explicitly discard every cached finding/completion for this node and everything beneath it and revie… |
| rootScope | string | – | The scope this review was started at; bounds how far `next` escalates. Omit it only on a review's first call — it then defaults to that call's own scope (for eyes_review_diff_report, to its step). On… |
| sessionUrl | string | yes | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present) |
| stepIndex | integer | yes | Zero-based index of the step, as returned by eyes_inspect_steps |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_review_end ~1,187
Records the deduplicated findings summary for whatever `scope` names, once eyes_review_progress for that same scope reports every one of its children reviewed — see `scope`'s own description for what each one records, and `findings` for the shape each one takes. Discarded (not an error) if called too early. Always follow the returned `next` field — it tells you exactly what to do, whether that means retrying via eyes_review_progress, reviewing another entity at this same level, moving up to the level above, or the investigation is now fully reviewed.
| Name | Type | Req | Description |
|---|---|---|---|
| batchUrl | string | – | Eyes batch URL: https://eyes.applitools.com/app/test-results/{batchId}/?accountId=... (a trailing /{sessionId}[/steps/{N}] is fine too and is ignored — pass a session/step URL here as-is, no need to… |
| findings | – | yes | – |
| mode | string | – | What this investigation is for. "resolve" (the default — used whenever mode is left unspecified, including for a plain "review"/"check"/"look at" request with no further qualification) additionally a… |
| restart | boolean | – | Defaults to false — omit this to reuse whatever is already cached for this node. Pass true only to explicitly discard every cached finding/completion for this node and everything beneath it and revie… |
| rootScope | string | – | The scope this review was started at; bounds how far `next` escalates. Omit it only on a review's first call — it then defaults to that call's own scope (for eyes_review_diff_report, to its step). On… |
| scenarioName | string | – | The scenario (test) name. Required for scope "scenario"; omit it otherwise. |
| scope | string | yes | Which entity this call is about, and therefore which arguments it takes: "batch" takes batchUrl; "scenario" takes batchUrl and scenarioName; "session" takes sessionUrl; "step" takes sessionUrl and st… |
| sessionUrl | string | – | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present). Required for scope "session" and "step"; om… |
| stepIndex | integer | – | Zero-based index of the step, as returned by eyes_inspect_steps. Required for scope "step"; omit it otherwise. |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_review_progress ~1,079
Tracks progress investigating whatever `scope` names — see its own description for what each one investigates and which arguments it takes. ALWAYS call this to initiate test results inspection at that level, and ALWAYS follow its `next` field for what to call next. Do not report findings or conclusions to the user before this review's own eyes_review_end call reports completion. In mode "resolve" this additionally acts on what it finds: dynamic content is masked with a match region as each diff is reported, and each step is accepted/rejected/left-unresolved deterministically from its own findings — the response's top-level `resolution` and `regions` tallies, plus each finding's own `regions` detail, report exactly what happened.
| Name | Type | Req | Description |
|---|---|---|---|
| batchUrl | string | – | Eyes batch URL: https://eyes.applitools.com/app/test-results/{batchId}/?accountId=... (a trailing /{sessionId}[/steps/{N}] is fine too and is ignored — pass a session/step URL here as-is, no need to… |
| mode | string | – | What this investigation is for. "resolve" (the default — used whenever mode is left unspecified, including for a plain "review"/"check"/"look at" request with no further qualification) additionally a… |
| restart | boolean | – | Defaults to false — omit this to reuse whatever is already cached for this node. Pass true only to explicitly discard every cached finding/completion for this node and everything beneath it and revie… |
| rootScope | string | – | The scope this review was started at; bounds how far `next` escalates. Omit it only on a review's first call — it then defaults to that call's own scope (for eyes_review_diff_report, to its step). On… |
| scenarioName | string | – | The scenario (test) name. Required for scope "scenario"; omit it otherwise. |
| scope | string | yes | Which entity this call is about, and therefore which arguments it takes: "batch" takes batchUrl; "scenario" takes batchUrl and scenarioName; "session" takes sessionUrl; "step" takes sessionUrl and st… |
| sessionUrl | string | – | Eyes session URL: https://eyes.applitools.com/app/test-results/{batchId}/{sessionId}[/steps/{N}]?accountId=... (the /steps/N suffix is ignored if present). Required for scope "session" and "step"; om… |
| stepIndex | integer | – | Zero-based index of the step, as returned by eyes_inspect_steps. Required for scope "step"; omit it otherwise. |
| workspaceRoot | string | – | Root directory of the caller's project (optional; used to locate its .env credentials) |
No output schema declared.
No examples provided.
eyes_setup_project ~250
Get step-by-step instructions to set up a Playwright JS project with Applitools Eyes (Fixtures variant) [CORE REQUIREMENT: URL INTEGRITY] Playwright visual results return URLs ending in ~~. These are not typos. You are strictly forbidden from stripping trailing tildes from these links. Use markdown [Visual Test results](URL with tildes) for links. Output the raw, verbatim URL string exactly as captured from the test output.
| Name | Type | Req | Description |
|---|---|---|---|
| activeFile | string | – | Path to the currently active file or folder in the IDE (optional). Used to improve framework detection in Node.js monorepos by finding the nearest package.json relative to the active context. |
| apiKey | string | – | Optional API key (will use validated key from session if not provided) |
| projectName | string | – | Optional project name |
| workspaceRoot | string | – | Workspace root directory (optional, defaults to current directory). If the workspace root is a Node.js monorepo (contains a package.json with a "workspaces" field), ask the user which package they wa… |
No output schema declared.
No examples provided.
eyes_setup_ufg ~240
Configure Ultrafast Grid (UFG) for cross-browser and cross-device testing [CORE REQUIREMENT: URL INTEGRITY] Playwright visual results return URLs ending in ~~. These are not typos. You are strictly forbidden from stripping trailing tildes from these links. Use markdown [Visual Test results](URL with tildes) for links. Output the raw, verbatim URL string exactly as captured from the test output.
| Name | Type | Req | Description |
|---|---|---|---|
| activeFile | string | – | Path to the currently active file or folder in the IDE (optional). Used to improve framework detection in Node.js monorepos by finding the nearest package.json relative to the active context. |
| playwrightConfigPath | string | – | Path to playwright.config.js/ts file (optional, will be auto-detected) |
| workspaceRoot | string | – | Workspace root directory (optional, defaults to current directory). If the workspace root is a Node.js monorepo (contains a package.json with a "workspaces" field), ask the user which package they wa… |
No output schema declared.
No examples provided.
eyes_verify_api_key ~175
Validate your Applitools API key and optional server URL. Searches for API key in .env, applitools.config.js/ts/cjs/mjs, and playwright.config.js/ts/cjs/mjs files.
| Name | Type | Req | Description |
|---|---|---|---|
| apiKey | string | – | Optional API key to validate (will search config files if not provided) |
| serverUrl | string | – | Optional Applitools server URL (defaults to https://eyes.applitools.com) |
| setAsDefault | boolean | – | If true, save the validated API key and server URL as the default configuration in cache |
| workingDirectory | string | – | Working directory to search for .env and config files (optional, defaults to process.cwd()) |
| workspaceRoot | string | – | Workspace root to search for .env and config files (optional, defaults to current directory) |
No output schema declared.
No examples provided.
How do I install the Applitools MCP server?
Applitools runs locally as an npm package, launched with npx -y @applitools/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 · @applitools/mcp
claude mcp add applitools-applitools -- npx -y @applitools/mcp
What is the Applitools MCP server?
Applitools is an MCP server listed in the public MCP registry as io.github.applitools/applitools. Create, update, review, and resolve visual tests with Applitools Eyes across any supported SDK. This page covers its npm package (@applitools/mcp).
Is the Applitools MCP server safe to use?
Applitools scores 75 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. 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 Applitools MCP server expose?
Applitools exposes 22 tools: eyes_verify_api_key, eyes_setup_project, eyes_setup_ufg, eyes_add_checkpoints_to_test, eyes_inspect_sessions, and 17 more. Their descriptions and schemas cost roughly 9,328 tokens of context every time the server is loaded.
Is the Applitools MCP server still maintained?
Applitools 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.