Skip to main content
Glama
Ownership verified

Server Details

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

Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
SoapyRED/freightutils-mcp
GitHub Stars
4
Server Listing
FreightUtils MCP Server

Glama MCP Gateway

Connect through Glama MCP Gateway for full control over tool access and complete visibility into every call.

MCP client
Glama
MCP server

Full call logging

Every tool call is logged with complete inputs and outputs, so you can debug issues and audit what your agents are doing.

Tool access control

Enable or disable individual tools per connector, so you decide what your agents can and cannot do.

Managed credentials

Glama handles OAuth flows, token storage, and automatic rotation, so credentials never expire on your clients.

Usage analytics

See which tools your agents call, how often, and when, so you can understand usage patterns and catch anomalies.

100% free. Your data is private.
Tool DescriptionsA

Average 4.9/5 across 24 of 24 tools scored.

Server CoherenceA
Disambiguation4/5

Most tools have clearly distinct purposes (lookups vs calculators vs validators), but consignment_calculator and shipment_summary overlap significantly as composite multi-line calculators, and the various dimension/weight calculators (cbm, chargeable, ldm, pallet_fitting) could be confused by an agent choosing among them. Overall, however, the domain is segmented well enough that a careful agent can select correctly.

Naming Consistency4/5

The dominant pattern is a domain noun plus a suffix: _lookup, _calculator, or _check (e.g., adr_lookup, cbm_calculator, ics2_check). A few outliers like validate, get_subscribe_link, nearest_airport, and shipment_summary break the pattern but remain readable and predictable. The convention is consistent enough to guide an agent.

Tool Count3/5

At 24 tools, this is on the heavy side per the calibration guidelines. While most tools earn their place in a broad freight-utilities domain, a few could be consolidated (consignment_calculator vs shipment_summary, unit_converter vs the dedicated calculators), suggesting the set is slightly over-scoped.

Completeness4/5

The server covers a wide range of freight functions: reference lookups (airports, airlines, ADR, containers, ULDs, vehicles, HS codes, UN/LOCODE), calculations (CBM, chargeable weight, LDM, pallet fitting, emissions, duty), validations (identifier check digits, ICS2), and composite analyses. Minor gaps exist (no routing/distance calculation, no currency conversion, no warehouse/storage tools), but these are arguably outside the core scope of a freight utilities toolkit.

Available Tools

24 tools
adr_exemption_calculatorADR 1.1.3.6 Exemption CalculatorA
Read-onlyIdempotent
Inspect

Calculate ADR 1.1.3.6 "small load" exemption points for a dangerous-goods load. Each substance's transport category (0-4) sets a points multiplier (category 1 x50, 2 x3, 3 x1, 4 x0); points = quantity x multiplier, and a load totalling 1,000 points or less qualifies for reduced ADR requirements. 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 mixed load (items takes precedence if both are given). Quantities are in kg or litres per the substance's ADR unit.

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. Without a disambiguator the tool returns blocking_errors[AMBIGUOUS_UN_VARIANT] + human_review_required + candidates[] (each candidate's variant_index, packing_group, proper_shipping_name, transport_category, multiplier) and NO verdict, rather than silently guessing a row. Single-row UNs are unchanged.

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. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

Returns: items[] (each with packing_group, variant_index, transport_category, multiplier, points), total_points, threshold (1000), exempt, has_category_zero, has_quantity_exceedance, warnings and message under result — or, when a UN is ambiguous, human_review_required + candidates[] with blocking_errors, plus confidence, _source and citation (the FreightUtils v1 response envelope).

Limitations: a deterministic calculation over reference data, not legal advice — even exempt loads keep core duties (packaging, marking, documentation), and mixed-packing rules still apply; verify against the current UNECE ADR text.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsNoArray of items for mixed-load check
quantityNoQuantity in kg/L
un_numberNoUN number for single check (4 digits, optionally "UN"-prefixed)
packing_groupNoPacking group (I, II or III) — only needed to disambiguate a UN that has more than one ADR Table A row (e.g. UN 1789). Ignored for single-row UNs.
variant_indexNoADR Table A variant index (as returned by adr_lookup) — pins one row when a UN has several variants that share a packing group (e.g. concentration bands). Ignored for single-row UNs.

Output Schema

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

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

The annotations declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description adds substantial context beyond these hints. It discloses deterministic arithmetic, rate limiting with 429 and retry_after_seconds, ambiguous UN handling with candidates[] and blocking_errors, and the caveat that it is 'not legal advice'. No contradiction with annotations.

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

Conciseness5/5

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

The description is long but highly structured: purpose in the first line, then input rules, ambiguous-UN behavior, rate limits, return envelope, limitations, and related tools. Every sentence adds needed information, and front-loading the key concept (1.1.3.6 exemption, points threshold) makes it easy to grasp.

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?

The description covers all key aspects of this complex tool: point calculation formula, 1000-point threshold, category 0 exclusion, multi-variant disambiguation, error/rate-limit behavior, output envelope, and practical limitations. Combined with the rich annotations and output schema, the agent has everything needed to select and invoke the tool appropriately.

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?

The input schema has 100% coverage, but the description enriches each parameter meaningfully. It explains the precedence of items over single parameters, the kg/L unit convention, how packing_group and variant_index disambiguate multi-variant UNs, and how to obtain variant_index from adr_lookup. This is well beyond what the schema descriptions offer.

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 description opens with 'Calculate ADR 1.1.3.6 "small load" exemption points' – a specific verb, resource, and regulatory context. It distinguishes itself from siblings by naming adr_lookup (for per-substance data) and adr_lq_eq_check (for LQ/EQ relief routes), making its unique purpose immediately clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says adr_lq_eq_check is for 'the LQ/EQ relief routes instead of 1.1.3.6', providing a direct alternative. It also gives concrete input instructions: 'Provide un_number + quantity for a single substance, or items[] for a mixed load' and explains that 'items takes precedence if both are given'. This is strong practical guidance.

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 LookupA
Read-onlyIdempotent
Inspect

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

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

Behavior: read-only reference lookup; name searches return up to 50 entries, class filters up to 100. An unknown UN number or a search with no hits errors with the API's NOT_FOUND body and a retry hint. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoCase-insensitive partial match on the proper shipping name (min 2 characters). Example: "acetone".
un_numberNoExact UN number — 4 digits, optionally "UN"-prefixed; explosives keep their leading zero. Examples: "1203", "UN1203", "0004".
hazard_classNoFilter by ADR hazard class and its divisions. Examples: "3" (flammable liquids), "6.1" (toxic), "8" (corrosive), "1.4" (an explosives division).

Output Schema

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

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

While annotations already state readOnlyHint=true, idempotentHint=true, and destructiveHint=false, the description adds substantial behavioral context: read-only reference lookup, response limits (up to 50 for search, 100 for class), error behavior (NOT_FOUND body with retry hint, 429 with retry_after_seconds and Retry-After header), and UN number normalization including leading-zero handling for explosives. No contradiction with annotations.

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

Conciseness5/5

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

The description is organized into clear sections (purpose, usage, behavior, returns, limitations, related tools) and every sentence adds value. Despite being lengthy, it avoids redundancy and front-loads the primary purpose before diving into details.

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?

The tool has a complex parameter schema and behavior, and the description covers all critical aspects: parameter selection rules, normalization, result caps, error formats, rate limits, return envelope, legal disclaimer, and related tools. It even lists the output fields, which goes beyond what an output schema would require.

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?

Schemas cover 100% of parameters, but the description enriches semantics with behavioral nuances: un_number returns every packing-group variant and is normalized; search is case-insensitive partial match; hazard_class returns all entries in a class/division. It also clarifies the mutual exclusivity constraint and gives examples, which is more than the schema alone provides.

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 description opens with a specific verb ('Look up') and resource ('European road dangerous-goods (ADR 2025) reference data'), enumerating the exact data fields returned (hazard class, packing group, tunnel code, etc.). It further distinguishes itself from sibling tools by naming related tools and their different purposes (e.g., adr_lq_eq_check checks quantities, adr_exemption_calculator computes 1.1.3.6 points).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage instructions: 'Provide exactly ONE of: un_number, search, or hazard_class', and details when each is appropriate (exact UN lookup, partial name match, class/division filter). It also names alternatives and related tools, including get_subscribe_link for rate-limit escalation, making the choice boundaries clear.

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 CheckA
Read-onlyIdempotent
Inspect

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

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

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. Without a disambiguator the tool returns blocking_errors[AMBIGUOUS_UN_VARIANT] + human_review_required + candidates[] (each candidate's variant_index, packing_group, proper_shipping_name, limited_quantity, excepted_quantity) and NO verdict, rather than silently checking the wrong 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. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

Returns: mode, overall_status, items[] (un_number, variant_index, substance, class, packing_group, lq_limit or eq_code, quantity_entered, status, reason), summary {total_items, qualifying, exceeding, not_permitted} and the ADR chapter references under result — or, when a UN is ambiguous, human_review_required + candidates[] with blocking_errors, plus confidence, _source and citation (the FreightUtils v1 response envelope).

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

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

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

Output Schema

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

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

Annotations already mark readOnly=true, idempotent=true, destructive=false; the description complements these by explaining rate limits (25 requests/day, 429 with retry_after_seconds), ambiguous UN behavior (blocking_errors + human_review_required instead of a silent verdict), and that it only performs quantity-threshold checks, not full compliance. This adds substantial behavioral context beyond the structured hints and does not contradict them.

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

Conciseness5/5

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

The description is long but each section earns its place: core check, input shape, disambiguation, behavior, return envelope, limitations, related tools. It front-loads the primary purpose, then layers detail, making it navigable for a complex tool. No redundant filler.

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?

With 2 required params, a rich output schema, and safety annotations, the description still goes further by specifying output fields (items[] fields, summary, blocking_errors, human_review_required, citation), the ADR chapter references, rate-limit behavior, and the boundaries of what it verifies. This gives the agent full operational context.

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?

Even though schema coverage is 100%, the description enriches every parameter: it states that quantity is per inner packaging, unit must match liquid/solid phases, and how packing_group/variant_index disambiguate multi-variant UNs. It also explains inner_packaging_qty's role in EQ mode (per-outer limit) and mode alternatives, so the agent can populate values correctly.

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 description opens with a specific action—'Check whether dangerous goods qualify for ADR Limited Quantity (LQ, ADR 3.4) or Excepted Quantity (EQ, ADR 3.5) relief'—which clearly names the resource and scope. It distinguishes itself from siblings by referencing adr_lookup (the per-substance LQ/EQ values) and adr_exemption_calculator (the 1.1.3.6 route), so the agent can pick the right tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit usage instructions ('Provide mode ("lq" or "eq") and 1-20 items...'), clarifies per-inner-packaging semantics, and states when multi-variant UNs require packing_group or variant_index. It also names alternatives in the Related section and lists limitations (packaging/marking/documentation not assessed), so the agent knows when not to rely on it.

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 LookupA
Read-onlyIdempotent
Inspect

Search 6,357 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 with no hits returns count 0 with a NO_MATCH advisory rather than an error. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

Returns: count and results[] — per airline: airline_name, iata_code, icao_code, awb_prefix[], callsign, country, has_cargo, aliases and per-record verification fields — 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).

ParametersJSON Schema
NameRequiredDescriptionDefault
iataNoExact IATA code (2 alphanumeric chars)
icaoNoExact ICAO code (3 letters)
queryNoGeneral search (name, code, prefix or country — min 2 chars)
prefixNoAWB prefix (3 digits)
countryNoFilter by country name (min 2 chars)

Output Schema

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

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

Annotations include readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description goes well beyond this by disclosing the fuzzy match quality reporting mechanism (confidence, FUZZY_BEST_MATCH, NO_MATCH advisories), rate-limiting with 429 retry behavior, and the provenance verification caveat. It also clarifies that no results return a count of 0 rather than an error. No contradiction with annotations.

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

Conciseness4/5

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

The description is longer than many, but it is purposefully structured: lead with core search capability, then parameter semantics, then behavioral details, then returns, then limitations, then related tools. Each sentence carries information—rate limits, advisories, provenance status, and alternatives. It is front-loaded with the primary use case and is dense without bloat, though a slightly more compact format would be possible.

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 with 5 optional parameters, an output schema, rate limiting, and data provenance caveats, the description covers everything an agent needs: input selector rules, match-quality advisories, rate-limit handling, response fields, verification limitations, and sibling tool comparisons. The presence of an output schema removes the need to enumerate full return types, but the description still summarizes the result structure and envelope details usefully.

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?

The schema already covers parameter formats and descriptions 100%, providing a baseline of 3. The description adds crucial usage semantics: it states the mutual exclusivity of parameters ('Provide ONE parameter'), explains that `query` is a ranked fuzzy search while others are exact filters, and provides a concrete AWB prefix example ('176 = Emirates'). This meaningfully enhances the schema's bare field names and patterns.

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 description opens with a specific verb and resource: 'Search 6,357 airlines by name, IATA code, ICAO code, AWB prefix, or country.' It immediately clarifies scope and domains, and explicitly distinguishes itself from sibling tools by noting 'airport_lookup (searches AIRPORTS, not carriers)' and 'validate (checks an AWB number's check digit and names its airline from this dataset).' This is a textbook example of purpose differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: 'Provide ONE parameter' and distinguishes the ranked fuzzy search from exact filters. It names alternatives with their contrasting purposes ('airport_lookup' for airports, 'validate' for AWB check digit validation). It also explains expected outcomes for no-hit cases, giving clear when-to-use/when-not-to-use context.

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

airport_lookupAirport Code LookupA
Read-onlyIdempotent
Inspect

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

Provide ONE of iata, icao, or query; the optional type filter narrows results. Behavior: read-only; exact code hits return one record; ambiguous name searches return ranked candidates (exact codes first, then larger airports) with match quality reported via the envelope's confidence (basis match_quality); an unknown code errors with a not-found message. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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

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

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

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

Output Schema

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

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

The description discloses far more than annotations: exact code hits vs. ranked ambiguous search results, confidence/match_quality behavior, not-found errors, rate limits with retry headers, response envelope structure, and data source caveats. It also clearly states 'read-only' aligning with annotations. This fully carries behavioral transparency beyond 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.

Conciseness4/5

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

The description is long but well-structured into purpose, usage, behavior, returns, limitations, and related tools. Each section adds value and no sentence is redundant. It could be tightened slightly, but the complexity of the tool justifies the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple search modes, output envelope, rate limiting, error behavior), the description is remarkably complete. It covers prerequisites (one-of rule), output semantics, limitations, and related tool disambiguation. The presence of an output schema doesn't reduce the need for the caveats and ambient context provided here.

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?

While schema coverage is 100%, the description adds critical semantic meaning: the mutual exclusivity rule ('Provide ONE of iata, icao, or query'), the meaning of ambiguous query behavior (ranked candidates, exact codes first), and the type filter's narrowing effect. These are not in the schema descriptions and materially help the agent invoke the tool correctly.

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 description states a specific verb ('Look up an airport') with concrete identifier methods (IATA, ICAO, free-text name/city) and explicitly distinguishes from related tools like airline_lookup and unlocode_lookup. The scope ('85,555 airports worldwide') and examples make the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: 'Provide ONE of iata, icao, or query', explains the optional type filter, and names direct alternatives with differentiating details (nearest_airport for coordinate-based lookup, airline_lookup for carriers, unlocode_lookup for general transport locations). This is exemplary usage guidance.

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

cbm_calculatorCBM CalculatorA
Read-onlyIdempotent
Inspect

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

Behavior: deterministic — identical inputs always return identical figures; total volume = pieces x per-piece CBM, with conversions to cubic feet, cubic inches and litres included. Missing or non-positive dimensions error with a validation message naming the parameter. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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

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

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

Output Schema

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

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

Behavior is thoroughly disclosed: deterministic output, total volume formula, validation errors naming the parameter, rate limiting with 429 error details (retry_after_seconds and Retry-After header), and backoff/retry guidance. It also lists the exact return fields and the response envelope. This goes well beyond the annotations (readOnlyHint, idempotentHint) and adds critical context without contradiction.

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

Conciseness5/5

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

The description is well-structured into definition, behavior, returns, and related tools. Every sentence carries meaningful information, and the length is justified by the need to cover deterministic behavior, error handling, rate limits, and alternatives. It is front-loaded with the core purpose and avoids redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema and complete input schema, the description still adds necessary context: rate limits with retry handling, validation error behavior, and relationships to sibling tools. It fully equips an agent to decide when to call this tool and what to expect, exceeding the minimum needed for a 4-parameter deterministic calculator.

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?

The schema already describes all four parameters with 100% coverage, so the baseline is 3. The description adds value by explaining that total volume = pieces x per-piece CBM, clarifying the role of the pieces parameter, and noting that missing/non-positive dimensions trigger a validation message naming the offending parameter. This supplements the schema's basic field descriptions.

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 description opens with 'Calculate cubic metres (CBM) for a shipment from per-piece dimensions,' which is a specific verb+resource statement. It clearly distinguishes itself from sibling tools by naming related calculators (chargeable_weight_calculator, consignment_calculator, unit_converter, shipment_summary) with brief explanations of their differing purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Related' section explicitly points to alternatives and when they apply: chargeable_weight_calculator for air billing weight, consignment_calculator for multi-line totals, etc. It also states rate limits and directs users to get_subscribe_link for higher limits, which informs when to use an alternative. This is explicit enough to guide tool selection.

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 CalculatorA
Read-onlyIdempotent
Inspect

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

Behavior: deterministic; per-piece volumetric weight is rounded to 2 decimal places before totalling; 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 (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

Returns: chargeable_weight_kg, basis, volumetric_weight_kg (total and per piece), gross_weight_kg, cbm, ratio, factor and pieces under result; normalized_input echoes the interpreted inputs and any defaults applied; plus confidence, _source and citation (the FreightUtils v1 response envelope).

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

ParametersJSON Schema
NameRequiredDescriptionDefault
factorNoVolumetric divisor (default: 6000)
piecesNoNumber of identical pieces (default: 1)
width_cmYesWidth in centimetres
height_cmYesHeight in centimetres
length_cmYesLength in centimetres
gross_weight_kgYesActual gross weight in kilograms

Output Schema

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

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

Beyond the annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false), the description discloses deterministic behavior, rounding to 2 decimals, the meaning of 'basis', error behavior for invalid inputs, and the 429 rate-limit response details. This adds substantial context that annotations alone do not provide.

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

Conciseness5/5

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

The description is thorough yet well-organized, with the core purpose in the first sentence, followed by behavior, constraints, errors, and related tools. Every sentence adds value, and the structure is front-loaded with the most critical information. No fluff or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (rounding, divisor variants, error handling, rate limits, output envelope), the description covers all essential aspects. It explains the result fields (including basis, ratio, etc.) and points to the output schema context, making it complete for an agent to invoke and interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds further meaning by explaining the factor parameter as a divisor with IATA vs. express values, and pieces as identical units. It also clarifies rounding behavior that affects interpretation of results. This exceeds baseline without needing to repeat schema descriptions.

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 description opens with a specific verb+resource: 'Calculate air freight chargeable weight — the greater of actual gross weight and volumetric weight', and then explicitly differentiates from sibling tools by noting the sea alternative in consignment_calculator and related volume/equipment tools. This is a model of purpose clarity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly states the intended use (air freight) and explicitly excludes sea freight, pointing to consignment_calculator with mode=sea. It also names related tools (cbm_calculator, uld_lookup) for adjacent needs, providing strong when-to-use vs. 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.

consignment_calculatorConsignment CalculatorA
Read-onlyIdempotent
Inspect

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

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

Behavior: deterministic; flags are advisory only — implausible density, mode/option mismatch, dangerous-goods presence by UN number against ADR 2025, and container/AWB check-digit validity — and never state that a shipment is permitted or compliant. Invalid lines error naming the offending field. Canonical schema: https://www.freightutils.com/schema/consignment.v1.json. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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

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

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

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

Output Schema

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

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

The description discloses that the tool is deterministic, flags are advisory only, it 'never state[s] that a shipment is permitted or compliant', and invalid lines error naming the offending field. It also states limitations (not regulatory/customs/DG compliance advice). These go well beyond the readOnly/idempotent annotations and do not contradict them.

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

Conciseness5/5

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

The description is long but well-structured with distinct labeled sections: input requirements, behavior, returns, limitations, and related tools. Every sentence carries operational value and the first sentence front-loads the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (mode-dependent calculations, multiple input shapes, advisory flags, rate limits), the description covers inputs, outputs, error behavior, limitations, and related tools. The output schema exists, but the description's return summary and related-tool pointers ensure the agent has a complete mental model.

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?

Although schema coverage is 100%, the description adds meaningful semantics: default road mode, default air volumetric divisor (6000), canonical vs legacy input formats, and the check-digit sanity-flag purpose of options.container_number / options.awb_number. This goes far beyond the individual schema property descriptions.

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 description opens with 'Calculate per-line and grand totals for a multi-item mixed consignment' — a specific verb+resource — and enumerates the computed outputs (CBM, loading metres, volumetric weight, mode-specific chargeable). It differentiates itself from siblings by naming cbm_calculator/chargeable_weight_calculator/ldm_calculator as 'single-figure versions'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Provide mode (sea | air | road, default road) and either lines[] ... or the legacy flat items[]', telling the agent exactly what to pass. It also covers rate-limit handling (429 with retry_after_seconds, fallback to get_subscribe_link) and names related tools for alternative use cases.

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

container_lookupContainer LookupA
Read-onlyIdempotent
Inspect

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

Provide type as a slug (e.g. "20ft-standard", "40ft-high-cube") for one container's record; omit it to list all 10. 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); an unknown type errors with the valid slug list. Fit calculations are geometric best-effort — they do not model load distribution, securing or mixed cargo. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoContainer slug (e.g., "20ft-standard", "40ft-high-cube"). Omit to list all.

Output Schema

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

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

Beyond the annotations (readOnly, idempotent, non-destructive), the description adds rate limits (25/day with retry_after_seconds), error behavior (unknown type yields valid slug list), best-effort fit calculations, and provenance caveats, giving rich behavioral context.

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

Conciseness5/5

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

The description is well-structured with clear sections (usage, behavior, returns, limitations, related) and every sentence adds value. Despite its length, it is front-loaded with purpose and avoids redundancy.

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?

The description covers purpose, usage, behavior, return envelope, limitations, rate limits, and alternatives. Since an output schema exists, it need not repeat return field details, but it still mentions key output fields. The only slight gap is the phantom item dimension parameters, but overall it is highly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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

The type parameter is well explained with concrete slug examples and list-all behavior, but the description mentions 'Add item dimensions' parameters (item_length_cm, etc.) that are not present in the input schema. This mismatch could mislead an agent into invoking with unsupported parameters, reducing clarity.

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 description clearly states 'Get ISO shipping-container specifications, with optional load-fit maths' and enumerates the 10 container types covered, distinguishing it from siblings like uld_lookup and validate by explicitly naming them in the Related section.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs when to provide a type slug vs omit it to list all, and names related tools (validate, cbm_calculator, uld_lookup) with their different purposes, providing clear alternatives and exclusions.

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

emissions_calculatorFreight Emissions CalculatorA
Read-onlyIdempotent
Inspect

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

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

Behavior: deterministic given the same factor edition; the fleet-average factor already includes average empty running (see empty_running) — do NOT add your own empty-return leg; sea and air are low-representativeness generic defaults (real emissions vary materially by vessel/aircraft, load factor and routing — see representativeness and the result summary). An unknown mode/sub_mode/region returns available:false with the covered options, never a fabricated factor. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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 open factor, all under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

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

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

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

Output Schema

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

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

Given readOnlyHint/idempotentHint, the description adds substantive context: deterministic results, inclusion of empty running, low representativeness for sea/air, available:false behavior for unknown values, rate-limit and 429 retry semantics, and a caveat that this is not an audited carbon report. No contradiction with annotations.

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

Conciseness4/5

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

Description is long but well-structured with scannable sections (usage, behavior, returns, limitations, related). Every sentence conveys a distinct constraint or fact; no filler. However, the length is somewhat high, so not a perfect 5.

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?

With extensive context and a rich output schema, the description covers input requirements, edge cases, rate limiting, return envelope, and limitations. It leaves no critical operational gap for an agent selecting or invoking the tool.

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 covers all 7 params with descriptions (100%), satisfying the baseline of 3. The description elevates this by clarifying that mass means actual gross mass (not chargeable/volumetric), distance must be user-provided (no routing), and unknown sub_mode/region behavior. This adds cautionary semantics beyond the schema.

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 description opens with a specific verb-object-scope ('Estimate freight transport greenhouse-gas emissions (kgCO2e) for a shipment leg'), includes the calculation formula, and explicitly distinguishes itself from sibling volume/weight calculators. This makes the tool's role unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use instructions: prerequisites (mass, distance_km, mode), what NOT to do (don't pass chargeable weight, don't add empty-return leg), and names alternatives (cbm_calculator, ldm_calculator, chargeable_weight_calculator) in the 'Related' section. Also mentions rate-limit fallback (get_subscribe_link).

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 LookupA
Read-onlyIdempotent
Inspect

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

Provide ONE of: query (free-text description search, min 2 chars), code (2-6 digit lookup, returns the code plus its hierarchy), or section (Roman numeral I-XXI to browse a section).

Behavior: read-only; description search is keyword-based against official HS descriptions, so everyday product words can return zero rows — count 0 with an empty results[] is a valid answer (e.g. "laptop" and "computers" find nothing; "automatic data" matches the official phrasing "automatic data processing machines"); prefer the formal tariff wording. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoExact HS code (2-6 digits)
queryNoSearch by product description (min 2 chars)
sectionNoBrowse by section (Roman numeral I–XXI)

Output Schema

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

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

Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description discloses search behavior (keyword-based, zero-result cases), rate limits (25/day, 429 handling), and limitations (international level only, non-binding). No contradiction with annotations.

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

Conciseness5/5

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

The description is longer but well-structured with dedicated paragraphs for behavior, returns, limitations, and related tools. Every sentence contributes useful information, and the main purpose is front-loaded.

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?

The description covers the tool's purpose, all input modes, behavioral nuances, output envelope, rate limiting, limitations, and related tools. Given the tool's complexity, the description is comprehensive and self-contained.

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?

Although the schema descriptions are terse, the tool description adds substantial meaning: explains the hierarchical structure (chapter/heading/subheading), details what each parameter returns (code returns hierarchy; section browses), and provides concrete examples of query behavior. This goes well beyond the schema.

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 description clearly states the tool searches 6,940 WCO HS 2022 commodity codes, specifying the resource and action. It also distinguishes itself from siblings by naming uk_duty_calculator and ics2_check as related tools with different purposes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage instructions: 'Provide ONE of: query, code, or section,' and explains when to use each. It also names alternatives and clarifies that ics2_check is a different check entirely.

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 CheckerA
Read-onlyIdempotent
Inspect

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

Pass description=. Behavior: deterministic term matching against the in-force EU list; each flagged term carries a note (a standalone stop-word means automatic rejection, an embedded one means make the description more specific); clean=true means no listed term matched — it does NOT guarantee acceptance, and no binary accepted/rejected verdict is given. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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). Use BEFORE filing an ENS — for customs/documentation teams, brokers and agents building filing pipelines.

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

Output Schema

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

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

Annotations already declare readOnlyHint=true and idempotentHint=true, and the description adds substantial behavioral detail: deterministic term matching, flagged terms with notes, the meaning of clean, no binary verdict, rate limits, 429 error handling with retry_after_seconds, and periodic list updates. No contradiction with annotations.

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

Conciseness4/5

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

The description is long but well-structured: purpose, behavior, return format, limitations, and related tools are separated into clear sections. It is front-loaded with the primary function. Though verbose, each sentence earns its place; only minor redundancy exists in describing the return envelope when output schema is present.

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?

Despite having an output schema, the description thoroughly explains return fields, limitations, rate limits, legal disclaimers, and the non-exhaustive nature of the list. It provides complete context for an agent to invoke the tool correctly and interpret results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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

Schema coverage is 100% and the schema description already states 'The goods description to check against the EU ICS2 stop-words list.' The description's 'Pass description=<goods description>' is redundant with the schema. No additional parameter semantics are provided beyond what the schema already offers.

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 description opens with a specific verb+resource: 'Check a goods description against the official EU ICS2 stop-words list', clearly scoping the tool to a distinct function. It explicitly differentiates from siblings by naming hs_code_lookup and uk_duty_calculator as covering different fields of ENS screening.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use ('Use BEFORE filing an ENS') and what the tool is not for ('not an ENS filing, not a customs-compliance determination, not legal advice'). It also provides alternatives: 'call get_subscribe_link for higher limits' and names hs_code_lookup/uk_duty_calculator for other purposes.

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

incoterms_lookupIncoterms 2020 LookupA
Read-onlyIdempotent
Inspect

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

Provide code for one rule, category (any_mode | sea_only) for a filtered list, or neither to list all 11. Behavior: read-only reference; an unknown code errors with the valid code list. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoIncoterm code (3 letters, e.g., "FOB", "CIF")
categoryNoFilter by mode

Output Schema

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

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

Beyond the annotations (readOnlyHint, idempotentHint, destructiveHint), the description discloses error behavior (unknown code returns valid code list), rate limits (25 requests/day per IP with 429 retry semantics), and limitations (summarised guidance, binding ICC text). This adds significant context the annotations do not provide.

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

Conciseness5/5

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

Every sentence contributes value. The description is well-structured: purpose, mode classification, usage instructions, behavior, return fields, limitations, and related tools. No redundancy or filler—information is dense but organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (2 optional params, output schema present), the description is fully complete. It covers parameter combinations, error handling, rate limits, response structure, limitations, and related tools. There is nothing left ambiguous for an agent deciding to use and invoke this tool.

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?

Although the schema covers parameter descriptions (100% coverage), the description adds meaning about how the parameters interact: code for a single rule, category for filtering, or neither for all results. It also clarifies the category enum values (any_mode vs. sea_only) with concrete examples of the rules belonging to each.

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 description uses a specific verb ('Look up') and clearly identifies the resource ('the 11 Incoterms 2020 trade rules'). It defines exactly what information is provided (who pays for transport, insurance, customs, and risk transfer), which distinguishes it from other lookup tools in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains when to use each input combination: provide a code for one rule, category for a filtered list, or neither for all 11. It also notes the transport-mode applicability (any mode vs. sea-only) and lists related tools (uk_duty_calculator, shipment_summary), giving clear alternatives and context.

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

ldm_calculatorLDM CalculatorA
Read-onlyIdempotent
Inspect

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

Provide a pallet preset OR custom length_mm + width_mm — omitting both errors with a usage hint. Behavior: deterministic; stackable=true with stack_height 2 or 3 divides the floor footprint accordingly; fits reports whether the load fits the chosen vehicle's LENGTH (give weight_kg to also see total_weight_kg against the vehicle's max payload); utilisation_percent is of the vehicle's length. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

Returns: ldm, vehicle (name, length_m, max_payload_kg), utilisation_percent, pallet_spaces (used/available), total_weight_kg, fits and warnings under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

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

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

Output Schema

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

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

Annotations already indicate read-only and idempotent behavior. The description adds substantial behavioral context: deterministic calculation, stacking behavior (stackable=true with stack_height 2 or 3 divides floor footprint), fits logic based on vehicle length, rate limiting with 429 retry guidance, and response envelope details. These are not present in annotations and significantly help the agent anticipate side effects and error handling.

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

Conciseness5/5

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

The description is rich but tightly organized: core definition, usage requirements, behavior details, rate limits, return structure, and related tools. Every sentence contributes value, and it front-loads the most critical information. Though longer than typical, it remains efficient and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (9 parameters, output schema, rate limits), the description is exceptionally complete. It covers preconditions, error behavior, response fields, and sibling relationships. The existence of an output schema does not weaken the description, which still clarifies the semantics of returned values like utilisation_percent and fits.

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?

Though the schema covers 100% of parameters, the description adds relational and conditional meaning that the schema cannot express: the mutual exclusivity of pallet vs custom dimensions, the effect of stackable/stack_height on results, and the dependency of weight_kg on payload validation. This elevates parameter understanding beyond individual attribute descriptions.

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 description opens with a specific, action-oriented statement: 'Calculate loading metres (LDM) for European road freight — how much trailer length a pallet load occupies.' It defines LDM and clearly distinguishes this tool from sibling calculators by focusing on linear trailer length for pallet loads, with references to related tools that cover different use cases (e.g., pallet_fitting_calculator, consignment_calculator).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool and provides alternatives via the 'Related' section. It also provides critical usage constraints: 'Provide a pallet preset OR custom length_mm + width_mm — omitting both errors with a usage hint.' This goes beyond vague guidance and gives actionable selection criteria.

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

nearest_airportNearest AirportA
Read-onlyIdempotent
Inspect

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

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

Behavior: deterministic distance sort; confidence reflects proximity and airport size (a large airport within 25 km scores high; closed/heliport/seaplane results cap lower). This tool does NOT geocode place names and does NOT compute routes — pass coordinates you already hold. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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

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

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

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

Output Schema

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

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

Annotations already declare readOnly, idempotent, and non-destructive. The description adds substantial behavioral context: 'Coordinates are INPUT only — nothing is stored or logged,' 'deterministic distance sort,' the confidence scoring rule ('large airport within 25 km scores high; closed/heliport/seaplane results cap lower'), and the 429 retry behavior. These are non-obvious traits not derivable from annotations or schema.

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

Conciseness5/5

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

The description is organized into clear, purposeful sections: summary, input instructions, behavior, return envelope, limitations, and related tools. Each sentence contributes unique information (e.g., data source, rate limiting, navigation disclaimer). While longer than average, no redundant or filler content exists, and the most critical info (what it does and how to use) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (rate limits, confidence scoring, output envelope) and the presence of an output schema, the description is remarkably complete. It explains the return structure ('count and results[] ... under result, plus confidence, _source and citation'), the confidence semantics, rate-limit handling with retry headers, and the reference-data limitation. This exceeds what schema and annotations alone provide.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 adds only marginal parameter context beyond the schema: it reiterates latitude/longitude format, lists optional parameters (radius_km, max_results, type), and gives an example value for type ('e.g. large_airport only'). It does not provide new semantics like edge-case warnings or format specifics not already in the schema.

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 description opens with a specific action: 'Find the airports nearest to a caller-provided latitude/longitude, sorted by great-circle (haversine) distance with distance_km on each result.' This clearly identifies the resource (airports) and the unique value (proximity sorted by distance). It also distinguishes itself from sibling tools via the 'Related' section, naming airport_lookup as exact code/name lookup with no distance, and unlocode_lookup as named transport-location search.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when to use the tool ('pass coordinates you already hold'), when not to use it ('does NOT geocode place names and does NOT compute routes'), and names alternatives ('Related: airport_lookup... unlocode_lookup...'). It also provides practical guidance on rate limits: 'back off and retry, or call get_subscribe_link for higher limits.' This goes beyond implied usage.

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 CalculatorA
Read-onlyIdempotent
Inspect

Calculate how many identical boxes fit on a pallet: boxes per layer (trying 90-degree rotation when allowed), layer count within the max height, totals, 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; pallet_deck_height_cm defaults to 15. Missing or non-positive dimensions error naming the parameter. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

Returns: boxes_per_layer, layers, total_boxes, orientation, boxes_per_row/col, usable_height_cm, utilisation_percent, total_box_volume_cbm, wasted_space_cbm and the weight fields under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

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

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

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

Output Schema

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

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

Beyond the annotations (read-only, idempotent, non-destructive), the description adds substantial context: deterministic geometric packing, default pallet deck height of 15, error behavior on invalid dimensions, rate limiting with retry semantics, and limitations regarding real-world stacking rules. No contradictions with annotations.

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

Conciseness5/5

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

The description is well-structured into Purpose, Behavior, Returns, Limitations, and Related sections. Every sentence contributes unique information—no tautology or filler. Despite its length, it is front-loaded with the core purpose and remains scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (10 parameters, output schema present), the description is comprehensive: it covers return envelope fields, error handling, rate limiting, weight capping behavior, and limitations. Since an output schema exists, it does not need to explain every return field, but it still gives a high-level overview of the response.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds value by specifying defaults (pallet_deck_height_cm defaults to 15, allow_rotation defaults to true), explaining the effect of max_payload_kg, and noting that missing/non-positive dimensions error naming the parameter. This goes beyond the schema's basic type descriptions.

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 description opens with a specific verb and resource: 'Calculate how many identical boxes fit on a pallet' and enumerates outputs (boxes per layer, layer count, totals, volume utilisation, weight capping). It also distinguishes itself from sibling tools by naming ldm_calculator, vehicle_lookup, and container_lookup with their distinct scopes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states what the tool does not model ('does not model interlocked or mixed-orientation patterns'), when weight capping applies, and how to handle rate limits (back off, retry, or call get_subscribe_link). It also lists related tools, giving clear alternatives.

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

shipment_summaryShipment SummaryA
Read-onlyIdempotent
Inspect

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

Provide mode (road | air | sea | multimodal) and items[] (dims in cm, weight in kg, quantity; optional stackable, pallet_type, hs_code, un_number, customs_value); 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. Sections that cannot run (e.g. duty without a customs value) surface in warnings instead of failing the whole call. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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

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

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

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

Output Schema

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

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

Description discloses internal call-outs ('calls the ldm_calculator, adr_lookup and uk_duty_calculator engines directly'), the 2.40 m loading-metre divisor, the non-stackable default, palletSpaces as floor positions vs palletRows, warning instead of failure behavior, and 429 handling with retry_after_seconds. This goes well beyond the annotations and does not contradict them.

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

Conciseness5/5

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

The description is long but appropriately so for a composite tool with seven parameters and mode-specific behavior. It is well-structured with clear sections (Behavior, Returns, Limitations, Related) and each sentence carries a distinct piece of information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity—multiple modes, nested items, output schema, and several related siblings—the description is complete. It covers inputs, units, mode-specific outputs, failure behavior, rate limits, limitations, and alternative tools, making it more than sufficient for an agent to decide when and how to invoke it.

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 description coverage is 100%, but the description still adds value by grouping parameters ('items[] (dims in cm, weight in kg, quantity; optional stackable, pallet_type, hs_code, un_number, customs_value)') and explaining nuanced behavior like 'an item with no stackable flag is NOT stacked'. It also clarifies that origin/destination and incoterm refine the duty leg, which the schema does not convey as explicitly.

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 description opens with 'Composite shipment analysis in one call' and enumerates specific outputs (volume, gross/chargeable weight, road LDM, vehicle suggestion, volumetric weight, revenue tonnes, container suggestion, ADR presence, UK duty estimates). This clearly distinguishes it from single-purpose siblings like cbm_calculator 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly frames this as the composite option and names alternatives: consignment_calculator, cbm_calculator, chargeable_weight_calculator, ldm_calculator, adr_lookup, and uk_duty_calculator, noting which are called as engines and which are single-purpose equivalents. It also gives rate-limit retry guidance and references get_subscribe_link for higher limits.

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 CalculatorA
Read-onlyIdempotent
Inspect

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

Provide commodity_code (6-10 digits), 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; an unknown or non-declarable commodity code errors with HMRC's message (a 6-digit code may need extending to its 8/10-digit declarable line); origin-dependent measures the tariff cannot resolve automatically surface in warnings. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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; validity.as_of marks the live-rate timestamp; plus confidence, _source and citation (the FreightUtils v1 response envelope).

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
incotermNoIncoterm basis
freight_costNoFreight cost in GBP (default 0)
customs_valueYesCustoms value in GBP
commodity_codeYesUK tariff commodity code (6-10 digits)
insurance_costNoInsurance cost in GBP (default 0)
origin_countryYesISO 2-letter country of origin (e.g. "CN", "US")

Output Schema

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

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

Beyond the readOnlyHint/idempotentHint annotations, the description discloses live fetch behavior, deterministic arithmetic, HMRC error messages, origin-dependent warning surfacing, rate limiting details (429 retry_after_seconds and Retry-After header), and response envelope properties like validity.as_of and _source. No contradiction with annotations.

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

Conciseness5/5

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

The description is densely informative but well-structured: purpose, formula, inputs, behavior, returns, limitations, related tools. Every sentence adds functional value, and key information is front-loaded in the first sentence. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description covers all essential aspects: live data source, calculation logic, required and optional inputs, error/rate-limit behaviors, output structure, limitations, and related tools. The output schema and annotations further enrich context, but the description is fully self-sufficient.

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?

While schema coverage is 100%, the description adds critical semantic relationships: it defines CIF as customs_value + freight_cost + insurance_cost and explains how duty and VAT are calculated from these components. This goes beyond the individual parameter descriptions and clarifies how parameters interact.

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 description 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 clearly distinguishes itself from siblings by emphasizing live rates fetched per request and explicitly relating to hs_code_lookup and incoterms_lookup for different steps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage context: required vs optional parameters, formula for CIF, error scenarios, rate limits with actionable retry guidance, and alternatives like get_subscribe_link for higher limits or hs_code_lookup to find the code first. Limitations and when-not-to-use are clearly stated.

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 LookupA
Read-onlyIdempotent
Inspect

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

Provide type as an IATA code ("AKE", "PMC") or slug ("ake-ld3"); 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 valid list; per-record provenance (sources, audited_at, decision_rationale) is included. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

Returns: the ULD record (or filtered list) under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
deckNoFilter by deck position
typeNoULD code (e.g., "AKE", "PMC") or slug (e.g., "ake-ld3"). Omit to list all.
categoryNoFilter by ULD category

Output Schema

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

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

Beyond annotations (readOnlyHint, idempotentHint), the description discloses rate limits, 429 retry semantics, provenance status, data quality caveats, and the meaning of PENDING provenance. It also explains the envelope structure and pallet-specific quirks, adding substantial context without contradicting 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?

The description is thorough but verbose, running into a long block of text without clear section breaks. While front-loaded with the core purpose, it then spends many sentences on provenance and data quality nuances that, while valuable, could be condensed or structured. It earns a 3 for being overlong, not for lacking substance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (16 record types, filters, rate limits, output envelope, provenance), the description covers all critical aspects: return format, error behavior, limitations, and related tools. No significant gap remains; it even explains the envelope's provenance_status and the subtlety of corroboration counting.

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?

The schema already documents all three parameters, but the description enriches them: explains type accepts IATA codes or slugs, omit to list all, and clarifies that category/deck filter the list. It also warns that pallets lack internal dimensions, directly affecting how parameters map to data.

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 description clearly states the tool's purpose: looking up air-cargo ULD specifications, with specifics on the 16 types and their attributes. It distinguishes itself from siblings by naming related tools (chargeable_weight_calculator, container_lookup, airline_lookup) and clarifying scope (air cargo vs sea freight).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage scenarios: omit type to list all, use category/deck filters, and error handling for unknown types. It gives alternatives to related tools and advises confirming critical dimensions with the carrier. This is rich, actionable guidance for when and how to use the tool.

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

unit_converterUnit ConverterA
Read-onlyIdempotent
Inspect

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

Behavior: deterministic; the response names both units and states the formula used. Cross-dimension conversions (e.g. kg to litres) and freight targets from a non-cbm source error with the accepted-unit list. Note: short ton (US) = 2,000 lb, long ton (UK) = 2,240 lb, metric tonne = 2,204.6 lb. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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

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

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

Output Schema

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

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

Adds that the conversion is deterministic, names both units and formula in response, errors on cross-dimension conversions with an accepted-unit list, and documents rate limiting (429 with retry_after_seconds/Retry-After header) and the get_subscribe_link fallback. This is substantial context not in annotations, which only declare read-only and idempotent.

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

Conciseness5/5

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

Though long, every sentence adds essential info: unit list, special behaviors, error handling, rate limits, return envelope, and sibling guidance. It is organized in paragraphs and front-loaded with the primary purpose.

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 with three params and an output schema, the description covers intended use, edge cases, failure modes, rate limiting, response structure, and related tools. Nothing critical is left to inference.

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 100% with enums, but the description explains the special meaning of chargeable_kg (IATA 6,000 divisor, 1 CBM=166.67 kg), freight_tonnes (W/M), and the constraint that they are only valid from cbm. It also defines short/long/metric ton conversions, enriching the unit parameters.

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?

Description opens with 'Convert freight and logistics units' and enumerates weight/volume/length categories plus the two freight-specific targets. The 'Related' sentence distinguishes it from cbm_calculator and chargeable_weight_calculator, making the tool's unique scope clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names alternatives: 'cbm_calculator (dimensions to volume first), chargeable_weight_calculator (proper air billing weight with pieces and a custom divisor)'. The special-target explanation (valid only FROM cbm) clarifies when this converter is the right choice vs the dedicated calculators.

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

unlocode_lookupUN/LOCODE LookupA
Read-onlyIdempotent
Inspect

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

Provide code for an exact record, or query (name search, min 2 chars) optionally narrowed by country and function_type; limit caps results (default 20, max 100).

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 (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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

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

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

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

Output Schema

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

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false. Description adds substantial context beyond that: read-only behavior for exact code vs confidence reporting for fuzzy hits, not-found error semantics, 429 rate-limit handling with retry_after_seconds and Retry-After header, and cautions about administrative code list accuracy. No contradictions with annotations.

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

Conciseness5/5

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

Though multi-paragraph, every sentence earns its place: overview, usage modes, behavior/rate limits, return envelope, limitations, related tools. Well-structured and front-loaded with purpose. No redundant filler; the length is appropriate for the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 5 optional params, an output schema, and annotations, the description still adds essential context: return envelope specifics (confidence, _source, citation), error semantics, rate-limit handling, and realistic use limitations. It is complete enough to safely invoke the tool without prior knowledge.

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. However, description adds valuable semantics not in schema: explains the 5-character code structure (2-letter ISO + 3-letter location code with examples), clarifies query can be name or code, and states limit default/max and min length for query. This enriches parameter understanding beyond schema definitions.

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?

Description opens with a specific verb ('Search') and a precise resource (116,232 UN/LOCODE transport locations), enumerating port/airport/rail/road/terminal types. It clearly distinguishes from siblings by mentioning related airport_lookup and nearest_airport tools, making its scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: exact code vs fuzzy name query, optional country/function_type narrowing, and limit behavior. Names alternatives directly: 'Related: airport_lookup ... nearest_airport ...' and even tells users to call get_subscribe_link for higher rate limits. This is exemplary usage guidance.

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

validateFreight Identifier ValidatorA
Read-onlyIdempotent
Inspect

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

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

Behavior: deterministic check-digit arithmetic; per identifier found it reports type, the normalised form, valid (pass/fail), expected vs actual check digit, and details (container: owner prefix + equipment category; AWB: airline prefix + the operating airline resolved from the AWB-prefix dataset; IMO: the 7-digit number); text mode with no identifiers found returns an empty found[] with a note. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

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

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

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

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

Output Schema

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

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

Annotations already indicate readOnly/idempotent, so the bar is lower, but the description adds substantial behavioral context: deterministic arithmetic, per-identifier output fields, rate limits (25 req/day) with retry_after_seconds and Retry-After header, empty found[] behavior, and the structural-only limitation. This goes well beyond the annotation safety profile without contradiction.

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

Conciseness5/5

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

Organized into labeled sections (modes, behavior, returns, limitations, related) that move from purpose to operational detail. Every sentence contributes essential content—rate limits, output envelope, structural caveat, alternatives—without redundancy. The length is justified by the tool's complexity.

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?

Covers all materially relevant aspects: the two input modes, per-type validation details, output structure, error/rate-limit handling, limitations, and related tools. An output schema exists but the description still adds contextual value, making the tool fully understandable without external documentation.

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 adds meaningful mode-level semantics: text is for parse mode, value+type is for single validation, and the type enum maps to specific standards. This clarifies the mutual relationship between parameters that the schema does not express, justifying a small increment above baseline.

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 description opens with a specific verb+resource: 'Validate and parse freight identifiers by their public check-digit algorithms', naming the three identifier types. It distinguishes itself from siblings in the Related section, explicitly calling out container_lookup and airline_lookup as different in scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance with two modes (text for scanning arbitrary strings, value+type for single validation). It names alternatives (container_lookup, airline_lookup) and excludes registry/tracking use via 'STRUCTURAL ONLY'. Rate-limit handling instructions (back off/retry or get_subscribe_link) are also actionable.

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

vehicle_lookupVehicle LookupA
Read-onlyIdempotent
Inspect

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

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

Behavior: read-only; an unknown slug errors with the valid list; per-record provenance (sources, audited_at, decision_rationale) is included. Rate-limited (anonymous use: 25 requests/day per IP): a 429 error body carries retry_after_seconds and a Retry-After header — back off and retry, or call get_subscribe_link for higher limits.

Returns: the vehicle record (or filtered list) under result, plus confidence, _source and citation (the FreightUtils v1 response envelope).

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
slugNoVehicle slug (e.g., "standard-curtainsider"). Omit to list all.
regionNoFilter by region
categoryNoFilter by category

Output Schema

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

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

Beyond the readOnlyHint=true annotation, the description discloses specific error behavior ('an unknown slug errors with the valid list'), rate limiting with 429 handling and retry instructions, the response envelope (result, confidence, _source, citation), and provenance status. This goes well beyond the annotation's simple safety signal and sets expectations accurately.

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

Conciseness5/5

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

The description is structured into clear paragraphs (overview, usage, behavior, returns, limitations, related) with no redundant fluff. Each sentence adds distinct information: scope, fields, filtering, error handling, rate limits, response shape, caveats, and cross-references. It is long but every part earns its place.

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?

The tool has an output schema, but the description still explains the response envelope and provenance_status, and it notes limitations about typical specs and legal payload. Given the simple 3-optional-param API, the description covers all necessary context: what, how, when, errors, rate limits, and relationships to sibling tools.

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%, and the description adds usage semantics on top: omitting slug lists all records, while category and region filter the list. It gives a concrete slug example and enumerates allowed enum values, making parameter behavior intuitive beyond the schema's short descriptions.

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 description opens with 'Look up road-freight vehicle and trailer specifications' — a specific verb and resource — then enumerates 17 vehicle types and the data fields each record carries. It is clearly differentiated from sibling lookup tools (e.g., container_lookup, uld_lookup) by focusing on road-freight equipment and even names related calculators as alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly explains how to call it: 'Provide slug... omit it to list all 17; category... and region... filter the list.' It also provides contextual alternatives under 'Related', such as 'ldm_calculator (whether a pallet load fits)', signaling when to choose another tool. It mentions get_subscribe_link for rate-limit mitigation, giving a clear path for when this tool's limits are insufficient.

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

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Servers

  • A
    license
    -
    quality
    D
    maintenance
    Ocean container shipping intelligence for AI agents — D\&D tariffs, freight rates, vessel schedules, port congestion, inland haulage across 6 major carriers. 24 MCP tools.
    MIT
  • A
    license
    -
    quality
    B
    maintenance
    Enables AI agents to look up and validate hazardous materials shipping descriptions using public 49 CFR citations, providing structured JSON with proper shipping names, hazard classes, labels, and regulatory references.
    126
    1
    MIT
  • A
    license
    -
    quality
    D
    maintenance
    Enables AI agents to manage global shipping operations, including rate comparison, shipment creation, label purchasing, tracking, pickup scheduling, address validation, billing, and analytics, via natural language.
    30
    MIT

View all MCP Servers

Try in Browser

Your Connectors

Sign in to create a connector for this server.