Skip to main content
Glama

Estimate EU duty on a low-value consignment

eu_duty_estimate
Read-onlyIdempotent

Best for: the EUR 3 per item EU customs duty on a consignment up to EUR 150 under IOSS or post, 2026-07-01 to 2028-07-01 (Reg. (EU) 2026/382, 2026/1022). Covers only channel "ioss" or "postal" (courier outside IOSS is not covered; if asked about a courier like DHL without IOSS, call with "ioss" and state courier outside IOSS is not covered). Returns: item count as given (1 tariff item = EUR 3 per order line, regardless of qty units) and with identical lines merged, duty_eur, legal_basis and assumptions. Over EUR 150 or outside the window, duty_eur is null. Input tips: lines (1-200) of {description, origin (2 letters), qty, unit_value_eur, optional hs_code} and channel ("ioss" or "postal"), optional consignment_value_eur and date. Never send customer fields.

Input Schema

NameRequiredDescriptionDefault
dateNoImport day, YYYY-MM-DD (default today, UTC)
linesYesOrder lines (1 to 200), each {description, origin, qty, unit_value_eur, optional hs_code} and nothing else (no customer fields), such as [{"description":"mug","origin":"CN","qty":2,"unit_value_eur":12}].
channelYesHow the goods enter the EU: "ioss" (VAT-exempt under the Import One-Stop Shop) or "postal" (a postal consignment). The EUR 3 rule covers only "ioss" or "postal" entries (courier shipments outside IOSS are not covered; if the user says courier such as DHL without specifying IOSS, pass "ioss" to show the EUR 3 IOSS figure and state clearly that a courier entry outside IOSS is not covered and needs IOSS or postal).
consignment_value_eurNoIntrinsic value of the whole consignment in euros, if different from the sum of the lines

Output Schema

NameRequiredDescriptionDefault
assumptionsYes
legal_basisYes
consignmentsYes
total_duty_eurYesTotal EUR 3 duty in euros, as lines are given. 0 when the consignment is exempt.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed10 schema fields changed
    • changedInput schema / properties / lines / description
      Previous value: -"Lines (1 to 200), each {description, origin (2 letters), qty (integer), unit_value_eur (euros), optional hs_code}, such as [{\"description\":\"mug\",\"origin\":\"CN\",\"qty\":2,\"unit_value_eur\":12}]."New value: +"Order lines (1 to 200), each {description, origin, qty, unit_value_eur, optional hs_code} and nothing else (no customer fields), such as [{\"description\":\"mug\",\"origin\":\"CN\",\"qty\":2,\"unit_value_eur\":12}]."
    • addedInput schema / properties / lines / items / description
      Added value: +"One order line: the goods, where they were made, how many and the price of one unit."
    • addedInput schema / properties / lines / items / examples
      Added value: +[
      +  {
      +    "description": "cotton t-shirt",
      +    "hs_code": "6109.10",
      +    "origin": "CN",
      +    "qty": 2,
      +    "unit_value_eur": 9.5
      +  }
      +]
    • changedInput schema / properties / lines / items / properties / description / description
      Previous value: -"What the goods are, such as \"cotton t-shirt\""New value: +"What the goods are, 1 to 200 characters, such as \"cotton t-shirt\""
    • addedInput schema / properties / lines / items / properties / description / maxLength
      Added value: +200
    • addedInput schema / properties / lines / items / properties / description / minLength
      Added value: +1
    • changedInput schema / properties / lines / items / properties / hs_code / description
      Previous value: -"6, 8 or 10 digit tariff code, dots allowed, if known (a candidate, not binding)"New value: +"6, 8 or 10 digit tariff code, dots allowed, such as \"6109.10\", if known (a candidate, not binding)"
    • changedInput schema / properties / lines / items / properties / origin / description
      Previous value: -"2-letter country the goods were made in, such as CN"New value: +"2-letter ISO country code where the goods were made, such as \"CN\""
    • changedInput schema / properties / lines / items / properties / qty / description
      Previous value: -"Units on the line"New value: +"Units on the line, a whole number from 1 to 100000"
    • changedInput schema / properties / lines / items / properties / unit_value_eur / description
      Previous value: -"Price of one unit in euros"New value: +"Price of one unit in euros, from 0 to 1000000, such as 9.5"
  2. Changed4 schema fields changed
    • changedInput schema / properties / channel / description
      Previous value: -"How the goods enter the EU: \"ioss\" (VAT-exempt under the Import One-Stop Shop) or \"postal\" (a postal consignment)."New value: +"How the goods enter the EU: \"ioss\" (VAT-exempt under the Import One-Stop Shop) or \"postal\" (a postal consignment). The EUR 3 rule covers only \"ioss\" or \"postal\" entries (courier shipments outside IOSS are not covered; if the user says courier such as DHL without specifying IOSS, pass \"ioss\" to show the EUR 3 IOSS figure and state clearly that a courier entry outside IOSS is not covered and needs IOSS or postal)."
    • changedOutput schema / properties / consignments / items / properties / duty_eur / description
      Previous value: -"EUR 3 per item, or null when exempt_reason is set."New value: +"Total EUR 3 duty for the consignment (items * EUR 3, not qty * EUR 3), or null when exempt_reason is set."
    • changedOutput schema / properties / consignments / items / properties / items / description
      Previous value: -"Items as the lines are given: one per line."New value: +"Tariff items (order lines) as given: one EUR 3 duty per order line, regardless of qty units on that line."
    • changedOutput schema / properties / consignments / items / properties / note / description
      Previous value: -"Plain-language reason when exempt_reason is set."New value: +"Plain-language breakdown of items vs units, or reason when exempt_reason is set."
  3. Changed16 schema fields changed
    • changedInput schema / properties / channel / description
      Previous value: -"ioss: the import is VAT-exempt under the Import One-Stop Shop. postal: the goods travel in a postal consignment."New value: +"How the goods enter the EU: \"ioss\" (VAT-exempt under the Import One-Stop Shop) or \"postal\" (a postal consignment)."
    • changedInput schema / properties / lines / description
      Previous value: -"Order lines of one consignment. Each line holds only description, hs_code (optional), origin, qty and unit_value_eur; lines with any other field, such as a customer name or address, are refused."New value: +"Lines (1 to 200), each {description, origin (2 letters), qty (integer), unit_value_eur (euros), optional hs_code}, such as [{\"description\":\"mug\",\"origin\":\"CN\",\"qty\":2,\"unit_value_eur\":12}]."
    • changedInput schema / properties / lines / items / properties / hs_code / description
      Previous value: -"6, 8 or 10 digit tariff code, if known (a candidate, not binding)"New value: +"6, 8 or 10 digit tariff code, dots allowed, if known (a candidate, not binding)"
    • addedInput schema / properties / lines / items / properties / hs_code / pattern
      Added value: +"^\\d{4}\\.?\\d{2}(\\.?\\d{2}(\\.?\\d{2})?)?$"
    • addedInput schema / properties / lines / items / properties / origin / pattern
      Added value: +"^[A-Za-z]{2}$"
    • addedInput schema / properties / lines / items / properties / qty / maximum
      Added value: +100000
    • addedInput schema / properties / lines / items / properties / unit_value_eur / maximum
      Added value: +1000000
    • addedOutput schema / properties / consignments / items / properties / duty_eur / description
      Added value: +"EUR 3 per item, or null when exempt_reason is set."
    • addedOutput schema / properties / consignments / items / properties / duty_if_identical_lines_grouped_eur / description
      Added value: +"Duty with identical lines merged, or null when exempt_reason is set."
    • addedOutput schema / properties / consignments / items / properties / exempt_reason / description
      Added value: +"Why no EUR 3 duty applies."
    • addedOutput schema / properties / consignments / items / properties / exempt_reason / enum
      Added value: +[
      +  "outside_validity_window",
      +  "consignment_value_over_150_eur"
      +]
    • addedOutput schema / properties / consignments / items / properties / items / description
      Added value: +"Items as the lines are given: one per line."
    • addedOutput schema / properties / consignments / items / properties / items_if_identical_lines_grouped / description
      Added value: +"Items if lines with the same code, description and origin are merged."
    • addedOutput schema / properties / consignments / items / properties / note / description
      Added value: +"Plain-language reason when exempt_reason is set."
    • addedOutput schema / properties / consignments / items / properties / value_eur / description
      Added value: +"Consignment value used for the EUR 150 test."
    • addedOutput schema / properties / total_duty_eur / description
      Added value: +"Total EUR 3 duty in euros, as lines are given. 0 when the consignment is exempt."
  4. 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"
      -}
  5. 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"
      +}
  6. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint and idempotent with a closed world, so the description's extra burden is behavioural nuance, which it delivers: what is returned (item count both as given and merged, duty_eur, legal_basis, assumptions) and, crucially, that duty_eur is null above EUR 150 or outside the window. It also explains the per-order-line billing model, which the annotations cannot express.

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?

Front-loads 'Best for' then 'Returns' then 'Input tips', which is good structure, and the sentences carry real information. It loses a point for redundancy: the courier-outside-IOSS caveat is stated twice in the description and a third time in the channel enum, and the input-tips sentence largely repeats the schema.

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?

Covers validity window, legal basis, channel limits, null-result conditions, line caps and a prohibition on customer fields, which is ample for a 4-parameter tool with 100% schema coverage and an output schema. The one omission is guidance on where to send users whose consignment falls outside this tool's scope.

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 is 3; the description earns an extra point by explaining counting semantics that the schema cannot — one tariff item equals EUR 3 per order line regardless of unit qty, with identical lines merged. It otherwise mostly restates the line shape and channel enum without adding new constraints.

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 and resource ('Estimate EU duty on a low-value consignment') and immediately pins down the exact rule: EUR 3 per item up to EUR 150 under IOSS or postal, with regulation numbers and a date window. An agent can tell this is the narrow EUR 3 duty calculation rather than a general cost tool.

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?

Explicitly frames scope ('Best for'), the valid date range, the covered channels and a concrete exclusion with a fallback procedure for courier-without-IOSS requests. It does not, however, name sibling tools such as landed_cost_estimate for consignments above EUR 150 or for full landed cost, leaving that routing to 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.