@currikon/mcp
v0.2.6
Published
Model Context Protocol server for the Currikon curriculum API
Maintainers
Readme
@currikon/mcp
Model Context Protocol server for the Currikon curriculum API.
The package is API-backed and does not bundle the curriculum dataset. It connects
to https://api.currikon.org by default and uses your Currikon API key for
authenticated requests.
Install
Connector (recommended for Claude.ai and Claude Code) — the API serves an
OAuth-protected remote MCP endpoint at /mcp; no install, no API key.
Claude.ai: Customize → Connectors → Add custom connector →
https://api.currikon.org/mcp → Sign in.
Claude Code:
claude mcp add --transport http currikon https://api.currikon.org/mcpSign-in is via WorkOS AuthKit; the same ten tools below are exposed.
This package (servers, CI, scripts) — for anything that isn't Claude.ai or Claude Code, or that needs an API key rather than an interactive OAuth sign-in.
Claude Code:
claude mcp add -s user -e CURRIKON_API_KEY=ck_live_... currikon -- npx -y @currikon/mcpClaude Desktop / Cursor:
{
"mcpServers": {
"currikon": {
"command": "npx",
"args": ["-y", "@currikon/mcp"],
"env": {
"CURRIKON_API_KEY": "ck_live_..."
}
}
}
}Use staging:
{
"env": {
"CURRIKON_API_KEY": "ck_live_...",
"CURRIKON_API_BASE_URL": "https://staging-api.currikon.org"
}
}Tools
get_status— dataset counts, jurisdictions, subjectssearch_competencies— explore: full-text search with facet counts (jurisdiction, school type, grade band, subject), matched terms and folded school-type variants; base-form words, all-words hits first;grade/schoolTypefilters;format: concise|detailedsearch_topics— explore the content vocabulary: full-text search over topics (Themen/Inhalte) such asPlasmolyseorZahlenraum bis 100, each hit carrying the competency codes it teaches. Complementssearch_competencies: 22 % of topic names share no word with any competency sentence of the same slice. Topics exist for 10 of 21 jurisdictions (three quarters Bayern) — elsewhere an empty result is a data gap, not a finding. No facets; filter byjurisdictionandsubjectget_competency— fetch one competency by stable codelist_competencies— filter by jurisdiction, subject, school type, grade; the complete band (limit 100) is the reliable path for one-Land lesson planningget_progression— prerequisites and successors for a competencyfind_equivalents— cross-jurisdiction equivalentslist_frameworks— curriculum frameworks; one per source document, so a school type can list several (Sek I vs. gymnasiale Oberstufe)align_competencies— align free text to matching competenciesalign_batch— many texts × one Land → candidates per cell with a coverage report (2 credits per cell; call withdryRun: truefirst, it is free). PrefergradeoverschoolType; jurisdiction aliases likeNRWare accepted. Text-identical hits from other school types of the same Land are folded into the best match asvariants(the limit counts distinct texts), and coverage reportssharedTextWithper framework so an agent can tell wortgleiche plans (NRW Sek I) from genuinely different ones. One Land/school type/subject can carry more than one framework (NRW Gymnasium Deutsch has a Sek-I and a gymnasiale-Oberstufe Kernlehrplan): each coverage framework may carry astage(sek1|gost|wp), and everysharedTextWithentry names its counterpart byframeworkId.
Changelog
0.2.6
- Ganze Sätze statt Fragmente. Kompetenzen tragen jetzt ein optionales Feld
sentence: der wörtliche Vorspann des Lehrplans („Die Schülerinnen und Schüler können …") plus der verbatim Quelltext, mit Punkt.textbleibt die unveränderte Quellzeile. Alle Textzeilen der Werkzeuge (search_competencies,get_competency,get_progression,find_equivalents,align_competencies,align_batch) zeigensentence, wenn es da ist, sonsttext;structuredContentträgttextverbatim und zusätzlichsentence. Der Stamm ist nie erfunden: er wird als Zeile im eingefrorenen Quell-PDF nachgewiesen und nur dann vererbt, wenn der Satz grammatisch trägt (Server-PR #778, #779). Abdeckung: erster Schnitt Mecklenburg-Vorpommern (2.535 Sätze) und Bremen (5.439); weitere Länder folgen je Land. Ein Record ohne Stamm hat keinsentence. Reihenfolge: Server ist ausgeliefert, dann dieses Paket — ein 0.2.5-Client gegen den neuen Server läuft weiter, zeigt aber Fragmente.
0.2.5
search_topics— die Themen (Inhalte) der Lehrpläne sind jetzt auch über MCP erreichbar, nicht nur über/v1/topicsund/v1/search?type=topic. Ein Treffer nennt Name, Einordnung und die Kompetenzcodes, die das Thema unterrichtet. Warum ein eigenes Werkzeug statt eines Schalters ansearch_competencies: 22 % der Themennamen teilen kein Inhaltswort mit den Kompetenzsätzen desselben Schnitts (gemessen über alle 46.280 Themen, 2026-09-16) — „Plasmolyse" findet die Kompetenzsuche nie. Themen tragen außerdem keine Facetten und keine Varianten. Abdeckung: 10 von 21 Jurisdiktionen, drei Viertel davon Bayern. Das Werkzeug sagt es in seiner Beschreibung und bei jeder Fehlanzeige, damit eine Datenlücke nicht als Befund gelesen wird. Kosten: 2 Credits wiesearch_competencies— dieselbe Route, dieselbe Abrechnung, dieselbe Länderberechtigung. Reihenfolge: wie üblich erst den Server ausliefern, dann veröffentlichen. Ein kaputtes Fenster gäbe es hier zwar in keiner Richtung —type=topicbeantwortet die Route seit Langem, und das Ausgabeschema schließt kein Objekt —, aber die Regel bleibt.queryverlangt jetzt zwei Zeichen, insearch_topicswie insearch_competencies./v1/searchverlangt sie seit jeher (qmin. 2); die Werkzeuge nahmen ein Zeichen an und ließen den Aufruf erst serverseitig mit 400 scheitern. Jetzt sagt es das Werkzeug selbst, bevor ein Credit fließt.
0.2.4
- Release order for this version is inverted: publish 0.2.4 to npm FIRST,
then deploy the server. The usual rule is deploy-then-publish, but here the
server adds a field (
frameworkId) to an object that the already-published 0.2.3 declares as a closed schema, and the client validatesstructuredContentagainst that schema with Ajv — so every 0.2.3 install hard-failsalign_batchfrom the moment the new server answers. 0.2.4 works against both the old and the new server, so shipping it first leaves no broken window. sharedTextWithentries carry aframeworkId. A jurisdiction/school type/subject triple can have more than one framework (NRW Gymnasium Deutsch: Sek I 2019 and gymnasiale Oberstufe 2022), so naming the counterpart by school type alone was ambiguous. This release is required against the currentapi.currikon.org: 0.2.3 derives a closed output schema and hard-failsalign_batchon the new field.- Coverage frameworks may carry a
stage(sek1|gost|wp), rendered in the framework listings. It is descriptive title material, not a filter — not every framework whose source names a stage carries one. - No object in the
align_batchandsearch_competenciesoutput schemas is closed any more, the envelopes included. A new field on the server can no longer break an already-published client.
Local Development
npm install
npm --prefix packages/mcp run build
CURRIKON_API_KEY=ck_live_... npm --prefix packages/mcp run dev