← The evidence ledger
Evidence row 577926
Observed , by probe.mcp/1.
- Kind
- mcp.tools
- About
- endpoint 36c11ce0-a7f8-4ea5-9fa2-8a91d83314be
- Recorded
- Previous row
- None: the first of its kind about this subject
- Body SHA-256
- 096fd8deb92de6eb9330fc078b3651f73f5e4c57a8b62de96fd855363c7b83f1
- Leaf
- 0x0cb43d94b37e0fcd3c4544af55f03c6a5ea78590745c6590b117b46ee16d755c
What was observed
{
"count": 3,
"tools": [
{
"description": "Call this before using any dataset. Returns a deterministic quality verdict (RELIABLE / USABLE_WITH_CLEANING / UNRELIABLE) with exact facts: completeness, nulls, type consistency, impossible values, duplicates, outliers, and (on financial/trading data) cross-source price divergence. 100% deterministic, no LLM. Free -- this MCP endpoint runs the engine directly; POST /api (plain REST, same engine) is x402-gated at $0.01/call instead. Input: rawJson (a JSON array of row objects, or a single object); datasetId is accepted but not resolvable on this deployment -- pass rawJson instead.",
"inputSchema": {
"properties": {
"datasetId": {
"description": "An Apify dataset id. Not resolvable on this deployment; pass rawJson instead.",
"type": "string"
},
"rawJson": {
"description": "The dataset: a JSON array of row objects, or a single object."
}
},
"type": "object"
},
"name": "check_dataset_quality"
},
{
"description": "PAID TIER, CALLED FROM A FREE ENDPOINT -- READ THIS FIRST: this tool does NOT return your cleaned data, and its response has NO `data` key. It returns {\"status\": \"payment_required\", \"what_we_found_in_your_data\": {...}, \"get_the_repaired_data\": {...}}. Do not treat its output as cleaned data and do not write it back into your dataset.\nWHAT YOU GET HERE, FREE: an exact inventory of the defects in YOUR data -- which repair rules would fire, how many values each would change, and which cases cannot be repaired safely and need your decision.\nHOW TO GET THE REPAIRED DATA: make the one call named in `get_the_repaired_data` -- POST https://www.aidatatools.dev/api/clean, $0.04 via x402, no account, no API key, no signup. That response body IS the cleaned dataset, in the shape you posted it.\nWHY THE SPLIT: detection is free on this endpoint and always has been (check_dataset_quality reports the same defects). The repaired artifact is the paid product, because it is re-bought on every extraction run rather than cached like a verdict.\nWHAT THE PAID CALL DOES: removes leftover HTML tags and entities, decodes mojibake ('Café' -> 'Café'), strips invisible characters (zero-width, BOM, soft hyphen), normalises non-breaking spaces and trims values -- across nested objects and arrays too. 100% deterministic, no LLM: the same input always yields byte-identical output, and cleaning twice equals cleaning once. It repairs how data was ENCODED, never what it SAYS: masked placeholders ('N/A', 'None'), near-duplicate rows and failed extractions ('access denied', 'captcha', which mean that record must be re-scraped) are reported with a proposal, never silently deleted or rewritten. The full boundary -- 7 rules applied automatically, 5 needing an explicit opt-in, 8 only ever reported -- is at GET https://www.aidatatools.dev/api/clean.",
"inputSchema": {
"properties": {
"options": {
"description": "All optional. Every default is the safe one: with no options, the row count, every value's type, and the schema are all guaranteed unchanged.",
"properties": {
"coerce_numeric_text": {
"description": "Turn 'US $5.59' into 5.59. Per field, all-or-nothing, and only where every value is unambiguous -- a lone ',' or a mixed currency disqualifies the whole field rather than being guessed at.",
"type": "boolean"
},
"detect_duplicates": {
"description": "Default true. Set false to skip duplicate detection on very large input.",
"type": "boolean"
},
"drop_exact_duplicates": {
"description": "Remove rows byte-identical to an earlier row, compared AFTER cleaning. Off by default because it changes the row count; duplicates are reported either way.",
"type": "boolean"
},
"placeholder_policy": {
"description": "What to do with masked-missing strings. 'flag' (default) reports them and changes nothing. 'null_high_confidence' nulls only tokens that cannot be real data ('N/A', 'null', 'undefined') and never the ambiguous ones ('None' is a surname, 'NA' is Namibia, '-' is a real value). 'null_all' nulls the ambiguous ones too -- only choose this if you know the domain.",
"enum": [
"flag",
"null_high_confidence",
"null_all"
],
"type": "string"
},
"repair_keys": {
"description": "Also repair dict KEYS (the classic '\\ufeffsku' first column of a BOM-prefixed CSV export). Off by default: a key is a contract with everything downstream.",
"type": "boolean"
},
"trim_whitespace": {
"description": "Default true.",
"type": "boolean"
}
},
"type": "object"
},
"rawJson": {
"description": "The scraper output: a JSON array of row objects, a single object, or a CSV/plain-text string. The format is detected and the output mirrors the shape you sent."
}
},
"required": [
"rawJson"
],
"type": "object"
},
"name": "clean_scraped_data"
},
{
"description": "PAID TIER, CALLED FROM A FREE ENDPOINT -- READ THIS FIRST: this tool does NOT return your cleaned data, and its response has NO `data` key. It returns {\"status\": \"payment_required\", \"what_we_found_in_your_data\": {...}, \"get_the_repaired_data\": {...}}. Do not treat its output as cleaned data and do not write it back into your dataset.\nWHAT YOU GET HERE, FREE: an exact inventory of the defects in YOUR data -- which repair rules would fire, how many values each would change, and which cases cannot be repaired safely and need your decision.\nHOW TO GET THE REPAIRED DATA: make the one call named in `get_the_repaired_data` -- POST https://www.aidatatools.dev/api/clean/audit, $0.12 via x402, no account, no API key, no signup. That response body IS the cleaned dataset, in the shape you posted it.\nWHY THE SPLIT: detection is free on this endpoint and always has been (check_dataset_quality reports the same defects). The repaired artifact is the paid product, because it is re-bought on every extraction run rather than cached like a verdict.\nWHAT THE PAID CALL DOES: the same repair as clean_scraped_data, plus a complete audit trail: every transformation with its path, rule, before and after value, a replay_id, and input/output SHA-256. The ledger is a full inverse patch -- applying it in reverse reconstructs your original input byte for byte. Use it when you must be able to PROVE later what changed and why.",
"inputSchema": {
"properties": {
"options": {
"description": "All optional. Every default is the safe one: with no options, the row count, every value's type, and the schema are all guaranteed unchanged.",
"properties": {
"coerce_numeric_text": {
"description": "Turn 'US $5.59' into 5.59. Per field, all-or-nothing, and only where every value is unambiguous -- a lone ',' or a mixed currency disqualifies the whole field rather than being guessed at.",
"type": "boolean"
},
"detect_duplicates": {
"description": "Default true. Set false to skip duplicate detection on very large input.",
"type": "boolean"
},
"drop_exact_duplicates": {
"description": "Remove rows byte-identical to an earlier row, compared AFTER cleaning. Off by default because it changes the row count; duplicates are reported either way.",
"type": "boolean"
},
"placeholder_policy": {
"description": "What to do with masked-missing strings. 'flag' (default) reports them and changes nothing. 'null_high_confidence' nulls only tokens that cannot be real data ('N/A', 'null', 'undefined') and never the ambiguous ones ('None' is a surname, 'NA' is Namibia, '-' is a real value). 'null_all' nulls the ambiguous ones too -- only choose this if you know the domain.",
"enum": [
"flag",
"null_high_confidence",
"null_all"
],
"type": "string"
},
"repair_keys": {
"description": "Also repair dict KEYS (the classic '\\ufeffsku' first column of a BOM-prefixed CSV export). Off by default: a key is a contract with everything downstream.",
"type": "boolean"
},
"trim_whitespace": {
"description": "Default true.",
"type": "boolean"
}
},
"type": "object"
},
"rawJson": {
"description": "The scraper output: a JSON array of row objects, a single object, or a CSV/plain-text string. The format is detected and the output mirrors the shape you sent."
}
},
"required": [
"rawJson"
],
"type": "object"
},
"name": "clean_scraped_data_audited"
}
]
}What the leaf hashes
{"body":"096fd8deb92de6eb9330fc078b3651f73f5e4c57a8b62de96fd855363c7b83f1","id":577926,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793142795916088,"prev":null,"subject":"36c11ce0-a7f8-4ea5-9fa2-8a91d83314be","subject_kind":"endpoint"}Proof
Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (273461 rows).
- 0x0cb485ecf80e02226cc58b374a31add22f59c285c643d2345108341db84cc401
- 0xac361ae58f90e800921607a5060de2ac0034ebc0309f3f45d41032a550ed0148
- 0x892c03b2618900c3ae3e1f5dcbdc5417f5c949649e6b85a1c290b8bb4a12aca5
- 0xc5a2fc5795e806f42d49a0643ff0edcee2cb7d7955b4c651f189a41ea1a789a9
- 0xad64735beaf81fecc3147301308b2e0dc1a432123cca97fe6b6552a4a20a5b5e
- 0xfb9de0ca92043e7d4302f22a9c8cdf7091e307720847276d022bf0a30703fcf3
- 0xd575d1d472fcd925aa8804896f39c5e5a421b676e386f8c6a780ace48d9e40aa
- 0x0681643740fb35d402a722a9849c72881bce2d9c6c740eb453b8e1bb14979381
- 0xc8c3507d7df6defaf7a4b03e3470c9a3b230a168ddfcaa8f524d9252074e2806
- 0x40832a45560c5ee93b4be87c5e6cdc288752ff9669572deda76eb82682ef2fa2
- 0x8ac7b6b9bf64392f96f8256d1e4c2ec0bc2f51d3c881619121a67aa022ebcb14
- 0x6e5a3640cff3f4cd1cd4f97ccb0c01e8a7f3fa240d9ef5f12ed8901892cd252e
- 0xa5d3d95b495ae2191612e64fe151fe065497e5ecb73bb111e1fabb6b3628f3de
- 0x3e0ec8a2a8a954695a9b53a4a48a7656d7e3fd6a8795c73b49e2ef05b201ec3f
- 0x2cf27e8a181d60d0dd27c186c2eddfcbb4e8fa71cf66feeb55a4d730e15ee8c4
- 0x518b93854db03dc9fc938883abf30da6eaae5ae0d4336903968fd32a7df8c71b
- 0x22c1fb9487ee0b9732fa017a0cc321eb27a60c08450d112f755089796e12cb1c
- 0xa20d48798a34aba12eb9c7297722982d910f06c148f5e27ac59307422964a585
- 0x9fc354c0ea3efc3f1b6548bb77ea902a50f2c9647647ea61592efce2bd795699
- Day root
- 0xdd77e5e99da32c3f154180d63e3c3e6fe11e896a2c6896412ef6b5c4bcf7e795
- Chained
- 0x23bb4dfd09f55c15ac3962f53578e02c6114d5bfd9bb451cf8794fb6e2817ef4
- Published
- On Arc Testnet, block 69414147: 0xb2ebd83aafeb765a0ce66e76aefb133ed06606c98038fd56191e2bcd1dcb77b4