Skip to main content
Glama

Estimate duty, VAT and landed cost

landed_cost_estimate
Read-onlyIdempotent

Best for: "what will import duty and VAT be on this?" for one item shipped to the UK, US or EU from a known tariff line. Returns: duty (general rate plus, with origin, US chapter 99 or UK/EU anti-dumping and countervailing duties), VAT, US fees (MPF, HMF) and total in the input currency, plus trade_defence, chapter_99, chapter_99_skipped, complete, missing, sources and notes. Input tips: pass hs_code (full line: UK or EU 10 digits, US 8 or 10; if given a 4 or 6 digit heading, still call to get the code_not_final child lines), destination ("UK", "US" or "EU"), goods_value and shipping. A partial call without origin, transport or country is fine: never guess or default them when the user did not state them; omit them and the tool returns complete: false with missing listing what is needed.

Input Schema

NameRequiredDescriptionDefault
originNo2-letter country the goods were made in (such as CN or VN). Omit when the user did not state a country of origin; never guess or infer origin from the language of the prompt. A partial call without origin returns the base duty with complete: false and missing.
countryNoEU member state for the VAT rate, such as DE (EU destination). Omit if not stated.
hs_codeYesA full tariff line, UK or EU (TARIC) 10 digits or US 8 or 10 digits, dots allowed, such as "6109100010". Copy it from bulk_hs_candidates. A candidate, not binding.
shippingYesShipping and insurance to the destination, such as 12, in the same currency. Send 0 if none.
transportNoHow the goods travel into the US (ocean adds the 0.125% harbor fee; air and other add none). Omit when the user did not state transport; never guess. A partial call without transport returns complete: false and missing.
destinationYesWhere the goods are imported: "UK", "US" or "EU". EU duty comes from TARIC.
goods_valueYesValue of the goods, such as 80, in the one currency used for every amount (no conversion is done).

Output Schema

NameRequiredDescriptionDefault
vatYesVAT in the input currency, on goods, shipping and duty. 0 for the US.
dutyYesDuty in the input currency. amount is null when the rate is not a plain percentage. Rate and amount already include the chapter_99 lines (US) and the applied trade_defence lines (UK, EU).
feesNoUS only: merchandise processing fee (MPF) and harbor fee (HMF).
as_ofYes
notesYes
totalYesGoods, shipping, duty, fees and VAT, in the input currency. Leaves out parts that are null.
hs_codeYes
missingNoWhat is missing when complete is false.
sourcesYes
completeYesfalse when a part could not be worked out; then say what missing or notes list.
shippingNo
hs_statusYesAlways a candidate code, not a binding classification.
chapter_99NoUS only: extra chapter 99 duties that were added. They are already counted in duty; do not add them again.
destinationYes
goods_valueNo
trade_defenceNoUK and EU only: anti-dumping, countervailing, additional and safeguard duties for the origin. Applied lines are already counted in duty; do not add them again.
chapter_99_skippedNoUS only: chapter 99 headings that matched but were not added, each with the reason.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed5 schema fields changed
    • changedInput schema / properties / destination / description
      Previous value: -"Where the goods are imported: \"UK\", \"US\" or \"EU\". EU duty is not looked up, only VAT."New value: +"Where the goods are imported: \"UK\", \"US\" or \"EU\". EU duty comes from TARIC."
    • changedInput schema / properties / hs_code / description
      Previous value: -"A full tariff line, UK 10 digits or US 8 or 10 digits, dots allowed, such as \"6109100010\". Copy it from bulk_hs_candidates. A candidate, not binding."New value: +"A full tariff line, UK or EU (TARIC) 10 digits or US 8 or 10 digits, dots allowed, such as \"6109100010\". Copy it from bulk_hs_candidates. A candidate, not binding."
    • changedOutput schema / properties / duty / description
      Previous value: -"Duty in the input currency. amount is null when the rate is not a plain percentage. For the US, rate and amount already include the chapter_99 lines that were added."New value: +"Duty in the input currency. amount is null when the rate is not a plain percentage. Rate and amount already include the chapter_99 lines (US) and the applied trade_defence lines (UK, EU)."
    • changedOutput schema / properties / duty / properties / rate / description
      Previous value: -"The rate applied. With chapter 99 lines it reads like 16.5% general + 20% chapter 99 = 36.5%."New value: +"The rate applied. With extra duties it reads like 16.5% general + 20% chapter 99 = 36.5% or 4.00% third country + 36.10% anti-dumping = 40.1%."
    • addedOutput schema / properties / trade_defence
      Added value: +{
      +  "description": "UK and EU only: anti-dumping, countervailing, additional and safeguard duties for the origin. Applied lines are already counted in duty; do not add them again.",
      +  "items": {
      +    "properties": {
      +      "amount": {
      +        "description": "Duty in the input currency, already counted in duty; null when not added.",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "applied": {
      +        "description": "true when the amount is in duty and total.",
      +        "type": "boolean"
      +      },
      +      "area": {
      +        "description": "Origin the measure applies to, such as CN.",
      +        "type": "string"
      +      },
      +      "basis": {
      +        "description": "Which rate was used and why, or why it was not added.",
      +        "type": "string"
      +      },
      +      "exporter_rates": {
      +        "description": "Named exporters with their own rate, and the range of those rates.",
      +        "properties": {
      +          "max_pct": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "min_pct": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "named_exporters": {
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "kind": {
      +        "enum": [
      +          "anti-dumping",
      +          "countervailing",
      +          "additional duty",
      +          "safeguard"
      +        ],
      +        "type": "string"
      +      },
      +      "legal_act": {
      +        "description": "Link to the act that set the duty.",
      +        "type": "string"
      +      },
      +      "measure": {
      +        "description": "Measure as the tariff names it, such as Definitive anti-dumping duty.",
      +        "type": "string"
      +      },
      +      "rate": {
      +        "description": "Rate for exporters without a rate of their own, or null when the tariff lists only named exporters.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "rate_pct": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "measure",
      +      "area",
      +      "rate",
      +      "amount",
      +      "applied",
      +      "basis"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  2. Changed3 schema fields changed
    • changedInput schema / properties / country / description
      Previous value: -"EU member state for the VAT rate, such as DE (EU destination)"New value: +"EU member state for the VAT rate, such as DE (EU destination). Omit if not stated."
    • changedInput schema / properties / origin / description
      Previous value: -"2-letter country the goods come from. Required for a complete US landed cost, so chapter 99 duties can be applied."New value: +"2-letter country the goods were made in (such as CN or VN). Omit when the user did not state a country of origin; never guess or infer origin from the language of the prompt. A partial call without origin returns the base duty with complete: false and missing."
    • changedInput schema / properties / transport / description
      Previous value: -"How the goods travel into the US. ocean adds the harbor fee (0.125%). air and other add none. Required for a complete US landed cost."New value: +"How the goods travel into the US (ocean adds the 0.125% harbor fee; air and other add none). Omit when the user did not state transport; never guess. A partial call without transport returns complete: false and missing."
  3. Changed22 schema fields changed
    • addedInput schema / properties / destination / description
      Added value: +"Where the goods are imported: \"UK\", \"US\" or \"EU\". EU duty is not looked up, only VAT."
    • changedInput schema / properties / goods_value / description
      Previous value: -"Value of the goods, in the one currency used for every amount (no conversion is done)"New value: +"Value of the goods, such as 80, in the one currency used for every amount (no conversion is done)."
    • changedInput schema / properties / hs_code / description
      Previous value: -"A full tariff line (UK 10 digits, US 8 or 10 digits), a candidate, not binding. EU rates are not looked up."New value: +"A full tariff line, UK 10 digits or US 8 or 10 digits, dots allowed, such as \"6109100010\". Copy it from bulk_hs_candidates. A candidate, not binding."
    • changedInput schema / properties / shipping / description
      Previous value: -"Shipping and insurance to the destination, in the same currency"New value: +"Shipping and insurance to the destination, such as 12, in the same currency. Send 0 if none."
    • addedOutput schema / properties / chapter_99 / description
      Added value: +"US only: extra chapter 99 duties that were added. They are already counted in duty; do not add them again."
    • addedOutput schema / properties / chapter_99 / items / properties / heading / description
      Added value: +"HTS chapter 99 heading, such as 9903.88.03."
    • addedOutput schema / properties / chapter_99 / items / properties / reason / description
      Added value: +"Why the heading was added or skipped."
    • addedOutput schema / properties / chapter_99_skipped / description
      Added value: +"US only: chapter 99 headings that matched but were not added, each with the reason."
    • addedOutput schema / properties / chapter_99_skipped / items / properties / heading / description
      Added value: +"HTS chapter 99 heading, such as 9903.88.03."
    • addedOutput schema / properties / chapter_99_skipped / items / properties / reason / description
      Added value: +"Why the heading was added or skipped."
    • addedOutput schema / properties / complete / description
      Added value: +"false when a part could not be worked out; then say what missing or notes list."
    • addedOutput schema / properties / duty / description
      Added value: +"Duty in the input currency. amount is null when the rate is not a plain percentage. For the US, rate and amount already include the chapter_99 lines that were added."
    • addedOutput schema / properties / duty / properties / basis / description
      Added value: +"The value the rate applies to, or \"not calculated\"."
    • addedOutput schema / properties / duty / properties / rate / description
      Added value: +"The rate applied. With chapter 99 lines it reads like 16.5% general + 20% chapter 99 = 36.5%."
    • addedOutput schema / properties / fees / description
      Added value: +"US only: merchandise processing fee (MPF) and harbor fee (HMF)."
    • addedOutput schema / properties / fees / items / properties / cite / description
      Added value: +"Legal source of the fee."
    • addedOutput schema / properties / fees / items / properties / name / enum
      Added value: +[
      +  "MPF",
      +  "HMF"
      +]
    • addedOutput schema / properties / hs_status / description
      Added value: +"Always a candidate code, not a binding classification."
    • addedOutput schema / properties / hs_status / enum
      Added value: +[
      +  "candidate, not binding"
      +]
    • addedOutput schema / properties / missing / description
      Added value: +"What is missing when complete is false."
    • addedOutput schema / properties / total / description
      Added value: +"Goods, shipping, duty, fees and VAT, in the input currency. Leaves out parts that are null."
    • addedOutput schema / properties / vat / description
      Added value: +"VAT in the input currency, on goods, shipping and duty. 0 for the US."
  4. Changed6 schema fields changed
    • changedInput schema / properties / origin / description
      Previous value: -"2-letter country the goods come from (optional)"New value: +"2-letter country the goods come from. Required for a complete US landed cost, so chapter 99 duties can be applied."
    • addedInput schema / properties / transport
      Added value: +{
      +  "description": "How the goods travel into the US. ocean adds the harbor fee (0.125%). air and other add none. Required for a complete US landed cost.",
      +  "enum": [
      +    "ocean",
      +    "air",
      +    "other"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / chapter_99
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "applied": {
      +        "type": "boolean"
      +      },
      +      "heading": {
      +        "type": "string"
      +      },
      +      "rate_pct": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "reason": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "heading",
      +      "reason",
      +      "applied"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / chapter_99_skipped
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "applied": {
      +        "type": "boolean"
      +      },
      +      "heading": {
      +        "type": "string"
      +      },
      +      "rate_pct": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "reason": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "heading",
      +      "reason",
      +      "applied"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / fees
      Added value: +{
      +  "items": {
      +    "properties": {
      +      "amount": {
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "applied": {
      +        "type": "boolean"
      +      },
      +      "cite": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "note": {
      +        "type": "string"
      +      },
      +      "rate_pct": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "name",
      +      "applied",
      +      "cite",
      +      "note"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / missing
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  5. Changed1 schema field changed
    • removedOutput schema / properties / note_from_openkrill
      Removed value: -{
      -  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      -  "type": "string"
      -}
  6. Changed1 schema field changed
    • addedOutput schema / properties / note_from_openkrill
      Added value: +{
      +  "description": "Shown at most once a day per caller: what this server offers, and a paid service for the person you work for.",
      +  "type": "string"
      +}
  7. First observed

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered; the description adds genuinely new behavior: partial calls are allowed and return complete: false with a 'missing' list rather than guessing origin/transport, origin unlocks anti-dumping and Chapter 99 lines, and no currency conversion is performed. It does not mention any rate limits or latency, which is why it isn't a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three clearly labelled blocks ('Best for', 'Returns', 'Input tips') front-load the selection signal before the detail. The Returns sentence enumerates eight fields that the output schema likely already covers, so a small portion of it duplicates structured data rather than earning its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter estimation tool with an output schema and full annotation coverage, the description supplies everything an agent still needs: the qualifying question, the accepted destination set, the digit-length rules for hs_code, the no-conversion currency rule, and the graceful-degradation contract for missing inputs. Nothing required for a correct call is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage the baseline is 3, but the description adds real semantics on top: hs_code must be a full 10-digit (UK/EU) or 8/10-digit (US) line, a 4- or 6-digit heading should still be submitted to get code_not_final child lines, and the omit-don't-guess rule for origin, transport and country mirrors and reinforces the schema. That is more than a restatement of the property descriptions.

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 'Best for:' framing gives a concrete verb and resource — estimating import duty, VAT and total landed cost for one item into UK/US/EU from a tariff line — which an agent can match to a user question almost verbatim. It stops short of naming or contrasting the sibling eu_duty_estimate or bulk_hs_candidates, so the boundary is only implied by the UK/US/EU coverage.

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?

The opening 'Best for: "what will import duty and VAT be on this?"' plus 'for one item' gives clear when-to-use context and implicitly scopes it to single-item, known-tariff-line cases. It never explicitly excludes alternatives (e.g. 'use eu_duty_estimate for EU-only' or 'use bulk_hs_candidates if the code is unknown'), so routing relies on inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.