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.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).
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 arenull.
Company
Returned bysoeg_virksomhed (in companies[]) and hent_virksomhed.
Employment
Thebeskaeftigelse object holds the newest figure across CVR’s monthly, quarterly
and yearly employment series.
Production unit
Returned byfind_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 byfind_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 byfind_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 normaltools/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.