bildata

Danish vehicle registration tax (registreringsafgift) calculator and DMR registration statistics

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
87%
Naming quality
97%
Poisoning risk
80%
Permission match
100%
Protocol compliance
100%

Findings (2)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains URL to non-standard domainin get_afgift_rates

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,755Tokens (tool definitions)
~3.3 KBTypical response size
Significant attention impact (2.15% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "bildata": {
      "url": "https://bildata.io/mcp"
    }
  }
}

Remote endpoints

https://bildata.io/mcpstreamable-http

What it can do

Tool inventory

Tools (6)

🟒 Read-only🟑 WriteπŸ”΄ Deleteβšͺ Unknown
🟑calculate_registreringsafgift(vehicleType, condition, bruttovaerdi, handelspris, nypris, ...)

Calculate DANISH vehicle registration tax (registreringsafgift) for a new or used personbil, varebil or motorcykel under registreringsafgiftsloven. Same engine and validation as bildata.io's public calculator. Amounts in DKK; an estimate, not an official Motorstyrelsen valuation. REQUIRED PAIRS: condition="new" needs bruttovaerdi; condition="used" needs handelspris AND nypris (nypris is the used vehicle's own original price when new, not the new-vehicle price field). ALWAYS send co2 for a petrol, diesel or hybrid PERSONBIL or VAREBIL: an omitted co2 counts as 0 g/km, i.e. battery-electric, and makes the tax far too low with no error raised β€” zero on an ordinary car, and still only a fraction of the real figure on an expensive one. On motorcykel co2 does not select the drivetrain at all - isElectric does. Send every number as a JSON number (300000, not "300000"), use enum values exactly as listed, and OMIT an optional field you do not know rather than sending null.

Input Schema

{
  "type": "object",
  "properties": {
    "vehicleType": {
      "type": "string",
      "enum": [
        "personbil",
        "varebil",
        "motorcykel"
      ],
      "description": "Vehicle category under Danish law"
    },
    "condition": {
      "type": "string",
      "enum": [
        "new",
        "used"
      ],
      "description": "new = first registration of a new vehicle; used = import/revaluation of a used vehicle"
    },
    "bruttovaerdi": {
      "type": "number",
      "description": "New vehicles: REQUIRED when condition=\"new\" (unused when condition=\"used\"). Taxable value in DKK, i.e. price incl. VAT and margin BEFORE registration tax. NOT the advertised Danish showroom price, which already contains the tax being calculated."
    },
    "handelspris": {
      "type": "number",
      "description": "Used vehicles: REQUIRED when condition=\"used\". Current Danish trade price in DKK, incl. registration tax. Unused when condition=\"new\"."
    },
    "nypris": {
      "type": "number",
      "description": "Used vehicles: REQUIRED when condition=\"used\". The SAME vehicle's original price as new in DKK, incl. all taxes. Unused when condition=\"new\" β€” for a new vehicle use bruttovaerdi."
    },
    "co2": {
      "type": "number",
      "description": "WLTP CO2 in g/km. PERSONBIL and VAREBIL: send it for any fuel-burning vehicle - an omitted value and an explicit 0 are BOTH read as battery-electric (EV phase-in and EV bundfradrag), which makes the tax far too low. Use 0 only for a pure EV. MOTORCYKEL: co2 does not select the drivetrain here; isElectric does, and a motorcykel sent with co2=0 and no isElectric is priced as fuel-burning."
    },
    "elForbrug": {
      "type": "number",
      "description": "Electric consumption in Wh/km. Send WITH elRaekkevidde β€” the battery deduction is (elForbrug/1000) * elRaekkevidde, so either one alone is a no-op."
    },
    "elRaekkevidde": {
      "type": "number",
      "description": "Electric range in km (WLTP). Send WITH elForbrug β€” either one alone is a no-op."
    },
    "totalvaegt": {
      "type": "number",
      "description": "Varebil only: total weight in kg"
    },
    "aaben": {
      "type": "boolean",
      "description": "Varebil only: open cargo bed (ladvogn)"
    },
    "isElectric": {
      "type": "boolean",
      "description": "MOTORCYKEL: the EV switch for that vehicle type. For personbil and varebil the drivetrain comes from co2 (0 or absent = electric), so this flag does not change the tax β€” but DO send it for a battery-electric personbil or varebil: it is read as your declaration that the missing co2 is deliberate, and suppresses the warning that the answer looks too low."
    },
    "actualKm": {
      "type": "number",
      "description": "Used: actual odometer km. The km regulation is skipped entirely unless actualKm, avgKm, vehicleAgeYears AND handelspris are all present."
    },
    "avgKm": {
      "type": "number",
      "description": "Used: average odometer km of the comparable adverts. Part of the actualKm/avgKm/vehicleAgeYears set β€” a partial send is silently ignored."
    },
    "vehicleAgeYears": {
      "type": "number",
      "description": "Used: vehicle age in years since first registration. Also used on its own for the under-6-months rule, so send it even when you cannot supply the km set. The km regulation additionally needs actualKm, avgKm and handelspris β€” that part is skipped unless all are present."
    },
    "allDealerListings": {
      "type": "boolean",
      "description": "Used: true only if EVERY comparable advert is a dealer listing (enables annoncefradrag + leveringsomkostninger)"
    },
    "condition_stand": {
      "type": "string",
      "enum": [
        "under_middel",
        "middel",
        "over_middel"
      ],
      "description": "Used: maintenance condition (vedligeholdelsesstand)"
    },
    "targetYear": {
      "type": "number",
      "description": "Rules year to calculate under (default: current). A year with no published table silently falls back to the current rates; the answer's rules_year says which table actually applied."
    }
  },
  "required": [
    "vehicleType",
    "condition"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟒get_afgift_rates

Machine-readable Danish vehicle registration tax rates 2026–2029: skalaknΓ¦k (brackets), CO2 tiers, bundfradrag and EV/plug-in phase-in (indfasning) percentages per year. Identical to GET https://bildata.io/api/afgift-prognose/rates. 2027–2029 rates are provisional.

Input Schema

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟑forecast_registreringsafgift(vehicleType, nypris, co2, batteryCapacity, electricRange, ...)

Project DANISH registration tax for a NEW vehicle across rules-years 2026–2029 (the EV/plug-in phase-in schedule changes the tax each year). Returns per-year results and deltas vs 2026. Amounts in DKK. Estimates, not official valuations. NEW vehicles only, and always the whole 2026-2029 span: for a USED import, or for a single year, use calculate_registreringsafgift instead. Send every number as a JSON number (300000, not "300000").

Input Schema

{
  "type": "object",
  "properties": {
    "vehicleType": {
      "type": "string",
      "enum": [
        "personbil",
        "varebil",
        "motorcykel"
      ],
      "description": "Vehicle category under Danish law"
    },
    "nypris": {
      "type": "number",
      "description": "Price as new in DKK (taxable value)"
    },
    "co2": {
      "type": "number",
      "description": "WLTP CO2 in g/km. PERSONBIL and VAREBIL: send it for any fuel-burning vehicle - an omitted value and an explicit 0 are BOTH read as battery-electric (EV phase-in and EV bundfradrag), which makes the tax far too low. Use 0 only for a pure EV. MOTORCYKEL behaves differently on THIS tool: an explicit co2=0 counts as electric, but an OMITTED co2 does NOT - the bike is priced as fuel-burning and the tax comes out far too HIGH. Declare an electric motorcykel with isElectric=true."
    },
    "batteryCapacity": {
      "type": "number",
      "description": "Battery kWh (used with electricRange to derive Wh/km)"
    },
    "electricRange": {
      "type": "number",
      "description": "Electric range km"
    },
    "electricConsumption": {
      "type": "number",
      "description": "Electric consumption Wh/km (overrides battery/range derivation)"
    },
    "totalvaegt": {
      "type": "number",
      "description": "Varebil only: total weight in kg"
    },
    "aaben": {
      "type": "boolean",
      "description": "Varebil only: open cargo bed (ladvogn)"
    },
    "isElectric": {
      "type": "boolean",
      "description": "MOTORCYKEL: the EV switch for that vehicle type, and on this tool the only reliable way to declare one - leave it unset with co2 omitted and the bike is priced as fuel-burning. For personbil and varebil the drivetrain comes from co2 (0 or absent = electric), so this flag does not change the tax."
    }
  },
  "required": [
    "vehicleType",
    "nypris"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟒get_market_stats(dimension, kind)

Danish new-vehicle registration statistics from bildata.io (weekly DMR data). Dimensions: fuel_type, brands (top 20), evs, imports (top imported makes), monthly_totals (last 12 months incl. leasing series), country_of_origin. kind=all covers every vehicle type; kind=Personbil passenger cars only. as_of is the data cutoff of the underlying extract β€” a month whose as_of is before month-end is PARTIAL. Market-level ONLY: the brands dimension is the top 20 brands and there is no per-model breakdown here β€” for a named MODEL use get_model_stats. It is NOT a way to get a brand total for a brand outside the top 20: a brand-only query there returns that brand's individual model rows (default 5, max 10, truncation disclosed in `note`) and defaults to kind=Personbil where this tool defaults to kind=all, so summing them does not reproduce a brand total from here.

Input Schema

{
  "type": "object",
  "properties": {
    "dimension": {
      "type": "string",
      "enum": [
        "fuel_type",
        "brands",
        "evs",
        "imports",
        "monthly_totals",
        "country_of_origin"
      ],
      "description": "Which slice to return; exactly one per call"
    },
    "kind": {
      "type": "string",
      "enum": [
        "all",
        "Personbil"
      ],
      "description": "Default: all"
    }
  },
  "required": [
    "dimension"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟒get_model_stats(query, kind, limit, grouped)

Look up Danish registration numbers for a SPECIFIC car model by name β€” e.g. "Tesla Model Y", "VW ID.4", "Skoda Enyaq". Covers every model since 2018. Use this when the question names a model or brand; get_top_models only covers the top sellers of one month, and get_market_stats only the top 20 brands. A model still selling returns period figures (this month, this year, last year, market share) plus all-time totals. A model with no registration in the last ~3 years returns ONLY lifetime totals and its first/last registration date β€” the period figures do not exist for it and are listed in `unavailableFields`; their absence is missing data, NOT zero sales. Spelling is forgiving (ID.4 = ID 4 = id4, Citroen = CitroΓ«n) and the response states which row it matched and how, so verify `name` before quoting the numbers.

Input Schema

{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80,
      "description": "Model or brand name, e.g. \"Tesla Model Y\" or \"Toyota\""
    },
    "kind": {
      "type": "string",
      "enum": [
        "all",
        "Personbil"
      ],
      "description": "Default: Personbil (passenger cars)"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 10,
      "description": "Max matches to return, default 5"
    },
    "grouped": {
      "type": "boolean",
      "description": "Default true: trims collapsed into canonical models (Enyaq 85 -> Skoda Enyaq), matching bildata.io/stats. false returns raw registry variants."
    }
  },
  "required": [
    "query"
  ],
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟒get_top_models(month, limit)

Top-selling car models (and variants) in Denmark for a given month, from bildata.io's top-50 statistics (passenger cars, monthly, 12-month rolling window). Default: latest month, top 10. as_of is the data cutoff β€” if it is before month-end, the month is PARTIAL, not complete. A RANKING, bounded by the 12-month window. A model outside that month's top 50 is absent here β€” look that one up by name with get_model_stats. A month OLDER than the window cannot be answered by any tool on this server: get_model_stats reports fixed periods relative to today (this month, this year, last year, all-time), never an arbitrary past month.

Input Schema

{
  "type": "object",
  "properties": {
    "month": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}$",
      "description": "YYYY-MM; default latest available"
    },
    "limit": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "description": "Rows per list, default 10, max 50"
    }
  },
  "additionalProperties": false,
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded6 tools
verifiedversion not recorded6 tools
verifiedversion not recorded6 tools