Danish annual reports (CVR)

io.github.mikkelmanniche-dk由 GitHub 账号 mikkelmanniche-dk 发布v0.3.2更新于 Oct 24, 2026

Key figures, history and all tagged facts from Danish companies' annual reports (XBRL).

已验证STDIO仅桌面金融数据与分析

概览

AI 生成的概览

读取丹麦企业向丹麦商业管理局提交的年度报告(XBRL),按 CVR 编号返回关键财务数据、申报文件列表和标记事实。

可以做什么
  • 按公司名称或 CVR 编号查询公司,含状态、类型、行业和地址
  • 列出某 CVR 编号已发布的申报文件,按时间倒序并附文档链接
  • 获取最近一年及上一年的关键财务数据,可区分集团与母公司口径
  • 按报告年度获取最多 15 年的关键财务数据
  • 按概念名称筛选,取回报告中所有被标记的数值和文本事实
适用场景
需要丹麦公司的营收、权益、利润、资产或员工人数,或跨年度比较这些数据,又不想手工打开 XBRL 文件时适用。适合分析师、会计和从事丹麦企业数据的开发者。
运行要求
通过 npx 以 stdio 在本机运行,需要 Node.js 22.18 或更高版本,并能访问丹麦商业管理局的申报索引和文档。无需 API 密钥;名称搜索可选使用 CVR_USER 和 CVR_PASSWORD 环境变量,凭据可免费申请。
安装前请注意
可选的 CVR_USER 和 CVR_PASSWORD 凭据会以明文 HTTP 发送、不经加密,因为该登记系统只支持这种方式;它们仅提供公开公司数据的读取权限。所有工具均为只读。覆盖范围限于提交机器可读年度报告的公司,申报文件属第三方公开数据,使用前应自行确认其使用条款。

安装

在 SourceWeft 中

  1. 打开 控制台中的 Danish annual reports (CVR),将其添加到工作区。
  2. 为需要使用其工具的对话启用该服务。

Desktop only,通过 STDIO。 STDIO 服务会启动本地进程,因此需要 SourceWeft 桌面宿主。

其他 MCP 客户端

参照 仓库 中的启动说明。

README

dk-regnskab-mcp

[CI] [Release] [License: MIT]

Give Claude (or any MCP client) the published annual reports of Danish companies: key figures for the latest year and the year before, read straight from the XBRL filings at the Danish Business Authority (Erhvervsstyrelsen). No API key needed.

Works for small companies (Danish GAAP) and listed ones (IFRS/ESEF, back to 2015), separates group and parent figures in group reports, and explains gaps instead of guessing. Tested live against about 300 real filings.

"What were revenue and equity for CVR 24256790 last year, and how did they change?"

Quickstart

Requires Node.js 22.18 or newer. No API key needed.

Claude Code

bash
claude mcp add dk-regnskab -- npx -y dk-regnskab-mcp

Claude Desktop: add this to claude_desktop_config.json:

json
{  "mcpServers": {    "dk-regnskab": { "command": "npx", "args": ["-y", "dk-regnskab-mcp"] }  }}

Cursor: the same block goes in ~/.cursor/mcp.json (or .cursor/mcp.json in a project). Other MCP clients: run npx -y dk-regnskab-mcp over stdio.

From source

bash
git clone https://github.com/mikkelmanniche-dk/dk-regnskab-mcpcd dk-regnskab-mcp && npm install && npm run buildclaude mcp add dk-regnskab -- node /absolute/path/to/dk-regnskab-mcp/dist/index.js

Tools

ToolInputReturns
search_companyquery (name or CVR number), optional limitMatching companies with CVR number, status, company type, industry, address and employee size band; active, exactly named and larger companies first. Needs CVR credentials, see below
list_filingscvr, optional limit (1–50), optional yearPublished filings, newest first, with document links
get_financialscvr, optional year (the year the reporting period ends in), optional scope (group or parent)Company name, period, currency, auditor, key figures (current and previous year), whether it is a group report, notes on gaps, source document URL
get_financials_historycvr, optional years (1–15), optional scopeKey figures per reporting year, newest first
get_report_factscvr, optional year, scope, match (part of a concept name), limitEvery figure and text tagged in the annual report, e.g. staff costs or dividends

All tools are read-only, declare an output schema and return structured content.

Key figures: revenue, gross profit, operating profit, profit before tax, profit for the year, average employees, total assets, current assets, cash, equity, liabilities.

Company name search (optional)

search_company uses the CVR register, which requires system-to-system credentials. They are free: apply at the Danish Business Authority, then pass them to the server:

bash
claude mcp add dk-regnskab -e CVR_USER=... -e CVR_PASSWORD=... -- npx -y dk-regnskab-mcp

Everything else works without them. Note that the register, like the filing index, only answers over plain HTTP, so the credentials are sent unencrypted. They only give read access to public company data.

How it works

mermaid
flowchart LR  C[Claude / MCP client] -- stdio --> S[dk-regnskab-mcp]  S -- "search by CVR" --> I[(distribution.virk.dk<br/>filing index)]  S -- "download XBRL (gzip)" --> D[(Filing documents)]  S --> P[Parse contexts & facts<br/>by namespace, not prefix]  P --> F[Key figures + notes]

Pitfalls it handles

Real Danish filings are messier than the taxonomy suggests. The parser was built against actual filings:

  • Dimensional facts are not totals. A filing reports equity once in total and again per component (share capital, retained earnings). Only dimensionless contexts are used, so share capital is never reported as equity.
  • Conflicting values. Some filings report two different values for the same fact and period (e.g. 0 and 1 employees). The figure is left empty with a note instead of guessed.
  • Missing revenue is usually legal. Most small companies (reporting class B) may omit revenue and report gross profit. The result says so.
  • Namespace prefixes vary between filings, so concepts are matched by namespace URI.
  • Documents are gzip-compressed without saying so. Detected by magic bytes.
  • The document named "AARSRAPPORT" is not always the one with the numbers. Every XML document in a filing is parsed, and the one that yields the most figures wins.
  • Group reports hold two sets of figures. A parent company's report often includes the consolidated group too, and Danish GAAP and IFRS mark them in opposite ways. The group is returned by default; scope: "parent" gives the parent alone. Mixing them up can turn a group loss into a parent profit.
  • Balance check. If total assets don't equal liabilities and equity for the chosen scope, the result says so.
  • A last quarter next to the full year. Some annual reports also tag Q4, with the same end date as the year. The longest period wins.
  • Three generations of IFRS. ESEF (2021 onwards), the Danish IFRS extension before that (revenue as NetSales), and the 2011 IFRS taxonomy in filings before 2016. All three are read.
  • Currency comes from the figures themselves. Maersk reports in USD but mentions DKK elsewhere in the filing.
  • Old reports sit far down the list. Listed companies publish 4–5 filings a year, so a chosen year is filtered in the index, not in the first page of results. Interim reports that carry an annual-report document are skipped.
  • Company details can live in a sibling document, and some filers put HTML inside the company name. Both are handled.

Limitations

  • Name search needs CVR credentials (free, but you have to apply). Without them, look up the CVR number yourself, e.g. on datacvr.virk.dk.
  • Only companies that file machine-readable annual reports. Sole proprietorships and some other company types don't.
  • Only what the filer tagged: get_report_facts returns the tagged statements and details, not the untagged text of the notes or management's review.
  • IFRS filings don't tag the number of employees (it is text in the notes), so employees is empty for them.
  • The filing index answers over plain HTTP only, so the server must run locally or server-side, not in a browser.
  • Data terms: the filings are public data from the Danish Business Authority. Check their terms of use for your use case; this project does not make claims about them.

Tested against real filings

npm run measure runs the real tool path against about 300 companies that filed in the last year, plus a fixed set of large ones (LEGO, Arla, Carlsberg, Maersk, Novo Nordisk, older IFRS years, and a group report with both scopes). It needs network access and is not part of npm test.

Run on 25 September 2026 (v0.3.0): 311 lookups, 309 parsed, 2 companies without an XBRL annual report, 0 errors, 0 balance mismatches, median 118 ms per lookup.

Development

bash
npm test          # parser tests against synthetic fixtures (no network)npm run measure   # live check against real filings (network)npm run typechecknpm run buildnpm run ci         # typecheck + test + build, som CI

Run npm run ci before merging; it mirrors .github/workflows/ci.yml. CI tests on Node 22 and 24; locally it runs on whichever Node you have.

Roadmap

  • Company name search via the CVR register
  • Multi-year history in one call
  • Published to npm and the official MCP Registry

License

MIT. Built by Mikkel Manniche.

来源:README.md,提交 bcdf4f8

工具

0
SourceWeft 尚未在沙箱中启动过该软件包,因此其工具未知。

版本历史

2
  1. v0.3.2最新Oct 3, 2026
  2. v0.3.1Sep 25, 2026

评分

已满足适用检查项的 50%

该评分衡量此收录条目的完整程度,依据注册中心条目、端点与公开来源计算得出。它不是对服务器本身的评价,也不表示服务器安全或当前可用:可连通性是带日期的检查结果,评分也不包含安装量或用户评价。

  • 近 30 天内可连通25 分

    请保持端点能够响应 MCP 握手;SourceWeft 每 30 天探测一次。

  • 已声明认证方式10 分

    请在注册中心条目中声明凭据请求头,或保持端点能够响应探测,以便判定其认证方式。

  • 已列出工具15 分

    请让服务器在无凭据时响应 tools/list,或发布可在沙箱中无凭据启动的软件包。

  • 描述必需15 分
  • 图标10 分
  • 文档15 分
  • 许可证10 分