cvrlookup-mcp
cvrlookup MCP server
Remote MCP server for the Danish company register (CVR): look up any of 860,000+ active Danish companies, search by name, and get parsed annual-report financials as structured JSON — sourced live from Erhvervsstyrelsen's public registry.
Endpoint: https://cvrlookup.dk/api/mcp (Streamable HTTP, stateless JSON-RPC)
Tools
Tool | What it does | Plan |
| Full company record by 8-digit CVR number (name, address, status, industry, management, registration history) | Free |
| Search companies by name, paginated | Free |
| Up to 5 years of parsed annual-report key figures (revenue, profit, equity, solvency…) as JSON, parsed from XBRL filings | Pro |
Related MCP server: aria-mcp-cvr-dk
Setup
Authentication is a Bearer API key — the same key as the REST API. A free key includes 1,000 calls/month, no credit card: cvrlookup.dk → sign up → dashboard → API key.
Example client config:
{
"mcpServers": {
"cvrlookup": {
"type": "http",
"url": "https://cvrlookup.dk/api/mcp",
"headers": {
"Authorization": "Bearer cvr_your_api_key"
}
}
}
}Try it without signing up: the docs include a synthetic test mode
(cvr_test_demo key, fixture data) — see
cvrlookup.dk/dokumentation.
Local stdio server
The hosted endpoint above needs nothing installed. For stdio-only clients (or to run it yourself), this repo is also a standalone MCP server backed by the same API:
{
"mcpServers": {
"cvrlookup": {
"command": "npx",
"args": ["-y", "github:codepilots-io/cvrlookup-mcp"],
"env": { "CVR_API_KEY": "cvr_your_api_key" }
}
}
}Or with Docker:
docker build -t cvrlookup-mcp .
docker run -i --rm -e CVR_API_KEY=cvr_your_api_key cvrlookup-mcpWithout CVR_API_KEY it runs in test mode (cvr_test_demo): fixture
data marked mode: "test", no signup — magic CVRs 10000001 (active),
10000002 (dissolved), 99999999 (not found).
More
Setup guide: cvrlookup.dk/mcp
REST API + OpenAPI: cvrlookup.dk/openapi.json
LLM-friendly overview: cvrlookup.dk/llms.txt
Uptime: cvrlookup.dk/status
Rate limits and monthly quotas follow your plan (Free 1,000 / Basic 25,000 / Pro 100,000 calls per month). Data is fetched live from the official Danish business registry; financials are parsed server-side from published XBRL filings.
Available Tools
3 toolsget_company_financialsA
Get up to 5 years of key financial figures for a Danish company, parsed from its published XBRL annual reports: gross profit, net result, equity, total assets, and employees per reporting period. Requires a Pro-plan API key (the cvr_test_demo key returns fixture data).
| Name | Required | Description | Default |
|---|---|---|---|
| cvr | Yes | The 8-digit Danish CVR number, e.g. "37520556" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it delivers useful context: data is parsed from XBRL annual reports, limited to 5 years, and the Pro-plan API key requirement is disclosed. It also notes that the demo key returns fixture data, which is a practical behavioral detail. It does not mention error cases or data availability gaps, but the disclosed traits are substantial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. The first sentence front-loads the core action and includes the returned metrics; the second concisely covers the auth prerequisite. Every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with no output schema, the description is largely complete: it states the input (cvr), the output (five specific financial metrics), the time range, data source, and access requirement. It does not describe the response envelope or formatting, but the listed metrics give an agent enough to understand what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents the single parameter 'cvr' with an 8-digit pattern and example, so schema description coverage is 100%. The description adds no extra parameter-level detail beyond labeling the company as Danish. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('get') and resource ('financial figures for a Danish company'), and enumerates the exact metrics returned. It does not explicitly name sibling tools or draw a contrast with lookup_company/search_companies, but the focus on XBRL financials makes the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its use case: retrieving multi-year financial metrics from annual reports. It does not, however, provide explicit guidance on when to choose this over lookup_company or search_companies, nor state any exclusions. The auth requirement is mentioned, which helps operational usage, but not tool-selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_companyA
Look up the full record for a Danish company by its 8-digit CVR number: name, address, status, company type, industry, share capital, owners, management, and founding date. Sourced live from the official Danish business registry (Erhvervsstyrelsen).
| Name | Required | Description | Default |
|---|---|---|---|
| cvr | Yes | The 8-digit Danish CVR number, e.g. "37520556" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. The verb 'look up' implies a read-only operation, and 'sourced live from the official Danish business registry' addus useful provenance and freshness context. However, it does not explicitly state that no data is modifed, nor how missing CVR numbers are handeled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The action and identifier are front-loaded, and the list of returned fields is compact and informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter lookup with no output schema, the description adequately covers the input condition, the output contents, and the data source. The only minor gap is edge-case behavior such as a CVR number that is not found, which is secondary for a straightforward read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents cvr with type, pattern, and an example. The description adds no new parameter semantics beyond repeating '8-digit CVR', so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Look up) and resource (full record for a Danish company by its 8-digit CVR number), then enumerates the record contents, including owners, management, and share capital. The field list clearly diferentiates it from search_companies and get_company_financials.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when an 8-digit CVR number is available and a full record is needed, but it gives no explicit when-to-use vs alternatives. It does not mention that search_companies is for name-based or fuzzy searches, nor that get_company_financials is the choice for financial statements.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_companiesA
Search Danish companies by name. Returns matching companies with their CVR number, name, status, and address; use lookup_company on a hit for the full record.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results (default 10) | |
| query | Yes | Company name or name fragment to search for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It reports the return fields and the search-by-name behavior, but does not mention match semantics (exact vs fragment), ordering, pagination, or error behavior. For a search tool this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one concise sentence that states the tool's action, return value, and the follow-up routing to lookup_company. Every clause earns its place and there is no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is low-complexity with two parameters and no output schema, and the description provides the essential output fields togeer with a clear next-step alternative. It does not describe pagination or total result counts, but these are not critical for a basic search tool and the limit parameter is already in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already well documented (query and limit with defaults/maximum). The description adds no extra meaning beyond clarifying that the search is by name, which is already implied by the query parameter's description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Search'), a clear resource ('Danish companies'), and specifies the key fields returned (CVR number, name, status, address). It also distinguishes itself from lookup_company by explicitly pointing to that tool for the full record.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete guidance: use lookup_company on a hit for the full record. It does not explicitly address when to prefer get_company_financials, but the sibling's name and the tool's own focus make that distinction reasonably clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v1.0.0- First observed
get_company_financials - First observed
lookup_company - First observed
search_companies
TDQS
Scored across 3 tools
Each tool has a distinct purpose: search by name, lookup by CVR, and retrieve financials. There is no meaningful overlap between the full-company record and the financial-history endpoint.
All tool names use a clear snake_case action_noun pattern. The verbs differ (lookup, search, get) and the object forms vary between singular and plural, but the naming is still predictable and readable.
Three tools is a well-scoped set for a focused CVR lookup server. Each tool covers a distinct, necessary capability without redundant or excessive additions.
The surface covers the core workflow: find a company by name, retrieve its full registry record, and access historical financials. For a read-only public-registry lookup service, there are no obvious missing operations.
Maintenance
Related MCP Connectors
Nordic company intelligence: look up companies, AI summaries, scores and signals via MCP.
CVR — Det Centrale Virksomhedsregister (Danish Central Business Register) MCP.
Remote MCP server to enrich company profiles with structured B2B data and confidence scores.
Danish address & property lookup: BBR, Matriklen, DAR, CVR. A DAWA/Datafordeler-compatible source.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMCP server for Nordic company registries. Verify companies, check board members, signing authority, and financial data across Norway, Denmark, Finland, and Sweden using official public APIs. 23 tools covering search, details, roles, and batch lookups.199Apache 2.0
- AlicenseAqualityCmaintenanceEnables looking up Danish companies by CVR number, name, or phone via cvrapi.dk.2MIT
- AlicenseNot gradedqualityCmaintenanceEnables querying the Danish Central Business Register (CVR) for company data through an MCP server.5 npmMIT
- AlicenseNot gradedqualityCmaintenanceMCP server for the Finnish Business Register (PRH/YTJ). Look up any Finnish company by Business ID (Y-tunnus) or name.4 npmMIT