PluginBench
MCP Server
Active
MIT

io.github.kuhumcst/dannet MCP Server

io.github.kuhumcst/dannet

Danish WordNet with rich lexical relationships and SPARQL access via MCP.

What is the io.github.kuhumcst/dannet MCP server?

DanNet is a WordNet for the Danish language built on RDF and accessible through the Model Context Protocol (MCP). It provides semantic relationships between Danish words and concepts, queryable via SPARQL or integrated directly into AI tools like Claude.

DanNet is a comprehensive lexical database for Danish that maps words to their meanings and relationships. It's useful for natural language processing, semantic search, linguistic research, and AI applications that need to understand Danish vocabulary and word relationships. You can query it through Claude or other MCP-compatible AI tools, browse it at wordnet.dk, or download datasets in multiple formats (RDF, CSV, WN-LMF, DMLex).

How to install io.github.kuhumcst/dannet

Copy-paste configuration for popular MCP clients.

transport: http
Config generated by PluginBench — verify against the source before use.
~/.cursor/mcp.json
{
  "mcpServers": {
    "dannet": {
      "url": "https://wordnet.dk/mcp"
    }
  }
}

Tools & capabilities

Tools this server exposes to the agent.

  • SPARQL Query — Query DanNet's RDF graph using SPARQL to explore lexical relationships, synsets, and semantic connections.
  • Synset Lookup — Look up Danish words and retrieve their synsets (sets of synonymous words) and definitions.
  • Lexical Relations — Explore relationships between words including hypernyms, hyponyms, meronyms, holonyms, and other semantic relations.
  • Similarity Functions — Calculate synset similarity using custom SPARQL functions (path-based, Leacock-Chodorow, Wu-Palmer metrics).

Use cases

  • Find synonyms and related words for Danish vocabulary in NLP applications
  • Perform semantic search and similarity matching across Danish text
  • Analyze word relationships and hierarchies for linguistic research
  • Integrate Danish language understanding into AI applications via Claude or other MCP clients
  • Build Danish language tools that need access to a comprehensive lexical database

io.github.kuhumcst/dannet MCP server FAQ

What is DanNet?

DanNet is a WordNet (lexical database) for Danish built on RDF standards. It contains synsets (groups of synonymous words), word senses, and rich semantic relationships, accessible via SPARQL queries or through the MCP protocol.

Is DanNet free to use?

Yes, DanNet is open-source and freely available. You can browse it at wordnet.dk, download datasets from the releases page, or query it via the MCP server at https://wordnet.dk/mcp.

How do I connect DanNet to Claude Desktop?

Go to Settings > Connectors > Browse Connectors, click 'add a custom one', enter a name like 'DanNet', and paste the MCP server URL: https://wordnet.dk/mcp.

What data formats does DanNet support?

DanNet is available in RDF (Turtle, native format), CSV, WN-LMF (XML), and DMLex (XML/JSON). The RDF format includes all data; other formats may exclude some relations.

What are the memory requirements?

DanNet uses approximately 1.5 GB when idle and 3 GB when rebuilding the database. A server should have at least 4 GB of available RAM.

Can I query DanNet from Python?

Yes, you can use the Python `wn` library to load the WN-LMF format and query synsets, definitions, and relationships programmatically.

README (reference)

Source of truth, from the repository.

DanNet logo

DanNet is a WordNet for the Danish language. DanNet uses RDF as its native representation at both the database level, in the application space, and as its primary serialisation format.

Table of Contents

Dataset Formats

DanNet is available in multiple formats to maximise compatibility:

FormatDescription
RDF (Turtle)Native representation. Load into any RDF graph database (such as Apache Jena) and query with SPARQL.
CSVPublished with column metadata as CSVW.
WN-LMFXML format compatible with Python libraries like wn.
DMLexOASIS DMLex 1.0 representation as both XML and JSON, in a Danish and an English variant. The DMLex browser shows it as a dictionary.

Example: Using DanNet with Python

import wn

wn.add("dannet-wn-lmf.xml.gz")

for synset in wn.synsets('kage'):
    print((synset.lexfile() or "?") + ": " + (synset.definition() or "?"))

Differences Between Formats

While every format includes all synsets/senses/words, the CSV, WN-LMF and DMLex variants do not include every data point:

  • CSV: Some data is lost when converting from an open graph to fixed tables.
  • WN-LMF: Only official GWA relations are included per the standard (proprietary DanNet relations from the DanNet schema are excluded).
  • DMLex: Combines DanNet with COR, DDS and COR.SEM in one file. Relations to other datasets are not included. See doc/dmlex/plan.md for the conversion rules.

For the complete dataset, use the RDF format or browse at wordnet.dk.

Companion Datasets

Several companion datasets expand the RDF graph with additional data:

DatasetDescription
CORLinks DanNet resources to IDs from the COR project.
DDSAdds sentiment data to DanNet resources.
OEWN extensionProvides DanNet-style labels for the Open English WordNet to facilitate browsing connections between the two datasets.

Inferred Data

Additional data is implicitly inferred from the base dataset, companion datasets, and ontological metadata. These inferences can be browsed at wordnet.dk. Releases containing fully inferred graphs are specifically marked as such.

Standards

DanNet is based on the Ontolex-lemon standard combined with relations defined by the Global Wordnet Association as used in the official GWA RDF standard.

Ontolex-lemon classRepresents
ontolex:LexicalConceptSynsets
ontolex:LexicalSenseWord senses
ontolex:LexicalEntryWords
ontolex:FormForms

Ontolex-lemon representation

URI Prefixes

PrefixURIPurpose
dnhttps://wordnet.dk/dannet/data/Dataset instances
dnchttps://wordnet.dk/dannet/concepts/Ontological type members
dnshttps://wordnet.dk/dannet/schema/Schema definitions
dnfhttps://wordnet.dk/dannet/function/Custom SPARQL functions (dnf:path, dnf:lch, dnf:wup synset similarity)

All DanNet URIs resolve to HTTP resources. Accessing one of these URIs via a GET request returns the data for that resource.

Schemas

DanNet has proprietary relations defined in the DanNet schema in an Ontolex-compatible way. There is also a schema for EuroWordNet concepts. Both schemas follow the RDF conventions listed by Philippe Martin.

LLM Integration

DanNet can be connected to AI tools like Claude via MCP (Model Context Protocol).

  • MCP server URL: https://wordnet.dk/mcp
  • Registry ID: io.github.kuhumcst/dannet

To connect in e.g. Claude Desktop: go to Settings > Connectors > Browse Connectors, click "add a custom one", enter a name (e.g., "DanNet") and the MCP server URL.

Claude Desktop setup

Once connected, you can query DanNet's semantic relations directly through Claude.

Implementation

The database backend is Apache Jena, a mature RDF triplestore with OWL inference support. When represented in Jena, DanNet's relations form a queryable knowledge graph. DanNet is developed in Clojure, using libraries like Aristotle to interact with Jena.

See rationale.md for more on the design decisions.

Full Production Setup

The production deployment at wordnet.dk consists of three services managed via Docker Compose:

  • DanNet — the Clojure/ClojureScript web application
  • MCP server — a Python-based MCP server providing LLM access to DanNet
  • Caddy — reverse proxy handling HTTPS and routing

Clojure Support

DanNet can be queried in various ways from Clojure (see queries.md). Apache Jena transactions are built-in and enable persistence via the TDB 2 layer.

Web Application

The frontend is written in ClojureScript using Rum, served by Pedestal. The app works both as a single-page application (with JavaScript) and as a regular HTML website (without). Content negotiation serves different representations (HTML, RDF, Transit+JSON) based on the request.

See doc/web.md for details.

Bootstrap Process

New releases are bootstrapped from the preceding release. The process (in dk.cst.dannet.db.bootstrap):

  1. Load and clean the previous version's RDF data
  2. Convert to triples using the current schema
  3. Import into Apache Jena graphs and apply release changes (only when cutting a release, i.e. when to differs from from)
  4. Infer additional triples via OWL/RDFS schemas
  5. Export the final RDF dataset (see Database Release Workflow)

Bootstrap data lives under ./bootstrap relative to the execution directory: the DanNet release assets in ./bootstrap/from/<version>/ (named after the release being bootstrapped from, so several can coexist) and the shared English datasets in ./bootstrap/other/english/. Missing files are downloaded automatically, so manual placement is only needed when working offline.

Setup

DanNet requires Java and Clojure's official CLI tools. Dependencies are specified in deps.edn.

Development

  1. Start the web service using (restart) in dk.cst.dannet.web.service — available at localhost:3456
  2. Run the frontend with shadow-cljs:
    npx shadow-cljs watch app
    

Testing a Release Build

Using Docker (requires Docker daemon running):

# From the docker/ directory
docker compose up --build

Or manually:

shadow-cljs --aliases :frontend release app
clojure -T:build org.corfield.build/uber :lib dk.cst/dannet :main dk.cst.dannet.web.service :uber-file "\"dannet.jar\""
java -jar -Xmx4g dannet.jar

Memory Requirements

The system uses ~1.5 GB when idle and ~3 GB when rebuilding the database. A server should have at least 4 GB of available RAM.

Validating RDF (SHACL)

The dn: dataset is validated against SHACL shapes located in resources/schemas/internal/shapes/ (see dk.cst.dannet.db.shapes). This happens in several ways:

  • a non-fatal check of the asserted graph runs asynchronously at every boot, logging violations and comparing counts to a known baseline,
  • RDF exports of the dn: dataset are gated: a baseline regression aborts the export, and
  • fixture-based tests run via clojure -X:test, which is also executed by the GitHub Actions workflow in .github/workflows/test.yml.

Validating WN-LMF

python3 -m venv examples/venv
source examples/venv/bin/activate
python3 -m pip install wn
python -m wn validate --output-file examples/wn-lmf-validation.json export/wn-lmf/dannet-wn-lmf.xml

Validating DMLex

The validator in dk.cst.dannet.db.export.dmlex-validate checks both serializations of a variant against the official DMLex schemas. It needs the :validate alias:

clojure -M:validate -e "((requiring-resolve 'dk.cst.dannet.db.export.dmlex-validate/validate-dmlex!) \"export/dmlex/\" \"da\")"

Deployment

The production server at wordnet.dk runs as a systemd service delegating to Docker.

Service Setup

cp system/dannet.service /etc/systemd/system/dannet.service
systemctl enable dannet
systemctl start dannet

Updating the Web Service

To update the web service software without changing the database:

# From the docker/ directory
docker compose up -d dannet --build

Database Release Workflow

When releasing a new version of the database:

  1. Set to in dk.cst.dannet.release to the new version, leaving from on the release being bootstrapped from. The release-specific changes in make-release-changes! only run once the two differ.

  2. Build the database via REPL in dk.cst.dannet.web.service:

    (restart)
    
  3. Generate the export artifacts, each in its own namespace:

    (dk.cst.dannet.db.export.rdf/export-rdf! @dk.cst.dannet.web.resources/db)
    (dk.cst.dannet.db.export.csv/export-csv! @dk.cst.dannet.web.resources/db)
    (dk.cst.dannet.db.export.wn-lmf/export-wn-lmf! "export/wn-lmf/")
    (dk.cst.dannet.db.export.dmlex/export-dmlex-variants! "export/dmlex/" @dk.cst.dannet.web.resources/db)
    ;; ~6 minutes
    (dk.cst.dannet.db.query/save-synset-indegrees!
      (:graph @dk.cst.dannet.web.resources/db))
    

    This writes export/rdf/ (dannet.zip, cor.zip, cor-sem.zip, framenet.zip, dds.zip, oewn-extension.zip), export/csv/dannet-csv.zip, export/wn-lmf/dannet-wn-lmf.xml.gz, export/dmlex/ (dannet-dmlex-da.zip, dannet-dmlex-en.zip) and export/synset-indegree.edn. These ship to production (step 7) and become the GitHub release assets that the next cycle bootstraps from (step 4).

  4. Publish a GitHub release tagged v<version> and attach the bootstrap assets listed by bootstrap-files in dk.cst.dannet.db.bootstrap.downloads: dannet.zip, cor.zip, dds.zip, oewn-extension.zip and synset-indegree.edn. The next cycle fetches these from GitHub.

  5. Compact the database, then zip it on the dev machine, ready for transfer:

    (dk.cst.dannet.db/compact! (:dataset @dk.cst.dannet.web.instance/db))
    

    TDB2 only reclaims the space left by in-place updates when compacted, and writes a new Data-000N generation, so restart the service afterwards. Before transferring, check that the database size divided by the triple count is in the hundreds of bytes, not the thousands.

  6. Stop the service on production:

    docker compose stop dannet
    
  7. Transfer database and export files via SFTP, then:

    unzip -o tdb2.zip -d /dannet/db/
    mv cor.zip cor-sem.zip framenet.zip dannet.zip dds.zip oewn-extension.zip /dannet/export/rdf/
    mv dannet-csv.zip /dannet/export/csv/
    mv dannet-wn-lmf.xml.gz /dannet/export/wn-lmf/
    mv dannet-dmlex-da.zip dannet-dmlex-en.zip /dannet/export/dmlex/
    
  8. Ship the export/synset-indegree.edn generated in step 3. Production runs with --no-bootstrap and so never downloads it, but it is read at query time to rank search results and entity relations, and it should describe the database actually being shipped. Either location works, the first taking precedence (see indegrees-files in dk.cst.dannet.db.query):

    mv synset-indegree.edn /dannet/db/                      # legacy location
    mv synset-indegree.edn /dannet/bootstrap/from/2026-08-03/   # alongside the bootstrap inputs
    

    If neither exists the service still starts and search still works, but results come back unranked and a :dannet.query/indegrees-unavailable error is logged.

  9. Restart:

    docker compose up -d dannet --build
    
  10. Bump from to the new version and delete to, which then defaults to from again. Clear out the release-specific block in make-release-changes!: its changes have now shipped. This readies the next cycle.

Related MCP servers

ZOZotero MCP logo

Search your Zotero library and retrieve item metadata and full text within AI assistants.

161
Python
MIT
View repository →

Discover Kujo projects, tools, skills, workflows, and installation guidance with read-only tools.

0
JavaScript
MIT
View repository →
KUKultur.dev logo

Kultur.dev

Maintained

Cultural Intelligence Infrastructure for AI Agents — 200+ markets, 15 tones, 8 tools

0
MIT
View repository →
WEWeather MCP logo

Weather MCP

Maintained

An MCP server for weather information by @kulybaba

0
TypeScript
View repository →

An MCP server for weather information by @kulybaba

0
TypeScript
View repository →

Network diagnostics from 6 global regions. SSL, DNS, ping, whois, traceroute, port scan, latency.

0
JavaScript
MIT
View repository →