Skip to main content
Glama

Calculate landed cost and import duty

landed_cost
Read-onlyIdempotent

Calculate US import duty and landed cost estimates. Give hts_code when you know it and this returns the calculated base duty and trade actions (Section 301, Section 232, Section 338, AD/CVD and others), estimated duty, fees and import cost. When estimate_status is partial, part of the duty is undetermined (AD/CVD deposits, or a per-unit duty that needs a quantity) and the amounts are provisional; convey that the estimate is incomplete, and read duty_total_bound for whether the total is a minimum. Give product instead and it returns candidate HTS codes WITHOUT pricing, because the classification decides the duty and guessing it produces confidently wrong numbers: confirm the right code with the user, then call again with hts_code. The candidate step is not charged, and neither is the same lookup repeated within ten minutes.

Input Schema

NameRequiredDescriptionDefault
productNoPlain description, e.g. "outdoor metal furniture". Returns candidate codes to confirm, does not price. Provide this OR hts_code.
hts_codeNoExact HTS rate line, 8 or 10 digits, e.g. "9403.20.00.50". Takes precedence over product. 4 and 6 digit headings cannot be priced.
quantityNoOptional: the quantity, for lines whose duty is charged per unit (per kg, per dozen, per pair and so on). Without it that part of the duty is not priced and the total is a minimum. Send with quantity_unit.
entry_dateNoOptional: the date the goods will be entered, YYYY-MM-DD (US Eastern time), today or later. Default today.
country_codeYesISO 2-letter country of ORIGIN (where the goods were made), e.g. "CN", "CA", "VN".
quantity_unitNoOptional, with quantity: kg, g, lb, each, dozen, pair, liter, m, m2, m3, cm, gross, head or barrel. Must be the unit the duty is charged in (duty_breakdown.base_duty.unit); convert first if it differs.
shipment_modeNoOptional: "ocean" (default), "air" or "truck" (a land border crossing from Canada or Mexico). Affects government fees only: only ocean pays the harbor maintenance fee and files an ISF.
declared_valueYesCustoms value of the shipment in USD.

Output Schema

NameRequiredDescriptionDefault
ftaNoA free trade agreement rate the goods may qualify for. Not applied to the total; it requires a claim and proof of origin.
noteNo
sourceNo
countryNoCountry of origin, as resolved.
gatewayNoGuest tier only.
messageNo
hts_codeNoThe HTS line the duty was calculated on.
quantityNoQuantity used to price a per-unit duty, when one was given.
warningsNo
candidatesNoCandidate HTS lines to confirm, present only when needs_classification is true.
disclaimerNoPlanning estimate, not a customs ruling. Pass this on to the user.
descriptionNoOfficial description of that line.
usmca_claimNoCanada and Mexico: the duty with a USMCA claim, which needs the agreement's rules of origin to be met. The main figure is priced WITHOUT a claim; show this beside it, never in place of it.
service_feesNoFiling and handling charges such as ISF. Not government fees; CBP charges nothing to receive an Importer Security Filing.
quantity_unitNoUnit of that quantity, or the unit the per-unit duty is charged in.
adcvd_supplierNoSupplier deposit evidence when supplied by the calculation: reviewed entry date, matched legal identities, rules, effective windows, official sources, and cases actually included. A matched case does not establish complete all-orders coverage.
declared_valueNoCustoms value used, in USD.
duty_breakdownNoEvery trade action considered, keyed by authority (base_duty, section_301, section_232, section_338_canada and the rest). Each carries rate, applies, and often a reason and legal reference. An action with applies false and upcoming true is scheduled but not yet owed.
policy_noticesNoSource-backed scope and supplier notices affecting use of this estimate.
total_duty_usdNoCalculated duty estimate in USD. When estimate_status.status is partial, this is provisional and is not the complete payable duty; duty_total_bound says whether it is a minimum.
duty_total_noteNoPresent when duty_total_bound is not exact. Pass it to the user.
estimate_statusNoA partial status means part of the duty is undetermined (AD/CVD deposits, or a duty that needs a quantity) and this estimate is incomplete. Pass its message to the user; a zero calculated AD/CVD component does not establish zero liability.
government_feesNoMPF and HMF, the fees CBP actually collects.
guest_allowanceNoGuest tier only: the allowance in words.
duty_total_boundNoexact: every part of the duty is priced (AD/CVD notices may still make it provisional). at_least: a per-unit part is unpriced, so the total is a minimum; give quantity and quantity_unit to price it. unknown: a part is unpriced and the AD/CVD figure may overstate, so the total is neither complete nor a minimum.
total_duty_rate_pctNoCalculated duty estimate as a percentage of declared value. Read estimate_status before describing this as a complete estimate.
usmca_auto_232_noteNoCanada and Mexico vehicles and parts: how a USMCA claim changes the Section 232 auto duty.
needs_classificationNoTrue when a product description was given instead of a code. Nothing was priced and nothing was charged; show the candidates and ask the user to confirm.
total_import_cost_usdNoCalculated duties plus government and service fees, excluding merchandise and freight. Provisional when estimate_status is partial.
guest_lookups_remainingNoGuest tier only: priced duty lookups left in the rolling 7 days.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed13 schema fields changed
    • addedInput schema / properties / quantity
      Added value: +{
      +  "description": "Optional: the quantity, for lines whose duty is charged per unit (per kg, per dozen, per pair and so on). Without it that part of the duty is not priced and the total is a minimum. Send with quantity_unit.",
      +  "type": "number"
      +}
    • addedInput schema / properties / quantity_unit
      Added value: +{
      +  "description": "Optional, with quantity: kg, g, lb, each, dozen, pair, liter, m, m2, m3, cm, gross, head or barrel. Must be the unit the duty is charged in (duty_breakdown.base_duty.unit); convert first if it differs.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / duty_total_bound
      Added value: +{
      +  "description": "exact: every part of the duty is priced (AD/CVD notices may still make it provisional). at_least: a per-unit part is unpriced, so the total is a minimum; give quantity and quantity_unit to price it. unknown: a part is unpriced and the AD/CVD figure may overstate, so the total is neither complete nor a minimum.",
      +  "enum": [
      +    "exact",
      +    "at_least",
      +    "unknown"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / duty_total_note
      Added value: +{
      +  "description": "Present when duty_total_bound is not exact. Pass it to the user.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / estimate_status / description
      Previous value: -"A partial status means AD/CVD is undetermined and this estimate is incomplete. Pass its message to the user; a zero calculated AD/CVD component does not establish zero liability."New value: +"A partial status means part of the duty is undetermined (AD/CVD deposits, or a duty that needs a quantity) and this estimate is incomplete. Pass its message to the user; a zero calculated AD/CVD component does not establish zero liability."
    • addedOutput schema / properties / fta
      Added value: +{
      +  "description": "A free trade agreement rate the goods may qualify for. Not applied to the total; it requires a claim and proof of origin.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / guest_allowance
      Added value: +{
      +  "description": "Guest tier only: the allowance in words.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / guest_lookups_remaining / description
      Previous value: -"Guest tier only."New value: +"Guest tier only: priced duty lookups left in the rolling 7 days."
    • addedOutput schema / properties / quantity
      Added value: +{
      +  "description": "Quantity used to price a per-unit duty, when one was given.",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / quantity_unit
      Added value: +{
      +  "description": "Unit of that quantity, or the unit the per-unit duty is charged in.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / total_duty_usd / description
      Previous value: -"Calculated duty estimate in USD. When estimate_status.status is partial, this is provisional and is not the complete payable duty."New value: +"Calculated duty estimate in USD. When estimate_status.status is partial, this is provisional and is not the complete payable duty; duty_total_bound says whether it is a minimum."
    • addedOutput schema / properties / usmca_auto_232_note
      Added value: +{
      +  "description": "Canada and Mexico vehicles and parts: how a USMCA claim changes the Section 232 auto duty.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / usmca_claim
      Added value: +{
      +  "description": "Canada and Mexico: the duty with a USMCA claim, which needs the agreement's rules of origin to be met. The main figure is priced WITHOUT a claim; show this beside it, never in place of it.",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / shipment_mode / description
      Previous value: -"Optional: \"ocean\" (default) or \"air\". Affects government fees only."New value: +"Optional: \"ocean\" (default), \"air\" or \"truck\" (a land border crossing from Canada or Mexico). Affects government fees only: only ocean pays the harbor maintenance fee and files an ISF."
  3. Changed1 schema field changed
    • addedInput schema / properties / entry_date
      Added value: +{
      +  "description": "Optional: the date the goods will be entered, YYYY-MM-DD (US Eastern time), today or later. Default today.",
      +  "type": "string"
      +}
  4. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, the description discloses billing behavior, the caching window, and the crucial caveat that partial estimates are provisional with duty_total_bound indicating a minimum. That is real operational context an agent needs before presenting numbers to a user, not a restatement of annotations.

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?

The purpose and the hts_code-vs-product fork are front-loaded, and every sentence carries content (modes, caveats, billing). It is dense and slightly run-on, packing the estimate_status and duty_total_bound caveats into one long clause, which costs a point.

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?

With eight parameters, an output schema, and full annotation coverage, the remaining risk is interpretive rather than structural — and the description covers the two failure modes that matter (unpriced classification guesses and partial/provisional totals). An agent has enough to call this correctly and to report results honestly.

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?

Schema coverage is 100%, so the baseline would be 3, but the description adds cross-parameter meaning the schema can't easily convey: hts_code takes precedence over product, product never returns prices, and quantity/quantity_unit must match the unit the duty is charged in. It adds workflow-level semantics rather than duplicating field text.

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 first sentence states a specific verb and resource (calculate US import duty and landed cost estimates), and the body clarifies the two operating modes: priced lookup by hts_code vs. unpriced candidate HTS codes by product. It never names the sibling classify_hts, even though the product-to-candidates path overlaps with it, so sibling differentiation is implied rather than explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit routing rules: supply hts_code when known, supply product to get candidates, then confirm with the user and call again with hts_code. It also explains why guessing is harmful ('produces confidently wrong numbers') and how to interpret a partial result, plus cost conditions (candidate step free, repeats within ten minutes free).

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.

Resources