nope-mcp — Open Educational Resources search
Server Details
Search German open educational resources (OER) via AMB/schema.org metadata, open licenses only.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- edufeed-org/nope-mcp
- GitHub Stars
- 1
- Server Listing
- nope-mcp
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 19 tools
The three search tools (search_content, search_resources, search_passages) heavily overlap — search_content explicitly subsumes resource search — and only lengthy prose disambiguates discovery vs question intent. Similarly, list_relays vs relay_stats vs relay_list_get, and list_known_authors vs resolve_author vs resolve_publisher, are near-neighbors that an agent must read carefully to pick correctly.
Most tools follow a readable verb_noun snake_case pattern (search_content, get_resource, resolve_author, browse_subjects), but 'relay_list_get' and 'relay_stats' invert the pattern and 'relay_list_get' collides conceptually with 'list_relays'. The skos_ prefix group is internally consistent but uses noun-first ordering, so conventions are mixed overall.
19 tools is at the upper edge for a search-oriented server and includes visible redundancy (three relay tools, three author/publisher resolvers, three overlapping search entry points). The breadth is partly justified by covering multiple domains (resources, calendar events, Nostr relays, SKOS vocabularies), but consolidation could cut several tools.
The surface covers discovery (search_content/search_resources), Q&A with citations (search_passages), faceted browsing (subjects, types, levels), retrieval (get_resource handles all content kinds), author/publisher resolution, calendar events, and SKOS vocabulary access. Minor gaps remain: no get_calendar_event detail tool, no community browse/list beyond find_community, and no write/publish or grimoire-spell management tools despite spells being referenced.
Available Tools
19 toolsbrowse_educational_levelsBrowse Educational LevelsBRead-onlyIdempotentInspect
List available educational levels (Primary, Secondary, Higher Education, etc.) with resource counts.
Inputs: limit, language.
browse_resource_typesBrowse Resource TypesARead-onlyIdempotentInspect
List available learning resource types (Video, Course, Worksheet, etc.) with resource counts.
Inputs: limit, language.
browse_subjectsBrowse SubjectsARead-onlyIdempotentInspect
List available subjects/topics in the educational resource collection. Returns subjects with their labels and resource counts.
Inputs: limit, prefix, language.
find_communityFind CommunityARead-onlyIdempotentInspect
Find Nostr communities (Communikey, kind 10222) matching a free-text topic — use for "welche Community/Gruppe beschäftigt sich mit …" questions. Each result's pubkey can be passed as the community parameter of search_content or search_calendar_events to scope a search to that community.
Inputs: query (required), limit.
get_resourceGet Educational ResourceARead-onlyIdempotentInspect
Retrieve a single piece of content by naddr (preferred — pass a search_content result's naddr), d-tag identifier, or event ID. naddrs of ANY content type from search_content work (resources, articles, wikis, projects, measures, publications); non-resource kinds return the same shape as their search results. Bare identifier/eventId lookups (no naddr) always resolve the full educational-resource metadata (kind 30142), including creator/publisher and educational properties. get_resource is never license-filtered: a learning resource carries license ({id, label}, or null when unlicensed) and accessLevel ("full" for Creative Commons, Public Domain and free software/documentation licenses, and DINI-AG-KIM license types that resolve to one of these; "metadata-only" otherwise). Only accessLevel:"full" resources have indexed fulltext, snippets and passages — present a "metadata-only" resource by its title, description, license and link, never quoted beyond its metadata, and always name the license and the creator/publisher. openLicense is kept for compatibility (deprecated; use accessLevel). When presenting the resource, render a markdown link the user can open: prefer its sourcePage (the original source page); fall back to url (the edufeed viewer) only when sourcePage is absent.
Inputs: naddr, author, relays, eventId, +2 more.
list_calendar_authorsList Calendar AuthorsARead-onlyIdempotentInspect
List known calendar event authors loaded from configured follow sets (NIP-51 kind 30000). Returns author names, pubkeys, and NIP-05 identifiers. Use the returned pubkeys with search_calendar_events(authors: [...]) to filter events by author.
Inputs: no named parameters.
list_known_authorsList Known AuthorsARead-onlyIdempotentInspect
List known educational resource authors loaded from configured follow sets (NIP-51 kind 30000). Returns author names, pubkeys, and NIP-05 identifiers. Use the returned pubkeys with search_resources(authors: [...]) to filter resources by author.
Inputs: no named parameters.
list_relaysList RelaysARead-onlyIdempotentInspect
List the configured AMB relays. defaultRelays are searched on every query; extraRelays hold different corpora (e.g. the OERSI aggregation) and are only searched when a search/get tool call passes them in its relays parameter.
Inputs: no named parameters.
relay_list_getGet Relay ListARead-onlyIdempotentInspect
Get a user's NIP-65 relay list (kind 10002). Returns read and write relays for the specified pubkey. If no pubkey provided, uses the connected signer's pubkey.
Inputs: pubkey.
relay_statsRelay StatisticsBRead-onlyIdempotentInspect
Get information about all selectable AMB relays (default and extra), including supported NIPs, relay name, and description.
Inputs: no named parameters.
resolve_authorResolve Author Name to PubkeyARead-onlyIdempotentInspect
Resolve an org or person NAME to candidate pubkeys using the relay's kind-0 author-profile index (NIP-50 search). Use this to answer name-driven content questions like "recent articles and resources of Jörg Lohrer": call resolve_author(name), pick the best candidate, then pass its pubkey to search_content({ authors: [pubkey], ... }) (and/or search_calendar_events) to fetch that author's content. Returns several candidates ranked by relevance so you can disambiguate. This indexes authors who have published content here — distinct from list_known_authors, which lists hand-curated follow sets. NOTE: this resolves only kind-0 author profiles. It does NOT resolve a community's identifying pubkey — a community is defined by a kind-10222 event and frequently has no kind-0 at all. To list content shared into a community you need that community pubkey (a Nostr identifier, e.g. from the community's spec/naddr), which you pass to the community param of search_content / search_calendar_events. resolve_author CAN, however, find a community's posting account (e.g. a "…-Termine-Bot") when that account has a kind-0; querying that pubkey via authors:[...] returns the content it published. A wrong pick simply yields empty results.
Inputs: name (required), limit.
resolve_publisherResolve Publisher/Creator Name to Canonical Metadata SpellingARead-onlyIdempotentInspect
Resolve an actor name (organization or person) to the EXACT spelling used in the AMB metadata, so it can be passed to the publisherName/creatorName filters of search_resources. Those filters are exact full-string matches (case-insensitive), so a guessed spelling like "Lehreladen" silently misses the stored "LEHRE LADEN". This tool free-text searches the name and returns the similar publisher/creator names found in the corpus, with the field they appear in and a resource count. Distinct from resolve_author, which resolves Nostr signing accounts (kind-0 profiles) to pubkeys — metadata publishers usually have no Nostr account at all.
Inputs: name (required), relays.
search_calendar_eventsSearch Calendar EventsARead-onlyIdempotentInspect
Search for NIP-52 calendar events (date-based and time-based). Supports temporal filters (start/end time ranges), geohash location filtering, hashtag filtering, and the edufeed educational attributes (free, registrationRequired, attendanceMode, educationalLevel). Returns events from the configured calendar relay. TIME SEMANTICS (NIP-52): start/end are the raw tags — end is EXCLUSIVE and is omitted for one-day and instantaneous events, so never read a missing end as "unknown". Use effectiveEnd (Unix seconds when the event is over), allDay (31922: whole days, no clock time) and lastDay (all-day events: the inclusive last calendar day). Times of 31923 events are in startTzid/endTzid. ATTRIBUTES: attributes carries registration, price (free = amount 0), attendance mode (online/offline/mixed) and Bildungsstufe; a missing field means "no statement", never "no" or "not free". AUTHOR: every event has author {name, bot}; bot: true marks an automated account such as an event mirror or crawler — group or de-emphasise those unless the user asks for imports. Operators may hide bulk sources by default (see hiddenSources in the result); pass includeHiddenSources: true to see them. When presenting an event to the user, render it as a markdown link: prefer the event url (the edufeed-app viewer at /, which shows fuller details) over sourcePage (the original external event page). Never construct an naddr or viewer URL yourself — use the naddr/url fields as returned.
Inputs: free, kinds, limit, query, +16 more.
search_contentSearch Educational Content (resources, articles, wikis, projects, measures, publications)ARead-onlyIdempotentInspect
Topic search across ALL content types on the relay in one ranked call: educational resources (kind 30142), long-form articles/blogs (30023), wikis (30818), projects (30143), measures (30144), and NKBIP-01 publications (30040 indices + 30041 sections — scientific articles, books). Results are interleaved and ranked by semantic passage match, and each carries the matched passage ("snippet") when available — use it to answer the user, not just list links. Every learning resource is returned by default, whatever its license; each resource result carries license ({id, label}, or null when unlicensed) and accessLevel ("full" for Creative Commons, Public Domain and free software/documentation licenses, and DINI-AG-KIM license types that resolve to one of these; "metadata-only" otherwise). Snippets and passages exist only for accessLevel:"full" resources — present a "metadata-only" resource by its title, description, license and link, never quoted beyond its metadata, and always name the license and the creator/publisher. licenseFilter narrows the results: "open" = CC0, Public Domain, CC BY, CC BY-SA, their DINI-AG-KIM license-type equivalents, and free software/documentation licenses (GPL, LGPL, AGPL, GFDL, MIT, Apache 2.0, BSD); "cc-any" = all of "open" plus every other Creative Commons license, incl. KIM non-commercial/no-derivatives; "any" = also unlicensed and all-rights-reserved resources. The other content types carry no license and are always included. This is the tool for DISCOVERY intent — the user wants materials to browse ("finde/suche/empfiehl Materialien zu X"): present the items. For QUESTION intent — the user wants an answer built from the content ("wie/warum/was hilft bei X?") — prefer search_passages, which returns quotable fulltext passages with citations; this tool then supplements the answer with browsable links. Each result carries eventAuthor (the Nostr signer who uploaded the event — often an aggregator) plus, for resources, creator/publisher (who actually made and published the resource); these can differ, so do not treat eventAuthor as the publisher. For full metadata (license, dates, complete entity lists) pass a result's naddr to get_resource. Publication facets ride inside the query string as NIP-50 field filters: append type:academic, doi:10.1234/abcd.5678, keywords:, or partOf:30143:: ("publications of a project") to the query — the relay resolves them server-side. When presenting results to the user, render each as a markdown link so they can open it directly — prefer sourcePage (the original external source page, present on most resources and on projects/measures/publications), then url, then naddr. For upcoming events on the same topic, follow up with search_calendar_events.
Inputs: limit, query, since, types, +6 more.
search_passagesGrounded passage search (RAG) scoped by a spellARead-onlyIdempotentInspect
THE DEFAULT TOOL FOR QUESTION-SHAPED QUERIES ("wie/warum/was hilft bei X?", "how do I…?"): retrieves the best-matching fulltext passages from the corpus and returns them with citations (source resource, page, heading, source URL) — answer the user FROM the passages and cite each source. (For discovery intent — "finde/empfiehl Materialien" — use search_content instead, or afterwards to offer browsable links.) Keep question topic-only. Ranking is hybrid keyword+vector, so phrase the question as a topical statement that names the subject and the target group ("Friedenserziehung in der Grundschule: Einstieg in das Thema Frieden mit Kindern"), not as the user's literal sentence ("Wie kann ich …?"). Results are capped at two passages per document; a passage with only a snippet and no text has no fulltext yet — say so instead of guessing. Passages come from learning resources under Creative Commons, Public Domain and free software/documentation licenses, and DINI-AG-KIM license types that resolve to one of these and from articles, wikis, publications and the other content kinds. Other matching learning resources appear in metadataOnlyMatches (naddr, title, license, creator/publisher, sourcePage) without text, because their license does not permit quoting — point the user to them by title, license and link, never quote or paraphrase them as content. Cite the license and the creator/publisher with every learning-resource passage. licenseFilter narrows learning resources: "open" = CC0, Public Domain, CC BY, CC BY-SA, their DINI-AG-KIM license-type equivalents, and free software/documentation licenses (GPL, LGPL, AGPL, GFDL, MIT, Apache 2.0, BSD); "cc-any" = all of "open" plus every other Creative Commons license, incl. KIM non-commercial/no-derivatives (normally no metadataOnlyMatches); "any" = also unlicensed and all-rights-reserved resources, as metadataOnlyMatches. Scope is required but simple: with no source restriction from the user, pass the content kinds (e.g. kinds:[30142] for educational resources, [30040,30041] for publications, [30023] for articles). Route source restrictions ("nur Content von X") into the scope parameters: a metadata publisher (most organisations — resolve_publisher finds the exact spelling) goes into search as a QUOTED field filter, e.g. search:'publisher.name:"LEHRE LADEN"' (unquoted multi-word names match nothing); a Nostr signing account (resolve_author → pubkey) goes into authors. A published grimoire spell (kind 777, nevent or event id) can replace inline scope entirely; the response carries the canonical spell for whatever scope was used — publish it (e.g. via grimoire) to make the scope reusable. Spells may use $me/$contacts; they resolve to the calling user (pass me if the transport is anonymous). Scope materialization (tag/search/community spells) runs against the primary relay only; the passage search itself fans out to every selected indexed relay. Fails rather than widening scope: an empty scope, unreachable relay (relay_unreachable — tell the user to retry), or unreachable index is a typed error, never a silently unscoped search.
Inputs: question (required), me, tag, kinds, +8 more.
search_resourcesSearch Educational ResourcesARead-onlyIdempotentInspect
Search for educational resources (learning materials, courses, videos, etc.) using full-text search and metadata filters. Returns resources matching the query from the AMB relay. Every learning resource is returned by default, whatever its license; each result carries license ({id, label}, or null when unlicensed) and accessLevel ("full" for Creative Commons, Public Domain and free software/documentation licenses, and DINI-AG-KIM license types that resolve to one of these; "metadata-only" otherwise). licenseFilter narrows the results: "open" = CC0, Public Domain, CC BY, CC BY-SA, their DINI-AG-KIM license-type equivalents, and free software/documentation licenses (GPL, LGPL, AGPL, GFDL, MIT, Apache 2.0, BSD); "cc-any" = all of "open" plus every other Creative Commons license, incl. KIM non-commercial/no-derivatives; "any" = also unlicensed and all-rights-reserved resources. When citing a resource, always name its creator and publisher. NOTE: the metadata filters (publisherName, creatorName, subjectLabel, resourceTypeLabel, educationalLevelLabel) are EXACT full-string matches against the stored metadata (case-insensitive) — not fuzzy or substring searches. A guessed spelling silently returns 0 results; use resolve_publisher to find the canonical actor spelling first. On a zero-match actor filter the response includes actorCandidates with similar spellings to retry with.
Inputs: limit, query, since, until, +9 more.
skos_get_conceptGet SKOS ConceptBRead-onlyIdempotentInspect
Get details of a single SKOS concept by its URI, including broader, narrower, and related concepts.
Inputs: uri (required), language.
skos_get_vocabularyGet SKOS VocabularyBRead-onlyIdempotentInspect
Fetch and parse a SKOS vocabulary from its URI. Returns the concept scheme with all concepts organized hierarchically.
Inputs: uri (required), flat, language.
skos_searchSearch SKOS ConceptsBRead-onlyIdempotentInspect
Search for concepts in a SKOS vocabulary. By default searches prefLabel, altLabel, hiddenLabel, and definition.
Inputs: query (required), vocabularyUri (required), limit, fields, +1 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
Related MCP Connectors
Web search in Polias' own EU-hosted index: German (DE/AT/CH, official sources optional) and English
Search 250M+ academic works, citation graphs, DOIs, and institutional research via OpenAlex.
GovData.de MCP — Germany's national open-data portal (CKAN API).
Search public Siemens web content, product catalog, customer references and media.
Related MCP Servers
- AlicenseAqualityDmaintenanceMCP server for WirLernenOnline.de that enables searching and retrieving educational materials, collections, topic pages, and metadata through natural language, compatible with OpenAI and Claude.12Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to search and retrieve German open data through a remote, stateless Streamable HTTP endpoint — public procurement notices, Marktstammdatenregister energy units, and Bundesnetzagentur EV charging stations — with keyword, location, technology, and capacity filters plus aggregate statistics and data-freshness checks.MIT
- AlicenseAqualityCmaintenanceEnables searching Germany's national geodata catalogue through CSW 2.0.2 keyword queries and retrieving individual Dublin Core metadata records, including themes, rights information, bounding boxes, and resource links. It is a read-only, lightweight stdio connector that never downloads or opens the linked data itself.22MIT
- AlicenseAqualityBmaintenanceEnables AI models to search and retrieve bibliographic and digitized records from Swiss academic libraries (swisscovery, e-rara, e-periodica, e-manuscripta) via open protocols without requiring API keys.161MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.