Skip to main content
Glama

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)

codepilots-io/cvrlookup-mcp MCP server

Tools

Tool

What it does

Plan

lookup_company

Full company record by 8-digit CVR number (name, address, status, industry, management, registration history)

Free

search_companies

Search companies by name, paginated

Free

get_company_financials

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-mcp

Without 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

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 tools
get_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).

ParametersJSON Schema
NameRequiredDescriptionDefault
cvrYesThe 8-digit Danish CVR number, e.g. "37520556"

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
cvrYesThe 8-digit Danish CVR number, e.g. "37520556"

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results (default 10)
queryYesCompany name or name fragment to search for

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 3 tool updatesv1.0.0
    • First observedget_company_financials
    • First observedlookup_company
    • First observedsearch_companies

TDQS

A4.2/5.0

Scored across 3 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP 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.
    19
    9
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables querying the Danish Central Business Register (CVR) for company data through an MCP server.
    5 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    MCP server for the Finnish Business Register (PRH/YTJ). Look up any Finnish company by Business ID (Y-tunnus) or name.
    4 npm
    MIT