Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,070Paid calls: 1,528Letters: 13Defects: 1,322counted 1 min ago
teppi

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 yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:324063d798ddc454b876a4584627d433edb39aa551cf5647a80a739b2711a3d1 | sha256sum