Interactive playground — coming soon
An interactive playground is in the works: pick one of the six demo tools, fill its form, and
validate against its schema, with a panel showing how each model + provider handled that
inputSchema. It isn't published yet.
Follow Ola on LinkedIn for updates,
more research, and errata.
Or point your own MCP client at the live demo servers
The six demo tools are already live: two public, keyless MCP servers serve them over
Streamable HTTP, so any MCP client can connect — no key, no signup. Your client brings
the model, which makes this a live playground where you can watch your model handle
the 2020-12 schemas:
https://olaservo-json-schema-2020-12-ts.hf.space/mcp — the TypeScript server
https://olaservo-json-schema-2020-12-py.hf.space/mcp — the Python sibling
There are deliberately two. Neither the TypeScript nor the Python MCP SDK validates 2020-12
tool inputs faithfully out of the box, and each server has to opt into an explicit 2020-12
validator — two independent SDKs reaching that same conclusion over one shared schema
set is itself one of the topic's findings (see each server's README on
GitHub).
Either URL works in any of these clients:
MCP Inspector
(MCP maintainers) — launch it, choose the Streamable HTTP transport, and paste a URL:
npx @modelcontextprotocol/inspector
Claude Code:
claude mcp add --transport http schema-demo https://olaservo-json-schema-2020-12-ts.hf.space/mcp
goose
(Block) — as a one-off session extension:
goose session --with-streamable-http-extension "https://olaservo-json-schema-2020-12-ts.hf.space/mcp"
fast-agent
(Shaun Smith / evalstate — the author of the render atlas above) — in
fastagent.config.yaml:
mcp:
servers:
schema-demo:
transport: "http"
url: "https://olaservo-json-schema-2020-12-ts.hf.space/mcp"
Then ask for something that exercises a hard keyword — "look up the record named
Acme Corp" (top-level oneOf: exactly one of id / name),
or "plot the point 3 across, 7 up" (the prefixItems tuple). Every call is
validated server-side against the verbatim schema; an invalid call gets back an error listing
each failing keyword, so you can watch the model self-correct (or not).