Skip to main content
Glama

Server Details

Neutral freight reference + validation layer for AI agents: ADR, HS, UN/LOCODE, freight math

Ownership verified
Status
Healthy
Uptime
100.0% over 59 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
SoapyRED/freightutils-mcp
GitHub Stars
7
Server Listing
FreightUtils MCP Server

TDQS

A4.4/5.0

Scored across 25 tools

Disambiguation4/5

Most tools have clearly distinct purposes and descriptions actively cross-reference related tools to clarify boundaries. However, overlapping calculators such as consignment_calculator, shipment_summary, cbm_calculator, chargeable_weight_calculator, and unit_converter create some potential for misselection, and the three ADR tools, while differentiated, could still be confused by a less careful agent.

Naming Consistency5/5

All tool names consistently use snake_case and are descriptive. The mix of noun-based (e.g. *_lookup, *_calculator) and verb-based names (validate, get_subscribe_link) is natural and readable, with no chaotic mixing of conventions.

Tool Count3/5

25 tools is at the upper boundary for a utility server, and several tools perform overlapping arithmetic or composite analyses (e.g. cbm_calculator vs consignment_calculator; consignment_calculator vs shipment_summary). While each tool has a plausible role, the set feels heavy and could benefit from consolidation.

Completeness4/5

The tool surface covers a broad range of freight utilities: ADR checks, unit conversions, volume/weight/LDM calculations, emissions, customs duty, HS codes, Incoterms, ICS2, identifier validation, and lookups for airlines, airports, containers, ULDs, vehicles, and UN/LOCODE. Minor gaps exist, such as no general routing or distance calculator, but agents can work around them.

Available Tools

25 tools
adr_exemption_calculatorADR 1.1.3.6 Exemption CalculatorA
Read-onlyIdempotent
Inspect

Calculate ADR 1.1.3.6 "small load" exemption points for a dangerous-goods load and say whether it qualifies. Each substance's transport category (Table A column (15), 0-4) sets a points multiplier (1.1.3.6.4: category 1 x50, 2 x3, 3 x1, 4 x0; the nine ADR 1.1.3.6.3 note-a entries UN 0081/0082/0084/0241/0331/0332/0482/1005/1017 are x20); points = quantity x multiplier. The rule (1.1.3.6.2), for dangerous goods carried in packages: goods of ONE transport category qualify when their TOTAL on the transport unit stays within that category's 1.1.3.6.3 column (3) maximum — category 1: 20, 2: 333, 3: 1,000 (kg or L); note-a entries 50 kg; category 4 unlimited; category 0: 0 — however it is split across lines; goods of DIFFERENT categories qualify when the 1.1.3.6.4 points sum does not exceed 1,000. This calculator also holds every line, and every substance summed across its lines, to its category maximum — on a mixed load that is stricter than 1.1.3.6.4 (the conservative side). Transport category 0 substances can NEVER use this exemption — has_category_zero flags them.

Provide un_number + quantity for a single substance, OR items[] for a load — never both: every field of the single-substance form (un_number, quantity, packing_group, variant_index, unit, basis) sent beside items[] is refused (the API answers 400 naming the field), never dropped — put it on the item it belongs to, a substance as an item of its own. Quantities are in kg or litres per the substance's ADR unit. un_number also takes an ID-prefixed air-only number (e.g. "ID8000") — see Routing.

Multi-variant UNs: a UN number with more than one ADR Table A row (packing group / concentration variant — e.g. UN 1789 PG II vs PG III have different transport categories) needs packing_group (I|II|III) or variant_index (from adr_lookup) to pin one row. A packing_group that still leaves several rows is enough when those rows agree on class, transport category, scope and the 1.1.3.6.3 counted dimension (UN 1790 PG I: two concentration bands, both category 1) — the verdict is returned with items[].equivalent_variants + variant_note naming the rows it holds for; only when the rows DISAGREE (UN 2215 PG III: MOLTEN is category 0, the solid category 3) does it still ask for variant_index, and candidates[] then lists only that packing group's rows. With no disambiguator at all: a single-line call, or a load where EVERY line is ambiguous, returns blocking_errors[AMBIGUOUS_UN_VARIANT] + human_review_required + candidates[] (each candidate's item_index, un_number, variant_index, packing_group, proper_shipping_name, transport_category, multiplier) and NO verdict — blocking_errors is in the text content as well as structuredContent; a MIXED load withholds only the ambiguous line (items[].withheld true, points null, row fields null) while every other line keeps its points; total_points is null (1.1.3.6.4 sums every line, one term is unknown) and exempt is null UNLESS the resolved lines alone already disqualify the load — a CARRIAGE PROHIBITED entry, a category 0 entry, a per-substance maximum exceeded, or a partial sum already over 1,000 — in which case exempt is false with the ladder message (and carriage_prohibited true where that is the reason), because no packing group can undo those. warnings state the resolved lines' partial sum, candidates[] carry expected_unit (the 1.1.3.6.3 counted dimension — the only difference for UN 3375 PG II, liquid in L vs solid in kg), and the envelope carries human_review_required + candidates[] plus one AMBIGUOUS_UN_VARIANT warning per withheld line. Never a silently guessed row. Single-row UNs are unchanged.

Scope verdicts: Table A rows listed "NOT SUBJECT TO ADR" or "CARRIAGE PROHIBITED" never enter the points math. An all-not-subject load (e.g. UN 1845 dry ice) returns not_subject_to_adr true with a dedicated message ("Not subject to ADR (road). Section 5.5.3 applies: ...") and, for dry ice, conditions[] quoting the ADR 2025 section 5.5.3 requirements verbatim (ventilation, package marking, warning mark, documentation, training). A load containing a CARRIAGE PROHIBITED entry returns exempt false with carriage_prohibited true. In a mixed load, not-subject items are excluded from the points and the exclusion is stated in warnings.

Routing: every returned line carries state, in the words the FreightUtils document check uses — COUNTED (evaluated on one Table A row: its points, or a category 0 / CARRIAGE PROHIBITED row that settles the load), AIR_ONLY_ID, NOT_SUBJECT_TO_ADR, or BLOCKED (no points from the line as sent — withheld, basis_mismatch or category_unresolved; the line's own flag says which). AIR_ONLY_ID: an ID-prefixed number such as ID 8000 (consumer commodity) is an air-only identifier with no ADR Table A entry, so it gives no transport category and nothing is counted for it (items[].air_only_id true, row fields null). Each such line carries a warning stating the condition that 0 rests on: it is the ADR answer when the packages are limited quantities to the ICAO Technical Instructions (3.4.9 and 3.4.10 deem them to meet 3.4.1-3.4.4; goods exempted under 1.1.3.4.2 are not taken into account by 1.1.3.6.5) — goods not in such packages must be entered under their own UN numbers. Only the ID prefix makes a line air-only — an ID number is never read as the UN number with the same digits — and an all-air-only load returns total_points 0, exempt true with its own message, never "1.1.3.6 exemption applies" and never not_subject_to_adr.

Behavior: deterministic points arithmetic over ADR 2025 reference data; a UN that cannot be found returns blocking_errors (NOT_FOUND); exempt is the overall verdict. Fields are checked by name: a field the tool does not read is refused with a tool error naming it and listing the accepted ones, never ignored. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: items[] (each with state, packing_group, variant_index, transport_category, multiplier, points, air_only_id on an ID-prefixed line, quantity_unit/quantity_basis/expected_unit when a unit or basis was declared, scope flags where applicable, withheld + ambiguity_reason on an unpinned multi-variant line, and equivalent_variants + variant_note when a packing group resolved by equivalence), total_points (NULL when no verdict was reached), threshold (1000), exempt (NULL when no verdict was reached — never false as a stand-in), has_category_zero, has_quantity_exceedance, warnings, message, human_review_required + candidates[] when any line is withheld, and — on scope verdicts — not_subject_to_adr/conditions_ref/conditions[]/carriage_prohibited under result — or, when every line is ambiguous, human_review_required + candidates[] with blocking_errors, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: a deterministic calculation over reference data, not legal advice — 1.1.3.6 relieves goods carried in packages only (not in bulk or in tanks), and this calculator takes no packaging input; even exempt loads keep core duties (packaging, marking, documentation), and mixed-packing rules still apply; verify against the current UNECE ADR text.

Related: adr_lookup (per-substance data incl. transport category + variant_index), adr_lq_eq_check (the LQ/EQ relief routes instead of 1.1.3.6).

ParametersJSON Schema
NameRequiredDescriptionDefault
unitNoOPTIONAL. The dimension `quantity` is stated in — 'L' or 'kg'. Omit it and the number is taken as already on the ADR 1.1.3.6.3 basis (the historical contract). Supply it and it is CHECKED against the dimension 1.1.3.6.3 counts for the row: litres for liquids and for compressed or adsorbed gases, kilograms for solids, liquefied/refrigerated/dissolved gases and articles. A mismatch returns no points and says which dimension the entry is counted in. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item.
basisNoOPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging, so a figure declared 'gross' returns no points in ANY unit — send the net quantity instead. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item.
itemsNoArray of items for mixed-load check
quantityNoQuantity on the ADR 1.1.3.6.3 basis: net kg for solids and liquefied, refrigerated or dissolved gases; litres for liquids; receptacle water capacity in litres for compressed or adsorbed gases and chemicals under pressure; articles as the mass of the articles without their packagings, in kg.
un_numberNoUN number for single check (4 digits, optionally "UN"-prefixed) — or an ID-prefixed air-only number such as "ID8000", which has no ADR Table A entry and is routed AIR_ONLY_ID (nothing counted under 1.1.3.6 — the ADR answer for limited-quantity packages to the ICAO Technical Instructions, 3.4.9 / 3.4.10 / 1.1.3.6.5, as the warning on that line states). Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — send the substance as an item.
packing_groupNoPacking group (I, II or III) — only needed to disambiguate a UN that has more than one ADR Table A row (e.g. UN 1789). Ignored for single-row UNs. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item.
variant_indexNoADR Table A variant index (as returned by adr_lookup) — pins one row when a UN has several variants that share a packing group (e.g. concentration bands). Ignored for single-row UNs. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, and the description adds far more: field-name rejection with a tool error, 400 on single+items mix, rate limiting with reset_at, that exempt/total_points are NULL (never false as a stand-in) when no verdict is reached, that ambiguity is never silently guessed, and the exact conditions producing carriage_prohibited/not_subject_to_adr. This is unusually rich behavioral disclosure beyond the annotations.

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

Conciseness3/5

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

Front-loaded and sectioned (Behavior, Scope verdicts, Routing, Returns, Limitations, Related), but it is extremely long and dense, and the Returns paragraph largely restates what the output schema already provides. For a tool this complex some length is warranted, yet several passages (variant handling is described three times) could be tightened.

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?

Given a complex compliance calculator with 7 parameters, no required fields, and a rich output schema, the description covers the full decision space: input forms, ambiguity, scope verdicts, air-only routing, rate limits, and legal limitations. An agent has everything needed to call it and interpret the verdict correctly; nothing material is missing.

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, but the description adds meaning the schema does not: the mutual-exclusivity contract between the single-substance fields and items[], why packing_group/variant_index exist (multi-variant UNs), and the equivalence fallback. The narrative explains the cross-field rules that the per-property schema descriptions leave implicit.

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?

Opens with a precise verb+resource+outcome: 'Calculate ADR 1.1.3.6 "small load" exemption points for a dangerous-goods load and say whether it qualifies.' It names the exact regulation, the points model (quantity x multiplier), and positions itself against siblings in the Related section (adr_lookup for source data, adr_lq_eq_check for the alternative relief route), so an agent can distinguish it immediately.

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?

Gives explicit when-to-use routing: single-substance form vs items[] (and that mixing them is a 400), packing_group vs variant_index for multi-variant UNs, and the disambiguation ladder (equivalent variants returned vs blocking_errors). It also states when NOT to use it, pointing to adr_lookup for per-substance data and adr_lq_eq_check as the alternative relief route, plus limitations (packages only, not bulk/tanks).

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

adr_lookupADR Dangerous Goods Lookup
Read-onlyIdempotent
Inspect

Look up European road dangerous-goods (ADR 2025) reference data for a substance: hazard class, classification code, packing group, labels, special provisions, limited/excepted quantities, transport category, tunnel restriction code and Kemler (hazard identification) number. Covers 2,939 entries across all 9 hazard classes, from UNECE ADR 2025 (ECE/TRANS/352).

Provide exactly ONE of: un_number (exact lookup — returns every packing-group variant of that UN number), search (case-insensitive partial match on the proper shipping name), or hazard_class (all entries in a class or division). un_number is normalised — "1203", "UN1203" and "un 1203" are equivalent, and normalized_input reports the correction; explosives keep their leading zero ("0004").

Behavior: read-only reference lookup; a name search or class filter is a paged list — total, truncated and next_offset, with offset and limit (at most 50 per search page, 100 per class page) — never a silently cut list. A search with no hits errors with suggestions: the closest proper shipping names in Table A ("acetne" → ACETONE, UN 1090). 28 Table A rows carry a scope remark instead of a packing group: those return packing_group null plus not_subject_to_adr (with conditions_ref, e.g. "5.5.3" for UN 1845 dry ice) or carriage_prohibited, and table_a_remark preserves the verbatim Table A text. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: count and results[] — per entry: un_number, proper_shipping_name, class, classification_code, packing_group, labels, special_provisions, limited_quantity, excepted_quantity, transport_category, tunnel_restriction_code, hazard_identification_number, variant_index/variant_count and, on scope-flagged rows, not_subject_to_adr/carriage_prohibited/conditions_ref/table_a_remark — under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: a factual compilation of the ADR table, not legal or compliance advice; classification remains the consignor's responsibility — verify against the current UNECE ADR text.

Related: adr_lq_eq_check (checks quantities against the LQ/EQ values returned here), adr_exemption_calculator (1.1.3.6 small-load points), consignment_calculator (flags dangerous-goods lines by UN number).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNosearch / hazard_class only: rows per page (default 10; at most 50 for search, 100 for hazard_class).
offsetNosearch / hazard_class only: rows to skip (default 0). The response gives total and next_offset.
searchNoCase-insensitive partial match on the proper shipping name (min 2 characters). Example: "acetone".
un_numberNoExact UN number — 4 digits, optionally "UN"-prefixed; explosives keep their leading zero. Examples: "1203", "UN1203", "UN 1203", "0004".
hazard_classNoFilter by ADR hazard class (Table A column (3a)). Examples: "3" (flammable liquids), "6.1" (toxic), "8" (corrosive), "1" (explosives — the division and compatibility group are in classification_code, e.g. "1.4S").

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
adr_lq_eq_checkADR LQ / EQ Exemption CheckA
Read-onlyIdempotent
Inspect

Check whether dangerous goods qualify for ADR Limited Quantity (LQ, ADR 3.4) or Excepted Quantity (EQ, ADR 3.5) relief. LQ compares each item's per-inner-packaging quantity against that substance's LQ maximum; EQ resolves the substance's E-code (E0-E5) and checks the per-inner limit, plus the per-outer limit when inner_packaging_qty is given.

Provide mode ("lq" or "eq") and 1-20 items, each with un_number, quantity and unit — ml or L for liquids, g or kg for solids; quantity is per INNER packaging, not the whole load.

Unit families: column (7a) states the limit in ONE dimension — a mass for some entries, a volume for others — and ADR supplies no density, so a mass quantity against a volume limit (or the reverse) CANNOT be compared. Those items return status 'inconclusive' with the dimension named, never a pass or a fail, and a batch holding any inconclusive item never reads overall_status 'qualifies'. Send the quantity in the unit given by lq_limit_unit to get a verdict. Multi-variant UNs: a UN number with more than one ADR Table A row (packing group / concentration variant — e.g. UN 1789 PG II LQ 1 L vs PG III LQ 5 L) needs packing_group (I|II|III) or variant_index (from adr_lookup) on that item to pin one row. A packing_group that still leaves several rows is enough when those rows agree on class, column (7a), column (7b) and scope (UN 1790 PG I: two concentration bands, both LQ 0 / E0) — the item is answered with equivalent_variants + variant_note naming the rows it holds for; only when the rows DISAGREE does it still ask for variant_index, and candidates[] then lists only that packing group's rows. With no disambiguator at all: a single-item call, or a batch where EVERY item is ambiguous, returns blocking_errors[AMBIGUOUS_UN_VARIANT] + human_review_required + candidates[] (each candidate's item_index, un_number, variant_index, packing_group, proper_shipping_name, limited_quantity, excepted_quantity) and NO verdict; a MIXED batch withholds only the ambiguous item (status 'withheld', withheld true, row fields null) while the other items are answered, overall_status never reads 'qualifies' while an item is withheld, summary carries withheld, and the envelope carries human_review_required + candidates[] plus one AMBIGUOUS_UN_VARIANT warning per withheld item. Never a silently checked packing group. Single-row UNs are unchanged.

Behavior: deterministic reference check; each item gets a status and reason (an LQ value of "0" or code E0 means the relief is not permitted for that substance), with overall_status and summary counts across the batch. Table A rows listed "NOT SUBJECT TO ADR" (e.g. UN 1845 dry ice) get item status not_subject — outside ADR scope, neither a pass nor a fail — and an all-not-subject batch returns overall_status not_applicable; "CARRIAGE PROHIBITED" rows are not_permitted with the prohibition stated in reason. Fields are checked by name: a field the tool does not read is refused with a tool error naming it and listing the accepted ones, never ignored. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: mode, overall_status (qualifies | does_not_qualify | partial | not_applicable | inconclusive), items[] (un_number, variant_index, substance, class, packing_group, lq_limit or eq_code, quantity_entered, status — within_limit | exceeds_limit | not_permitted | not_subject | inconclusive | withheld — reason, scope flags where applicable, withheld + ambiguity_reason on a withheld item, and equivalent_variants + variant_note when a packing group resolved by equivalence), summary {total_items, qualifying, exceeding, not_permitted, not_subject?, inconclusive?, withheld?}, the ADR chapter references, and human_review_required + candidates[] when any item is withheld — all under result — or, when every item is ambiguous, human_review_required + candidates[] with blocking_errors, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: a quantity-threshold check only — LQ/EQ relief also requires packaging, marking and documentation conformity that this tool does not assess; not legal advice, verify against the current UNECE ADR text.

Related: adr_lookup (the per-substance LQ/EQ values + variant_index), adr_exemption_calculator (the 1.1.3.6 load-points route instead).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesCheck mode: 'lq' (Limited Quantity, ADR 3.4) or 'eq' (Excepted Quantity, ADR 3.5)
itemsYesItems to check (1–20 per call).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, closed-world), and the description adds substantial extra context: inconclusive handling for dimension mismatches, withheld/ambiguity semantics, not_subject vs not_permitted, field-name rejection, and rate-limit reset_at. This is well beyond what structured fields disclose.

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?

Purpose is front-loaded and every section addresses a genuine edge case, but the prose is dense with long compound sentences (especially the variant/ambiguity passage) that could be tightened. Size is justified by the tool's complexity, so only minor trimming is warranted.

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?

An output schema exists, yet the description still maps statuses, summary counts, envelope fields, and limitations clearly enough for an agent to interpret results. For a many-edge-case regulatory checker, nothing needed to call or read it correctly is missing.

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 baseline is 3, but the description adds real meaning: quantity is per inner packaging not per load, the unit-dimension mismatch consequence, when packing_group suffices vs when variant_index is needed, and the EQ per-outer limit. It goes meaningfully beyond the schema text.

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+resource (check ADR LQ/EQ relief qualification) and immediately names the regulatory basis (ADR 3.4, 3.5). It distinguishes itself from siblings by routing to adr_lookup for values and adr_exemption_calculator for the 1.1.3.6 route.

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?

Explicitly says which mode to provide and how to supply items, and names the alternative exemption route (adr_exemption_calculator) so the agent can pick the right tool. The 'Related' block plus inline cross-references make the when/when-not choice clear.

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

airline_lookupAirline / AWB Prefix Lookup
Read-onlyIdempotent
Inspect

Search 6,356 airlines by name, IATA code, ICAO code, AWB prefix, or country. AWB prefixes are the first 3 digits of an air waybill number and identify the issuing carrier (e.g. 176 = Emirates).

Provide ONE parameter: query is a ranked fuzzy search across names and codes; iata / icao / prefix / country are exact filters.

Behavior: read-only; fuzzy query hits report their match quality through the envelope's confidence (basis match_quality, score 0-1) with a FUZZY_BEST_MATCH advisory naming the matched field; a query that contains no name falls back to the closest names in the dataset ("Emirats" → Emirates). A query or country answer is a list: summary rows, 25 per page, with total, truncated and next_offset (full: true for full records); an iata / icao / prefix answer is the holder records in full. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: count and results[] — per airline: airline_name, iata_code, icao_code, awb_prefix[], callsign, country, has_cargo and verification fields (aliases and sources in full records) — under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: this dataset's provenance is pending independent verification (the envelope's provenance_status says so) — confirm operationally critical codes with IATA/ICAO or the carrier.

Related: airport_lookup (searches AIRPORTS, not carriers), validate (checks an AWB number's check digit and names its airline from this dataset when one record holds the prefix, otherwise lists the candidates).

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNoLists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record.
iataNoExact IATA code (2 alphanumeric chars)
icaoNoExact ICAO code (3 letters)
limitNoLists only: rows per page (default: every row for summaries; 5 with full: true).
queryNoGeneral search (name, code, prefix or country — min 2 chars)
offsetNoLists only: rows to skip (default 0). The response gives total and next_offset.
prefixNoAWB prefix (3 digits)
countryNoFilter by country name (min 2 chars)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
airport_lookupAirport Code Lookup
Read-onlyIdempotent
Inspect

Look up an airport by IATA code (3 letters, e.g. "LHR"), ICAO code (4 chars, e.g. "EGLL"), or free-text name/city search (e.g. "heathrow"). Covers 85,555 airports worldwide (OurAirports, public domain, cross-checked vs OpenFlights + Wikidata).

Provide ONE of iata, icao, or query; the optional type filter narrows results. Behavior: read-only; exact code hits return one record; ambiguous name searches return ranked candidates (exact codes first, then larger airports) with match quality reported via the envelope's confidence (basis match_quality); an unknown code errors with a not-found message. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: count and results[] — per airport: IATA + ICAO/ident, name, type (large/medium/small/heliport/closed/seaplane), municipality, region, country, latitude/longitude and elevation_ft — under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: reference data only — not for navigation; verify operationally critical codes with IATA / ICAO.

Related: nearest_airport (find airports FROM a coordinate), airline_lookup (searches CARRIERS / AWB prefixes, not airports), unlocode_lookup (general transport locations, of which airports are one function).

ParametersJSON Schema
NameRequiredDescriptionDefault
iataNoExact IATA code (3 letters)
icaoNoExact ICAO / ident (4 chars)
typeNoOptional filter by airport type
queryNoName / city / municipality search (min 2 chars)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
cbm_calculatorCBM Calculator
Read-onlyIdempotent
Inspect

Calculate cubic metres (CBM) for a shipment from per-piece dimensions. CBM is the standard volume unit in international shipping: 1 CBM = 1m x 1m x 1m = 1,000 litres, and ocean freight prices per "freight tonne" (1 CBM or 1,000 kg, whichever is greater).

Behavior: deterministic — identical inputs always return identical figures; total volume = pieces x per-piece CBM (totals are computed from unrounded figures and rounded only for display), with conversions to cubic feet, cubic inches and litres (exact factors: 1 ft = 0.3048 m). Missing or non-positive dimensions error with a validation message naming the parameter. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: cbm_per_piece, total_cbm, cubic_feet, litres, cubic_inches and pieces under result, plus confidence, _source and citation (the FreightUtils v1 response envelope). Field names as this package serves them (snake_case); the hosted /api/mcp endpoint serves the same fields in camelCase (e.g. total_cbm → totalCbm).

Related: chargeable_weight_calculator (air billing weight from the same dims), consignment_calculator (multi-line totals), unit_converter (single conversions), shipment_summary (full composite analysis).

ParametersJSON Schema
NameRequiredDescriptionDefault
piecesNoNumber of identical pieces (default: 1)
width_cmYesWidth in centimetres
height_cmYesHeight in centimetres
length_cmYesLength in centimetres

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
chargeable_weight_calculatorChargeable Weight Calculator
Read-onlyIdempotent
Inspect

Calculate air freight chargeable weight — the greater of actual gross weight and volumetric weight, which is what airlines bill. Volumetric weight (kg) = (L x W x H in cm) / divisor; the IATA-standard divisor is 6,000 (1 CBM = 166.67 kg), while express integrators (DHL, FedEx, UPS) typically use 5,000.

Behavior: deterministic; the dimensions are per piece and gross_weight_kg is the TOTAL for all pieces; totals are computed from unrounded figures and rounded only for display (10,000 pieces of 5 x 5 x 6 cm = 250 kg); basis reports which weight governs ("volumetric" = cargo is light for its size, "actual" = dense). Air mode only — sea W/M (1 CBM = 1,000 kg) is covered by consignment_calculator with mode=sea. Missing or non-positive inputs error with the failing parameter named. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: chargeable_weight_kg, basis, volumetric_weight_kg (the total; the hosted endpoint names it volumetricWeightTotalKg) and volumetric_weight_per_piece_kg, gross_weight_kg, cbm, ratio, factor and pieces under result; normalized_input echoes the interpreted inputs (gross_weight_basis, dimensions_basis) and any defaults applied; plus confidence, _source and citation (the FreightUtils v1 response envelope). Field names as this package serves them (snake_case); the hosted /api/mcp endpoint serves the same fields in camelCase (e.g. total_cbm → totalCbm).

Related: cbm_calculator (volume only), consignment_calculator (multi-line, all modes), uld_lookup (the equipment the freight flies in).

ParametersJSON Schema
NameRequiredDescriptionDefault
factorNoVolumetric divisor (default: 6000)
piecesNoNumber of identical pieces (default: 1)
width_cmYesWidth in centimetres
height_cmYesHeight in centimetres
length_cmYesLength in centimetres
gross_weight_kgYesActual gross weight in kilograms of ALL pieces together (the total, not one piece) — the dimensions are per piece.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
consignment_calculatorConsignment Calculator
Read-onlyIdempotent
Inspect

Calculate per-line and grand totals for a multi-item mixed consignment: CBM, loading metres (LDM), volumetric weight, and the mode-specific chargeable figure (air chargeable weight, sea revenue tonnes, road LDM), plus objective advisory flags.

Provide mode (sea | air | road, default road) and either lines[] (canonical — per line: quantity, dims {l,w,h,unit}, weight {value,unit}, optional description / hs_code / un_number / stackable) or the legacy flat items[] (dimensions in cm, weight in kg). Air uses an IATA volumetric divisor (default 6000, settable via options.air_volumetric_divisor); options.container_number / options.awb_number add a check-digit sanity flag.

Behavior: deterministic; flags are advisory only — implausible density, mode/option mismatch, dangerous-goods presence by UN number against ADR 2025, and container/AWB check-digit validity — and never state that a shipment is permitted or compliant. Invalid lines error naming the offending field. Canonical schema: https://www.freightutils.com/schema/consignment.v1.json. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: schema_version, mode, per_line[] (cbm, gross_weight_kg, density, volumetric_weight_kg, ldm, revenue_tonnes, chargeable_weight_kg), totals (incl. billing_basis) and flags[] under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: best-effort deterministic calculation and reference data — not regulatory, customs or dangerous-goods compliance advice; classification, documentation and carrier acceptance remain your responsibility.

Related: cbm_calculator / chargeable_weight_calculator / ldm_calculator (single-figure versions), shipment_summary (adds vehicle/container suggestion and duty estimates), adr_lookup (what a flagged UN number is).

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoTransport mode: sea | air | road (default road). Selects the chargeable-weight basis.
itemsNoDeprecated flat alias — dimensions in cm, weight in kg. Prefer "lines". Provide lines OR items.
linesNoCanonical consignment lines (preferred). Each: { quantity, dims:{l,w,h,unit}, weight:{value,unit}, optional description / hs_code / un_number / stackable }.
optionsNoOptional: { air_volumetric_divisor, container_number, awb_number }.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
container_lookupContainer Lookup
Read-onlyIdempotent
Inspect

Get ISO shipping-container specifications, with optional load-fit maths. Covers 10 types: 20ft/40ft standard, 40ft and 45ft high-cube, 20ft/40ft reefer, 20ft/40ft open-top and 20ft/40ft flat-rack.

Provide type as a slug (e.g. "20ft-standard", "40ft-high-cube") for one container's record; omit it to list all 10 as summary rows (full: true for full records). Add item dimensions (item_length_cm/width_cm/height_cm, optional item_weight_kg and item_quantity) to also compute how many such items fit.

Behavior: read-only reference data with per-record provenance (sources, audited_at, decision_rationale); type is read in any letter case, as the ISO size-type code ("45G1") or the short form of its name ("40HC"); an unknown type errors with the valid slugs and the closest one ("20ft-standrd" → 20ft-standard). Fit calculations are geometric best-effort — they do not model load distribution, securing or mixed cargo. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: the container record — internal/external/door dimensions (cm), capacity_cbm, tare_weight_kg, max_gross_kg, max_payload_kg and euro/GMA pallet counts — under result, plus confidence, _source and citation (the FreightUtils v1 response envelope). Field names as this package serves them (snake_case); the hosted /api/mcp endpoint serves the same fields in camelCase (e.g. total_cbm → totalCbm). A list (no single record asked for) returns summary rows with total, truncated, next_offset and detail_hint; full: true returns full records five per page, with offset / limit to page.

Limitations: manufacturer-typical specs, provenance pending independent verification (the envelope's provenance_status says so) — actual equipment varies by lessor and line; confirm against the carrier's equipment guide.

Related: validate (checks a container NUMBER's ISO 6346 check digit — not specs), cbm_calculator / consignment_calculator (the cargo volume to fill it), uld_lookup (the air-freight equivalent).

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNoLists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record.
typeNoContainer slug (e.g., "20ft-standard", "40ft-high-cube"). Omit to list all.
limitNoLists only: rows per page (default: every row for summaries; 5 with full: true).
offsetNoLists only: rows to skip (default 0). The response gives total and next_offset.
item_quantityNoLoad fit: number of items (default 1).
item_width_cmNoLoad fit: item width in cm.
item_height_cmNoLoad fit: item height in cm.
item_length_cmNoLoad fit: item length in cm (with item_width_cm and item_height_cm, and type).
item_weight_kgNoLoad fit: weight of ONE item in kg (default 0 — no weight check).

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
emissions_calculatorFreight Emissions Calculator
Read-onlyIdempotent
Inspect

Estimate freight transport greenhouse-gas emissions (kgCO2e) for a shipment leg, per ISO 14083:2023 / GLEC Framework v3.2: emissions = mass x distance x a published emission-intensity factor (kgCO2e/tonne-km).

Provide mass + distance_km + mode (road | rail | sea | air | inland_waterway); optionally choose sub_mode, region/authority (uk = DEFRA, us = EPA, fr = ADEME) and basis (wtw default, or ttw). IMPORTANT: pass ACTUAL GROSS MASS, not chargeable/volumetric weight (a common air-freight mistake — see mass_basis in the result). Distance must be provided — this tool does NOT route, geocode, or compute distances.

Behavior: deterministic given the same factor edition; the fleet-average factor already includes average empty running (see empty_running) — do NOT add your own empty-return leg; sea and air are low-representativeness generic defaults (real emissions vary materially by vessel/aircraft, load factor and routing — see representativeness and the result summary). An unknown mode/sub_mode/region returns available:false with the covered options, never a fabricated factor. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: well-to-wheel AND tank-to-wheel emissions where the factor has both, the exact factor used (value, authority, edition), the tonne-km activity and a per-result _source citing BOTH the ISO method and the specific published factor, all under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: best-effort reference estimate from published factors (DEFRA / EPA / ADEME) — NOT a verified or audited carbon report.

Related: distinct from cbm_calculator / ldm_calculator / chargeable_weight_calculator (those size or bill a shipment; this one estimates its CO2e).

ParametersJSON Schema
NameRequiredDescriptionDefault
massYesShipment mass, expressed in mass_unit. Example: 1000
modeYesTransport mode
basisNoEmissions basis: wtw = well-to-wheel incl. upstream energy (default), ttw = tank-to-wheel / operation only
regionNoFactor source/region: uk = DEFRA, us = EPA, fr = ADEME. Default is per-mode.
sub_modeNoOptional sub-mode / vehicle class (e.g. "articulated", "container ship", "long-haul"). Omit for the representative default; an unknown value returns available:false with the covered list.
mass_unitNoUnit for mass (default: kg)
distance_kmYesTransport distance in kilometres — you provide it; the tool does not route or compute distance

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
hs_code_lookupHS Code Lookup
Read-onlyIdempotent
Inspect

Search 6,940 WCO Harmonized System (HS 2022) commodity codes — the 6-digit international customs classification layer. The first 2 digits are the chapter, 4 the heading, 6 the subheading.

Provide ONE of: query (free-text description search, min 2 chars), code (2-6 digit lookup, written with or without dots or spaces — "8471.30" is 847130 — returns the code plus its hierarchy), or section (Roman numeral I-XXI to browse a section).

Behavior: read-only; description search runs first against the HS 2022 descriptions (UN Comtrade H6); when none contains the words, it falls back to the UK Trade Tariff search references (HMRC's index of everyday goods names), so "laptop" finds 847130 and "computers" finds heading 8471. A fallback match is medium confidence: matched_via names HMRC's index, the citation asks you to confirm the code, and the formal tariff wording ("automatic data processing machines") stays the surest search. count 0 with an empty results[] is still a valid answer when neither finds the words. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: the query/code echo, count and results[] (hscode, description and hierarchy context) under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: the 6-digit international level only — national tariff lines (8-10 digits) and duty rates are set per country; classification here is indicative, not a binding ruling.

Related: uk_duty_calculator (duty/VAT for a code found here), ics2_check (EU ENS goods-description quality — a different check entirely).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoExact HS code: 2–6 digits, written with or without dots or spaces (e.g. "847130", "8471.30", "0901").
queryNoSearch by product description (min 2 chars)
sectionNoBrowse by section (Roman numeral I–XXI)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
ics2_checkICS2 Stop-Words Checker
Read-onlyIdempotent
Inspect

Check a goods description against the official EU ICS2 stop-words list — terms the European Commission deems too vague or generic for an entry summary declaration (ENS) goods-description field (data element 18 05 000 000).

Pass description=. Behavior: deterministic term matching against the in-force EU list; each flagged term carries a note (a standalone stop-word means automatic rejection, an embedded one means make the description more specific); clean=true means no listed term matched — it does NOT guarantee acceptance, and no binary accepted/rejected verdict is given. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: the description echo, flagged[] (term + note), clean, caveat and disclaimer under result, plus a _source citing the EU list and legal basis, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: STRICTLY a reference check — not an ENS filing, not a customs-compliance determination, not legal advice; the EU list is non-exhaustive and updated periodically.

Related: hs_code_lookup (commodity codes — a different field of the ENS), uk_duty_calculator (duty/VAT, unrelated to ENS screening). Intended for checking a goods description before an ENS is filed.

ParametersJSON Schema
NameRequiredDescriptionDefault
descriptionYesThe goods description to check against the EU ICS2 stop-words list.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
incoterms_lookupIncoterms 2020 Lookup
Read-onlyIdempotent
Inspect

Look up the 11 Incoterms 2020 trade rules — who pays for transport, insurance and customs clearance, and where risk transfers from seller to buyer. 7 rules work for any transport mode (EXW, FCA, CPT, CIP, DAP, DPU, DDP); 4 are sea/inland-waterway only (FAS, FOB, CFR, CIF).

Provide code for one rule, category (any_mode | sea_only) for a filtered list, or neither to list all 11 (a list is summary rows — code, name, category, summary — with full: true for the full rules). Behavior: read-only reference; an unknown code errors with the valid code list, and DAT — replaced in Incoterms 2020 — names its successor, DPU (ICC). Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: the rule record — name, category, summary, seller_responsibility, buyer_responsibility, risk_transfer, cost_transfer, insurance, export/import clearance, best_for and watch_out — under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: summarised guidance on ICC Incoterms 2020; the ICC publication is the binding text and specific contract wording prevails.

Related: uk_duty_calculator (accepts an incoterm when composing the CIF value), shipment_summary (composite analysis).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoIncoterm code (3 letters, e.g., "FOB", "CIF")
fullNoLists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record.
limitNoLists only: rows per page (default: every row for summaries; 5 with full: true).
offsetNoLists only: rows to skip (default 0). The response gives total and next_offset.
categoryNoFilter by mode

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
ldm_calculatorLDM Calculator
Read-onlyIdempotent
Inspect

Calculate loading metres (LDM) for European road freight — how much trailer length a pallet load occupies. 1 LDM = 1 linear metre of a 2.4m-wide trailer; a standard artic is 13.6 LDM.

Provide a pallet preset OR custom length_mm + width_mm — omitting both errors with a usage hint. Behavior: deterministic; stackable=true with stack_height 2 or 3 divides the floor footprint accordingly; fits is true only when the load fits the vehicle's LENGTH, its pallet FLOOR POSITIONS and — when weight_kg is given — its max PAYLOAD; each failed limit is named in warnings[] with its numbers. Euro and UK pallets count as their own floor positions (pallet_spaces.basis says which), other footprints as Euro equivalents. The vehicle's floor positions are its record's own count only when that count is a floor count; a weight-limited or unverified count (the 7.5t rigid stores 8, its 6.1 x 2.4 m deck holds 15) is not, and the positions come from the deck instead — pallet_spaces.floor_positions_basis says which, record_count is the stored figure. Without weight_kg the payload is not checked: payload_checked is false and an info warning gives the payload. utilisation_percent is of the vehicle's length. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: ldm, vehicle (name, length_m, max_payload_kg), utilisation_percent, pallet_spaces (used, available, basis, floor_positions_basis, floor_positions_note, record_count, record_count_basis), total_weight_kg, payload_checked, fits and warnings under result, plus confidence, _source and citation (the FreightUtils v1 response envelope). Field names as this package serves them (snake_case); the hosted /api/mcp endpoint serves the same fields in camelCase (e.g. total_cbm → totalCbm).

Related: vehicle_lookup (the trailer specs behind the vehicle presets), pallet_fitting_calculator (boxes onto one pallet), consignment_calculator (mixed lines including LDM).

ParametersJSON Schema
NameRequiredDescriptionDefault
palletNoPallet preset
vehicleNoVehicle type. DEPRECATED: rigid10 (removal in 3.0.0) — its 10 m length is published by no manufacturer; use custom with vehicle_length_m, or artic.
quantityNoNumber of pallets (default: 1)
width_mmNoCustom pallet width in mm
length_mmNoCustom pallet length in mm
stackableNoCan pallets be stacked?
weight_kgNoWeight per pallet in kg
stack_heightNoStack height 2 or 3
vehicle_length_mNoCustom vehicle length in m

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
nearest_airportNearest Airport
Read-onlyIdempotent
Inspect

Find the airports nearest to a caller-provided latitude/longitude, sorted by great-circle (haversine) distance with distance_km on each result. Searches 85,555 airports (OurAirports, public domain).

Provide latitude and longitude (decimal degrees); optional radius_km, max_results (1-50, default 10) and type filter (e.g. large_airport only). Coordinates are INPUT only — nothing is stored or logged.

Behavior: deterministic distance sort; confidence reflects proximity and airport size (a large airport within 25 km scores high; closed/heliport/seaplane results cap lower). This tool does NOT geocode place names and does NOT compute routes — pass coordinates you already hold. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: count and results[] (the airport record plus distance_km) under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: reference data only — not for navigation; verify codes with IATA / ICAO.

Related: airport_lookup (exact code or name lookup, no distance), unlocode_lookup (named transport-location search).

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoOptional filter by airport type
latitudeYesLatitude in decimal degrees (-90 to 90)
longitudeYesLongitude in decimal degrees (-180 to 180)
radius_kmNoOptional maximum distance in kilometres
max_resultsNoMax results to return (1–50, default 10)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
pallet_fitting_calculatorPallet Fitting Calculator
Read-onlyIdempotent
Inspect

Calculate how many identical boxes fit on a pallet: boxes per layer (trying 90-degree rotation when allowed), layer count within the max height, totals, footprint and volume utilisation, and weight capping.

Behavior: deterministic geometric packing of one box size in aligned rows and columns — it does not model interlocked or mixed-orientation patterns; weight_limited reports when max_payload_kg caps the count below the geometric fit, counted in whole layers (notes say when a part layer is left out, and why nothing fits when no box fits); pallet_deck_height_cm defaults to 15. Missing or non-positive dimensions error naming the parameter. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: boxes_per_layer, layers, total_boxes, orientation, boxes_per_row/col, usable_height_cm, utilisation_percent (the share of the pallet FOOTPRINT one layer covers), volume_utilisation_percent (box volume over the usable envelope), total_box_volume_cbm, wasted_space_cbm, max_boxes_by_weight, notes and the weight fields under result, plus confidence, _source and citation (the FreightUtils v1 response envelope). Field names as this package serves them (snake_case); the hosted /api/mcp endpoint serves the same fields in camelCase (e.g. total_cbm → totalCbm).

Limitations: a theoretical best-effort fit — real stacking obeys carton strength, overhang and load-stability rules it does not model.

Related: ldm_calculator (pallets into trailer length), vehicle_lookup (pallet capacity per vehicle), container_lookup (pallets into containers).

ParametersJSON Schema
NameRequiredDescriptionDefault
box_width_cmYesBox width in cm
box_height_cmYesBox height in cm
box_length_cmYesBox length in cm
box_weight_kgNoBox weight in kg
allow_rotationNoAllow 90-degree rotation (default: true)
max_payload_kgNoMax pallet payload in kg
pallet_width_cmYesPallet width in cm
pallet_length_cmYesPallet length in cm
pallet_max_height_cmYesMax stack height in cm
pallet_deck_height_cmNoPallet deck height (default: 15cm)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
resolve_referenceResolve Freight Reference
Read-onlyIdempotent
Inspect

Resolve an arbitrary freight identifier — one opaque string in, typed and cited candidates out. Use when you hold one identifier-ish token ("176", "UN1845", "NLRTM", "FOB", "22G1", "MSKU1100810", "D/E") and do not know what kind of identifier it is: each candidate names its entity type and carries the api_url and canonical_url of its full record.

Provide q: ONE identifier (single token, max 32 chars). Thirteen grammars all run — UN numbers, AWB prefixes, airline IATA/ICAO, airport IATA/ICAO, UN/LOCODE, ISO 6346 container numbers (check digit computed), HS codes (6-10 digits; national lines resolve at their 6-digit international parent), Incoterms, ADR tunnel codes, ULD serials, ISO container size/type codes. Ambiguity is the product: colliding grammars return MULTIPLE ranked candidates ("LHR" is Heathrow AND an Egyptian carrier's ICAO), never a silent guess.

Behavior: deterministic — normalize (trim, uppercase, collapse spaces/dashes, strip a UN prefix), match ALL grammars, rank by record-hit > verification status > static dataset prior (airlines/adr/unlocode first) > stable tiebreak; every candidate carries rank_basis so the ordering is inspectable. Zero candidates is a VALID result (count 0 + note), never an error. A failed container check digit returns a candidate with valid:false rather than dropping it. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: query, normalized, count and candidates[] — each with entity_type, identifier_type, value_normalized, summary, record (the core fields the matching dataset holds), verification_status + verification_basis, rank_basis, canonical_url, api_url and a per-candidate dataset citation — under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: v1 is SINGLE-TOKEN resolution, not free-text extraction — pass one identifier, not a manifest line; SCAC/BIC codes are not yet covered; a match asserts the identifier is known/well-formed, not that a shipment exists.

Related: every lookup tool this resolves into — adr_lookup, airline_lookup, airport_lookup, unlocode_lookup, hs_code_lookup, incoterms_lookup, container_lookup, uld_lookup, validate.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesOne freight identifier — e.g. "176", "UN1845", "NLRTM", "FOB", "LHR", "22G1", "MSKU1100810", "090111", "AKE12345AB", "D/E".

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
shipment_summaryShipment Summary
Read-onlyIdempotent
Inspect

Composite shipment analysis in one call: volume (CBM), gross and chargeable weight, road LDM with pallet spaces and a vehicle suggestion (road mode), volumetric weight (air), revenue tonnes with a container suggestion (sea), dangerous-goods presence for items carrying un_number, and UK duty estimates for items carrying hs_code + customs_value.

Provide mode (road | air | sea | multimodal) and items[] (dims in cm, weight in kg PER ITEM, quantity; optional stackable, pallet_type, hs_code, un_number, customs_value PER ITEM, and adr_quantity — the TOTAL for the dangerous-goods line, all pieces together); origin/destination and incoterm refine the duty leg.

Behavior: calls the ldm_calculator, adr_lookup and uk_duty_calculator engines directly; CBM, volumetric weight and revenue tonnes are the same arithmetic inline rather than a call out. Road LDM uses the 2.40 m loading-metre convention divisor and, like ldm_calculator, treats an item with no stackable flag as NOT stacked. modeSpecific.palletSpaces is pallet FLOOR POSITIONS (the figure ldm_calculator reports); palletRows is the separate row count. The suggested vehicle is the smallest that holds the load by its length, its payload and its pallet floor positions — the record's own count when it is a floor count, otherwise worked from its deck (a 7.5t rigid holds 15 Euro pallets on the floor; modeSpecific.suggestedVehicleFloorPositions says which) — and trailerUtilisation is of that vehicle (utilisationBasis names it); the suggested container is the smallest dry box whose record holds the volume and payload. Sections that cannot run (e.g. duty without a customs value) surface in warnings instead of failing the whole call. Fields are checked by name: a field the tool does not read is refused with a tool error naming it and listing the accepted ones, never ignored. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: mode, itemCount, totals {pieces, grossWeight, volumeCBM, chargeableWeight, billingBasis}, modeSpecific (LDM / pallet floor positions / pallet rows / suggested vehicle, or revenue tonnes / container), warnings and dataVersion (road mode attributes the vehicle dataset and the LDM divisor) under result — note this composite's result uses camelCase field names (legacy shape); plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: a planning summary, not a quotation or compliance determination.

Related: consignment_calculator (canonical snake_case lines[] shape with advisory flags), cbm_calculator, chargeable_weight_calculator, ldm_calculator, adr_lookup, uk_duty_calculator. ldm_calculator, adr_lookup and uk_duty_calculator are the engines this actually calls; the rest are the single-purpose equivalents of arithmetic it does inline.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeYesTransport mode
itemsYesArray of shipment items with dimensions, weight, and optional HS/UN codes
originNoOrigin location — ISO country code and optional UN/LOCODE
incotermNoIncoterms 2020 three-letter code (e.g. 'DAP', 'EXW', 'FOB')
destinationNoDestination location — ISO country code and optional UN/LOCODE
freight_costNoOptional freight cost in GBP for duty calculation, 0 or more (default 0)
insurance_costNoOptional insurance cost in GBP for duty calculation, 0 or more (default 0)

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
uk_duty_calculatorUK Duty & VAT Calculator
Read-onlyIdempotent
Inspect

Estimate UK import duty and VAT for a commodity code using the LIVE GOV.UK Trade Tariff — rates are fetched per request, not from a static table. The CIF value is composed from customs_value + freight_cost + insurance_cost; duty = CIF x the duty rate for the origin country; VAT (typically 20%) applies on the duty-inclusive value.

Provide commodity_code (a declarable 10-digit code), origin_country (ISO-2) and customs_value in GBP; freight_cost, insurance_cost and incoterm are optional refinements.

Behavior: live lookup plus deterministic arithmetic on the returned rate; a 6- or 8-digit code is refused — never padded with zeros to a code you did not send — with declarable_codes, the 10-digit codes beneath it in the UK Trade Tariff (610910 → 6109100010, 6109100090); an origin that is not an ISO 3166-1 country is refused; origin-dependent measures the tariff cannot resolve automatically surface in warnings. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: commodity_code and description, origin country, cif_value, duty_rate (+ percent), duty_amount, vat_rate, vat_amount, total_import_taxes, total_landed_cost and warnings under result (amounts in GBP); validity.as_of marks the live-rate timestamp; plus confidence, _source and citation (the FreightUtils v1 response envelope). Field names as this package serves them (snake_case); the hosted /api/mcp endpoint serves the same fields in camelCase (e.g. total_cbm → totalCbm).

Limitations: an estimate, not a customs ruling — excise, quotas, anti-dumping measures, reliefs and origin-proof requirements can change the outcome; confirm with a customs broker or HMRC before relying on it.

Related: hs_code_lookup (find the 6-digit code first), incoterms_lookup (who actually pays these costs).

ParametersJSON Schema
NameRequiredDescriptionDefault
incotermNoIncoterm basis
freight_costNoFreight cost in GBP, 0 or more (default 0)
customs_valueYesCustoms value in GBP
commodity_codeYesUK tariff commodity code — a declarable 10 digits, spaces allowed (a 6- or 8-digit code is refused with the declarable codes beneath it)
insurance_costNoInsurance cost in GBP, 0 or more (default 0)
origin_countryYesISO 2-letter country of origin (e.g. "CN", "US")

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
uld_lookupAir Cargo ULD Lookup
Read-onlyIdempotent
Inspect

Look up air-cargo ULD (Unit Load Device) specifications — 16 types spanning lower-deck containers (AKE/LD3 and family), main-deck pallets (PMC, PAG and family) and temperature-controlled units. Each record carries external/internal/door dimensions (cm), tare and max gross weight (kg), usable volume (m³), deck position and compatible aircraft.

Provide type as an IATA code ("AKE", "PMC"), slug ("ake-ld3") or the record's own name when one record carries it ("LD3" → AKE); omit it to list all 16; category (container | pallet | special) and deck (lower | main) filter the list.

Behavior: read-only; an unknown type errors with the closest codes; a single record carries its provenance (sources, audited_at, decision_rationale). A list (no single record asked for) returns summary rows with total, truncated, next_offset and detail_hint; full: true returns full records five per page, with offset / limit to page. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: the ULD record (or the list) under result, plus confidence, _source and citation (the FreightUtils v1 response envelope). Field names as this package serves them (snake_case); the hosted /api/mcp endpoint serves the same fields in camelCase (e.g. total_cbm → totalCbm).

Limitations: specs are compiled from manufacturer and carrier-published sources with ≥7 cited sources per record. Provenance is PENDING, not verified — read the envelope's provenance_status rather than this sentence. Second-agent coverage is now COMPLETE — every cited record-URL pairing has been opened and verdicted by a second agent, and 145 of 148 citations carry a timestamped read (the 3 without one were never opened, and say so). COVERAGE IS NOT AGREEMENT, which is why provenance is still pending: reading every page is what made the disagreements visible, not what resolved them. The second agent also WITHDRAWS stamps — pages a first pass had confirmed turned out not to list the code, or to disagree once somebody read the words around them — so treat an unstamped citation as evidence that was tried and failed, not evidence not yet gathered. CORROBORATION IS COUNTED BY PUBLISHER, NOT BY URL: the 148 citations resolve to 125 distinct sources, because several records cite one publisher at several of its own addresses (one carrier's pallet table appears in three of its documents) and several forwarders republish a single upstream template. Two citations of the same source cannot corroborate each other, so a long source list is not the same as a well-corroborated record. Treat tare_weight with particular caution: it is confirmed by no non-tertiary source on 13 of the 16 records. PGA's 565 kg is now read-confirmed by one carrier (Cathay, basis stated on the page as including nets) while two other carrier pages publish 535 kg and 505-545 kg on that same basis, so it is the top of a contested band rather than an agreed figure. Confidence is medium and a PROVENANCE_PENDING advisory rides every response. Pallet records (PMC, PAG, PGA, PLA, PAJ, PMCQ7) have NO internal dimensions — a pallet has no walls or roof; read max_build_up_height_cm for the aircraft contour ceiling and do not multiply dimensions to get a volume. Airline-specific ULD variants still differ; confirm operationally critical dimensions with the carrier.

Related: chargeable_weight_calculator (what the cargo inside is billed at), container_lookup (the sea-freight equivalent), airline_lookup (whose aircraft it flies on).

ParametersJSON Schema
NameRequiredDescriptionDefault
deckNoFilter by deck position
fullNoLists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record.
typeNoULD code (e.g., "AKE", "PMC") or slug (e.g., "ake-ld3"). Omit to list all.
limitNoLists only: rows per page (default: every row for summaries; 5 with full: true).
offsetNoLists only: rows to skip (default 0). The response gives total and next_offset.
categoryNoFilter by ULD category

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
unit_converterUnit Converter
Read-onlyIdempotent
Inspect

Convert freight and logistics units: weight (kg, lbs, oz, tonnes, short_tons, long_tons), volume (cbm, cuft, cuin, litres, gal_us, gal_uk), length (cm, inches, m, feet, mm), plus two freight-specific targets valid only FROM cbm — chargeable_kg (air volumetric weight at the IATA 6,000 divisor: m³ x 1,000,000 / 6000) and freight_tonnes (sea W/M, 1 CBM = 1 freight tonne).

Behavior: deterministic, on the exact legal factors (1 lb = 0.45359237 kg, 1 in = 2.54 cm); the response names both units and states the formula used. Cross-dimension conversions (e.g. kg to litres), a negative value and freight targets from a non-cbm source are refused with the accepted units listed by category. Note: short ton (US) = 2,000 lb, long ton (UK) = 2,240 lb, metric tonne = 2,204.6 lb. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: input {value, unit, name}, result {value, unit, name}, formula and note under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Related: cbm_calculator (dimensions to volume first), chargeable_weight_calculator (proper air billing weight with pieces and a custom divisor).

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesTarget unit — any source unit, plus the freight targets chargeable_kg and freight_tonnes (only valid from cbm)
fromYesSource unit — weight (kg, lbs, oz, tonnes, short_tons, long_tons), volume (cbm, cuft, cuin, litres, gal_us, gal_uk) or length (cm, inches, m, feet, mm)
valueYesValue to convert

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
unlocode_lookupUN/LOCODE Lookup
Read-onlyIdempotent
Inspect

Search 116,232 UN/LOCODE transport locations worldwide — ports, airports, rail and road terminals, inland container depots and border crossings. Codes are 5 characters: a 2-letter ISO country code + a 3-character location code (GBLHR = London Heathrow, NLRTM = Rotterdam).

Provide code for an exact record, or query (name search, min 2 chars) optionally narrowed by country and function_type; limit caps results (default 20, max 100). The spaced notation "GB LHR" reads as GBLHR in either.

Behavior: read-only; exact code hits are provenance-based while fuzzy name hits report match quality via the envelope's confidence (basis match_quality); an unknown code errors with a not-found message. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: the location record(s) — code, name and name_ascii, country, subdivision, functions[], status, coordinates {lat, lon} and iata_code where assigned — under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: an administrative code list (UNECE UN/LOCODE 2025-1) — confirm operational status and coordinates with the port or authority before critical use.

Related: airport_lookup (airport-specific records including ICAO codes), nearest_airport (find airports by coordinates).

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoExact UN/LOCODE lookup (e.g. "GBLHR", "GB LHR", "NLRTM")
limitNoMax results (default 20)
queryNoSearch by name or code (e.g. "Rotterdam", "GBLHR", "LHR")
countryNoISO 2-letter country code filter (e.g. "GB", "NL")
function_typeNoFilter by location function

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
validateFreight Identifier Validator
Read-onlyIdempotent
Inspect

Validate and parse freight identifiers by their public check-digit algorithms: shipping container numbers (ISO 6346), air waybill (AWB) numbers (IATA modulus-7) and IMO ship identification numbers.

Two modes: pass text= to find and validate every identifier in it (e.g. a booking-email line), OR pass value= + type=<container|awb|imo> to validate one.

Behavior: deterministic check-digit arithmetic; per identifier found it reports type, the normalised form, valid (pass/fail), expected vs actual check digit, and details (container: owner prefix + equipment category; AWB: airline prefix + the airline from the AWB-prefix dataset when ONE record holds the prefix — when several do (e.g. 020: Lufthansa and Lufthansa Cargo), airline is null and airline_candidates[] lists every holder with airline_note saying why, never a guessed carrier; IMO: the 7-digit number); text mode with no identifiers found returns an empty found[] with a note. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: found[] (each entry with its own _source naming the standard applied) and disclaimer under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: STRUCTURAL ONLY — a valid check digit means well-formed, NOT that the container, shipment or vessel exists or is active; not a registry or tracking lookup.

Related: container_lookup (container TYPE specs, not numbers), airline_lookup (the AWB-prefix dataset the airline resolution uses).

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoArbitrary string to scan for container / AWB / IMO identifiers (parse mode). Provide this OR value+type.
typeNoIdentifier type for value: container = ISO 6346, awb = IATA Air Waybill, imo = IMO ship number.
valueNoA single identifier to validate (typed mode). Requires type.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo
vehicle_lookupVehicle Lookup
Read-onlyIdempotent
Inspect

Look up road-freight vehicle and trailer specifications — 17 types: EU articulated trailers (standard/mega curtainsider, box, reefer, double-deck, flatbed, low-loader), US 53ft/48ft dry vans, rigid trucks (7.5-26 t) and vans (Luton, Transit, Sprinter). Each record carries internal dimensions, payload and gross weights, euro/UK pallet capacity, axle configuration and features.

Provide slug (e.g. "standard-curtainsider") for one record; omit it to list all 17; category (articulated | rigid | van) and region (EU | US) filter the list.

Behavior: read-only; an unknown slug errors with the valid list and the closest slugs; a single record carries its provenance (sources, audited_at, decision_rationale). A list (no single record asked for) returns summary rows with total, truncated, next_offset and detail_hint; full: true returns full records five per page, with offset / limit to page. Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.

Returns: the vehicle record (or the list) under result, plus confidence, _source and citation (the FreightUtils v1 response envelope). Field names as this package serves them (snake_case); the hosted /api/mcp endpoint serves the same fields in camelCase (e.g. total_cbm → totalCbm).

Limitations: typical specs, provenance pending independent verification (the envelope's provenance_status says so) — real equipment varies by operator and build; legal payload is set by the vehicle's plated weights.

Related: ldm_calculator (whether a pallet load fits), pallet_fitting_calculator, consignment_calculator.

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNoLists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record.
slugNoVehicle slug (e.g., "standard-curtainsider"). Omit to list all.
limitNoLists only: rows per page (default: every row for summaries; 5 with full: true).
offsetNoLists only: rows to skip (default 0). The response gives total and next_offset.
regionNoFilter by region
categoryNoFilter by category

Output Schema

ParametersJSON Schema
NameRequiredDescription
okYes
resultYes
_sourceYes
citationYes
validityNo
warningsNo
confidenceYes
blocking_errorsNo
envelope_versionYes
normalized_inputNo

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedshipment_summary6 fields changed
      • changedInput schema / properties / freight_cost / description
        Previous value: -"Optional freight cost in GBP for duty calculation"New value: +"Optional freight cost in GBP for duty calculation, 0 or more (default 0)"
      • addedInput schema / properties / freight_cost / minimum
        Added value: +0
      • changedInput schema / properties / insurance_cost / description
        Previous value: -"Optional insurance cost in GBP for duty calculation"New value: +"Optional insurance cost in GBP for duty calculation, 0 or more (default 0)"
      • addedInput schema / properties / insurance_cost / minimum
        Added value: +0
      • changedInput schema / properties / items / items / properties / customs_value / description
        Previous value: -"Customs value in GBP PER ITEM (per piece) — multiplied by quantity for the line; the duty estimate uses the sum over all lines."New value: +"Customs value in GBP PER ITEM (per piece), 0 or more — multiplied by quantity for the line; the duty estimate uses the sum over all lines."
      • addedInput schema / properties / items / items / properties / customs_value / minimum
        Added value: +0
  2. 22 tool updates
    • Changedadr_lookup1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedairline_lookup1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedairport_lookup1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedcbm_calculator1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedchargeable_weight_calculator1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedconsignment_calculator2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / items / items / additionalProperties
        Added value: +false
    • Changedcontainer_lookup1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedemissions_calculator1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedget_subscribe_link1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedhs_code_lookup1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedics2_check1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedincoterms_lookup1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedldm_calculator1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changednearest_airport1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedpallet_fitting_calculator1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedresolve_reference1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeduk_duty_calculator1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changeduld_lookup1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedunit_converter1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedunlocode_lookup1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedvalidate1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
    • Changedvehicle_lookup1 field changed
      • addedInput schema / additionalProperties
        Added value: +false
  3. 2 tool updates
    • Changedadr_lookup1 field changed
      • changedInput schema / properties / un_number / pattern
        Previous value: -"^(?:UN\\s*)?\\d{4}$"New value: +"^\\s*(?:UN\\s*)?\\d{4}\\s*$"
    • Changeduk_duty_calculator2 fields changed
      • changedInput schema / properties / commodity_code / description
        Previous value: -"UK tariff commodity code (6-10 digits)"New value: +"UK tariff commodity code — a declarable 10 digits, spaces allowed (a 6- or 8-digit code is refused with the declarable codes beneath it)"
      • changedInput schema / properties / commodity_code / pattern
        Previous value: -"^\\d{6,10}$"New value: +"^[\\d\\s]{6,14}$"
  4. 5 tool updates
    • Changedairline_lookup3 fields changed
      • addedInput schema / properties / full
        Added value: +{
        +  "description": "Lists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Lists only: rows per page (default: every row for summaries; 5 with full: true).",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Lists only: rows to skip (default 0). The response gives total and next_offset.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedcontainer_lookup3 fields changed
      • addedInput schema / properties / full
        Added value: +{
        +  "description": "Lists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Lists only: rows per page (default: every row for summaries; 5 with full: true).",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Lists only: rows to skip (default 0). The response gives total and next_offset.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedincoterms_lookup3 fields changed
      • addedInput schema / properties / full
        Added value: +{
        +  "description": "Lists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Lists only: rows per page (default: every row for summaries; 5 with full: true).",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Lists only: rows to skip (default 0). The response gives total and next_offset.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changeduld_lookup3 fields changed
      • addedInput schema / properties / full
        Added value: +{
        +  "description": "Lists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Lists only: rows per page (default: every row for summaries; 5 with full: true).",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Lists only: rows to skip (default 0). The response gives total and next_offset.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedvehicle_lookup3 fields changed
      • addedInput schema / properties / full
        Added value: +{
        +  "description": "Lists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Lists only: rows per page (default: every row for summaries; 5 with full: true).",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Lists only: rows to skip (default 0). The response gives total and next_offset.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
  5. 1 tool update
    • Changedcontainer_lookup5 fields changed
      • addedInput schema / properties / item_height_cm
        Added value: +{
        +  "description": "Load fit: item height in cm.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / item_length_cm
        Added value: +{
        +  "description": "Load fit: item length in cm (with item_width_cm and item_height_cm, and type).",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / item_quantity
        Added value: +{
        +  "description": "Load fit: number of items (default 1).",
        +  "exclusiveMinimum": 0,
        +  "maximum": 9007199254740991,
        +  "type": "integer"
        +}
      • addedInput schema / properties / item_weight_kg
        Added value: +{
        +  "description": "Load fit: weight of ONE item in kg (default 0 — no weight check).",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / item_width_cm
        Added value: +{
        +  "description": "Load fit: item width in cm.",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
  6. 5 tool updates
    • Changedadr_exemption_calculator2 fields changed
      • changedInput schema / properties / items / items / properties / un_number / pattern
        Previous value: -"^(?:(?:UN)?\\d{4}|\\s*ID\\s*[-:.]?\\s*\\d{4}\\s*)$"New value: +"^(?:\\s*(?:UN\\s*)?\\d{4}\\s*|\\s*ID\\s*[-:.]?\\s*\\d{4}\\s*)$"
      • changedInput schema / properties / un_number / pattern
        Previous value: -"^(?:(?:UN)?\\d{4}|\\s*ID\\s*[-:.]?\\s*\\d{4}\\s*)$"New value: +"^(?:\\s*(?:UN\\s*)?\\d{4}\\s*|\\s*ID\\s*[-:.]?\\s*\\d{4}\\s*)$"
    • Changedadr_lookup2 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "search / hazard_class only: rows per page (default 10; at most 50 for search, 100 for hazard_class).",
        +  "maximum": 100,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "search / hazard_class only: rows to skip (default 0). The response gives total and next_offset.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
    • Changedadr_lq_eq_check2 fields changed
      • changedInput schema / properties / items / items / properties / un_number / description
        Previous value: -"UN number — 4 digits, optionally \"UN\"-prefixed; explosives keep the leading zero. Examples: \"1203\", \"UN1263\", \"0004\"."New value: +"UN number — 4 digits, optionally \"UN\"-prefixed; explosives keep the leading zero. Examples: \"1203\", \"UN1263\", \"UN 1263\", \"0004\"."
      • changedInput schema / properties / items / items / properties / un_number / pattern
        Previous value: -"^(UN)?\\d{4}$"New value: +"^\\s*(?:UN\\s*)?\\d{4}\\s*$"
    • Changedhs_code_lookup2 fields changed
      • changedInput schema / properties / code / description
        Previous value: -"Exact HS code (2-6 digits)"New value: +"Exact HS code: 2–6 digits, written with or without dots or spaces (e.g. \"847130\", \"8471.30\", \"0901\")."
      • removedInput schema / properties / code / pattern
        Removed value: -"^\\d{2,6}$"
    • Changedunlocode_lookup2 fields changed
      • changedInput schema / properties / code / description
        Previous value: -"Exact UN/LOCODE lookup (e.g. \"GBLHR\", \"NLRTM\")"New value: +"Exact UN/LOCODE lookup (e.g. \"GBLHR\", \"GB LHR\", \"NLRTM\")"
      • changedInput schema / properties / code / pattern
        Previous value: -"^[A-Za-z0-9]{5}$"New value: +"^\\s*[A-Za-z]{2}[\\s-]?[A-Za-z0-9]{3}\\s*$"
  7. 2 tool updates
    • Changedchargeable_weight_calculator1 field changed
      • changedInput schema / properties / gross_weight_kg / description
        Previous value: -"Actual gross weight in kilograms"New value: +"Actual gross weight in kilograms of ALL pieces together (the total, not one piece) — the dimensions are per piece."
    • Changedshipment_summary2 fields changed
      • changedInput schema / properties / items / items / properties / adr_quantity / description
        Previous value: -"ADR 1.1.3.6.3 quantity for this dangerous-goods line, in adr_quantity_unit. SEPARATE from weight, which is gross package mass — 1.1.3.6.3 counts none of its four categories that way. Supply both on EVERY dangerous-goods line and adrFlags.totalPoints is calculated; omit either and it stays null."New value: +"ADR 1.1.3.6.3 quantity for this dangerous-goods line — the total for the whole line, all pieces together (never per piece), in adr_quantity_unit. SEPARATE from weight, which is gross package mass — 1.1.3.6.3 counts none of its four categories that way. Supply both on EVERY dangerous-goods line and adrFlags.totalPoints is calculated; omit either and it stays null."
      • addedInput schema / properties / items / items / properties / customs_value / description
        Added value: +"Customs value in GBP PER ITEM (per piece) — multiplied by quantity for the line; the duty estimate uses the sum over all lines."
  8. 2 tool updates
    • Changedadr_lookup3 fields changed
      • changedInput schema / properties / hazard_class / description
        Previous value: -"Filter by ADR hazard class and its divisions. Examples: \"3\" (flammable liquids), \"6.1\" (toxic), \"8\" (corrosive), \"1.4\" (an explosives division)."New value: +"Filter by ADR hazard class (Table A column (3a)). Examples: \"3\" (flammable liquids), \"6.1\" (toxic), \"8\" (corrosive), \"1\" (explosives — the division and compatibility group are in classification_code, e.g. \"1.4S\")."
      • changedInput schema / properties / un_number / description
        Previous value: -"Exact UN number — 4 digits, optionally \"UN\"-prefixed; explosives keep their leading zero. Examples: \"1203\", \"UN1203\", \"0004\"."New value: +"Exact UN number — 4 digits, optionally \"UN\"-prefixed; explosives keep their leading zero. Examples: \"1203\", \"UN1203\", \"UN 1203\", \"0004\"."
      • changedInput schema / properties / un_number / pattern
        Previous value: -"^(UN)?\\d{4}$"New value: +"^(?:UN\\s*)?\\d{4}$"
    • Changeduk_duty_calculator4 fields changed
      • changedInput schema / properties / freight_cost / description
        Previous value: -"Freight cost in GBP (default 0)"New value: +"Freight cost in GBP, 0 or more (default 0)"
      • addedInput schema / properties / freight_cost / minimum
        Added value: +0
      • changedInput schema / properties / insurance_cost / description
        Previous value: -"Insurance cost in GBP (default 0)"New value: +"Insurance cost in GBP, 0 or more (default 0)"
      • addedInput schema / properties / insurance_cost / minimum
        Added value: +0
  9. 3 tool updates
    • Changedadr_exemption_calculator3 fields changed
      • addedInput schema / properties / items / items / properties / quantity / maximum
        Added value: +1000000000
      • addedInput schema / properties / items / minItems
        Added value: +1
      • addedInput schema / properties / quantity / maximum
        Added value: +1000000000
    • Changedadr_lq_eq_check1 field changed
      • addedInput schema / properties / items / items / properties / quantity / maximum
        Added value: +1000000000
    • Changedshipment_summary5 fields changed
      • addedInput schema / properties / items / items / properties / adr_quantity / maximum
        Added value: +1000000000
      • changedInput schema / properties / items / items / properties / quantity / maximum
        Previous value: -9007199254740991New value: +1000000
      • addedInput schema / properties / items / items / properties / weight / minimum
        Added value: +0
      • addedInput schema / properties / items / maxItems
        Added value: +50
      • addedInput schema / properties / items / minItems
        Added value: +1
  10. 3 tool updates
    • Changedadr_exemption_calculator2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / items / items / additionalProperties
        Added value: +false
    • Changedadr_lq_eq_check2 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / items / items / additionalProperties
        Added value: +false
    • Changedshipment_summary4 fields changed
      • addedInput schema / additionalProperties
        Added value: +false
      • addedInput schema / properties / destination / additionalProperties
        Added value: +false
      • addedInput schema / properties / items / items / additionalProperties
        Added value: +false
      • addedInput schema / properties / origin / additionalProperties
        Added value: +false
  11. 1 tool update
    • Changedadr_exemption_calculator8 fields changed
      • changedInput schema / properties / basis / description
        Previous value: -"OPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging, so a figure declared 'gross' returns no points in ANY unit — send the net quantity instead."New value: +"OPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging, so a figure declared 'gross' returns no points in ANY unit — send the net quantity instead. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item."
      • changedInput schema / properties / items / items / properties / un_number / description
        Previous value: -"UN number (4 digits, optionally \"UN\"-prefixed)"New value: +"UN number (4 digits, optionally \"UN\"-prefixed) — or an ID-prefixed air-only number such as \"ID8000\" (routed AIR_ONLY_ID; the warning on that line states the limited-quantity condition the 0 rests on)"
      • changedInput schema / properties / items / items / properties / un_number / pattern
        Previous value: -"^(UN)?\\d{4}$"New value: +"^(?:(?:UN)?\\d{4}|\\s*ID\\s*[-:.]?\\s*\\d{4}\\s*)$"
      • changedInput schema / properties / packing_group / description
        Previous value: -"Packing group (I, II or III) — only needed to disambiguate a UN that has more than one ADR Table A row (e.g. UN 1789). Ignored for single-row UNs."New value: +"Packing group (I, II or III) — only needed to disambiguate a UN that has more than one ADR Table A row (e.g. UN 1789). Ignored for single-row UNs. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item."
      • changedInput schema / properties / un_number / description
        Previous value: -"UN number for single check (4 digits, optionally \"UN\"-prefixed)"New value: +"UN number for single check (4 digits, optionally \"UN\"-prefixed) — or an ID-prefixed air-only number such as \"ID8000\", which has no ADR Table A entry and is routed AIR_ONLY_ID (nothing counted under 1.1.3.6 — the ADR answer for limited-quantity packages to the ICAO Technical Instructions, 3.4.9 / 3.4.10 / 1.1.3.6.5, as the warning on that line states). Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — send the substance as an item."
      • changedInput schema / properties / un_number / pattern
        Previous value: -"^(UN)?\\d{4}$"New value: +"^(?:(?:UN)?\\d{4}|\\s*ID\\s*[-:.]?\\s*\\d{4}\\s*)$"
      • changedInput schema / properties / unit / description
        Previous value: -"OPTIONAL. The dimension `quantity` is stated in — 'L' or 'kg'. Omit it and the number is taken as already on the ADR 1.1.3.6.3 basis (the historical contract). Supply it and it is CHECKED against the dimension 1.1.3.6.3 counts for the row: litres for liquids and for compressed or adsorbed gases, kilograms for solids, liquefied/refrigerated/dissolved gases and articles. A mismatch returns no points and says which dimension the entry is counted in."New value: +"OPTIONAL. The dimension `quantity` is stated in — 'L' or 'kg'. Omit it and the number is taken as already on the ADR 1.1.3.6.3 basis (the historical contract). Supply it and it is CHECKED against the dimension 1.1.3.6.3 counts for the row: litres for liquids and for compressed or adsorbed gases, kilograms for solids, liquefied/refrigerated/dissolved gases and articles. A mismatch returns no points and says which dimension the entry is counted in. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item."
      • changedInput schema / properties / variant_index / description
        Previous value: -"ADR Table A variant index (as returned by adr_lookup) — pins one row when a UN has several variants that share a packing group (e.g. concentration bands). Ignored for single-row UNs."New value: +"ADR Table A variant index (as returned by adr_lookup) — pins one row when a UN has several variants that share a packing group (e.g. concentration bands). Ignored for single-row UNs. Single-substance form only: sent beside items[] it is refused (INVALID_INPUT) — set it on each item."

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides container shipping intelligence for AI agents, enabling demurrage & detention calculations, local charges, inland haulage rates, and CFS tariffs across multiple shipping lines, with pay-per-request USDC payments via x402.
    -
  • A
    license
    Not graded
    quality
    D
    maintenance
    Ocean container shipping intelligence for AI agents — D\&D tariffs, freight rates, vessel schedules, port congestion, inland haulage across 6 major carriers. 24 MCP tools.
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Provides AI assistants with access to ADR dangerous goods regulations through MCP, enabling UN number lookup, shipping name construction, and deterministic rule-based calculations for limited quantities, mixed packing, tank codes, and hazard classifications.
    10
    GPL 3.0
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.