Skip to main content
Glama

ADR Consignment Check

adr_consignment_check
Read-onlyIdempotent

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.

Input Schema

NameRequiredDescriptionDefault
crewNoThe vehicle crew, for the driver-training and document checks (ADR 8.2, 8.1.2). Facts only — no name.
as_ofNoYYYY-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.
linesYesThe lines of the load (1–50). Required.
editionNoADR 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.
journeyNo
optionsNoThe consignment object's options; not read by this check.
vehicleNoRead: 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

NameRequiredDescriptionDefault
okYes
_metaNo
as_ofNo
resultYes
statusNo
_sourceYes
editionNo
citationYes
validityNo
warningsNo
confidenceYes
missing_inputsNo
blocking_errorsNo
envelope_versionYes
normalized_inputNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / _meta / properties / upstream
      Added 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"
      +}
  2. Changed1 schema field changed
    • addedOutput schema / properties / _meta / properties / ids
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "pattern": {
      +      "type": "string"
      +    },
      +    "scheme": {
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    }
      +  },
      +  "required": [
      +    "scheme",
      +    "pattern"
      +  ],
      +  "type": "object"
      +}
  3. Changed1 schema field changed
    • addedInput schema / properties / lines / items / properties / packages / properties / un_mark
      Added value: +{
      +  "maxLength": 80,
      +  "minLength": 1,
      +  "type": "string"
      +}
  4. Changed7 schema fields changed
    • addedInput schema / properties / crew
      Added 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"
      +}
    • changedInput schema / properties / vehicle / description
      Previous 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)."
    • addedInput schema / properties / vehicle / properties / equipment_8_1_5
      Added 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"
      +}
    • addedInput schema / properties / vehicle / properties / fire_extinguishers_kg
      Added value: +{
      +  "items": {
      +    "exclusiveMinimum": 0,
      +    "maximum": 100,
      +    "type": "number"
      +  },
      +  "maxItems": 20,
      +  "type": "array"
      +}
    • addedInput schema / properties / vehicle / properties / instructions_in_writing
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / vehicle / properties / orange_plates_displayed
      Added value: +{
      +  "type": "boolean"
      +}
    • addedInput schema / properties / vehicle / properties / placards_displayed
      Added value: +{
      +  "type": "boolean"
      +}
  5. Changed2 schema fields changed
    • changedInput schema / properties / vehicle / description
      Previous value: -"Not read in version 2a."New value: +"Only foodstuffs_carried is read (mixed loading, 7.5.4)."
    • addedInput schema / properties / vehicle / properties / foodstuffs_carried
      Added value: +{
      +  "type": "boolean"
      +}
  6. Added

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.