io. github. kuhumcst/ dannet
by kuhumcst · remote · no sign-in to list tools · v1.0.2 · published by GitHub user kuhumcst
DanNet - Danish WordNet with rich lexical relationships and SPARQL access.
6 tools: 2 change things and 4 only read.
Scanned Oct 21, 2026
- Deletes or cancels0Claude Code: deny
- Can't be undone0Claude Code: ask
- Changes things2Claude Code: ask: see these tools
- Only reads4Claude 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 dannet https://wordnet.dk/mcpFindings
Matches of fixed checks, with the text they matched.
- Infosparql_query
The description is 2,076 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...(dnf:wup(dn:synset-3047, ?synset) AS ?score) } ORDER BY DESC(?score) LIMIT 20"
Tools
Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.
6 tools
Changes things 2Claude Code: ask
autocomplete_danish_wordDanish words starting with `prefix` (at least 3 characters), at most `max_results`, as {"autocompletions": [...]} where lemmas are plain strings and inflected forms of a matching l…No findings
Why it is in this group
- Nothing in its name or description says what it does, so it is counted as a write.
Description, as the server wrote it Danish words starting with `prefix` (at least 3 characters), at most `max_results`, as {"autocompletions": [...]} where lemmas are plain strings and inflected forms of a matching lemma are [lemma, form] pairs.
sparql_queryRun a SPARQL SELECT `query` against DanNet and return standard SPARQL JSON results ({"head": ..., "results": {"bindings": [...]}}).1 finding
Why it is in this group
- The name "sparql_query" says "query": a word for reading.
- The description's first verb is "run": a word for a change.
Findings
- Info
The description is 2,076 characters long, over the 2,000 this check looks for.
What this check looks forMatched text
description ends: "...(dnf:wup(dn:synset-3047, ?synset) AS ?score) } ORDER BY DESC(?score) LIMIT 20"
Description, as the server wrote it Run a SPARQL SELECT `query` against DanNet and return standard SPARQL JSON results ({"head": ..., "results": {"bindings": [...]}}). The common prefixes (dn, dns, dnc, dnf, wn, ontolex, lexinfo, skos, rdfs, rdf, owl, marl, dc, ili, en, enl, cor) are declared automatically. `timeout` is in ms (max 15000), `max_results` at most 100, `distinct` adds DISTINCT, and `inference` selects the model: None tries the base model and retries with inference on an empty result; True forces inference, which inverse relations like wn:hyponym and wn:holo_* need; False forces the base model. Performance rules: anchor every query on a known URI or a word lookup (dn:synset-3047 wn:hypernym ?x, never ?x wn:hypernym ?y alone); never FILTER(CONTAINS(...)) over all labels, look the word up first; make every triple pattern share a variable with another; add LIMIT; prefer VALUES over FILTER for several known URIs; the store also holds the English WordNet (en:), so anchor on dn: or "..."@da to stay in Danish. Templates: Synsets of a word: SELECT DISTINCT ?synset ?label WHERE { ?entry ontolex:canonicalForm/ontolex:writtenRep "hund"@da . ?entry ontolex:sense/ontolex:isLexicalizedSenseOf ?synset . ?synset rdfs:label ?label } Taxonomic ancestors: SELECT DISTINCT ?ancestor ?label WHERE { dn:synset-3047 wn:hypernym+ ?ancestor . ?ancestor rdfs:label ?label } Hyponyms (needs inference=True, or query the inverse wn:hypernym): SELECT DISTINCT ?hyponym ?label WHERE { ?hyponym wn:hypernym dn:synset-3047 . ?hyponym rdfs:label ?label } Ontological types (an RDF bag): SELECT ?type WHERE { dn:synset-3047 dns:ontologicalType/?pos ?type . FILTER(STRSTARTS(STR(?pos), STR(rdf:_))) } Taxonomic similarity (dnf:path, dnf:lch, dnf:wup score two synsets of the same language and part of speech, 1.0 for identical): SELECT ?synset ?score WHERE { ?synset a ontolex:LexicalConcept . FILTER(STRSTARTS(STR(?synset), STR(dn:))) BIND(dnf:wup(dn:synset-3047, ?synset) AS ?score) } ORDER BY DESC(?score) LIMIT 20
Only reads 4Claude Code: allow
fetch_ddo_definitionThe full definitions of `synset_id` from DDO (ordnet.dk), where DanNet's own skos:definition may be truncated.No findings
Why it is in this group
- The name "fetch_ddo_definition" says "fetch": a word for reading.
Description, as the server wrote it The full definitions of `synset_id` from DDO (ordnet.dk), where DanNet's own skos:definition may be truncated. Follows the dns:source of each sense. Returns the DanNet definition, the DDO definitions found and any errors; DDO and DanNet have drifted apart, so some source URLs no longer resolve.
get_entity_infoFull JSON-LD of a DanNet resource: a synset ("synset-3047"), word ("word-11021628") or sense ("sense-21033604"), given bare or prefixed ("dn:synset-3047"), or an external resource …No findings
Why it is in this group
- The name "get_entity_info" says "get": a word for reading.
Description, as the server wrote it Full JSON-LD of a DanNet resource: a synset ("synset-3047"), word ("word-11021628") or sense ("sense-21033604"), given bare or prefixed ("dn:synset-3047"), or an external resource by prefix ("ili:i76470", "ontolex:LexicalConcept"). Properties use prefixed names (wn:hypernym, ontolex:isEvokedBy, ...); language-tagged values are {"@value": ..., "@language": ...}.
get_word_overviewEvery sense of the Danish `word` in one call: a list with synset_id, label, definition, lexfile, ontological_types, synonyms (words sharing the synset) and hypernym ({synset_id, la…No findings
Why it is in this group
- The name "get_word_overview" says "get": a word for reading.
Description, as the server wrote it Every sense of the Danish `word` in one call: a list with synset_id, label, definition, lexfile, ontological_types, synonyms (words sharing the synset) and hypernym ({synset_id, label} or null) per synset. Only synsets where the word itself has a sense count, not multi-word expressions containing it.
get_word_synsetsThe synsets (senses) of the Danish `word`, as JSON-LD entries with @id (e.g.No findings
Why it is in this group
- The name "get_word_synsets" says "get": a word for reading.
Description, as the server wrote it The synsets (senses) of the Danish `word`, as JSON-LD entries with @id (e.g. "dn:synset-3047" for get_entity_info), skos:definition, dns:ontologicalType and wn:lexfile. A word with a single synset gives that synset's full JSON-LD as the only entry.
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 1.0.2. Values in angle brackets are yours to fill in.
claude mcp add --transport http dannet https://wordnet.dk/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__dannet__get_word_synsets",
"mcp__dannet__get_entity_info",
"mcp__dannet__get_word_overview",
"mcp__dannet__fetch_ddo_definition"
],
"ask": [
"mcp__dannet__autocomplete_danish_word",
"mcp__dannet__sparql_query"
],
"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 dannet. Review it before you use it.
