ViewportWitness by Apex Labs
Agent website testing: browser QA, visual regression, Markdown extraction, and security checks.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"viewport-witness": {
"url": "https://qa.honeygate.app/mcp"
}
}
}Remote endpoints
https://qa.honeygate.app/mcpstreamable-httpWhat it can do
Tool inventory
Tools (6)
🔴check_page(url)
Choose this for broad website testing when the caller wants screenshots, responsive layout checks, accessibility findings, console/network errors, performance evidence, and a release diagnosis across phone portrait, phone landscape, and desktop. For explicit pass/fail assertions use verify_page instead. Costs $0.08 USDC via x402. Requires an x402-aware client to authorise payment; standard AI assistants cannot automatically sign x402.
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2048,
"description": "Public HTTPS page URL. Private, loopback, credentialed, and non-HTTPS URLs are rejected."
}
},
"required": [
"url"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🔴verify_page(url, assertions)
Choose this only when the caller supplies explicit website assertions that need pass/fail results across three viewports. For broad exploratory browser QA use check_page instead. Assertion types: noHorizontalOverflow, noConsoleErrors, textVisible, titleIncludes, selectorExists, selectorVisible. Costs $0.10 USDC via x402. Requires an x402-aware client; standard AI assistants cannot automatically sign x402.
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2048,
"description": "Public HTTPS page URL. Private, loopback, credentialed, and non-HTTPS URLs are rejected."
},
"assertions": {
"type": "array",
"items": {
"anyOf": [
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "noHorizontalOverflow"
}
},
"required": [
"type"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "noConsoleErrors"
}
},
"required": [
"type"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "textVisible"
},
"value": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Visible text to find on the rendered page."
}
},
"required": [
"type",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "titleIncludes"
},
"value": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"description": "Text that the document title must include."
}
},
"required": [
"type",
"value"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "selectorExists"
},
"selector": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "CSS selector that must exist in the DOM."
}
},
"required": [
"type",
"selector"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"type": {
"type": "string",
"const": "selectorVisible"
},
"selector": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "CSS selector that must be visibly rendered."
}
},
"required": [
"type",
"selector"
],
"additionalProperties": false
}
]
},
"minItems": 1,
"maxItems": 20,
"description": "One to twenty explicit pass/fail assertions to evaluate across all three viewports."
}
},
"required": [
"url",
"assertions"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🔴compare_page(url, baselineJobId)
Choose this for visual regression testing after check_page has produced a completed, unexpired baseline. Compares screenshots and QA evidence, returning pixel-diff percentages, new or resolved accessibility issues, error deltas, performance evidence, and diagnosis. Costs $0.12 USDC via x402. Requires an x402-aware client; standard AI assistants cannot automatically sign x402.
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2048,
"description": "Public HTTPS page URL. Private, loopback, credentialed, and non-HTTPS URLs are rejected."
},
"baselineJobId": {
"type": "string",
"format": "uuid",
"description": "Completed, unexpired ViewportWitness check job to use as the visual baseline."
}
},
"required": [
"url",
"baselineJobId"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🔴extract_page(url, maxOutputTokens)
Choose this when an agent needs the readable content of a public webpage as deterministic clean Markdown, without screenshots or browser execution. Costs $0.005 USDC via x402.
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2048,
"description": "Public HTTPS page URL. Private, loopback, credentialed, and non-HTTPS URLs are rejected."
},
"maxOutputTokens": {
"type": "integer",
"minimum": 500,
"maximum": 12000,
"description": "Optional approximate output budget from 500 to 12000 tokens."
}
},
"required": [
"url"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🔴web_release_gate(url)
Choose this for a passive website release-security review of headers, cookie flags, mixed content, cross-origin script integrity, and server disclosure. It does not run browser QA, probe the site, execute code, or replace a security audit. Costs $0.05 USDC via x402.
Input Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 2048,
"description": "Public HTTPS page URL. Private, loopback, credentialed, and non-HTTPS URLs are rejected."
}
},
"required": [
"url"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_report(jobId)
Retrieve the status or completed QA report for a previously submitted job. Free and read-only. Poll until status is "complete", "failed", or "retryable". No payment required.
Input Schema
{
"type": "object",
"properties": {
"jobId": {
"type": "string",
"format": "uuid",
"description": "ViewportWitness job UUID returned by a paid tool."
}
},
"required": [
"jobId"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}Community
Evidence