Skip to main content
Glama

Get what this PR does to the UI vs its base branch

get_pr_changeset
Read-only

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
buildIdNoResolve this exact build id.
prNumberNoResolve the latest build for this PR number.
commitShaNoResolve the build for this git commit SHA.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
newYes
baseYes
countsYes
changedYes
removedYes
newNextCursorYes
changedNextCursorYes
removedNextCursorYes

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Before
      null
      After
      {
        "$schema": "http://json-schema.org/draft-07/schema#",
        "additionalProperties": false,
        "properties": {
          "base": {
            "type": "string"
          },
          "changed": {
            "items": {
              "$ref": "#/properties/new/items"
            },
            "type": "array"
          },
          "changedNextCursor": {
            "type": [
              "string",
              "null"
            ]
          },
          "counts": {
            "additionalProperties": false,
            "properties": {
              "changed": {
                "type": "number"
              },
              "new": {
                "type": "number"
              },
              "removed": {
                "type": "number"
              },
              "unchanged": {
                "type": "number"
              }
            },
            "required": [
              "new",
              "changed",
              "removed",
              "unchanged"
            ],
            "type": "object"
          },
          "new": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "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"
                }
              },
              "required": [
                "storyId",
                "title",
                "name",
                "kind",
                "status",
                "browsers",
                "viewports",
                "aiVerdict",
                "aiConfidence",
                "unstable"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "newNextCursor": {
            "type": [
              "string",
              "null"
            ]
          },
          "removed": {
            "items": {
              "additionalProperties": false,
              "properties": {
                "browsers": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                },
                "lastBuildId": {
                  "format": "uuid",
                  "type": "string"
                },
                "name": {
                  "type": "string"
                },
                "storyId": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "viewports": {
                  "items": {
                    "type": "string"
                  },
                  "type": "array"
                }
              },
              "required": [
                "storyId",
                "title",
                "name",
                "lastBuildId",
                "browsers",
                "viewports"
              ],
              "type": "object"
            },
            "type": "array"
          },
          "removedNextCursor": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "base",
          "counts",
          "new",
          "newNextCursor",
          "changed",
          "changedNextCursor",
          "removed",
          "removedNextCursor"
        ],
        "type": "object"
      }
  2. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations say only readOnlyHint=true and openWorldHint=false; the description adds non-obvious behavior such as accepted stories remaining under changed with status=accepted, the meaning of removed stories with lastBuildId, and the absence of image URLs. It also discloses the feature requirement, all beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but purposeful: every sentence adds a distinct fact, including scope, sibling contrast, return fields, removed semantics, pagination, no image URLs, and the feature gate. It is front-loaded with the core definition and contrast, though it could be easier to scan with a short bulleted structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex filtered-list tool with an output schema, the description is complete: it states resolution modes, response contents, pagination behavior, the meaning of removed stories, and what the tool does not return. It also names the sibling tools for follow-up actions, leaving no major operational gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes all three resolution parameters at 100% coverage, so the baseline is 3. The description adds the useful framing that the changeset is resolved by commitSha/prNumber/buildId and treats them as alternative resolution modes, which helps an agent understand the intended selection pattern.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title and description center on a specific verb+resource: it retrieves the cumulative PR-vs-base visual changeset. It sharply distinguishes itself from get_build by defining scope (whole PR vs branch it merges into) and semantics (survives in-PR accepts), so an agent can tell exactly what the tool returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly names get_build as the alternative and explains the difference: this tool answers what the PR changed versus what's left to review on the latest build. It also routes pagination to list_pr_stories and image fetching to get_diff/render_diff_image, giving clear when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.7/5.0
Disambiguation5/5

Each tool targets a distinct concern: list vs get vs pagination, build triage vs PR changeset, diff URL vs inline pixels, single-review vs bulk-accept. The descriptions explicitly call out the differences between similar-sounding tools, so an agent can reliably choose the right one.

Naming Consistency5/5

All tool names follow a consistent lowercase verb_noun pattern: get_* for single entities, list_* for collections, and review_diff/accept_build for actions. There are no mixed conventions or vague verbs.

Tool Count5/5

Nine tools fit the visual regression review workflow well: discovery, triage, pagination, image inspection, and reviewing. Each tool fills a distinct role without redundancy, and the count is in the sweet spot for an agent to keep all tool purposes in context.

Completeness5/5

The surface covers the full review lifecycle: find builds, triage changed/failed/unchanged stories, paginate, inspect diffs as URLs or inline images, review per-diff, and bulk-accept an entire build. The PR-changeset tools also cover cross-PR questions and deletion cases that would otherwise be dead ends.

Resources