Free compare_page_observations for two held JSON pages. No fetch, wallet, or payment.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Compare two already-held extract-batch JSON artifacts. charged is false. Not a paid SKU. Does not fetch, pay, or schedule a second observation. Compare only the explicitly selected data keys present on both matched rows. Missing keys are coverage unknown, not deletions; explicit null is a present value. Unselected metadata is not a content delta. SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced. Complete request example (title changes, description stays unchanged): {"before":{"ok":true,"product":"samedaydesk-extract-batch","schemaVersion":"samedaydesk.extract-batch.v0","quote":{"amountAtomic":"10000","displayUsdc":"0.01","meaning":"SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced."},"jobId":"0000000000000000000000000000000000000000000000000000000000000000","jobStatus":"completed","stopReason":null,"partial":false,"sources":[{"id":"item-001","source":"https://synthetic.example.invalid/page","status":"success","data":{"title":"Synthetic title before","description":"Stable synthetic description"},"notes":[],"error":null,"provenance":{"transport":"synthetic","note":"SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced."}}],"accounting":{"requests":0,"bytes":0,"wallMs":0,"retries":0,"succeeded":0,"partial":0,"failed":0,"unknown":0,"skippedDuplicate":0},"costInputs":{"note":"SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced."},"charged":false,"boundary":{"guaranteedUrlSuccess":false,"introductoryPrice":true,"sourceFetchBeforeAuthorization":false,"automaticRetries":false}},"after":{"ok":true,"product":"samedaydesk-extract-batch","schemaVersion":"samedaydesk.extract-batch.v0","quote":{"amountAtomic":"10000","displayUsdc":"0.01","meaning":"SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced."},"jobId":"1111111111111111111111111111111111111111111111111111111111111111","jobStatus":"completed","stopReason":null,"partial":false,"sources":[{"id":"item-001","source":"https://synthetic.example.invalid/page","status":"success","data":{"title":"Synthetic title after","description":"Stable synthetic description"},"notes":[],"error":null,"provenance":{"transport":"synthetic","note":"SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced."}}],"accounting":{"requests":0,"bytes":0,"wallMs":0,"retries":0,"succeeded":0,"partial":0,"failed":0,"unknown":0,"skippedDuplicate":0},"costInputs":{"note":"SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced."},"charged":false,"boundary":{"guaranteedUrlSuccess":false,"introductoryPrice":true,"sourceFetchBeforeAuthorization":false,"automaticRetries":false}},"fields":["title","description"]}
Already held JSON artifact or JSON envelope, never a path or URL to dereference. Stable source identity, separate from row id and observation time. Matching normalizes source strings (URL fragments removed). Use the same non-empty identity on both sides; duplicate active identities are ambiguous. Synthetic URL STRINGS are inert and are never fetched by this transform. The structured branches describe representative comparable inputs. Incomplete objects remain admitted for diagnostic reports, subject to unchanged HTTP safety checks; HTTP 200 does not establish completeness or usefulness.
Explicit non-empty unique subset of supported fields. Compare only the explicitly selected data keys present on both matched rows. Missing keys are coverage unknown, not deletions; explicit null is a present value. Unselected metadata is not a content delta.
Optional caller UTC ISO-8601 timestamp with trailing Z, accepted for compatibility only; cannot attest freshness.
Optional freshness horizon, not a compute ceiling or freshness authority.
Supplied inputs cannot attest freshness. True is rejected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http page-change https://agents.samedaydesk.com/mcp/page-change
Compare two already-held extract-batch JSON artifacts. charged is false. Not a paid SKU. Does not fetch, pay, or schedule a second observation. Compare only the explicitly selected data keys present on both matched rows. Missing keys are coverage unknown, not deletions; explicit null is a present value. Unselected metadata is not a content delta. SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced. Complete request example (title changes, description stays unchanged): {"before":{"ok":true,"product":"samedaydesk-extract-batch","schemaVersion":"samedaydesk.extract-batch.v0","quote":{"amountAtomic":"10000","displayUsdc":"0.01","meaning":"SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced."},"jobId":"0000000000000000000000000000000000000000000000000000000000000000","jobStatus":"completed","stopReason":null,"partial":false,"sources":[{"id":"item-001","source":"https://synthetic.example.invalid/page","status":"success","data":{"title":"Synthetic title before","description":"Stable synthetic description"},"notes":[],"error":null,"provenance":{"transport":"synthetic","note":"SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced."}}],"accounting":{"requests":0,"bytes":0,"wallMs":0,"retries":0,"succeeded":0,"partial":0,"failed":0,"unknown":0,"skippedDuplicate":0},"costInputs":{"note":"SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced."},"charged":false,"boundary":{"guaranteedUrlSuccess":false,"introductoryPrice":true,"sourceFetchBeforeAuthorization":false,"automaticRetries":false}},"after":{"ok":true,"product":"samedaydesk-extract-batch","schemaVersion":"samedaydesk.extract-batch.v0","quote":{"amountAtomic":"10000","displayUsdc":"0.01","meaning":"SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced."},"jobId":"1111111111111111111111111111111111111111111111111111111111111111","jobStatus":"completed","stopReason":null,"partial":false,"sources":[{"id":"item-001","source":"https://synthetic.example.invalid/page","status":"success","data":{"title":"Synthetic title after","description":"Stable synthetic description"},"notes":[],"error":null,"provenance":{"transport":"synthetic","note":"SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced."}}],"accounting":{"requests":0,"bytes":0,"wallMs":0,"retries":0,"succeeded":0,"partial":0,"failed":0,"unknown":0,"skippedDuplicate":0},"costInputs":{"note":"SYNTHETIC offline construction example only. No URL fetch, payment, receipt, observation or freshness is evidenced."},"charged":false,"boundary":{"guaranteedUrlSuccess":false,"introductoryPrice":true,"sourceFetchBeforeAuthorization":false,"automaticRetries":false}},"fields":["title","description"]}
| Argument | Type | Description |
|---|---|---|
| after* | any | |
| clock | string | null | Optional caller UTC ISO-8601 timestamp with trailing Z, accepted for compatibility only; cannot attest freshness. |
| before* | any | Already held JSON artifact or JSON envelope, never a path or URL to dereference. Stable source identity, separate from row id and observation time. Matching normalizes source strings (URL fragments removed). Use the same non-empty identity on both sides; duplicate active identities are ambiguous. Synthetic URL STRINGS are inert and are never fetched by this transform. The structured branches describe representative comparable inputs. Incomplete objects remain admitted for diagnostic reports, subject to unchanged HTTP safety checks; HTTP 200 does not establish completeness or usefulness. |
| fields* | array | Explicit non-empty unique subset of supported fields. Compare only the explicitly selected data keys present on both matched rows. Missing keys are coverage unknown, not deletions; explicit null is a present value. Unselected metadata is not a content delta. |
| maxStaleMs | any | Optional freshness horizon, not a compute ceiling or freshness authority. |
| allowFreshClaim | boolean | Supplied inputs cannot attest freshness. True is rejected. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"before",
"after",
"fields"
],
"properties": {
"after": {
"$ref": "#/properties/before"
},
"clock": {
"type": [
"string",
"null"
],
"description": "Optional caller UTC ISO-8601 timestamp with trailing Z, accepted for compatibility only; cannot attest freshness."
},
"before": {
"anyOf": [
{
"type": "object",
"required": [
"ok",
"product",
"schemaVersion",
"quote",
"jobId",
"jobStatus",
"stopReason",
"partial",
"sources",
"accounting",
"costInputs",
"charged",
"boundary"
],
"properties": {
"ok": {
"type": "boolean"
},
"error": {
"$ref": "#/properties/before/anyOf/0/properties/quote/properties/meaning"
},
"jobId": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"quote": {
"type": "object",
"required": [
"amountAtomic",
"displayUsdc",
"meaning"
],
"properties": {
"meaning": {
"type": "string"
},
"displayUsdc": {
"type": "string",
"const": "0.01"
},
"amountAtomic": {
"type": "string",
"const": "10000"
}
},
"additionalProperties": true
},
"charged": {
"$ref": "#/properties/before/anyOf/0/properties/ok"
},
"partial": {
"$ref": "#/properties/before/anyOf/0/properties/ok"
},
"product": {
"type": "string",
"const": "samedaydesk-extract-batch"
},
"sources": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"source",
"status",
"data",
"notes",
"error",
"provenance"
],
"properties": {
"id": {
"type": "string",
"description": "Row identifier; does not replace source identity."
},
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"lang": {
"description": "Selected extraction value: lang."
},
"text": {
"description": "Selected extraction value: text."
},
"links": {
"description": "Selected extraction value: links."
},
"title": {
"description": "Selected extraction value: title."
},
"jsonLd": {
"description": "Selected extraction value: jsonLd."
},
"twitter": {
"description": "Selected extraction value: twitter."
},
"headings": {
"description": "Selected extraction value: headings."
},
"canonical": {
"description": "Selected extraction value: canonical."
},
"openGraph": {
"description": "Selected extraction value: openGraph."
},
"aiReadiness": {
"description": "Selected extraction value: aiReadiness."
},
"description": {
"description": "Selected extraction value: description."
}
},
"description": "Compare only the explicitly selected data keys present on both matched rows. Missing keys are coverage unknown, not deletions; explicit null is a present value. Unselected metadata is not a content delta.",
"additionalProperties": true
},
{
"type": "null",
"description": "Compare only the explicitly selected data keys present on both matched rows. Missing keys are coverage unknown, not deletions; explicit null is a present value. Unselected metadata is not a content delta."
}
],
"description": "Compare only the explicitly selected data keys present on both matched rows. Missing keys are coverage unknown, not deletions; explicit null is a present value. Unselected metadata is not a content delta."
},
"error": {
"anyOf": [
{
"type": "object",
"properties": {},
"additionalProperties": true
},
{
"type": "null"
}
]
},
"notes": {
"type": "array"
},
"source": {
"type": "string",
"pattern": "\\S",
"minLength": 1,
"description": "Stable source identity, separate from row id and observation time. Matching normalizes source strings (URL fragments removed). Use the same non-empty identity on both sides; duplicate active identities are ambiguous. Synthetic URL STRINGS are inert and are never fetched by this transform."
},
"status": {
"enum": [
"pending",
"success",
"partial",
"failure",
"unknown",
"skipped_duplicate"
],
"type": "string"
},
"finalUrl": {
"$ref": "#/properties/before/anyOf/0/properties/stopReason"
},
"httpStatus": {
"anyOf": [
{
"type": "integer"
},
{
"$ref": "#/properties/before/anyOf/0/properties/sources/items/properties/error/anyOf/1"
}
]
},
"provenance": {
"$ref": "#/properties/before/anyOf/0/properties/sources/items/properties/error"
}
},
"additionalProperties": true
},
"maxItems": 5,
"minItems": 1
},
"boundary": {
"$ref": "#/properties/before/anyOf/0/properties/sources/items/properties/error/anyOf/0"
},
"jobStatus": {
"enum": [
"running",
"completed",
"completed_with_unknown",
"stopped",
"interrupted"
],
"type": "string"
},
"accounting": {
"$ref": "#/properties/before/anyOf/0/properties/sources/items/properties/error/anyOf/0"
},
"costInputs": {
"$ref": "#/properties/before/anyOf/0/properties/sources/items/properties/error/anyOf/0"
},
"stopReason": {
"type": [
"string",
"null"
]
},
"schemaVersion": {
"type": "string",
"const": "samedaydesk.extract-batch.v0"
}
},
"description": "Representative merchant structure for useful comparisons; not a new paid request or proof of payment. Compare only the explicitly selected data keys present on both matched rows. Missing keys are coverage unknown, not deletions; explicit null is a present value. Unselected metadata is not a content delta.",
"additionalProperties": false
},
{
"type": "object",
"required": [
"jobId",
"status",
"costParameters",
"accounting",
"items"
],
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/properties/before/anyOf/0/properties/sources/items"
},
"maxItems": 32,
"minItems": 1
},
"jobId": {
"$ref": "#/properties/before/anyOf/0/properties/quote/properties/meaning"
},
"status": {
"$ref": "#/properties/before/anyOf/0/properties/quote/properties/meaning"
},
"accounting": {
"$ref": "#/properties/before/anyOf/0/properties/sources/items/properties/error/anyOf/0"
},
"costParameters": {
"$ref": "#/properties/before/anyOf/0/properties/sources/items/properties/error/anyOf/0"
}
},
"description": "Existing C1 result compatibility. No merchant product/schemaVersion is required. Compare only the explicitly selected data keys present on both matched rows. Missing keys are coverage unknown, not deletions; explicit null is a present value. Unselected metadata is not a content delta.",
"additionalProperties": true
},
{
"type": "object",
"required": [
"body"
],
"properties": {
"body": {
"anyOf": [
{
"$ref": "#/properties/before/anyOf/0"
},
{
"$ref": "#/properties/before/anyOf/1"
}
]
},
"status": {
"$ref": "#/properties/before/anyOf/0/properties/quote/properties/meaning"
},
"mediaType": {
"type": "string",
"const": "application/json"
},
"observedAt": {
"type": [
"string",
"null"
],
"description": "Caller observation metadata only; does not attest freshness."
}
},
"additionalProperties": false
},
{
"type": "object",
"properties": {},
"description": "Intentionally permissive diagnostic alternative, not a template for a useful comparison. Missing/wrong schemas, keys, source identities or fields do not become valid comparison evidence. A missing snapshot can be supplied as {missing:true}. Safety admission still rejects paths, URL dereference, limit raises and invalid envelopes.",
"additionalProperties": true
}
],
"description": "Already held JSON artifact or JSON envelope, never a path or URL to dereference. Stable source identity, separate from row id and observation time. Matching normalizes source strings (URL fragments removed). Use the same non-empty identity on both sides; duplicate active identities are ambiguous. Synthetic URL STRINGS are inert and are never fetched by this transform. The structured branches describe representative comparable inputs. Incomplete objects remain admitted for diagnostic reports, subject to unchanged HTTP safety checks; HTTP 200 does not establish completeness or usefulness."
},
"fields": {
"type": "array",
"items": {
"enum": [
"title",
"description",
"canonical",
"lang",
"openGraph",
"twitter",
"jsonLd",
"headings",
"links",
"text",
"aiReadiness"
],
"type": "string"
},
"maxItems": 11,
"minItems": 1,
"description": "Explicit non-empty unique subset of supported fields. Compare only the explicitly selected data keys present on both matched rows. Missing keys are coverage unknown, not deletions; explicit null is a present value. Unselected metadata is not a content delta."
},
"maxStaleMs": {
"anyOf": [
{
"type": "integer",
"minimum": 0,
"description": "Optional freshness horizon, not a compute ceiling or freshness authority."
},
{
"type": "null",
"description": "Optional freshness horizon, not a compute ceiling or freshness authority."
}
],
"description": "Optional freshness horizon, not a compute ceiling or freshness authority."
},
"allowFreshClaim": {
"type": "boolean",
"const": false,
"description": "Supplied inputs cannot attest freshness. True is rejected."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Oct 31, 2026.