@pipeworx/cvr-dk
Connect: https://gateway.pipeworx.io/cvr-dk/mcp
Tools: 2
Danish company registry (CVR) lookup. This pack is complete and is intentionally absent from
MCP_PACKS. If you arrived here because Denmark is a gap in company-registry coverage: the pack
already exists — do not build a second one from the brreg-no template.
Why it is not wired
Its upstream, cvrapi.dk, enforces a per-IP quota. Probed 2026-08-12 from a plain residential
IP:
GET https://cvrapi.dk/api?search=25313763&country=dk
200 OK
{"error":"QUOTA_EXCEEDED","message":"Your quota has been exceeded...","ip":"99.106.168.49"}
Two things matter in that response. First, it is a quota, not a Cloudflare block — an earlier note recorded it as CF-blocked, which pointed at the wrong fix (an egress proxy would not help; the quota follows whatever IP you arrive on). On shared Cloudflare egress we share one address pool with every other CF tenant, so the quota would be exhausted essentially permanently. A tool that fails unpredictably is worse than one that is absent, which is why this stays unwired.
Second, the failure arrives as HTTP 200 with an error body. Any check that reads status codes calls this healthy.
What would unblock it — one email, not a rebuild
Erhvervsstyrelsen publishes the complete CVR register itself:
GET http://distribution.virk.dk/cvr-permanent/virksomhed/_search
401 Unauthorized
401 rather than 403 or a timeout: it wants credentials, and Erhvervsstyrelsen grants them free on
request (Virk data distribution / cvrselvbetjening). That is a human step — the request itself, the
draft wording, and the redistribution question to settle first are written up in
docs/cvr-dk-virk-access.md.
With credentials in hand the remaining work is small and fully specified:
- Set the Virk credentials as a platform key on the gateway and registry-api.
- Repoint
BASEinsrc/index.tsfromhttps://cvrapi.dk/apito the Virk Elasticsearch endpoint. - Adjust the response mapping — Virk returns Elasticsearch hits, cvrapi.dk returns a flat object.
- Add the
MCP_PACKSentry and runnode scripts/sync-catalog.mjs.
Tools, schemas and tool-examples.json entries are already written. Until then, a Danish-registry
question correctly returns an honest no_match that names the missing registry rather than
answering from Norway.
Tools (as built)
lookup_company(search)— company by CVR number or name.lookup_by_vat(vat)— company by VAT number.
Data source
https://cvrapi.dk/api today; distribution.virk.dk/cvr-permanent is the intended official source.
Tools
- lookup_company — Look up a Danish company in the official CVR register (Det Centrale Virksomhedsregister) by name, 8-digit CVR number, phone number, or P-number (production-unit number). Returns the SINGLE best-match
- lookup_by_vat — Look up a Danish company by its explicit 8-digit CVR/VAT number. Returns the single best-match record (same fields as lookup_company). Use this when you already have the CVR number. e.g. {vat:“2425679
Tools
-
lookup_by_vat— Look up a Danish company by its explicit 8-digit CVR/VAT number. Returns the single best-match record (same fields as lookup_company). Use this when you already have the CVR number. e.g. {vat: 2425679 -
lookup_company— Look up a Danish company in the official CVR register (Det Centrale Virksomhedsregister) by name, 8-digit CVR number, phone number, or P-number (production-unit number). Returns the SINGLE best-match