Website Change Monitor & Deterministic Diff
What this MCP does
Compares webpage versions using deterministic hashes and text diffs for change monitoring.
Tools
Input schema
{'type': 'object', 'required': ['runId'], 'properties': {'runId': {'type': 'string', 'minLength': 1, 'description': 'The ID of the Actor run to abort.'}, 'gracefully': {'type': 'boolean', 'description': 'If true, the Actor run will abort gracefully with a 30-second timeout.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'type': 'object', 'required': ['runId', 'actorId', 'status', 'storages', 'summary', 'nextStep'], 'properties': {'runId': {'type': 'string', 'description': 'Actor run ID'}, 'stats': {'type': 'object', 'properties': {'memMaxBytes': {'type': 'number'}, 'runTimeSecs': {'type': 'number'}, 'computeUnits': {'type': 'number'}}, 'description': 'Run statistics'}, 'status': {'type': 'string', 'description': 'Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED'}, 'actorId': {'type': 'string', 'description': 'Stable Apify Actor ID from the run record'}, 'summary': {'type': 'string', 'description': 'Past-tense summary of the run state'}, 'exitCode': {'type': 'number', 'description': 'Actor process exit code; populated for terminal states (especially FAILED)'}, 'nextStep': {'type': 'string', 'description': 'One primary follow-up action with identifiers interpolated'}, 'storages': {'type': 'object', 'properties': {'datasets': {'type': 'object', 'required': ['default'], 'properties': {'default': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Dataset ID'}, 'name': {'type': 'string'}, 'title': {'type': 'string'}, 'fields': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Dataset field paths in dot notation (e.g. ["metadata.url"])'}, 'itemCount': {'type': 'number'}, 'inflatedBytes': {'type': 'number', 'description': 'Approximate uncompressed byte size of the dataset. Use with itemCount to pick limit/fields before fetching.'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the dataset; present only for Console sessions'}}}}, 'description': 'Map of dataset alias â\x86\x92 metadata. Key "default" is always the run\'s primary dataset.', 'additionalProperties': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Dataset ID'}, 'name': {'type': 'string'}, 'title': {'type': 'string'}, 'fields': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Dataset field paths in dot notation (e.g. ["metadata.url"])'}, 'itemCount': {'type': 'number'}, 'inflatedBytes': {'type': 'number', 'description': 'Approximate uncompressed byte size of the dataset. Use with itemCount to pick limit/fields before fetching.'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the dataset; present only for Console sessions'}}}}, 'keyValueStores': {'type': 'object', 'required': ['default'], 'properties': {'default': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Key-value store ID'}, 'keys': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Up to 50 key names'}, 'name': {'type': 'string'}, 'title': {'type': 'string'}, 'keyCount': {'type': 'number', 'description': 'Total number of keys (omitted when truncated)'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the store; present only for Console sessions'}}}}, 'description': 'Map of key-value store alias â\x86\x92 metadata. Key "default" is always the run\'s primary store.', 'additionalProperties': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Key-value store ID'}, 'keys': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Up to 50 key names'}, 'name': {'type': 'string'}, 'title': {'type': 'string'}, 'keyCount': {'type': 'number', 'description': 'Total number of keys (omitted when truncated)'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the store; present only for Console sessions'}}}}}, 'description': 'Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry.'}, 'actorName': {'type': 'string', 'description': '"username/actor-name"'}, 'startedAt': {'type': 'string', 'description': 'ISO timestamp when the run started'}, 'finishedAt': {'type': 'string', 'description': 'ISO timestamp when the run finished (terminal states only)'}, 'statusMessage': {'type': 'string', 'description': 'Pass-through from Apify run.statusMessage'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the run; present only for Console sessions'}}}, {'type': 'object', 'required': ['x402Version', 'accepts'], 'properties': {'error': {'type': 'string'}, 'accepts': {'type': 'array', 'items': {'type': 'object'}}, 'resource': {'type': 'object'}, 'x402Version': {'type': 'number'}}}]}
Input schema
{'type': 'object', 'required': ['runId'], 'properties': {'runId': {'type': 'string', 'minLength': 1, 'description': 'The ID of the Actor run.'}, 'waitSecs': {'type': 'integer', 'default': 30, 'maximum': 45, 'minimum': 0, 'description': 'Maximum seconds to wait for the run to reach a terminal state (SUCCEEDED, FAILED, ABORTED, TIMED-OUT).\n0 returns immediately with the current status. Cap: 45. Default: 30.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'type': 'object', 'required': ['runId', 'actorId', 'status', 'storages', 'summary', 'nextStep'], 'properties': {'runId': {'type': 'string', 'description': 'Actor run ID'}, 'stats': {'type': 'object', 'properties': {'memMaxBytes': {'type': 'number'}, 'runTimeSecs': {'type': 'number'}, 'computeUnits': {'type': 'number'}}, 'description': 'Run statistics'}, 'status': {'type': 'string', 'description': 'Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED'}, 'actorId': {'type': 'string', 'description': 'Stable Apify Actor ID from the run record'}, 'summary': {'type': 'string', 'description': 'Past-tense summary of the run state'}, 'exitCode': {'type': 'number', 'description': 'Actor process exit code; populated for terminal states (especially FAILED)'}, 'nextStep': {'type': 'string', 'description': 'One primary follow-up action with identifiers interpolated'}, 'storages': {'type': 'object', 'properties': {'datasets': {'type': 'object', 'required': ['default'], 'properties': {'default': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Dataset ID'}, 'name': {'type': 'string'}, 'title': {'type': 'string'}, 'fields': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Dataset field paths in dot notation (e.g. ["metadata.url"])'}, 'itemCount': {'type': 'number'}, 'inflatedBytes': {'type': 'number', 'description': 'Approximate uncompressed byte size of the dataset. Use with itemCount to pick limit/fields before fetching.'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the dataset; present only for Console sessions'}}}}, 'description': 'Map of dataset alias â\x86\x92 metadata. Key "default" is always the run\'s primary dataset.', 'additionalProperties': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Dataset ID'}, 'name': {'type': 'string'}, 'title': {'type': 'string'}, 'fields': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Dataset field paths in dot notation (e.g. ["metadata.url"])'}, 'itemCount': {'type': 'number'}, 'inflatedBytes': {'type': 'number', 'description': 'Approximate uncompressed byte size of the dataset. Use with itemCount to pick limit/fields before fetching.'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the dataset; present only for Console sessions'}}}}, 'keyValueStores': {'type': 'object', 'required': ['default'], 'properties': {'default': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Key-value store ID'}, 'keys': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Up to 50 key names'}, 'name': {'type': 'string'}, 'title': {'type': 'string'}, 'keyCount': {'type': 'number', 'description': 'Total number of keys (omitted when truncated)'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the store; present only for Console sessions'}}}}, 'description': 'Map of key-value store alias â\x86\x92 metadata. Key "default" is always the run\'s primary store.', 'additionalProperties': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Key-value store ID'}, 'keys': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Up to 50 key names'}, 'name': {'type': 'string'}, 'title': {'type': 'string'}, 'keyCount': {'type': 'number', 'description': 'Total number of keys (omitted when truncated)'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the store; present only for Console sessions'}}}}}, 'description': 'Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry.'}, 'actorName': {'type': 'string', 'description': '"username/actor-name"'}, 'startedAt': {'type': 'string', 'description': 'ISO timestamp when the run started'}, 'finishedAt': {'type': 'string', 'description': 'ISO timestamp when the run finished (terminal states only)'}, 'statusMessage': {'type': 'string', 'description': 'Pass-through from Apify run.statusMessage'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the run; present only for Console sessions'}}}, {'type': 'object', 'required': ['x402Version', 'accepts'], 'properties': {'error': {'type': 'string'}, 'accepts': {'type': 'array', 'items': {'type': 'object'}}, 'resource': {'type': 'object'}, 'x402Version': {'type': 'number'}}}]}
Input schema
{'type': 'object', 'required': ['datasetId'], 'properties': {'desc': {'type': 'boolean', 'description': 'If true, results are returned in reverse order (newest to oldest).'}, 'omit': {'type': 'string', 'description': 'Comma-separated list of fields to exclude from results.'}, 'clean': {'type': 'boolean', 'description': 'If true, returns only non-empty items and skips hidden fields (starting with #). Shortcut for skipHidden=true and skipEmpty=true.'}, 'limit': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': 1, 'description': 'Maximum number of items to return. Default is 20.'}, 'fields': {'type': 'string', 'description': 'Comma-separated list of fields to include in results. Fields in output are sorted as specified. Use dot notation for nested objects (e.g. "metadata.url"); the server auto-flattens parent prefixes.'}, 'offset': {'type': 'number', 'description': 'Number of items to skip at the start. Default is 0.'}, 'flatten': {'type': 'string', 'description': 'Comma-separated list of fields to flatten (e.g. flatten="metadata" turns {"metadata":{"url":"x"}} into {"metadata.url":"x"}). Normally derived automatically from dot-notation in `fields`; specify only as a diagnostic override.'}, 'datasetId': {'type': 'string', 'minLength': 1, 'description': 'Dataset ID or username~dataset-name.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'type': 'object', 'required': ['datasetId', 'items', 'itemCount', 'totalItemCount', 'offset', 'limit', 'summary', 'nextStep'], 'properties': {'items': {'type': 'array', 'items': {'type': 'object'}, 'description': 'Dataset items'}, 'limit': {'type': 'number', 'description': 'Limit used for pagination'}, 'offset': {'type': 'number', 'description': 'Offset used for pagination'}, 'summary': {'type': 'string', 'description': 'Summary of the result'}, 'nextStep': {'type': 'string', 'description': 'One follow-up action with tool name'}, 'datasetId': {'type': 'string', 'description': 'Dataset ID'}, 'itemCount': {'type': 'number', 'description': 'Number of items returned'}, 'totalItemCount': {'type': 'number', 'description': 'Total items in dataset'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the dataset; present only for Console sessions'}}}, {'type': 'object', 'required': ['x402Version', 'accepts'], 'properties': {'error': {'type': 'string'}, 'accepts': {'type': 'array', 'items': {'type': 'object'}}, 'resource': {'type': 'object'}, 'x402Version': {'type': 'number'}}}]}
Input schema
{'type': 'object', 'required': ['keyValueStoreId', 'recordKey'], 'properties': {'recordKey': {'type': 'string', 'minLength': 1, 'description': 'Key of the record to retrieve.'}, 'keyValueStoreId': {'type': 'string', 'minLength': 1, 'description': 'Key-value store ID or username~store-name.'}}, 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'type': 'object', 'required': ['keyValueStoreId', 'key', 'value', 'summary'], 'properties': {'key': {'type': 'string', 'description': 'Record key'}, 'value': {'description': 'The stored value (JSON, text, or binary)'}, 'summary': {'type': 'string', 'description': 'Summary of the result'}, 'contentType': {'type': 'string', 'description': 'MIME type of the stored value'}, 'keyValueStoreId': {'type': 'string', 'description': 'Key-value store ID'}}}, {'type': 'object', 'required': ['x402Version', 'accepts'], 'properties': {'error': {'type': 'string'}, 'accepts': {'type': 'array', 'items': {'type': 'object'}}, 'resource': {'type': 'object'}, 'x402Version': {'type': 'number'}}}]}
Input schema
{'$id': 'https://apify.com/mcp/industrial_platform--web-change-intelligence/schema.json', 'type': 'object', 'title': 'Web Change Intelligence input', 'required': ['url'], 'properties': {'url': {'type': 'string', 'title': 'URL', 'prefill': 'https://example.com/', 'examples': ['https://example.com/'], 'description': '**REQUIRED** Public http:// or https:// URL to inspect.\nExample values: "https://example.com/"'}, 'selector': {'type': 'string', 'title': 'CSS selector', 'description': 'Optional CSS selector that restricts monitoring to a specific part of an HTML page, such as main, #pricing, or .inventory.'}, 'waitSecs': {'type': 'integer', 'default': 30, 'maximum': 45, 'minimum': 0, 'description': 'Max seconds (0â\x80\x9345, default 30) to cap the wait for the Actor run to reach terminal state. For long-running Actors the response returns at the cap with the current run status; follow `nextStep` to poll via get-actor-run. Set to 0 to fire-and-forget.'}, 'previous_hash': {'type': 'string', 'title': 'Previous SHA-256 hash', 'description': 'Optional current_hash from a previous run. Use this for compact changed/unchanged checks when a detailed diff is not required.'}, 'previous_text': {'type': 'string', 'title': 'Previous normalized text', 'description': 'Optional current_text returned by a previous run. When provided, the Actor returns deterministic added/removed excerpts and change metrics.'}, 'max_diff_chars': {'type': 'integer', 'title': 'Maximum characters per diff excerpt', 'default': 12000, 'examples': [12000], 'description': 'Maximum length returned for each added/removed excerpt.\nExample values: 12000'}, 'max_text_chars': {'type': 'integer', 'title': 'Maximum normalized text characters', 'default': 100000, 'examples': [100000], 'description': 'Maximum characters retained before hashing and comparison. Keep this value consistent across repeated checks.\nExample values: 100000'}, 'timeout_seconds': {'type': 'integer', 'title': 'Fetch timeout', 'default': 30, 'examples': [30], 'description': 'Maximum time allowed for the target request.\nExample values: 30'}, 'ignore_selectors': {'type': 'array', 'items': {'type': 'string', 'maxLength': 500}, 'title': 'Ignore CSS selectors', 'default': [], 'description': 'Optional HTML selectors to remove before comparison, useful for clocks, rotating banners, ads, or other volatile regions.'}, 'include_current_text': {'type': 'boolean', 'title': 'Include normalized current text', 'default': True, 'examples': [True], 'description': 'Return current_text so a later run can perform a detailed text comparison.\nExample values: true'}}, 'description': 'Fetch a public URL, normalize its content, and compare it against a previous normalized text snapshot or SHA-256 hash.', 'additionalProperties': False}
Output schema
{'type': 'object', 'anyOf': [{'type': 'object', 'required': ['runId', 'actorId', 'status', 'storages', 'summary', 'nextStep'], 'properties': {'runId': {'type': 'string', 'description': 'Actor run ID'}, 'stats': {'type': 'object', 'properties': {'memMaxBytes': {'type': 'number'}, 'runTimeSecs': {'type': 'number'}, 'computeUnits': {'type': 'number'}}, 'description': 'Run statistics'}, 'status': {'type': 'string', 'description': 'Run status: READY | RUNNING | TIMING-OUT | TIMED-OUT | ABORTING | ABORTED | SUCCEEDED | FAILED'}, 'actorId': {'type': 'string', 'description': 'Stable Apify Actor ID from the run record'}, 'summary': {'type': 'string', 'description': 'Past-tense summary of the run state'}, 'exitCode': {'type': 'number', 'description': 'Actor process exit code; populated for terminal states (especially FAILED)'}, 'nextStep': {'type': 'string', 'description': 'One primary follow-up action with identifiers interpolated'}, 'storages': {'type': 'object', 'properties': {'datasets': {'type': 'object', 'required': ['default'], 'properties': {'default': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Dataset ID'}, 'name': {'type': 'string'}, 'title': {'type': 'string'}, 'fields': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Dataset field paths in dot notation (e.g. ["metadata.url"])'}, 'itemCount': {'type': 'number'}, 'itemsSchema': {'type': 'object', 'properties': {'url': {'type': 'string'}, 'fetch': {'type': 'object', 'properties': {'duration_ms': {'type': 'number'}, 'bytes_received': {'type': 'number'}}}, 'title': {'type': 'string'}, 'status': {'type': 'string'}, 'final_url': {'type': 'string'}, 'checked_at': {'type': 'string'}, 'http_status': {'type': 'number'}, 'text_length': {'type': 'number'}, 'content_type': {'type': 'string'}, 'current_hash': {'type': 'string'}, 'current_text': {'type': 'string'}, 'text_truncated': {'type': 'boolean'}, 'comparison_mode': {'type': 'string'}, 'comparison_status': {'type': 'string'}, 'original_text_length': {'type': 'number'}}, 'description': "JSON Schema for rows in the dataset at `storages.datasets.default.id` â\x80\x94 describes row shape only; the rows themselves are NOT returned inline in this response. Inferred from this Actor's historical successful runs. To fetch actual rows, call `get-dataset-items` with the dataset id and a `fields` projection drawn from this schema."}, 'inflatedBytes': {'type': 'number', 'description': 'Approximate uncompressed byte size of the dataset. Use with itemCount to pick limit/fields before fetching.'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the dataset; present only for Console sessions'}}}}, 'description': 'Map of dataset alias â\x86\x92 metadata. Key "default" is always the run\'s primary dataset.', 'additionalProperties': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Dataset ID'}, 'name': {'type': 'string'}, 'title': {'type': 'string'}, 'fields': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Dataset field paths in dot notation (e.g. ["metadata.url"])'}, 'itemCount': {'type': 'number'}, 'inflatedBytes': {'type': 'number', 'description': 'Approximate uncompressed byte size of the dataset. Use with itemCount to pick limit/fields before fetching.'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the dataset; present only for Console sessions'}}}}, 'keyValueStores': {'type': 'object', 'required': ['default'], 'properties': {'default': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Key-value store ID'}, 'keys': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Up to 50 key names'}, 'name': {'type': 'string'}, 'title': {'type': 'string'}, 'keyCount': {'type': 'number', 'description': 'Total number of keys (omitted when truncated)'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the store; present only for Console sessions'}}}}, 'description': 'Map of key-value store alias â\x86\x92 metadata. Key "default" is always the run\'s primary store.', 'additionalProperties': {'type': 'object', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': 'Key-value store ID'}, 'keys': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Up to 50 key names'}, 'name': {'type': 'string'}, 'title': {'type': 'string'}, 'keyCount': {'type': 'number', 'description': 'Total number of keys (omitted when truncated)'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the store; present only for Console sessions'}}}}}, 'description': 'Dataset and key-value store metadata, keyed by alias. "default" is always the primary entry.'}, 'actorName': {'type': 'string', 'description': '"username/actor-name"'}, 'startedAt': {'type': 'string', 'description': 'ISO timestamp when the run started'}, 'finishedAt': {'type': 'string', 'description': 'ISO timestamp when the run finished (terminal states only)'}, 'statusMessage': {'type': 'string', 'description': 'Pass-through from Apify run.statusMessage'}, 'apifyConsoleUrl': {'type': 'string', 'description': 'Personalized Apify Console link to the run; present only for Console sessions'}}}, {'type': 'object', 'required': ['x402Version', 'accepts'], 'properties': {'error': {'type': 'string'}, 'accepts': {'type': 'array', 'items': {'type': 'object'}}, 'resource': {'type': 'object'}, 'x402Version': {'type': 'number'}}}]}
Recent tool changes
Similar MCP servers
AdButler
Manages AdButler advertisers, campaigns, ad items, audiences, zones, creatives, catalogs, and advertising reports.
Duvo MCP
Provides governed retail and CPG operations for cases, queues, approvals, automations, process documentation, integrations, and a…
Lovie Company Formation
Supports company formation and business administration with bank accounts, cards, invoicing, bookkeeping, accounting periods, and…
freedom-mcp
Supports company operations through commitments, teams, agents, customer evidence, leads, content workflows, spreadsheets, commer…
独行录 / opcmenu
Supports founder and company discovery, collaboration goals and tasks, events and signups, networking, messaging, profiles, produ…
Meta Council
Provides governed workflows for consulting, outreach, sales deals, invoices, marketing campaigns, content approvals, accounting a…
synter-ads
Manages cross-platform advertising campaigns, audiences, tracking, creative, landing pages, campaign audits, technology intellige…
synter-ads
Manages cross-platform advertising campaigns, audiences, tracking, creative, landing pages, campaign audits, technology intellige…