Skip to main content
Glama

UI Journey MCP

Ask an agent what a UI flow does, which version was tested, and show the evidence.

Independent MIT-licensed MCP server and CLI for mapped UI flows and immutable browser evidence. No dependency on Codebase Memory, GitHub or any application. Runs locally; no model API, hosted account or telemetry.

Status: experimental v0.1. Read-only MCP queries work with saved evidence; the CLI can validate anonymous flows against a local test application. Automatic route discovery, authenticated fixtures and remote MCP hosting are not included.

Example queries

get_flow_evidence(project="shop", flow="checkout", revision="<40-character SHA>")
compare_flow(project="shop", flow="checkout", before="<SHA>", after="<SHA>")
get_evidence_image(project="shop", digest="<image hash from the result>")

Flows are the primary entity. PR numbers are optional metadata. Query a mapped flow without a PR, retrieve an exact historical run, or compare revisions. get_evidence_image returns a PNG inline; resource URIs are also available.

Related MCP server: UnderPixel

Install from source

Requires Node.js 22+ and npm. This package has not been published to npm.

git clone https://github.com/thiagown1/ui-journey-mcp.git
cd ui-journey-mcp
npm ci
node bin/ui-journey.js help

Configure your MCP client with absolute paths. On Windows, use forward slashes or escape backslashes in JSON. Restart/reconnect the client after adding a server.

{
  "mcpServers": {
    "ui-journey": {
      "command": "node",
      "args": ["/absolute/path/ui-journey-mcp/bin/ui-journey.js", "serve", "--store", "/private/path/ui-evidence"]
    }
  }
}

The default store is ~/.ui-journey/store. Use a persistent directory or mounted volume for long-term storage. Records never expire automatically; back up the store.

Codex setup

Register a stable checkout with absolute paths, outside a temporary worktree:

codex mcp add ui-journey-mcp -- /absolute/path/to/node /absolute/path/ui-journey-mcp/bin/ui-journey.js serve --store /private/path/ui-evidence
codex mcp get ui-journey-mcp --json

This adds a server to the host's global Codex configuration, shared by the local desktop app, CLI and IDE extension. Restart/reconnect your client and inspect /mcp to confirm the connection. An enabled configuration entry alone does not prove that an existing session loaded the server. See the official Codex MCP setup guide.

Once connected, ask for list_flows with your project ID, then get_flow_evidence with a mapped flow and exact revision. Retrieve a returned image digest with get_evidence_image to verify image delivery as well.

Availability does not mean invocation on every message. Agents select tools for the task; this server does not intercept other calls or automatically collect new screenshots. Codebase Memory can coexist as a separate server, but is not a dependency. To encourage consistent use, add this guidance to the consuming project's AGENTS.md, replacing the project ID:

For UI changes, consult UI Journey MCP using project="your-project":
- Use get_ui_impact for changed files and inspect relevant mapped flows.
- Use get_flow_evidence or compare_flow with exact commit revisions.
- Retrieve screenshots with get_evidence_image when reviewing visual evidence.
- Report missing, failed, stale or unverified evidence explicitly. Never treat
  mapping alone as a successful browser validation.
- If the server is unavailable, state that limitation; do not invent evidence.

These instructions guide tool selection; enforce required browser validation in CI if it must be a merge requirement. Import new collector output into the configured store to keep evidence up to date.

Try a local flow

npx playwright install chromium
node examples/serve.js

The demo prints an unused loopback URL. Keep it running and substitute that URL and the full SHA of the checkout serving the page in another terminal:

node bin/ui-journey.js validate --project demo --flow-file examples/help-flow.json --origin http://127.0.0.1:PORT --revision FULL_COMMIT_SHA --store .ui-journey
node bin/ui-journey.js query get_flow_evidence --args '{"project":"demo","flow":"help"}' --store .ui-journey

Use --channel chrome or --channel msedge for an installed browser. --viewport mobile captures 390 × 844; desktop is 1440 × 1000. validate saves failed evidence and exits nonzero on failed/incomplete validation. It does not start the application: use your project's test-server setup.

The flow file describes a static route, accessible locators, observable states, click/fill transitions and fixture identity. Each edge is reached from a fresh browser context using a shortest path. States without outgoing transitions are captured too. Test fixtures must be deterministic.

Tools

Tool

Result

list_flows

Mapped flows and available revisions; paginated

get_flow

Declared map, executed contract and evidence summary

get_flow_evidence

Outcomes, state screenshots, run, version and freshness

compare_flow

Added/removed/changed states and actions, evidence from both versions

trace_journey

Shortest declared path between states within one flow

get_ui_impact

Flows affected through recorded entry files/dependencies

get_coverage_gaps

Failed or unverified states/transitions in a mapped flow

get_change_evidence

Stored runs carrying a particular PR number

get_evidence_image

A referenced PNG as inline MCP image content

CLI queries use the same names and JSON arguments. All nine MCP tools are read-only. Browser execution is an explicit CLI operation, not an MCP tool in v0.1.

Selection and provenance

  • Mapping is unverified until observations cover every declared state and edge.

  • Exact revision requests never fall back to another revision. With multiple revisions, the caller must select one; SHA ordering is not chronological.

  • Within a revision, the latest known observation time wins, including failures. Unknown/tied times require a run; conflicting records are flagged.

  • Without currentRevision, freshness is unknown. A match means matching the caller's requested revision, not a live production check.

  • Revision, PR, fixture and source identities are caller-supplied. The importer does not authenticate a CI run or prove the URL serves that commit. Your collector must check out the exact revision and provide truthful metadata. Local CLI validation likewise does not attest the identity of the running build.

  • The preserved executed base contract can differ from the new declared map. Both are stored: deleting an action cannot erase a failed attempt to execute it.

  • Comparison is structural/status-based, not an aesthetic or pixel correctness verdict. Missing environment metadata gives environmentComparable: null.

  • Coverage and impact include mapped flows and recorded dependencies only. This server does not yet crawl an application or discover routes itself.

Import CI evidence

Native records follow the snapshot schema, with PNGs named by SHA-256:

node bin/ui-journey.js import --file snapshot.json --images ./images --store /persistent/private/evidence

The adapter also accepts ui-graph/v1: journeys, sha, observations and optional executedContracts. Extra AST inventory fields are ignored. Import both sides separately:

node bin/ui-journey.js import-graph --graph graph-after.json --images ./captures --project shop --run ci-123-after --pr 42 --side after --store /persistent/private/evidence

Supply --observed-at only with the actual execution time. Otherwise time remains unknown, not the import time. Original PNG names must be simple a-z0-9- basenames. Observations must match the graph SHA and executed flow. PNG bytes are copied into the store, so expiration of a CI artifact does not delete imported evidence. Repeating the same import is idempotent.

On ephemeral runners the directory disappears unless you persist/export it. Use a private volume, authenticated transfer or an explicit evidence branch in your integration. This project does not push data or edit PRs automatically. Local MCP requires no GitHub token.

Storage and privacy

store/<project>/records/<sha256>.json
store/<project>/images/<sha256>.png

Records/images are immutable. Images are written before records with atomic create-if-absent operations. Interrupted imports may leave unreferenced blobs; existing records are never overwritten. Graph imports are atomic per record, not across all flows/viewports. No automatic history deletion.

Limits: 20 states/40 transitions per flow, 1 MiB per PNG, 1600 × 1200 maximum dimensions, 4 MiB per JSON, 10,000 records/64 MiB metadata per project. Lists default to 20 and allow 50 results. Partition large stores. PNG signatures, chunk boundaries and dimensions are checked, not fully decoded. Hashes detect corruption, not authorship.

Keep screenshots/data in a separate private store, never this public repository. Use sanitized fixtures; images may contain secrets or personal data. The package allowlist includes source and synthetic examples only.

The stdio server reads every project in its configured store. Project IDs provide namespacing, not tenant authorization. Scope stores and filesystem access per client. No remote HTTP server/authentication is included. Symlinked store directories, nonregular files and traversal IDs are rejected; this is not a sandbox against a concurrent attacker controlling the same filesystem.

CLI validation permits loopback HTTP, fresh contexts, same-origin GET/HEAD, no service workers/WebSockets and fixture 404s for /api/. Browser processes receive a narrow environment without host tokens. The page's JavaScript still runs: use a local test application and sandbox untrusted code. GET can have server-side effects. This is not a general OS/network sandbox. No production credentials, authenticated flows, arbitrary JavaScript tools, model API or telemetry.

Development

npm ci
npm test
npm run check
npx playwright install chromium
npm run test:browser
npm audit
npm pack --dry-run

Tests cover selection, stale/unknown evidence, removed contracts, corruption, traversal, concurrency and a real MCP stdio client. Browser integration uses synthetic pages for success, regression, mobile, blocked POST and MCP image delivery. See CONTRIBUTING.md.

Built on the official MCP SDK and Playwright.

Available Tools

9 tools
compare_flowB
Read-onlyIdempotent

Compare contracts and evidence for two exact revisions. This is a structural/status comparison, not an aesthetic image verdict.

ParametersJSON Schema
NameRequiredDescriptionDefault
flowYes
afterYes
beforeYes
projectYes
afterRunNo
beforeRunNo

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so safety is covered. The description adds a useful behavioral boundary (structural/status comparison rather than image verdict), but says nothing about how missing revisions are handled or what the comparison output looks like.

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

Conciseness5/5

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

Two short sentences with the core scope front-loaded and the disambiguating caveat second; no filler or repetition.

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

Completeness3/5

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

For a 6-parameter comparison tool with no output schema, the description should explain the two optional *Run parameters and give some sense of the returned diff. It partially covers the return nature ('structural/status comparison') but leaves the extra parameters and result shape unaddressed.

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

Parameters2/5

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

Schema description coverage is 0% across 6 parameters, so the description must carry the burden and largely does not. 'Two exact revisions' weakly implies before/after are full revision identifiers, but flow, project, beforeRun and afterRun are never explained, leaving half the parameters undocumented anywhere.

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

Purpose4/5

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

States a specific verb (Compare) and a clear scope (two exact revisions), and rules out one adjacent capability by saying it is 'not an aesthetic image verdict', which routes the agent away from get_evidence_image/get_ui_impact. The resource wording ('contracts and evidence') is jargon that never maps explicitly to flows/projects, so it is clear but not perfectly crisp.

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

Usage Guidelines3/5

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

Usage is only implied: 'for two exact revisions' tells the agent the required inputs but not when to prefer this over get_change_evidence, get_flow_evidence, or get_flow. The one negative exclusion ('not an aesthetic image verdict') is a partial when-not, so guidance exists but is thin.

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

get_change_evidenceB
Read-onlyIdempotent

Find stored runs associated with a PR number and optionally an exact revision. PR metadata is supplied by the importer, not authenticated by this server.

ParametersJSON Schema
NameRequiredDescriptionDefault
prYes
limitNo
offsetNo
projectYes
revisionNo

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior, but the description adds genuinely new trust context: PR metadata comes from the importer and is not authenticated by this server. That is a meaningful caveat about data provenance that the annotations do not convey.

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

Conciseness5/5

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

Two tightly written sentences with the core retrieval semantics front-loaded and the provenance caveat second. Nothing is redundant or padded.

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

Completeness2/5

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

With no output schema, five parameters at 0% description coverage, and a required 'project' parameter never referenced, the description is not complete enough to invoke this confidently. The nature of the returned 'stored runs' and the effect of limit/offset are left entirely to inference.

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

Parameters2/5

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

Schema description coverage is 0% across five parameters, so the description carries the full burden. It clarifies that 'pr' is a PR number and that 'revision' is an exact revision, but never mentions the required 'project' parameter or explains 'limit'/'offset' pagination, leaving three of five parameters undocumented.

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

Purpose4/5

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

States a specific verb and resource: 'Find stored runs associated with a PR number'. Combined with the optional revision qualifier, an agent knows this retrieves persisted run records keyed by PR. It does not, however, distinguish itself from the sibling get_flow_evidence, which by name sounds adjacent.

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

Usage Guidelines2/5

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

There is no when-to-use / when-not-to-use guidance and no named alternative, despite the presence of get_flow_evidence in the sibling set. The only usage signal is that a revision is optional, which is closer to parameter description than routing guidance.

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

get_coverage_gapsC
Read-onlyIdempotent

List unverified or failed mapped states/transitions for one flow. Does not claim exhaustive application coverage.

ParametersJSON Schema
NameRequiredDescriptionDefault
runNo
flowYes
projectYes
revisionNo
currentRevisionNo

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds one genuinely useful behavioural caveat — that results are not claimed to be exhaustive coverage — which warns the agent against treating an empty result as proof of full coverage. It says nothing about permissions, result shape, or pagination.

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?

Two short sentences, front-loaded with the action and followed by the scope caveat. No filler or restatement of the name. Could be slightly more economical only by folding the caveat into the same sentence.

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

Completeness2/5

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

For a five-parameter read query with no output schema and no parameter documentation, the description is too thin. It does not explain the difference between the required and optional identifiers, nor what the returned gap records look like, so an agent cannot confidently construct a correct call from it alone.

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

Parameters2/5

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

Schema description coverage is 0% across five parameters, so the description must carry the burden and largely does not. 'For one flow' loosely maps to the required flow parameter, but project, run, revision and currentRevision are never explained or distinguished (e.g. revision vs currentRevision). The agent is left guessing what identifiers to supply.

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

Purpose4/5

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

States a specific verb (List) and resource (unverified or failed mapped states/transitions) scoped to one flow, which is more precise than the bare name. The caveat 'Does not claim exhaustive application coverage' further bounds the result set. It does not explicitly contrast with siblings like get_flow_evidence or compare_flow, so characterisation is clear but not differentiated.

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

Usage Guidelines2/5

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

No statement of when to reach for this tool versus the other flow-related siblings (get_flow, get_flow_evidence, compare_flow). The 'one flow' scoping implies the required inputs but gives no triggers, prerequisites, or exclusions. Usage is left entirely to inference.

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

get_evidence_imageA
Read-onlyIdempotent

Return a stored PNG inline for a project and content hash obtained from get_flow_evidence. Never fetches arbitrary URLs or paths.

ParametersJSON Schema
NameRequiredDescriptionDefault
digestYes
projectYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description still adds real context: the return is an inline PNG (not a path/URL), and the tool will not fetch arbitrary URLs or paths — a useful security boundary. It stops short of mentioning size limits or error behavior for an unknown digest.

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

Conciseness5/5

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

Two sentences with zero filler; the core action and its inputs come first, and the negative constraint follows as a useful qualifier. Every clause earns its place.

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

Completeness4/5

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

With no output schema, the description correctly specifies the return payload (inline PNG), which is the key missing structured information. Combined with the digest provenance and the security constraint, an agent has what it needs, though failure modes for a stale or unknown digest are unaddressed.

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?

Schema description coverage is 0%, so the description must carry the load, and it does partially: it explains that the digest is a content hash obtained from get_flow_evidence, which the raw regex pattern alone would not convey. The project parameter's meaning is only implied by its name, so one gap remains.

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?

States a specific verb and resource ('Return a stored PNG inline') plus exact scoping ('for a project and content hash'), and names the sibling get_flow_evidence that produces the hash. An agent can distinguish this from get_flow_evidence or get_change_evidence without opening any schema.

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

Usage Guidelines4/5

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

Gives clear routing guidance by naming get_flow_evidence as the source of the digest, and adds a when-not boundary ('Never fetches arbitrary URLs or paths'). It does not explicitly contrast against every sibling, but for an image-retrieval tool the alternative space is effectively empty, so this is close to sufficient.

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

get_flowC
Read-onlyIdempotent

Get the mapped states, transitions and source dependencies of a flow.

ParametersJSON Schema
NameRequiredDescriptionDefault
runNo
flowYes
projectYes
revisionNo
currentRevisionNo

TDQS

C2.9/5.0
Behavior3/5

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

The annotations already declare read-only, idempotent, non-destructive, closed-world behavior, lowering the disclosure burden. The description adds useful output-content context (states, transitions, source dependencies), but says nothing about permissions, pagination, or how run/revision parameters affect behavior.

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

Conciseness5/5

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

A single front-loaded sentence states the tool's purpose and output without filler. Every word contributes to the description, and the structure is appropriately terse.

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

Completeness2/5

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

For a five-parameter tool with 0% schema description coverage and no output schema, the description is incomplete. It names the returned concepts but does not explain parameter behavior, usage context, or how to select between this and sibling tools.

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

Parameters1/5

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

Schema description coverage is 0% and there are five parameters, yet the description mentions none of them by name or meaning. The unqualified phrase 'of a flow' does not explain project, run, revision, or currentRevision, leaving critical parameter semantics undocumented.

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

Purpose4/5

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

The description gives a specific verb ('Get') and resource ('flow') and enumerates the returned content: mapped states, transitions, and source dependencies. It is clearly distinguishable from list_flows or compare_flow by content, though it does not explicitly name any sibling alternative.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as list_flows, get_flow_evidence, or compare_flow. The intended context is only implied by the phrase 'of a flow,' with no explicit when/when-not conditions or prerequisites.

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

get_flow_evidenceB
Read-onlyIdempotent

Read stored flow evidence, screenshots and failures. Does not run a browser. Supply an exact revision when multiple versions exist.

ParametersJSON Schema
NameRequiredDescriptionDefault
runNo
flowYes
projectYes
revisionNo
currentRevisionNo

TDQS

B3.4/5.0
Behavior4/5

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

With annotations already declaring readOnlyHint, idempotentHint, and destructiveHint=false, the description adds the important constraint that it 'Does not run a browser,' clarifying it's a read-only retrieval from storage. It also hints at revision handling, adding useful context beyond annotations.

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?

The description is three concise sentences with no waste, and the key constraint (no browser) is front-loaded. It could be slightly more structured, but it's efficient.

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

Completeness3/5

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

Given 5 parameters, 0% schema description coverage, and no output schema, the description is partially complete but leaves significant gaps about parameters and return values. It covers the core action and one parameter, but more detail is needed for full completeness.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate, but it only mentions 'revision' and 'multiple versions' without explaining other parameters like run, flow, project, or the distinction between revision and currentRevision. Most parameter semantics are left undocumented.

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

Purpose4/5

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

The description states a specific verb+resource ('Read stored flow evidence, screenshots and failures'), making the purpose clear. It doesn't explicitly differentiate from siblings like get_change_evidence or get_evidence_image, but the focus on 'flow' and 'stored' is distinctive.

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

Usage Guidelines3/5

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

The description implies usage by stating 'Does not run a browser' and 'Supply an exact revision when multiple versions exist.' However, it doesn't specify when to use this tool versus alternatives such as get_evidence_image or get_change_evidence, leaving the agent to infer.

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

get_ui_impactB
Read-onlyIdempotent

Find mapped flows whose declared entry files or recorded dependency closures intersect changed files. Unknown coverage remains possible.

ParametersJSON Schema
NameRequiredDescriptionDefault
filesYes
limitNo
offsetNo
projectYes
revisionYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's job is to add context beyond that. It does: it discloses the two matching criteria (entry files, dependency closures) and a genuine caveat that 'Unknown coverage remains possible', warning the agent that results may be incomplete. It stops short of any pagination or result-shape detail.

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?

Two tense, front-loaded sentences with no filler; the matching condition leads and the caveat follows. Trimmed to the essentials, though the second sentence is a fragment that could be folded in.

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

Completeness2/5

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

With no output schema, zero schema description coverage on five parameters, and list-style limit/offset inputs, the description should explain what identification (project/revision) and pagination mean here, and roughly what comes back. It explains none of these, leaving the agent under-equipped for correct invocation.

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

Parameters2/5

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

Schema description coverage is 0% and five parameters are undocumented in the schema, so the description carries the full burden. It only hints at the 'files' parameter via 'changed files'; project, revision, limit, and offset are never explained, leaving required scoping and pagination semantics entirely to inference.

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

Purpose4/5

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

The description gives a specific verb ('Find') and a precise resource ('mapped flows'), plus the exact matching condition (declared entry files or recorded dependency closures intersecting changed files). It is clearly an impact-analysis query, though it never names a sibling to sharpen the distinction from get_change_evidence or get_flow_evidence.

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

Usage Guidelines3/5

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

The presence of a 'files' input and the phrase 'changed files' implies the tool is used to assess impact for a changeset, but there is no explicit when-to-use statement, no exclusions, and no routing to alternatives such as get_change_evidence. Usage is inferable rather than stated.

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

list_flowsB
Read-onlyIdempotent

List mapped flows and available exact revisions. Mapping alone is not execution evidence.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
offsetNo
projectYes
revisionNo

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnly=true, idempotent=true, destructive=false, closed-world, so the safety profile is covered. The description adds real domain value by warning that mapping is not proof of execution, but says nothing about pagination behavior (limit/offset) or result shape.

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

Conciseness5/5

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

Two short sentences, front-loaded with the core action, and the caveat earns its place by preventing misuse of the output as execution evidence.

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

Completeness2/5

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

No output schema and no annotation-derived return description, so the agent is not told what a listed flow record contains or how pagination behaves. With four undocumented parameters and a non-obvious caveat about evidence semantics, the description leaves meaningful gaps.

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

Parameters2/5

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

Schema description coverage is 0% for all four parameters, so the description must compensate and largely does not. 'Available exact revisions' hints that the revision parameter filters by exact commit, but project, limit, and offset are left entirely undocumented in both places.

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

Purpose4/5

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

States a specific verb ('List') and resource ('flows'), plus an additional scope ('available exact revisions'). An agent can distinguish it from get_flow/get_flow_evidence by name, though the description never explicitly names a sibling or spells out the list-vs-single distinction.

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

Usage Guidelines3/5

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

Usage is implied by 'List mapped flows', and the caveat 'Mapping alone is not execution evidence' gestures at when to prefer the evidence siblings, but it never names them or states an explicit condition for choosing this tool over get_flow or get_flow_evidence.

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

trace_journeyB
Read-onlyIdempotent

Find a shortest declared interaction path within a mapped flow. A path is not proof it passed.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
runNo
flowYes
fromNo
projectYes
revisionNo
currentRevisionNo

TDQS

B3.2/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, and closed-world behavior, so the safety profile is covered. The description adds genuinely non-structured context with 'A path is not proof it passed,' warning the agent not to treat a declared path as observed runtime evidence — a meaningful epistemic caveat that goes 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.

Conciseness5/5

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

Two short sentences, front-loaded with the action, and the second sentence is a high-value caveat rather than filler. No sentence is wasted.

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

Completeness2/5

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

For a 7-parameter, no-output-schema tool with 0% schema coverage, the description is too thin: it never explains the run/revision/currentRevision selectors or what the returned path actually contains. The epistemic caveat is helpful but does not compensate for the missing parameter context.

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

Parameters2/5

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

Schema description coverage is 0% across 7 parameters, so the description carries the full burden. It only implicitly gestures at flow and from/to nodes and says nothing about run, revision, currentRevision, or project — leaving several parameters undocumented in both the schema and the description.

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

Purpose4/5

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

The description states a specific verb ('Find') and a specific resource ('shortest declared interaction path within a mapped flow'), which is far more precise than the bare name trace_journey. It does not explicitly differentiate itself from siblings such as get_flow_evidence or compare_flow, so it stops short of a 5.

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

Usage Guidelines2/5

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

There is no explicit when-to-use or when-not-to-use guidance, and no sibling is named as an alternative. The phrase 'declared interaction path' hints that this differs from evidence-oriented siblings, but the agent must infer that contrast rather than being told it.

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.

  1. 9 tool updatesv0.1.0
    • First observedcompare_flow
    • First observedget_change_evidence
    • First observedget_coverage_gaps
    • First observedget_evidence_image
    • First observedget_flow
    • First observedget_flow_evidence
    • First observedget_ui_impact
    • First observedlist_flows
    • First observedtrace_journey

TDQS

A3.5/5.0

Scored across 9 tools

Disambiguation4/5

Each tool has a fairly distinct purpose: listing, fetching metadata, fetching evidence, comparing revisions, tracing paths, and finding impact/coverage gaps. Some overlap exists between get_flow_evidence and get_change_evidence, and between get_ui_impact and get_coverage_gaps, but descriptions clarify retrieval vs. discovery and revision vs. PR context.

Naming Consistency5/5

All nine tools follow a consistent snake_case verb_noun pattern (list_flows, get_flow, compare_flow, trace_journey, get_evidence_image), with no mixed casing or verb styles.

Tool Count5/5

Nine tools is a well-scoped set for a UI journey/evidence server, covering discovery, inspection, comparison, tracing, and impact analysis without bloat.

Completeness4/5

The surface covers the lifecycle of mapping, retrieving, comparing, tracing, and gap analysis, but lacks explicit create/update/delete operations for flows or mappings, so agents cannot mutate mappings through this server.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables coding agents to access recorded browser flows (user actions, network, console, etc.) for debugging and regression testing without reproducing issues.
    110
    Apache 2.0
  • A
    license
    A
    quality
    B
    maintenance
    Enables agents to validate UI designs for missing states, accessibility issues, and journey completeness using state machine modeling.
    17
    1
    MIT