{
  "markdown": "# data-profiler-mcp\n\n<!-- mcp-name: io.github.haiiibin/data-profiler-mcp -->\n\n[![CI](https://github.com/haiiibin/data-profiler-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/haiiibin/data-profiler-mcp/actions/workflows/ci.yml)\n[![PyPI](https://img.shields.io/pypi/v/data-profiler-mcp)](https://pypi.org/project/data-profiler-mcp/)\n[![PyPI Downloads](https://img.shields.io/pypi/dm/data-profiler-mcp)](https://pypi.org/project/data-profiler-mcp/)\n[![Python](https://img.shields.io/pypi/pyversions/data-profiler-mcp)](https://pypi.org/project/data-profiler-mcp/)\n[![Glama](https://glama.ai/mcp/servers/haiiibin/data-profiler-mcp/badges/score.svg)](https://glama.ai/mcp/servers/haiiibin/data-profiler-mcp)\n[![MCP Registry](https://img.shields.io/badge/MCP%20Registry-io.github.haiiibin%2Fdata--profiler--mcp-6d4aff)](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.haiiibin/data-profiler-mcp&version=latest)\n[![Listed in awesome-mcp-servers](https://img.shields.io/badge/awesome--mcp--servers-listed-8A2BE2)](https://github.com/punkpeye/awesome-mcp-servers)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n\n> An [MCP](https://modelcontextprotocol.io) server that lets an LLM understand any tabular data file: point it at a CSV, Parquet, Excel or JSON file and get schema, distributions, data-quality flags and dtype suggestions back as structured JSON.\n\nStop pasting `df.head()` and `df.info()` into chat. Ask your assistant *\"profile `sales.csv`\"* and it reads the file itself, then tells you what is in it, what is wrong with it, and how to load it more efficiently.\n\n![data-profiler-mcp demo: one prompt returns severity-ranked data-quality flags and a memory-saving dtype plan](docs/demo.gif)\n\nWorks with **Claude Desktop**, **Claude Code**, **Cursor**, or any MCP-compatible client.\n\n---\n\n## Features\n\nSeven focused tools, all returning clean JSON:\n\n| Tool | What it does |\n|---|---|\n| `profile_dataset` | One-call overview: shape, memory, missing-value summary, duplicate rows, a per-column summary, and plain-language quality flags. |\n| `preview_data` | The first / last / a random sample of `n` rows as real records. |\n| `column_stats` | Deep dive on one column: full percentiles, skew/kurtosis, outliers (IQR), a histogram, or top values + string lengths for text. |\n| `detect_quality_issues` | A data-quality audit: duplicates, high-missing and constant columns, numbers stored as text, mixed-type columns, whitespace padding, likely IDs, grouped by severity. |\n| `suggest_dtypes` | Memory-saving / type-fixing recommendations (text to numeric, low-cardinality to `category`, integer/float downcasting) with estimated savings. |\n| `compare_datasets` | Diff two files: added/removed columns, dtype changes, row-count delta, and per-column null-rate and mean side by side. |\n| `correlation_matrix` | Correlations between numeric columns (Pearson / Spearman / Kendall): pairs ranked by strength, multicollinearity flags at \\|r\\| >= 0.9, and target-vs-rest ranking via `column`. |\n\nSupported formats: **CSV, TSV, Parquet, Excel (`.xlsx`/`.xls`), JSON and JSON Lines**. Large files are read up to a row cap and clearly flagged as sampled.\n\nNo dataset at hand? [`examples/sample.csv`](examples/sample.csv) is a small sales export with deliberate quality issues (missing regions, a duplicate row, a constant column, whitespace padding) -- ask your assistant to *\"profile examples/sample.csv\"* and see what it flags.\n\n---\n\n## Install\n\nNo install needed to try it: open the [Glama server page](https://glama.ai/mcp/servers/haiiibin/data-profiler-mcp) and use **Try in Browser** to call the tools against a sandbox (the repo ships `examples/sample.csv` at `/app/examples/sample.csv` to profile).\n\nRequires Python 3.10+.\n\n```bash\n# with uv (recommended)\nuv tool install data-profiler-mcp\n\n# or with pip\npip install data-profiler-mcp\n```\n\nOr run it straight from source without installing:\n\n```bash\ngit clone https://github.com/haiiibin/data-profiler-mcp\ncd data-profiler-mcp\nuv run data-profiler-mcp\n```\n\n---\n\n## Configure your client\n\n### Claude Desktop\n\nEdit `claude_desktop_config.json`\n(macOS: `~/Library/Application Support/Claude/`, Windows: `%APPDATA%\\Claude\\`) and add:\n\n```json\n{\n  \"mcpServers\": {\n    \"data-profiler\": {\n      \"command\": \"data-profiler-mcp\"\n    }\n  }\n}\n```\n\nRunning from source instead of installing? Point it at the checkout:\n\n```json\n{\n  \"mcpServers\": {\n    \"data-profiler\": {\n      \"command\": \"uv\",\n      \"args\": [\"--directory\", \"/absolute/path/to/data-profiler-mcp\", \"run\", \"data-profiler-mcp\"]\n    }\n  }\n}\n```\n\nRestart Claude Desktop and the tools appear under the plug icon.\n\n### Claude Code\n\n```bash\nclaude mcp add data-profiler -- data-profiler-mcp\n```\n\n---\n\n## Usage\n\nOnce connected, just talk to your assistant:\n\n- *\"Profile `~/data/sales_2025.csv` and tell me what's in it.\"*\n- *\"Are there any data-quality problems in `customers.parquet`?\"*\n- *\"Show me 20 random rows from `events.jsonl`.\"*\n- *\"Give me full stats for the `revenue` column, including outliers.\"*\n- *\"How can I shrink this DataFrame's memory usage?\"*\n- *\"What changed between `snapshot_jan.csv` and `snapshot_feb.csv`?\"*\n\n### Example: `profile_dataset`\n\n```jsonc\n{\n  \"file\": { \"name\": \"sample.csv\", \"format\": \"csv\", \"size_human\": \"14.2 KB\" },\n  \"shape\": { \"rows\": 201, \"columns\": 13, \"sampled\": false },\n  \"memory_usage_human\": \"78.4 KB\",\n  \"missing_summary\": { \"total_missing_cells\": 561, \"pct_missing\": 21.5, \"columns_with_missing\": 3 },\n  \"duplicate_rows\": { \"count\": 1, \"pct\": 0.5 },\n  \"columns\": [\n    {\n      \"name\": \"price\", \"dtype\": \"float64\", \"inferred_type\": \"float\",\n      \"non_null\": 201, \"null\": 0, \"unique\": 51,\n      \"stats\": { \"min\": 0.0, \"max\": 100000.0, \"mean\": 521.3, \"median\": 24.0 }\n    }\n  ],\n  \"quality_flags\": [\n    \"[high] empty_col: Column is entirely empty (all values missing).\",\n    \"[warning] const: Column holds a single constant value; it carries no information.\",\n    \"[warning] numeric_text: Every value parses as a number but the column is stored as text.\"\n  ]\n}\n```\n\n### Example: `detect_quality_issues`\n\n```jsonc\n{\n  \"issue_count\": 8,\n  \"severity_counts\": { \"high\": 2, \"warning\": 4, \"info\": 2 },\n  \"issues\": [\n    { \"column\": \"empty_col\", \"issue\": \"all_missing\", \"severity\": \"high\",\n      \"detail\": \"Column is entirely empty (all values missing).\" },\n    { \"column\": \"numeric_text\", \"issue\": \"numeric_stored_as_text\", \"severity\": \"warning\",\n      \"detail\": \"Every value parses as a number but the column is stored as text.\" }\n  ]\n}\n```\n\n---\n\n## How it works\n\nThe server is built on [FastMCP](https://github.com/modelcontextprotocol/python-sdk) and reads files with pandas (plus pyarrow for Parquet and openpyxl for Excel). Every tool returns a plain, JSON-serializable dict, with NumPy scalars, `NaN`/`inf` and timestamps normalized so the output is safe to hand straight back to a model. Nothing is written to disk and no data leaves your machine.\n\n---\n\n## Development\n\n```bash\nuv venv\nuv pip install -e \".[dev]\"\nuv run pytest\n```\n\n---\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n",
  "bytes": 7081,
  "sha": "1e0aee8200b280727693a78cd5586c8f622074de8d6bd50e81c6b3712601da93",
  "repo_slug": "haiiibin/data-profiler-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_haiiibin_data_profiler_mcp_a939ffdb/readme"
}