Server definition
- Hash
- sha256:324063d798ddc454b876a4584627d433edb39aa551cf5647a80a739b2711a3d1
- What it is
- What a remote MCP server returned when asked what it offers: 10 tools
The blob, as servednamed by its sha256
{
"instructions": "DiffiCat compares a site against its migrated copy on page existence, content and visual regression. Every tool's structuredContent has the shape of the matching REST operation, except that get_report leaves out text unless the call passes includeText: true (its text block is always the plain-text report); the OpenAPI document at https://app.difficat.com/api/v1/openapi.json carries a response example per operation, and a real three-page report is at https://difficat.com/agents/sample/report.json. start_comparison's maxPages is optional: a ceiling, not a reservation. A job is priced on the pages it compares (the urls list, or the pages discovery finds, at most maxPages), and there is no page limit. A single-page comparison is a urls list with one pair (no sourceUrl needed), or maxPages: 1 with the page URLs as sourceUrl and targetUrl; either is priced as one page and runs no discovery. The discovery that prices a job without urls is not charged; discover_pages is a separate, optional purchase for callers who want the page list itself. Give callbackUrl to receive one JSON POST when a job ends instead of waiting. recover_comparison returns a job whose result was lost, given the same payment credential.",
"tools": [
{
"description": "Stop a running job; the job reports cancelled within a minute, with the pages compared so far in its report. Free.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"jobId": {
"description": "The jobId returned when the job was created, e.g. web-1a2b3c.",
"pattern": "^web-[a-z0-9-]+$",
"type": "string"
},
"jobToken": {
"description": "The jobToken returned when the job was created. Optional when the request carries the prepaid key that paid the job (Authorization: Bearer dck_…).",
"maxLength": 200,
"minLength": 20,
"type": "string"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "cancel_comparison",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"error": {
"type": "string"
},
"status": {
"const": "cancelling",
"type": "string"
}
},
"type": "object"
}
},
{
"description": "Full-page PNG of one URL. Returns the image (or, for a large one, links.file to fetch with the jobToken) plus a jobId/jobToken for get_screenshot. Paid in USDC (the 402 challenge names the network), or from a prepaid balance when the request carries Authorization: Bearer dck_…: 0.02 USD per call. Answers with jobId, jobToken, filename, url, dimensions, bytes and links.file.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"auth": {
"description": "HTTP basic auth for the page.",
"properties": {
"password": {
"description": "Password for HTTP basic auth.",
"maxLength": 512,
"type": "string"
},
"username": {
"description": "Username for HTTP basic auth.",
"maxLength": 512,
"type": "string"
}
},
"required": [
"username",
"password"
],
"type": "object"
},
"url": {
"description": "Page to capture (full URL).",
"maxLength": 2048,
"minLength": 1,
"type": "string"
},
"viewportWidth": {
"description": "Capture width in px.",
"maximum": 2560,
"minimum": 320,
"type": "integer"
}
},
"required": [
"url"
],
"type": "object"
},
"name": "capture_screenshot",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"bytes": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"code": {
"type": "string"
},
"dimensions": {
"additionalProperties": {},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"error": {
"type": "string"
},
"filename": {
"type": "string"
},
"jobId": {
"type": "string"
},
"jobToken": {
"type": "string"
},
"links": {
"additionalProperties": false,
"properties": {
"file": {
"type": "string"
}
},
"required": [
"file"
],
"type": "object"
},
"payment": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"amount": {
"type": "string"
},
"balance": {
"type": "string"
},
"currency": {
"const": "USD",
"type": "string"
},
"rail": {
"const": "prepaid",
"type": "string"
}
},
"required": [
"amount",
"currency",
"rail",
"balance"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"allowanceRemaining": {
"type": "number"
},
"amount": {
"type": "string"
},
"currency": {
"const": "USD",
"type": "string"
},
"pagesFromAllowance": {
"type": "number"
},
"rail": {
"const": "subscription",
"type": "string"
}
},
"required": [
"amount",
"currency",
"rail",
"pagesFromAllowance",
"allowanceRemaining"
],
"type": "object"
}
]
},
"url": {
"type": "string"
}
},
"type": "object"
}
},
{
"description": "List the pages of Site A (sitemap, robots.txt, or crawl), mapped onto Site B when given. Paid in USDC (the 402 challenge names the network), or from a prepaid balance when the request carries Authorization: Bearer dck_…: 0.05 USD per call. Answers with pages (sourceUrl, targetUrl, path) and strategy.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"maxPages": {
"description": "Stop after this many pages.",
"maximum": 9007199254740991,
"minimum": 1,
"type": "integer"
},
"sitemapUrl": {
"description": "Sitemap to read instead of the fallbacks.",
"maxLength": 2048,
"minLength": 1,
"type": "string"
},
"sourceUrl": {
"description": "Site A (full URL).",
"maxLength": 2048,
"minLength": 1,
"type": "string"
},
"targetUrl": {
"description": "Site B; pages are mapped onto it when given.",
"maxLength": 2048,
"minLength": 1,
"type": "string"
}
},
"required": [
"sourceUrl"
],
"type": "object"
},
"name": "discover_pages",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"error": {
"type": "string"
},
"pages": {
"items": {
"additionalProperties": false,
"properties": {
"path": {
"type": "string"
},
"sourceUrl": {
"type": "string"
},
"targetUrl": {
"type": "string"
}
},
"required": [
"sourceUrl",
"path"
],
"type": "object"
},
"type": "array"
},
"payment": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"amount": {
"type": "string"
},
"balance": {
"type": "string"
},
"currency": {
"const": "USD",
"type": "string"
},
"rail": {
"const": "prepaid",
"type": "string"
}
},
"required": [
"amount",
"currency",
"rail",
"balance"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"allowanceRemaining": {
"type": "number"
},
"amount": {
"type": "string"
},
"currency": {
"const": "USD",
"type": "string"
},
"pagesFromAllowance": {
"type": "number"
},
"rail": {
"const": "subscription",
"type": "string"
}
},
"required": [
"amount",
"currency",
"rail",
"pagesFromAllowance",
"allowanceRemaining"
],
"type": "object"
}
]
},
"strategy": {
"type": "string"
}
},
"type": "object"
}
},
{
"description": "The prepaid balance and the last 20 ledger entries of the key the request carries as Authorization: Bearer dck_… or X-DiffiCat-Key. For a Pro account’s key the balance is 0.00 and allowance (included pages, pages used, reset time) and overage (amount this period, cap) are returned instead. Free.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "get_balance",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"allowance": {
"additionalProperties": false,
"properties": {
"includedPages": {
"type": "number"
},
"pagesUsed": {
"type": "number"
},
"resetsAt": {
"type": "string"
}
},
"required": [
"includedPages",
"pagesUsed",
"resetsAt"
],
"type": "object"
},
"balance": {
"type": "string"
},
"code": {
"type": "string"
},
"currency": {
"const": "USD",
"type": "string"
},
"error": {
"type": "string"
},
"keyId": {
"type": "string"
},
"overage": {
"additionalProperties": false,
"properties": {
"amount": {
"type": "string"
},
"capUsd": {
"type": "string"
}
},
"required": [
"amount",
"capUsd"
],
"type": "object"
},
"recent": {
"items": {
"additionalProperties": false,
"properties": {
"amount": {
"type": "string"
},
"at": {
"type": "string"
},
"jobId": {
"type": "string"
},
"kind": {
"type": "string"
},
"type": {
"type": "string"
}
},
"required": [
"at",
"type",
"amount"
],
"type": "object"
},
"type": "array"
}
},
"type": "object"
}
},
{
"description": "Status and progress of a job and, once it is terminal, its summary: passed, failed and issuesBySeverity. To wait for the end, call wait_for_comparison instead. Free.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"jobId": {
"description": "The jobId returned when the job was created, e.g. web-1a2b3c.",
"pattern": "^web-[a-z0-9-]+$",
"type": "string"
},
"jobToken": {
"description": "The jobToken returned when the job was created. Optional when the request carries the prepaid key that paid the job (Authorization: Bearer dck_…).",
"maxLength": 200,
"minLength": 20,
"type": "string"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "get_comparison",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"error": {
"type": "string"
},
"jobId": {
"type": "string"
},
"progress": {
"additionalProperties": {},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"status": {
"type": "string"
},
"summary": {
"additionalProperties": {},
"propertyNames": {
"type": "string"
},
"type": "object"
}
},
"type": "object"
}
},
{
"description": "The finished report. Call it first with failedOnly: true: results, total and nextOffset then cover only the pages that failed, while summary still covers every page. Without it, a slice of every page's result (offset and limit, default 50 a call, at most 5000; nextOffset points at the next slice). The text block is the plain-text report over the slice; includeText: true also puts it in structuredContent.text. limit: 1 returns the summary with one result. Free.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"failedOnly": {
"description": "Only pages whose status is fail: results, total, nextOffset and text then cover the failed pages alone, while summary still covers every page.",
"type": "boolean"
},
"includeText": {
"description": "Also return the plain-text report over the slice as structuredContent.text; the text block carries it either way.",
"type": "boolean"
},
"jobId": {
"description": "The jobId returned when the job was created, e.g. web-1a2b3c.",
"pattern": "^web-[a-z0-9-]+$",
"type": "string"
},
"jobToken": {
"description": "The jobToken returned when the job was created. Optional when the request carries the prepaid key that paid the job (Authorization: Bearer dck_…).",
"maxLength": 200,
"minLength": 20,
"type": "string"
},
"limit": {
"description": "Page results to return (default 1000, at most 5000).",
"maximum": 9007199254740991,
"minimum": 1,
"type": "integer"
},
"offset": {
"description": "Index of the first page result to return (default 0).",
"maximum": 9007199254740991,
"minimum": 0,
"type": "integer"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "get_report",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"cancelled": {
"type": "boolean"
},
"code": {
"type": "string"
},
"error": {
"type": [
"string",
"null"
]
},
"jobId": {
"type": "string"
},
"nextOffset": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"results": {
"items": {
"additionalProperties": {},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"type": "array"
},
"status": {
"type": "string"
},
"summary": {
"additionalProperties": {},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"text": {
"type": "string"
},
"total": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
}
},
"type": "object"
}
},
{
"description": "Fetch one screenshot PNG by filename. Call it when a get_report page result or a capture_screenshot result names a screenshot you want to see; a PNG over the inline cap comes back as links.file to fetch with the jobToken. Free.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"filename": {
"description": "A screenshot filename from the report.",
"pattern": "^[a-zA-Z0-9_-]+\\.png$",
"type": "string"
},
"jobId": {
"description": "The jobId returned when the job was created, e.g. web-1a2b3c.",
"pattern": "^web-[a-z0-9-]+$",
"type": "string"
},
"jobToken": {
"description": "The jobToken returned when the job was created. Optional when the request carries the prepaid key that paid the job (Authorization: Bearer dck_…).",
"maxLength": 200,
"minLength": 20,
"type": "string"
}
},
"required": [
"jobId",
"filename"
],
"type": "object"
},
"name": "get_screenshot",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"bytes": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"code": {
"type": "string"
},
"dimensions": {
"additionalProperties": {},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"error": {
"type": "string"
},
"filename": {
"type": "string"
},
"jobId": {
"type": "string"
},
"jobToken": {
"type": "string"
},
"links": {
"additionalProperties": false,
"properties": {
"file": {
"type": "string"
}
},
"required": [
"file"
],
"type": "object"
},
"payment": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"amount": {
"type": "string"
},
"balance": {
"type": "string"
},
"currency": {
"const": "USD",
"type": "string"
},
"rail": {
"const": "prepaid",
"type": "string"
}
},
"required": [
"amount",
"currency",
"rail",
"balance"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"allowanceRemaining": {
"type": "number"
},
"amount": {
"type": "string"
},
"currency": {
"const": "USD",
"type": "string"
},
"pagesFromAllowance": {
"type": "number"
},
"rail": {
"const": "subscription",
"type": "string"
}
},
"required": [
"amount",
"currency",
"rail",
"pagesFromAllowance",
"allowanceRemaining"
],
"type": "object"
}
]
},
"url": {
"type": "string"
}
},
"type": "object"
}
},
{
"description": "Returns the job or screenshot the payment credential in _meta paid for, with a new jobToken that replaces the old one. For a paid call whose result never arrived. Free.",
"inputSchema": {
"properties": {},
"type": "object"
},
"name": "recover_comparison",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"error": {
"type": "string"
},
"filename": {
"type": "string"
},
"jobId": {
"type": "string"
},
"jobToken": {
"type": "string"
},
"links": {
"additionalProperties": false,
"properties": {
"file": {
"type": "string"
}
},
"required": [
"file"
],
"type": "object"
},
"status": {
"type": "string"
}
},
"type": "object"
}
},
{
"description": "Compare Site A against Site B on page existence, content and visual regression. Charged upfront. Paid in USDC (the 402 challenge names the network), or from a prepaid balance when the request carries Authorization: Bearer dck_…: 0.02 USD per page for the first 1000 pages and 0.01 USD per page beyond. One single-page comparison per client address per day is free without a payment credential or prepaid key; sample report: https://difficat.com/agents/sample/report.json. dryRun: true answers the page count and exact amount without charging or starting a job. maxPriceUsd refuses a job priced above it before any challenge. A settled charge is final: cancelling, a failed job or partial results do not reduce it. Then wait_for_comparison holds until the job ends; its summary.issuesBySeverity is the verdict, and get_report with failedOnly: true lists the failed pages. Answers with jobId, jobToken, status and pagesCharged, plus sample on the free run.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"callbackUrl": {
"description": "Optional https URL that receives one JSON POST when the job ends (jobId, status, summary, links; never the jobToken), a nudge to read the job. Public hosts only, no redirects followed, retried twice; delivery never affects the job.",
"maxLength": 2048,
"minLength": 1,
"type": "string"
},
"dryRun": {
"description": "Quote only: runs every check and the pricing, then answers the page count and exact amount. Nothing is charged, the free sample is not used and no job starts; the same body without dryRun is priced from the retained result.",
"type": "boolean"
},
"maxPages": {
"description": "Optional ceiling on the pages compared and charged for. The job is priced on the pages it compares: the urls list, or the pages discovery finds, at most this many. There is no page limit.",
"maximum": 9007199254740991,
"minimum": 1,
"type": "integer"
},
"maxPriceUsd": {
"description": "Optional spend cap in USD. A job priced above it is refused before any challenge, so an auto-paying client is never asked for more.",
"exclusiveMinimum": 0,
"type": "number"
},
"sitemapUrl": {
"description": "Sitemap to discover pages from.",
"maxLength": 2048,
"minLength": 1,
"type": "string"
},
"sourceAuth": {
"description": "HTTP basic auth for Site A.",
"properties": {
"password": {
"description": "Password for HTTP basic auth.",
"maxLength": 512,
"type": "string"
},
"username": {
"description": "Username for HTTP basic auth.",
"maxLength": 512,
"type": "string"
}
},
"required": [
"username",
"password"
],
"type": "object"
},
"sourceUrl": {
"description": "Site A, the reference site (full URL). Required unless urls is given.",
"maxLength": 2048,
"minLength": 1,
"type": "string"
},
"targetAuth": {
"description": "HTTP basic auth for Site B.",
"properties": {
"password": {
"description": "Password for HTTP basic auth.",
"maxLength": 512,
"type": "string"
},
"username": {
"description": "Username for HTTP basic auth.",
"maxLength": 512,
"type": "string"
}
},
"required": [
"username",
"password"
],
"type": "object"
},
"targetUrl": {
"description": "Site B, the migrated site. Omit to capture screenshots of Site A only.",
"maxLength": 2048,
"minLength": 1,
"type": "string"
},
"threshold": {
"description": "Visual diff tolerance as a fraction from 0 (exact) to 1: 0.05 means 5%. The web app takes a percentage; the API does not.",
"maximum": 1,
"minimum": 0,
"type": "number"
},
"urls": {
"description": "Explicit page pairs to compare; skips discovery and is priced per pair. One pair is a single-page comparison and needs no sourceUrl.",
"items": {
"properties": {
"source": {
"description": "Page URL on Site A.",
"maxLength": 2048,
"minLength": 1,
"type": "string"
},
"target": {
"description": "The same page's URL on Site B.",
"maxLength": 2048,
"minLength": 1,
"type": "string"
}
},
"required": [
"source",
"target"
],
"type": "object"
},
"minItems": 1,
"type": "array"
},
"viewportWidth": {
"description": "Capture width in px.",
"maximum": 2560,
"minimum": 320,
"type": "integer"
}
},
"type": "object"
},
"name": "start_comparison",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"amount": {
"type": "string"
},
"code": {
"type": "string"
},
"currency": {
"const": "USD",
"type": "string"
},
"dryRun": {
"const": true,
"type": "boolean"
},
"error": {
"type": "string"
},
"jobId": {
"type": "string"
},
"jobToken": {
"type": "string"
},
"pagesCharged": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"pagesPriced": {
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"type": "integer"
},
"payment": {
"anyOf": [
{
"additionalProperties": false,
"properties": {
"amount": {
"type": "string"
},
"balance": {
"type": "string"
},
"currency": {
"const": "USD",
"type": "string"
},
"rail": {
"const": "prepaid",
"type": "string"
}
},
"required": [
"amount",
"currency",
"rail",
"balance"
],
"type": "object"
},
{
"additionalProperties": false,
"properties": {
"allowanceRemaining": {
"type": "number"
},
"amount": {
"type": "string"
},
"currency": {
"const": "USD",
"type": "string"
},
"pagesFromAllowance": {
"type": "number"
},
"rail": {
"const": "subscription",
"type": "string"
}
},
"required": [
"amount",
"currency",
"rail",
"pagesFromAllowance",
"allowanceRemaining"
],
"type": "object"
}
]
},
"sample": {
"type": "boolean"
},
"status": {
"const": "running",
"type": "string"
}
},
"type": "object"
}
},
{
"description": "Waits until the job reaches a terminal status (completed, failed or cancelled) or timeoutSeconds pass (default 60, at most 300), then answers like get_comparison: status, progress and, once terminal, the summary with passed, failed and issuesBySeverity. A wait that runs out answers status \"running\"; call it again. Free.",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"jobId": {
"description": "The jobId returned when the job was created, e.g. web-1a2b3c.",
"pattern": "^web-[a-z0-9-]+$",
"type": "string"
},
"jobToken": {
"description": "The jobToken returned when the job was created. Optional when the request carries the prepaid key that paid the job (Authorization: Bearer dck_…).",
"maxLength": 200,
"minLength": 20,
"type": "string"
},
"timeoutSeconds": {
"description": "Seconds to wait for a terminal status before answering with the current one (default 60, at most 300).",
"maximum": 300,
"minimum": 1,
"type": "integer"
}
},
"required": [
"jobId"
],
"type": "object"
},
"name": "wait_for_comparison",
"outputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false,
"properties": {
"code": {
"type": "string"
},
"error": {
"type": "string"
},
"jobId": {
"type": "string"
},
"progress": {
"additionalProperties": {},
"propertyNames": {
"type": "string"
},
"type": "object"
},
"status": {
"type": "string"
},
"summary": {
"additionalProperties": {},
"propertyNames": {
"type": "string"
},
"type": "object"
}
},
"type": "object"
}
}
]
}Verify it yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:324063d798ddc454b876a4584627d433edb39aa551cf5647a80a739b2711a3d1 | sha256sum