{"id":577926,"recorded_at":"2026-10-27T23:13:15.916150Z","observed_at":"2026-10-27T23:13:15.916088Z","subject_kind":"endpoint","subject":"36c11ce0-a7f8-4ea5-9fa2-8a91d83314be","kind":"mcp.tools","method":"probe.mcp/1","body":{"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"}]},"body_sha256":"096fd8deb92de6eb9330fc078b3651f73f5e4c57a8b62de96fd855363c7b83f1","prev_id":null,"leaf":"0x0cb43d94b37e0fcd3c4544af55f03c6a5ea78590745c6590b117b46ee16d755c","leaf_text":"{\"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\"}","day":{"day":"2026-10-27","leaves":273461,"root":"0xdd77e5e99da32c3f154180d63e3c3e6fe11e896a2c6896412ef6b5c4bcf7e795","chained":"0x23bb4dfd09f55c15ac3962f53578e02c6114d5bfd9bb451cf8794fb6e2817ef4","anchor_chain":"eip155:5042002","anchor_tx":"0xb2ebd83aafeb765a0ce66e76aefb133ed06606c98038fd56191e2bcd1dcb77b4","anchor_block":69414147},"proof":["0x0cb485ecf80e02226cc58b374a31add22f59c285c643d2345108341db84cc401","0xac361ae58f90e800921607a5060de2ac0034ebc0309f3f45d41032a550ed0148","0x892c03b2618900c3ae3e1f5dcbdc5417f5c949649e6b85a1c290b8bb4a12aca5","0xc5a2fc5795e806f42d49a0643ff0edcee2cb7d7955b4c651f189a41ea1a789a9","0xad64735beaf81fecc3147301308b2e0dc1a432123cca97fe6b6552a4a20a5b5e","0xfb9de0ca92043e7d4302f22a9c8cdf7091e307720847276d022bf0a30703fcf3","0xd575d1d472fcd925aa8804896f39c5e5a421b676e386f8c6a780ace48d9e40aa","0x0681643740fb35d402a722a9849c72881bce2d9c6c740eb453b8e1bb14979381","0xc8c3507d7df6defaf7a4b03e3470c9a3b230a168ddfcaa8f524d9252074e2806","0x40832a45560c5ee93b4be87c5e6cdc288752ff9669572deda76eb82682ef2fa2","0x8ac7b6b9bf64392f96f8256d1e4c2ec0bc2f51d3c881619121a67aa022ebcb14","0x6e5a3640cff3f4cd1cd4f97ccb0c01e8a7f3fa240d9ef5f12ed8901892cd252e","0xa5d3d95b495ae2191612e64fe151fe065497e5ecb73bb111e1fabb6b3628f3de","0x3e0ec8a2a8a954695a9b53a4a48a7656d7e3fd6a8795c73b49e2ef05b201ec3f","0x2cf27e8a181d60d0dd27c186c2eddfcbb4e8fa71cf66feeb55a4d730e15ee8c4","0x518b93854db03dc9fc938883abf30da6eaae5ae0d4336903968fd32a7df8c71b","0x22c1fb9487ee0b9732fa017a0cc321eb27a60c08450d112f755089796e12cb1c","0xa20d48798a34aba12eb9c7297722982d910f06c148f5e27ac59307422964a585","0x9fc354c0ea3efc3f1b6548bb77ea902a50f2c9647647ea61592efce2bd795699"]}