MCPサーバー

nope-mcp — Open Educational Resources search

org.edufeed/nope-mcp

このMCPでできること

Searches and retrieves openly licensed German educational resources, articles, events, concepts and related metadata.

browse_educational_levels
Browse Educational Levels
List available educational levels (Primary, Secondary, Higher Education, etc.) with resource counts.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'number', 'default': 50, 'maximum': 100, 'minimum': 1, 'description': 'Maximum number of levels to return'}, 'language': {'type': 'string', 'default': 'de', 'description': 'Language for labels (default: "de")'}}, 'additionalProperties': False}
browse_resource_types
Browse Resource Types
List available learning resource types (Video, Course, Worksheet, etc.) with resource counts.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'number', 'default': 50, 'maximum': 100, 'minimum': 1, 'description': 'Maximum number of resource types to return'}, 'language': {'type': 'string', 'default': 'de', 'description': 'Language for labels (default: "de")'}}, 'additionalProperties': False}
browse_subjects
Browse Subjects
List available subjects/topics in the educational resource collection. Returns subjects with their labels and resource counts.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'number', 'default': 50, 'maximum': 250, 'minimum': 1, 'description': 'Maximum number of subjects to return'}, 'prefix': {'type': 'string', 'description': 'Filter subjects whose label starts with this prefix'}, 'language': {'type': 'string', 'default': 'de', 'description': 'Language for labels (default: "de")'}}, 'additionalProperties': False}
get_resource
Get Educational Resource
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.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'naddr': {'type': 'string', 'description': 'NIP-19 naddr from a search result â\x80\x94 the preferred handoff to fetch full metadata.'}, 'author': {'type': 'string', 'description': 'Author pubkey (hex) to disambiguate if multiple resources share the same identifier'}, 'relays': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Restrict the lookup to specific relays â\x80\x94 pass the relays a search found the result on. Only relays returned by list_relays (default or extra) are accepted, by full URL or short name (e.g. "oersi"). Default: the default relay set.'}, 'eventId': {'type': 'string', 'description': 'Nostr event ID (hex) for direct lookup. Alternative to identifier.'}, 'language': {'type': 'string', 'default': 'de', 'description': 'Preferred language for labels (default: "de")'}, 'identifier': {'type': 'string', 'description': 'Resource identifier (d-tag). Use this for stable lookups.'}}, 'additionalProperties': False}
list_calendar_authors
List Calendar Authors
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.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
list_known_authors
List Known Authors
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.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
list_relays
List Relays
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.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
relay_list_get
Get Relay List
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.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'pubkey': {'type': 'string', 'description': 'Public key to fetch relay list for (defaults to connected signer)'}}, 'additionalProperties': False}
relay_stats
Relay Statistics
Get information about all selectable AMB relays (default and extra), including supported NIPs, relay name, and description.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {}}
resolve_author
Resolve Author Name to Pubkey
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.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Org or person name to resolve (e.g. "Jörg Lohrer").'}, 'limit': {'type': 'number', 'default': 10, 'maximum': 25, 'minimum': 1, 'description': 'Max candidates (1-25, default 10).'}}, 'additionalProperties': False}
resolve_publisher
Resolve Publisher/Creator Name to Canonical Metadata Spelling
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.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['name'], 'properties': {'name': {'type': 'string', 'description': 'Actor name as the user said it (e.g. "Lehreladen").'}, 'relays': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Restrict the lookup to specific relays. Only relays returned by list_relays (default or extra) are accepted, by full URL or short name (e.g. "oersi", "sodix"). Default: the default relay set.'}}, 'additionalProperties': False}
search_calendar_events
Search Calendar Events
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.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'kinds': {'type': 'array', 'items': {'type': 'number'}, 'description': 'Event kinds to query (default: [31922, 31923]). 31922 = date-based, 31923 = time-based.'}, 'limit': {'type': 'number', 'default': 20, 'maximum': 250, 'minimum': 1, 'description': 'Maximum number of results (1-250, default: 20)'}, 'query': {'type': 'string', 'description': 'Free-text topic for the events. Combines with a time range (startAfter/startBefore/endAfter/endBefore) in a single server-side query â\x80\x94 e.g. "events about X in the next week" is one call. EXCEPTION: a geohash query forces the relay location index, which ignores this topic; for "events about X near a place" pass the geohash and filter the returned events by topic on the client.'}, 'since': {'type': 'number', 'description': 'Return events created at or after this Unix timestamp'}, 'until': {'type': 'number', 'description': 'Return events created at or before this Unix timestamp'}, 'authors': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Filter by author pubkeys (hex format)'}, 'geohash': {'type': 'string', 'description': 'Geohash prefix for location-based search'}, 'endAfter': {'type': 'number', 'description': 'Only events ending after this Unix timestamp'}, 'hashtags': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Filter by hashtags (e.g., ["meetup", "nostr"])'}, 'community': {'type': 'string', 'description': 'Return calendar events shared into this community (Communikey). Accepts a hex pubkey or npub; resolve a community name with resolve_author. Combines with a time range (startAfter/startBefore/endAfter/endBefore) in a single server-side query, so "events shared with X next week" is one call. EXCEPTION: a geohash query forces the relay location index, which ignores this community filter; for "shared with X near a place" pass the geohash and filter the returned events by community client-side.'}, 'endBefore': {'type': 'number', 'description': 'Only events ending before this Unix timestamp'}, 'startAfter': {'type': 'number', 'description': 'Only events starting after this Unix timestamp'}, 'startBefore': {'type': 'number', 'description': 'Only events starting before this Unix timestamp'}}, 'additionalProperties': False}
search_content
Search Educational Content (resources, articles, wikis, projects, measures, publications)
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.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'number', 'default': 20, 'maximum': 250, 'minimum': 1, 'description': 'Max results (1-250, default 20).'}, 'query': {'type': 'string', 'description': 'Free-text topic (e.g., "Unaufmerksamkeit im Seminar"). Keep it to the TOPIC only â\x80\x94 do not append actor/organization names ("â\x80¦ Lehreladen"): they dilute the semantic ranking and the actor\'s content drops out of the top results. To constrain by actor, resolve the name first (resolve_author â\x86\x92 authors param here; or resolve_publisher â\x86\x92 search_resources publisherName).'}, 'since': {'type': 'number', 'description': 'Created at or after this Unix timestamp.'}, 'types': {'type': 'array', 'items': {'enum': ['resource', 'article', 'wiki', 'project', 'measure', 'publication'], 'type': 'string'}, 'description': 'Restrict to a subset of content types. Default: all of them.'}, 'until': {'type': 'number', 'description': 'Created at or before this Unix timestamp.'}, 'relays': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Restrict the search to specific relays. Only relays returned by list_relays (default or extra) are accepted, by full URL or short name (e.g. "oersi", "sodix"). Default: the default relay set.'}, 'authors': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Filter by author pubkeys (hex).'}, 'language': {'type': 'string', 'default': 'de', 'description': 'Label language (default "de").'}, 'community': {'type': 'string', 'description': 'Return content shared into this community (Communikey). Accepts a hex pubkey or npub. Resolve a community name to its pubkey with resolve_author. Combine with query to scope a topic to a community (e.g. "math resources shared with X").'}}, 'additionalProperties': False}
search_passages
Grounded passage search (RAG) scoped by a spell
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.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['question'], 'properties': {'me': {'type': 'string', 'description': 'Who $me refers to (npub or hex). Defaults to the calling identity.'}, 'tag': {'type': 'object', 'required': ['letter', 'values'], 'properties': {'letter': {'type': 'string'}, 'values': {'type': 'array', 'items': {'type': 'string'}}}, 'description': 'Inline scope: one tag filter, e.g. {letter:"h", values:["<community-pk>"]}.', 'additionalProperties': False}, 'kinds': {'type': 'array', 'items': {'type': 'number'}, 'description': 'Inline scope: content kinds (e.g. 30142).'}, 'limit': {'type': 'number', 'default': 10, 'maximum': 25, 'minimum': 1, 'description': 'Passages to return (1-25, default 10).'}, 'since': {'type': 'string', 'description': 'Inline scope: absolute Unix seconds or relative (7d, 1mo, now).'}, 'spell': {'type': 'string', 'description': 'Published spell: nevent, note id, or 64-hex event id.'}, 'until': {'type': 'string', 'description': 'Inline scope: absolute Unix seconds or relative.'}, 'relays': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Relay selection (list_relays set), by full URL or short name (e.g. "oersi", "sodix"). First mapped relay is used.'}, 'search': {'type': 'string', 'description': 'Inline scope: NIP-50 term selecting the EVENTS in scope (distinct from question). Supports field filters; quote multi-word values: publisher.name:"LEHRE LADEN".'}, 'authors': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Inline scope: Nostr event-author pubkeys (hex/npub/$me/$contacts) â\x80\x94 resolve names via resolve_author. NOT for metadata publishers; those go into `search`.'}, 'question': {'type': 'string', 'description': 'The question or topic to find grounding passages for.'}}, 'additionalProperties': False}
search_resources
Search Educational Resources
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.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'number', 'default': 20, 'maximum': 250, 'minimum': 1, 'description': 'Maximum number of results (1-250, default: 20)'}, 'query': {'type': 'string', 'description': 'Free-text search query (e.g., "mathematik", "machine learning")'}, 'since': {'type': 'number', 'description': 'Return resources created at or after this Unix timestamp'}, 'until': {'type': 'number', 'description': 'Return resources created at or before this Unix timestamp'}, 'relays': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Restrict the search to specific relays. Only relays returned by list_relays (default or extra) are accepted, by full URL or short name (e.g. "oersi", "sodix"). Default: the default relay set.'}, 'authors': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Filter by author pubkeys (hex format)'}, 'language': {'type': 'string', 'default': 'de', 'description': 'Language for label filters (default: "de")'}, 'creatorName': {'type': 'string', 'description': 'Filter by creator/author name â\x80\x94 EXACT full-string match (case-insensitive) against the AMB metadata. Unsure of the spelling? Call resolve_publisher first.'}, 'subjectLabel': {'type': 'string', 'description': 'Filter by subject/topic label â\x80\x94 EXACT label match (e.g., "Mathematik", "Physik"); browse_subjects lists valid labels'}, 'publisherName': {'type': 'string', 'description': 'Filter by publisher name â\x80\x94 EXACT full-string match (case-insensitive) against the AMB metadata, e.g. "e-teaching.org" or "LEHRE LADEN" (not "Lehreladen"). Unsure of the spelling? Call resolve_publisher first.'}, 'resourceTypeLabel': {'type': 'string', 'description': 'Filter by resource type label â\x80\x94 EXACT label match (e.g., "Video", "Kurs", "Arbeitsblatt"); browse_resource_types lists valid labels'}, 'educationalLevelLabel': {'type': 'string', 'description': 'Filter by educational level â\x80\x94 EXACT label match (e.g., "Sekundarstufe I", "Hochschule"); browse_educational_levels lists valid labels'}}, 'additionalProperties': False}
skos_get_concept
Get SKOS Concept
Get details of a single SKOS concept by its URI, including broader, narrower, and related concepts.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['uri'], 'properties': {'uri': {'type': 'string', 'format': 'uri', 'description': 'URI of the concept (e.g., "https://w3id.org/kim/hcrt/video")'}, 'language': {'type': 'string', 'description': 'Preferred language for labels (e.g., "de", "en")'}}, 'additionalProperties': False}
skos_get_vocabulary
Get SKOS Vocabulary
Fetch and parse a SKOS vocabulary from its URI. Returns the concept scheme with all concepts organized hierarchically.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['uri'], 'properties': {'uri': {'type': 'string', 'format': 'uri', 'description': 'URI of the SKOS vocabulary (e.g., "https://w3id.org/kim/hcrt/scheme")'}, 'flat': {'type': 'boolean', 'description': 'If true, return a flat list of concepts instead of hierarchy. Default: false.'}, 'language': {'type': 'string', 'description': 'Preferred language for labels (e.g., "de", "en"). If not specified, all languages are returned.'}}, 'additionalProperties': False}
skos_search
Search SKOS Concepts
Search for concepts in a SKOS vocabulary. By default searches prefLabel, altLabel, hiddenLabel, and definition.
読み取り専用 冪等
入力スキーマ
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['vocabularyUri', 'query'], 'properties': {'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Maximum number of results (default: 20, max: 100)'}, 'query': {'type': 'string', 'minLength': 1, 'description': 'Search query'}, 'fields': {'type': 'array', 'items': {'enum': ['prefLabel', 'altLabel', 'hiddenLabel', 'definition', 'notation'], 'type': 'string'}, 'description': 'Fields to search in. Default: ["prefLabel", "altLabel", "hiddenLabel", "definition"]'}, 'language': {'type': 'string', 'description': 'Limit search to this language (e.g., "de"). If not specified, searches all languages.'}, 'vocabularyUri': {'type': 'string', 'format': 'uri', 'description': 'URI of the vocabulary to search (e.g., "https://w3id.org/kim/hochschulfaechersystematik/scheme")'}}, 'additionalProperties': False}
追加
search_passages
2026年10月4日2:40
追加
list_calendar_authors
2026年10月4日2:40
追加
search_calendar_events
2026年10月4日2:40
追加
resolve_publisher
2026年10月4日2:40
追加
resolve_author
2026年10月4日2:40
追加
list_known_authors
2026年10月4日2:40
追加
skos_search
2026年10月4日2:40
追加
skos_get_concept
2026年10月4日2:40
追加
skos_get_vocabulary
2026年10月4日2:40
追加
relay_list_get
2026年10月4日2:40
追加
list_relays
2026年10月4日2:40
追加
relay_stats
2026年10月4日2:40
追加
browse_educational_levels
2026年10月4日2:40
追加
browse_resource_types
2026年10月4日2:40
追加
browse_subjects
2026年10月4日2:40
追加
get_resource
2026年10月4日2:40
追加
search_content
2026年10月4日2:40
追加
search_resources
2026年10月4日2:40