{"server":{"name":"io.github.aidatatools-dev/data-quality-gate","_meta":{"io.modelcontextprotocol.registry/publisher-provided":{"docs":{"full":"https://www.aidatatools.dev/llms-full.txt","openapi":"https://www.aidatatools.dev/openapi.json","summary":"https://www.aidatatools.dev/llms.txt","boundary":"https://www.aidatatools.dev/api/clean"},"tags":["data cleaning","scraping repair","post-scrape sanitization","deterministic data repair","mojibake correction","encoding repair","scraper output cleaning","auditable data repair"],"tools":{"clean_scraped_data":"Free to call, but it does NOT return the repaired data -- its response has no 'data' key. It reports which rules would fire on your data and what needs your decision, then names the paid call that hands the data back: POST https://www.aidatatools.dev/api/clean, $0.04 via x402, no account or signup. Call it after every extraction run -- a verdict is cached per source, but dirt is produced fresh by every run.","check_dataset_quality":"FREE here. The full quality verdict: score, per-check facts, and RELIABLE / USABLE_WITH_CLEANING / UNRELIABLE. Bought once per source, then cached.","clean_scraped_data_audited":"Same, pointing at POST https://www.aidatatools.dev/api/clean/audit, $0.12: the repaired data plus a replayable, reversible ledger of every transformation."},"boundary":"20 rules, published in full and free at GET https://www.aidatatools.dev/api/clean -- readable before paying. 7 are applied automatically (information-preserving), 5 need an explicit opt-in (they change row count, type or schema), and 8 are only ever reported, with no option to turn them on: near-duplicates are never merged, ambiguous placeholders are never nulled ('None' is a surname, 'NA' is Namibia), full NFKC is never applied (it rewrites 10^2 to 102), and failed extractions ('captcha', 'access denied') are never deleted -- that value is what tells you the record must be re-scraped. Impossible values are never repaired at all.","measured":"Real 100-row Amazon scrape, 57,956 nested string values: 453 repairs, 0 reverts, 0 values emptied. A control set of legitimate-but-suspicious data (French accents, Persian ZWNJ, emoji ZWJ, 10^2, AT&T, surname 'None', 'NA') comes back byte-for-byte identical: 0 changes, 11 flags.","guarantees":"Deterministic and idempotent. No value is emptied, retyped or reordered by an automatic rule. A repair that would introduce a defect the original did not have is reverted and flagged. The audited tier's ledger restores the input byte for byte.","positioning":"Deterministic post-scrape data cleaner and quality gate. Repairs how data was ENCODED -- residual HTML, mojibake ('CafÃ©' -> 'Café'), invisible characters, non-breaking spaces -- and never what it SAYS. No LLM: identical input always yields byte-identical output, so results can be cached, replayed and audited.","why_repair_is_paid":"Detection is free on this endpoint and always has been. The repaired artifact is the paid product, because it is re-bought on every extraction run rather than cached like a verdict. Both cleaning tools say so in their own descriptions, before they are called."}},"title":"Data Quality Gate - deterministic post-scrape cleaner + verdict","$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","remotes":[{"url":"https://www.aidatatools.dev/api/mcp_server","type":"streamable-http"}],"version":"0.3.0","websiteUrl":"https://www.aidatatools.dev/llms.txt","description":"Post-scrape data cleaner, no LLM: repairs mojibake, HTML, invisible chars. Plus a verdict."},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","isLatest":true,"updatedAt":"2026-08-12T07:23:32.533208Z","publishedAt":"2026-08-12T07:23:32.533208Z","statusChangedAt":"2026-08-12T07:23:32.533208Z"},"dev.protogrid/connectability":{"class":"R0","autonomous":true,"human_steps":[],"preferred":{"kind":"remote","idx":0},"remotes":[{"idx":0,"url":"https://www.aidatatools.dev/api/mcp_server","transport":"streamable-http","templated":false,"headers":[],"auth":{"type":"none","location":null,"secret_name":null,"oauth":null},"protocol":{"supported_versions":["2026-07-28"],"stateless":true},"health":{"reachable":true,"uptime_30d":1,"latency_ms_p50":339,"consecutive_failures":0,"last_probe_at":"2026-10-19T17:33:53.706Z","last_ok_at":"2026-10-19T17:33:53.706Z"}}],"packages":[]},"dev.protogrid/tools":[{"name":"check_dataset_quality","title":null,"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.","annotations":null,"source":"probe","observed_at":"2026-10-19T17:33:53.706Z"},{"name":"clean_scraped_data","title":null,"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.","annotations":null,"source":"probe","observed_at":"2026-10-19T17:33:53.706Z"},{"name":"clean_scraped_data_audited","title":null,"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.","annotations":null,"source":"probe","observed_at":"2026-10-19T17:33:53.706Z"}],"dev.protogrid/trust":{"score":77,"components":{"hygiene":80,"liveness":100,"freshness":85,"provenance":45},"drivers":["+website","+reachable","+uptime-100%","~updated-69d-ago","-no-repository"],"flags":["no-repository"],"blocked":false,"computed_at":"2026-10-19T22:06:09.911Z","disclaimer":"Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed."},"dev.protogrid/quality":{"score":80,"label":"good","components":{"auth":null,"hygiene":64,"protocol":88,"stability":100,"dependencies":null},"checks":[{"id":"protocol.modern","detail":"supports 2026-07-28 (server/discover)","status":"pass","category":"protocol"},{"id":"protocol.stateless","detail":"answers without a session","status":"pass","category":"protocol"},{"id":"protocol.transport","detail":"streamable HTTP","status":"pass","category":"protocol"},{"id":"protocol.list_ttl","detail":"tools/list declares ttlMs 0, so clients re-fetch it on every use","status":"warn","category":"protocol"},{"id":"auth.prm","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.as_metadata","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.cimd","detail":"no remote uses OAuth","status":"na","category":"auth"},{"id":"auth.secret_in_url","detail":"no templated URL","status":"na","category":"auth"},{"id":"tools.descriptions","detail":"every tool has a description","status":"pass","category":"hygiene"},{"id":"tools.description_length","detail":"2 tools have descriptions over 1,024 characters, which crowds the context","status":"warn","category":"hygiene"},{"id":"tools.schemas","detail":"every tool has an object input schema","status":"pass","category":"hygiene"},{"id":"tools.annotations","detail":"no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones","status":"fail","category":"hygiene"},{"id":"tools.directory_hints","detail":"no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: check_dataset_quality (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); clean_scraped_data_audited (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); clean_scraped_data (readOnlyHint, destructiveHint, idempotentHint, openWorldHint)","status":"fail","category":"hygiene"},{"id":"tools.token_cost","detail":"about 1,927 tokens to load every tool","status":"pass","category":"hygiene"},{"id":"tools.api_dump","detail":"tools are not a one-to-one API dump","status":"pass","category":"hygiene"},{"id":"stability.changes","detail":"no tool changes in 30 days","status":"pass","category":"stability"},{"id":"stability.rug_pull","detail":"no tool changed its meaning under the same name","status":"pass","category":"stability"},{"id":"deps.known_vulns","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.mcp_sdk_version","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.resolvable","detail":"no npm or PyPI package","status":"na","category":"dependencies"}],"drivers":["-tools.annotations","-tools.directory_hints","~protocol.list_ttl","~tools.description_length"],"flags":[],"tool_count":3,"token_estimate":1927,"tools_hash":"2690ec8bfd9bfd7e8528a43ec642c0fb","tools_changed_at":null,"computed_at":"2026-10-19T21:42:09.986Z","disclaimer":"Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed."},"dev.protogrid/identity":{"canonical_id":"io.github.aidatatools-dev/data-quality-gate","aliases":[],"alias_count":0,"repository_key":null,"owner":{"verified":false,"method":null,"since":null}}},"next_actions":[{"action":"list_tools","description":"Every current tool with input schemas","href":"/v1/servers/io.github.aidatatools-dev%2Fdata-quality-gate/tools","arguments":{"name":"io.github.aidatatools-dev/data-quality-gate"}},{"action":"get_connection","description":"Minimal connection block for the preferred remote or package","href":"/v1/servers/io.github.aidatatools-dev%2Fdata-quality-gate/connection?target=mcpServers","arguments":{"name":"io.github.aidatatools-dev/data-quality-gate","target":"mcpServers"}},{"action":"search","description":"Find other servers by intent","href":"/v1/search?q={query}","arguments":{"q":"{query}"}}]}