UI Verify
Server Details
Visual testing for coding agents: your agent sees every UI change it makes and triages each diff.
The last two health checks of this connector failed. If this server requires authentication, missing or expired test credentials may be the cause. A test profile lets Glama authenticate for health checks and discover tools; it is separate from your personal connections.
If you are the author, claim ownership, then add or update a test profile under Admin → Test Profile.
- Status
- Unhealthy
- Uptime
- 78.3% over 61 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- uiverify/uiverify
- GitHub Stars
- 18
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 15 tools
Each tool has a distinct role: build triage vs. PR-wide changeset, URL-based diff detail vs. inline image rendering, single-diff review vs. bulk build acceptance, and comment CRUD/resolution are clearly separated. Overlaps like get_build/list_build_stories are explicitly framed as summary vs. paging, so an agent can select tools confidently.
All tools use snake_case with a leading verb and noun object (get_build, list_comments, post_comment, review_diff, resolve_comment, etc.). There is no mixing of camelCase or vague standalone verbs; render_diff_image is slightly longer but follows the same verb-first pattern.
15 tools is well-scoped for a visual verification/review server, covering builds, diffs, images, PR changesets, projects, and comments without obvious redundancy. Each tool appears to earn its place, with bulk and single-item operations justified separately.
The core review lifecycle is covered: list projects/builds, triage builds, inspect diffs and images, browse PR changesets, manage comments, and accept/deny/ignore reviews. Minor gaps remain around triggering/creating builds or project configuration, but those may be outside this server's reviewer-focused scope.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
- Changed
accept_build4 fields changed- removed
Output schema / properties / changedStories / items / properties / comments / properties / total / $refRemoved value: -"#/properties/comments/properties/total" - added
Output schema / properties / changedStories / items / properties / comments / properties / total / typeAdded value: +"number" - removed
Output schema / properties / changedStories / items / properties / comments / properties / unresolved / $refRemoved value: -"#/properties/comments/properties/unresolved" - added
Output schema / properties / changedStories / items / properties / comments / properties / unresolved / typeAdded value: +"number"
- Changed
get_build4 fields changed- removed
Output schema / properties / changedStories / items / properties / comments / properties / total / $refRemoved value: -"#/properties/comments/properties/total" - added
Output schema / properties / changedStories / items / properties / comments / properties / total / typeAdded value: +"number" - removed
Output schema / properties / changedStories / items / properties / comments / properties / unresolved / $refRemoved value: -"#/properties/comments/properties/unresolved" - added
Output schema / properties / changedStories / items / properties / comments / properties / unresolved / typeAdded value: +"number"
- Changed
get_pr_changeset5 fields changed- removed
Output schema / properties / changed / items / $refRemoved value: -"#/properties/new/items" - added
Output schema / properties / changed / items / additionalPropertiesAdded value: +false - added
Output schema / properties / changed / items / propertiesAdded value: +{ + "aiConfidence": { + "type": [ + "string", + "null" + ] + }, + "aiVerdict": { + "type": [ + "string", + "null" + ] + }, + "browsers": { + "items": { + "type": "string" + }, + "type": "array" + }, + "kind": { + "enum": [ + "new", + "changed" + ], + "type": "string" + }, + "name": { + "type": "string" + }, + "status": { + "enum": [ + "accepted", + "denied", + "ignored", + "pending" + ], + "type": "string" + }, + "storyId": { + "type": "string" + }, + "title": { + "type": "string" + }, + "unstable": { + "type": "boolean" + }, + "viewports": { + "items": { + "type": "string" + }, + "type": "array" + } +} - added
Output schema / properties / changed / items / requiredAdded value: +[ + "storyId", + "title", + "name", + "kind", + "status", + "browsers", + "viewports", + "aiVerdict", + "aiConfidence", + "unstable" +] - added
Output schema / properties / changed / items / typeAdded value: +"object"
- Changed
list_comments1 field changed- changed
Output schema / properties / comments / items / properties / anchor / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "type": { - "const": "point", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "$ref": "#/properties/comments/items/properties/anchor/anyOf/0/anyOf/0/properties/x" - } - }, - "required": [ - "type", - "x", - "y" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "type": { - "const": "rect", - "type": "string" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "$ref": "#/properties/comments/items/properties/anchor/anyOf/0/anyOf/0/properties/x" - }, - "y": { - "$ref": "#/properties/comments/items/properties/anchor/anyOf/0/anyOf/0/properties/x" - } - }, - "required": [ - "type", - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "closed": { - "type": "boolean" - }, - "points": { - "items": { - "additionalProperties": false, - "properties": { - "x": { - "$ref": "#/properties/comments/items/properties/anchor/anyOf/0/anyOf/0/properties/x" - }, - "y": { - "$ref": "#/properties/comments/items/properties/anchor/anyOf/0/anyOf/0/properties/x" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "maxItems": 512, - "minItems": 2, - "type": "array" - }, - "type": { - "const": "path", - "type": "string" - } - }, - "required": [ - "type", - "points", - "closed" - ], - "type": "object" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "type": { + "const": "point", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type", + "x", + "y" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "type": { + "const": "rect", + "type": "string" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type", + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "closed": { + "type": "boolean" + }, + "points": { + "items": { + "additionalProperties": false, + "properties": { + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "maxItems": 512, + "minItems": 2, + "type": "array" + }, + "type": { + "const": "path", + "type": "string" + } + }, + "required": [ + "type", + "points", + "closed" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } +]
- Changed
post_comment1 field changed- changed
Input schema / properties / anchor / anyOfPrevious value: -[ - { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "type": { - "const": "point", - "type": "string" - }, - "x": { - "maximum": 1, - "minimum": 0, - "type": "number" - }, - "y": { - "$ref": "#/properties/anchor/anyOf/0/anyOf/0/properties/x" - } - }, - "required": [ - "type", - "x", - "y" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "h": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "type": { - "const": "rect", - "type": "string" - }, - "w": { - "exclusiveMinimum": 0, - "maximum": 1, - "type": "number" - }, - "x": { - "$ref": "#/properties/anchor/anyOf/0/anyOf/0/properties/x" - }, - "y": { - "$ref": "#/properties/anchor/anyOf/0/anyOf/0/properties/x" - } - }, - "required": [ - "type", - "x", - "y", - "w", - "h" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "closed": { - "type": "boolean" - }, - "points": { - "items": { - "additionalProperties": false, - "properties": { - "x": { - "$ref": "#/properties/anchor/anyOf/0/anyOf/0/properties/x" - }, - "y": { - "$ref": "#/properties/anchor/anyOf/0/anyOf/0/properties/x" - } - }, - "required": [ - "x", - "y" - ], - "type": "object" - }, - "maxItems": 512, - "minItems": 2, - "type": "array" - }, - "type": { - "const": "path", - "type": "string" - } - }, - "required": [ - "type", - "points", - "closed" - ], - "type": "object" - } - ] - }, - { - "type": "null" - } -]New value: +[ + { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "type": { + "const": "point", + "type": "string" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type", + "x", + "y" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "h": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "type": { + "const": "rect", + "type": "string" + }, + "w": { + "exclusiveMinimum": 0, + "maximum": 1, + "type": "number" + }, + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "type", + "x", + "y", + "w", + "h" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "closed": { + "type": "boolean" + }, + "points": { + "items": { + "additionalProperties": false, + "properties": { + "x": { + "maximum": 1, + "minimum": 0, + "type": "number" + }, + "y": { + "maximum": 1, + "minimum": 0, + "type": "number" + } + }, + "required": [ + "x", + "y" + ], + "type": "object" + }, + "maxItems": 512, + "minItems": 2, + "type": "array" + }, + "type": { + "const": "path", + "type": "string" + } + }, + "required": [ + "type", + "points", + "closed" + ], + "type": "object" + } + ] + }, + { + "type": "null" + } +]
11 tool updates
- Changed
accept_build1 field changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "The project to look in (a projectId from list_projects). Needed only when you can access several projects; a buildId already names its project.", + "format": "uuid", + "type": "string" +}
- Changed
get_build1 field changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "The project to look in (a projectId from list_projects). Needed only when you can access several projects; a buildId already names its project.", + "format": "uuid", + "type": "string" +}
- Changed
get_diff1 field changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "The project to look in (a projectId from list_projects). Needed only when you can access several projects; a buildId already names its project.", + "format": "uuid", + "type": "string" +}
- Changed
get_pr_changeset1 field changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "The project to look in (a projectId from list_projects). Needed only when you can access several projects; a buildId already names its project.", + "format": "uuid", + "type": "string" +}
- Changed
list_build_stories1 field changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "The project to look in (a projectId from list_projects). Needed only when you can access several projects; a buildId already names its project.", + "format": "uuid", + "type": "string" +}
- Changed
list_builds1 field changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "The project to look in (a projectId from list_projects). Needed only when you can access several projects; a buildId already names its project.", + "format": "uuid", + "type": "string" +}
- Changed
list_comments1 field changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "The project to look in (a projectId from list_projects). Needed only when you can access several projects; a buildId already names its project.", + "format": "uuid", + "type": "string" +}
- Changed
list_pr_stories1 field changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "The project to look in (a projectId from list_projects). Needed only when you can access several projects; a buildId already names its project.", + "format": "uuid", + "type": "string" +}
- Added
list_projects - Changed
post_comment1 field changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "The project to look in (a projectId from list_projects). Needed only when you can access several projects; a buildId already names its project.", + "format": "uuid", + "type": "string" +}
- Changed
render_diff_image1 field changed- added
Input schema / properties / projectIdAdded value: +{ + "description": "The project to look in (a projectId from list_projects). Needed only when you can access several projects; a buildId already names its project.", + "format": "uuid", + "type": "string" +}
3 tool updates
- Changed
accept_build2 fields changed- added
Output schema / properties / changedStories / items / properties / commentsAdded value: +{ + "additionalProperties": false, + "properties": { + "total": { + "$ref": "#/properties/comments/properties/total" + }, + "unresolved": { + "$ref": "#/properties/comments/properties/unresolved" + } + }, + "required": [ + "total", + "unresolved" + ], + "type": "object" +} - changed
Output schema / properties / changedStories / items / requiredPrevious value: -[ - "diffResultId", - "storyId", - "title", - "name", - "viewport", - "browser", - "changedPct", - "decision", - "isNew", - "unstable", - "aiVerdict", - "aiClassification", - "aiIntroducedBy", - "aiConfidence", - "aiSummary", - "aiFlagReason" -]New value: +[ + "diffResultId", + "storyId", + "title", + "name", + "viewport", + "browser", + "changedPct", + "decision", + "isNew", + "unstable", + "aiVerdict", + "aiClassification", + "aiIntroducedBy", + "aiConfidence", + "aiSummary", + "aiFlagReason", + "comments" +]
- Changed
get_build2 fields changed- added
Output schema / properties / changedStories / items / properties / commentsAdded value: +{ + "additionalProperties": false, + "properties": { + "total": { + "$ref": "#/properties/comments/properties/total" + }, + "unresolved": { + "$ref": "#/properties/comments/properties/unresolved" + } + }, + "required": [ + "total", + "unresolved" + ], + "type": "object" +} - changed
Output schema / properties / changedStories / items / requiredPrevious value: -[ - "diffResultId", - "storyId", - "title", - "name", - "viewport", - "browser", - "changedPct", - "decision", - "isNew", - "unstable", - "aiVerdict", - "aiClassification", - "aiIntroducedBy", - "aiConfidence", - "aiSummary", - "aiFlagReason" -]New value: +[ + "diffResultId", + "storyId", + "title", + "name", + "viewport", + "browser", + "changedPct", + "decision", + "isNew", + "unstable", + "aiVerdict", + "aiClassification", + "aiIntroducedBy", + "aiConfidence", + "aiSummary", + "aiFlagReason", + "comments" +]
- Changed
list_build_stories1 field changed- changed
Output schema / properties / stories / items / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "aiClassification": { - "type": [ - "string", - "null" - ] - }, - "aiConfidence": { - "type": [ - "string", - "null" - ] - }, - "aiFlagReason": { - "type": [ - "string", - "null" - ] - }, - "aiIntroducedBy": { - "type": [ - "string", - "null" - ] - }, - "aiSummary": { - "type": [ - "string", - "null" - ] - }, - "aiVerdict": { - "type": [ - "string", - "null" - ] - }, - "browser": { - "type": "string" - }, - "changedPct": { - "type": [ - "number", - "null" - ] - }, - "decision": { - "type": [ - "string", - "null" - ] - }, - "diffResultId": { - "format": "uuid", - "type": "string" - }, - "isNew": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "storyId": { - "type": "string" - }, - "title": { - "type": "string" - }, - "unstable": { - "type": "boolean" - }, - "viewport": { - "type": "string" - } - }, - "required": [ - "diffResultId", - "storyId", - "title", - "name", - "viewport", - "browser", - "changedPct", - "decision", - "isNew", - "unstable", - "aiVerdict", - "aiClassification", - "aiIntroducedBy", - "aiConfidence", - "aiSummary", - "aiFlagReason" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "browser": { - "type": "string" - }, - "error": { - "type": "string" - }, - "errorTruncated": { - "type": "boolean" - }, - "kind": { - "enum": [ - "render", - "interaction" - ], - "type": "string" - }, - "name": { - "type": "string" - }, - "storyId": { - "type": "string" - }, - "title": { - "type": "string" - }, - "viewport": { - "type": "string" - } - }, - "required": [ - "storyId", - "title", - "name", - "viewport", - "browser", - "error", - "errorTruncated", - "kind" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "browser": { - "type": "string" - }, - "storyId": { - "type": "string" - }, - "viewport": { - "type": "string" - } - }, - "required": [ - "storyId", - "viewport", - "browser" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "aiClassification": { + "type": [ + "string", + "null" + ] + }, + "aiConfidence": { + "type": [ + "string", + "null" + ] + }, + "aiFlagReason": { + "type": [ + "string", + "null" + ] + }, + "aiIntroducedBy": { + "type": [ + "string", + "null" + ] + }, + "aiSummary": { + "type": [ + "string", + "null" + ] + }, + "aiVerdict": { + "type": [ + "string", + "null" + ] + }, + "browser": { + "type": "string" + }, + "changedPct": { + "type": [ + "number", + "null" + ] + }, + "comments": { + "additionalProperties": false, + "properties": { + "total": { + "type": "number" + }, + "unresolved": { + "type": "number" + } + }, + "required": [ + "total", + "unresolved" + ], + "type": "object" + }, + "decision": { + "type": [ + "string", + "null" + ] + }, + "diffResultId": { + "format": "uuid", + "type": "string" + }, + "isNew": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "storyId": { + "type": "string" + }, + "title": { + "type": "string" + }, + "unstable": { + "type": "boolean" + }, + "viewport": { + "type": "string" + } + }, + "required": [ + "diffResultId", + "storyId", + "title", + "name", + "viewport", + "browser", + "changedPct", + "decision", + "isNew", + "unstable", + "aiVerdict", + "aiClassification", + "aiIntroducedBy", + "aiConfidence", + "aiSummary", + "aiFlagReason", + "comments" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "browser": { + "type": "string" + }, + "error": { + "type": "string" + }, + "errorTruncated": { + "type": "boolean" + }, + "kind": { + "enum": [ + "render", + "interaction" + ], + "type": "string" + }, + "name": { + "type": "string" + }, + "storyId": { + "type": "string" + }, + "title": { + "type": "string" + }, + "viewport": { + "type": "string" + } + }, + "required": [ + "storyId", + "title", + "name", + "viewport", + "browser", + "error", + "errorTruncated", + "kind" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "browser": { + "type": "string" + }, + "storyId": { + "type": "string" + }, + "viewport": { + "type": "string" + } + }, + "required": [ + "storyId", + "viewport", + "browser" + ], + "type": "object" + } +]
1 tool update
- Changed
render_diff_image1 field changed- added
Input schema / properties / pxPaginationAdded value: +{ + "additionalProperties": false, + "description": "Paginate a TALL image slice by slice instead of one unreadable image: return the `height` device px starting at y=`offset`, so a 5000px page is reviewed in readable slices. Omit for the whole image. Ignored for the before_after form (already cropped to the change).", + "properties": { + "height": { + "default": 500, + "description": "Slice height in device px (default 500).", + "exclusiveMinimum": 0, + "type": "integer" + }, + "offset": { + "description": "Top y (device px) of the slice to return.", + "minimum": 0, + "type": "integer" + } + }, + "required": [ + "offset" + ], + "type": "object" +}
3 tool updates
- Changed
accept_build2 fields changed- added
Output schema / properties / commentsAdded value: +{ + "additionalProperties": false, + "properties": { + "total": { + "type": "number" + }, + "unresolved": { + "type": "number" + } + }, + "required": [ + "total", + "unresolved" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "buildId", - "commitSha", - "branch", - "prNumber", - "status", - "gateStatus", - "autoAcceptChanges", - "createdAt", - "counts", - "aiReview", - "changedStories", - "changedNextCursor", - "failedStories", - "failedNextCursor" -]New value: +[ + "buildId", + "commitSha", + "branch", + "prNumber", + "status", + "gateStatus", + "autoAcceptChanges", + "createdAt", + "counts", + "comments", + "aiReview", + "changedStories", + "changedNextCursor", + "failedStories", + "failedNextCursor" +]
- Changed
get_build2 fields changed- added
Output schema / properties / commentsAdded value: +{ + "additionalProperties": false, + "properties": { + "total": { + "type": "number" + }, + "unresolved": { + "type": "number" + } + }, + "required": [ + "total", + "unresolved" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "buildId", - "commitSha", - "branch", - "prNumber", - "status", - "gateStatus", - "autoAcceptChanges", - "createdAt", - "counts", - "aiReview", - "changedStories", - "changedNextCursor", - "failedStories", - "failedNextCursor" -]New value: +[ + "buildId", + "commitSha", + "branch", + "prNumber", + "status", + "gateStatus", + "autoAcceptChanges", + "createdAt", + "counts", + "comments", + "aiReview", + "changedStories", + "changedNextCursor", + "failedStories", + "failedNextCursor" +]
- Changed
get_diff2 fields changed- added
Output schema / properties / diffs / items / properties / commentsAdded value: +{ + "additionalProperties": false, + "properties": { + "total": { + "type": "number" + }, + "unresolved": { + "type": "number" + } + }, + "required": [ + "total", + "unresolved" + ], + "type": "object" +} - changed
Output schema / properties / diffs / items / requiredPrevious value: -[ - "diffResultId", - "storyId", - "viewport", - "browser", - "changed", - "decision", - "metrics", - "baselineUrl", - "candidateUrl", - "diffUrl", - "aiSummary", - "aiVerdict", - "aiConfidence", - "aiReasoning", - "aiFlagReason" -]New value: +[ + "diffResultId", + "storyId", + "viewport", + "browser", + "changed", + "decision", + "metrics", + "baselineUrl", + "candidateUrl", + "diffUrl", + "aiSummary", + "aiVerdict", + "aiConfidence", + "aiReasoning", + "aiFlagReason", + "comments" +]
4 tool updates
- Added
delete_comment - Added
post_comment - Added
resolve_comment - Added
update_comment
1 tool update
- Added
list_comments
1 tool update
- Removed
get_change_attribution
1 tool update
- Changed
get_change_attribution3 fields changed- added
Output schema / properties / stories / items / properties / approxReasonAdded value: +{ + "anyOf": [ + { + "enum": [ + "no-graph", + "global-change", + "too-large", + "github-error", + "unexplained" + ], + "type": "string" + }, + { + "type": "null" + } + ] +} - added
Output schema / properties / stories / items / properties / narrowedAdded value: +{ + "type": "boolean" +} - changed
Output schema / properties / stories / items / requiredPrevious value: -[ - "storyId", - "base", - "truncated", - "partial", - "refs" -]New value: +[ + "storyId", + "base", + "truncated", + "partial", + "narrowed", + "approxReason", + "refs" +]
1 tool update
- Added
get_change_attribution
9 tool updates
- First observed
accept_build - First observed
get_build - First observed
get_diff - First observed
get_pr_changeset - First observed
list_build_stories - First observed
list_builds - First observed
list_pr_stories - First observed
render_diff_image - First observed
review_diff
Related MCP Connectors
A design agent in your coding agent's loop: briefs each screen, reviews UX and visual quality.
Browser-based QA for AI-built software. Test pages with real browsers via agents.
Agentic AI quality engineering: run, debug and triage tests on real browsers and devices
Synthetic checks, nightly regression replay and model-drift alerts for AI agents
Related MCP Servers
- AlicenseAqualityDmaintenanceIntent-aware visual verification for coding agents: the agent declares what a UI change should affect, and SnapDiff diffs the page against a baseline and flags anything that changed outside that intent for review or rollback — local screenshot capture via Playwright.690 npm5MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI coding agents to visually interact with frontend apps by taking screenshots, clicking elements, reading console logs, and performing visual diffs.3 npm3MIT
- AlicenseAqualityCmaintenanceEnables coding agents to visually verify front-end changes by capturing screenshots at real breakpoints, identifying the single element responsible for overflow, and surfacing console and network errors.22MIT
- AlicenseNot gradedqualityDmaintenanceDeterministic screenshot diffing for AI coding agents. Extract design tokens, diff implementations vs reference, get CSS fix suggestions.63 npm6MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.