FreightUtils MCP Server
Server Details
Neutral freight reference + validation layer for AI agents: ADR, HS, UN/LOCODE, freight math
- Status
- Healthy
- Uptime
- 100.0% over 83 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- SoapyRED/freightutils-mcp
- GitHub Stars
- 8
- Server Listing
- FreightUtils MCP Server
- ChatGPT
- –
- Claude
- FreightUtils
TDQS
Scored across 26 tools
The ADR cluster (adr_lookup, adr_exemption_calculator, adr_lq_eq_check and the superset adr_consignment_check) and the measurement cluster (cbm_calculator, chargeable_weight_calculator, ldm_calculator, consignment_calculator, shipment_summary) overlap heavily, and several descriptions explicitly call themselves the single-purpose version of arithmetic another tool does inline. Careful reading resolves most choices, and the geographic/reference/validation tools are well separated, but an agent must work to avoid picking the composite when a single-figure tool is intended.
Names are uniformly snake_case and nearly all follow a noun_role pattern (airport_lookup, cbm_calculator, ics2_check, adr_consignment_check), with clear domain prefixes (adr_, uk_) that aid scanning. A few outliers exist — get_subscribe_link, validate, resolve_reference, nearest_airport — but they stay readable and non-ambiguous.
At 26 tools the surface is heavy and includes redundant composites (shipment_summary re-implements ldm/cbm/chargeable weight; adr_consignment_check re-answers the exemption, LQ/EQ and lookup tools). The breadth of domains (ADR, air, sea, road, customs, equipment, emissions) justifies many tools, but the duplication means not every tool clearly earns its place.
Coverage is broad and deep: dangerous-goods lifecycle (lookup, 1.1.3.6, LQ/EQ, full consignment check), carrier/airport/location/equipment reference data, a full family of freight calculators, customs and trade lookups (HS, UK duty, Incoterms, ICS2), plus identifier validation and a cross-dataset resolver. The acknowledged gaps (Part 9 vehicle approval, stowage, SCAC/BIC) are narrowly scoped and documented in limitations, leaving no obvious dead end for the stated domain.
Available Tools
26 toolsadr_consignment_checkADR Consignment CheckARead-onlyIdempotentInspect
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 relief (8.6.3.3: goods carried under 1.1.3 are not subject to tunnel restrictions unless the unit must bear the 3.4.13 mark), and computes the net explosive mass for B1000C / C5000D. The document entries follow 5.4.1.1.1 (a), (b), (c), (d), (k) in that order, from Table A columns (1)–(5) and (15) — e.g. "UN 1098 ALLYL ALCOHOL, 6.1 (3), I, (C/D)"; a row whose name joins names by "or" gives one entry per name (3.1.2.2); for a load within 1.1.3.6 the total quantity and calculated value per transport category (NOTE 1 to 5.4.1.1.1 (f)). A generic or N.O.S. row assigned special provision 274 or 318 is conditional on the document until its technical name is added in brackets (3.1.2.8.1 — the object carries none); a CARRIAGE PROHIBITED line and an ID line get no entry (entry null, the reason given) and leave the document insufficient_data — an ID line stated as an ICAO limited quantity carries no entry (3.4.1) and is not counted against it. Mixed loading reads the lines as one load in one transport unit: every pair of lines against the 7.5.2.1 table by the labels of Table A column (5) (subsidiary labels included; "4.1 + 1" / "5.2 + 1" as printed), Class 1 pairs against the 7.5.2.2 table by compatibility group; a lettered note the rows settle is settled (1.4S; UN 2990 / 3072 / 3268; UN 0503 with 3268), one that turns on a fact the object does not carry answers conditional with the note quoted; a line whose LQ / EQ check passes is still read as a package of its row, with the 3.4.1 / 3.5.1.1 relief and 7.5.2.4 stated as conditions; a load within 1.1.3.6 is checked all the same (1.1.3.6.2 does not lift 7.5.2); goods with CV28 engage 7.5.4 (ADR 2027: as amended). The vehicle side lists, per check, the requirements the load puts on the vehicle — read from the Table A rows (class, classification code, column (5) labels, column (19) S-provisions) and the 1.1.3.6 verdict — and checks each against its input: met → pass, not met → fail with the rule quoted, not sent → conditional (the input named, optional, in missing_inputs). Plates: two plain orange-coloured plates (5.3.2.1.1); placards on a vehicle carrying packages only for Class 1 other than 1.4S and Class 7 other than excepted packages (5.3.1.5), the model by 5.3.1.1.2; the 5.3.6 mark with placards; the 3.4.13 LQ mark as a condition on a unit over 12 t. Equipment: the 8.1.2.1 documents, the 8.1.4.1 extinguisher table by mass, the 8.1.5 items by danger label. Training: the 8.2.1 certificate and the Class 1 / Class 7 specialisation (8.2.1.4). Under 1.1.3.6 they read 1.1.3.6.2: no Chapter 5.3, one 2 kg extinguisher (8.1.4.2), the transport document, training per Chapter 1.3 (8.2.3) for a driver without the certificate. Where the text does not settle a case (a code that splits tank and other carriage on a line with no packages; a Class 1 line not in net kg) the check asks instead of assuming. fail means a check the load does not meet; a relief that does not apply is not_applicable, not fail, and does not change the status — a load outside 1.1.3.6 (the full requirements apply, and the other checks answer for a fully regulated load) or a line with no stated regime that fits neither LQ nor EQ; a stated regime that is missed, and a CARRIAGE PROHIBITED entry, still fail. The packaging check reads each line's packages.un_mark by the grammar of 6.1.3.1 — (a) the symbol, (b) the code of the 6.1.2.7 table (T / V / W may follow), (c) the packing-group letter and the relative density or gross mass, (d) S or the test pressure (rounded down to 10 kPa), (e) year, (f) State, (g) maker — and holds the letter against the line's packing group (X: I, II, III; Y: II, III; Z: III): malformed, or a letter that does not cover it → fail with the field named; no mark → conditional (optional, in missing_inputs); a line within its stated LQ / EQ regime and sent without a mark → not_applicable (3.4.1 / 3.5.1.1); a Class 7 package or a Class 2 gas in pressure receptacles (column (8) P200 / P203) → not_applicable (marked under 6.4 / 6.2), any other Class 2 line → not_assessed; an ID line, or a line that matches more than one Table A row → insufficient_data; a row without a packing group → conditional (the letter is held against the level its packing instruction sets, not read); an IBC or large-packaging mark → conditional (6.5.2.1.1 / 6.6.3.1 not read). A limited / excepted quantity line whose stated regime is met is left out of the 1.1.3.6 total (1.1.3.6.5; exemption_1_1_3_6.engine.excluded_lines names it); a line that states no regime is counted. regime names the rules the checks answered under: "1.1.3.6" (the load is within it — the vehicle side reads 1.1.3.6.2), "full_adr" (it is not — a fully regulated load), "undetermined" (the 1.1.3.6 check gave no verdict). Rate-limited: a limit error carries reset_at, the UTC time the allowance resets.
Returns: status (pass | fail | conditional | insufficient_data), regime ("1.1.3.6" | "full_adr" | "undetermined" — the rules the checks answered under; null without dangerous goods), missing_inputs[] ({name, check, what}), checks_performed[] ({name, verdict, required, edition, as_of, basis, citations[] — section, volume, PDF page, a short quotation}), edition, as_of, edition_basis, lines[], exemption_1_1_3_6 {verdict, basis, conditions, engine}, limited_quantities and excepted_quantities {verdict, lines[] {line_index, verdict, reason, answer}}, tunnel_restriction {verdict, lines[], whole_load {codes, forbidden_categories, complete}, route {tunnels_on_route, without_1_1_3_6_relief, with_1_1_3_6_relief}, needs_info[]}, transport_document {verdict, lines[] (elements a–k, strings; entry null and a reason where no entry is written), exemption_1_1_3_6_statement, conditions[]}, mixed_loading_7_5_2 {verdict, basis, lines[] {line_index, un_number, labels[], classification_code, compatibility_group}, pairs[] {a, b, labels_a, labels_b, permitted (true | false | "conditional"), cell, note, source_ref}, class_1 {assessed, pairs[]}, foodstuffs {engaged, lines[], input, verdict}, conditions[], needs_info[], notes[]}, placards_and_plates_5_3 {verdict, basis, requirements[] {id, applies (true | false | "under_relief_only" | "conditional"), basis, quantity, specification, lines[], source_ref}, orange_plates {required, numbered}, placards {required, lines[] {line_index, placards[]}}, marks[], lq_mark {applies, condition}, conditions[], needs_info[], notes[]}, equipment_8_1 {verdict, basis, requirements[], fire_extinguishers {band, minimum_total_kg, minimum_largest_kg, small_load_rule, on_board, verdict}, general_equipment[] and label_specific_equipment[] {item, applies, lines[], on_board, outcome}, documents[], conditions[], needs_info[], notes[]}, driver_training_8_2 {verdict, basis, requirements[], certificate {required, under_relief, specialisations[], outcome}, awareness_training_1_3 {applies, outcome}, conditions[], needs_info[], notes[]}, packaging_code_validity {verdict, basis, lines[] {line_index, un_number, verdict, mark, field (on fail: the 6.1.3.1 sub-paragraph), parsed {symbol, code, code_suffix, letter, covers, relative_density, max_gross_mass_kg, solids_or_inner, test_pressure_kpa, year, state, manufacturer}, reason}, notes[]} — all under result — plus confidence, _source and citation (the FreightUtils v1 response envelope). A call made with an API key stores a check receipt (_meta.check_id); without one the answer carries the receipt hash (_meta.receipt) and nothing is stored.
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: the packaging check reads the mark, not the packaging kind — whether the packaging is one the line's packing instruction (Table A column (8)) allows is not checked (6.1.3 NOTE 1), IBC / large-packaging marks are named, not read, and on a row without a packing group (articles, most of Class 1) the letter is not held against anything; without packages.un_mark a dangerous-goods line is conditional on the packaging check; the vehicle-side checks read the load, so without the vehicle.* / crew.* inputs a dangerous-goods load is conditional (the requirements listed); the vehicle side does not assess the vehicle approval of Part 9, the elevated temperature mark (5.3.3 — the object carries no temperature), handling and stowage (7.5.7) or national equivalent training; a limited / excepted quantity relief is applied only where the line states it (inner_packaging.regime) and meets it — in the 1.1.3.6 total — and is otherwise stated as a condition, never assumed; the foodstuffs part of mixed loading needs vehicle.foodstuffs_carried (without it, a condition); column (6) special provisions that change the labels are not applied; limited / excepted quantities are not taken out of the tunnel code (the object does not say a line is carried so); not legal advice, verify against the current UNECE ADR text.
Related: adr_exemption_calculator (the 1.1.3.6 check alone), adr_lq_eq_check (LQ / EQ alone), adr_lookup (a row's columns).
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.
| Name | Required | Description | Default |
|---|---|---|---|
| crew | No | The vehicle crew, for the driver-training and document checks (ADR 8.2, 8.1.2). Facts only — no name. | |
| as_of | No | YYYY-MM-DD the answer is for (default today, UTC); picks the ADR edition when edition is omitted, and is echoed in the answer and its check receipt. | |
| lines | Yes | The lines of the load (1–50). Required. | |
| edition | No | ADR edition: "2025" or "2027". Wins over as_of. Omit it and as_of picks the edition by the legal timeline: before 2027-01-01 ADR 2025; from 2027-01-01 ADR 2027 (ADR 2025 may still be applied until 2027-06-30 under 1.6.1.1 — edition "2025" answers on it until then); from 2027-07-01 ADR 2027 only. An ADR 2027 answer for a date before 2027-01-01 carries an EDITION_NOT_YET_APPLICABLE warning. | |
| journey | No | ||
| options | No | The consignment object's options; not read by this check. | |
| vehicle | No | Read: max_mass_t (8.1.4.1, 3.4.13), foodstuffs_carried (7.5.4) and the vehicle-side inputs (5.3, 8.1). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read, idempotent, non-destructive and closed-world, and the description adds substantial behavior beyond them: determinism, verdict semantics (fail vs not_applicable vs conditional vs insufficient_data), the rule that reliefs that do not apply never change status, missing_inputs population, edition precedence and the 2027-06-30 transition, a rate limit with reset_at in UTC, and receipt storage with vs without an API key. This is unusually complete behavioral disclosure for a check tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The opening summary is well front-loaded and the paragraphs are organized by check, but the description is a dense wall of run-on clauses and repeatedly restates the return shape under 'Returns:' even though an output schema exists, which is redundant bulk. Rules like not_applicable vs fail are explained more than once (behaviour paragraph and limitations). Content largely earns its place, but tightness is poor.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool this complex (7 params, nested objects, output schema, multilingual rule citation) nothing material is left unsaid: editions and their legal timeline, the full limitation list (mark vs packaging kind, IBC not read, Part 9 approval not assessed, 7.5.7 not assessed, no legal advice), and identifier guidance (fu_id, resolve_reference). Return values are correctly deferred to the output schema despite the redundant recap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 86%, yet the description adds genuine meaning the schema does not carry: journey.date as the default as_of with contradiction refusal, max_mass_t as the 8.1.4.1 band / 3.4.13 threshold, un_mark as the printed 6.1.3.1 mark parsed by sub-paragraph (a)-(g) and held against packing group (X/Y/Z), inner_packaging.regime as the trigger for LQ/EQ exclusion from the 1.1.3.6 total, and icao_limited_quantity as ID-line-only and exempt from document counting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb+resource+scope ('One call on the consignment object for the ADR picture of a road load') and then enumerates the exact checks performed (1.1.3.6, LQ/EQ, tunnel, document entry, 7.5.2 mixed loading, 5.3, 8.1, 8.2, 6.1.3.1). The 'Related' line explicitly separates it from adr_exemption_calculator, adr_lq_eq_check and adr_lookup, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the context of use (a road load consignment, full ADR picture) and routes narrower needs to siblings ('adr_exemption_calculator (the 1.1.3.6 check alone), adr_lq_eq_check (LQ / EQ alone), adr_lookup (a row's columns)'), plus conditions under which the answer degrades to conditional when vehicle/crew inputs are absent. What is missing is an explicit statement of when NOT to call it (e.g. a single-line quantity question), and the routing information sits at the very end rather than up front.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adr_exemption_calculatorADR 1.1.3.6 Exemption CalculatorARead-onlyIdempotentInspect
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) 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, BLOCKED (no points from the line as sent — withheld, basis_mismatch, category_unresolved or entry_required; the line's own flag says which) or EXCLUDED_NIL (a stated quantity of 0, read as not carried: left out of every sum and test, items[].nil_quantity true, and named in a warning). An ID-prefixed number such as ID 8000 (consumer commodity) is an air-only identifier with no ADR Table A entry. It is counted out of 1.1.3.6 — AIR_ONLY_ID, nothing counted, items[].air_only_id true, row fields null — only when the request states, with icao_limited_quantity: true on that line, that the packages are limited quantities to the ICAO Technical Instructions (the 3.4.8 mark, or 3.4.10): 3.4.9 and 3.4.10 deem them to meet 3.4.1-3.4.4, and 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. Without that statement the ID line is BLOCKED (items[].entry_required true) and the load has no verdict unless the other lines settle it. icao_limited_quantity on a UN-numbered line is refused (the API answers 400). Only the ID prefix makes a line air-only — an ID number is never read as the UN number with the same digits — and a load whose every line is a stated air-only line returns total_points 0, exempt true with its own message, never "1.1.3.6 exemption applies" and never not_subject_to_adr.
Gross figures: ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging. A gross mass (basis "gross") on an entry counted by mass is read as an upper bound of the net mass: the load is answered exempt on it only when it clears even on the gross figure — then figure_basis is "upper_bound_gross" and the line carries upper_bound_gross true (its true points are lower). Otherwise, and always for an entry counted in litres, the line gets no points (basis_mismatch): send the net quantity.
ADR 2027 basis: an ADR 2027 answer carries basis — what the verdict rests on: "adr_2027", or, on a stated as_of from 1 January 2027, a transitional measure open on that date that clears a load ADR 2027 itself does not: "1.6.1.61" (the ADR 2025 note-a rule, ×20 with a 50 kg maximum, until 31 December 2030) before "1.6.1.1" (the whole of ADR 2025, until 30 June 2027). Such an answer headlines the transitional basis that clears the load, names it, gives basis_until (the last day it may be applied) and puts the strict ADR 2027 figure beside it (strict_adr_2027: basis, total_points, exempt, has_category_zero, has_quantity_exceedance). A line whose entry is deleted in ADR 2027 (e.g. UN 2941) has no ADR 2027 figure at all: on a stated as_of from 2027-01-01 to 2027-06-30 the whole load is answered on ADR 2025 under 1.6.1.1 (basis "1.6.1.1", every line edition_basis "2025") and strict_adr_2027 carries entry_deleted true, deleted_un_numbers and message, its four figures null; outside that window, or without a stated as_of, the call is refused naming the deleted entry. Without a stated as_of, the strict ADR 2027 reading stays the headline. transitional_1_6_1_61 (a load with one of the nine note-a UN numbers) and transitional_1_6_1_1 (inside the 1.6.1.1 window, where ADR 2027 itself is not exempt) state the load on each basis: measure, basis, points_on_this_basis, exempt_on_this_basis, until, note.
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 + icao_limited_quantity or entry_required on an ID-prefixed line, nil_quantity on a 0 line, upper_bound_gross on a gross mass counted as an upper bound, edition_basis on an answer resting on 1.6.1.1 for an entry deleted in ADR 2027, 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, figure_basis, and on ADR 2027 answers basis, basis_until, strict_adr_2027 (with entry_deleted, deleted_un_numbers and message when an entry is deleted in ADR 2027), transitional_1_6_1_61, transitional_1_6_1_1, 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).
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: 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).
| Name | Required | Description | Default |
|---|---|---|---|
| unit | No | 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. | |
| as_of | No | YYYY-MM-DD the answer is for (default today, UTC); picks the ADR edition when edition is omitted, and is echoed in the answer and its check receipt. | |
| basis | No | OPTIONAL. 'net' or 'gross'. ADR 1.1.3.6.3 counts the dangerous goods themselves, never the packaging. A 'gross' mass on an entry counted by mass is used only as an upper bound of the net mass: the load is answered exempt on it only when it clears even on the gross figure (figure_basis upper_bound_gross); otherwise, and always for an entry counted in litres, no points — send the net quantity. | |
| items | No | Items for a mixed load. An item quantity may be 0: the goods are not carried, the line is left out of the load and named in a warning (a load of nothing but zeros is refused). With items[], the single-substance fields (un_number, quantity, packing_group, variant_index, unit, basis) are refused beside it (INVALID_INPUT) — each goes on its item. | |
| edition | No | ADR edition: "2025" or "2027". Wins over as_of. Omit it and as_of picks the edition by the legal timeline: before 2027-01-01 ADR 2025; from 2027-01-01 ADR 2027 (ADR 2025 may still be applied until 2027-06-30 under 1.6.1.1 — edition "2025" answers on it until then); from 2027-07-01 ADR 2027 only. An ADR 2027 answer for a date before 2027-01-01 carries an EDITION_NOT_YET_APPLICABLE warning. | |
| quantity | No | Quantity 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_number | No | 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: counted out of 1.1.3.6 (AIR_ONLY_ID) only with icao_limited_quantity: true — the ADR answer for limited-quantity packages to the ICAO Technical Instructions, 3.4.9 / 3.4.10 / 1.1.3.6.5; without it the line is BLOCKED and the load has no verdict unless the other lines settle it. | |
| consignment | No | Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg, un_mark}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs. | |
| packing_group | No | 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. | |
| variant_index | No | 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. | |
| icao_limited_quantity | No | OPTIONAL, only with an ID-prefixed un_number (e.g. ID8000): true states that the packages are limited quantities conforming to the ICAO Technical Instructions (the 3.4.8 mark, or 3.4.10). Only then is the line counted out of 1.1.3.6; without it the ID line is BLOCKED and the load has no verdict unless the other lines settle it. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, but the description adds substantial behavior: a deterministic calculation over reference data, rate limiting with reset_at, NOT_FOUND blocking errors, refusal of unknown fields by name with 400s, exempt/total_points staying null rather than defaulting to false, and the deliberate conservative treatment of mixed loads. This is well beyond what the annotations supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
There is a strong front-loaded opening sentence, but the body sprawls across many long paragraphs and the "Returns:" section enumerates output fields that the existing output schema already defines, so those sentences do not earn their place. The ADR 2027 / transitional-measure material is relevant but repeated in several places (basis, Editions, transitional_1_6_1_61/1_1_1), making the text far larger than an agent needs to select and call the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, deeply nested 11-parameter calculator with an output schema, the description covers every ambiguity an agent would hit: multi-variant UN resolution, withheld lines and null verdicts, ID-prefixed air-only lines, gross-vs-net basis, edition/as_of selection and transitional measures, plus limitations. Nothing material to a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 cross-parameter meaning the schema cannot: un_number/quantity and items[] are mutually exclusive and every single-substance field sent beside items[] is refused by name, un_number also accepts an ID-prefixed air-only number, quantity 0 means not carried, and packing_group can resolve by equivalence when rows agree. Dense enough to raise it above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: "Calculate ADR 1.1.3.6 'small load' exemption points for a dangerous-goods load and say whether it qualifies." It is clearly distinguishable from siblings, naming adr_lookup for per-substance data and adr_lq_eq_check for the LQ/EQ relief routes instead of 1.1.3.6.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use and when-not: 1.1.3.6 relieves goods carried in packages only, not bulk or tanks; category 0 substances can never use the exemption; LQ/EQ loads belong to adr_lq_eq_check; ambiguous UNs require adr_lookup for variant_index. Alternative routes and exclusions are stated outright rather than inferred.
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 LookupARead-onlyIdempotentInspect
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_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 — plus resolved_codes[] beside results[]: one entry per distinct code in columns (5)–(20) across the answer, with its code, family, columns, rows (the results[] indexes that carry it), summary, ADR section and verification_status (include_codes "full" adds url, title, meaning, parameters, applies_to, references; "none" omits the list; default compact for un_number, none for search, hazard_class and un_numbers; a code's page is https://www.freightutils.com/adr/codes/{family}/{code}). The meanings are FreightUtils' paraphrases of ADR 2025, cited to section and page; verification_status says how each one has been reviewed, in the registry's own words: paraphrase_unreviewed (not yet reviewed), machine_reviewed (two independent readings of the UNECE text, compared with the record; the owner adjudicates every disagreement), contested (the readings disagree and no person has reviewed it yet), owner_reviewed (the owner's ok), dg_reviewed (the owner's and the DG reviewer's ok), needs_fix (the latest review asks for a fix), or verified on the transport category and tunnel code entries, which are read from the 1.1.3.6.3 and 8.6.4 tables — 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: 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).
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.
| Name | Required | Description | Default |
|---|---|---|---|
| as_of | No | YYYY-MM-DD the answer is for (default today, UTC); picks the ADR edition when edition is omitted, and is echoed in the answer and its check receipt. | |
| limit | No | search / hazard_class only: rows per page (default 10; at most 50 for search, 100 for hazard_class). | |
| offset | No | search / hazard_class only: rows to skip (default 0). The response gives total and next_offset. | |
| search | No | Case-insensitive partial match on the proper shipping name (2 to 200 characters). Example: "acetone". | |
| edition | No | ADR edition: "2025" or "2027". Wins over as_of. Omit it and as_of picks the edition by the legal timeline: before 2027-01-01 ADR 2025; from 2027-01-01 ADR 2027 (ADR 2025 may still be applied until 2027-06-30 under 1.6.1.1 — edition "2025" answers on it until then); from 2027-07-01 ADR 2027 only. An ADR 2027 answer for a date before 2027-01-01 carries an EDITION_NOT_YET_APPLICABLE warning. | |
| un_number | No | Exact UN number — 4 digits, optionally "UN"-prefixed; explosives keep their leading zero. Examples: "1203", "UN1203", "UN 1203", "0004". | |
| un_numbers | No | Batch: up to 50 UN numbers, answered in one call as results[] in input order, each as its own un_number lookup with its own status. Send alone (include_codes may go beside it). | |
| hazard_class | No | 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"). | |
| include_codes | No | include_codes: "none" | "compact" | "full" — resolved_codes beside results[]: one entry per distinct code in Table A columns (5)–(20) across the answer, with its meaning in FreightUtils' own words (code, family, columns, rows = the results[] indexes that carry it, summary, section, verification_status; "full" adds url, title, meaning, parameters, applies_to, references; a code's page is https://www.freightutils.com/adr/codes/{family}/{code}). Default "compact" for a un_number lookup, "none" for search, hazard_class and un_numbers batches. | |
| include_statements | No | true adds statements[] to every row: short plain-word statements (tunnel, transport category, labels, packing, tanks, carriage) assembled from the code meanings and the 8.6.4 / 1.1.3.6.3 tables, each with its basis, codes and verification_status (the lowest of the codes it draws on). Default false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, yet the description still adds real behaviour: paging is never silently truncated (total, truncated, next_offset), rate limits carry reset_at, a miss errors with closest-name suggestions, 28 scope-remark rows return packing_group null plus not_subject_to_adr or carriage_prohibited. The verification_status taxonomy and edition applicability window are disclosed beyond anything in 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Labels (Behavior, Returns, Editions, Limitations, Related, Identifiers) give useful structure and scope is front-loaded, but the returns sentence is a single enormous run-on enumerating 20 columns and then re-enumerating the resolved_codes payload. Substantial content duplicates the output schema, which exists, and the verification_status list of seven values is inline bloat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, multi-mode lookup with an output schema, every decision an agent must make is covered: which mode, how to page, what defaults apply, how editions resolve, what happens on misses and rate limits, and the legal/verification caveats. The remaining verbosity is a conciseness issue, not a completeness one.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description earns credit by adding semantics the schema only partly carries — un_number normalisation with echo of the correction, explosives keeping the leading zero, include_codes defaults differing per lookup mode, and edition-beats-as_of precedence with the 2027-06-30 transition. It largely restates the schema's own enum and precedence text rather than adding new meaning, which caps it below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — "Look up the full European road dangerous-goods (ADR 2025) Table A entry for a substance" — and immediately scopes it (all 20 columns, 2,939 entries, UNECE source). The three lookup modes (un_number, search, hazard_class) plus the Related list make it distinguishable from adr_lq_eq_check, adr_exemption_calculator and consignment_calculator without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit mode selection ("Provide exactly ONE of: un_number ... search ... or hazard_class") and routes downstream work to siblings with conditions ("adr_lq_eq_check (checks quantities against the LQ/EQ values returned here)"). Gaps: the un_numbers batch parameter is documented in the returns paragraph but omitted from the "exactly ONE of" rule, and no guidance is given on when to prefer url-based code resolution over include_codes full.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
adr_lq_eq_checkADR LQ / EQ Exemption CheckARead-onlyIdempotentInspect
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).
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: 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).
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Check mode: 'lq' (Limited Quantity, ADR 3.4) or 'eq' (Excepted Quantity, ADR 3.5) | |
| as_of | No | YYYY-MM-DD the answer is for (default today, UTC); picks the ADR edition when edition is omitted, and is echoed in the answer and its check receipt. | |
| items | Yes | Items to check (1–20 per call). | |
| edition | No | ADR edition: "2025" or "2027". Wins over as_of. Omit it and as_of picks the edition by the legal timeline: before 2027-01-01 ADR 2025; from 2027-01-01 ADR 2027 (ADR 2025 may still be applied until 2027-06-30 under 1.6.1.1 — edition "2025" answers on it until then); from 2027-07-01 ADR 2027 only. An ADR 2027 answer for a date before 2027-01-01 carries an EDITION_NOT_YET_APPLICABLE warning. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds behavior those annotations cannot express: deterministic reference check, withheld items in mixed batches, overall_status never reading "qualifies" while anything is withheld, blocking_errors + human_review_required on fully ambiguous batches, explicit refusal of unrecognized fields, not_subject handling for "NOT SUBJECT TO ADR" rows, and rate-limit errors carrying reset_at. Nothing here contradicts 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the labeled paragraphs (Behavior, Editions, Limitations, Related, Identifiers) aid scanning, but the prose is dense with nested parentheticals and run-on sentences that are hard to parse in one pass. The "Returns:" paragraph substantially restates the output schema, and the Identifiers/fu_id paragraph is largely irrelevant to deciding whether and how to call this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter batch tool with an output schema, everything an agent needs is present: eligibility rules, ambiguity protocol, edition timeline, scope exclusions, failure modes, rate limits, and the disclaimer that results are not legal advice. If anything it over-supplies detail, but nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds cross-parameter meaning the schema cannot: quantity is "per INNER packaging, not the whole load," a mass quantity against a volume limit returns inconclusive rather than a verdict, and packing_group resolves by equivalence when rows agree while variant_index is required only when they disagree. Some text does restate schema content (mode values, edition precedence), which keeps it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific verb and resource: "Check whether dangerous goods qualify for ADR Limited Quantity (LQ, ADR 3.4) or Excepted Quantity (EQ, ADR 3.5) relief," and the Related section explicitly separates this from adr_lookup (raw per-substance values) and adr_exemption_calculator (the 1.1.3.6 load-points route). An agent can pick this tool over its two nearest siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states which mode to send ("lq" or "eq"), what the caller must supply, and when the tool is the wrong instrument ("a quantity-threshold check only — LQ/EQ relief also requires packaging, marking and documentation conformity that this tool does not assess"). It also routes to alternatives by name for the two adjacent use cases, so both the when and the when-not are covered.
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 LookupARead-onlyIdempotentInspect
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 dataset has editions); resolve_reference resolves one to exactly its record.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Lists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record. | |
| iata | No | Exact IATA code (2 alphanumeric chars) | |
| icao | No | Exact ICAO code (3 letters) | |
| codes | No | Batch: up to 50 airline codes — 2 characters IATA, 3 letters ICAO, 3 digits AWB prefix — answered as results[] in input order, each with its own status. Send alone. | |
| limit | No | Lists only: rows per page (default: every row for summaries; 5 with full: true). | |
| query | No | General search (name, code, prefix or country — 2 to 200 chars) | |
| offset | No | Lists only: rows to skip (default 0). The response gives total and next_offset. | |
| prefix | No | AWB prefix (3 digits) | |
| country | No | Filter by country name (min 2 chars) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: pagination shape (summary rows, 25 per page, total/truncated/next_offset), the asymmetry between list answers and full holder records for iata/icao/prefix, fuzzy fallback behavior with a concrete example ('Emirats' → Emirates), and rate-limit semantics (limit error carries reset_at in UTC). The 'stale/no warranty' caveat (provenance_status pending verification) is exactly the kind of risk context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and labeled (Behavior, Returns, Limitations, Related, Identifiers), which helps scanning. However, the long 'Returns' paragraph enumerates output fields one by one even though an output schema exists, so a sizeable portion of the text is redundant with structured data rather than adding to it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers everything an agent needs for a 9-parameter, zero-required lookup: how to choose the one parameter, what each answer shape looks like, paging, rate limits, provenance risk, and identifier resolution via resolve_reference. Nothing material is missing given the annotations and output schema already in place.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real meaning: the fuzzy-vs-exact split between query and the code filters, why prefix is three digits, and that a query without a name falls back to closest names. That is interpretive guidance the schema patterns alone do not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus dataset scale ('Search 6,356 airlines by name, IATA code, ICAO code, AWB prefix, or country') and immediately explains what an AWB prefix is. It explicitly separates itself from airport_lookup ('searches AIRPORTS, not carriers') and validate, so an agent can pick it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear routing rule for its own parameters ('Provide ONE parameter: query is ranked fuzzy... iata / icao / prefix / country are exact filters') and names two alternatives with their triggering conditions (airport_lookup for airports, validate for check-digit validation). It stops short of stating when not to use the tool at all, but the alternative routing is explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
airport_lookupAirport Code LookupARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| iata | No | Exact IATA code (3 letters) | |
| icao | No | Exact ICAO / ident (4 chars) | |
| type | No | Optional filter by airport type | |
| codes | No | Batch: up to 50 airport codes — 3 letters IATA, 4 characters ICAO — answered as results[] in input order, each with its own status. Send alone. | |
| query | No | Name / city / municipality search (2 to 200 chars) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint=false, so the safety profile is covered upstream; the description still adds real value with ranked-candidate ordering, confidence/match_quality reporting, and not-found vs rate-limit error behavior including reset_at. It stops short of describing result ordering guarantees for the batch path or how partial failures are surfaced beyond 'each with its own status' in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the identifier forms and then cleanly partitioned into Behavior, Returns, Limitations, Related, and Identifiers sections, so an agent can skim. It is longer than strictly necessary, and the Returns/Identifiers material partly duplicates what the output schema and resolve_reference already imply.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the definition still summarizes the envelope shape, source attribution, and data provenance, plus a sensible 'not for navigation' limitation and rate-limit reset semantics. The one substantive hole is the batch `codes` workflow: with five parameters and an explicit 'Send alone' constraint, leaving it out of the narrative is a real completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 and the schema already documents formats and the type enum. The description adds useful semantics for query ambiguity (ranked candidates, exact codes first, then larger airports) and for the type filter narrowing results, but it silently omits the `codes` batch parameter, which is the one parameter whose exclusivity rule ('Send alone') an agent could easily violate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the exact verb and resource (look up an airport) and enumerates the three accepted identifier forms with concrete examples. It explicitly separates itself from the most confusable siblings, noting that nearest_airport finds airports FROM a coordinate and that airline_lookup searches carriers rather than airports.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to provide ONE of iata, icao, or query, and lists three related tools with the condition that selects each, which is strong routing guidance. However it never mentions the batch `codes` parameter, so an agent reading only the description would not know a multi-code lookup mode exists at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cbm_calculatorCBM CalculatorARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| pieces | No | Number of identical pieces (default: 1) | |
| width_cm | Yes | Width in centimetres | |
| height_cm | Yes | Height in centimetres | |
| length_cm | Yes | Length in centimetres |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/closed-world, yet the description adds material behavior beyond them: determinism, that totals are computed from unrounded figures and rounded only for display, that invalid dimensions produce a validation error naming the parameter, and that rate-limit errors carry reset_at in UTC. It also notes snake_case vs the hosted endpoint's camelCase, which is a real behavioral difference an agent must handle.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then Behavior, Returns and Related — a predictable structure with no filler sentences. The Returns paragraph is the weakest part: with an output schema present, enumerating result fields is largely redundant, and the camelCase aside is useful but sits oddly in that block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter deterministic calculator, the description covers inputs (per-piece dims, pieces), computation and rounding rules, error behavior, rate limits, and sibling alternatives, while an output schema exists to cover return values. Nothing an agent needs to call this correctly and interpret failures appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 beyond the field descriptions: dimensions are per-piece, pieces multiplies into the total ("total volume = pieces x per-piece CBM"), and rounding is deferred to display. It does not restate units per parameter, but the multiplication semantics and per-piece scoping are genuinely additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: "Calculate cubic metres (CBM) for a shipment from per-piece dimensions." It defines what CBM is and scopes the input as per-piece dimensions, and the Related section names the closely related siblings (chargeable_weight_calculator, consignment_calculator, unit_converter, shipment_summary) with one-phrase differentiators, so an agent can separate this from ldm_calculator or consignment_calculator without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Related block gives clear routing context by describing what each alternative does ("air billing weight from the same dims", "multi-line totals", "single conversions"), which implies selection conditions. There are no explicit when-not or exclusion statements (e.g. "use ldm_calculator instead when you need load metres/freight-tonne by volume-to-deck"), so guidance is clear but not fully enumerated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
chargeable_weight_calculatorChargeable Weight CalculatorARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| factor | No | Volumetric divisor (default: 6000) | |
| pieces | No | Number of identical pieces (default: 1) | |
| width_cm | Yes | Width in centimetres | |
| height_cm | Yes | Height in centimetres | |
| length_cm | Yes | Length in centimetres | |
| gross_weight_kg | Yes | Actual gross weight in kilograms of ALL pieces together (the total, not one piece) — the dimensions are per piece. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a safe, idempotent, non-destructive read, and the description still adds substantial behavior: deterministic output, the per-piece vs total weight convention, unrounded-then-displayed rounding with a worked 10,000-piece example, the meaning of "basis", named-parameter validation errors, and rate limiting that returns reset_at in UTC. This is exactly the context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core definition is front-loaded in the first sentence, which is good, but the Returns paragraph is long and largely restates fields the output schema already declares, including a snake_case/camelCase mapping note of marginal decision value. Dense reference prose rather than a crisp brief.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a deterministic calculator with full schema coverage and an output schema, everything an agent needs to call it correctly and interpret the result is present: units, divisor choice, per-piece vs total semantics, rounding, error and rate-limit behavior, and sibling routing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 domain meaning: the divisor's IATA 6,000 default versus the 5,000 used by express integrators, and the 1 CBM = 166.67 kg equivalence. It also reinforces the pieces/gross_weight_kg asymmetry, which the schema states but the description ties to a concrete example.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Calculate air freight chargeable weight — the greater of actual gross weight and volumetric weight" gives a specific verb, resource, and the governing business rule, plus the exact formula and divisor conventions. It is unmistakably distinct from siblings like cbm_calculator (volume only) and ldm_calculator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names an explicit exclusion (air mode only) and routes sea W/M traffic to consignment_calculator with mode=sea, while the Related line positions cbm_calculator, consignment_calculator, and uld_lookup by their distinct roles. An agent can pick the correct tool without opening any schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
consignment_calculatorConsignment CalculatorARead-onlyIdempotentInspect
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 / ldm_calculator (single-figure versions), shipment_summary (adds vehicle/container suggestion and duty estimates), adr_lookup (what a flagged UN number is).
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Transport mode: sea | air | road (default road). Selects the chargeable-weight basis. | |
| as_of | No | YYYY-MM-DD the answer is for (default today, UTC); picks the ADR edition when edition is omitted, and is echoed in the answer and its check receipt. | |
| items | No | Deprecated flat alias — dimensions in cm, weight in kg. Prefer "lines". Provide lines OR items. | |
| lines | No | Canonical consignment lines (preferred). Each: { quantity, dims:{l,w,h,unit}, weight:{value,unit}, optional description / hs_code / un_number / stackable }. | |
| edition | No | ADR edition: "2025" or "2027". Wins over as_of. Omit it and as_of picks the edition by the legal timeline: before 2027-01-01 ADR 2025; from 2027-01-01 ADR 2027 (ADR 2025 may still be applied until 2027-06-30 under 1.6.1.1 — edition "2025" answers on it until then); from 2027-07-01 ADR 2027 only. An ADR 2027 answer for a date before 2027-01-01 carries an EDITION_NOT_YET_APPLICABLE warning. | |
| options | No | Optional: { air_volumetric_divisor, container_number, awb_number }. | |
| consignment | No | Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg, un_mark}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds substantial behavior beyond them: determinism, that flags are advisory only and never assert compliance, the specific flag categories (implausible density, mode/option mismatch, ADR 2025 dangerous-goods, container/AWB check digits), that invalid lines error naming the offending field, and that rate-limit errors carry reset_at. That is materially more than the annotations supply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and the remaining paragraphs are labelled by function (inputs, behavior, returns, editions, limitations, related), so scanning is easy. It is long and the Returns paragraph restates fields an output schema already enumerates, which is mild redundancy, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-complexity tool with nested objects, 7 parameters and an output schema, the definition covers input shape, defaults, error behavior, edition selection, advisory-flag semantics and limits. The explicit non-regulatory disclaimer is important for a dangerous-goods-adjacent calculator and is stated clearly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema carries the parameter detail and a baseline 3 is the floor. The description still adds non-obvious meaning: the air_volumetric_divisor default of 6000 and that it only affects air, that items[] is legacy cm/kg, and the edition-vs-as_of precedence rule including the ADR 2025/2027 transition window. It does not document the nested consignment object that the schema also exposes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb plus resource: calculate per-line and grand totals for a multi-item mixed consignment, enumerating the concrete outputs (CBM, LDM, volumetric weight, mode-specific chargeable figure). The 'Related' line explicitly separates it from cbm_calculator / chargeable_weight_calculator / ldm_calculator by calling those 'single-figure versions', so an agent can distinguish intent without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Declares the default mode (road) and the accepted input shapes, stating lines[] is canonical and items[] is a deprecated legacy alias with cm/kg units. The Related section routes the agent to shipment_summary for vehicle/container suggestions and adr_lookup for flagged UN numbers. It stops short of an explicit 'use this instead of X when Y' exclusion rule, so it is strong context rather than full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
container_lookupContainer LookupARead-onlyIdempotentInspect
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).
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.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Lists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record. | |
| type | No | Container slug (e.g., "20ft-standard", "40ft-high-cube"). Omit to list all. | |
| limit | No | Lists only: rows per page (default: every row for summaries; 5 with full: true). | |
| offset | No | Lists only: rows to skip (default 0). The response gives total and next_offset. | |
| item_quantity | No | Load fit: number of items (default 1). | |
| item_width_cm | No | Load fit: item width in cm. | |
| item_height_cm | No | Load fit: item height in cm. | |
| item_length_cm | No | Load fit: item length in cm (with item_width_cm and item_height_cm, and type). | |
| item_weight_kg | No | Load fit: weight of ONE item in kg (default 0 — no weight check). |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds substantial behaviour the annotations do not: case-insensitive and ISO size-type code input parsing, an error path that returns valid slugs plus a closest match, rate limiting with reset_at, and a candid limitation that fit maths is geometric best-effort without load distribution, securing or mixed cargo. Provenance caveats and the snake_case vs camelCase envelope difference between the package and the hosted endpoint are also disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is long but deliberately structured into Behaviour / Returns / Limitations / Related / Identifiers sections, with the core purpose front-loaded in the first sentence. The weak spot is the Returns paragraph, which partially restates field names the output schema already documents and includes an endpoint-naming aside that is not needed to invoke the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 9-parameter reference tool with computed load-fit, pagination, error and rate-limit paths, the description covers everything an agent needs: input forms, branch conditions, error recovery, limitations and disambiguation from siblings. Since an output schema exists, the brief return summary is sufficient rather than required.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description nonetheless adds real meaning — slug examples, the fact that 'type' accepts any letter case and ISO codes like "45G1" or "40HC", and that item_length_cm is only meaningful together with width/height and a type. Pagination semantics for 'full: true' (five per page) go slightly beyond the schema's default note.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ("Get ISO shipping-container specifications") and immediately delimits scope by enumerating the 10 container types covered. It also names its nearest siblings (validate, cbm_calculator, consignment_calculator, uld_lookup) with one-line distinctions, so an agent can separate this from every adjacent tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit branch conditions: supply 'type' for a single record, omit it to list all 10, add 'full: true' for full records, and add item dimensions only when a load-fit calculation is wanted. It also tells the agent when to go elsewhere — validate for container numbers (not specs), cbm_calculator/consignment_calculator for cargo volume, uld_lookup for the air-freight analogue.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
emissions_calculatorFreight Emissions CalculatorARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| mass | Yes | Shipment mass, expressed in mass_unit. Example: 1000 | |
| mode | Yes | Transport mode | |
| basis | No | Emissions basis: wtw = well-to-wheel incl. upstream energy (default), ttw = tank-to-wheel / operation only | |
| region | No | Factor source/region: uk = DEFRA, us = EPA, fr = ADEME. Default is per-mode. | |
| sub_mode | No | Optional 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_unit | No | Unit for mass (default: kg) | |
| distance_km | Yes | Transport distance in kilometres — you provide it; the tool does not route or compute distance |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly/idempotent/closed-world), the description discloses determinism given the same factor edition, that the fleet-average factor already includes empty running, that sea/air factors are low-representativeness defaults, that unknown mode/sub_mode/region returns available:false rather than a fabricated factor, and that rate-limit errors carry reset_at. That is substantial behavior beyond structured fields, though it stops short of stating latency or caching behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the formula and required inputs, which is good, but it is long (~350 words) and re-enumerates schema facts already given (mode list, region=DEFRA/EPA/ADEME, basis default), and the closing 'Identifiers' paragraph about fu_id/fu_version_id/resolve_reference is tangential to calling this tool. Dense but not tight.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, enum-heavy, read-only calculator with full schema coverage, an output schema, and rich annotations, nothing an agent needs is missing: inputs, defaults, failure modes, return envelope (result, confidence, _source, citation), and the reference-only limitation are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by adding a real semantic trap — 'pass ACTUAL GROSS MASS, not chargeable/volumetric weight (a common air-freight mistake — see mass_basis in the result)' — and by tying basis/region choices to their default and authority mapping. It does repeat several enum values verbatim from the schema, which caps it below 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Estimate freight transport greenhouse-gas emissions (kgCO2e) for a shipment leg') and gives the governing standard (ISO 14083:2023 / GLEC v3.2) plus the formula. It explicitly differentiates itself from cbm_calculator / ldm_calculator / chargeable_weight_calculator as 'estimates its CO2e' vs 'size or bill a shipment', so an agent can route between siblings without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the required inputs, the optional selectors, and a hard precondition: 'Distance must be provided — this tool does NOT route, geocode, or compute distances', which prevents the most likely misuse. It also warns against a specific alternative behavior ('do NOT add your own empty-return leg') and names the sibling tools it is not, giving both when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_subscribe_linkFreightUtils Plans & PricingARead-onlyIdempotentInspect
Return the FreightUtils pricing page URL with the Pro plan's request limit (50,000 per month) and price. Use when the user asks about FreightUtils plans, pricing or API limits.
Behavior: static local response — no API call, never rate-limited, no account or payment action; the user opens the URL in a browser.
Returns: url, tier, monthly_limit, monthly_price, currency and note under result.
| Name | Required | Description | Default |
|---|---|---|---|
| tier | No | Tier to surface (only "pro" supported today) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnly, idempotent and closed-world, but the description goes further: it says the response is static and local, never rate-limited, and involves no account or payment action, and that the user opens the URL in a browser. That directly prevents the agent from treating this as a checkout or subscription step, which the name might otherwise imply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sections — trigger, behavior, returns — front-loaded with the core purpose. Every sentence carries information an agent needs; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 enumerates the returned fields, so completeness is not in doubt. For a single-parameter, static, local tool, nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'tier' parameter is documented as an enum restricted to 'pro'. The description only implicitly covers it by describing the Pro plan, adding no syntax or format detail beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a concrete verb and resource: it returns the FreightUtils pricing page URL together with the Pro plan's request limit and price. That is specific and distinguishable from every sibling, which are calculators and lookups. It loses a point only because the tool name ('get_subscribe_link') and title point at subscribing/pricing while no sibling overlaps, so there is mild naming friction the description has to correct.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states an explicit trigger: use when the user asks about FreightUtils plans, pricing or API limits. No sibling covers that intent, so no alternative needs naming, and the boundary is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
hs_code_lookupHS Code LookupARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Exact HS code: 2–6 digits, written with or without dots or spaces (e.g. "847130", "8471.30", "0901"). | |
| codes | No | Batch: up to 50 HS codes, answered as results[] in input order, each as its own code lookup with its own status. Send alone. | |
| query | No | Search by product description (min 2 chars) | |
| section | No | Browse by section (Roman numeral I–XXI) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only/idempotent/non-destructive, yet the description adds substantial behavior beyond them: the two-stage search and fallback, medium-confidence signaling via matched_via, the instruction to confirm a citation, that count 0 with empty results[] is still valid, and that rate-limit errors carry reset_at. Limitations (6-digit only, no national tariff lines or duty rates, indicative not a binding ruling) are exactly the kind of context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then cleanly sectioned with bolded labels (Behavior, Returns, Limitations, Related, Identifiers) that make it scannable. The "Returns:" block partly duplicates the existing output schema and the fu_id paragraph is tangential, but neither is padding enough to obscure selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a lookuppable tool with full annotations, 100% schema coverage, and an output schema, an agent has everything needed: what it searches, how to invoke each mode, how to read confidence, what an empty result means, and which sibling to use next. The only minor omission is the batch `codes` route in the description, which the schema itself fully documents.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so 3 is the baseline, but the description adds real meaning: code formats are interchangeable ("8471.30" is 847130) and return the code plus its hierarchy, section is Roman numeral I–XXI to browse, and query has a specific documented fallback chain. The `codes` batch parameter is never mentioned in the description, which keeps this from a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource with exact scope: "Search 6,940 WCO Harmonized System (HS 2022) commodity codes — the 6-digit international customs classification layer," and even explains the 2/4/6-digit hierarchy, so an agent knows precisely what is and is not covered.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing guidance: "Provide ONE of: query … code … or section," plus the fallback rule (query searched first, HMRC index second) and named alternatives — uk_duty_calculator for duty/VAT, ics2_check called out as "a different check entirely," resolve_reference for fu_id. The one gap is that the mutually-exclusive enumeration omits the `codes` batch parameter, so an agent reading only the description could think batch lookup is unsupported.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ics2_checkICS2 Stop-Words CheckerARead-onlyIdempotentInspect
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| description | Yes | The goods description to check against the EU ICS2 stop-words list. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses deterministic term matching, the meaning of the two note types (standalone = automatic rejection vs embedded = make more specific), the crucial caveat that clean=true does not guarantee acceptance, that no binary verdict is returned, and that rate-limit errors carry reset_at. Limitations (not a filing, not legal advice, non-exhaustive list) are spelled out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and behavior sections are front-loaded and dense with useful information, but the "Returns:" block restates what the existing output schema already provides, and the closing "Identifiers:" paragraph about fu_id and resolve_reference is boilerplate that does not earn its place for a single-parameter read-only checker.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and full annotation coverage, the remaining burden is behavioral framing, and the description covers matching semantics, result caveats, rate limiting, scope limitations, and sibling relationships. Nothing an agent needs to call this correctly or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds a little by framing the value as the ENS goods-description field and giving an explicit "Pass description=<goods description>" invocation pattern. It does not add length, language, or formatting constraints on the string, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb and resource: "Check a goods description against the official EU ICS2 stop-words list," and pins it to data element 18 05 000 000 of the ENS. It also names two siblings (hs_code_lookup, uk_duty_calculator) and explains they cover different fields, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear usage context ("Intended for checking a goods description before an ENS is filed") and distinguishes itself from the two related tools it is most likely to be confused with. It stops short of explicit exclusions or a routing rule such as "if you need X, use Y instead," so it is not quite a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
incoterms_lookupIncoterms 2020 LookupARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Incoterm code (3 letters, e.g., "FOB", "CIF") | |
| full | No | Lists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record. | |
| limit | No | Lists only: rows per page (default: every row for summaries; 5 with full: true). | |
| offset | No | Lists only: rows to skip (default 0). The response gives total and next_offset. | |
| category | No | Filter by mode |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive and closed-world, and the description still adds real behavioral detail: unknown codes error with the valid code list, DAT resolves to its successor DPU, and rate-limit errors carry reset_at in UTC. What it does not cover is whether a code lookup is case-sensitive or how confidence/_source should be interpreted, so it stops just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and scope, then call shapes, then behavior and returns; each block is doing distinct work. It is on the dense side and the trailing 'Identifiers' section is somewhat tangential for a lookup call, but no sentence is pure filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter reference lookup with an output schema and full annotation coverage, the description supplies everything an agent needs: valid inputs, filtering modes, error behaviors, the response envelope, and a binding-text limitation. The caveat that the ICC publication prevails is exactly the kind of scope limit an agent should surface.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 cross-parameter semantics the schema cannot express: 'full' applies only to list calls while a single-record call always returns the full record, and lists default to every summary row versus 5 with full: true. It also notes that responses carry total and next_offset, tying offset/limit to pagination behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Look up the 11 Incoterms 2020 trade rules') and enumerates the exact scope, including which 7 rules are any-mode and which 4 are sea-only. It distinguishes the three call shapes (single code, category filter, no filter) so an agent can tell it apart from siblings like hs_code_lookup or uk_duty_calculator.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the selection logic: 'Provide code for one rule, category ... for a filtered list, or neither to list all 11.' It also names the related tools and the specific relationship (uk_duty_calculator accepts an incoterm when composing the CIF value; shipment_summary for composite analysis), which routes the agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ldm_calculatorLDM CalculatorARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| pallet | No | Pallet preset | |
| vehicle | No | Vehicle 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. | |
| quantity | No | Number of pallets (default: 1) | |
| width_mm | No | Custom pallet width in mm | |
| length_mm | No | Custom pallet length in mm | |
| stackable | No | Can pallets be stacked? | |
| weight_kg | No | Weight per pallet in kg | |
| stack_height | No | Stack height 2 or 3 | |
| vehicle_length_m | No | Custom vehicle length in m |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: declares determinism, explains that stackable=true with stack_height 2 or 3 divides the floor footprint, enumerates the three independent fit limits (length, floor positions, payload) and says each failure is named in warnings[] with its numbers. It also discloses the payload-check opt-in (payload_checked is false without weight_kg) and a rate-limit reset_at, none of which the readOnly/idempotent hints convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and the input rule well, and the Returns/Related block is a logical ordering. But the middle paragraph is a dense wall of capitalized claims (LENGTH, FLOOR POSITIONS, PAYLOAD) with nested basis/record_count caveats, and the long Returns enumeration largely duplicates the supplied output schema, so several sentences do not earn their place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-required-parameter calculator with 9 params, an output schema and full annotation coverage, nothing an agent needs in order to call it correctly is missing: inputs, fallbacks, limit semantics, warnings and rate limiting are all addressed. The only redundancy is restating return fields that the output schema already defines, which is surplus rather than a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 the schema does not: the preset-vs-custom mutual requirement, the footprint effect of stackable + stack_height, and that weight_kg is what triggers payload checking. It does not explain how quantity interacts with stacking or spell out custom vehicle_length_m usage beyond the schema's own note, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Calculate loading metres (LDM) for European road freight') and immediately defines the unit ('1 LDM = 1 linear metre of a 2.4m-wide trailer; a standard artic is 13.6 LDM'), so an agent knows exactly what is being computed. The Related section names the three nearest siblings with a one-phrase role for each, which distinguishes this tool from pallet_fitting_calculator and consignment_calculator without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete input precondition: 'Provide a pallet preset OR custom length_mm + width_mm — omitting both errors with a usage hint', plus signposting to vehicle_lookup for trailer specs and consignment_calculator for mixed lines. It reads as clear routing context, but never states an explicit 'do not use this when…' condition, so the choice against consignment_calculator is left partly to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nearest_airportNearest AirportARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Optional filter by airport type | |
| latitude | Yes | Latitude in decimal degrees (-90 to 90) | |
| longitude | Yes | Longitude in decimal degrees (-180 to 180) | |
| radius_km | No | Optional maximum distance in kilometres | |
| include_all | No | Default false: only airports with scheduled airline service and an IATA code (no heliports). true: every airport type except closed fields. | |
| max_results | No | Max results to return (1–50, default 10) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare read-only/idempotent/non-destructive), it discloses the default ranking rule (scheduled service + IATA only, never heliports or closed fields), how confidence is computed and capped, the rate-limit failure mode with reset_at, and that coordinates are input only with no storage or logging. These are substantive operational details an agent could not get from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then cleanly partitioned into Behavior, Returns, Limitations and Related sections. There is mild redundancy in restating the heliport/closed-field exclusion twice and the Returns list partly duplicates the output schema, but no sentence is truly wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter read-only lookup with an output schema, everything an agent needs is present: input units and ranges, filtering defaults, determinism, error behavior, confidence interpretation, and reference-data caveats. The fu_id/citation note covers identifier traceability even though the return shape itself is carried by the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline is 3, but the description adds real meaning: the interplay between include_all and type ('ranks every type except closed fields, and type filters on that type') and the default scheduled-service/IATA scoping are not obvious from the schema alone. It doesn't add anything on radius_km or max_results beyond the schema, which keeps it short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find the airports nearest to a caller-provided latitude/longitude') plus the ranking method (haversine, distance_km per result) and corpus size (86,248 OurAirports records). It is immediately distinguishable from airport_lookup, which is described as an exact code/name lookup with no distance.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly defines the preconditions ('Provide latitude and longitude'), the exclusions ('does NOT geocode place names and does NOT compute routes — pass coordinates you already hold'), and names the correct sibling for the alternative task ('airport_lookup (exact code or name lookup, no distance)'). Nothing about when to choose this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pallet_fitting_calculatorPallet Fitting CalculatorARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| box_width_cm | Yes | Box width in cm | |
| box_height_cm | Yes | Box height in cm | |
| box_length_cm | Yes | Box length in cm | |
| box_weight_kg | No | Box weight in kg | |
| allow_rotation | No | Allow 90-degree rotation (default: true) | |
| max_payload_kg | No | Max pallet payload in kg | |
| pallet_width_cm | Yes | Pallet width in cm | |
| pallet_length_cm | Yes | Pallet length in cm | |
| pallet_max_height_cm | Yes | Max stack height in cm | |
| pallet_deck_height_cm | No | Pallet deck height (default: 15cm) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behaviour, so the bar is lower, yet the description still adds real substance: deterministic aligned-row packing with no interlocked or mixed-orientation modelling, how weight_limited caps at whole layers, the 15cm deck default, error behaviour on non-positive dimensions, and rate-limit errors carrying reset_at. This is well beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The 'What it does / Behavior / Returns / Limitations / Related' structure is front-loaded and scannable, but the Returns block re-lists a dozen field names even though an output schema exists, which is largely redundant. The camelCase-versus-snake_case note does earn its place, but the paragraph around it is dense and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a ten-parameter geometric calculator with a rich output schema, the definition covers the packing model, defaults, failure and rate-limit behaviour, utilisation definitions that could otherwise be misread (footprint vs envelope), and sibling routing. Nothing an agent needs to invoke it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: allow_rotation is described behaviourally ('trying 90-degree rotation when allowed'), pallet_deck_height_cm's default is restated with its effect on usable height, and invalid dimensions are said to error naming the offending parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Calculate how many identical boxes fit on a pallet', then enumerates the outputs (boxes per layer, layer count, totals, utilisation, weight capping). The 'Related' line names ldm_calculator, vehicle_lookup and container_lookup with their distinct roles, so an agent can separate this from neighbouring calculators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The Related section gives clear routing context by stating what each sibling does (pallets into trailer length, pallet capacity per vehicle, pallets into containers) and the Limitations section sets expectations about when results are only theoretical. It stops short of explicit when-not-to-use guidance against every alternative, such as cbm_calculator or chargeable_weight_calculator, which are near neighbours not addressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_referenceResolve Freight ReferenceARead-onlyIdempotentInspect
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, 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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | One freight identifier — e.g. "176", "UN1845", "NLRTM", "FOB", "LHR", "22G1", "MSKU1100810", "090111", "AKE12345AB", "D/E" — or an fu: identifier from any answer's fu_id / fu_version_id (e.g. "fu:adr:un:1203:II:F1@2025"), which resolves to exactly its one record or to none. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds substantial behavior beyond them: deterministic normalization rules, full-grammar matching, the ranking order (record-hit > verification status > dataset prior > stable tiebreak), the fact that zero candidates is a valid result rather than an error, that a failed container check digit returns valid:false instead of dropping the candidate, and that rate-limit errors carry reset_at. This is exactly the extra context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well front-loaded — purpose, parameter, behavior, returns, limitations, related — and nearly every sentence carries information an agent needs. It is still dense and long for a one-parameter tool, with heavy parenthetical enumerations of ADR Table A subcodes and grammars that could be compressed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description still summarizes the response envelope (query, normalized, count, candidates[] with entity_type, rank_basis, canonical_url, api_url, citation) so the agent knows what it is getting. Combined with explicit limitations (no SCAC/BIC, match does not assert shipment existence) and the fu: identifier note, nothing needed to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 real meaning: it clarifies the single-token 32-character shape for ordinary identifiers versus the up-to-200-character fu: form, and explains that an fu: identifier resolves to exactly one record or none. That goes beyond the schema's example list, though it does not enumerate every grammar's input format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — 'Resolve an arbitrary freight identifier' — and immediately frames the exact contract: 'one opaque string in, typed and cited candidates out.' It distinguishes itself from the sibling lookup tools by positioning itself as the disambiguation entry point that feeds adr_lookup, airline_lookup, airport_lookup, and the rest.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use condition: 'Use when you hold one identifier-ish token ... and do not know what kind of identifier it is,' with concrete examples. It also states when-not-to-use ('v1 is SINGLE-TOKEN resolution, not free-text extraction — pass one identifier, not a manifest line') and names the downstream tools it resolves into.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
shipment_summaryShipment SummaryARead-onlyIdempotentInspect
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).
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: 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.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Transport mode. Required unless the consignment object is sent. | |
| as_of | No | YYYY-MM-DD the answer is for (default today, UTC); picks the ADR edition when edition is omitted, and is echoed in the answer and its check receipt. | |
| items | No | Array of shipment items with dimensions, weight, and optional HS/UN codes. Required unless the consignment object is sent. | |
| origin | No | Origin location — ISO country code and optional UN/LOCODE | |
| edition | No | ADR edition: "2025" or "2027". Wins over as_of. Omit it and as_of picks the edition by the legal timeline: before 2027-01-01 ADR 2025; from 2027-01-01 ADR 2027 (ADR 2025 may still be applied until 2027-06-30 under 1.6.1.1 — edition "2025" answers on it until then); from 2027-07-01 ADR 2027 only. An ADR 2027 answer for a date before 2027-01-01 carries an EDITION_NOT_YET_APPLICABLE warning. | |
| incoterm | No | Incoterms 2020 three-letter code (e.g. 'DAP', 'EXW', 'FOB') | |
| consignment | No | Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg, un_mark}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs. | |
| destination | No | Destination location — ISO country code and optional UN/LOCODE | |
| freight_cost | No | Optional freight cost in GBP for duty calculation, 0 or more (default 0) | |
| insurance_cost | No | Optional insurance cost in GBP for duty calculation, 0 or more (default 0) |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond the readOnly/idempotent annotations, it discloses the delegation to ldm_calculator, adr_lookup and uk_duty_calculator, the 2.40 m loading-metre divisor and the 'no stackable flag means NOT stacked' convention, the smallest-fit vehicle/container selection logic and what utilisationBasis refers to. It also covers failure behavior: sections that cannot run degrade into warnings rather than failing, unknown field names are refused with an error listing accepted ones, and rate-limit errors carry reset_at.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is correctly front-loaded, but the body is a wall of multi-clause sentences with deeply nested parentheticals (the vehicle-fit sentence in particular) that take real effort to parse. Detail such as 'a 7.5t rigid holds 15 Euro pallets on the floor' and the duplicated adr_quantity explanation pull weight that the schema or a reference doc could carry.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter composite with nested objects, delegation to three engines, editable ADR editions and partial-failure semantics, nothing an agent needs to call it correctly is missing: units, per-item vs per-line scope, edition precedence, warning behavior, error shapes and limitations are all present. The Returns block is partly redundant against the output schema, but the camelCase 'legacy shape' note is a genuinely useful addition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description still earns above baseline by stressing the traps: weight and customs_value are PER ITEM while adr_quantity is the TOTAL for the line, and edition overrides as_of with origin/destination and incoterm refining only the duty leg. Some of this restates schema text near-verbatim, and the large nested consignment object is left entirely to its schema description, so it stops short of a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the specific outputs (CBM volume, gross and chargeable weight, road LDM with pallet spaces and vehicle suggestion, volumetric weight, revenue tonnes with container suggestion, dangerous-goods presence, UK duty) and the mode/items inputs that drive them. The Related section explicitly contrasts it with consignment_calculator and the single-purpose calculators, so an agent can place it among 25 siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear invocation context ('Provide mode ... and items[]', with units and per-item vs per-line distinctions) and explains in Related that the three engines are what it calls while cbm_calculator, chargeable_weight_calculator and ldm_calculator are single-purpose equivalents of its inline arithmetic. What it never states is an explicit routing rule such as 'use cbm_calculator alone when you only need volume' — the choice is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uk_duty_calculatorUK Duty & VAT CalculatorARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Batch: up to 10 lines, each { commodity_code, origin_country, customs_value, freight_cost?, insurance_cost?, incoterm? } — answered as results[] in input order, each as its own call (each line its own receipt). Send alone; the UK Trade Tariff is read live per line. | |
| incoterm | No | Incoterm basis | |
| freight_cost | No | Freight cost in GBP, 0 or more (default 0) | |
| customs_value | No | Customs value in GBP. Required unless lines[] is sent. | |
| commodity_code | No | UK tariff commodity code — a declarable 10 digits, spaces allowed (a 6- or 8-digit code is refused with the declarable codes beneath it) | |
| insurance_cost | No | Insurance cost in GBP, 0 or more (default 0) | |
| origin_country | No | ISO 2-letter country of origin (e.g. "CN", "US"). Required unless lines[] is sent. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: live per-request rate fetch, refusal behavior for short codes with declarable_codes returned, ISO-3166 validation of origin, unresolved origin-dependent measures surfacing in warnings, and rate limiting with reset_at. It also enumerates the returned monetary fields. Minor tension: live remote fetching sits awkwardly with openWorldHint=false, though that hint is usually read as 'no arbitrary external entities', so this is a nuance rather than a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose and inputs, then behavior, returns, limitations and related tools in a clean order. It is longer than needed, and one sentence is off-target for this tool: the FreightUtils v1 / camelCase envelope note references total_cbm, a shipping field this tool does not return.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite an output schema existing, the description summarizes the key result fields and the as_of timestamp, and covers refusals, rate limits, warnings, and the estimator caveat with a broker/HMRC check. The only gap is batching via lines[], which the schema documents at 100%.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns a 4 by explaining how customs_value, freight_cost and insurance_cost compose CIF and by stressing that origin_country must be an ISO-2 country. It omits the lines[] batch parameter entirely, which is the main alternate input mode, so the prose alone would leave an agent unaware of batching.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource: 'Estimate UK import duty and VAT for a commodity code using the LIVE GOV.UK Trade Tariff'. It also states the calculation basis (CIF = customs_value + freight + insurance) and names the sibling it does not replace (hs_code_lookup), so an agent can distinguish it from lookup/conversion siblings without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the minimum inputs (commodity_code, origin_country, customs_value), which fields are optional refinements, and routes the agent to hs_code_lookup 'find the 6-digit code first' and incoterms_lookup. It also states a hard exclusion (6- or 8-digit codes are refused, never zero-padded) and closes with what it is not (an estimate, not a customs ruling).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
uld_lookupAir Cargo ULD LookupARead-onlyIdempotentInspect
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).
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.
| Name | Required | Description | Default |
|---|---|---|---|
| deck | No | Filter by deck position | |
| full | No | Lists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record. | |
| type | No | ULD code (e.g., "AKE", "PMC") or slug (e.g., "ake-ld3"). Omit to list all. | |
| limit | No | Lists only: rows per page (default: every row for summaries; 5 with full: true). | |
| offset | No | Lists only: rows to skip (default 0). The response gives total and next_offset. | |
| category | No | Filter by ULD category |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only and idempotent, but the description adds a lot beyond them: unknown-type errors return the closest codes, list responses carry total/truncated/next_offset/detail_hint, full:true pages five at a time, and rate-limit errors carry reset_at. It also discloses the response envelope, the PROVENANCE_PENDING advisory on every response, and the practical trap that pallet records have no internal dimensions and must use max_build_up_height_cm rather than a dimension product.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and sectioned (Behavior, Returns, Limitations, Related, Identifiers), which helps, but the Limitations block runs on for many sentences about second-agent coverage, withdrawal of stamps, publisher-level corroboration and the PGA weight band. It even instructs the reader to 'read the envelope's provenance_status rather than this sentence', a self-admission that this prose does not earn its place in a tool definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and annotations cover the safety profile, so the description needn't explain return shapes — yet it still supplies error behavior, pagination, rate limiting and the snake_case vs camelCase field-naming difference between the package and hosted endpoint. Nothing an agent needs in order to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all six parameters are already documented in the schema, which sets the baseline at 3. The description does add real meaning the schema lacks — the type field also accepts a record name and performs a "LD3" → AKE resolution, and it clarifies how offset/limit interact with full:true paging. That is genuine supplementation, but it is spread thin across a long text rather than concentrated on the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a concrete verb+resource: "Look up air-cargo ULD (Unit Load Device) specifications — 16 types..." and names the three families (lower-deck containers, main-deck pallets, temperature-controlled units). The field inventory (dimensions, tare/max gross, volume, deck, aircraft) makes the output scope unambiguous, and the closing 'Related' line distinguishes it from container_lookup, chargeable_weight_calculator and airline_lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit invocation guidance: type accepts an IATA code, slug, or the record's own name ("LD3" → AKE), omit it to list all 16, and category/deck filter the list. It routes the agent to three siblings with one-phrase differentiators. It stops short of stating when NOT to use it (e.g. when the agent actually wants chargeable weight or a sea container), so it is strong but not a full when/when-not matrix.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unit_converterUnit ConverterARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target unit — any source unit, plus the freight targets chargeable_kg and freight_tonnes (only valid from cbm) | |
| from | Yes | Source 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) | |
| value | Yes | Value to convert |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered; the description still adds real value by promising deterministic exact legal factors, describing refusal behavior with accepted units listed by category, and disclosing that rate-limit errors carry reset_at. The response-envelope sentence duplicates what the output schema likely already exposes, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the Behavior/Returns/Related blocks make it scannable; nearly every sentence carries operational information. The listing of the returned envelope fields (confidence, _source, citation) is the one segment that spends words on something an output schema already conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a three-parameter converter with an output schema, annotation coverage, and two enum-constrained fields, the description covers everything an agent needs: legal factors, dimension restrictions, error and refusal semantics, and sibling routing. Nothing material is left for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enums are self-documenting, so the schema carries the baseline. The description still adds meaning the schema cannot: the IATA 6,000 divisor formula for chargeable_kg, the 1 CBM = 1 freight tonne W/M rule, the short/long/metric ton distinctions, and the source restriction on the two freight targets.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ("Convert freight and logistics units") and enumerates the exact unit families and members it supports. The closing "Related:" line names cbm_calculator and chargeable_weight_calculator, so an agent can separate this general converter from the specialized calculators without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the preconditions explicitly: chargeable_kg and freight_tonnes are valid only FROM cbm, and cross-dimension conversions are refused. It also routes the agent to the right alternative in the two cases where a sibling is better — dimensions-to-volume via cbm_calculator, and proper air billing weight with pieces/custom divisor via chargeable_weight_calculator.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unlocode_lookupUN/LOCODE LookupARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | Exact UN/LOCODE lookup (e.g. "GBLHR", "GB LHR", "NLRTM") | |
| codes | No | Batch: up to 50 UN/LOCODEs, answered as results[] in input order, each with its own status. Send alone. | |
| limit | No | Max results (default 20) | |
| query | No | Search by name or code (e.g. "Rotterdam", "GBLHR", "LHR") | |
| country | No | ISO 2-letter country code filter (e.g. "GB", "NL") | |
| function_type | No | Filter by location function |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive and closed-world, so the bar is lower; the description still adds real behavior: exact hits are provenance-based, fuzzy hits expose match quality via confidence, unknown codes produce a not-found error, and rate-limit errors carry reset_at. It does not say what a partial fuzzy match does with limit truncation, but the disclosure is well 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and identifier format, then access pattern, behavior, returns, limitations and related tools in labeled form — easy to scan. It is on the long side and the Identifiers paragraph about fu_id/fu_version_id only marginally earns its space given resolve_reference exists as a sibling.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter lookup with an output schema, the description covers everything an agent needs: input modes, code syntax, error and rate-limit behavior, return envelope shape, data-source authority, and a caveat about operational status from an administrative list. Nothing material about invocation or interpretation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already carries examples and constraints for code, query, country, limit and function_type, so the baseline of 3 applies. The description adds some meaning by explaining the 2-letter country + 3-character location structure of a code and that "GB LHR" resolves to GBLHR, but it leaves `codes` (batch, up to 50, answered in input order) entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Search 116,086 UN/LOCODE transport locations worldwide") and enumerates the covered record types (ports, airports, rail/road terminals, ICDs, border crossings). The code-format explanation with worked examples (GBLHR, NLRTM) makes the resource unambiguous, and the Related section names the sibling tools it is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes the two access modes — "Provide code for an exact record, or query (name search, min 2 chars) optionally narrowed by country and function_type" — and names alternatives with their distinguishing conditions (airport_lookup for ICAO codes, nearest_airport for coordinate search). Only the batch `codes` path is left to the schema, which documents it fully.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validateFreight Identifier ValidatorARead-onlyIdempotentInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Arbitrary string to scan for container / AWB / IMO identifiers (parse mode). Provide this OR value+type. | |
| type | No | Identifier type for value: container = ISO 6346, awb = IATA Air Waybill, imo = IMO ship number; or "consignment" with the consignment argument. | |
| value | No | A single identifier to validate (typed mode). Requires type. | |
| consignment | No | With type "consignment": the consignment object to validate (https://www.freightutils.com/schema/consignment-object.v1.json). The answer says whether it is valid and which checks it carries the inputs for. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so credit goes to the added behavior: deterministic arithmetic, per-identifier report fields, empty found[] plus note when nothing matches, and rate-limit errors carrying reset_at. The airline-resolution rule (null plus airline_candidates[] rather than a guessed carrier) is unusually candid. Minor gap: it never mentions the consignment mode's behavior that the schema exposes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and mode selection, then clearly labeled Behavior / Returns / Limitations / Related sections, so the agent can skim to what it needs. The parenthetical detail on AWB-prefix ambiguity is slightly long, and the Returns paragraph largely restates what the output schema already carries.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with a nested object and an output schema, the description covers modes, return shape, error behavior, and scope limits. The only omission is the consignment mode, which the schema itself fully documents, so an agent can still call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 genuine semantics beyond the schema: the mutually exclusive text vs value+type modes and what each one scans. It stops short of documenting the 'consignment' type, which appears in the enum and as a nested object parameter but is absent from the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb (validate/parse) and resource (freight identifiers) and pins each one to its standard: ISO 6346, IATA modulus-7, IMO. It then splits the tool into its two operating modes, so an agent can tell exactly what this does and how it differs from container_lookup or airline_lookup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states the two call shapes (text=<arbitrary string> for finding everything in a blob vs value + type for a single identifier) and gives a concrete use case ('a booking-email line'). The Limitations section adds the when-not-to-use case: valid check digit is not a registry or tracking lookup, and the Related line routes the agent to the correct siblings for container specs and airline data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vehicle_lookupVehicle LookupARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Lists only: true returns full records (provenance, sources, rationale) instead of summary rows. A single-record call always returns the full record. | |
| slug | No | Vehicle slug (e.g., "standard-curtainsider"). Omit to list all. | |
| limit | No | Lists only: rows per page (default: every row for summaries; 5 with full: true). | |
| offset | No | Lists only: rows to skip (default 0). The response gives total and next_offset. | |
| region | No | Filter by region | |
| category | No | Filter by category |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| _meta | No | |
| as_of | No | |
| result | Yes | |
| status | No | |
| _source | Yes | |
| edition | No | |
| citation | Yes | |
| validity | No | |
| warnings | No | |
| confidence | Yes | |
| missing_inputs | No | |
| blocking_errors | No | |
| envelope_version | Yes | |
| normalized_input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, but the description adds substantially more: unknown slugs error with the valid list and closest matches, list responses return summary rows with total/truncated/next_offset/detail_hint, full:true pages five records at a time, and rate-limit errors carry reset_at. It also discloses provenance pending verification and the camelCase vs snake_case difference between the local package and the hosted endpoint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded and the labeled sections (Behavior, Returns, Limitations, Related, Identifiers) make it scannable. It is dense but slightly overlong, with the slug example and the full/limit/offset paging rules restated from the schema, adding redundancy on a six-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only lookup with a full output schema, the description covers everything an agent needs: record shape, list vs. single behavior, pagination, error and rate-limit semantics, provenance caveats, and the response envelope. Nothing material is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 prose adds real meaning beyond it: the slug example and the omit-to-list behavior, the interaction between full:true and the five-per-page default, and how offset/limit pair with next_offset. Some of this repeats the schema descriptions rather than extending them, which keeps it out of the top band.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource (road-freight vehicle and trailer specifications) and enumerates the 17 covered types with concrete detail, so an agent can tell it apart from container_lookup or airline_lookup immediately. It also flags the key scoping axis (slug for one record, omit to list all).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says how to fetch a single record vs. the full list and how category/region narrow the list, and it names three related tools for adjacent jobs (ldm_calculator, pallet_fitting_calculator, consignment_calculator). However, the related tools are listed without an explicit "use X instead when Y" routing statement, so the agent must infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
26 tool updates
- Changed
adr_consignment_check1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
adr_exemption_calculator1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
adr_lookup1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
adr_lq_eq_check1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
airline_lookup1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
airport_lookup1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
cbm_calculator1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
chargeable_weight_calculator1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
consignment_calculator1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
container_lookup1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
emissions_calculator1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
get_subscribe_link1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
hs_code_lookup1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
ics2_check1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
incoterms_lookup1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
ldm_calculator1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
nearest_airport1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
pallet_fitting_calculator1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
resolve_reference1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
shipment_summary1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
uk_duty_calculator1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
uld_lookup1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
unit_converter1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
unlocode_lookup1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
validate1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
- Changed
vehicle_lookup1 field changed- added
Output schema / properties / _meta / properties / upstreamAdded value: +{ + "additionalProperties": {}, + "properties": { + "datasets": { + "additionalProperties": { + "additionalProperties": {}, + "properties": { + "kind": { + "anyOf": [ + { + "enum": [ + "watched", + "checksum-only", + "manual" + ], + "type": "string" + }, + { + "type": "null" + } + ] + }, + "last_success": { + "type": [ + "string", + "null" + ] + }, + "reason": { + "type": "string" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "window_days": { + "type": [ + "number", + "null" + ] + } + }, + "required": [ + "state", + "kind", + "last_success", + "window_days", + "stale" + ], + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "stale": { + "type": "boolean" + }, + "state": { + "enum": [ + "in_step", + "changed_upstream", + "schema_drift", + "unreachable", + "window_missed", + "unknown" + ], + "type": "string" + }, + "state_read_at": { + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "state", + "stale", + "state_read_at", + "datasets" + ], + "type": "object" +}
26 tool updates
- Changed
adr_consignment_check1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
adr_exemption_calculator1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
adr_lookup1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
adr_lq_eq_check1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
airline_lookup1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
airport_lookup1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
cbm_calculator1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
chargeable_weight_calculator1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
consignment_calculator1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
container_lookup1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
emissions_calculator1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
get_subscribe_link1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
hs_code_lookup1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
ics2_check1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
incoterms_lookup1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
ldm_calculator1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
nearest_airport1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
pallet_fitting_calculator1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
resolve_reference3 fields changed- changed
Input schema / properties / q / descriptionPrevious value: -"One freight identifier — e.g. \"176\", \"UN1845\", \"NLRTM\", \"FOB\", \"LHR\", \"22G1\", \"MSKU1100810\", \"090111\", \"AKE12345AB\", \"D/E\"."New value: +"One freight identifier — e.g. \"176\", \"UN1845\", \"NLRTM\", \"FOB\", \"LHR\", \"22G1\", \"MSKU1100810\", \"090111\", \"AKE12345AB\", \"D/E\" — or an fu: identifier from any answer's fu_id / fu_version_id (e.g. \"fu:adr:un:1203:II:F1@2025\"), which resolves to exactly its one record or to none." - changed
Input schema / properties / q / maxLengthPrevious value: -32New value: +200 - added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
shipment_summary1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
uk_duty_calculator1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
uld_lookup1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
unit_converter1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
unlocode_lookup1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
validate1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
- Changed
vehicle_lookup1 field changed- added
Output schema / properties / _meta / properties / idsAdded value: +{ + "additionalProperties": false, + "properties": { + "pattern": { + "type": "string" + }, + "scheme": { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + } + }, + "required": [ + "scheme", + "pattern" + ], + "type": "object" +}
4 tool updates
- Changed
adr_consignment_check1 field changed- added
Input schema / properties / lines / items / properties / packages / properties / un_markAdded value: +{ + "maxLength": 80, + "minLength": 1, + "type": "string" +}
- Changed
adr_exemption_calculator2 fields changed- changed
Input schema / properties / consignment / descriptionPrevious value: -"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."New value: +"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg, un_mark}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs." - added
Input schema / properties / consignment / properties / lines / items / properties / packages / properties / un_markAdded value: +{ + "maxLength": 80, + "minLength": 1, + "type": "string" +}
- Changed
consignment_calculator2 fields changed- changed
Input schema / properties / consignment / descriptionPrevious value: -"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."New value: +"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg, un_mark}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs." - added
Input schema / properties / consignment / properties / lines / items / properties / packages / properties / un_markAdded value: +{ + "maxLength": 80, + "minLength": 1, + "type": "string" +}
- Changed
shipment_summary2 fields changed- changed
Input schema / properties / consignment / descriptionPrevious value: -"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."New value: +"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg, un_mark}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs." - added
Input schema / properties / consignment / properties / lines / items / properties / packages / properties / un_markAdded value: +{ + "maxLength": 80, + "minLength": 1, + "type": "string" +}
4 tool updates
- Changed
adr_consignment_check7 fields changed- added
Input schema / properties / crewAdded value: +{ + "additionalProperties": false, + "description": "The vehicle crew, for the driver-training and document checks (ADR 8.2, 8.1.2). Facts only — no name.", + "properties": { + "adr_training_certificate": { + "type": "boolean" + }, + "awareness_training_1_3": { + "type": "boolean" + }, + "photo_identification": { + "type": "boolean" + }, + "specialisations": { + "items": { + "enum": [ + "class_1", + "class_7", + "tanks" + ], + "type": "string" + }, + "maxItems": 3, + "type": "array" + } + }, + "type": "object" +} - changed
Input schema / properties / vehicle / descriptionPrevious value: -"Only foodstuffs_carried is read (mixed loading, 7.5.4)."New value: +"Read: max_mass_t (8.1.4.1, 3.4.13), foodstuffs_carried (7.5.4) and the vehicle-side inputs (5.3, 8.1)." - added
Input schema / properties / vehicle / properties / equipment_8_1_5Added value: +{ + "items": { + "enum": [ + "wheel_chock", + "warning_signs", + "eye_rinsing_liquid", + "warning_vest", + "portable_lighting", + "protective_gloves", + "eye_protection", + "emergency_escape_mask", + "shovel", + "drain_seal", + "collecting_container" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array" +} - added
Input schema / properties / vehicle / properties / fire_extinguishers_kgAdded value: +{ + "items": { + "exclusiveMinimum": 0, + "maximum": 100, + "type": "number" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / vehicle / properties / instructions_in_writingAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / vehicle / properties / orange_plates_displayedAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / vehicle / properties / placards_displayedAdded value: +{ + "type": "boolean" +}
- Changed
adr_exemption_calculator7 fields changed- changed
Input schema / properties / consignment / descriptionPrevious value: -"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."New value: +"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs." - added
Input schema / properties / consignment / properties / crewAdded value: +{ + "additionalProperties": false, + "properties": { + "adr_training_certificate": { + "type": "boolean" + }, + "awareness_training_1_3": { + "type": "boolean" + }, + "photo_identification": { + "type": "boolean" + }, + "specialisations": { + "items": { + "enum": [ + "class_1", + "class_7", + "tanks" + ], + "type": "string" + }, + "maxItems": 3, + "type": "array" + } + }, + "type": "object" +} - added
Input schema / properties / consignment / properties / vehicle / properties / equipment_8_1_5Added value: +{ + "items": { + "enum": [ + "wheel_chock", + "warning_signs", + "eye_rinsing_liquid", + "warning_vest", + "portable_lighting", + "protective_gloves", + "eye_protection", + "emergency_escape_mask", + "shovel", + "drain_seal", + "collecting_container" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array" +} - added
Input schema / properties / consignment / properties / vehicle / properties / fire_extinguishers_kgAdded value: +{ + "items": { + "exclusiveMinimum": 0, + "maximum": 100, + "type": "number" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / consignment / properties / vehicle / properties / instructions_in_writingAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / consignment / properties / vehicle / properties / orange_plates_displayedAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / consignment / properties / vehicle / properties / placards_displayedAdded value: +{ + "type": "boolean" +}
- Changed
consignment_calculator7 fields changed- changed
Input schema / properties / consignment / descriptionPrevious value: -"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."New value: +"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs." - added
Input schema / properties / consignment / properties / crewAdded value: +{ + "additionalProperties": false, + "properties": { + "adr_training_certificate": { + "type": "boolean" + }, + "awareness_training_1_3": { + "type": "boolean" + }, + "photo_identification": { + "type": "boolean" + }, + "specialisations": { + "items": { + "enum": [ + "class_1", + "class_7", + "tanks" + ], + "type": "string" + }, + "maxItems": 3, + "type": "array" + } + }, + "type": "object" +} - added
Input schema / properties / consignment / properties / vehicle / properties / equipment_8_1_5Added value: +{ + "items": { + "enum": [ + "wheel_chock", + "warning_signs", + "eye_rinsing_liquid", + "warning_vest", + "portable_lighting", + "protective_gloves", + "eye_protection", + "emergency_escape_mask", + "shovel", + "drain_seal", + "collecting_container" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array" +} - added
Input schema / properties / consignment / properties / vehicle / properties / fire_extinguishers_kgAdded value: +{ + "items": { + "exclusiveMinimum": 0, + "maximum": 100, + "type": "number" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / consignment / properties / vehicle / properties / instructions_in_writingAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / consignment / properties / vehicle / properties / orange_plates_displayedAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / consignment / properties / vehicle / properties / placards_displayedAdded value: +{ + "type": "boolean" +}
- Changed
shipment_summary7 fields changed- changed
Input schema / properties / consignment / descriptionPrevious value: -"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."New value: +"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, crew, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs." - added
Input schema / properties / consignment / properties / crewAdded value: +{ + "additionalProperties": false, + "properties": { + "adr_training_certificate": { + "type": "boolean" + }, + "awareness_training_1_3": { + "type": "boolean" + }, + "photo_identification": { + "type": "boolean" + }, + "specialisations": { + "items": { + "enum": [ + "class_1", + "class_7", + "tanks" + ], + "type": "string" + }, + "maxItems": 3, + "type": "array" + } + }, + "type": "object" +} - added
Input schema / properties / consignment / properties / vehicle / properties / equipment_8_1_5Added value: +{ + "items": { + "enum": [ + "wheel_chock", + "warning_signs", + "eye_rinsing_liquid", + "warning_vest", + "portable_lighting", + "protective_gloves", + "eye_protection", + "emergency_escape_mask", + "shovel", + "drain_seal", + "collecting_container" + ], + "type": "string" + }, + "maxItems": 11, + "type": "array" +} - added
Input schema / properties / consignment / properties / vehicle / properties / fire_extinguishers_kgAdded value: +{ + "items": { + "exclusiveMinimum": 0, + "maximum": 100, + "type": "number" + }, + "maxItems": 20, + "type": "array" +} - added
Input schema / properties / consignment / properties / vehicle / properties / instructions_in_writingAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / consignment / properties / vehicle / properties / orange_plates_displayedAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / consignment / properties / vehicle / properties / placards_displayedAdded value: +{ + "type": "boolean" +}
4 tool updates
- Changed
adr_consignment_check2 fields changed- changed
Input schema / properties / vehicle / descriptionPrevious value: -"Not read in version 2a."New value: +"Only foodstuffs_carried is read (mixed loading, 7.5.4)." - added
Input schema / properties / vehicle / properties / foodstuffs_carriedAdded value: +{ + "type": "boolean" +}
- Changed
adr_exemption_calculator1 field changed- added
Input schema / properties / consignment / properties / vehicle / properties / foodstuffs_carriedAdded value: +{ + "type": "boolean" +}
- Changed
consignment_calculator1 field changed- added
Input schema / properties / consignment / properties / vehicle / properties / foodstuffs_carriedAdded value: +{ + "type": "boolean" +}
- Changed
shipment_summary1 field changed- added
Input schema / properties / consignment / properties / vehicle / properties / foodstuffs_carriedAdded value: +{ + "type": "boolean" +}
4 tool updates
- Added
adr_consignment_check - Changed
adr_exemption_calculator6 fields changed- changed
Input schema / properties / consignment / descriptionPrevious value: -"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."New value: +"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs." - added
Input schema / properties / consignment / properties / lines / items / properties / icao_limited_quantityAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / consignment / properties / lines / items / properties / inner_packagingAdded value: +{ + "additionalProperties": false, + "properties": { + "per_outer": { + "maximum": 100000, + "minimum": 1, + "type": "integer" + }, + "quantity": { + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "regime": { + "enum": [ + "lq", + "eq" + ], + "type": "string" + }, + "unit": { + "enum": [ + "ml", + "L", + "g", + "kg" + ], + "type": "string" + } + }, + "required": [ + "quantity", + "unit" + ], + "type": "object" +} - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / value / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / value / minimumAdded value: +0 - changed
Input schema / properties / consignment / properties / lines / items / properties / un_number / patternPrevious value: -"^(?:UN\\s?)?\\d{4}$"New value: +"^(?:(?:UN\\s?)?\\d{4}|ID\\s?\\d{4})$"
- Changed
consignment_calculator6 fields changed- changed
Input schema / properties / consignment / descriptionPrevious value: -"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."New value: +"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs." - added
Input schema / properties / consignment / properties / lines / items / properties / icao_limited_quantityAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / consignment / properties / lines / items / properties / inner_packagingAdded value: +{ + "additionalProperties": false, + "properties": { + "per_outer": { + "maximum": 100000, + "minimum": 1, + "type": "integer" + }, + "quantity": { + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "regime": { + "enum": [ + "lq", + "eq" + ], + "type": "string" + }, + "unit": { + "enum": [ + "ml", + "L", + "g", + "kg" + ], + "type": "string" + } + }, + "required": [ + "quantity", + "unit" + ], + "type": "object" +} - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / value / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / value / minimumAdded value: +0 - changed
Input schema / properties / consignment / properties / lines / items / properties / un_number / patternPrevious value: -"^(?:UN\\s?)?\\d{4}$"New value: +"^(?:(?:UN\\s?)?\\d{4}|ID\\s?\\d{4})$"
- Changed
shipment_summary6 fields changed- changed
Input schema / properties / consignment / descriptionPrevious value: -"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs."New value: +"Alternative to the other arguments: the consignment object (https://www.freightutils.com/schema/consignment-object.v1.json) — lines[] (description, un_number, packing_group, variant_index, quantity {value, unit, basis}, packages {count, type, gross_kg}, hs_code, value {amount, currency}, dims, stackable, icao_limited_quantity, inner_packaging), journey {origin, destination, date, tunnels_on_route, mode}, vehicle, options. Send it alone; an input the tool needs and the object lacks comes back in missing_inputs." - added
Input schema / properties / consignment / properties / lines / items / properties / icao_limited_quantityAdded value: +{ + "type": "boolean" +} - added
Input schema / properties / consignment / properties / lines / items / properties / inner_packagingAdded value: +{ + "additionalProperties": false, + "properties": { + "per_outer": { + "maximum": 100000, + "minimum": 1, + "type": "integer" + }, + "quantity": { + "exclusiveMinimum": 0, + "maximum": 1000000, + "type": "number" + }, + "regime": { + "enum": [ + "lq", + "eq" + ], + "type": "string" + }, + "unit": { + "enum": [ + "ml", + "L", + "g", + "kg" + ], + "type": "string" + } + }, + "required": [ + "quantity", + "unit" + ], + "type": "object" +} - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / value / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / value / minimumAdded value: +0 - changed
Input schema / properties / consignment / properties / lines / items / properties / un_number / patternPrevious value: -"^(?:UN\\s?)?\\d{4}$"New value: +"^(?:(?:UN\\s?)?\\d{4}|ID\\s?\\d{4})$"
25 tool updates
- Changed
adr_exemption_calculator2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
adr_lookup2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
adr_lq_eq_check2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
airline_lookup2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
airport_lookup2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
cbm_calculator2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
chargeable_weight_calculator2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
consignment_calculator2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
container_lookup2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
emissions_calculator2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
get_subscribe_link2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
hs_code_lookup2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
ics2_check2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
incoterms_lookup2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
ldm_calculator2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
nearest_airport2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
pallet_fitting_calculator2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
resolve_reference2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
shipment_summary2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
uk_duty_calculator2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
uld_lookup2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
unit_converter2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
unlocode_lookup2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
validate2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
- Changed
vehicle_lookup2 fields changed- removed
Output schema / properties / _meta / properties / receipt / properties / reason / constRemoved value: -"key_required" - added
Output schema / properties / _meta / properties / receipt / properties / reason / enumAdded value: +[ + "key_required", + "quota" +]
1 tool update
- Changed
adr_exemption_calculator9 fields changed- changed
Input schema / properties / basis / descriptionPrevious 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. A 'gross' mass on an entry counted by mass is used only as an upper bound of the net mass: the load is answered exempt on it only when it clears even on the gross figure (figure_basis upper_bound_gross); otherwise, and always for an entry counted in litres, no points — send the net quantity." - added
Input schema / properties / icao_limited_quantityAdded value: +{ + "description": "OPTIONAL, only with an ID-prefixed un_number (e.g. ID8000): true states that the packages are limited quantities conforming to the ICAO Technical Instructions (the 3.4.8 mark, or 3.4.10). Only then is the line counted out of 1.1.3.6; without it the ID line is BLOCKED and the load has no verdict unless the other lines settle it.", + "type": "boolean" +} - changed
Input schema / properties / items / descriptionPrevious value: -"Items for a mixed load. With items[], the single-substance fields (un_number, quantity, packing_group, variant_index, unit, basis) are refused beside it (INVALID_INPUT) — each goes on its item."New value: +"Items for a mixed load. An item quantity may be 0: the goods are not carried, the line is left out of the load and named in a warning (a load of nothing but zeros is refused). With items[], the single-substance fields (un_number, quantity, packing_group, variant_index, unit, basis) are refused beside it (INVALID_INPUT) — each goes on its item." - changed
Input schema / properties / items / items / properties / basis / descriptionPrevious value: -"OPTIONAL. As the top-level basis: 'gross' returns no points — send the net quantity."New value: +"OPTIONAL. As the top-level basis: a 'gross' mass is used only as an upper bound on an entry counted by mass, and only when the load clears on it." - added
Input schema / properties / items / items / properties / icao_limited_quantityAdded value: +{ + "description": "OPTIONAL, ID-prefixed lines only: as the top-level icao_limited_quantity.", + "type": "boolean" +} - removed
Input schema / properties / items / items / properties / quantity / exclusiveMinimumRemoved value: -0 - added
Input schema / properties / items / items / properties / quantity / minimumAdded value: +0 - changed
Input schema / properties / items / items / properties / un_number / descriptionPrevious value: -"As the top-level un_number (4 digits, or an ID-prefixed air-only number, routed AIR_ONLY_ID)."New value: +"As the top-level un_number (4 digits, or an ID-prefixed air-only number: AIR_ONLY_ID with icao_limited_quantity: true, else BLOCKED)." - changed
Input schema / properties / un_number / descriptionPrevious 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)."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: counted out of 1.1.3.6 (AIR_ONLY_ID) only with icao_limited_quantity: true — the ADR answer for limited-quantity packages to the ICAO Technical Instructions, 3.4.9 / 3.4.10 / 1.1.3.6.5; without it the line is BLOCKED and the load has no verdict unless the other lines settle it."
1 tool update
- Changed
nearest_airport1 field changed- added
Input schema / properties / include_allAdded value: +{ + "description": "Default false: only airports with scheduled airline service and an IATA code (no heliports). true: every airport type except closed fields.", + "type": "boolean" +}
25 tool updates
- Changed
adr_exemption_calculator1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
adr_lookup1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
adr_lq_eq_check1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
airline_lookup1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
airport_lookup1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
cbm_calculator1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
chargeable_weight_calculator1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
consignment_calculator1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
container_lookup1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
emissions_calculator1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
get_subscribe_link1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
hs_code_lookup1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
ics2_check1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
incoterms_lookup1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
ldm_calculator1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
nearest_airport1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
pallet_fitting_calculator1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
resolve_reference1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
shipment_summary1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
uk_duty_calculator1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
uld_lookup1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
unit_converter1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
unlocode_lookup1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
validate1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
- Changed
vehicle_lookup1 field changed- added
Output schema / properties / _meta / properties / receiptAdded value: +{ + "additionalProperties": {}, + "properties": { + "created_at": { + "type": "string" + }, + "dataset_version": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "engine_version": { + "type": "string" + }, + "inputs": {}, + "reason": { + "const": "key_required", + "type": "string" + }, + "receipt_hash": { + "type": "string" + }, + "result": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "schema_version": { + "type": "string" + }, + "stored": { + "const": false, + "type": "boolean" + }, + "tool": { + "type": "string" + } + }, + "required": [ + "stored", + "reason", + "schema_version", + "receipt_hash", + "created_at", + "tool", + "inputs", + "dataset_version", + "engine_version", + "result" + ], + "type": "object" +}
5 tool updates
- Changed
adr_exemption_calculator2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "description": "YYYY-MM-DD the answer is for (default today, UTC); picks the ADR edition when edition is omitted, and is echoed in the answer and its check receipt.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / editionAdded value: +{ + "description": "ADR edition: \"2025\" or \"2027\". Wins over as_of. Omit it and as_of picks the edition by the legal timeline: before 2027-01-01 ADR 2025; from 2027-01-01 ADR 2027 (ADR 2025 may still be applied until 2027-06-30 under 1.6.1.1 — edition \"2025\" answers on it until then); from 2027-07-01 ADR 2027 only. An ADR 2027 answer for a date before 2027-01-01 carries an EDITION_NOT_YET_APPLICABLE warning.", + "enum": [ + "2025", + "2027" + ], + "type": "string" +}
- Changed
adr_lookup2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "description": "YYYY-MM-DD the answer is for (default today, UTC); picks the ADR edition when edition is omitted, and is echoed in the answer and its check receipt.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / editionAdded value: +{ + "description": "ADR edition: \"2025\" or \"2027\". Wins over as_of. Omit it and as_of picks the edition by the legal timeline: before 2027-01-01 ADR 2025; from 2027-01-01 ADR 2027 (ADR 2025 may still be applied until 2027-06-30 under 1.6.1.1 — edition \"2025\" answers on it until then); from 2027-07-01 ADR 2027 only. An ADR 2027 answer for a date before 2027-01-01 carries an EDITION_NOT_YET_APPLICABLE warning.", + "enum": [ + "2025", + "2027" + ], + "type": "string" +}
- Changed
adr_lq_eq_check2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "description": "YYYY-MM-DD the answer is for (default today, UTC); picks the ADR edition when edition is omitted, and is echoed in the answer and its check receipt.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / editionAdded value: +{ + "description": "ADR edition: \"2025\" or \"2027\". Wins over as_of. Omit it and as_of picks the edition by the legal timeline: before 2027-01-01 ADR 2025; from 2027-01-01 ADR 2027 (ADR 2025 may still be applied until 2027-06-30 under 1.6.1.1 — edition \"2025\" answers on it until then); from 2027-07-01 ADR 2027 only. An ADR 2027 answer for a date before 2027-01-01 carries an EDITION_NOT_YET_APPLICABLE warning.", + "enum": [ + "2025", + "2027" + ], + "type": "string" +}
- Changed
consignment_calculator2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "description": "YYYY-MM-DD the answer is for (default today, UTC); picks the ADR edition when edition is omitted, and is echoed in the answer and its check receipt.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / editionAdded value: +{ + "description": "ADR edition: \"2025\" or \"2027\". Wins over as_of. Omit it and as_of picks the edition by the legal timeline: before 2027-01-01 ADR 2025; from 2027-01-01 ADR 2027 (ADR 2025 may still be applied until 2027-06-30 under 1.6.1.1 — edition \"2025\" answers on it until then); from 2027-07-01 ADR 2027 only. An ADR 2027 answer for a date before 2027-01-01 carries an EDITION_NOT_YET_APPLICABLE warning.", + "enum": [ + "2025", + "2027" + ], + "type": "string" +}
- Changed
shipment_summary2 fields changed- added
Input schema / properties / as_ofAdded value: +{ + "description": "YYYY-MM-DD the answer is for (default today, UTC); picks the ADR edition when edition is omitted, and is echoed in the answer and its check receipt.", + "pattern": "^\\d{4}-\\d{2}-\\d{2}$", + "type": "string" +} - added
Input schema / properties / editionAdded value: +{ + "description": "ADR edition: \"2025\" or \"2027\". Wins over as_of. Omit it and as_of picks the edition by the legal timeline: before 2027-01-01 ADR 2025; from 2027-01-01 ADR 2027 (ADR 2025 may still be applied until 2027-06-30 under 1.6.1.1 — edition \"2025\" answers on it until then); from 2027-07-01 ADR 2027 only. An ADR 2027 answer for a date before 2027-01-01 carries an EDITION_NOT_YET_APPLICABLE warning.", + "enum": [ + "2025", + "2027" + ], + "type": "string" +}
1 tool update
- Changed
adr_lookup1 field changed- changed
Input schema / properties / include_codes / descriptionPrevious value: -"include_codes: \"none\" | \"compact\" | \"full\" — resolved_codes on each row: one entry per code in Table A columns (5)–(20) with its meaning in FreightUtils' own words (summary, section, verification_status, url; \"full\" adds title, meaning, parameters, applies_to, references). Default \"compact\" for a un_number lookup, \"none\" for search, hazard_class and un_numbers batches."New value: +"include_codes: \"none\" | \"compact\" | \"full\" — resolved_codes beside results[]: one entry per distinct code in Table A columns (5)–(20) across the answer, with its meaning in FreightUtils' own words (code, family, columns, rows = the results[] indexes that carry it, summary, section, verification_status; \"full\" adds url, title, meaning, parameters, applies_to, references; a code's page is https://www.freightutils.com/adr/codes/{family}/{code}). Default \"compact\" for a un_number lookup, \"none\" for search, hazard_class and un_numbers batches."
25 tool updates
- Changed
adr_exemption_calculator1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
adr_lookup1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
adr_lq_eq_check1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
airline_lookup1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
airport_lookup1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
cbm_calculator1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
chargeable_weight_calculator1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
consignment_calculator1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
container_lookup1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
emissions_calculator1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
get_subscribe_link1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
hs_code_lookup1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
ics2_check1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
incoterms_lookup1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
ldm_calculator1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
nearest_airport1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
pallet_fitting_calculator1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
resolve_reference1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
shipment_summary1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
uk_duty_calculator1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
uld_lookup1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
unit_converter1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
unlocode_lookup1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
validate1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
- Changed
vehicle_lookup1 field changed- added
Output schema / properties / _meta / properties / edition_basisAdded value: +{ + "type": "string" +}
1 tool update
- Changed
adr_lookup3 fields changed- added
Input schema / properties / include_codesAdded value: +{ + "description": "include_codes: \"none\" | \"compact\" | \"full\" — resolved_codes on each row: one entry per code in Table A columns (5)–(20) with its meaning in FreightUtils' own words (summary, section, verification_status, url; \"full\" adds title, meaning, parameters, applies_to, references). Default \"compact\" for a un_number lookup, \"none\" for search, hazard_class and un_numbers batches.", + "enum": [ + "none", + "compact", + "full" + ], + "type": "string" +} - added
Input schema / properties / include_statementsAdded value: +{ + "description": "true adds statements[] to every row: short plain-word statements (tunnel, transport category, labels, packing, tanks, carriage) assembled from the code meanings and the 8.6.4 / 1.1.3.6.3 tables, each with its basis, codes and verification_status (the lowest of the codes it draws on). Default false.", + "type": "boolean" +} - changed
Input schema / properties / un_numbers / descriptionPrevious value: -"Batch: up to 50 UN numbers, answered in one call as results[] in input order, each as its own un_number lookup with its own status. Send alone."New value: +"Batch: up to 50 UN numbers, answered in one call as results[] in input order, each as its own un_number lookup with its own status. Send alone (include_codes may go beside it)."
3 tool updates
- Changed
adr_exemption_calculator45 fields changed- changed
Input schema / properties / basis / descriptionPrevious 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."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." - removed
Input schema / properties / consignment / properties / journey / properties / date / descriptionRemoved value: -"Date of carriage, YYYY-MM-DD." - removed
Input schema / properties / consignment / properties / journey / properties / destination / descriptionRemoved value: -"UN/LOCODE or ISO country code of the destination." - removed
Input schema / properties / consignment / properties / journey / properties / mode / descriptionRemoved value: -"road | air | sea | multimodal." - removed
Input schema / properties / consignment / properties / journey / properties / origin / descriptionRemoved value: -"UN/LOCODE or ISO country code of the origin." - removed
Input schema / properties / consignment / properties / journey / properties / tunnels_on_route / descriptionRemoved value: -"ADR tunnel categories on the route (A–E)." - removed
Input schema / properties / consignment / properties / lines / descriptionRemoved value: -"The lines of the load. Required." - removed
Input schema / properties / consignment / properties / lines / items / properties / description / descriptionRemoved value: -"What the line is, at most 200 characters." - removed
Input schema / properties / consignment / properties / lines / items / properties / dims / descriptionRemoved value: -"Dimensions of ONE package: { l, w, h, unit: mm | cm | m | in }." - removed
Input schema / properties / consignment / properties / lines / items / properties / hs_code / descriptionRemoved value: -"HS / tariff commodity code, 6–10 digits." - removed
Input schema / properties / consignment / properties / lines / items / properties / packages / descriptionRemoved value: -"The pieces: how many, of what type, and their total gross mass." - removed
Input schema / properties / consignment / properties / lines / items / properties / packages / properties / count / descriptionRemoved value: -"Number of identical packages (pieces) on the line." - removed
Input schema / properties / consignment / properties / lines / items / properties / packages / properties / gross_kg / descriptionRemoved value: -"Gross mass of ALL the line's packages together, in kg." - removed
Input schema / properties / consignment / properties / lines / items / properties / packages / properties / type / descriptionRemoved value: -"Package type, e.g. \"pallet\", \"drum\", \"carton\"." - removed
Input schema / properties / consignment / properties / lines / items / properties / packing_group / descriptionRemoved value: -"Packing group, to pin one ADR Table A row of a multi-row UN." - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / descriptionRemoved value: -"The dangerous-goods quantity (ADR 1.1.3.6.3), separate from the gross mass of the packages." - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / basis / descriptionRemoved value: -"\"net\" (the goods) or \"gross\" (with packaging). 1.1.3.6.3 counts net; a gross figure scores no points." - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / unit / descriptionRemoved value: -"\"L\" or \"kg\" — checked against the dimension ADR 1.1.3.6.3 counts for the row." - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / value / descriptionRemoved value: -"The dangerous-goods quantity for the whole line, all packages together." - removed
Input schema / properties / consignment / properties / lines / items / properties / stackable / descriptionRemoved value: -"Whether the packages may be stacked." - removed
Input schema / properties / consignment / properties / lines / items / properties / un_number / descriptionRemoved value: -"UN number of a dangerous-goods line." - removed
Input schema / properties / consignment / properties / lines / items / properties / value / descriptionRemoved value: -"Customs value of the whole line (all packages together)." - removed
Input schema / properties / consignment / properties / lines / items / properties / value / properties / amount / descriptionRemoved value: -"The amount, 0 or more." - removed
Input schema / properties / consignment / properties / lines / items / properties / value / properties / currency / descriptionRemoved value: -"ISO 4217 currency code, e.g. \"GBP\"." - removed
Input schema / properties / consignment / properties / lines / items / properties / variant_index / descriptionRemoved value: -"ADR Table A variant index (as adr_lookup returns it), to pin one row." - removed
Input schema / properties / consignment / properties / options / properties / air_volumetric_divisor / descriptionRemoved value: -"IATA volumetric divisor, cm³/kg (default 6000)." - removed
Input schema / properties / consignment / properties / options / properties / awb_number / descriptionRemoved value: -"IATA air waybill number (check digit validated, advisory)." - removed
Input schema / properties / consignment / properties / options / properties / container_number / descriptionRemoved value: -"ISO 6346 container number (check digit validated, advisory)." - removed
Input schema / properties / consignment / properties / options / properties / freight_cost / descriptionRemoved value: -"Freight cost for the customs value." - removed
Input schema / properties / consignment / properties / options / properties / freight_cost / properties / amount / descriptionRemoved value: -"The amount, 0 or more." - removed
Input schema / properties / consignment / properties / options / properties / freight_cost / properties / currency / descriptionRemoved value: -"ISO 4217 currency code, e.g. \"GBP\"." - removed
Input schema / properties / consignment / properties / options / properties / incoterm / descriptionRemoved value: -"Incoterms 2020 rule." - removed
Input schema / properties / consignment / properties / options / properties / insurance_cost / descriptionRemoved value: -"Insurance cost for the customs value." - removed
Input schema / properties / consignment / properties / options / properties / insurance_cost / properties / amount / descriptionRemoved value: -"The amount, 0 or more." - removed
Input schema / properties / consignment / properties / options / properties / insurance_cost / properties / currency / descriptionRemoved value: -"ISO 4217 currency code, e.g. \"GBP\"." - removed
Input schema / properties / consignment / properties / vehicle / properties / max_mass_t / descriptionRemoved value: -"Maximum permissible mass, tonnes." - removed
Input schema / properties / consignment / properties / vehicle / properties / type / descriptionRemoved value: -"Vehicle type, e.g. \"artic\", \"rigid 7.5 t\"." - changed
Input schema / properties / items / descriptionPrevious value: -"Array of items for mixed-load check"New value: +"Items for a mixed load. With items[], the single-substance fields (un_number, quantity, packing_group, variant_index, unit, basis) are refused beside it (INVALID_INPUT) — each goes on its item." - changed
Input schema / properties / items / items / properties / basis / descriptionPrevious 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. As the top-level basis: 'gross' returns no points — send the net quantity." - changed
Input schema / properties / items / items / properties / un_number / descriptionPrevious 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)"New value: +"As the top-level un_number (4 digits, or an ID-prefixed air-only number, routed AIR_ONLY_ID)." - changed
Input schema / properties / items / items / properties / unit / descriptionPrevious 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. As the top-level unit: checked against the dimension 1.1.3.6.3 counts for the row; a mismatch returns no points." - changed
Input schema / properties / packing_group / descriptionPrevious 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."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." - changed
Input schema / properties / un_number / descriptionPrevious 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."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)." - changed
Input schema / properties / unit / descriptionPrevious 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."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." - changed
Input schema / properties / variant_index / descriptionPrevious 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."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."
- Changed
consignment_calculator36 fields changed- removed
Input schema / properties / consignment / properties / journey / properties / date / descriptionRemoved value: -"Date of carriage, YYYY-MM-DD." - removed
Input schema / properties / consignment / properties / journey / properties / destination / descriptionRemoved value: -"UN/LOCODE or ISO country code of the destination." - removed
Input schema / properties / consignment / properties / journey / properties / mode / descriptionRemoved value: -"road | air | sea | multimodal." - removed
Input schema / properties / consignment / properties / journey / properties / origin / descriptionRemoved value: -"UN/LOCODE or ISO country code of the origin." - removed
Input schema / properties / consignment / properties / journey / properties / tunnels_on_route / descriptionRemoved value: -"ADR tunnel categories on the route (A–E)." - removed
Input schema / properties / consignment / properties / lines / descriptionRemoved value: -"The lines of the load. Required." - removed
Input schema / properties / consignment / properties / lines / items / properties / description / descriptionRemoved value: -"What the line is, at most 200 characters." - removed
Input schema / properties / consignment / properties / lines / items / properties / dims / descriptionRemoved value: -"Dimensions of ONE package: { l, w, h, unit: mm | cm | m | in }." - removed
Input schema / properties / consignment / properties / lines / items / properties / hs_code / descriptionRemoved value: -"HS / tariff commodity code, 6–10 digits." - removed
Input schema / properties / consignment / properties / lines / items / properties / packages / descriptionRemoved value: -"The pieces: how many, of what type, and their total gross mass." - removed
Input schema / properties / consignment / properties / lines / items / properties / packages / properties / count / descriptionRemoved value: -"Number of identical packages (pieces) on the line." - removed
Input schema / properties / consignment / properties / lines / items / properties / packages / properties / gross_kg / descriptionRemoved value: -"Gross mass of ALL the line's packages together, in kg." - removed
Input schema / properties / consignment / properties / lines / items / properties / packages / properties / type / descriptionRemoved value: -"Package type, e.g. \"pallet\", \"drum\", \"carton\"." - removed
Input schema / properties / consignment / properties / lines / items / properties / packing_group / descriptionRemoved value: -"Packing group, to pin one ADR Table A row of a multi-row UN." - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / descriptionRemoved value: -"The dangerous-goods quantity (ADR 1.1.3.6.3), separate from the gross mass of the packages." - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / basis / descriptionRemoved value: -"\"net\" (the goods) or \"gross\" (with packaging). 1.1.3.6.3 counts net; a gross figure scores no points." - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / unit / descriptionRemoved value: -"\"L\" or \"kg\" — checked against the dimension ADR 1.1.3.6.3 counts for the row." - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / value / descriptionRemoved value: -"The dangerous-goods quantity for the whole line, all packages together." - removed
Input schema / properties / consignment / properties / lines / items / properties / stackable / descriptionRemoved value: -"Whether the packages may be stacked." - removed
Input schema / properties / consignment / properties / lines / items / properties / un_number / descriptionRemoved value: -"UN number of a dangerous-goods line." - removed
Input schema / properties / consignment / properties / lines / items / properties / value / descriptionRemoved value: -"Customs value of the whole line (all packages together)." - removed
Input schema / properties / consignment / properties / lines / items / properties / value / properties / amount / descriptionRemoved value: -"The amount, 0 or more." - removed
Input schema / properties / consignment / properties / lines / items / properties / value / properties / currency / descriptionRemoved value: -"ISO 4217 currency code, e.g. \"GBP\"." - removed
Input schema / properties / consignment / properties / lines / items / properties / variant_index / descriptionRemoved value: -"ADR Table A variant index (as adr_lookup returns it), to pin one row." - removed
Input schema / properties / consignment / properties / options / properties / air_volumetric_divisor / descriptionRemoved value: -"IATA volumetric divisor, cm³/kg (default 6000)." - removed
Input schema / properties / consignment / properties / options / properties / awb_number / descriptionRemoved value: -"IATA air waybill number (check digit validated, advisory)." - removed
Input schema / properties / consignment / properties / options / properties / container_number / descriptionRemoved value: -"ISO 6346 container number (check digit validated, advisory)." - removed
Input schema / properties / consignment / properties / options / properties / freight_cost / descriptionRemoved value: -"Freight cost for the customs value." - removed
Input schema / properties / consignment / properties / options / properties / freight_cost / properties / amount / descriptionRemoved value: -"The amount, 0 or more." - removed
Input schema / properties / consignment / properties / options / properties / freight_cost / properties / currency / descriptionRemoved value: -"ISO 4217 currency code, e.g. \"GBP\"." - removed
Input schema / properties / consignment / properties / options / properties / incoterm / descriptionRemoved value: -"Incoterms 2020 rule." - removed
Input schema / properties / consignment / properties / options / properties / insurance_cost / descriptionRemoved value: -"Insurance cost for the customs value." - removed
Input schema / properties / consignment / properties / options / properties / insurance_cost / properties / amount / descriptionRemoved value: -"The amount, 0 or more." - removed
Input schema / properties / consignment / properties / options / properties / insurance_cost / properties / currency / descriptionRemoved value: -"ISO 4217 currency code, e.g. \"GBP\"." - removed
Input schema / properties / consignment / properties / vehicle / properties / max_mass_t / descriptionRemoved value: -"Maximum permissible mass, tonnes." - removed
Input schema / properties / consignment / properties / vehicle / properties / type / descriptionRemoved value: -"Vehicle type, e.g. \"artic\", \"rigid 7.5 t\"."
- Changed
shipment_summary36 fields changed- removed
Input schema / properties / consignment / properties / journey / properties / date / descriptionRemoved value: -"Date of carriage, YYYY-MM-DD." - removed
Input schema / properties / consignment / properties / journey / properties / destination / descriptionRemoved value: -"UN/LOCODE or ISO country code of the destination." - removed
Input schema / properties / consignment / properties / journey / properties / mode / descriptionRemoved value: -"road | air | sea | multimodal." - removed
Input schema / properties / consignment / properties / journey / properties / origin / descriptionRemoved value: -"UN/LOCODE or ISO country code of the origin." - removed
Input schema / properties / consignment / properties / journey / properties / tunnels_on_route / descriptionRemoved value: -"ADR tunnel categories on the route (A–E)." - removed
Input schema / properties / consignment / properties / lines / descriptionRemoved value: -"The lines of the load. Required." - removed
Input schema / properties / consignment / properties / lines / items / properties / description / descriptionRemoved value: -"What the line is, at most 200 characters." - removed
Input schema / properties / consignment / properties / lines / items / properties / dims / descriptionRemoved value: -"Dimensions of ONE package: { l, w, h, unit: mm | cm | m | in }." - removed
Input schema / properties / consignment / properties / lines / items / properties / hs_code / descriptionRemoved value: -"HS / tariff commodity code, 6–10 digits." - removed
Input schema / properties / consignment / properties / lines / items / properties / packages / descriptionRemoved value: -"The pieces: how many, of what type, and their total gross mass." - removed
Input schema / properties / consignment / properties / lines / items / properties / packages / properties / count / descriptionRemoved value: -"Number of identical packages (pieces) on the line." - removed
Input schema / properties / consignment / properties / lines / items / properties / packages / properties / gross_kg / descriptionRemoved value: -"Gross mass of ALL the line's packages together, in kg." - removed
Input schema / properties / consignment / properties / lines / items / properties / packages / properties / type / descriptionRemoved value: -"Package type, e.g. \"pallet\", \"drum\", \"carton\"." - removed
Input schema / properties / consignment / properties / lines / items / properties / packing_group / descriptionRemoved value: -"Packing group, to pin one ADR Table A row of a multi-row UN." - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / descriptionRemoved value: -"The dangerous-goods quantity (ADR 1.1.3.6.3), separate from the gross mass of the packages." - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / basis / descriptionRemoved value: -"\"net\" (the goods) or \"gross\" (with packaging). 1.1.3.6.3 counts net; a gross figure scores no points." - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / unit / descriptionRemoved value: -"\"L\" or \"kg\" — checked against the dimension ADR 1.1.3.6.3 counts for the row." - removed
Input schema / properties / consignment / properties / lines / items / properties / quantity / properties / value / descriptionRemoved value: -"The dangerous-goods quantity for the whole line, all packages together." - removed
Input schema / properties / consignment / properties / lines / items / properties / stackable / descriptionRemoved value: -"Whether the packages may be stacked." - removed
Input schema / properties / consignment / properties / lines / items / properties / un_number / descriptionRemoved value: -"UN number of a dangerous-goods line." - removed
Input schema / properties / consignment / properties / lines / items / properties / value / descriptionRemoved value: -"Customs value of the whole line (all packages together)." - removed
Input schema / properties / consignment / properties / lines / items / properties / value / properties / amount / descriptionRemoved value: -"The amount, 0 or more." - removed
Input schema / properties / consignment / properties / lines / items / properties / value / properties / currency / descriptionRemoved value: -"ISO 4217 currency code, e.g. \"GBP\"." - removed
Input schema / properties / consignment / properties / lines / items / properties / variant_index / descriptionRemoved value: -"ADR Table A variant index (as adr_lookup returns it), to pin one row." - removed
Input schema / properties / consignment / properties / options / properties / air_volumetric_divisor / descriptionRemoved value: -"IATA volumetric divisor, cm³/kg (default 6000)." - removed
Input schema / properties / consignment / properties / options / properties / awb_number / descriptionRemoved value: -"IATA air waybill number (check digit validated, advisory)." - removed
Input schema / properties / consignment / properties / options / properties / container_number / descriptionRemoved value: -"ISO 6346 container number (check digit validated, advisory)." - removed
Input schema / properties / consignment / properties / options / properties / freight_cost / descriptionRemoved value: -"Freight cost for the customs value." - removed
Input schema / properties / consignment / properties / options / properties / freight_cost / properties / amount / descriptionRemoved value: -"The amount, 0 or more." - removed
Input schema / properties / consignment / properties / options / properties / freight_cost / properties / currency / descriptionRemoved value: -"ISO 4217 currency code, e.g. \"GBP\"." - removed
Input schema / properties / consignment / properties / options / properties / incoterm / descriptionRemoved value: -"Incoterms 2020 rule." - removed
Input schema / properties / consignment / properties / options / properties / insurance_cost / descriptionRemoved value: -"Insurance cost for the customs value." - removed
Input schema / properties / consignment / properties / options / properties / insurance_cost / properties / amount / descriptionRemoved value: -"The amount, 0 or more." - removed
Input schema / properties / consignment / properties / options / properties / insurance_cost / properties / currency / descriptionRemoved value: -"ISO 4217 currency code, e.g. \"GBP\"." - removed
Input schema / properties / consignment / properties / vehicle / properties / max_mass_t / descriptionRemoved value: -"Maximum permissible mass, tonnes." - removed
Input schema / properties / consignment / properties / vehicle / properties / type / descriptionRemoved value: -"Vehicle type, e.g. \"artic\", \"rigid 7.5 t\"."
Related MCP Connectors
Multi-carrier shipping for AI agents: compare rates, buy labels, track packages, validate addresses
AI-native platform: cybernetic freight agents transact, verify, find services. Get verified leads.
Ocean & multimodal freight intelligence: rates, landed cost, transit, customs, risk, ship decisions
15 deterministic validation tools for AI agents: tax IDs (15 countries), VAT, IBAN, LEI, HS codes.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI assistants to track air waybills and ocean containers and compare freight quotes across carriers through typed, validated tools, with normalized milestone timelines, ETAs and check-digit validation.1MIT
- FlicenseNot gradedqualityDmaintenanceProvides 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.-
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to perform international trade operations such as calculating landed costs, classifying goods, explaining trade terms, estimating shipping, and converting currencies for Kazakhstan/EAEU/Central Asia trade routes.14 npmMIT
- AlicenseNot gradedqualityDmaintenanceOcean container shipping intelligence for AI agents — D\&D tariffs, freight rates, vessel schedules, port congestion, inland haulage across 6 major carriers. 24 MCP tools.1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.