WLO MCP Server
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., "@WLO MCP ServerFinde Materialien zum Thema Bruchrechnen"
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.
WLO MCP Server
WLO MCP ist ein Model Context Protocol Server für WirLernenOnline.de (WLO) – die deutsche OER-Plattform für freie Bildungsmaterialien.
Kompatibel mit OpenAI (Responses API + native MCP), Anthropic Claude und allen anderen MCP-fähigen Clients.
Inhaltsverzeichnis
Related MCP server: mcp-openalex
Was ist neu in v2
v2.1 — Performance & kombinierte Suche (2026-06)
search_wlo_all— neues Tool: Einzel-Inhalte + Sammlungen + Themenseiten in EINEM parallelen Aufruf, mit getrennten Töpfen (content/collections/topicPages). Spart dem Client mehrere separate Such-Aufrufe (= weniger Round-Trips / Cold-Starts).Kuratierter
propertyFilter— Such-/Bulk-Fetches fordern nur die ~24 real genutzten Felder statt-all-(~59) → deutlich kleinere Payloads._DISPLAYNAME-Labels bleiben erhalten;get_node_detailsbleibt bewusst auf-all-.Einheitliches Reranking —
rerankNodesgreift jetzt auch für Sammlungen und Themenseiten (zuvor nur Inhalte): Exakt-Treffer rücken nach oben, off-topic raus. Sicher — nur Umsortierung + Entfernen gelöschter Knoten, kein Score-Drop.Such-Varianten gedeckelt — Query-Expansion auf max. 5 parallele
ngsearch-Calls (Einzelterm-Varianten entfernt).WLO_POOL_SIZE(Env, Default 25, vorher fix 40) — Kandidaten-Pool je Such-Variante.Details, Einstellungen + Messungen: siehe
PERFORMANCE.md.
Hinzugekommen
get_subject_portals— listet die Fachportale (Top-Level-Sammlungen unter dem WLO-Wurzelknoten) deterministisch alphabetisch.browse_collection_tree— strukturierter Drilldown in Sub-Sammlungen (Tiefe 1 oder 2), optional mit File-Counts.wlo_health_check— Probe gegen die WLO-API, gibt Latenz + Status zurück.get_nodes_details— Bulk-Metadata für mehrerenodeIdsparallel.outputFormat: "json"für alle Such- und Detail-Tools — strukturierte Daten statt Markdown-Parsing.excludeNodeIds: string[]für die drei Such-Tools — bereits gesehene IDs aus Folge-Calls ausblenden.License- und TargetGroup-Vocabularies in
lookup_wlo_vocabulary(vocabulary: "license"/"targetGroup").
Verbessert
search_wlo_topic_pages:Mode C (Liste-aller) zeigt jetzt die Sammlungsnamen als Titel statt kryptischer
PAGE_VARIANT_TEMPLATE_xxx-Slugs (Auto-Resolve viagetNodeParents).Mehrere Varianten derselben Sammlung werden per
mergeVariants=true(Default) zu einer Karte zusammengefasst.targetGroupLabelliefert lesbare Labels ("Lehrkräfte"/"Lernende"/"Allgemein") statt Slugs /ccrep://-URIs.sort: "alpha" | "relevance"mit deterministischem Tie-Breaker aufnodeId.
get_node_details:Output-Felder sind jetzt identisch zu
formatNode()der Such-Tools —disciplines,educationalContexts,userRoles,learningResourceTypes,licenseals menschenlesbare Labels ("Mathematik","CC BY-SA 4.0") statt URIs.Optional
includeRaw: truezeigt zusätzlich die unaufgelösten URIs für Debugging / Spezialfälle.
Lizenz-Mapping: Roh-Keys wie
CC_BY_SAwerden überall zu"CC BY-SA 4.0"aufgelöst.Reranker (
reranker.ts): deterministischer Tie-Breaker aufnodeIdbei gleichem Score; neuesortByTitle()für stabile alphabetische Sortierung.
Entfernt (Breaking Changes)
get_wirlernenonline_info,get_edu_sharing_network_info,get_edu_sharing_product_info,get_metaventis_info— die Webseiten-Crawler-Tools sind weg. Diese Aufgabe übernimmt jetzt das Konsumenten-eigene RAG (z.B. das BadBoerdi-RAG).Damit auch
WEB_CONTENT_WHITELISTundfetchWebContent()auswlo-api.tsentfernt.environment-Parameter aus allen Tool-Schemas entfernt. Die Repository-Auswahl läuft jetzt ausschließlich über die Env-VariableWLO_REPOSITORY_URL(siehe „Umgebungsvariablen"). Pro Server-Instanz wird genau eine Edu-Sharing-Welt adressiert; Konsumenten zeigen ihren MCP-Client auf die jeweilige URL.WLO_ENVist weg — ersetzt durchWLO_REPOSITORY_URL.WLO_ROOT_COLLECTION_IDS(Record) wurde zuWLO_ROOT_COLLECTION_ID(eine Konstante, optional per Env überschreibbar).
Backward-Kompatibilität für MCP-Clients: Tool-Inputs werden mit Zod's Default-Mode (
.strip) validiert — schickt ein alter Client denenvironment-Key trotzdem mit, wird er silent ignoriert, ohne Crash. Der Server antwortet aber immer mit den Daten der konfigurierten Repository-URL. Wer aktiv Staging-Daten wollte, muss seinen MCP-Client auf den Staging-Deployment-Endpoint umstellen (z.B.https://wlo-mcp-server-staging.vercel.app/mcp).
Installation
Voraussetzungen
Node.js ≥ 18.x
npm ≥ 9.x
Lokale Installation
git clone https://github.com/yourorg/wlomcp.git
cd wlomcp
npm install
npm run buildUmgebungsvariablen
cp .env.example .envVariable | Werte | Standard | Beschreibung |
| URL des Edu-Sharing-Frontend-Hosts (z.B. | WLO-Production | Edu-Sharing-Instanz, gegen die der Server arbeitet. Pfade sind in allen Instanzen identisch ( |
| UUID |
| Wurzelknoten der Sammlungs-Hierarchie. Identisch auf WLO-Production und -Staging. Override nur nötig, wenn ein eigenständiges Repository mit anderem Root läuft. |
| Zahl |
| HTTP-Port (nur HTTP-Modus) |
| Zahl |
| Kandidaten-Pool je Such-Variante ( |
Ein Server = ein Repository. Der MCP zeigt pro Prozess auf genau eine Edu-Sharing-Instanz. Wer parallel beide Welten anbieten will, deployt zwei Instanzen (z.B. zwei Vercel-Projekte mit unterschiedlichem
WLO_REPOSITORY_URL).
Server starten
node dist/http.js # HTTP-Modus → http://localhost:3000/mcp
node dist/stdio.js # stdio (Claude Desktop, lokale Clients)
npm run dev # stdio mit Auto-Reload
npm run dev:http # HTTP mit Auto-ReloadTools im Überblick
# | Tool | Zweck | Output-Formate |
1 |
| Sammlungen suchen (Volltext + Tree-Fallback) | markdown / json |
2 |
| Globale Volltextsuche nach Bildungsinhalten | markdown / json |
3 |
| Inhalte/Sub-Sammlungen einer Sammlung (paginierbar) | markdown / json |
4 |
| Detail-Metadaten + optional Volltext + Eltern | markdown / json |
5 |
| Vokabular-Werte: Bildungsstufe, Fach, Zielgruppe, LRT, Lizenzen, TargetGroup | markdown |
6 |
| Themenseiten finden / listen, Varianten zusammenfassen | markdown / json |
7 |
| Fachportale (Top-Level-Sammlungen unter WLO-Root) | markdown / json |
8 |
| Drilldown in Sub-Sammlungen (Tiefe 1–2), optional mit File-Counts | markdown / json |
9 |
| Status + Latenz der WLO-API | json |
10 |
| Bulk-Metadata für mehrere | json |
11 |
| Kombiniert: Inhalte + Sammlungen + Themenseiten in EINEM parallelen Aufruf, getrennte Töpfe | json / markdown |
Konzept: In WLO sind Sammlungen und Themenseiten dasselbe. Eine Sammlung wird im Repository als Themenseite angezeigt und bündelt Inhalte in Schwimmlinien (Swimlanes/Karussells). Sub-Sammlungen entsprechen Unter-Themenseiten. Sammlungen mit
ccm:page_config_refhaben eine kuratierte Themenseite mit zielgruppenspezifischen Varianten (Lehrkräfte / Lernende / Allgemein).
Tool-Routing-Heuristik (für LLMs):
User fragt breit nach einem Thema und will Inhalte + Sammlungen + Themenseiten gemeinsam →
search_wlo_all(ein Aufruf, getrennte Töpfe)User fragt nach Material/Inhaltstyp (Video, Arbeitsblatt, …) →
search_wlo_contentUser fragt nach Themenseite/Sammlung zu einem Thema →
search_wlo_topic_pages(Mode B mit query)User will durch ein Fach navigieren (Drilldown) → erst
get_subject_portals, dannbrowse_collection_treeUser klickt eine Karte →
get_node_detailsmit dieser nodeIdBot zeigt 10 Karten und braucht Metadaten zu allen →
get_nodes_details(nodeIds=[...])(1 Aufruf statt 10)
Tools – Detail & API-Endpunkte
1. search_wlo_collections
Sucht thematische Sammlungen. Drei-stufige Strategie: Volltext-API → Baum-Traversierung Level 2 (≤25 Parents) → Level 3 (≤15 Parents). Treffer werden bei vorhandenem query nach Relevanz gerankt (rerankNodes), bevor maxResults greift — bringt Exakt-Treffer nach oben.
Parameter | Typ | Default | Beschreibung |
| string |
| Suchbegriff. Leer = Top-Level-Sammlungen unter Root oder |
| string | – | nodeId einer Eltern-Sammlung für Sub-Tree-Suche |
| string | – | Bildungsstufe (Label oder URI) |
| string | – | Fach (Label oder URI) |
| string | – | Zielgruppe (Label oder URI) |
| int |
| 1–20 |
| string[] | – | Diese IDs in der Antwort überspringen |
| enum |
|
|
API-Endpunkte:
POST /search/v1/queries/-home-/mds_oeh/collections?contentType=COLLECTIONS (Volltext)
GET /node/v1/nodes/-home-/{nodeId}/children?filter=folders (Tree)2. search_wlo_content
Globale Volltextsuche nach Bildungsmaterialien (Files). Mit Multi-Query-Expansion + RRF (clientseitig, ohne Transformer-Modell — Vercel-tauglich).
Parameter | Typ | Default | Beschreibung |
| string | Pflicht | Suchbegriff |
| string | – | Bildungsstufe |
| string | – | Fach |
| string | – | Zielgruppe |
| string | – | Ressourcentyp (Arbeitsblatt, Video, …) |
| string | – | Anbieter-Filter (Klexikon, Serlo, ZUM, …) |
| int |
| 1–20 |
| string[] | – | IDs überspringen |
| enum |
|
|
Reranking-Pipeline:
Query Expansion: Volltext, Title-Match, Keyword-Hits, Synonym-Map — gedeckelt auf max. 5 Varianten (nach Gewicht,
full:immer dabei)Parallele API-Calls (
WLO_POOL_SIZETreffer / Variante, Default 25)RRF (Reciprocal Rank Fusion) mit Variant-Gewichtung
Quality Score (Titel: 30 Pt., Keywords: 10 Pt., Beschreibung: 8 Pt., Metadaten-Qualität)
Endformel:
0.8 × quality + 0.1 × rrf + 0.1 × multi_appearance_bonusTie-Breaker:
nodeId.localeCompare()für deterministische Reihenfolge bei gleichen Scores
3. get_collection_contents
Inhalte einer Sammlung. Unterstützt Pagination via skipCount und Filter.
Parameter | Typ | Default | Beschreibung |
| string | Pflicht | nodeId der Sammlung |
| string | – | Optional zum Reranking |
| enum |
|
|
| bool |
| Rekursive BFS-Traversierung (nur bei |
| int |
| 1–100 |
| int |
| Pagination-Offset |
| string[] | – | IDs überspringen |
| enum |
|
|
Tipp: Statt
contentFilter="folders"istbrowse_collection_tree(Tool 8) klarer und liefert direkt File-Counts.
4. get_node_details
Detail-Metadaten zu einem einzelnen Node (Content oder Sammlung).
Parameter | Typ | Default | Beschreibung |
| string | Pflicht | – |
| bool |
| Gespeicherten Volltext (gecrawlt) abrufen, max. 4000 Zeichen |
| bool |
| Eltern-Sammlungen mitliefern |
| bool |
| Zusätzlich die rohen URI-Werte (vor Label-Resolution) |
| enum |
|
|
Output-Konsistenz: Im JSON-Modus liefert get_node_details dieselben Felder wie ein Eintrag aus search_wlo_* (Output-Format formatNode()):
{
"nodeId": "bd8be6d5-…",
"title": "Mathematik",
"description": "…",
"keywords": ["…"],
"disciplines": ["Mathematik"],
"educationalContexts": ["Sekundarstufe i", "Hochschule"],
"userRoles": [],
"learningResourceTypes": [],
"license": "CC BY-SA 4.0",
"publisher": "ZUM",
"url": "https://…",
"previewUrl": "https://…",
"topicPageUrl": "https://…/topic-pages?collectionId=…",
"renderUrl": "https://…/components/render/…",
"nodeType": "collection",
"parents": [{"nodeId": "…", "title": "…"}], // wenn includeParents
"textContent": "…", // wenn includeTextContent
"raw": { … } // wenn includeRaw
}5. lookup_wlo_vocabulary
Listet Vokabular-Werte. Quelle: lokale src/vocabs.ts (keine API-Calls).
Parameter | Werte |
|
|
6. search_wlo_topic_pages
Themenseiten finden, listen oder eine spezifische Sammlung prüfen.
Parameter | Typ | Default | Beschreibung |
| string |
| Thematische Suche (Mode B) |
| enum | – |
|
| string | – | Bildungsstufe |
| string | – | Direkt-Check einer Sammlung (Mode A) |
| bool |
| Mehrere Varianten derselben Sammlung in eine Karte zusammenfassen |
| enum | Query→ |
|
| int |
| 1–20 |
| enum |
|
|
Drei Suchmodi:
Mode A — Direkt-Check (
collectionIdgesetzt): prüftccm:page_config_refder Sammlung, traversiert Config-Kinder → VariantenMode B — Thematische Suche (
querygesetzt): Sucht Sammlungen per Keyword, filtert aufpage_config_refMode C — Alle auflisten (kein
query, keincollectionId): Nutzt diepage_variant-API. Variant-Owner-Sammlung wird übergetNodeParents-Walk aufgelöst → echter Sammlungsname stattPAGE_VARIANT_TEMPLATE_xxx
JSON-Output (Beispiel):
{
"total": 1,
"results": [{
"title": "Physik",
"collectionId": "94f22c9b-…",
"topicPageUrl": "https://…/topic-pages?collectionId=…",
"educationalContexts": ["Sekundarstufe I", "Sekundarstufe II"],
"variants": [
{"variantId": "…", "targetGroup": "teacher", "targetGroupLabel": "Lehrkräfte", "topicPageUrl": "…"},
{"variantId": "…", "targetGroup": "learner", "targetGroupLabel": "Lernende", "topicPageUrl": "…"}
]
}]
}7. get_subject_portals
Liefert die WLO-Fachportale — die direkten Sub-Sammlungen unter dem Wurzel-Knoten.
Parameter | Typ | Default | Beschreibung |
| string | – | Filter (Default: alle) |
| bool |
| Zusätzlich |
| enum |
|
|
Output ist deterministisch alphabetisch (Tie-Breaker nodeId). Ideal als Einstiegspunkt für geführte Drilldowns.
API:
GET /node/v1/nodes/-home-/{ROOT_ID}/children?filter=folders8. browse_collection_tree
Drilldown unter eine bestimmte Sammlung — Tiefe 1 (direkte Kinder) oder 2 (Enkel-Knoten).
Parameter | Typ | Default | Beschreibung |
| string | Pflicht | Eltern-Sammlung |
| int |
|
|
| bool |
| Pro Sammlung den File-Count mitholen |
| int |
| 1–100 |
| enum |
|
|
Achtung Latenz:
depth=2+includeContentCounts=truemachtO(parents × children + parents)API-Calls. Bei breiten Bäumen entsprechend lang.
9. wlo_health_check
Probe gegen die WLO-API. Nimmt keine Parameter — testet die durch WLO_REPOSITORY_URL konfigurierte Instanz.
Output (JSON):
{
"ok": true,
"repositoryUrl": "https://redaktion.openeduhub.net/edu-sharing",
"baseUrl": "https://redaktion.openeduhub.net/edu-sharing/rest",
"rootNodeId": "5e40e372-735c-…",
"rootResolved": "Portale",
"latencyMs": 392,
"checkedAt": "2026-04-27T16:28:04.108Z"
}Bei Fehler: ok: false, error: "<message>", isError: true im MCP-Result. Nützlich für Konsumenten, um "WLO ist down" von "deine Query liefert keine Treffer" zu unterscheiden.
10. get_nodes_details
Bulk-Fetch für mehrere nodeIds (max. 50 / Aufruf, parallel).
Parameter | Typ | Default |
| string[] | Pflicht |
Output:
{
"requested": 3,
"resolved": 2,
"failed": ["00000000-0000-0000-0000-000000000000"],
"results": {
"bd8be6d5-…": { "title": "Mathematik", "disciplines": ["Mathematik"], … },
"742d8c87-…": { "title": "Informatik", "disciplines": ["Informatik"], … }
}
}Einzelne Fehler (gelöschte Node, Netzwerk-Fehler) landen im failed[] — der Batch crasht nicht.
11. search_wlo_all
Kombinierte Suche: liefert Einzel-Inhalte + Sammlungen + Themenseiten in EINEM Aufruf, intern parallel (Promise.all). Spart dem Client mehrere separate Such-Aufrufe. Themenseiten = Sammlungen mit ccm:page_config_ref → eine Sammlungssuche bedient beide Töpfe (kein separater Durchlauf). Nutzt bewusst den schnellen Keyword-Pfad für Sammlungen (nicht den Baum-Fallback) → niedrige Concurrency.
Parameter | Typ | Default | Beschreibung |
| string | Pflicht | Suchbegriff |
| string | – | Bildungsstufe (Label oder URI) |
| string | – | Fach (Label oder URI) |
| string | – | Zielgruppe (Label oder URI) |
| string | – | Ressourcentyp (Label oder URI) |
| string | – | Anbieter-Filter |
| int |
| Max. Einzel-Inhalte (1–50) |
| int |
| Max. je Sammlungen / Themenseiten (1–20) |
| string[] | alle | Teilmenge aus |
| string[] | – | Bereits gesehene IDs überspringen |
| enum |
|
|
JSON-Output (Envelope mit getrennten Töpfen):
{
"query": "Photosynthese",
"content": { "total": 209, "count": 8, "results": [ /* FormattedNode[] */ ] },
"collections": { "total": 6, "count": 5, "results": [ /* … */ ] },
"topicPages": { "total": 1, "count": 1, "results": [ /* Sammlungen mit topicPageUrl */ ] }
}Jeder Topf trägt zusätzlich ein _queryMeta (Such-URL für den jeweiligen Topf). Alle drei Listen sind reranked (Relevanz). Der Client kann die Töpfe direkt in getrennte Anzeige-Bereiche einsortieren.
Filter-Parameter & Vokabular
Alle Vocab-Filter akzeptieren deutsche Labels, englische Synonyme oder vollständige URIs:
Parameter | Beispielwerte | Vocabulary-Key |
|
|
|
|
|
|
|
|
|
|
|
|
Vocab-Resolution: zwei asymmetrische Pfade
Der Server unterscheidet bewusst zwischen Anzeige (URI → Label) und Filter-Eingabe (Label → URI):
Anzeige-Pfad (URI → Label) — vollständige Abdeckung über _DISPLAYNAME
Beim Aufbau eines FormattedNode (alle Such-/Detail-Tools) werden Vocab-Felder so resolvt:
Bevorzugt: server-seitiges
<property>_DISPLAYNAME, das edu-sharing für jeden indexierten Knoten direkt mitliefert.Funktioniert für
ccm:taxonid,ccm:educationalcontext,ccm:oeh_lrt_aggregated,ccm:oeh_intended_end_user_role.Deckt automatisch beide Disziplin-Vokabulare ab: das Schulfächer-Vocab UND die Hochschulfächersystematik, ohne dass wir die ~100 Hochschul-Klassen lokal pflegen müssen.
Beispiel: ein Hochschul-Knoten mit
taxonid=[".../hochschulfaechersystematik/n71", ".../n8"]zeigtdisciplines: ["Studienbereich Informatik", "Ingenieurwissenschaften"].
Fallback: lokales
labelFromUri-Lookup (vocabs.ts).Greift, wenn
_DISPLAYNAMEleer ist (z.B.ccm:commonlicense_keyhat nie ein DISPLAYNAME — daher die lokale License-Map).
Letzter Fallback: rohe URI — damit der Konsument zumindest etwas zurückbekommt.
Rauschfilter: Vokabular-Root-URIs (z.B. nur .../discipline/ ohne konkretes Fach-Slug) werden ausgefiltert — sonst würde DISPLAYNAME den Vokabular-Titel ("Schulfächer", "Destatis-Systematik der Fächergruppen, Studienbereiche und Studienfächer") als Disziplin anzeigen.
Filter-Eingabe-Pfad (Label → URI) — bewusst konservativ
resolveVocab (vocabs.ts) deckt nur die Schulfächer-Liste ab. Begründung:
Das Hochschul-Vocab und das Schul-Vocab teilen sich Labels:
"Mathematik"existiert in beiden, mit unterschiedlicher Semantik (Schul-Mathematik =discipline/380; Hochschul-n4= "Mathematik, Naturwissenschaften" — viel breiter).Wer User-Input automatisch auch ins Hochschul-Vocab mappt, riskiert ungewollte Filter (z.B. wird auch Physik/Chemie/Bio mit-gefiltert).
Mehrheit der WLO-Inhalte ist schulisch.
Wer gezielt Hochschul-Inhalte will, kann orthogonal über
educationalContext: "Hochschule"filtern.
Resolver-Schritte für Label-Eingabe:
URI? → durchreichen
Direkt-Match auf Label / Alias (case-insensitive)
Substring-Match (Label im Input ODER Input im Label) — fängt Tippfehler/Paraphrasen wie
"Naturwiss"(matcht"naturwissenschaften")Kein Match → null (Caller kann den Wert trotzdem an die WLO-API durchgeben)
Empfehlung für Konsumenten (LLM-gestützte Apps):
Bei freier Nutzereingabe ("sciences", "Mathe Klasse 11 Gym") zuerst per LLM auf einen lookup_wlo_vocabulary-Eintrag mappen, dann den canonical Label / URI an die Such-Tools übergeben. So fängst du Paraphrasen ab, die Substring-Matching nicht mehr trifft.
Alle Werte mit URIs: lookup_wlo_vocabulary({ vocabulary: "discipline" }).
Offizielle Vocab-Quellen
Wer das lokale Vocab in src/vocabs.ts aktualisieren oder Aliases ergänzen will:
Vocab | URL |
Schulfächer ( | https://vocabs.openeduhub.de/w3id.org/openeduhub/vocabs/discipline/index.json |
Bildungsstufe ( | https://vocabs.openeduhub.de/w3id.org/openeduhub/vocabs/educationalContext/index.json |
Zielgruppe ( | https://vocabs.openeduhub.de/w3id.org/openeduhub/vocabs/intendedEndUserRole/index.json |
Lernressourcentypen (aggregiert) ( | https://vocabs.openeduhub.de/w3id.org/openeduhub/vocabs/new_lrt_aggregated/index.json |
Hochschulfächersystematik (NICHT lokal gepflegt) | https://vocabs.openeduhub.de/w3id.org/openeduhub/vocabs/hochschulfaechersystematik/index.json |
Anzeige-Resolution für Hochschul-URIs erfolgt automatisch über _DISPLAYNAME aus dem edu-sharing-Index — ein lokales Hochschul-Vocab ist daher nicht nötig.
Output-Formate (markdown vs. json)
Alle Tools mit Suchergebnissen unterstützen outputFormat:
outputFormat: "markdown" (Default)
Menschenlesbare Karten, gut für Chat-Bots, die das LLM die Cards selbst rendern lassen. Beispiel:
## Bruchrechnung Einführung
nodeId: dc6b3f33-…
Beschreibung: …
Fach: Mathematik
Bildungsstufe: Sekundarstufe i
Lizenz: CC BY-SA 4.0
URL: https://…
Vorschaubild: https://…
Themenseite: https://…
Typ: InhaltoutputFormat: "json"
Strukturierter JSON-String, optimal für Konsumenten, die Daten programmatisch weiterverarbeiten:
{
"total": 287,
"count": 5,
"results": [
{
"nodeId": "dc6b3f33-…",
"title": "Bruchrechnung Einführung",
"description": "…",
"keywords": ["Bruch", "Mathematik"],
"disciplines": ["Mathematik"],
"educationalContexts": ["Sekundarstufe i"],
"userRoles": [],
"learningResourceTypes": ["Video"],
"license": "CC BY-SA 4.0",
"publisher": "Mathe by Daniel Jung",
"url": "https://…",
"previewUrl": "https://…",
"topicPageUrl": "",
"nodeType": "content"
}
]
}Wichtig:
disciplines,educationalContexts,userRoles,learningResourceTypes,licensesind immer Labels, nie URIs. Konsumenten könnencard.disciplines[0]direkt anzeigen.
Determinismus & Stabilität
Was du erwarten kannst:
Bei identischer Input + identischem WLO-Server-Pool liefern alle Tools deterministische Reihenfolge:
Tie-Breaker
nodeId.localeCompare()in allen RankingssortByTitle()mit Tie-Breaker für alphabetische Sortierungenget_subject_portals,browse_collection_tree,search_wlo_topic_pages(sort=alpha) sind vollständig deterministisch.
Mode C von
search_wlo_topic_pagesist deterministisch (alphabetisch über Sammlungsnamen).
Was außerhalb unserer Kontrolle liegt:
Die WLO-API kann bei sehr ähnlichen Score-Treffern in seltenen Fällen einen anderen Pool liefern (Solr-Cache-Reshuffles serverseitig). Das beeinflusst
search_wlo_content/ Mode B vonsearch_wlo_topic_pages. Mitsort: "alpha"umgehst du das.
Deployment
Option A: Vercel (empfohlen)
Da die Web-Crawler-Tools entfernt sind, läuft v2 ohne Einschränkung auf Vercel Hobby (
maxDuration: 10sreicht). Dievercel.jsonsetzt trotzdemmaxDuration: 30als Sicherheitspolster fürbrowse_collection_tree(depth=2, includeContentCounts=true)bei breiten Bäumen.
Production-Deploy
Repo auf GitHub pushen
Vercel → New Project → Repo importieren
Environment Variable (optional, Default greift):
WLO_REPOSITORY_URL=https://redaktion.openeduhub.net/edu-sharingDeploy → MCP-Endpoint:
https://dein-projekt.vercel.app/mcp
Staging-Deploy (zweite Instanz)
Um parallel zur Production-Instanz eine Staging-Instanz zu betreiben, ein zweites Vercel-Projekt aus demselben Repo anlegen:
Vercel → New Project → gleiches Repo, anderer Project Name (z.B.
wlo-mcp-server-staging)Settings → Environment Variables →
WLO_REPOSITORY_URL=https://repository.staging.openeduhub.net/edu-sharingsetzen (überschreibt den Default ausvercel.json)Deploy → MCP-Endpoint:
https://wlo-mcp-server-staging.vercel.app/mcp
Konsumenten zeigen dann ihren MCP-Client je nach Welt auf die passende URL — kein Code-Switch im Konsumenten nötig.
Option B: Docker
docker build -t wlomcp .
# Production
docker run -p 3000:3000 wlomcp # nutzt Default
docker run -p 3000:3000 -e WLO_REPOSITORY_URL=https://redaktion.openeduhub.net/edu-sharing wlomcp
# Staging
docker run -p 3000:3000 -e WLO_REPOSITORY_URL=https://repository.staging.openeduhub.net/edu-sharing wlomcp
# → http://localhost:3000/mcpOption C: Lokal
npm install
npm run build
# Production (Default)
node dist/http.js
# Staging
WLO_REPOSITORY_URL=https://repository.staging.openeduhub.net/edu-sharing node dist/http.js
# → http://localhost:3000/mcpKonfiguration in AI-Clients
OpenAI (Responses API)
response = client.responses.create(
model="gpt-5",
tools=[{
"type": "mcp",
"server_label": "wlo",
"server_url": "https://dein-projekt.vercel.app/mcp",
"require_approval": "never",
}],
input="Finde Unterrichtsmaterialien zu Bruchrechnung für die Grundschule",
)Anthropic (Claude)
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-opus-4-5",
max_tokens=4096,
mcp_servers=[{"type": "url", "url": "https://dein-projekt.vercel.app/mcp", "name": "wlo"}],
messages=[{"role": "user", "content": "Suche WLO-Sammlungen zum Thema Klimawandel"}],
betas=["mcp-client-2025-04-04"],
)Claude Desktop
{
"mcpServers": {
"wlo": {
"command": "node",
"args": ["/pfad/zu/wlomcp/dist/stdio.js"],
"env": { "WLO_REPOSITORY_URL": "https://redaktion.openeduhub.net/edu-sharing" }
}
}
}Für eine Staging-Verbindung den Wert auf
https://repository.staging.openeduhub.net/edu-sharingändern (oder ein zweites Server-Profil hinzufügen).
Architektur
wlomcp/
├── src/
│ ├── server.ts # 11 Tool-Definitionen (transport-agnostisch)
│ ├── vocabs.ts # Label ↔ URI Mappings (educationalContext, discipline,
│ │ # userRole, lrt, license, targetGroup)
│ ├── wlo-api.ts # WLO/EduSharing-API-Client + resolveVariantCollection
│ ├── reranker.ts # Multi-Query-Expansion + RRF + Quality-Score (pure JS)
│ ├── formatter.ts # WloNode → FormattedNode → Markdown / JSON
│ ├── stdio.ts # Entry: stdio-Transport
│ └── http.ts # Entry: Streamable HTTP
├── api/
│ └── mcp.ts # Vercel-Serverless-Function-Wrapper
├── vercel.json # Vercel-Config
├── Dockerfile
└── .env.exampleFormattedNode-Schema (das gemeinsame Output-Format aller Tools):
{
nodeId: string;
title: string;
description: string;
keywords: string[];
disciplines: string[]; // Labels: ["Mathematik"]
educationalContexts: string[]; // Labels: ["Sekundarstufe i"]
userRoles: string[]; // Labels: ["Lehrer/in"]
learningResourceTypes: string[]; // Labels: ["Arbeitsblatt"]
url: string;
previewUrl: string;
license: string; // Label: "CC BY-SA 4.0"
publisher: string;
nodeType: 'collection' | 'content';
topicPageUrl: string; // wenn ccm:page_config_ref vorhanden
}API-Basis-URLs:
Die REST-API liegt unter <WLO_REPOSITORY_URL>/rest/..., das Frontend (Render- und Themenseiten-Links) unter <WLO_REPOSITORY_URL>/components/.... Die Pfade sind in allen Edu-Sharing-Instanzen identisch — der einzige Unterschied zwischen Welten ist die konfigurierte Repository-URL.
Welt |
| Beispiel-Endpunkt (REST) |
Production |
|
|
Staging |
|
|
Custom | beliebige Edu-Sharing-Instanz |
|
Migration v1 → v2
Wenn du heute v1 nutzt
v1-Verhalten | v2-Verhalten |
|
|
|
|
|
|
|
|
Mehrere Varianten = N separate Karten | 1 Karte mit |
Gleicher Score → unspezifizierte Reihenfolge | Tie-Breaker |
| Entfernt. Konsument soll RAG/eigene Page-Extraction nutzen |
Empfohlene Migration
Sofort ausführen:
wlo_health_checkeinmalig nach Deploy, Latenz prüfen, Server-Status verifizierenJSON-Output progressiv aktivieren: Beginne mit
get_node_detailsundsearch_wlo_topic_pages— die hatten in v1 die meisten Inkonsistenzen. Vorher: Markdown-Parsing → Nachher:JSON.parse()Webseiten-Tool-Aufrufe entfernen: Wenn dein Client
get_wirlernenonline_infoetc. nutzt → entweder ein eigenes RAG aufsetzen oder das Tool aus dem Allowlist deines AI-Clients nehmenVariant-Merge-Code entfernen: Wenn dein Client mehrere Varianten desselben Themas selbst gemerged hat → das macht der Server jetzt
Discipline-URI-Resolver in Konsumenten: Wer früher Karten-Disciplines manuell auf Labels resolvte, kann diese Logik abklemmen — Server liefert immer Labels
Kompatibilität
Tool-Namen sind ausschließlich Kleinbuchstaben + Unterstriche → kompatibel mit OpenAI / Anthropic
Input-Schemas sind JSON Schema (via Zod) → Standard-konform
Transport: Streamable HTTP (MCP spec 2025-03-26) für Vercel/Docker; stdio für lokale Clients
Stateless: Kein Session-State → skaliert auf Vercel Serverless
Vercel-tauglich: Reranker ist pure JS, kein Transformer-Modell, kein Speicherbedarf > Function-Limit
Available Tools
12 toolsbrowse_collection_treeA
Drill into the sub-collection tree below a given collection.
Returns the direct sub-Sammlungen at depth=1 (default) or two levels at depth=2.
Optionally enriches each node with the count of files (Lernmaterialien) it contains.
Use this for guided exploration: pick a Fachportal or Themenseite, then let the user choose a sub-area before fetching individual content items. Output is deterministic (alphabetical by name, nodeId tie-breaker).
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | 1 = direct sub-collections only (fast); 2 = also include grand-children (more API calls). | |
| nodeId | Yes | Parent collection nodeId. Use a Fachportal nodeId from get_subject_portals as a starting point. | |
| maxResults | No | ||
| outputFormat | No | markdown | |
| includeContentCounts | No | When true, fetch the number of files (Inhalte) inside each sub-collection (extra round-trip per node). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavioral disclosure. It does add valuable details: deterministic ordering (alphabetical by name, nodeId tie-breaker) and the optional enrichment of counts. However, it does not mention whether the operation is read-only, any error conditions, rate limits, or the behavior of maxResults and outputFormat. This is a moderate level of transparency, leaving room for improvement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and concise, with the purpose stated upfront, followed by key behavior and usage guidance. Every sentence earns its place; no filler or repetition. It is appropriately sized for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has five parameters and no output schema, so the description should ideally clarify return structure and edge cases. It explains the depth behavior, ordering, and optional counts, but omits details about output formatting, maxResults limits, and what happens when a collection has no sub-collections. The description is sufficient for basic use but not fully complete for a tool with moderate complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%, meaning the description must compensate for undocumented parameters. Yet the description only repeats what the schema already states for depth and counts, and does not mention maxResults or outputFormat at all. While the nodeId parameter guidance ('pick a Fachportal or Themenseite') is useful, it is also present in the schema. The description adds minimal semantic value beyond the input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Drill into') and resource ('sub-collection tree below a given collection'), clearly distinguishing this from sibling tools like get_collection_contents (which likely fetches items) and get_node_details (which likely gets a single node). It also specifies the return type (direct sub-collections at depth=1 or two levels at depth=2), making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage context: 'Use this for guided exploration: pick a Fachportal or Themenseite, then let the user choose a sub-area before fetching individual content items.' This clearly indicates when to use this tool and implies that a subsequent tool (e.g., get_collection_contents) should be used after. It lacks an explicit 'when not to use' statement but is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_collection_contentsA
Retrieve content items and/or sub-collections from a WLO Sammlung (Themenseite) by its nodeId. In WLO, Sammlungen are displayed as Themenseiten: thematic pages that bundle content in swimlanes. This tool fetches what is inside those swimlanes. The nodeId is returned by search_wlo_collections. Use contentFilter="files" (default) for learning materials, "folders" for sub-collections (Unter-Themenseiten), or "both" for everything. Set includeSubcollections=true to traverse the full sub-tree recursively.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional search/filter query to rerank results within the collection | |
| nodeId | Yes | Collection node ID from search_wlo_collections results | |
| skipCount | No | Number of items to skip for pagination (default 0) | |
| maxResults | No | Maximum number of items to return (1–100, default 20) | |
| outputFormat | No | markdown | |
| contentFilter | No | "files" = Lernmaterialien (default), "folders" = Sub-Sammlungen, "both" = alles | files |
| excludeNodeIds | No | Skip these node IDs in the result | |
| includeSubcollections | No | Wenn true: Sub-Sammlungen rekursiv durchsuchen und alle Inhalte sammeln (nur für contentFilter="files") |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It adds valuable context beyond the schema by explaining the WLO thematic page concept, swimlanes, and the recursive sub-tree traversal behavior. It does not cover potential error cases or permission requirements, but for a read tool with detailed parameter descriptions, the transparency is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph with six sentences, each adding value. It starts with the core purpose and then provides context and parameter guidance. It is not overly verbose, though it could be slightly tightened by moving the nodeId sourcing note earlier. Overall, it is well-structured and easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 8 parameters and no output schema, the description adequately covers the main domain context, parameter variations, and recursive traversal. It does not explain the return structure, but since there is no output schema, that is less critical. Minor gaps include not mentioning the contentFilter='files' restriction for includeSubcollections, though the schema does specify that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has high coverage (88%), but the description adds meaning beyond the schema by explaining contentFilter values in plain language (files = Lernmaterialien, folders = Sub-Sammlungen, both = alles) and describing includeSubcollections as traversing the full sub-tree recursively. This helps clarify the intent and usage of these parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves content items and sub-collections from a WLO Sammlung by nodeId, using the specific verb 'Retrieve' and naming the resource. It also distinguishes itself by explaining that nodeId comes from search_wlo_collections and that contentFilter controls whether files, folders, or both are returned, which differentiates it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (to fetch contents of a Themenseite) and explains the contentFilter options and includeSubcollections behavior. However, it does not explicitly mention alternatives or when not to use it, such as comparing with browse_collection_tree or get_topic_page_content, which leaves some room for ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_node_detailsA
Retrieve detailed metadata, stored full-text content, and/or parent collections for a specific WLO node.
Returns the SAME field structure as search tools (formatNode): title, description, keywords, disciplines (labels), educationalContexts (labels), userRoles (labels), learningResourceTypes (labels), license (label), publisher, url, previewUrl, topicPageUrl, nodeType.
Plus optional:
textContent: the crawled/stored full text of the linked web page or document
parents: the collection(s) this node belongs to (useful to find which Sammlung a content item is in)
raw: the original ccm:* / cclom:* property URIs (for debugging / advanced use)
| Name | Required | Description | Default |
|---|---|---|---|
| nodeId | Yes | Node ID of a content item or collection (from search results) | |
| includeRaw | No | Include raw URI values alongside the resolved labels | |
| outputFormat | No | "markdown" (default, human-readable) or "json" (structured data, easier to parse for callers) | markdown |
| includeParents | No | Also fetch the parent collections this node belongs to | |
| includeTextContent | No | Also fetch the stored full-text content of the node (crawled webpage/PDF text) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. The verb 'Retrieve' clearly indicates a read-only operation, and listing the exact return fields is transparent. Yet it does not disclose potential response size from includeTextContent, error behavior for invalid node IDs, or performance characteristics. These are notable gaps for a tool that can fetch full text.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening sentence, a field list, and bullet points for extras. It is slightly longer than necessary due to the exhaustive list of fields, but that list helps set expectations for output structure. No filler content is present.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description does a strong job explaining return structure and optional parameters. It covers the core functionality thoroughly but omits error-handling details and does not differentiate from the sibling get_nodes_details (plural), which might be relevant for batch use cases. Overall, it is complete enough for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% coverage with descriptions for all parameters. The description adds semantic context by mapping the optional outputs (textContent, parents, raw) to their use cases, such as finding a Sammlung or debugging. This goes beyond the schema's simple parameter descriptions, though it does not fully explain the outputFormat choices beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Retrieve detailed metadata, stored full-text content, and/or parent collections for a specific WLO node.' It clearly distinguishes itself from search tools by noting it returns the 'SAME field structure as search tools' and adds optional fields. This makes the tool's unique role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage after a search: it returns the same structure as search tools but with additional detail for a specific node. It provides a concrete use case for parents ('useful to find which Sammlung a content item is in') and mentions raw is for 'debugging / advanced use'. However, it does not explicitly state when not to use this tool or mention alternatives like get_nodes_details for batch retrieval.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_nodes_detailsA
Bulk-fetch metadata for multiple node IDs in parallel. Saves N round-trips when callers need details for many nodes (e.g. resolve cards from a search). Returns the same FormattedNode shape as get_node_details (json mode), keyed by nodeId.
Failed lookups (deleted node, network error) are returned in the failed array, not as
overall errors — so a single bad nodeId doesn't ruin the whole batch.
| Name | Required | Description | Default |
|---|---|---|---|
| nodeIds | Yes | Array of node IDs to fetch (max 50 per call). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and delivers: it discloses parallel execution, the return shape keyed by nodeId, and the notable failure-handling behavior where failed lookups are returned in a `failed` array rather than causing overall errors. This goes beyond the schema and is crucial for callers to trust batch behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose. Each sentence earns its place: purpose, performance benefit, and failure behavior. No wordiness or redundant restatement of tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This tool has one parameter, no output schema, and no annotations. The description covers the essential operational context: what it returns (same shape as get_node_details, keyed by nodeId), how errors are handled, and the parallelism. It is complete enough for an agent to invoke it correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes nodeIds as an array of strings with min/max items (100% coverage). The description adds only that the call is for 'multiple node IDs' and mentions 'max 50 per call' (already in schema), so it does not meaningfully enrich parameter understanding beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Bulk-fetch metadata for multiple node IDs in parallel,' which precisely states the action (bulk-fetch) and resource (metadata for node IDs). It distinguishes itself from the sibling tool get_node_details by explicitly saying 'Bulk' and referencing the same return shape, making the difference clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-to-use context: 'Saves N round-trips when callers need details for many nodes (e.g. resolve cards from a search).' It also references get_node_details for shape, implying that tool for single-node calls, but does not explicitly state 'use get_node_details for a single node.' This is strong but not fully explicit about alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_subject_portalsA
Lists the WLO Fachportale — the first-level Sammlungen directly under the WLO root collection. Fachportale are the top-level subject hubs (Mathematik, Informatik, Deutsch, …) that anchor the content tree. Each portal has an associated Themenseite when ccm:page_config_ref is set.
Use this when the user wants an overview of what subjects/topics are covered, or as the natural entry point for guided drill-downs ("Zeig mir Mathe" → portal → sub-Sammlungen → Inhalte).
Returns deterministic alphabetical ordering, with portal nodeId, name, description, optional Themenseiten-URL, and the disciplines/educational contexts associated with the portal.
| Name | Required | Description | Default |
|---|---|---|---|
| outputFormat | No | markdown | |
| educationalContext | No | Filter by educational level (e.g. "Sekundarstufe I"). Most portals span multiple levels — the filter only excludes portals where the level is explicitly different. | |
| includeContentCounts | No | When true, also fetch the number of direct sub-collections per portal (extra round-trip). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full transparency burden. It discloses deterministic alphabetical ordering, returned fields (nodeId, name, description, optional Themenseiten-URL, disciplines/educational contexts), and the conditional presence of a Themenseite. It does not mention auth or errors, but for a read-only listing tool this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose. Each sentence adds value: scope, context, usage guidance, and return details. No filler or repetition of schema information that wouldn't add value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description provides enough to understand what the tool returns and when to use it. It covers ordering, fields, and the optional inclusion of content counts indirectly via the schema. It could be more complete by mentioning outputFormat behavior or pagination limits, but these are not critical for this list-style tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%, with two of three params described. The description adds context about the output fields but does not elaborate on the outputFormat parameter beyond the schema enum/default. The educationalContext and includeContentCounts descriptions in the schema cover their semantics; the tool description does not add significant new param meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Lists the WLO Fachportale — the first-level Sammlungen directly under the WLO root collection.' It clearly differentiates from siblings by emphasizing top-level subject hubs and positioning itself as the entry point for drill-downs, unlike search or collection-navigation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: 'Use this when the user wants an overview of what subjects/topics are covered, or as the natural entry point for guided drill-downs.' It does not provide explicit exclusions or name alternative tools, but the guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_topic_page_contentA
Get the CONTENT STRUCTURE of a Themenseite (topic page): its sections (swimlanes) — each with a heading and the nodeIds of the materials/collections embedded in it. Use this AFTER search_wlo_topic_pages to see what is actually ON a topic page (search_wlo_topic_pages only returns its URL). Resolve the returned nodeIds to human titles with get_nodes_details.
Provide EITHER variantId (a "Variante-ID" from search_wlo_topic_pages — fastest) OR collectionId (a "Sammlung-nodeId"). At least one is required.
| Name | Required | Description | Default |
|---|---|---|---|
| variantId | No | A specific page-variant nodeId (the "Variante-ID" from search_wlo_topic_pages). Faster than collectionId. | |
| targetGroup | No | When resolving by collectionId, pick the variant for this target group. | |
| collectionId | No | Owning collection nodeId of the Themenseite (the "Sammlung-nodeId" from search_wlo_topic_pages). | |
| outputFormat | No | "markdown" (default) or "json". JSON is RENDER-READY: each swimlane carries its heading + up to maxPerSwimlane real content cards (resolved by EXECUTING the swimlane widget's saved query) + a hasMore flag, plus variantTitle and a topicPageUrl jump link. Use JSON to show "Themenseiten-Inhalte". | markdown |
| maxPerSwimlane | No | JSON only: max real content cards resolved per swimlane (default 3). hasMore signals there is more on the full topic page (topicPageUrl). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It explains that JSON output is render-ready and resolves cards by executing the swimlane widget's saved query, and mentions the hasMore flag and topicPageUrl. It lacks explicit details on read-only nature or error cases, but for a content retrieval tool this is sufficient transparency, earning a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, well-structured, and front-loaded with the primary purpose. The first sentence states what the tool does, followed by usage guidance and parameter clarification. Every sentence earns its place, and the line breaks improve readability. No unnecessary fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no annotations and no output schema, the description provides comprehensive context: it explains the result structure (swimlanes, headings, nodeIds), the JSON output specifics, the maxPerSwimlane behavior, and how to resolve nodeIds with another tool. It also ties into the workflow with search_wlo_topic_pages, making it complete for a tool with 5 parameters and multiple output formats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers 100% of parameters, so the baseline is 3. The description adds value by explaining the relationship between variantId and collectionId, noting that variantId is faster, and explicitly stating that at least one is required (a constraint not captured in the schema). This goes beyond the individual parameter descriptions, meriting a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves the content structure of a Themenseite (topic page), detailing swimlanes with headings and nodeIds. It explicitly differentiates from sibling tool search_wlo_topic_pages by noting the latter only returns a URL. This is a specific verb+resource+scope with clear distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit usage guidance: 'Use this AFTER search_wlo_topic_pages' and 'Resolve the returned nodeIds to human titles with get_nodes_details.' It also tells when to use variantId vs collectionId and that at least one is required, giving clear context for when to invoke this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_wlo_vocabularyA
Look up available values for WLO filter parameters. Use this to discover valid labels and URIs for Bildungsstufe (educational context), Schulfach/Disziplin, Zielgruppe (user role), or Lernressourcentyp (learning resource type). Useful before calling search tools to find the correct filter values.
| Name | Required | Description | Default |
|---|---|---|---|
| vocabulary | Yes | Which vocabulary to list: "educationalContext" (Bildungsstufen), "discipline" (Schulfächer), "userRole" (Zielgruppen), "lrt" (Lernressourcentypen aggregiert), "license" (CC-Lizenzen), "targetGroup" (Themenseiten-Zielgruppen: teacher/learner/general) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the transparency burden. It implies a read-only, safe operation by saying 'look up' and 'discover', and it mentions that the output includes 'valid labels and URIs'. However, it does not disclose response format, pagination, or any potential errors, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no redundancy. It front-loads the purpose, then expands on the specific vocabularies, and closes with usage context. Every sentence contributes value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter lookup tool with no output schema, the description provides sufficient context: what it returns (labels and URIs), the known vocabularies, and when to use it. It could be more complete by describing the return structure or adding an example, but it is not necessary given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 100% coverage with a single parameter 'vocabulary' that includes an enum and a detailed description for each value. The description reinforces the same information by listing the German terms, but it does not add meaning beyond the schema's own documentation, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'look up' and names the resource 'available values for WLO filter parameters'. It further lists the exact vocabularies, making the tool's function unambiguous and distinct from the sibling search and retrieval tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states 'Useful before calling search tools to find the correct filter values', clearly indicating when this tool should be used. It does not explicitly name alternatives or when not to use it, but the context of pre-search lookup is sufficiently clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_wlo_allA
Kombinierte WLO-Suche: Einzel-Inhalte (Materialien), Sammlungen UND Themenseiten in EINEM parallelen Aufruf. Nutze dies statt mehrere Suchtools nacheinander zu rufen. Liefert ein strukturiertes Objekt mit getrennten Töpfen { content, collections, topicPages }. Filter akzeptieren deutsche Labels (z.B. "Mathematik", "Sekundarstufe I", "Video") oder URIs.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Suchbegriff (Deutsch), z.B. "Bruchrechnung Klasse 7" | |
| include | No | Welche Töpfe geliefert werden (Default: alle drei). | |
| userRole | No | Zielgruppe: "Lehrer/in", "Lerner/in", … oder URI | |
| publisher | No | Anbieter, z.B. "Klexikon", "Serlo" | |
| discipline | No | Fach: "Mathematik", "Biologie", … oder URI | |
| maxContent | No | Max. Einzel-Inhalte (Default 8) | |
| outputFormat | No | "json" (Default, getrennte Töpfe — für maschinelle Aufteilung) oder "markdown" | json |
| excludeNodeIds | No | Bereits gesehene Node-IDs überspringen | |
| maxCollections | No | Max. je Sammlungen/Themenseiten (Default 5) | |
| educationalContext | No | Bildungsstufe: "Primarstufe", "Sekundarstufe I", … oder URI | |
| learningResourceType | No | Ressourcentyp: "Arbeitsblatt", "Video", … oder URI |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the composite return structure (separate buckets { content, collections, topicPages }) and the flexible filter format (German labels or URIs). It does not mention rate limits or authentication, but for a read-focused search tool, these are less critical; the added context goes beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences, front-loaded with purpose and usage. It conveys the key value proposition, return structure, and filter behavior without any fluff or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (11 parameters) and lack of output schema, the description sufficiently explains the tool's combined nature and the top-level result structure. It lacks examples of return values or error handling, but these are not essential for a search tool when the schema is thorough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by clarifying that all filters accept German labels or URIs, and that maxCollections applies to both collections and topic pages. This extra semantic information enriches the parameter understanding beyond individual schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with "Kombinierte WLO-Suche" and explicitly lists the three content types (Einzel-Inhalte, Sammlungen, Themenseiten) searched in one parallel call. It clearly distinguishes from sibling tools by stating "Nutze dies statt mehrere Suchtools nacheinander zu rufen," indicating this is the combined variant.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit when-to-use guidance: use this tool instead of calling multiple search tools sequentially. This frames the alternative and the recommended context. Though it doesn't explicitly state when to use the individual tools, the contrast is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_wlo_collectionsA
Search WirLernenOnline (WLO) for Sammlungen (= Themenseiten). In WLO, a "Sammlung" is the same as a "Themenseite": a curated thematic page that bundles educational content items in swimlanes (Schwimmlinien/Karussells) grouped by topic, subject or level. Users may ask for "Themenseite Algebra", "Sammlung Klimawandel" or "Portal Mathematik" – these all refer to collections. Use the returned nodeId with get_collection_contents to retrieve the actual content items. Filters accept both German labels (e.g. "Mathematik", "Grundschule", "Lehrer/in") and full URIs.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Search query in German, e.g. "Klimawandel" or "Algebra". Leave empty to browse top-level collections. | |
| userRole | No | Target audience (Zielgruppe): e.g. "Lehrer/in", "Lerner/in", "Eltern", or URI | |
| discipline | No | Subject (Fach/Schulfach): e.g. "Mathematik", "Biologie", "Informatik", or URI | |
| maxResults | No | Maximum number of results (1–20, default 5) | |
| outputFormat | No | "markdown" (default, human-readable) or "json" (structured) | markdown |
| parentNodeId | No | NodeId of a parent collection to search within (e.g. Mathematik nodeId to find "Algebra" inside it). Leave empty to search from the WLO root. Returned by a previous search_wlo_collections call. | |
| excludeNodeIds | No | Skip these node IDs in the result (already-seen items, e.g. for paginated drill-downs) | |
| educationalContext | No | Educational level (Bildungsstufe): e.g. "Primarstufe", "Sekundarstufe I", "Hochschule", or URI |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses domain semantics, synonym coverage, and filter input flexibility (labels and URIs), and hints at follow-up behavior. However, it does not describe result ordering, pagination, or what happens with empty queries beyond a parameter note, leaving gaps in behavioral expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is succinct: four sentences cover purpose, domain equivalence, workflow, and filter encoding. Every sentence earns its place with no redundancy or padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 8 optional parameters and no output schema, the description gives the essential workflow (search → nodeId → get_collection_contents) and domain clarifications. It does not explain the return structure or the markdown/json outputFormat behavior, but the schema covers the parameter details. Reasonably complete for a search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds cross-cutting parameter semantics: all filters accept both German labels and full URIs, and it explains the query parameter's German focus. This is meaningful beyond the individual schema descriptions, which mostly give examples and defaults.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Search WirLernenOnline (WLO) for Sammlungen (= Themenseiten)', a specific verb+resource. It clarifies that Sammlung equals Themenseite and lists synonyms ('Themenseite Algebra', 'Sammlung Klimawandel', 'Portal Mathematik'), effectively distinguishing this from content search by directing to get_collection_contents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage cues: when users ask for Themenseite/Sammlung/Portal, this is the tool. It also gives a workflow ('Use the returned nodeId with get_collection_contents'). However, it does not explicitly contrast with sibling search tools like search_wlo_topic_pages or search_wlo_content, missing an opportunity for exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_wlo_contentA
Search WirLernenOnline (WLO) for individual educational content items (Inhalte/Materialien). Content items are files such as worksheets, videos, interactive media, lesson plans, etc. Supports full-text search with multi-query expansion and quality-based reranking. Filters accept both German labels and full URIs.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search query in German, e.g. "Bruchrechnung Grundschule" or "Klimawandel interaktiv" | |
| userRole | No | Target audience: e.g. "Lehrer/in", "Lerner/in", or URI | |
| publisher | No | Filter by content publisher/source, e.g. "Klexikon", "ZUM", "Serlo", "Khan Academy". Matches against the ccm:oeh_publisher_combined property. | |
| discipline | No | Subject: e.g. "Mathematik", "Biologie", "Deutsch", "Informatik", or URI | |
| maxResults | No | Maximum number of results (1–20, default 8) | |
| outputFormat | No | markdown | |
| excludeNodeIds | No | Skip these node IDs in the result (already-seen items) | |
| educationalContext | No | Educational level: e.g. "Primarstufe", "Sekundarstufe I", "Sekundarstufe II", "Hochschule", or URI | |
| learningResourceType | No | Resource type: e.g. "Arbeitsblatt", "Video", "Unterrichtsplan", "Interaktives Medium", or URI |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It adds meaningful details: 'multi-query expansion and quality-based reranking' and 'filters accept both German labels and full URIs'. These provide non-obvious behavioral context. However, it does not explicitly state read-only semantics or cover pagination/result format, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences long with no fluff. It front-loads the core purpose, then adds supporting details (content types, search behavior, filter syntax) in a logical order. Every sentence contributes valuable information, achieving high information density without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (9 parameters, no output schema) and lack of annotations, the description covers the essential aspects: what is searched, what content looks like, how search works (expansion + reranking), and filter value flexibility. It does not mention output format or defaults, but the schema covers those. This is reasonably complete for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (89%), so the schema already handles most parameter documentation. The description adds cross-cutting semantics not present in individual param descriptions: all filters accept both German labels and full URIs. This genuinely helps an agent understand how to provide filter values, going beyond the schema's examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'Search WirLernenOnline (WLO) for individual educational content items' with specific verb and resource, and distinguishes it from sibling tools by focusing on individual items (Inhalte/Materialien) as opposed to topic pages or collections. It also gives concrete examples of content types (worksheets, videos, lesson plans), making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when searching for individual educational materials, but it does not explicitly state when to use this tool versus alternatives like search_wlo_topic_pages or search_wlo_collections. There is no 'when not to use' or reference to sibling tools, so the guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_wlo_topic_pagesA
Search for Themenseiten (topic pages) on WirLernenOnline. Themenseiten are curated page layouts with swimlanes, tailored to different target groups (Lehrkräfte, Lernende, Allgemein). They are linked to Sammlungen (collections).
Three search modes:
By collectionId: Direct check whether a specific collection has a Themenseite.
By topic (query): Searches collections first, then checks which ones have a Themenseite.
By filters only (no query): Lists Themenseiten, optionally filtered by target group or educational context.
Output:
Each result is titled by its OWNING COLLECTION; if that can't be resolved, the page variant's own title (cm:title) is used, never a cryptic "PAGE_VARIANT_xxx" id.
Multiple variants of the same Themenseite (different target groups) are merged into one entry.
Target groups are returned as readable labels ("Lehrkräfte"), not slugs.
Order: deterministic. By default sorted alphabetically by collection name with nodeId as tie-breaker.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | "alpha" (default, deterministic) sorts by collection name; "relevance" keeps the order returned by the underlying search (only meaningful with a query). | alpha |
| query | No | Thematic search query in German, e.g. "Physik" or "Farben". Searches collections and checks for linked Themenseiten. Leave empty to list all. | |
| maxResults | No | ||
| targetGroup | No | Target audience: "teacher" (Lehrkräfte), "learner" (Lernende), "general" (Allgemein) | |
| collectionId | No | Directly check a specific collection (nodeId) for its Themenseite. Bypasses the search – useful when you already have a collection from search_wlo_collections. | |
| outputFormat | No | "markdown" (default) or "json" (structured) | markdown |
| mergeVariants | No | When true (default), multiple variants of the same Themenseite (different target groups) are merged into a single entry with all variant URLs listed. | |
| educationalContext | No | Educational level: e.g. "Grundschule", "Sekundarstufe I", "Schule", or full URI |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so thoroughly. It discloses specific output behaviors: result titling falls back to the owning collection or cm:title, never a cryptic ID; multiple variants are merged; target groups are returned as readable labels; ordering is deterministic. These details go well beyond basic search behavior and fully inform the agent of what to expect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy but well-structured with clear sections for search modes, output behavior, and ordering. Each sentence contributes useful information without redundancy. It could be tightened slightly, but given the complexity of the tool, the length is appropriate and easily digestible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description fully covers what the agent needs to know: the three modes, how results are titled and merged, target group label behavior, and deterministic ordering. All 8 parameters are semantically addressed in either the schema or description, and the tool's behavior is explained comprehensively. No significant gaps remain.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high (88%), so the baseline is 3, but the description adds real semantic value. It explains the meaning of query ('searches collections first, then checks linked Themenseiten'), collectionId ('bypasses the search'), and the sort parameter's behavior. It also clarifies output-related nuances like variant merging, which indirectly enriches understanding of mergeVariants and targetGroup. This extra context justifies a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches for Themenseiten (topic pages) on WirLernenOnline, using a specific verb and resource. It further distinguishes itself from siblings by detailing three distinct search modes (by collectionId, by topic, by filters only) and emphasizing the link to collections, making it unambiguous when this tool is appropriate.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for each mode: collectionId is for a direct check, query is for thematic search, and filters-only lists all. The collectionId parameter explicitly mentions bypassing the search and being useful when a collection is already known from search_wlo_collections. However, it does not explicitly compare against all sibling tools (e.g., search_wlo_content, get_topic_page_content) to state when to prefer this one, so a small gap remains.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wlo_health_checkA
Probe whether the WLO repository API is reachable and responding. Returns latency in ms, the resolved root collection nodeId, and a status flag. Useful for callers (e.g. chatbots) to quickly tell "WLO is down" from "your query produced no hits".
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It transparently explains what the tool checks (reachability/responding) and what it returns (latency, root nodeId, status flag), which is sufficient for a simple health-check operation. It does not delve into error handling or auth, but for this tool type, the disclosed behavior is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the primary purpose, followed by return-value details and a practical use case. Every sentence contributes distinct value with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a low-complexity tool with no parameters and no output schema, so the description fully covers the essentials: what it does, what it returns, and when to use it. It is complete and self-contained, with no critical missing information.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline is 4. The description correctly omits parameter details, as there is nothing to document. The schema is empty and consistent, requiring no additional explanation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Probe') and resource ('WLO repository API') to clearly define the tool's purpose as a health check. This distinguishes it from sibling search and retrieval tools, which focus on querying content rather than checking service availability.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use this tool: to differentiate service outages from empty search results, citing a concrete use case ('callers e.g. chatbots'). It does not explicitly state when not to use it or name alternative tools, but the guidance is strong enough for appropriate selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v1.0.0- First observed
browse_collection_tree - First observed
get_collection_contents - First observed
get_node_details - First observed
get_nodes_details - First observed
get_subject_portals - First observed
get_topic_page_content - First observed
lookup_wlo_vocabulary - First observed
search_wlo_all - First observed
search_wlo_collections - First observed
search_wlo_content - First observed
search_wlo_topic_pages - First observed
wlo_health_check
TDQS
Scored across 12 tools
search_wlo_topic_pages and search_wlo_collections both target the same entity (Sammlung/Themenseite) but remain separate tools, and get_collection_contents vs get_topic_page_content have closely related purposes that could confuse selection. The overlapping conceptual model forces agents to read descriptions carefully to distinguish.
All tools follow a consistent verb_noun snake_case pattern (e.g., search_wlo_content, get_node_details, lookup_wlo_vocabulary, browse_collection_tree). Minor variation in the placement of 'wlo' (search_wlo_* vs wlo_health_check) is predictable and does not hinder readability.
12 tools is within the ideal scope for a comprehensive read-only API covering search, retrieval, navigation, and health. Each tool serves a definable purpose, though redundancy between topic page and collection search could be consolidated.
The set covers the full lifecycle of read-only exploration: searching content, collections, and topic pages; retrieving collection contents; fetching node details (single and batch); examining topic page structure; discovering filter vocabulary; and browsing the collection tree. No obvious dead ends or missing operations for the stated domain.
Maintenance
Related MCP Connectors
MCP server for searching Airweave collections with natural language queries.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn unofficial MCP server that provides semantic search capabilities for Hugging Face models and datasets, enabling Claude and other MCP-compatible clients to search, discover, and explore the Hugging Face ecosystem using natural language queries.20MIT
- AlicenseAqualityDmaintenanceMCP server for the OpenAlex scholarly database, providing AI agents with tools to search and retrieve academic works, authors, and institutions via natural language queries.8MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for ATLAS Open Data that enables LLMs to discover, query, and retrieve public datasets and metadata from the ATLAS experiment at CERN.2Apache 2.0
- AlicenseNot gradedqualityDmaintenanceMCP server for Outline that gives Claude the ability to search and read documents from your Outline instance.MIT