DataClean MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@DataClean MCP profile this messy sales CSV and clean it to XLSX"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dataclean-mcp
An MCP server that cleans tables deterministically before an AI agent reasons over them. LLMs misread 1.250,50 €, swap day and month in 03/04/2026, choke on NUL bytes and mojibake (Café), and silently drop leading zeros. DataClean fixes these with rules, and it never guesses: an ambiguous value is kept as it was and flagged, and it is converted only when the rest of its column (or a parameter you pass) settles its meaning.
Tool | Credits | What it does |
| 1 | Encoding, delimiter, header row, and for each column: real type (integer, decimal, date, datetime, boolean, email, url, phone, iban, text), number locale, date order, currency, nulls, distinct values, min/max, examples and problems. Also reports duplicate rows and a suggested schema. |
| 1 | Returns a clean, typed copy as CSV, TSV, JSON, JSONL or typed .xlsx: text trimmed and repaired, numbers as plain decimals, dates in ISO 8601, phones in E.164, IBANs compacted, rows deduplicated, headers made unique or snake_case. Every value left unconverted is listed with its source row. |
| 1 | Checks every row against a schema (type, required, unique, min/max, min_length/max_length, enum, pattern) and returns errors with their row numbers. |
| 1 | Normalizes a list of up to 10,000 values (amounts, dates, phones, emails…) taken from a document or another tool. |
| 0 | Free helpers. |
Charging works like this:
Unreadable input or invalid parameters are refused before any credits are charged.
A failure after charging is refunded.
What it fixes
Numbers:
1.250,50 €,$1,250.50,1 234,5,1'234.50,(45.30), SAP-style1.250,50-,12,5 %,EUR 12. The column decides whether a value like1,250uses a thousands or a decimal separator. If nothing in the column decides it,number_localedoes, and without either the value is flaggedambiguous_number.Dates: ISO,
13/04/2026(day-first),04/13/2026(month-first),5 de marzo de 2026,March 5, 2026,5-Mar-26,3. März 2026, and times with am/pm.03/04/2026is converted only when another value in the column, ordate_order, settles the order. Dates in the minority order are flaggeddate_order_conflict.Text: removes NUL, control and zero-width characters, turns NBSP into a normal space, repairs mojibake, applies Unicode NFC, and collapses and trims spaces. Null markers (
NULL,N/A,#N/A,-,nan…) become empty.IDs: digit strings with leading zeros or more than 15 digits (zip codes, card numbers, references) stay text and are never turned into numbers.
Files: CSV in UTF-8, UTF-16 or Windows-1252, delimiter detected automatically (
, ; tab |), title rows above the header skipped, ragged rows padded, duplicate or empty headers renamed. Also reads.xlsx(via base64) and JSON/JSONL.Safety: in CSV output, text cells starting with
= + - @get a'prefix so spreadsheets do not run them as formulas. In.xlsxoutput they are stored as strings. Schema regexes with nested quantifiers are refused (ReDoS).
Related MCP server: ETL-D MCP Server
Install
Buy credits at https://mcp.keyflint.dev to get a license (
LIC-...).Add the server to your client:
{
"mcpServers": {
"dataclean": {
"command": "uvx",
"args": ["dataclean-mcp"],
"env": { "KEYFLINT_LICENSE": "LIC-..." }
}
}
}Claude Desktop also installs the .mcpb bundle attached to each GitHub release. Hosted mode runs dataclean-mcp --http (or uses the Dockerfile) and reads the license from each request's Authorization: Bearer LIC-... header.
Limits (set by environment variables): DATACLEAN_MAX_BYTES (20 MB), DATACLEAN_MAX_ROWS (200,000), DATACLEAN_MAX_OUTPUT (15 MB). Credit prices can be overridden with DATACLEAN_PRICES=clean_table=2,....
Visual cards (MCP Apps)
In Claude, ChatGPT, VS Code and Goose every paid tool and credits_balance renders as an interactive card in the
chat: credit balance with a refill bar and a buy button, or a result summary (key figures, issues, table preview and
credits charged). It is the ui://dataclean/card.html resource, self-contained with no network access. Other clients
keep getting the same JSON as before.
Tests
pip install -e '.[test]'
pytest -qThe tests use a fake KeyFlint gateway and locally signed licenses, so they need no network.
License
Business Source License 1.1. Production use requires a KeyFlint license from the Licensor. On 2030-11-05 the code becomes Apache 2.0.
Available Tools
6 toolsclean_tableARead-onlyIdempotentInspect
Return a clean, typed copy of a table, with a report of every change and every value left unconverted.
Text: NUL/control/zero-width characters removed, mojibake repaired (Café -> Café), Unicode NFC, spaces
collapsed and trimmed. Numbers: plain decimals (1.250,50 € -> 1250.50; (45) -> -45; 1.250,50- -> -1250.50).
Dates: ISO 8601. Booleans: true/false. Emails: domain lowercased. Phones: E.164. IBAN: compact uppercase.
Values that do not fit the column type are kept as they were (on_invalid='null' empties them) and listed
in flags with their source row.
Args:
output_format: csv (default) | tsv | json | jsonl | xlsx (typed cells; returned only as content_base64).
header_style: keep | snake (Fecha de alta -> fecha_de_alta). columns: keep only these columns, in order.
dedupe: none | exact | ignore_case, over all columns or dedupe_keys; the first occurrence is kept.
drop_empty_columns: remove columns with no values. output_delimiter: for csv output.
formula_guard: prefix text cells starting with = + - @ with ' in CSV so spreadsheets do not run them.
Input (exactly one): content (CSV/TSV/JSON text), content_base64 (file bytes: .xlsx, or CSV in any encoding),
rows (JSON list of objects or of lists). delimiter: auto-detected (, ; tab |). sheet: Excel sheet name (default
the first). has_header: false when the first row is data. header_row: 1-based row of the header (default auto,
skipping title rows above it).
Parsing: number_locale 'eu' (1.234,56) or 'us' (1,234.56) settles values like 1,250 (auto from the column
otherwise). date_order 'dmy' or 'mdy' settles dates like 03/04/2026 (auto from the column otherwise).
phone_country (ISO-2, e.g. ES, US, GB) converts national phone numbers to E.164. null_values: extra strings
read as empty (NULL, N/A, -, #N/A and similar are already). types: force a type per column, e.g.
{"zip": "text", "amount": "decimal"}; types are text, integer, decimal, boolean, date, datetime, email, url,
phone, iban.Inputs: rows, sheet, types, dedupe, +18 more. Returns: object
credits_balanceARead-onlyInspect
Remaining credits on your KeyFlint license. Free.
Inputs: no named parameters. Returns: object
normalize_valuesBRead-onlyIdempotentInspect
Normalize a list of up to 10,000 values of one kind, e.g. amounts, dates or phone numbers from a document.
kind: auto (inferred like a table column) | number | integer | decimal | date | datetime | boolean | email | url | phone | iban | text. name: optional column name, used as a hint (e.g. 'phone', 'fecha'). Returns one result per input, in order: {"input", "output", "valid"} and "reason" when it could not be converted. Output types: numbers as plain decimal strings, dates ISO 8601, phones E.164.
Inputs: values (required), kind, name, date_order, +2 more. Returns: object
pricingARead-onlyInspect
Credit price of each tool and where to buy credits. Free.
Inputs: no named parameters. Returns: object
profile_tableARead-onlyIdempotentInspect
Profile a table: what each column really contains and what is wrong with it, without changing it.
Returns the detected encoding/delimiter/header, per-column type, nulls, distinct values, min/max, number locale, date order, currency, examples and notes (leading-zero IDs, formula-injection cells, ambiguous dates or numbers, mixed separators), table issues (ragged rows, NUL bytes, duplicate headers, title rows), exact duplicate rows, the first 50 flagged cells and a suggested schema for validate_schema.
Input (exactly one): content (CSV/TSV/JSON text), content_base64 (file bytes: .xlsx, or CSV in any encoding),
rows (JSON list of objects or of lists). delimiter: auto-detected (, ; tab |). sheet: Excel sheet name (default
the first). has_header: false when the first row is data. header_row: 1-based row of the header (default auto,
skipping title rows above it).
Parsing: number_locale 'eu' (1.234,56) or 'us' (1,234.56) settles values like 1,250 (auto from the column
otherwise). date_order 'dmy' or 'mdy' settles dates like 03/04/2026 (auto from the column otherwise).
phone_country (ISO-2, e.g. ES, US, GB) converts national phone numbers to E.164. null_values: extra strings
read as empty (NULL, N/A, -, #N/A and similar are already). types: force a type per column, e.g.
{"zip": "text", "amount": "decimal"}; types are text, integer, decimal, boolean, date, datetime, email, url,
phone, iban.Inputs: rows, sheet, types, content, +8 more. Returns: object
validate_schemaARead-onlyIdempotentInspect
Check every row of a table against a schema, after the same parsing clean_table applies.
schema: {"columns": {"id": {"type": "integer", "required": true, "unique": true},
"email": {"type": "email", "required": true},
"amount": {"type": "decimal", "min": 0, "max": 100000},
"signup": {"type": "date", "min": "2020-01-01"},
"status": {"enum": ["active", "churned"]},
"sku": {"type": "text", "pattern": "[A-Z]{3}-\d{4}", "max_length": 8}},
"strict_columns": false}
Rules: type, required, unique (case-insensitive), min/max (numbers and dates), min_length/max_length, enum
(case-insensitive), pattern (full match; nested quantifiers are refused). Column names match case-insensitively.
strict_columns flags columns that are not in the schema. Errors carry the source row number; valid is
true only with zero errors. profile_table returns a suggested schema to start from.
Input (exactly one): content (CSV/TSV/JSON text), content_base64 (file bytes: .xlsx, or CSV in any encoding),
rows (JSON list of objects or of lists). delimiter: auto-detected (, ; tab |). sheet: Excel sheet name (default
the first). has_header: false when the first row is data. header_row: 1-based row of the header (default auto,
skipping title rows above it).
Parsing: number_locale 'eu' (1.234,56) or 'us' (1,234.56) settles values like 1,250 (auto from the column
otherwise). date_order 'dmy' or 'mdy' settles dates like 03/04/2026 (auto from the column otherwise).
phone_country (ISO-2, e.g. ES, US, GB) converts national phone numbers to E.164. null_values: extra strings
read as empty (NULL, N/A, -, #N/A and similar are already). types: force a type per column, e.g.
{"zip": "text", "amount": "decimal"}; types are text, integer, decimal, boolean, date, datetime, email, url,
phone, iban.Inputs: schema (required), rows, sheet, content, +9 more. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 6 tools
The tools have clearly distinct roles: profile_table inspects without changes, clean_table transforms, validate_schema checks against rules, and normalize_values handles standalone value lists. pricing and credits_balance are related but separate (cost vs. remaining balance), so selection is straightforward.
Names consistently use snake_case and are readable, with most action-oriented tools following a verb_noun pattern (profile_table, clean_table, validate_schema, normalize_values). pricing and credits_balance are noun-style exceptions, but they remain clear and fit their utility role.
Six tools is well-scoped for a data-cleaning server, with each tool covering a meaningful stage of the workflow. There are no redundant or filler tools, and pricing/credits_balance are appropriately lightweight support tools.
The set covers the core lifecycle: profiling, cleaning, schema validation, standalone normalization, plus pricing and credit checks. Inputs support CSV/TSV/JSON/XLSX and multiple output formats, leaving no obvious domain gap for a data-cleaning workflow.
Maintenance
Related MCP Connectors
300+ deterministic data utilities for AI agents: validate, normalize, parse, match, redact.
Standardize, reshape, and normalize messy data — CSV, Excel, Parquet, S3, databases.
Five deterministic micro-tools for AI-agent data pipelines: clean, dedupe, normalize, score, detect.
Paid deterministic data-quality and execution-verification tools for AI agents.
Related MCP Servers
- AlicenseAqualityNot gradedmaintenanceProvides AI agents with data validation, transformation, and normalization capabilities, including JSON schema validation, CSV processing, data normalization, text cleaning, and dataset merging.570 npmMIT
- AlicenseCqualityDmaintenanceProvides deterministic data parsing and enrichment for AI agents, including bank statements, trade history, EDI, PDFs to structured markdown, and atomic enrichment for amounts, dates, and addresses, with strict schema enforcement to prevent hallucinations.3744 npm2ISC
- AlicenseNot gradedqualityBmaintenanceEnables cleaning tabular data by detecting duplicates, placeholder nulls, type issues, spelling variants, encryption damage, outliers, and personal data, then applying safe fixes automatically while requiring human approval for risky changes.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to validate CSV exports against schemas, infer schemas from example files, profile datasets, and diff before/after exports for lab/LIMS data-quality checks.MIT