Skip to main content
All CVR tools are read-only and are called via tools/call over POST /cvr/mcp. You need an active CVR subscription, and your user must hold a seat on it (the buyer gets one automatically; other users are assigned under Team in the portal, see Team). CVR is a managed connector: there is no connect step and nothing for the customer to authorize. Every read is a bounded query against the public CVR data from Erhvervsstyrelsen (the Danish Business Authority), and results are returned as compact, normalized JSON. In tools/list every tool has a title and the annotations readOnlyHint: true, destructiveHint: false and openWorldHint: false. A successful result contains the payload twice: as JSON text in content and as the same object in structuredContent. If your account has no CVR subscription, tools/list returns no tools, and the initialize result includes instructions explaining how to get access.
Endpoint: https://mcp.consile.ai/cvr/mcp. CVR is its own named connector: for a subscribed account, tools/list returns only the CVR tools below (all five, unless an administrator has limited which tools the user gets). Unlike the other connectors, this endpoint has no connect_account system tool, because there is no account to connect. Section headings use the bare tool name. In requests, always send the namespaced name (for example cvr__soeg_virksomhed); a bare name returns Unknown tool. CVR is single-instance: there are no additional portals and no cvr-2 endpoint.
This connector is read-only: every tool is a read and there is no write tool, so nothing is confirm-gated. There is no connect step, so the connector never asks you to reconnect. The subscription and the calling user’s seat are checked on every call. soeg_virksomhed, find_produktionsenheder and find_virksomheder_for_person return at most 50 entries per call.

Shared parameters and limits

integer
default:"10 or 50"
Max results to return, an integer from 1 to 50. Available on soeg_virksomhed, find_produktionsenheder and find_virksomheder_for_person. The default is 10 for soeg_virksomhed and find_virksomheder_for_person (where it caps the number of matched persons), and 50 for find_produktionsenheder. A numeric string such as "20" is accepted. A value outside 1..50 (e.g. 0 or 51), or a non-integer, is rejected, not clamped: the call returns isError: true with the generic text Tool invocation failed., so validate size before calling.
integer
required
Danish CVR number (8 digits), e.g. 12345678. A string is accepted and coerced to an integer. Required on hent_virksomhed, find_produktionsenheder and find_ejere. A number that matches no company gives { found: false, cvrNummer } from hent_virksomhed and find_ejere, and an empty list from find_produktionsenheder.
Requests to the endpoint are rate-limited per account and connector; see Errors & limits.
GDPR: the reklamebeskyttet (advertising-protection) flag is surfaced on every company and production-unit result and never hidden. CVR exposes no CPR numbers at all; persons are identified by Erhvervsstyrelsen’s internal enhedsNummer.

Companies

soeg_virksomhed

Search companies by their current name. Returns { total, companies: [...] }, where total is the full match count before the size cap and each entry is a company object. The search matches the company’s current name only (not former names, CVR number or address), and every word in query must match. Ceased companies are included, so check status. In search results kapital and kapitalValuta are always null; use hent_virksomhed for share capital.
string
required
Search text, typically a company name.
integer
default:"10"
Max results (1..50).

hent_virksomhed

Fetch one company’s current master data by CVR number. Returns a company object, or { found: false, cvrNummer } when no company has that CVR number. This is the only tool that returns share capital (kapital / kapitalValuta).
integer
required
CVR number, e.g. 12345678.

Production units

find_produktionsenheder

Find production units (P-numbers, physical operating sites) for a CVR number. Returns { total, units: [...] }, where each entry is a production-unit object. total is the full number of P-units; up to 50 are returned per call, and the rest cannot be fetched. A CVR number that matches no company returns { total: 0, units: [] }, not found: false.
integer
required
CVR number of the owning company.
integer
default:"50"
Max units (1..50).

Participants (owners and persons)

find_ejere

Find participants (owners, management, founders, legal and real owners, auditors) for a CVR number. Returns { cvrNummer, navn, antal, antalAktive, ejere: [...] }, or { found: false, cvrNummer } when no company has that CVR number. A company with no registered participants returns antal: 0 and an empty ejere array. The list is not capped: it holds every participant relation, active and historical, including auditors. antal counts all of them; antalAktive counts only participants with at least one active role that is not an auditor role (REVISION), so auditors and purely historical relations are excluded. Each ejere[] entry is a participant object.
integer
required
CVR number of the company whose participants you want.

find_virksomheder_for_person

Find the companies a person is or was a participant in, searched by person name. Returns { total, personer: [...] }, where total is the number of matching persons and each entry is a person object. The search matches all of a person’s registered names, and every word in navn must match, so several people with the same name can be returned. size caps the number of persons; each person’s list of companies is not capped. Company relations without a CVR number are left out. Each role carries an organisation name (the organ or register, e.g. Direktion, Bestyrelse, Stiftere, EJERREGISTER, Revision) and a separate funktion field holding the function within that organ (e.g. DIREKTØR, FORMAND or BESTYRELSESMEDLEM).
string
required
The person’s full name.
integer
default:"10"
Max matching persons (1..50).

Return shapes

All tools return a JSON object. Fields that CVR does not publish are null.

Company

Returned by soeg_virksomhed (in companies[]) and hent_virksomhed.

Employment

The beskaeftigelse object holds the newest figure across CVR’s monthly, quarterly and yearly employment series.

Production unit

Returned by find_produktionsenheder (in units[]): pNummer, navn, status (as published, e.g. Aktiv; note that this differs from the company status values), branchekode, branchetekst, adresse, beskaeftigelse and reklamebeskyttet.

Participant

Returned by find_ejere (in ejere[]). ejerandel and stemmeret hold only the current share, not historical shares. procent is normalized to 0-100 (or null when the raw value is not a single number), raavaerdi is the value exactly as published in CVR, and kilde names the register it came from (e.g. EJERREGISTER).

Person

Returned by find_virksomheder_for_person (in personer[]): enhedsNummer (never CPR), navn and virksomheder[]. Each company relation carries cvrNummer, navn, aktiv (true when the person currently holds at least one role there) and roller[] with organisation, funktion and aktiv. Person roles carry no dates.

Examples


Errors

Tool failures come back as a normal tools/call result with isError: true and a short text, not as a JSON-RPC error. Tool invocation failed. does not say which cause applies. First check the arguments against the schemas above; retrying only helps for a timeout or a temporary error from the data source. If the error persists, contact support@consile.dk. A user without a seat still sees the CVR tools in tools/list; only the calls are refused. Requests to the endpoint are also rate-limited per account and connector. When the limit is exceeded you get HTTP 429 (JSON-RPC error -32029, Retry-After: 1) instead of a tool result. See Errors & limits for the current limits.