qa-screens
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| FIGMA_TOKEN | No | Figma access token for sync_figma. | |
| GITHUB_TOKEN | No | Fallback GitHub token for error reporting. | |
| GEMINI_API_KEY | No | API key for optional Gemini AI critique. | |
| QA_SCREENS_PROFILE | No | Overrides the default_profile config. Name of the auth profile to use by default. | |
| QA_SCREENS_BASE_URL | No | Overrides the base_url config. The base URL of the site under test. | http://localhost:8080 |
| QA_SCREENS_STATE_DIR | No | Directory for storing profiles and reports. Defaults to ~/.local/state/qa-screens. | |
| QA_SCREENS_THRESHOLD | No | Overrides the threshold config. Minimum SSIM score to pass. | 0.90 |
| QA_SCREENS_ISSUE_REPO | No | Repository to file issues against, e.g. 'owner/repo'. | astuanax/qa-screens |
| QA_SCREENS_GITHUB_TOKEN | No | GitHub token for filing issues. Falls back to GITHUB_TOKEN. | |
| QA_SCREENS_REFERENCES_DIR | No | Overrides the references_dir config. Directory with reference screenshots. | screenshots |
| QA_SCREENS_ROUTE_TEMPLATE | No | Overrides the route_template config. Template mapping page names to URLs. | /{name}/ |
| QA_SCREENS_ERROR_REPORTING | No | Control error reporting: on, local, or off. | on |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": false
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| qa_configA | Show the effective configuration (base URL, reference dir, route mapping), the reference screenshots found and the available auth profiles. Start here. |
| run_qaA | Capture pages from the running site and SSIM-compare them with the reference screenshots. pages: reference names (file names without extension); default all references.
viewport: all | desktop | mobile (names ending in "-mobile" use a 390px mobile context).
profile: auth profile for pages behind a login.
align: how to handle different image sizes — resize (default, legacy), crop, or pad
(pad makes page-height changes count as differences).
A page FAILs when SSIM < threshold OR more than max_changed_ratio of its pixels clearly
changed colour (catches local changes such as a recoloured header that SSIM averages away).
Returns a JSON summary (failures first, with changed regions in px) plus side-by-side
reference|live preview images of up to |
| qa_pageB | QA a single page against its reference (fast iteration while fixing).
|
| captureA | Screenshot any URL (desktop or mobile viewport, optionally logged in via |
| compare_imagesA | SSIM-compare two image files (e.g. a Figma export vs a capture). Paths may be relative to the project root. Returns score, changed regions, a heatmap path and an a|b preview. |
| capture_setA | Capture a named set of pages (e.g. label="before" before a refactor, "after" after it).
Pages default to all reference names; any names work if you pass |
| compare_setsB | Diff two capture sets (labels from capture_set, or directories). |
| ab_compareC | Compare two running servers (e.g. main branch on :8080 vs a worktree on :8091) page by page. |
| update_referenceA | Make the current look of a page its reference screenshot: from |
| sync_figmaA | Download Figma frames into the references directory (needs FIGMA_TOKEN). Frame names become reference names; overwrites existing references with the same name. |
| auth_profilesA | List auth profiles, or show one (secrets are never shown). |
| auth_update_profileA | Create or update an auth profile. Only the fields you pass change (dicts are merged). Any secret may be given as "env:VAR_NAME" so it is read from the server's environment instead of passing through the conversation — prefer that. origins: origins that receive headers/tokens, e.g. ["https://app.example.com"] (default: the base_url's origin). Credentials are never sent to other origins. access_token/token_type/expires_in/refresh_token: a bearer token you already have. apply_token_as: where the app expects the token — any of "header" (Authorization: Bearer), "header:X-Api-Key", "local_storage:", "session_storage:", "local_storage_json:" (whole token object as JSON), "cookie:". oauth: {grant_type: client_credentials|password|refresh_token|authorization_code, token_url, client_id, client_secret, scope, audience, username, password, authorize_url, redirect_uri, client_auth: post|basic, extra_params}. For client_credentials/password a token is fetched immediately and refreshed automatically. For authorization_code, call auth_oauth_login next. cookies: Playwright cookies [{name, value, url} or {name, value, domain, path}]. local_storage/session_storage: {origin: {key: value}} injected before page scripts run. http_credentials: {username, password} for HTTP basic auth. clear: field names to remove, e.g. ["token", "cookies", "storage_state"]. |
| auth_browser_loginA | Log in with a real browser and save the session (cookies, localStorage and
sessionStorage) into profile headed=true opens a visible window where the user logs in (or finishes MFA); if
username/password are given (use "env:VAR" for secrets) the form is filled first.
Completion is detected by |
| auth_oauth_loginA | Run the OAuth authorization-code + PKCE flow for profile |
| auth_import_storage_stateB | Import a Playwright storage-state JSON (cookies + localStorage), e.g. from a Playwright
test setup's |
| auth_checkA | Open |
| auth_delete_profileB | Delete an auth profile and its saved session. |
| error_reportsA | Show automatic error-reporting status (pending/reported crash and error reports, target repo). flush=true posts pending reports to GitHub now. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 18 tools
Most tools have clearly distinct purposes: run_qa vs qa_page, capture vs capture_set, and compare_images vs compare_sets vs ab_compare are separated by scope. The main ambiguity is between auth_browser_login and auth_oauth_login, though their descriptions clarify the different login flows.
Tool names follow a mostly predictable snake_case style, with useful prefixes like qa_ and auth_. However, the pattern is not strictly verb_noun: capture and ab_compare stand out, and names like qa_config or error_reports are noun-style rather than action-first.
18 tools is on the heavy side, especially considering the 7-tool auth sub-system alongside the core screenshot/compare workflow. It is not excessive in absolute terms, but it crosses into the range where the set starts to feel bloated.
The core visual QA lifecycle is well covered: references, captures, comparisons, set diffs, and running-server diffs are all present, and auth profile management is thorough. Minor gaps exist such as no direct tool for deleting references or listing capture sets, but these can be worked around.