nope-mcp — Open Educational Resources search
by edufeed.org · remote · no sign-in to list tools · v0.4.0 · published by org.edufeed
Search German open educational resources (OER) via AMB/schema.org metadata, open licenses only.
18 tools: 18 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things0Claude Code: ask
- Only reads18Claude Code: allow: see these tools
1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.
claude mcp add --transport http nope https://mcp.edufeed.org/mcpFindings
Matches of fixed checks, with the text they matched.
- Infosearch_passages
The description is 2,078 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...retry), or unreachable index is a typed error, never a silently unscoped search."
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
18 tools
Only reads 18Claude Code: allow
browse_educational_levelsList available educational levels (Primary, Secondary, Higher Education, etc.) with resource counts.No findings
Why it is in this group
- The name "browse_educational_levels" says "browse": a word for reading.
Description, as the server wrote it List available educational levels (Primary, Secondary, Higher Education, etc.) with resource counts.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
browse_resource_typesList available learning resource types (Video, Course, Worksheet, etc.) with resource counts.No findings
Why it is in this group
- The name "browse_resource_types" says "browse": a word for reading.
Description, as the server wrote it List available learning resource types (Video, Course, Worksheet, etc.) with resource counts.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
browse_subjectsList available subjects/topics in the educational resource collection.No findings
Why it is in this group
- The name "browse_subjects" says "browse": a word for reading.
Description, as the server wrote it List available subjects/topics in the educational resource collection. Returns subjects with their labels and resource counts.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
get_resourceRetrieve a single piece of content by naddr (preferred — pass a search_content result's naddr), d-tag identifier, or event ID.No findings
Why it is in this group
- The name "get_resource" says "get": a word for reading.
Description, as the server wrote it 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. Lookups are not license-filtered: a learning resource carries openLicense (true for CC0, Public Domain, CC BY, CC BY-SA — the open licenses that search results are currently limited to). 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_calendar_authorsList known calendar event authors loaded from configured follow sets (NIP-51 kind 30000).No findings
Why it is in this group
- The name "list_calendar_authors" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_known_authorsList known educational resource authors loaded from configured follow sets (NIP-51 kind 30000).No findings
Why it is in this group
- The name "list_known_authors" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
list_relaysList the configured AMB relays.No findings
Why it is in this group
- The name "list_relays" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
relay_list_getGet a user's NIP-65 relay list (kind 10002).No findings
Why it is in this group
- The name "relay_list_get" says "list": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
relay_statsGet information about all selectable AMB relays (default and extra), including supported NIPs, relay name, and description.No findings
Why it is in this group
- The description's first verb is "get": a word for reading.
Description, as the server wrote it Get information about all selectable AMB relays (default and extra), including supported NIPs, relay name, and description.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
resolve_authorResolve an org or person NAME to candidate pubkeys using the relay's kind-0 author-profile index (NIP-50 search).No findings
Why it is in this group
- The name "resolve_author" says "resolve": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
resolve_publisherResolve 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.No findings
Why it is in this group
- The name "resolve_publisher" says "resolve": a word for reading.
Description, as the server wrote it 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
search_calendar_eventsSearch for NIP-52 calendar events (date-based and time-based).No findings
Why it is in this group
- The name "search_calendar_events" says "search": a word for reading.
Description, as the server wrote it Search for NIP-52 calendar events (date-based and time-based). Supports temporal filters (start/end time ranges), geohash location filtering, and hashtag filtering. Returns events from the configured calendar relay. When presenting an event to the user, render it as a markdown link: prefer the event `url` (the edufeed-app viewer at <base>/<naddr>, 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
search_contentTopic 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), measur…No findings
Why it is in this group
- The name "search_content" says "search": a word for reading.
Description, as the server wrote it 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. Educational resources are returned only when openly licensed (CC0, Public Domain, CC BY, CC BY-SA); the other content types carry no license and are all 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:<term>, or partOf:30143:<pubkey>:<d> ("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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
search_passagesTHE 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 citat…1 finding
Why it is in this group
- The name "search_passages" says "search": a word for reading.
Findings
- Info
The description is 2,078 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...retry), or unreachable index is a typed error, never a silently unscoped search."
Description, as the server wrote it 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. Educational-resource passages come only from openly licensed resources (CC0, Public Domain, CC BY, CC BY-SA); other content types are not license-filtered. 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). 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
search_resourcesSearch for educational resources (learning materials, courses, videos, etc.) using full-text search and metadata filters.No findings
Why it is in this group
- The name "search_resources" says "search": a word for reading.
Description, as the server wrote it 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. Only openly licensed resources are returned (CC0, Public Domain, CC BY, CC BY-SA); NC/ND, all-rights-reserved and unlicensed resources are left out. 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.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
skos_get_conceptGet details of a single SKOS concept by its URI, including broader, narrower, and related concepts.No findings
Why it is in this group
- The name "skos_get_concept" says "get": a word for reading.
Description, as the server wrote it Get details of a single SKOS concept by its URI, including broader, narrower, and related concepts.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
skos_get_vocabularyFetch and parse a SKOS vocabulary from its URI.No findings
Why it is in this group
- The name "skos_get_vocabulary" says "get": a word for reading.
Description, as the server wrote it Fetch and parse a SKOS vocabulary from its URI. Returns the concept scheme with all concepts organized hierarchically.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
skos_searchSearch for concepts in a SKOS vocabulary.No findings
Why it is in this group
- The name "skos_search" says "search": a word for reading.
Description, as the server wrote it Search for concepts in a SKOS vocabulary. By default searches prefLabel, altLabel, hiddenLabel, and definition.
Annotations the server declares
- readOnlyHint: true
- destructiveHint: false
- idempotentHint: true
- openWorldHint: false
This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.
Install
Pinned to version 0.4.0. Values in angle brackets are yours to fill in.
claude mcp add --transport http nope https://mcp.edufeed.org/mcpRun in a terminal.
Claude Code permissions
Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.
{
"permissions": {
"allow": [
"mcp__nope__search_resources",
"mcp__nope__search_content",
"mcp__nope__get_resource",
"mcp__nope__browse_subjects",
"mcp__nope__browse_resource_types",
"mcp__nope__browse_educational_levels",
"mcp__nope__relay_stats",
"mcp__nope__list_relays",
"mcp__nope__relay_list_get",
"mcp__nope__skos_get_vocabulary",
"mcp__nope__skos_get_concept",
"mcp__nope__skos_search",
"mcp__nope__list_known_authors",
"mcp__nope__resolve_author",
"mcp__nope__resolve_publisher",
"mcp__nope__search_calendar_events",
"mcp__nope__list_calendar_authors",
"mcp__nope__search_passages"
],
"ask": [],
"deny": []
}
}Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as nope. Review it before you use it.