๐ŸฅCroissant Validator

A stateless MCP server for validating MLCommons Croissant dataset metadata.

This server implements the MCP 2026-07-28 specification โ€” the stateless protocol revision. There is no initialize handshake and no session ID: every request is self-contained, which is why this entire server runs on serverless functions. Validation is performed by the official mlcroissant library.

Endpoint

https://croissant-validation.jetty.bot/mcp

Tools

ToolDescription
validate_croissant Validate a Croissant JSON-LD document (object or JSON string) against the Croissant schema. Returns per-check results, errors, and warnings.
validate_croissant_url Fetch metadata from a URL (e.g. a Hugging Face dataset's /croissant endpoint) and validate it.
pdf_to_croissant Generate Croissant metadata from an academic paper: give it a PDF URL (or an upload_id, below) and a Jetty agent reads the paper, writes croissant.json, and validates it โ€” the MCP version of mlcroissant.jetty.bot. Runs take 2โ€“5 minutes.
croissant_run_status Poll a running pdf_to_croissant job.
croissant_run_result Fetch croissant.json (re-validated on the way out), summary.md, or validation_report.json from a completed run.

Local PDFs

MCP has no file-upload primitive, so local papers come in over plain HTTP. POST the PDF to /upload, then pass the returned upload_id to pdf_to_croissant instead of pdf_url:

curl -sS -F "file=@paper.pdf" \
  https://croissant-validation.jetty.bot/upload

Hosted uploads are limited to ~4.5 MB per request; larger papers (up to 15 MB) should go through pdf_url.

Connect from Claude Code

claude mcp add --transport http croissant-validator \
  https://croissant-validation.jetty.bot/mcp

One raw stateless request

No handshake โ€” a single POST does everything:

curl -sS https://croissant-validation.jetty.bot/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -H 'MCP-Protocol-Version: 2026-07-28' \
  -d '{
    "jsonrpc": "2.0", "id": 1, "method": "tools/call",
    "params": {
      "name": "validate_croissant",
      "arguments": {"croissant": {"@type": "sc:Dataset", "name": "demo"}},
      "_meta": {
        "io.modelcontextprotocol/protocolVersion": "2026-07-28",
        "io.modelcontextprotocol/clientCapabilities": {}
      }
    }
  }'

The _meta envelope replaces the old initialize handshake: the protocol version and client capabilities ride along on every request instead of being negotiated up front.