FreightUtils MCP Server

io.github.SoapyREDPublished by GitHub account SoapyREDv2.34.0Updated Nov 7, 2026

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

VerifiedStreamable HTTPWeb executableLocation & LifestyleData & AnalyticsBusiness & Commerce

Overview

AI-generated overview

Freight reference and calculation server: ADR dangerous goods, HS codes, Incoterms, UK duty, and road/air/sea freight math with cited sources.

What you can do
  • Calculate freight volumes and weights: CBM, chargeable weight, loading metres, pallet fitting, consignment totals, emissions
  • Look up dangerous-goods data: ADR Table A entries, small-load exemption points, limited/excepted quantity checks, full consignment checks
  • Look up customs and trade rules: HS codes, Incoterms 2020, UK import duty and VAT, EU ICS2 stop-words
  • Look up transport reference data: airlines, airports and nearest airports, UN/LOCODE locations, containers, ULDs, vehicles
  • Validate and resolve identifiers: container, air waybill and IMO check digits, or resolve an unknown freight code to typed candidates
  • Chain volume, weight, ADR and duty into one shipment summary
When to use it
Useful when an assistant has to answer shipping, customs or dangerous-goods questions with sourced figures instead of guesses — quoting freight volumes and chargeable weights, checking ADR exemptions, classifying goods, or estimating UK duty.
Requirements
Runs as a hosted endpoint or as a local npm package via npx, which needs Node 18 or newer. No key is needed for anonymous use, capped at 25 requests per day per IP; a free or Pro key set in FREIGHTUTILS_API_KEY raises the limit. Network access to the FreightUtils API is required.
Before you install
Anonymous use is rate-limited per IP, and tool inputs are sent to the FreightUtils API host. Results are reference only: check-digit validation is structural, a clean ICS2 check is not ENS acceptance, and emissions and duty figures are estimates, not legal or audited advice. The optional FREIGHTUTILS_API_KEY is a billable credential and should be kept out of shared configs.

Installation

In SourceWeft

  1. Open FreightUtils MCP Server in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.SoapyRED%2Ffreightutils/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "freightutils": {
      "type": "http",
      "url": "https://www.freightutils.com/api/mcp"
    }
  }
}

README

FreightUtils MCP Server

[npm version] [npm downloads (total)] [npm downloads (month)] [License: MIT] [FreightUtils MCP server]

The neutral freight reference layer for AI agents.

FreightUtils is the neutral freight reference layer for AI agents — source-backed dangerous-goods, customs, location and freight-calculation data an agent can call and cite, from primary sources (ADR 2025 / UNECE, HS 2022 / WCO, IATA-regulated airline prefixes). Neutral by design: no freight to sell and no carrier to push — a lookup returns what the named source says, with the citation attached so an agent can inspect it rather than take our word for it, regardless of who carries the load.

This Model Context Protocol server gives AI agents access to 26 freight calculation and reference tools, covering road, air, and sea freight. Built by a UK ADR-certified freight transport planner.

Every response cites its source — a _source block with the authority, edition, licence where held, and a verification status an agent can read — and the tools are deterministic, not generated answers. Reference only: never filing, booking, or legal advice, and results state when human review is required (validate is structural check-digit validation only; a clean ics2_check is not ENS acceptance; emissions figures are estimates, not audited reports).

Since 2.11.0, every tool also declares a typed outputSchema and returns structuredContent — the FreightUtils v1 response envelope: the answer under result, plus confidence, normalized_input, warnings, _source and a ready-to-use citation. The legacy flat JSON text channel is unchanged (byte-identical), so existing text-parsing consumers are unaffected.

Since 2.24.0 the envelope is version 1.2, which adds four fields beside ok: status (ok, partial when required inputs are missing, not_found, ambiguous or unsupported), missing_inputs (the inputs a partial answer still needs), edition (the edition the answer is served from, with the dates it applies from and may apply until; null for a computed or live answer) and as_of (the date the answer's data was last audited, or today for a computed answer). A refusal carries the same envelope on structuredContent, so an agent can read partial and missing_inputs there as well. The change is additive: envelope 1 and 1.1 answers still validate.

Since 2.26.0:

  • ADR 2025 and ADR 2027. The tools that read ADR data — adr_lookup, adr_exemption_calculator, adr_lq_eq_check, consignment_calculator, shipment_summary and, from 2.29.0, adr_consignment_check — take edition ("2025" or "2027") and as_of (YYYY-MM-DD). edition wins; otherwise as_of (default today, UTC) picks the edition by the legal timeline. Without either, they answer ADR 2025 until 31 December 2026 and ADR 2027 from 1 January 2027. ADR 2027 is accepted and applies from 1 January 2027: an ADR 2027 answer for an earlier date says it is not yet applicable on that as_of (EDITION_NOT_YET_APPLICABLE). From 1 January to 30 June 2027 either edition may be applied (EDITION_TRANSITIONAL); ADR 2025 answers end on 30 June 2027, and from 1 July 2027 edition: "2025" is refused with EDITION_UNSUPPORTED. An answer on a named edition carries adr_edition; an ADR 2027 exemption answer for UN 0081, 0082, 0084, 0241, 0331, 0332, 0482, 1005 or 1017 also carries transitional_1_6_1_61 (the ADR 2025 note-a basis that 1.6.1.61 allows until 31 December 2030) beside the verdict, never instead of it.

Since 2.25.0:

  • The ADR consignment check (2.29.0). adr_consignment_check takes the consignment object (lines[] with un_number, quantity { value, unit, basis }, packing_group / variant_index, packages, inner_packaging and, on an ID line, icao_limited_quantity; journey { date, tunnels_on_route, mode }) with edition / as_of beside it (journey.date is the default as_of) and answers status — pass, fail, conditional or insufficient_data — with missing_inputs[] (each input by path, the check it blocks, what to send) and checks_performed[] (each check's verdict, edition, date, basis and the ADR section and page it rests on). The 1.1.3.6 check is adr_exemption_calculator's answer, whole; the LQ / EQ checks are adr_lq_eq_check's; the tunnel check gives the whole load's code (the most restrictive, 8.6.3.2) and which tunnels on the route the load may use without and with the 1.1.3.6 relief (8.6.3.3); the document entries follow 5.4.1.1.1 (a), (b), (c), (d), (k), e.g. UN 1098 ALLYL ALCOHOL, 6.1 (3), I, (C/D). From 2.30.0 it also checks mixed loading (mixed_loading_7_5_2): every pair of lines against the ADR 7.5.2.1 table by the labels of Table A column (5), subsidiary labels included, Class 1 pairs against the 7.5.2.2 table by compatibility group, each pair with its deciding cell (e.g. 3 × 1.4) and source; and the foodstuffs precautions of 7.5.4 for goods with CV28, with the optional vehicle.foodstuffs_carried. Where the ADR text does not settle a case the check asks instead of assuming. Not yet checked: plates and placards (5.3), vehicle equipment (8.1), driver training (8.2.1), packaging codes. A keyed call stores a check receipt.
  • Check receipts. A receipt is stored only when the package runs with an API key (FREIGHTUTILS_API_KEY) — a free key is enough (freightutils.com/pricing). Then every answer of the seven executed checks (adr_exemption_calculator, adr_lq_eq_check, uk_duty_calculator, consignment_calculator, shipment_summary, ics2_check and, from 2.29.0, adr_consignment_check) carries _meta.check_id and _meta.receipt_url. A receipt is the record of that one check, kept for 90 days at GET https://www.freightutils.com/api/receipts/{check_id} (?format=text for a summary): the inputs as consumed, the edition and as-of date, the data hashes, the rules applied, the result, anything unresolved and a receipt_hash a copy can be checked against. Without a key the answer carries the receipt hash inline and nothing is stored: _meta.receipt (stored: false, reason: "key_required"; from 2.28.0 the reason may also be "quota" — the key's daily stored-receipt allowance for the day is used up, the answer is unchanged and nothing is stored; receipt_hash and the hashed fields the answer does not otherwise carry, so the hash recomputes from the answer alone), and no check_id (the API's rule since 30 October 2026, typed in this package from 2.26.0). Verifying by id needs no plan and no payment — a keyed check's receipt is read with the same key — and a fetch counts as one request against the daily allowance, like a lookup. A receipt never holds a name, an address, a key or an IP address. Every check also names the edition it rested on (edition + as_of), or answers edition: null with _meta.edition_basis "no regulatory dataset read".
  • Batch inputs. adr_lookup takes un_numbers[]; unlocode_lookup, airport_lookup, airline_lookup and hs_code_lookup take codes[] (up to 50 each); uk_duty_calculator takes lines[] (up to 10). Send the list alone: the answer is results[] in input order, each item with its own status. One call against the daily limit, one per item against the Pro monthly allowance.
  • What each ADR code means. adr_lookup answers resolved_codes[] beside results[]: each code in Table A columns (5)–(20), once per answer, with the rows that carry it, its summary, ADR section and verification_status. include_codes picks compact (the default for a UN number), full (adds the url, title, meaning and references) or none; include_statements: true adds plain-word statements to every row. The meanings are FreightUtils' paraphrases of ADR 2025, cited to section, and verification_status says how each has been reviewed: paraphrase_unreviewed, machine_reviewed (two independent readings of the UNECE text, compared with the record; the owner adjudicates every disagreement), contested, owner_reviewed, dg_reviewed, needs_fix, or verified on the transport category and tunnel code entries read from the 1.1.3.6.3 and 8.6.4 tables (typed from 2.28.0).
  • Scopes. --scope dg | customs | ops (or FREIGHTUTILS_SCOPE) serves only that scope's tools — see Scoped tool lists. The default serves all of them.
  • The consignment object. consignment_calculator, shipment_summary and adr_exemption_calculator take one consignment argument (schema) instead of their own inputs; validate checks one with type: "consignment".

Website: https://www.freightutils.com API Docs: https://www.freightutils.com/api-docs


Tools (26)

Calculators

ToolDescription
ldm_calculatorLoading metres for European and US road trailers
cbm_calculatorCubic metres for sea freight
chargeable_weight_calculatorAir freight chargeable weight (volumetric vs actual)
pallet_fitting_calculatorBox-on-pallet optimisation with rotation
container_lookupISO container specs (10 types) and loading calculation
unit_converterWeight, volume, length, and freight-specific conversions
consignment_calculatorMulti-item CBM, LDM, volumetric & mode-specific chargeable weight (sea/air/road) + advisory flags
emissions_calculatorFreight CO2e via the ISO 14083 / GLEC distance-based method — open DEFRA/EPA/ADEME factors (WTW + TTW); use actual gross mass (not chargeable/volumetric); result carries empty_running + representativeness (sea/air = low) + a summary

Dangerous Goods (ADR)

ToolDescription
adr_lookup2,939 UNECE ADR 2025 entries, all 20 Table A columns — beyond class, packing group, labels, special provisions, LQ/EQ, transport category, tunnel code and HIN: packing_instructions, special_packing_provisions, mixed_packing_provisions, portable_tank_instructions, portable_tank_special_provisions, tank_code, tank_special_provisions, vehicle_for_tank_carriage, carriage_packages, carriage_bulk, carriage_loading_unloading_handling, carriage_operation
adr_exemption_calculatorADR 1.1.3.6 small load exemption check
adr_lq_eq_checkLimited and Excepted Quantity eligibility
adr_consignment_checkOne call on the consignment object: the 1.1.3.6 verdict, LQ / EQ per line, the whole-load tunnel code against the route (ADR 8.6.3 / 8.6.4), the 5.4.1.1.1 transport-document entries and mixed loading (7.5.2, 7.5.4), with one status and page-cited checks

In 2.34.0: the envelope declares _meta.upstream — the upstream state of the datasets an answer was drawn from, as the site's daily upstream check recorded it: per dataset the state (in_step, changed_upstream, schema_drift, unreachable, window_missed, or unknown when it could not be read), how the dataset is watched, the last successful check and the window, with stale true only when a dataset missed its window (the answer is still the last verified edition held). Optional and passthrough, so an answer without it still validates. It says whether the upstream was checked inside its window, not that an answer is right (data status). Still 26 tools.

In 2.33.0: every record the fifteen record tools return declares fu_id (a stable FreightUtils identifier, the same across editions) and, where the dataset has editions, fu_version_id (fu_id@<edition>) — optional strings on passthrough records, so an answer without them still validates; the envelope declares _meta.ids { scheme, pattern }; each of those tools says so in one closing clause; and resolve_reference takes an fu: identifier of up to 200 characters, which resolves to exactly its one record or to none (every other identifier keeps the 32-character limit). Still 26 tools.

In 2.32.0: adr_consignment_check reads the UN packaging mark of each line — the optional lines[].packages.un_mark, read by ADR 6.1.3.1 field by field (symbol, the 6.1.2.7 code, the X / Y / Z packing-group letter and the density or gross mass, S or the test pressure, year, State, maker) and its letter held against the line's packing group (packaging_code_validity; no mark → conditional; the packaging kind against the packing instruction is not checked) — and leaves a limited / excepted quantity line whose stated regime is met out of the 1.1.3.6 total (ADR 1.1.3.6.5, exemption_1_1_3_6.engine.excluded_lines). Nothing removed: every 2.31.0 argument and answer field still validates.

In 2.31.0: adr_consignment_check answers the vehicle side — placards_and_plates_5_3 (orange-coloured plates, placards for Class 1 / Class 7 packages, the 5.3.6 mark, the 3.4.13 LQ mark as a condition), equipment_8_1 (documents, the 8.1.4.1 extinguisher band by the transport unit's mass, the 8.1.5 items by danger label) and driver_training_8_2 (the 8.2.1 certificate and Class 1 / Class 7 specialisations; 8.2.3 / Chapter 1.3 under 1.1.3.6). Each lists the requirements the load puts on the vehicle and checks them against the optional vehicle.* / crew inputs; without them a dangerous-goods load is conditional. fail means a check the load does not meet: a load outside 1.1.3.6 answers exemption_1_1_3_6: not_applicable (a fully regulated load, not a failed one), a line with no stated regime that fits neither LQ nor EQ is not_applicable, and result.regime ("1.1.3.6" | "full_adr" | "undetermined") says which rules the checks answered under.

In 2.30.0: adr_consignment_check checks mixed loading (mixed_loading_7_5_2: every pair of lines against the ADR 7.5.2.1 table by the labels of Table A column (5), Class 1 pairs against 7.5.2.2 by compatibility group, each pair with its deciding cell, e.g. 3 × 1.4, and source; the foodstuffs precautions of 7.5.4 for goods with CV28) and takes the optional vehicle.foodstuffs_carried. Still to come: plates and placards 5.3, equipment 8.1 and driver training 8.2.1 in build 2c, packaging codes in build 2d. Nothing removed: every 2.29.0 argument and answer field still validates.

In 2.29.0: adr_consignment_check (above; checks today: 1.1.3.6, LQ / EQ per line, the tunnel code, the transport-document entries; coming: mixed loading 7.5.2 in build 2b, plates and placards 5.3, equipment 8.1 and driver training 8.2 in build 2c, packaging codes in build 2d — each listed as not_in_this_version until then; a keyed call stores a check receipt, a keyless one carries the receipt hash). adr_exemption_calculator types two fields the API already serves: strict_adr_2027.entry_deleted (with deleted_un_numbers and message) and items[].edition_basis. A line whose entry is deleted in ADR 2027 (e.g. UN 2941) has no ADR 2027 figure; on a stated as_of from 2027-01-01 to 2027-06-30 the load is answered on ADR 2025 under 1.6.1.1 (basis: "1.6.1.1", every line edition_basis: "2025"), the strict block's four figures null. Nothing removed: every 2.28.0 argument and answer field still validates.

In 2.28.0: adr_exemption_calculator mirrors the website's 4 November calculator changes.

  • icao_limited_quantity (boolean, on an ID-prefixed line such as ID8000): an air-only line is counted out of 1.1.3.6 (AIR_ONLY_ID) only when the request states that the packages are limited quantities to the ICAO Technical Instructions; without it the line is BLOCKED (entry_required). On a UN-numbered line the API answers 400.
  • An item quantity of 0 is accepted: the goods are read as not carried, the line is left out of the load (state EXCLUDED_NIL) and named in a warning; a load of nothing but zeros is refused, never cleared.
  • A gross mass on an entry counted by mass is an upper bound of the net mass: the load is exempt on it only when it clears even so (figure_basis: "upper_bound_gross", items[].upper_bound_gross).
  • ADR 2027 answers carry basis (adr_2027, 1.6.1.61 or 1.6.1.1). ADR 2027 applies from 1 January 2027; on a stated as_of from that date, a transitional measure that clears a load ADR 2027 itself does not is headlined, with basis_until and the strict ADR 2027 figure beside it (strict_adr_2027); transitional_1_6_1_1 states the load on ADR 2025 inside the 1.6.1.1 window.

adr_lookup types verification_status as the ADR code registry serves it (see below). Nothing removed: every 2.27.0 argument and answer field still validates.

In 2.26.0: edition and as_of on the five ADR tools — ADR 2025 and ADR 2027 (accepted, applying from 1 January 2027) by edition or by date, with the ADR 2027 answer fields (adr_edition, transitional_1_6_1_61, transitional_notes, amended_in_2027); a check receipt is stored for keyed calls only, and an answer without a key carries its receipt hash in _meta.receipt. Nothing removed: every 2.25.0 argument and answer field still validates.

In 2.25.0: check receipts, batch inputs, resolved_codes on adr_lookup (what each Table A code means), --scope dg | customs | ops, the consignment object, and resolve_reference decodes ADR Table A codes ("TU9"). Nothing removed: every 2.24.0 call answers as before.

In 2.24.0: every tool answers with response envelope 1.2 (status, missing_inputs, edition, as_of); unlocode_lookup says 116,086 UN/LOCODE codes. In 2.23.0, adr_lookup gained the 12 further Table A columns (packing, tank, vehicle and carriage provisions, columns 8–14 and 16–19) in its description and result schema; empty columns are null.

Some UN numbers have more than one ADR Table A row (packing groups, concentration bands). When a bare UN number matches rows that give different answers, the ADR tools never pick one: they withhold the verdict and return the candidate rows, and you pin one with packing_group or variant_index. The rules, with worked cases (UN 1789, UN 1790 PG I, UN 2215 PG III): the ADR 1.1.3.6 calculator in the API docs.

Customs & Tariff

ToolDescription
hs_code_lookup6,940 Harmonized System tariff codes (HS 2022)
uk_duty_calculatorUK import duty and VAT (live GOV.UK Trade Tariff data)
incoterms_lookupIncoterms 2020 — all 11 rules with risk/cost transfer points
ics2_checkFlag EU ICS2 unacceptable goods-description terms (stop-words) before filing an ENS — reference only

Reference Data

ToolDescription
resolve_referenceResolve any freight identifier ("176", "UN1845", "NLRTM", "FOB") to typed, ranked, cited candidates when its type is unknown
airline_lookup6,356 airlines with IATA/ICAO codes and AWB prefixes
unlocode_lookup116,086 UN/LOCODE transport locations
airport_lookup86,248 airports by IATA/ICAO code, name or city (OurAirports)
nearest_airportNearest airports to a latitude/longitude, by great-circle distance — by default airports with scheduled airline service and an IATA code (include_all: true lists every type)
uld_lookup16 air cargo ULD types (LD3, PMC, etc.)
vehicle_lookup17 road freight vehicles and trailers

What's new in 2.27.0: the airline record's operational status, shared-prefix flag and air-safety-list flags; nearest_airport's scheduled-service default with include_all; the refreshed airport fields; failure reasons on validate and resolve_reference. Nothing removed: every 2.26.0 argument and answer field still validates.

  • Airlines (airline_lookup). A cargo carrier's record carries operational_status (active, ceased or unknown) with operational_status_basis — the carrier's own published page, a current FAA designator listed for that carrier, or a dead-domain check after the FAA withdrew the designator. It is a separate thing from the verification status ladder: a record can be historical in verification and still say why the carrier is ceased. Every record with an AWB prefix carries prefix_shared and prefix_holders (prefix 081 is shared by four carriers, Qantas among them). restrictions[] lists the carrier when the EU Air Safety List or the UK Air Safety List names it, with the list, annex, regulation or list date and the source URL. It is a flag with its source, not a legal determination — best-effort; verify with the list itself. Where the carrier publishes them, the record links its own cargo website (cargo_website), its tracking URL template (tracking_url_template) and its dangerous-goods acceptance page (dg_acceptance_url).
  • Airports (airport_lookup, nearest_airport). 86,248 airports from the OurAirports refresh of 30 October 2026; records gain icao_code, scheduled_service, iso_region, gps_code and keywords. nearest_airport answers, by default, airports with scheduled airline service and an IATA code — never a heliport and never a closed field. include_all: true lists every type except closed fields; a type filter keeps the earlier behaviour for that type. Every answer states distance_basis: "great_circle", the filter applied (scheduled_iata, all or type) and filter_description. The hosted server changed the same way on 30 October; the package now sends include_all and types the answer.

Validation

ToolDescription
validateParse any text (a booking line, an email) to find & validate every container (ISO 6346), AWB (modulus-7) and IMO number in it — or validate a single identifier by type

Failure reasons (2.27.0). An invalid identifier in a validate answer carries failure — reason (INVALID_CHECK_DIGIT, WRONG_LENGTH or BAD_CHARSET), message, expected_format and an example of a valid one — so an agent can tell the user what to fix ("176-12345676": the check digit is 6, the modulus-7 calculation gives 5). An AWB whose prefix no record holds, or several records share, says so in details.airline_failure (UNKNOWN_PREFIX / AMBIGUOUS); the check digit is a different question. resolve_reference carries validation (type, valid, failure) when the query is an AWB, container or IMO number — an invalid AWB still names the carrier its prefix belongs to — and failure (NO_MATCH / AMBIGUOUS, with candidate_types) when nothing or more than one type matched.

Composite

ToolDescription
shipment_summaryChains CBM + weight + LDM + ADR + duty in one call

Plans

ToolDescription
get_subscribe_linkThe pricing page URL with the Pro plan's limit and price (50,000/month at £19/mo)

Installation

Claude (claude.ai, desktop and mobile apps, Cowork)

Add FreightUtils from Claude's connector directory: https://claude.ai/directory/connectors/freightutils. Or add it as a custom connector — Customize → Connectors → Add custom connector — with the URL https://www.freightutils.com/api/mcp. No API key, no sign-in. Setup, limits and privacy: freightutils.com/mcp#use-in-claude.

Claude Desktop / Claude Code (stdio)

Add to your MCP config (claude_desktop_config.json or .claude/settings.json):

json
{  "mcpServers": {    "freightutils": {      "command": "npx",      "args": ["freightutils-mcp"]    }  }}

Scoped tool lists

An agent that only does one job can load fewer tool definitions. --scope (or the FREIGHTUTILS_SCOPE environment variable) serves one scope — the same tools, names, schemas and answers, filtered:

ScopeTools
dgadr_lookup, adr_exemption_calculator, adr_lq_eq_check, adr_consignment_check, validate, resolve_reference
customshs_code_lookup, uk_duty_calculator, ics2_check, incoterms_lookup, validate
opsthe 11 calculators and equipment lookups, unlocode_lookup, airport_lookup, nearest_airport, airline_lookup, validate, resolve_reference (17)
all (default)every tool
json
{  "mcpServers": {    "freightutils-dg": {      "command": "npx",      "args": ["freightutils-mcp", "--scope", "dg"]    }  }}

The hosted endpoint serves the same lists at https://www.freightutils.com/api/mcp/dg, /customs and /ops. An unknown scope stops the server with an error naming the four.

Remote HTTP / SSE

If your MCP client supports remote servers, use the canonical URL:

https://www.freightutils.com/api/mcp

The older URL https://www.freightutils.com/api/mcp/mcp still works for backwards compatibility with existing clients.

No API key required to get started — anonymous calls work out of the box (see Rate Limits below).

Authenticating with a Pro key

Anonymous usage caps at 25 requests/day per IP. If you have a free or Pro API key, set FREIGHTUTILS_API_KEY in the environment that runs the MCP server. The package reads it from process.env and attaches Authorization: Bearer <key> to every outbound /api/* call — same key the remote https://www.freightutils.com/api/mcp transport already honors.

stdio config example with the env var wired through:

json
{  "mcpServers": {    "freightutils": {      "command": "npx",      "args": ["freightutils-mcp"],      "env": {        "FREIGHTUTILS_API_KEY": "fu_pk_xxx"      }    }  }}

Get a key at freightutils.com/api-docs (free, 100/day) or freightutils.com/pricing (Pro, 50,000/month). Backwards compatible — unset env var preserves the existing anonymous behaviour.

With no key set, the server says so once at start-up, on stderr (stdout carries only the MCP protocol), so a key you meant to set and missed shows up in your client's MCP log rather than at the first 429:

freightutils-mcp: FREIGHTUTILS_API_KEY is not set, so calls use the anonymous tier — 25 requests per day per IP address. Set the key to use your plan's limit: https://www.freightutils.com/pricing

Verify your setup

After adding FreightUtils to your MCP client config, fully quit and relaunch the client (Claude Desktop, Cursor, Cline). MCP servers are only loaded at client startup; editing the config in a running session does nothing until restart.

Then run the install diagnostic from a terminal:

sh
npx freightutils-mcp ping

You should see three ticks and All checks passed:

FreightUtils MCP Diagnostic───────────────────────────package: freightutils-mcp@<installed version>health:  https://www.freightutils.com/api/mcp/health
[1/3] Backend health (https://www.freightutils.com/api/mcp/health)      ✓ status=ok mcp_version=<current> tools_registered=<current> (143ms)
[2/3] MCP handshake (in-process via InMemoryTransport)      ✓ server freightutils-mcp@<installed version> initialized; tools/list returned <n> tools
[3/3] End-to-end tool call (cbm_calculator l=120 w=80 h=100)      ✓ cbm_calculator → total=0.96 m³ (expected 0.96) (218ms)
All checks passed. Your FreightUtils MCP install is working.

If any check shows ✗, see Troubleshooting below. Exit code is 0 on all-pass and 1 on any failure, so the command works in CI / health-check scripts too.


Troubleshooting

SymptomLikely causeFix
Tools not appearing in the MCP client after editing the configClient wasn't fully restartedQuit and relaunch (Cmd+Q on macOS / right-click → Quit on Windows tray). Closing the window is not enough.
npx freightutils-mcp ping check 1 fails with a network errorDNS, proxy, or the website is unreachable from your networkCheck the status page at https://www.freightutils.com/status. If you're behind a corporate proxy, set HTTPS_PROXY. Override the host for ping with FREIGHTUTILS_API_URL=<base-url>.
npx freightutils-mcp ping check 2 failsBroken local install (npx cache or stale Node version)Re-install: rm -rf ~/.npm/_npx && npm install -g freightutils-mcp and rerun. Requires Node 18 or newer.
Tool calls return HTTP 429 / "rate_limited"Anonymous IP cap of 25 requests/day exceededIf you have a FreightUtils Pro API key, set FREIGHTUTILS_API_KEY in your environment before invoking the MCP. The package passes it through automatically on every outbound call. See https://www.freightutils.com/pricing if you need a key.
"Server failed to start" / spawn error in client logsnpx not on PATH, or Node older than 18Install Node 18+. On macOS, an absolute path in the config ("command": "/opt/homebrew/bin/npx") avoids PATH issues for GUI-launched clients.
Specific tool returns isError: trueBad input shape, or an unknown lookup key (UN number / HS code / AWB prefix not in the dataset)The tool's error body names the offending field. Verify against the schema at https://www.freightutils.com/api-docs or call the corresponding playground endpoint to confirm the input shape.

The full diagnostic flow lives at the /api-docs#mcp-setup section on the website. The live backend status is callable from inside any MCP client at GET /api/mcp/health — useful when you don't have shell access during a conversation.


Rate Limits

All tools call the free FreightUtils API:

  • Anonymous: 25 requests/day per IP
  • Free API key: 100 requests/day (register at https://www.freightutils.com)
  • Pro: 50,000 requests/month at £19/month

Security and data

  • Read-only. Every tool is a lookup or a calculation, declared readOnlyHint: true and destructiveHint: false. The server changes nothing, anywhere.
  • No file system, no shell. The server reads no file except its own package.json, starts no process and opens no port — it talks over stdio only.
  • One destination. Tool inputs go only to https://www.freightutils.com/api (or the base you set in FREIGHTUTILS_API_URL), over HTTPS. get_subscribe_link answers locally and sends nothing.
  • The key stays in the environment. FREIGHTUTILS_API_KEY is read from the environment and sent only as an Authorization: Bearer header to that host — never logged, never written to disk, never put in an error message.
  • stdout is the protocol. Nothing but MCP JSON-RPC goes to stdout; the one start-up notice goes to stderr.
  • Two validation layers. Each tool's Zod schema checks types, formats and the API's own limits before any call is made (the three ADR tools — adr_exemption_calculator, adr_lq_eq_check, shipment_summary — also refuse, by name, a field they do not read). The API then validates every request again on the server and refuses what it cannot answer with a 400 naming the field.
  • Errors keep their meaning. A failed call is reported by kind: network failure, timeout (30 s, or FREIGHTUTILS_TIMEOUT_MS), the API's own 4xx refusal, a 429 with its reset_at, or a 5xx — never with a stack trace, a request header or the contents of a server error page.
  • Two direct runtime dependencies: @modelcontextprotocol/sdk and zod. CI fails on any high or critical advisory in the production dependency tree, and Dependabot watches it.
  • Reporting a vulnerability: see SECURITY.md.

Example Prompts

Once connected, your AI agent can:

  • "Calculate CBM for a box 120cm × 80cm × 100cm, 24 pieces"
  • "Look up UN 1203 in the ADR database"
  • "Check if 200L of petrol qualifies for ADR 1.1.3.6 exemption"
  • "Find the HS code for lithium batteries"
  • "What does FOB mean in shipping?"
  • "How many boxes of 40×30×25cm fit on a euro pallet?"
  • "Calculate loading metres for 26 euro pallets on an artic trailer"
  • "What's the UK import duty on laptops from China?"

Data Sources

  • ADR 2025 — UNECE, ECE/TRANS/352, applicable 1 Jan 2025; given legal effect by EU Directive 2008/68/EC (consolidated). Factual compilation, best-effort — not legal advice, not a regulatory authority.
  • HS 2022 — HS 2022 descriptions from UN Comtrade's H6 classification (UN Statistics Division); the WCO maintains the Harmonized System nomenclature. No named open licence.
  • Airlines — compiled by FreightUtils from public sources. Verified records cite carrier-published pages and FAA Order JO 7340.2 field by field; the rest are pending verification. IATA and ICAO assign these codes, but this dataset is not published or endorsed by IATA or ICAO, and no licence or "open data" claim is made for it.
  • UN/LOCODE 2025-1 — UNECE official release artifact, coordinates strict-validated. UN/LOCODE © UNECE, CC BY 4.0 (as UNECE states for UN/CEFACT standards).
  • UK duty — the live GOV.UK Trade Tariff API, pulled per request, so there is no local copy that can drift.
  • Containers / ULD / vehicles — ISO, IATA and industry-standard specifications.
  • Emissions factors — published DEFRA / EPA / ADEME factors (currently DEFRA 2026 + EPA 2025
    • ADEME Base Carbone v23.11), combined by the ISO 14083 / GLEC distance-based method. Estimates, not audited reports.

Public provenance wording is maintained in the FreightUtils repository's docs/DATA_PROVENANCE.md and copied here, not written from memory — so a source that is re-attributed there cannot keep being cited here.


Changelog

Release notes: CHANGELOG.md in this repo and GitHub Releases.

A README that carries its own copy of the changelog is why three directories showed 2.4.0 as the latest release for three months after 2.4.0 had been superseded. One source now.


Other ways to use FreightUtils

FreightUtils ships across multiple distribution surfaces. Pick the one that fits how you work:

Same data, same compliance reference set (ADR 2025, HS 2022, IATA-regulated airline prefixes), every surface kept in sync.


License

MIT — see LICENSE.

Built by Marius Cristoiu, ADR-certified freight transport planner.

Source: README.md at commit bc12c2f

Tools

26

cbm_calculator

CBM Calculator

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).

Parameterspieceswidth_cmrequiredheight_cmrequiredlength_cmrequired

chargeable_weight_calculator

Chargeable Weight Calculator

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).

Parametersfactorpieceswidth_cmrequiredheight_cmrequiredlength_cmrequiredgross_weight_kgrequired

ldm_calculator

LDM Calculator

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).

Parameterspalletvehiclequantitywidth_mmlength_mmstackableweight_kgstack_heightvehicle_length_m

adr_lookup

ADR Dangerous Goods Lookup

Look up the full European road dangerous-goods (ADR 2025) Table A entry for a substance — all 20 columns, from class, packing group and labels through special provisions, limited/excepted quantities, packing instructions, tank codes, carriage provisions, transport category, tunnel restriction code and hazard identification number — and what each of those codes means (resolved_codes). 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, all 20 Table A columns: un_number, proper_shipping_name, class, classification_code, packing_group, labels, special_provisions, limited_quantity, excepted_quantity, packing_instructions, special_/mixed_packing_provisions, portable_tank_instructions/_special_provisions, tank_code, tank_special_provisions, vehicle_for_tank_carriage, carriage_packages/_bulk/_loading_unloading_handling/_operation, transport_c

Parametersas_oflimitoffsetsearcheditionun_numberun_numbershazard_classinclude_codesinclude_statements

adr_exemption_calculator

ADR 1.1.3.6 Exemption Calculator

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. An item quantity may be 0: the goods are not carried, the line is left out of the load (state EXCLUDED_NIL) and named in a warning — a load of nothing but zeros is refused, never cleared. 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

Parametersunitas_ofbasisitemseditionquantityun_numberconsignmentpacking_groupvariant_indexicao_limited_quantity

airline_lookup

Airline / AWB Prefix Lookup

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); prefix_shared + prefix_holders on every record with a prefix; on cargo records operational_status (active / ceased / unknown) with operational_status_basis, restrictions[] when the EU or UK Air Safety List names the carrier, and carrier-published cargo_website / tracking_url_template / dg_acceptance_url where they exist — 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). Identifiers: Each record carries fu_id, a stable FreightUtils identifier (and fu_version_id where the

Parametersfulliataicaocodeslimitqueryoffsetprefixcountry

airport_lookup

Airport Code Lookup

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 86,248 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). Identifiers: Each record carries fu_id, a stable FreightUtils identifier (and fu_version_id where the dataset has editions); resolve_reference resolves one to exactly its record.

Parametersiataicaotypecodesquery

nearest_airport

Nearest Airport

Find the airports nearest to a caller-provided latitude/longitude, sorted by great-circle (haversine) distance with distance_km on each result. Searches 86,248 airports (OurAirports, public domain). Provide latitude and longitude (decimal degrees); optional radius_km, max_results (1-50, default 10), type filter (e.g. large_airport only) and include_all. By default only airports with scheduled airline service and an IATA code are ranked — never a heliport or a closed field; include_all: true ranks every type except closed fields, and type filters on that type. 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, results[] (the airport record plus distance_km), distance_basis ("great_circle"), filter (scheduled_iata / all / type) and filter_description 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). Identifiers: Each record carries fu_id, a stable FreightUtils identifier (and fu_version_id where the dataset has editions); resolve_reference resolves one to exactly its record.

Parameterstypelatituderequiredlongituderequiredradius_kminclude_allmax_results

resolve_reference

Resolve Freight Reference

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) — or an fu: identifier, the fu_id or fu_version_id of any record in an answer (up to 200 chars), which resolves to exactly its one record or to none. Fourteen 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, ADR Table A codes (special provisions, packing instructions and their PP/B/L provisions, MP, T/BK/TP, tank codes, TU/TC/TE/TA/TT/TM, V/VC/AP/CV/S, vehicle designations, labels, hazard identification numbers — e.g. "TU9" → its meaning, section and review status; a well-formed code no Table A row carries, e.g. "P999", is pattern_only), 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; "336" is an ADR special provision AND a hazard identification number), 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, cou

Parametersqrequired

container_lookup

Container Lookup

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 equivalen

Parametersfulltypelimitoffsetitem_quantityitem_width_cmitem_height_cmitem_length_cmitem_weight_kg

hs_code_lookup

HS Code Lookup

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). Identifiers: Each record carries fu_id, a stable FreightUtils identifier (and fu_version_id where the dataset has editions); resolve_reference resolves one to exactly its record.

Parameterscodecodesquerysection

incoterms_lookup

Incoterms 2020 Lookup

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). Identifiers: Each record carries fu_id, a stable FreightUtils identifier (and fu_version_id where the dataset has editions); resolve_reference resolves one to exactly its record.

Parameterscodefulllimitoffsetcategory

pallet_fitting_calculator

Pallet Fitting Calculator

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).

Parametersbox_width_cmrequiredbox_height_cmrequiredbox_length_cmrequiredbox_weight_kgallow_rotationmax_payload_kgpallet_width_cmrequiredpallet_length_cmrequiredpallet_max_height_cmrequiredpallet_deck_height_cm

unit_converter

Unit Converter

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).

Parameterstorequiredfromrequiredvaluerequired

consignment_calculator

Consignment Calculator

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). Editions: edition ("2025" | "2027") and as_of (YYYY-MM-DD) choose the ADR edition — edition wins, else the date picks it (ADR 2025 before 2027-01-01, ADR 2027 from then; ADR 2025 may still be applied until 2027-06-30). An answer on a named edition carries adr_edition; neither sent, the answer is ADR 2025 until 2027-01-01. 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

Parametersmodeas_ofitemslineseditionoptionsconsignment

unlocode_lookup

UN/LOCODE Lookup

Search 116,086 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). Identifiers: Each record carries fu_id, a stable FreightUtils identifier (and fu_version_id where the dataset has editions); resolve_reference resolves one to exactly its record.

Parameterscodecodeslimitquerycountryfunction_type

uk_duty_calculator

UK Duty & VAT Calculator

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).

Parameterslinesincotermfreight_costcustoms_valuecommodity_codeinsurance_costorigin_country

shipment_summary

Shipment Summary

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, chargeableWe

Parametersmodeas_ofitemsorigineditionincotermconsignmentdestinationfreight_costinsurance_cost

uld_lookup

Air Cargo ULD Lookup

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 someb

Parametersdeckfulltypelimitoffsetcategory

vehicle_lookup

Vehicle Lookup

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. Identifiers: Each record carries fu_id, a stable FreightUtils identifier (and fu_version_id where the dataset has editions); resolve_reference resolves one to exactly its record.

Parametersfullsluglimitoffsetregioncategory

adr_lq_eq_check

ADR LQ / EQ Exemption Check

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 it

Parametersmoderequiredas_ofitemsrequirededition

emissions_calculator

Freight Emissions Calculator

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). Identifiers: Each record carries fu_id, a stable FreightUtils identifier (and fu_version_id where the dataset has editions); resolve_reference resolves one to exactly its record.

Parametersmassrequiredmoderequiredbasisregionsub_modemass_unitdistance_kmrequired

validate

Freight Identifier Validator

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=<arbitrary string> to find and validate every identifier in it (e.g. a booking-email line), OR pass value=<identifier> + 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).

Parameterstexttypevalueconsignment

ics2_check

ICS2 Stop-Words Checker

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=<goods 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. Identifiers: Each record carries fu_id, a stable FreightUtils identifier (and fu_version_id where the dataset has editions); resolve_reference resolves one to exactly its record.

Parametersdescriptionrequired

adr_consignment_check

ADR Consignment Check

One call on the consignment object for the ADR picture of a road load: the 1.1.3.6 small-load verdict, the limited / excepted quantity check of each line, the tunnel restriction code of the whole load against the tunnels on the route, each line's transport-document entry, mixed loading (7.5.2, with the foodstuffs precautions of 7.5.4), and the vehicle side — orange-coloured plates and placards (5.3), the documents, fire extinguishers and equipment on the transport unit (8.1), and driver training (8.2); and the UN packaging mark of each line (6.1.3.1). The rules are page-cited to the free UNECE ADR 2025 publication. Provide lines[] — each dangerous-goods line with un_number, quantity {value, unit, basis} and, where it applies, packing_group / variant_index, packages {count, type, gross_kg, un_mark (the UN packaging mark as printed, 6.1.3.1)}, inner_packaging {quantity, unit, per_outer?, regime?} and (ID lines only) icao_limited_quantity — and optionally journey {date, tunnels_on_route (A–E), mode}, vehicle {max_mass_t (the transport unit's maximum permissible mass — the 8.1.4.1 band, 3.4.13), foodstuffs_carried (ADR 7.5.4), fire_extinguishers_kg[], orange_plates_displayed, placards_displayed, equipment_8_1_5[] (the 8.1.5 items by name), instructions_in_writing}, crew {adr_training_certificate, specialisations[] (class_1, class_7, tanks), photo_identification, awareness_training_1_3}, edition and as_of. journey.date is the default as_of; an as_of that contradicts it is refused. Behavior: deterministic. The 1.1.3.6 check is the adr_exemption_calculator's answer, whole (basis, basis_until, strict_adr_2027, items[].state incl. EXCLUDED_NIL / BLOCKED / AIR_ONLY_ID). The LQ / EQ checks are the adr_lq_eq_check answer per line with inner_packaging. The tunnel check assigns the whole load the most restrictive code (8.6.3.2, ranked by the categories the 8.6.4 table forbids for the carriage), gives which tunnels on the route the load may use without and with the 1.1.3.6 relie

Parameterscrewas_oflinesrequirededitionjourneyoptionsvehicle

Version history

21
  1. v2.34.0LatestNov 7, 2026
  2. v2.33.0Nov 6, 2026
  3. v2.32.0Nov 6, 2026
  4. v2.31.0Nov 5, 2026
  5. v2.30.0Nov 5, 2026
  6. v2.28.0Nov 4, 2026
  7. v2.27.0Oct 31, 2026
  8. v2.26.0Oct 30, 2026
  9. v2.25.0Oct 30, 2026
  10. v2.24.0Oct 29, 2026
  11. v2.22.5Oct 15, 2026
  12. v2.22.4Oct 14, 2026
  13. v2.22.3Oct 14, 2026
  14. v2.22.2Oct 8, 2026
  15. v2.22.0Oct 8, 2026
  16. v2.21.2Oct 7, 2026
  17. v2.21.1Oct 7, 2026
  18. v2.21.0Oct 6, 2026
  19. v2.20.1Oct 5, 2026
  20. v2.20.0Oct 3, 2026
  21. v2.19.0Sep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts