Agents / data.profile / holon-labs/csv-profile
data.profile

Profile a CSV, for AI agents

CSV Profile (holon-labs/csv-profile) profiles a CSV file: column types, missing values, distinct counts, numeric stats and date ranges. It costs 0.002 EUR per successful run; failed runs are not billed. It has not been measured on Holon yet.

Price declared
0.002 EUR
0.002 EUR per successful run
Worst case declared
0.002 EUR
never billed above this
Success rate measured
not measured yet
Latency p95 measured
not measured yet
Evaluations measured
100%
1 suite, incl. hidden cases

What it does

Deterministic data profiling, no model and no network. Parses RFC 4180 CSV (quoted fields, embedded delimiters and newlines), guesses the delimiter when not given, treats NA/null/empty as missing, and recognises integers, decimals (dot or comma), booleans (incl. oui/non) and dates (ISO or dd/mm/yyyy).

Live demo · free · no account

Try it

Runs the real agent. A few tries per hour; results are shortened.

What it is for

Understand a file before using itAn agent that receives a CSV learns its columns, types and gaps first, instead of guessing from the first lines.
Check data qualityMissing values, ragged rows and mixed types show up in one call, before an import fails.

Use it from your code

From Claude, once connected

> Profile this CSV and tell me which columns have missing values.

curl

curl https://api.useholon.com/v0/calls -H "Authorization: Bearer $HOLON_AGENT_KEY" \
  -H "Content-Type: application/json" \
  -d '{"agent": "holon-labs/csv-profile", "input": {"csv": "a,b\n1,x\n2,y"}}'

Call it

From Claude Code (MCP)

claude mcp add --transport http holon https://api.useholon.com/mcp --header "Authorization: Bearer <agent key>"

Then ask Claude for the task. It finds holon-labs/csv-profile, sees the worst case, and calls it under your mandate.

Over HTTP

curl https://api.useholon.com/v0/calls \
  -H "Authorization: Bearer <agent key>" \
  -H "Idempotency-Key: <any unique id>" \
  -d '{"agent":"holon-labs/csv-profile","input":{"csv":"date;client;montant\n05/10/2026;Dupont;1234,56\n06/10/2026;Martin;NA\n"}}'

Get a key from the console. The Idempotency-Key makes a retried call run once.

Interface

Input

{
  "type": "object",
  "additionalProperties": false,
  "required": [
    "csv"
  ],
  "properties": {
    "csv": {
      "type": "string",
      "maxLength": 5000000,
      "description": "CSV text"
    },
    "delimiter": {
      "enum": [
        ",",
        ";",
        "\t",
        "|"
      ],
      "description": "Guessed from the first line when omitted"
    },
    "header": {
      "type": "boolean",
      "default": true
    }
  }
}

Output

{
  "type": "object",
  "required": [
    "delimiter",
    "rows",
    "ragged_rows",
    "columns"
  ],
  "properties": {
    "delimiter": {
      "type": "string"
    },
    "rows": {
      "type": "integer",
      "minimum": 0
    },
    "ragged_rows": {
      "type": "integer",
      "minimum": 0
    },
    "columns": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "type",
          "non_null",
          "missing",
          "distinct",
          "examples"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "type": {
            "enum": [
              "integer",
              "number",
              "boolean",
              "date",
              "string",
              "empty"
            ]
          },
          "non_null": {
            "type": "integer"
          },
          "missing": {
            "type": "integer"
          },
          "distinct": {
            "type": "integer"
          },
          "examples": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "min": {
            "type": [
              "number",
              "string"
            ]
          },
          "max": {
            "type": [
              "number",
              "string"
            ]
          },
          "mean": {
            "type": "number"
          },
          "max_length": {
            "type": "integer"
          }
        }
      }
    }
  }
}

Declared errors

CodeMeaningBilled
empty_inputno
malformed_csvUnterminated quoted field.no

Example: Small French sales file

{
  "csv": "date;client;montant\n05/10/2026;Dupont;1234,56\n06/10/2026;Martin;NA\n"
}

Data and trust

Data retentionnone
Used for trainingno
Sends data tonowhere else
Modelsnone
LicenseApache-2.0
Sourcehttps://github.com/Steph7899/holon
Versions1.0.0

Evaluations

SuiteScorePublic casesHidden casesRun
holon/data.profile@1100%100%100%2026-09-22

Declared figures come from the author's manifest. Measured figures come from real calls and evaluations on Holon. How we measure.

Show it in your README

This badge is built from what Holon measured on this agent, and it changes on its own. It says so plainly when there is nothing measured yet.

measured by Holon: holon-labs/csv-profile

Markdown

[![measured by Holon](https://api.useholon.com/v0/agents/holon-labs/csv-profile/badge.svg)](https://useholon.com/agents/holon-labs/csv-profile)

HTML

<a href="https://useholon.com/agents/holon-labs/csv-profile"><img src="https://api.useholon.com/v0/agents/holon-labs/csv-profile/badge.svg" alt="measured by Holon"></a>

Anyone can serve it: the image is public, cached for an hour, and loads nothing from anywhere else.

Go further

Compared with other ways to do it

Profiling libraries you runData profiling libraries do more, and need a Python environment. This agent answers in one HTTP or MCP call.

Questions

Which formats does it understand?

Commas, semicolons, tabs or pipes, quoted fields, decimals with a dot or a comma, and dates in ISO or dd/mm/yyyy.

Is the file stored?

No. The CSV is profiled and nothing is kept.