UI Verify
Server Details
MCP server for visual regression testing: triage a PR's UI diffs from your coding agent.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- uiverify/uiverify
- GitHub Stars
- 18
Available Tools
9 toolsaccept_buildAccept every changed story in a buildAInspect
Accept ALL changed stories in one build at once (resolved by commitSha/prNumber/buildId), advancing each story's per-branch baseline so the next build is clean. This is the bulk form of review_diff='accept' — use it when you've decided the whole build's changes are intended. It accepts every changed story, including stories that already have a prior denied review; failed stories are unaffected. Returns the build triage after accepting (first page of changed stories, each now showing decision='accepted'; page the rest with list_build_stories if changedNextCursor is set).
| Name | Required | Description | Default |
|---|---|---|---|
| buildId | No | Resolve this exact build id. | |
| prNumber | No | Resolve the latest build for this PR number. | |
| commitSha | No | Resolve the build for this git commit SHA. |
Output Schema
| Name | Required | Description |
|---|---|---|
| branch | Yes | |
| counts | Yes | |
| status | Yes | |
| buildId | Yes | |
| aiReview | Yes | |
| prNumber | Yes | |
| commitSha | Yes | |
| createdAt | Yes | |
| gateStatus | Yes | |
| failedStories | Yes | |
| changedStories | Yes | |
| failedNextCursor | Yes | |
| autoAcceptChanges | Yes | |
| changedNextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important side effects beyond the annotations: it advances each story's per-branch baseline, accepts stories with prior denied reviews, leaves failed stories unaffected, and returns the post-acceptance triage. This gives the agent a clear model of what changes and what does not.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: main action first, then usage condition, then behavioral side effects, then return behavior. Every sentence adds useful information and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with annotations and an output schema, the description covers the key behavioral context: what gets accepted, which stories are affected, what happens to baselines, and what the response contains. No essential operational detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already explains each parameter. The description only restates the identifiers ('commitSha/prNumber/buildId') without adding new meaning such as precedence, mutual exclusivity, or default behavior when multiple are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Accept ALL changed stories in one build at once.' It also distinguishes itself from the sibling tool review_diff by explicitly calling itself 'the bulk form of review_diff=accept,' so an agent can correctly separate it from per-story review tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit usage condition: 'use it when you've decided the whole build's changes are intended.' It also names the relevant alternative (review_diff) and implies per-story review for non-bulk decisions, giving clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_buildGet what changed in a UI Verify buildARead-onlyInspect
Triage one build, resolved by commitSha, prNumber, or buildId (exactly one). Returns the gate verdict and counts (total/changed/failed/unchanged), then the FIRST page (25) of the changed stories (story id, viewport, % pixels changed, review decision, the AI verdict aiVerdict=intended|regression + aiConfidence, and for a regression the judge's one-line aiFlagReason=what-looks-unintended, when AI review is on) and the first page of failed stories (failedStories[].kind is render when the story produced no frame, or interaction when it rendered and its play() assertion threw; failedStories[].error is the message's first line, errorTruncated marks the ones that carried more). When AI review ran, aiReview tallies how many changes look like regressions vs intended, and the changed list is ordered likely-regressions-first. changedNextCursor / failedNextCursor are non-null when there are more than 25: page the rest with list_build_stories. counts.unchanged is how many stories did NOT change and have a baseline - this triage call does NOT list them (keeps the response lean); call list_build_stories status=unchanged to browse them (e.g. to confirm a passed build's stories are 'identical to baseline'). No image URLs here - call get_diff or render_diff_image for pixels.
| Name | Required | Description | Default |
|---|---|---|---|
| buildId | No | Resolve this exact build id. | |
| prNumber | No | Resolve the latest build for this PR number. | |
| commitSha | No | Resolve the build for this git commit SHA. |
Output Schema
| Name | Required | Description |
|---|---|---|
| branch | Yes | |
| counts | Yes | |
| status | Yes | |
| buildId | Yes | |
| aiReview | Yes | |
| prNumber | Yes | |
| commitSha | Yes | |
| createdAt | Yes | |
| gateStatus | Yes | |
| failedStories | Yes | |
| changedStories | Yes | |
| failedNextCursor | Yes | |
| autoAcceptChanges | Yes | |
| changedNextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses significant behavior: only the first 25 items are returned, cursors indicate pagination, changed stories are ordered likely-regressions-first, unchanged stories are deliberately omitted, failed stories distinguish render vs interaction errors, and error truncation is indicated. This is rich, accurate behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and resolver rule, and every clause contributes meaningful guidance. It is long because it covers many response details and routing decisions, but some of the return-field enumeration overlaps with the existing output schema. Still, no content is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex triage tool, the description covers resolution rules, response contents, pagination, ordering, error kinds, and explicit redirection to the correct sibling tools. Given the rich output schema and annotations, nothing essential is missing for an agent to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents each parameter with 100% coverage, so the baseline is solid. The description adds the crucial constraint that exactly one resolver must be provided, which the schema does not enforce. It does not need to repeat individual parameter descriptions because the schema already handles them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description starts with a specific action ('Triage one build') and identifies the exact resource and resolvers (commitSha, prNumber, buildId). It clearly distinguishes this from the sibling pagination/listing tool by stating what this call does NOT return and pointing to list_build_stories, get_diff, and render_diff_image.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use and when-not-to-use guidance: use it for triaging one build and reviewing changed/failed stories; use list_build_stories for unchanged stories or pagination; use get_diff or render_diff_image for images. This makes tool selection unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_diffGet per-story diff detail with image URLsARead-onlyInspect
Per-story diff detail for a build (resolved by commitSha/prNumber/buildId). Returns diff metrics and presigned, time-limited URLs (download them to a file, or link them in a PR comment) for the baseline, candidate, and diff PNGs. Defaults to the changed stories; pass storyId for one specific story. When that storyId is an UNCHANGED story it returns its baseline (diffResultId null, changed false, the baseline URL as both baselineUrl and candidateUrl) - the story rendered identical to baseline. Use render_diff_image instead when you want the actual pixels inline for a vision model, not a URL. When AI review is on, each diff carries the judge's call: aiVerdict (intended|regression), aiConfidence, aiSummary (what changed), aiReasoning, and aiFlagReason; all null when AI review didn't run for it.
| Name | Required | Description | Default |
|---|---|---|---|
| buildId | No | Resolve this exact build id. | |
| storyId | No | Limit to one story id. | |
| prNumber | No | Resolve the latest build for this PR number. | |
| commitSha | No | Resolve the build for this git commit SHA. |
Output Schema
| Name | Required | Description |
|---|---|---|
| diffs | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description matches that by describing a read-only detail query. It adds valuable behavioral context beyond annotations: URLs are presigned and time-limited, unchanged stories return a special shape with diffResultId null and changed false, and AI review fields are null when review did not run. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded, starting with the core purpose and resolution paths. It packs necessary usage, edge-case, alternative-tool, and AI-field behavior into a few sentences. The AI field enumeration is slightly long, though useful, which keeps it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with an output schema and four optional-looking parameters, the description is largely complete: it covers resolution paths, defaults, the main edge case, URL behavior, and the close sibling alternative. A minor gap is that it does not state what happens if no build identifier is supplied, even though the schema lists all parameters as optional.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers 100% of parameters with brief descriptions, so the baseline is 3. The description adds meaning beyond that by explaining the default behavior of storyId (default to changed stories) and the unusual unchanged-story result semantics. It does not add much per-parameter syntax, but the added scope and edge-case semantics justify one point above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Per-story diff detail for a build') and immediately clarifies the resolution paths (commitSha/prNumber/buildId). It also distinguishes itself from a close sibling by saying 'Use render_diff_image instead when you want the actual pixels inline for a vision model, not a URL.' This lets an agent separate get_diff from render_diff_image without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: get_diff is for diff metrics and URLs, and render_diff_image is the alternative when inline pixel data is needed. It also explains the default story scope, the optional storyId override, and the unchanged-story edge case, which is exactly the kind of usage context an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pr_changesetGet what this PR does to the UI vs its base branchARead-onlyInspect
The cumulative 'this PR vs base' visual changeset (resolved by commitSha/prNumber/buildId) - what the whole PR does to the UI versus the branch it merges into, INDEPENDENT of what is left to review on the latest build. Unlike get_build (this commit vs the branch's own accepted baseline), this survives in-PR accepts: a story accepted mid-PR still shows under changed with status=accepted, so it answers 'what did this PR change' even after the gate reads clean. Returns base (the branch it merges into), counts {new,changed,removed,unchanged}, and the first page of new + changed + removed stories (storyId, title, name, kind, review status, aiVerdict). removed lists stories that HAD a baseline on the base branch but are gone from this PR's head (a deletion - otherwise invisible; each carries lastBuildId, the build that rendered its now-orphaned baseline). newNextCursor / changedNextCursor / removedNextCursor page the rest with list_pr_stories. No image URLs - fetch pixels by storyId with get_diff / render_diff_image. Requires the PR visual changeset feature.
| Name | Required | Description | Default |
|---|---|---|---|
| buildId | No | Resolve this exact build id. | |
| prNumber | No | Resolve the latest build for this PR number. | |
| commitSha | No | Resolve the build for this git commit SHA. |
Output Schema
| Name | Required | Description |
|---|---|---|
| new | Yes | |
| base | Yes | |
| counts | Yes | |
| changed | Yes | |
| removed | Yes | |
| newNextCursor | Yes | |
| changedNextCursor | Yes | |
| removedNextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say readOnlyHint=true; the description goes well beyond that by explaining the resolved-by semantics (commitSha/prNumber/buildId), the independent-of-review-state behavior, and especially the `removed` list which surfaces otherwise-invisible baseline deletions with lastBuildId context. It also notes the feature requirement and the absence of image URLs, both useful behavioral disclosures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but information-dense: every clause earns its place, and the most decision-relevant contrast (vs get_build, survives in-PR accepts) is front-loaded. It trails into a multi-item return-value inventory, which makes it slightly heavy, but that inventory includes behavioral caveats (removed stories carry lastBuildId) rather than mere schema repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool answers, how it differs from its closest sibling, what the response contains including pagination cursors, and how to get pixels elsewhere. With an output schema present, return-value detail is appropriately summarized. For a read-only changeset query, this is complete at the right level of detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by clarifying that resolution can come from any of the three identifiers and that the result is 'resolved by commitSha/prNumber/buildId', tying the parameters to the same concept. It doesn't explain precedence among them, but the schema already documents each field adequately.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise noun phrase and verb — 'cumulative this PR vs base visual changeset' — and immediately distinguishes it from get_build by the in-PR accept behavior. It names siblings and states exactly what it returns (base, counts, first page of stories, deleted stories with lastBuildId).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly contrasts with get_build ('unlike get_build...') and even explains the carve-out for mid-PR accepted stories, so an agent knows when to choose this tool over the alternative. It also tells the caller to page with list_pr_stories and fetch pixels with get_diff / render_diff_image, which are concrete routing instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_buildsList recent UI Verify buildsARead-onlyInspect
Recent UI Verify builds for your project, newest first. Each row is a one-line verdict (gateStatus: passed | changed | failed) for a commit/PR — use it to find the build to inspect. No image URLs or per-story detail here: call get_build for the changed-story list, get_diff for images.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max builds to return (default 20). | |
| branch | No | Only builds on this git branch. | |
| status | No | Only builds with this raw status. |
Output Schema
| Name | Required | Description |
|---|---|---|
| builds | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, and the description adds useful behavioral context: results are newest-first rows containing only a gateStatus verdict, and the tool intentionally omits image URLs and per-story details. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all information-dense and front-loaded with the core purpose before limitations and alternatives. Every sentence earns its place, and there is no redundant restating of the schema or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with an output schema present, the description covers what an agent needs: what the rows look like, how results are ordered, what is intentionally excluded, and which sibling tools to use for the excluded details. No critical call-time context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents all three parameters (limit, branch, status) with descriptions and enumerations, so the schema carries the parameter-meaning burden. The description does not add additional parameter semantics beyond what the schema already provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource ('List recent UI Verify builds'), specifies ordering ('newest first'), and defines the output scope ('one-line verdict'). It also differentiates itself from siblings by explicitly stating what it lacks ('no image URLs or per-story detail') and naming the alternatives for those details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage direction: use this to find the build to inspect, then 'call get_build for the changed-story list, get_diff for images.' This directly routes the agent to the correct sibling tools and states the boundary of this tool's usefulness.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_build_storiesPage through a build's stories by statusARead-onlyInspect
Page through one build's stories filtered by status (resolved by commitSha/prNumber/buildId). Use it to read past get_build's first page, or to browse the unchanged/passed stories get_build only counts. status='changed' returns changed stories (same shape + order as get_build, regression-first); status='failed' returns failed stories; status='unchanged' returns the stories that did NOT change this build but have a baseline on this branch (storyId, viewport, browser) - fetch any of their images by storyId with get_diff or render_diff_image to confirm 'identical to baseline'. Returns { stories, nextCursor }: pass nextCursor back as cursor for the next page; null means no more. limit defaults to 25 (max 100). Unchanged is only available once the build has settled (an in-progress build has rendered nothing, so it returns an empty page).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (default 25, max 100). | |
| cursor | No | The nextCursor from a prior page; omit for the first page. | |
| status | Yes | Which stories to page: changed, failed, or unchanged (baselined, didn't change this build). | |
| buildId | No | Resolve this exact build id. | |
| prNumber | No | Resolve the latest build for this PR number. | |
| commitSha | No | Resolve the build for this git commit SHA. |
Output Schema
| Name | Required | Description |
|---|---|---|
| stories | Yes | |
| nextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses behavior far beyond the annotations: what each status returns, ordering for changed stories, cursor semantics with nextCursor, default/max limit, and the edge case that unchanged stories are only available after the build settles. This is rich, non-obvious behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every clause earns its place. It front-loads the purpose, then covers status behaviors, return shape, paging, limits, and a timing edge case without redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a paginated read-only tool: it explains return shape, pagination, status-specific semantics, build resolution, and the important unsettled-build behavior. No significant gap remains for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning: it explains the exact meaning of each status value, how cursor should be passed back, how build resolution works via commitSha/prNumber/buildId, and the limit default. This goes well beyond the bare schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: page through one build's stories filtered by status. It also distinguishes itself from get_build by noting it reads past get_build's first page and includes unchanged/passed stories that get_build only counts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it: to read past get_build's first page or to browse unchanged/passed stories. It also gives follow-up guidance for retrieving images with get_diff or render_diff_image, helping the agent choose the correct tool chain.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pr_storiesPage through the PR-vs-base changeset by kindARead-onlyInspect
Page through the PR-vs-base changeset stories of one kind (resolved by commitSha/prNumber/buildId) - use it to read past get_pr_changeset's first page. kind='new' returns stories the PR adds that the base branch has no baseline for; kind='changed' returns stories whose image differs from the base branch's accepted image (even if accepted mid-PR, with status=accepted); kind='removed' returns stories that HAD a baseline on the base branch but are gone from head (a deletion; each carries lastBuildId, not a review status or verdict). Returns { stories, nextCursor }: pass nextCursor back as cursor for the next page; null means no more. limit defaults to 25 (max 100). Requires the PR visual changeset feature.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Which changeset stories to page: new (added), changed (vs base), or removed (deleted). | |
| limit | No | Page size (default 25, max 100). | |
| cursor | No | The nextCursor from a prior page; omit for the first page. | |
| buildId | No | Resolve this exact build id. | |
| prNumber | No | Resolve the latest build for this PR number. | |
| commitSha | No | Resolve the build for this git commit SHA. |
Output Schema
| Name | Required | Description |
|---|---|---|
| stories | Yes | |
| nextCursor | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds meaningful behavior: exact semantics of new/changed/removed, that removed stories carry lastBuildId rather than review status/verdict, the cursor round-trip contract, and the default/max limit. No statement contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but every clause earns its place: pagination role, kind semantics, output shape, cursor handling, limit, and feature gate. It is front-loaded with the core action and routing hint before the detailed kind definitions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter paging tool, the description plus the provided schema and output schema cover resolution modes, pagination state, return shape, defaults, and prerequisites. An agent has what it needs to call the tool correctly and continue paging.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes beyond the schema by defining what each kind means (e.g., 'even if accepted mid-PR, with status=accepted') and how cursor pagination works. It does not fully remove ambiguity about whether exactly one of commitSha/prNumber/buildId must be supplied, which keeps it from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Page through'), a precise resource ('PR-vs-base changeset stories'), and a kind selector, then immediately ties it to the sibling tool: 'read past get_pr_changeset's first page'. Each kind value gets a distinct semantic definition, so an agent can tell this apart from get_pr_changeset and list_build_stories without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names get_pr_changeset as the tool whose first-page result this continues, giving the when-condition ('read past ... first page'). It also states the prerequisite ('Requires the PR visual changeset feature'), which prevents calls in unsupported contexts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_diff_imageFetch the actual pixels of a story imageARead-onlyInspect
Fetch a story's image as an INLINE image (base64 pixels, not a URL) so a vision model can look at it directly. Needs a native MCP client that renders image content; piped through raw curl it is useless (use get_diff's URLs there instead). Two ways to address it: (1) diffResultId + which for a CHANGED story - which is baseline|candidate|diff (the triptych) or before_after, the baseline and candidate SIDE BY SIDE (before on the left, after on the right) cropped to the changed region - and when a story changed in SEVERAL far-apart places, one such crop PER region stacked top to bottom, so a header-plus-footer change is two tight crops, not a page-tall image. before_after is usually what you want for a code change - it zooms to what moved instead of a full page. Get diffResultId from get_build (changedStories[].diffResultId) or get_diff. (2) a build selector (commitSha|prNumber|buildId) + storyId for ANY story's current image - the candidate if it changed this build, else its baseline. This second form is the only way to see an UNCHANGED/passed story's pixels (list them via list_build_stories status=unchanged), so you can confirm 'identical to baseline'. Errors if the image doesn't exist (a genuinely new story has no baseline, so no before_after either).
| Name | Required | Description | Default |
|---|---|---|---|
| which | No | For the diffResultId form: baseline|candidate|diff (one triptych image, default candidate), or before_after (baseline+candidate side by side, cropped to the change - one crop per changed region, stacked, when the change spans several places). Ignored for the storyId form. | |
| buildId | No | Resolve this exact build id. | |
| storyId | No | With a build selector: fetch THIS story's current image (works for unchanged stories). | |
| prNumber | No | Resolve the latest build for this PR number. | |
| commitSha | No | Resolve the build for this git commit SHA. | |
| diffResultId | No | A CHANGED story's diff result id (from get_build/get_diff); pair with `which`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even though annotations already declare readOnlyHint=true, the description adds substantial behavioral context: output is inline base64, before_after crops to changed regions and stacks multiple crops, and the tool errors when an image genuinely doesn't exist. This goes well beyond the annotations and fully discloses the tool's runtime behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence earns its place; the tool genuinely has two distinct invocation modes and nuanced image-format behavior. It is front-loaded with the core purpose, then logically organized into the two addressing forms, with caveats placed in context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 optional parameters, two call forms, no output schema, and no nested objects, the description fully covers the invocation methods, image variants, error behavior, and how to get the required IDs. Nothing needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents each parameter. The description goes further by explaining the two valid parameter combinations, the meaning of each `which` value (including before_after's side-by-side crop behavior), and how to obtain diffResultId from get_build/get_diff. This transforms the flat parameter list into actionable usage knowledge.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: fetch a story's image as an inline base64 image for vision-model consumption. It clearly distinguishes itself from get_diff by noting that get_diff returns URLs while this tool returns pixels, so an agent can tell them apart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool (vision-model needs pixels), when NOT to use it (piped through raw curl, use get_diff's URLs), and gives two concrete addressing forms with step-by-step guidance. It also identifies the only way to view unchanged/passed story pixels, leaving no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_diffAccept, deny, or ignore one story's changeAInspect
Record a review on a single diff result (get diffResultId from get_build/get_diff). 'accept' makes the candidate the new baseline for that story on its branch, so the next build is clean; 'deny' records the rejection without changing the baseline; 'ignore' excludes the story from the gate persistently (the snapshot keeps differing on future builds but no longer flags the check) — use it for an intentional, ongoing diff like an animation or a live timestamp. This is the same accept/deny/ignore as the dashboard, attributed to your project key. Use after you've inspected the diff (e.g. with render_diff_image) and decided intended vs. regression.
| Name | Required | Description | Default |
|---|---|---|---|
| decision | Yes | 'accept' advances the baseline; 'deny' records a rejection; 'ignore' excludes the story from the gate. | |
| diffResultId | Yes | The diff result id from get_build or get_diff. |
Output Schema
| Name | Required | Description |
|---|---|---|
| decision | Yes | |
| diffResultId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description fully discloses the persistent side effects of each decision: accept changes the baseline so the next build is clean, deny records rejection without changing baseline, ignore permanently excludes the story from the gate while the snapshot keeps differing. It also notes attribution to the project key, which is useful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but not bloated; it front-loads the core purpose and then expands each decision. Every sentence adds either behavioral clarity or workflow guidance, and the length is justified by the need to distinguish three decision outcomes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter write operation with a fully documented schema and an output schema present, the description covers the workflow, side effects, parameter sourcing, and decision criteria. No critical operational detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters already have descriptions. The description adds value by explaining the real-world consequences of each decision value and reinforcing that diffResultId comes from get_build/get_diff, but it does not introduce semantics the schema entirely lacks.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('Record a review on a single diff result') and then defines each decision outcome ('accept' makes the candidate the new baseline, 'deny' records rejection, 'ignore' persists gate exclusion). The title and 'single diff result' wording distinguish it from build-level siblings like accept_build.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use the tool: 'Use after you've inspected the diff (e.g. with render_diff_image) and decided intended vs. regression.' It also gives a concrete use case for 'ignore' (intentional ongoing diffs like animation or live timestamp). It does not explicitly contrast with a sibling alternative like accept_build, so no exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
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
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
MCP server for Mint — AI-powered QA that runs your app in a real browser on every PR.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
Remote MCP server for supportsheep: run AI interviews and manage support content for your blog.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for visual monitoring: take screenshots of URLs and detect visual changes against stored baselines.191MIT
- AlicenseNot gradedqualityBmaintenanceMCP server for pixel-perfect verification, screenshots a live URL and diffs it against a static design image, returning grouped diff regions with severity scores and source tracing.5MIT
- AlicenseNot gradedqualityBmaintenanceMCP server that gives Claude and other clients vision capabilities including screenshot-to-code, OCR, error diagnosis, diagram analysis, data-viz insights, UI diff checks, and video analysis via any OpenAI-compatible vision endpoint.32,458Apache 2.0
- AlicenseNot gradedqualityCmaintenanceMCP server for Next.js design overlay, enabling AI agents to query visual UI tasks, fetch annotated snapshots, and mark tasks as resolved.111MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Most tools target distinct resources and actions, and the descriptions carefully separate build triage from PR changesets. However, get_diff and render_diff_image both provide diff imagery (URLs vs inline), and accept_build overlaps with review_diff's accept mode, so one or two selections could be mis-picked without reading closely.
All nine tools use a consistent snake_case verb_noun pattern: list_* for paginated listings, get_* for detail/triage, render_* for image output, and review_diff/accept_build for review actions. The naming convention is predictable and easy to reason about.
Nine tools is well within the ideal scope for a visual-regression review server. Each tool maps to a distinct workflow step—finding builds, triaging results, paging stories, fetching images, and recording reviews—without redundant or bloated additions.
The tool surface covers the full UI-verification loop: discover builds, inspect gate verdicts, page through changed/failed/unchanged stories, fetch diff details and inline images, review individually or bulk-accept, and inspect PR-level visual changesets. No essential operation for the stated domain is missing.