Page Change

Free compare_page_observations for two held JSON pages. No fetch, wallet, or payment.

Should I use this

Quality & Safety

B
Description quality
100%
Schema completeness
87%
Naming quality
80%
Poisoning risk
60%
Permission match
100%
Protocol compliance
100%

Findings (3)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains suspicious base64-like encoded stringin compare_page_observations
  • MEDIUMTool description contains URL to non-standard domainin compare_page_observations

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,533Tokens (tool definitions)
~23.5 KBTypical response size
Moderate attention impact (1.98% of 128k context)

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": {
    "page-change": {
      "url": "https://agents.samedaydesk.com/mcp/page-change"
    }
  }
}

Remote endpoints

https://agents.samedaydesk.com/mcp/page-changestreamable-http

What it can do

Tool inventory

Tools (1)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢compare_page_observations(before, after, fields, clock, maxStaleMs, ...)

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"]}

Input Schema

{
  "type": "object",
  "properties": {
    "before": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "ok": {
              "type": "boolean"
            },
            "product": {
              "type": "string",
              "const": "samedaydesk-extract-batch"
            },
            "schemaVersion": {
              "type": "string",
              "const": "samedaydesk.extract-batch.v0"
            },
            "quote": {
              "type": "object",
              "properties": {
                "amountAtomic": {
                  "type": "string",
                  "const": "10000"
                },
                "displayUsdc": {
                  "type": "string",
                  "const": "0.01"
                },
                "meaning": {
                  "type": "string"
                }
              },
              "required": [
                "amountAtomic",
                "displayUsdc",
                "meaning"
              ],
              "additionalProperties": true
            },
            "jobId": {
              "type": "string",
              "pattern": "^[a-f0-9]{64}$"
            },
            "jobStatus": {
              "type": "string",
              "enum": [
                "running",
                "completed",
                "completed_with_unknown",
                "stopped",
                "interrupted"
              ]
            },
            "stopReason": {
              "type": [
                "string",
                "null"
              ]
            },
            "partial": {
              "$ref": "#/properties/before/anyOf/0/properties/ok"
            },
            "sources": {
              "type": "array",
              "items": {
                "type": "object",
                "properties": {
                  "id": {
                    "type": "string",
                    "description": "Row identifier; does not replace source identity."
                  },
                  "source": {
                    "type": "string",
                    "minLength": 1,
                    "pattern": "\\S",
                    "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": {
                    "type": "string",
                    "enum": [
                      "pending",
                      "success",
                      "partial",
                      "failure",
                      "unknown",
                      "skipped_duplicate"
                    ]
                  },
                  "data": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {
                          "title": {
                            "description": "Selected extraction value: title."
                          },
                          "description": {
                            "description": "Selected extraction value: description."
                          },
                          "canonical": {
                            "description": "Selected extraction value: canonical."
                          },
                          "lang": {
                            "description": "Selected extraction value: lang."
                          },
                          "openGraph": {
                            "description": "Selected extraction value: openGraph."
                          },
                          "twitter": {
                            "description": "Selected extraction value: twitter."
                          },
                          "jsonLd": {
                            "description": "Selected extraction value: jsonLd."
                          },
                          "headings": {
                            "description": "Selected extraction value: headings."
                          },
                          "links": {
                            "description": "Selected extraction value: links."
                          },
                          "text": {
                            "description": "Selected extraction value: text."
                          },
                          "aiReadiness": {
                            "description": "Selected extraction value: aiReadiness."
                          }
                        },
                        "additionalProperties": true,
                        "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."
                      },
                      {
                        "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."
                  },
                  "notes": {
                    "type": "array"
                  },
                  "error": {
                    "anyOf": [
                      {
                        "type": "object",
                        "properties": {},
                        "additionalProperties": true
                      },
                      {
                        "type": "null"
                      }
                    ]
                  },
                  "provenance": {
                    "$ref": "#/properties/before/anyOf/0/properties/sources/items/properties/error"
                  },
                  "finalUrl": {
                    "$ref": "#/properties/before/anyOf/0/properties/stopReason"
                  },
                  "httpStatus": {
                    "anyOf": [
                      {
                        "type": "integer"
                      },
                      {
                        "$ref": "#/properties/before/anyOf/0/properties/sources/items/properties/error/anyOf/1"
                      }
                    ]
                  }
                },
                "required": [
                  "id",
                  "source",
                  "status",
                  "data",
                  "notes",
                  "error",
                  "provenance"
                ],
                "additionalProperties": true
              },
              "minItems": 1,
              "maxItems": 5
            },
            "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"
            },
            "charged": {
              "$ref": "#/properties/before/anyOf/0/properties/ok"
            },
            "boundary": {
              "$ref": "#/properties/before/anyOf/0/properties/sources/items/properties/error/anyOf/0"
            },
            "error": {
              "$ref": "#/properties/before/anyOf/0/properties/quote/properties/meaning"
            }
          },
          "required": [
            "ok",
            "product",
            "schemaVersion",
            "quote",
            "jobId",
            "jobStatus",
            "stopReason",
            "partial",
            "sources",
            "accounting",
            "costInputs",
            "charged",
            "boundary"
          ],
          "additionalProperties": false,
          "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."
        },
        {
          "type": "object",
          "properties": {
            "jobId": {
              "$ref": "#/properties/before/anyOf/0/properties/quote/properties/meaning"
            },
            "status": {
              "$ref": "#/properties/before/anyOf/0/properties/quote/properties/meaning"
            },
            "costParameters": {
              "$ref": "#/properties/before/anyOf/0/properties/sources/items/properties/error/anyOf/0"
            },
            "accounting": {
              "$ref": "#/properties/before/anyOf/0/properties/sources/items/properties/error/anyOf/0"
            },
            "items": {
              "type": "array",
              "items": {
                "$ref": "#/properties/before/anyOf/0/properties/sources/items"
              },
              "minItems": 1,
              "maxItems": 32
            }
          },
          "required": [
            "jobId",
            "status",
            "costParameters",
            "accounting",
            "items"
          ],
          "additionalProperties": true,
          "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."
        },
        {
          "type": "object",
          "properties": {
            "mediaType": {
              "type": "string",
              "const": "application/json"
            },
            "body": {
              "anyOf": [
                {
                  "$ref": "#/properties/before/anyOf/0"
                },
                {
                  "$ref": "#/properties/before/anyOf/1"
                }
              ]
            },
            "observedAt": {
              "type": [
                "string",
                "null"
              ],
              "description": "Caller observation metadata only; does not attest freshness."
            },
            "status": {
              "$ref": "#/properties/before/anyOf/0/properties/quote/properties/meaning"
            }
          },
          "required": [
            "body"
          ],
          "additionalProperties": false
        },
        {
          "type": "object",
          "properties": {},
          "additionalProperties": true,
          "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."
        }
      ],
      "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."
    },
    "after": {
      "$ref": "#/properties/before"
    },
    "fields": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "title",
          "description",
          "canonical",
          "lang",
          "openGraph",
          "twitter",
          "jsonLd",
          "headings",
          "links",
          "text",
          "aiReadiness"
        ]
      },
      "minItems": 1,
      "maxItems": 11,
      "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."
    },
    "clock": {
      "type": [
        "string",
        "null"
      ],
      "description": "Optional caller UTC ISO-8601 timestamp with trailing Z, accepted for compatibility only; cannot attest freshness."
    },
    "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."
    }
  },
  "required": [
    "before",
    "after",
    "fields"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded1 tools