Skip to main content
Glama

ADR Dangerous Goods Lookup

adr_lookup
Read-onlyIdempotent

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.

Input Schema

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

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. Changed2 schema fields changed
    • removedOutput schema / properties / _meta / properties / receipt / properties / reason / const
      Removed value: -"key_required"
    • addedOutput schema / properties / _meta / properties / receipt / properties / reason / enum
      Added value: +[
      +  "key_required",
      +  "quota"
      +]
  4. Changed1 schema field changed
    • addedOutput schema / properties / _meta / properties / receipt
      Added 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. Changed2 schema fields changed
    • addedInput schema / properties / as_of
      Added 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"
      +}
    • addedInput schema / properties / edition
      Added 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"
      +}
  6. Changed1 schema field changed
    • changedInput schema / properties / include_codes / description
      Previous 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."
  7. Changed1 schema field changed
    • addedOutput schema / properties / _meta / properties / edition_basis
      Added value: +{
      +  "type": "string"
      +}
  8. Changed3 schema fields changed
    • addedInput schema / properties / include_codes
      Added 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"
      +}
    • addedInput schema / properties / include_statements
      Added 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"
      +}
    • changedInput schema / properties / un_numbers / description
      Previous 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)."
  9. Changed1 schema field changed
    • addedInput schema / properties / un_numbers
      Added value: +{
      +  "description": "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.",
      +  "items": {
      +    "maxLength": 12,
      +    "type": "string"
      +  },
      +  "maxItems": 50,
      +  "minItems": 1,
      +  "type": "array"
      +}
  10. Changed1 schema field changed
    • addedOutput schema / properties / _meta
      Added value: +{
      +  "additionalProperties": {},
      +  "properties": {
      +    "check_id": {
      +      "type": "string"
      +    },
      +    "receipt_url": {
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  11. Changed5 schema fields changed
    • addedOutput schema / properties / as_of
      Added value: +{
      +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +  "type": "string"
      +}
    • addedOutput schema / properties / edition
      Added value: +{
      +  "anyOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "applies_from": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "may_apply_until": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "name": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "name",
      +        "applies_from",
      +        "may_apply_until"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ]
      +}
    • changedOutput schema / properties / envelope_version / enum
      Previous value: -[
      -  "1",
      -  "1.1"
      -]New value: +[
      +  "1",
      +  "1.1",
      +  "1.2"
      +]
    • addedOutput schema / properties / missing_inputs
      Added value: +{
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / status
      Added value: +{
      +  "enum": [
      +    "ok",
      +    "partial",
      +    "not_found",
      +    "unsupported",
      +    "ambiguous"
      +  ],
      +  "type": "string"
      +}
  12. Changed2 schema fields changed
    • changedInput schema / properties / search / description
      Previous value: -"Case-insensitive partial match on the proper shipping name (min 2 characters). Example: \"acetone\"."New value: +"Case-insensitive partial match on the proper shipping name (2 to 200 characters). Example: \"acetone\"."
    • addedInput schema / properties / search / maxLength
      Added value: +200
  13. Changed2 schema fields changed
    • removedOutput schema / properties / validity / properties / effective_to / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / validity / properties / effective_to / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  14. Changed1 schema field changed
    • addedInput schema / additionalProperties
      Added value: +false
  15. Changed1 schema field changed
    • changedInput schema / properties / un_number / pattern
      Previous value: -"^(?:UN\\s*)?\\d{4}$"New value: +"^\\s*(?:UN\\s*)?\\d{4}\\s*$"
  16. Changed2 schema fields changed
    • addedInput schema / properties / limit
      Added value: +{
      +  "description": "search / hazard_class only: rows per page (default 10; at most 50 for search, 100 for hazard_class).",
      +  "maximum": 100,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / offset
      Added value: +{
      +  "description": "search / hazard_class only: rows to skip (default 0). The response gives total and next_offset.",
      +  "maximum": 9007199254740991,
      +  "minimum": 0,
      +  "type": "integer"
      +}
  17. Changed3 schema fields changed
    • changedInput schema / properties / hazard_class / description
      Previous value: -"Filter by ADR hazard class and its divisions. Examples: \"3\" (flammable liquids), \"6.1\" (toxic), \"8\" (corrosive), \"1.4\" (an explosives division)."New value: +"Filter by ADR hazard class (Table A column (3a)). Examples: \"3\" (flammable liquids), \"6.1\" (toxic), \"8\" (corrosive), \"1\" (explosives — the division and compatibility group are in classification_code, e.g. \"1.4S\")."
    • changedInput schema / properties / un_number / description
      Previous value: -"Exact UN number — 4 digits, optionally \"UN\"-prefixed; explosives keep their leading zero. Examples: \"1203\", \"UN1203\", \"0004\"."New value: +"Exact UN number — 4 digits, optionally \"UN\"-prefixed; explosives keep their leading zero. Examples: \"1203\", \"UN1203\", \"UN 1203\", \"0004\"."
    • changedInput schema / properties / un_number / pattern
      Previous value: -"^(UN)?\\d{4}$"New value: +"^(?:UN\\s*)?\\d{4}$"
  18. Changed5 schema fields changed
    • addedOutput schema / properties / _source / properties / authority_current_edition
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / _source / properties / checked_at
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / _source / properties / dataset_edition
      Added value: +{
      +  "type": "string"
      +}
    • removedOutput schema / properties / envelope_version / const
      Removed value: -"1"
    • addedOutput schema / properties / envelope_version / enum
      Added value: +[
      +  "1",
      +  "1.1"
      +]
  19. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "_source": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "checked": {
      +          "type": "string"
      +        },
      +        "name": {
      +          "type": "string"
      +        },
      +        "provenance_status": {
      +          "enum": [
      +            "verified",
      +            "pending-verification",
      +            "computed",
      +            "live"
      +          ],
      +          "type": "string"
      +        },
      +        "source_url": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "name",
      +        "checked",
      +        "provenance_status"
      +      ],
      +      "type": "object"
      +    },
      +    "blocking_errors": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "code": {
      +            "type": "string"
      +          },
      +          "message": {
      +            "type": "string"
      +          },
      +          "recovery": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "action": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "additionalProperties": {},
      +                "propertyNames": {
      +                  "type": "string"
      +                },
      +                "type": "object"
      +              },
      +              "tool": {
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "action"
      +            ],
      +            "type": "object"
      +          }
      +        },
      +        "required": [
      +          "code",
      +          "message",
      +          "recovery"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "citation": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "qualifier": {
      +          "type": "string"
      +        },
      +        "text": {
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "text"
      +      ],
      +      "type": "object"
      +    },
      +    "confidence": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "basis": {
      +          "enum": [
      +            "deterministic",
      +            "provenance",
      +            "match_quality",
      +            "freshness"
      +          ],
      +          "type": "string"
      +        },
      +        "level": {
      +          "enum": [
      +            "high",
      +            "medium",
      +            "low"
      +          ],
      +          "type": "string"
      +        },
      +        "score": {
      +          "maximum": 1,
      +          "minimum": 0,
      +          "type": "number"
      +        }
      +      },
      +      "required": [
      +        "level",
      +        "basis"
      +      ],
      +      "type": "object"
      +    },
      +    "envelope_version": {
      +      "const": "1",
      +      "type": "string"
      +    },
      +    "normalized_input": {
      +      "additionalProperties": {},
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "ok": {
      +      "type": "boolean"
      +    },
      +    "result": {
      +      "additionalProperties": {},
      +      "propertyNames": {
      +        "type": "string"
      +      },
      +      "type": "object"
      +    },
      +    "validity": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "as_of": {
      +          "type": "string"
      +        },
      +        "effective_from": {
      +          "type": "string"
      +        },
      +        "effective_to": {
      +          "anyOf": [
      +            {
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "required": [
      +        "as_of"
      +      ],
      +      "type": "object"
      +    },
      +    "warnings": {
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "code": {
      +            "type": "string"
      +          },
      +          "details": {
      +            "additionalProperties": {},
      +            "propertyNames": {
      +              "type": "string"
      +            },
      +            "type": "object"
      +          },
      +          "message": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "code",
      +          "message"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "envelope_version",
      +    "ok",
      +    "result",
      +    "confidence",
      +    "_source",
      +    "citation"
      +  ],
      +  "type": "object"
      +}
  20. Changed5 schema fields changed
    • changedInput schema / properties / hazard_class / description
      Previous value: -"Filter by hazard class"New value: +"Filter by ADR hazard class and its divisions. Examples: \"3\" (flammable liquids), \"6.1\" (toxic), \"8\" (corrosive), \"1.4\" (an explosives division)."
    • changedInput schema / properties / search / description
      Previous value: -"Search by substance name"New value: +"Case-insensitive partial match on the proper shipping name (min 2 characters). Example: \"acetone\"."
    • addedInput schema / properties / search / minLength
      Added value: +2
    • changedInput schema / properties / un_number / description
      Previous value: -"UN number (e.g., \"1203\")"New value: +"Exact UN number — 4 digits, optionally \"UN\"-prefixed; explosives keep their leading zero. Examples: \"1203\", \"UN1203\", \"0004\"."
    • addedInput schema / properties / un_number / pattern
      Added value: +"^(UN)?\\d{4}$"
  21. First observed

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already declare readOnlyHint/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.

Conciseness3/5

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.

Completeness5/5

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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3; 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.