One license, one corpus, three doors into it. This page exists to make the choice for you in about ninety seconds — because the wrong door is not inconvenient here, it is expensive.
That single question separates the three surfaces. They serve the same corpus under the same license and enforce the same grants — they differ in whether your code or a model is choosing the next call, and that is what decides the bill.
Your code decides what to fetch.
The model picks from four tools.
The model explores open-endedly.
Most integrations are pipelines, so REST is the default recommendation. Reach for the other two when a model — not your code — is picking the next call.
These are the integrations partners actually describe on the first call, and the door each one wants.
| What you are building | Use this |
|---|---|
| A nightly sync of the corpus into your own store | REST API — Your plan is fixed; ETags make an unchanged subject free to re-check. |
| An LMS or SIS import, mapped to your course catalog | REST API — Key everything to the stable lessonId and re-run it forever. |
| A search or RAG index over lesson text and transcripts | REST API — Page the corpus once, then re-crawl only what the contentVersion moved. |
| A tutoring chatbot grounded in real curriculum | Chatbot Kit — Four tools cover every verb a teaching conversation needs, at a fixed per-turn cost. |
| Study help inside an app you already ship | Chatbot Kit — Drop-in tool definitions plus a system prompt that refuses to teach from memory. |
| Claude, ChatGPT or Cursor reading the library directly | MCP — The host handles OAuth; the model chooses its own next call. |
| An agent whose next step you cannot predict | MCP — Discovery, tutoring, media and export in one negotiated surface. |
| A bulk export of everything you license | REST API — One call per subject, stamped to your organization. Never loop a chatbot over it. |
The obvious way to wire a chatbot to a REST API is to hand the model the whole OpenAPI document. Do not do that here. Tool definitions sit at the front of the prompt and are re-billed on every turn of every conversation — so the size of what you paste is a running cost, not a one-off.
| What you give the model | Full OpenAPI document all 18 routes | Chatbot Kit 4 tools + system prompt |
|---|---|---|
| Bytes you paste | 122,234 B | 5,710 B |
| Tokens, every single turn | 43,501 | 2,039 |
| A 20-turn lesson | 870,020 | 40,780 |
| At $3 per million input tokens | $2.61 | $0.12 |
Measured 21 August 2026 by serialising the live schema and the generated kit (node gen-chatbot-kit.mjs --report), at a pessimistic 2.8 characters per token. The dollar row uses $3/M as a stand-in for a mid-tier model’s input rate — substitute your own; the 21× ratio is the part that does not move. That is $2.49 of pure overhead per conversation, before the model has read a single lesson.
The other 14 routes are not missing from the kit by accident. A model handed an export tool will reach for it, and one subject export can drop 41 classes into the context window — outweighing the entire rest of the conversation. Bulk belongs in your pipeline, where your code decides what to fetch and nothing is re-billed per turn.
Prompt caching only rescues you if the definitions are byte-stable, which a hand-maintained paste is not. The kit is generated from the same schema the API serves, and its generator refuses to build if it names an operation, parameter or error code the API does not actually have.
Whichever surface you build against, these do not change — so a decision made now does not lock you out of the others later.
Content grants are held per organization and enforced identically on all three surfaces. A subject outside your grants is denied the same way whether your code or a model asked for it — so you cannot widen access by switching doors.
A lessonId is{tier}/{subjectSlug}/{classNum} — the key you write into your own database. Copy one from a search hit or a subject outline; never assemble one by hand from a display name, which is where nearly every first-week integration error comes from.
The published schema documents 30 error codes. Branch onerror.code, never on the status alone: aninsufficient_scope is a free token re-request, while CONTENT_NOT_GRANTED is a commercial conversation.
Quotas and rate limits are per organization and shared across the doors — a media URL costs the same whichever surface minted it. Ask for your remaining allowance any time with GET /v1/license orget_license_status; both are unmetered.
The schema is public and unauthenticated, so you can read every route and generate a client before anything is signed. Content itself needs a license.
# 1) the schema — no auth, no credential, no conversation
curl -s https://mcp.scolavo.com/v1/openapi.json | jq '.info.version, (.paths | keys)'
# 2) a token for your organization (client_credentials; valid 15 minutes)
TOKEN=$(curl -s -X POST 'https://scolavo-auth.auth.us-east-1.amazoncognito.com/oauth2/token' \
-u "$CLIENT_ID:$CLIENT_SECRET" \
-d 'grant_type=client_credentials' | jq -r .access_token)
# 3) the first real call — every list route answers {items, total, pageNum, hasMore}
curl -s 'https://mcp.scolavo.com/v1/subjects?tier=high&limit=100' \
-H "Authorization: Bearer $TOKEN"Every collection in the REST API is called items — on every route, without exception. Write one pager and reuse it; reading for a route-specific key is the fastest way to build a client that reports success while syncing nothing.
https://mcp.scolavo.com/mcpPaste that into Claude, ChatGPT or Cursor as a custom connector. It speaks the Model Context Protocol over HTTPS with standard OAuth discovery — there is no API key to enter, and the setup guide walks every host.
Each of these is generated from the same source the API runs on, and a deploy that would ship a stale copy fails instead. Hand any of them to a coding agent as context.
/openapi.jsonOpenAPI 3.1 schema — The same document GET /v1/openapi.json serves — generate a client before you hold a credential.
/rest-api-spec.mdREST integration guide — Every route, the cheap-sync recipe, metering and the full error table, as Markdown.
/chatbot-kit-spec.mdChatbot Kit guide — Why four tools, the single-opaque-id decision, and the five-minute install.
/chatbot-kit/tools.anthropic.jsonTool definitions (Anthropic) — The four tools in Anthropic tool shape. Paste straight into your request.
/chatbot-kit/tools.openai.jsonTool definitions (OpenAI) — The same four in OpenAI function shape, generated from the same schema.
/chatbot-kit/system-prompt.mdTeaching system prompt — The persona, the grounding rules and the attribution clause.
/mcp-spec.mdMCP specification — The complete connector spec — OAuth flows, the data model, learner progress.
/llms.txtllms.txt — The agent-readable index of everything above. Point a coding agent here first.
Content is licensed to institutions and product teams — annual, PO-friendly, with single-subject evaluation licenses so you can build against something real first. A person replies with a quote and the agreement; no demo call required.