croissant-validation
OfficialValidates Croissant dataset metadata, including fetching from Hugging Face dataset endpoints.
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., "@croissant-validationvalidate Croissant metadata at https://huggingface.co/api/datasets/mnist/croissant"
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.
π₯ croissant-validation
A stateless MCP server for validating MLCommons Croissant dataset metadata β built as a working demonstration of the MCP 2026-07-28 specification, the revision that made the Model Context Protocol stateless.
Live endpoint: https://croissant-validation.jetty.bot/mcp
Why this exists
The 2026-07-28 spec removed the initialize/notifications/initialized handshake and the Mcp-Session-Id header. Every request is now self-contained: protocol version and client capabilities travel in _meta, and servers advertise themselves via server/discover. That means an MCP server can run on plain serverless functions behind any load balancer β no sticky sessions, no shared session store.
This repo is exactly that: the MCP Python SDK v2 (mcp==2.0.0, released alongside the spec) serving Croissant validation from Vercel serverless functions. Validation is performed by the official mlcroissant library β the same checks as the MLCommons croissant-validator, previously hosted in the mlcbakery MCP server.
Related MCP server: agentvet-mcp
Tools
Tool | Description |
| Validate a Croissant JSON-LD document (object or JSON string) against the Croissant schema. Returns per-check results, blocking |
| Fetch metadata from a URL (e.g. a Hugging Face dataset's |
| Generate Croissant metadata from an academic paper: give it a PDF URL (or an |
| Poll a running |
| Fetch an output file from a completed run β |
The generation tools mirror the API flow of jettyio/pdf2croissant (upload β runbook launch β trajectory poll β file download) and vendor its runbook verbatim. They need a JETTY_API_TOKEN_PDF2CROISSANT environment variable; without it, the validation tools still work β validation is pure and stateless.
Local PDFs (POST /upload)
MCP has no clientβserver file-transfer primitive β tool arguments are JSON generated by the model, so base64-ing a paper into a tool call is a non-starter. Local files instead come in over plain HTTP:
curl -sS -F "file=@paper.pdf" https://croissant-validation.jetty.bot/upload
# β {"upload_id": "β¦", "filename": "paper.pdf", "size_bytes": 123, "next": "β¦"}Then call pdf_to_croissant with that upload_id instead of pdf_url. A raw-body POST works too (--data-binary @paper.pdf, optional ?filename=).
The upload_id is the Jetty storage path, HMAC-signed with a key derived from the server's Jetty token β self-contained and tamper-evident, so the stateless server needs no session store, and callers can't mint references to arbitrary storage paths. Note the hosted instance sits behind Vercel's ~4.5 MB request-body cap; larger papers (up to 15 MB) should go through pdf_url.
Connect
Claude Code:
claude mcp add --transport http croissant-validator https://croissant-validation.jetty.bot/mcpOr any MCP client that speaks Streamable HTTP β clients on the 2025-era protocol still work; the SDK answers the legacy handshake alongside server/discover.
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_url",
"arguments": {"url": "https://huggingface.co/api/datasets/mnist/croissant"},
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientCapabilities": {}
}
}
}'The params._meta envelope replaces the old initialize handshake β the protocol version and client capabilities ride along on every request instead of being negotiated up front. (The server rejects 2026-07-28 requests without it.)
Development
uv sync
uv run pytest -q # validation + stateless HTTP round-trip tests
uv run uvicorn croissant_mcp.server:app --reload # local server on :8000Layout:
croissant_mcp/validation.pyβ mlcroissant-backed validation (JSON well-formedness β Croissant schema; warnings surfaced frommlcroissant's issue tracker)croissant_mcp/server.pyβMCPServerdefinition, tools, landing page, and the stateless Streamable HTTP ASGI app (stateless_http=True, json_response=True)main.pyβ Vercel entrypoint (the Python backend builder serves the ASGI app on all routes)examples/β a valid Croissant file (Titanic, from the MLCommons repo) and an invalid variant (invalid-not-a-dataset.json, missing its@type)
Record-set generation checks (actually materializing data) are intentionally out of scope here β they can download arbitrarily large files, which doesn't belong in a serverless request. Schema validation is the static contract check.
Deploy
Deployed on Vercel (Python runtime, Fluid Compute). The one serverless-specific consideration: streamable_http_app() starts its session manager via ASGI lifespan, which Vercel now runs. In stateless mode there is no cross-request state, so cold starts and horizontal scaling are free.
Roadmap
Wire into Jetty workflows as the validation step for an MCP-native version of PDF β Croissant.
License
MIT
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP Spec Compliance MCP β audits any MCP server.json against the official Model Context Protocol
JSON Schema validation MCP.
MCP server (stdio): validate JSON against JSON Schema (draft-07 / 2020-12) via the AgentForge API
MCP server providing access to the Scorecard API to evaluate and optimize LLM systems.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceMCP server to lint and validate Kubernetes-related manifests(Helm, FluxCD, ArgoCD, Kustomize, etc.)MIT
- AlicenseAqualityDmaintenanceMCP server that validates LLM-generated tool-call arguments, lints tool definitions, and produces retry messages for AI assistants.334 npm1MIT
- AlicenseNot gradedqualityBmaintenanceSchema Validator AI - MCP server providing AI-powered tools and automation by MEOK AI Labs7 npm56 PyPIMIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server for validating JSON against schemas, checking email deliverability, verifying URLs, assessing data quality, and validating API responses using RFC-compliant checks and heuristic analysis.4 npm65 PyPIMIT