๐ฅ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/mcpTools
| Tool | Description |
|---|---|
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.