MCP HeartbeatTHE MCP OBSERVATORY
Public workspace

Explore

Evidence for your next connection.

Independent measurements of remote MCP servers. Every observation has a timestamp.

Read-only probes

MCP server · Data access / search

Fortitude21 Dangerous Goods and Packaging Tools

Dangerous goods packaging calculators plus search and quote tools for Fortitude21's container range

Checks passed
13 / 22

1 failed · 8 not measured

Median response
188 ms

Median of successful probes over 7 days

30-day uptime
Not measured

Share of countable probes over 30 days, including daily rollups. Auth challenges are excluded.

Discovered tools
14

Tool definitions returned by this server

Independent monitoring

Health & checks

Status history

Outdated check

Last connection measurement is over 24 hours old. Current availability is unknown.

Last checked
Check summary by test group
Test areaPassedFailedUnmeasured
ConnectionCan a client connect and discover tools?
500
Reliability & speedDoes it respond consistently and quickly?
004
Access & authenticationWhat is required to use this server?
102
Tool qualityAre the tool definitions usable by an agent?
400
Publisher identityCan the publisher be traced to its source?
312

Unmeasured means there is not enough evidence to decide. How these checks work

Inspect individual checks 22 recorded

Core

  • Pass
    Reachable

    Latest probe returned HTTP 200 in 188 ms.

  • Pass
    Valid handshake

    protocolVersion 2025-06-18, serverInfo.name fortitude21-dangerous-goods.

  • Pass
    Lists tools

    tools/list returned 14 tools.

  • Pass
    Current protocol

    Negotiated 2025-06-18. The bar is 2025-06-18 or newer.

  • Pass
    HTTPS

    The endpoint URL is https.

Performance

  • Not measured
    Fast (p50)

    Median latency 188 ms over 1 samples in 7 days. The bar is 1000 ms. Need at least 5 samples.

  • Not measured
    Consistent (p95)

    95th percentile 188 ms over 1 samples in 7 days. The bar is 3000 ms. Need at least 20 samples.

  • Not measured
    Reliable (uptime)

    1 of 1 attempts returned a tool list in 30 days (100%). The bar is 99%. Need at least 30 samples.

  • Not measured
    Stable tool list

    Fewer than two successful probes in 30 days, so tool-list stability is not measured.

Access

  • Pass
    Open access

    tools/list succeeded with no credential, and the record declares none.

  • Not measured
    Standard auth

    Auth is not required, so the OAuth metadata check does not apply.

  • Not measured
    Free tier cited

    No publisher quote has been checked.

Tools

  • Pass
    Tools described

    Every tool description is at least 20 characters.

  • Pass
    Valid input schemas

    Every inputSchema is a JSON Schema object.

  • Pass
    Parameters documented

    70 of 70 parameters have a description (100%). The bar is 80%.

  • Pass
    Safety hints

    Every tool sets readOnlyHint or destructiveHint.

Publisher

  • Pass
    Verified namespace

    Listed in the Official MCP Registry.

  • Pass
    Website matches publisher

    The website host matches the reverse-domain namespace.

  • Fail
    Source repo linked

    No repository URL is on file.

  • Not measured
    Repo owner matches

    This namespace is not an io.github login, so the owner comparison does not apply.

  • Pass
    Recently updated

    Updated 2026-11-05T05:12:53.382818Z, within 180 days.

  • Not measured
    Open-source licence

    No GitHub repository to ask about a licence.

Start using Fortitude21 Dangerous Goods and Packaging Tools

Connect to this server

Choose your client, copy the configuration, then enable the server in your client’s MCP settings.

Run this command in your terminal, then restart Claude Code.

Claude Code

claude mcp add --transport http fortitude21-dangerous-goods-and-packaging-tools https://fortitude21.com/mcp

Capabilities

Tools 14

adr_1000_points

Total the ADR 1.1.3.6 points for a road load of dangerous goods and say whether it stays within the small-load exemption, and what still applies if it does. Use when: the user asks whether a vehicle load needs full ADR. Instead: un_number_packaging for container rules; bund_size for storage. Inputs: one line per substance and package size, so the same UN number in two package sizes is two lines. packing_group matters only where a UN number has entries in more than one transport category, such as UN 1263 paint; without it those lines are refused with the entries to choose from. Points are quantity_per_package times packages times the category multiplier: 50 for category 1, 3 for category 2, 1 for category 3 and 0 for category 4. A category 0 substance needs full ADR at any quantity. Behaviour: covers 92 UN numbers. If any line cannot be read, the whole load is refused with a reason per line and never totalled without it. An exempt load still carries duties, listed in still_required. Unknown arguments are ignored and named in assumed. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
bund_size

Work out the minimum sump capacity for a bund or spill pallet under the containment rule where the containers are stored, and name the rule. Use when: sizing a spill pallet, bund or drip tray. Instead: ibc_inspection_dates for IBC tests; un_number_packaging for container approval. Inputs: count only the containers stored together over one bund; size separate stores in separate calls. Give at least one count: drums, ibcs, small and other add up, and small and other each need their size. liquid and mode=tray can change which rule applies. With no region the rule for England is used; a country without its own rule gets the common 110% and 25% rule; both are noted in assumed. Behaviour: the rule comes labelled as law, code, guidance or practice, so say which when advising. A region it cannot read returns ok:false with the 16 region codes, and a count without its size returns ok:false naming the size. Unknown arguments are ignored and named in assumed. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
check_product_requirements

Report what Fortitude21 publishes about one product's certification: the exact scope of any UN status, its cautions, the documents that exist and what a quotation still needs. Use when: about to quote or ship a specific product. Instead: un_number_packaging, adr_1000_points, bund_size or decode_un_packaging_mark for the regulations themselves; the response names them. Inputs: only sku is required, read as in get_product_details. destination_market and intended_contents only shorten information_still_needed, since each one left out is listed there; neither is checked against any rule. To learn whether the contents are dangerous goods, call un_number_packaging with their UN number. Behaviour: it states what the publisher says, not what a market requires, and does not confirm that Fortitude21 holds a certificate: UN approval is granted per design type and plant. An unknown sku returns ok:false. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
compare_products

Compare two to six Fortitude21 products on the attributes they publish. Use when: the user is choosing between products already found with search_products. Instead: get_product_details for one product in full. Inputs: each entry in skus may be a slug, a product part number or the part number of one size, mixed freely; a size stands for its whole product. Products come back in the order given. Behaviour: rows every product has a value for go in comparable; rows some products lack go in partial, naming them, so a blank is never read as a worse figure. It does not rank or recommend: which product suits depends on the contents, the destination market and the order. Fewer than two skus or more than six returns ok:false, and an unknown one returns ok:false with not_found. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
create_quote_request

Send a quotation request for one or more Fortitude21 products to a person who prices it, and get a reference back. Use when: the buyer wants a quotation and has agreed to share their contact details. Instead: get_product_pricing for indicative terms without contacting anyone. Inputs: consent must be true and means the buyer agreed, not the agent. A quantity under the minimum order is recorded, not refused. Without a destination (delivery_destination or country) or incoterms the request is still sent, and the gaps come back in missing_information. A required_date not written as YYYY-MM-DD refuses the request. Behaviour: writes and is not idempotent. Each call stores an enquiry and emails it to Fortitude21's sales team, who reply by email, usually within one working day, so two calls send two requests. It never creates an order or accepts a price. An unknown sku or missing consent refuses the whole request. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
decode_un_packaging_mark

Decode a UN packaging mark part by part: packaging code, performance level, density or gross mass, test pressure, year, state and maker, for packagings, IBCs, large packagings, salvage and reconditioned marks. Use when: the user has read a mark off a drum, jerrican, box or IBC. Instead: un_number_packaging to find which codes a substance may use; ibc_inspection_dates for an IBC's test dates. Inputs: mark alone decodes. Adding un also checks, against ADR 2025 Table A, whether that container may carry that substance, using the density limit printed in the mark. A bare code such as 3H1 decodes to its meaning only. If the user has not read the mark, ask for it rather than describing the container. Behaviour: text it cannot read as a mark returns ok:false, and only the first 120 characters are read. If un is not one of the 157 covered numbers, the mark still decodes and check carries the error. Unknown arguments are ignored and named in assumed. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
get_product_categories

List the twelve Fortitude21 product categories with their slugs, taglines and product counts, in two families. Use when: you need a category slug for search_products, or want to show the user the range. Instead: search_products to list the products themselves. Inputs: family limits the list to one family; any other value returns ok:false with valid_families. Behaviour: the list changes only when the catalogue does. Each product has one home category and may be cross-listed into others, so listed_count can exceed product_count. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
get_product_details

Get the complete published record for one Fortitude21 product. Use when: the user needs the specifications, sizes, part numbers or images of one product, usually after search_products. Instead: get_product_pricing for commercial terms; get_product_documents for certificates; check_product_requirements for what a quotation still needs. Inputs: sku takes the product slug, with or without its product- prefix, the product part number, or the part number of one size, which returns the whole product that size belongs to. Letter case is ignored. Returns: product with identity, typed specifications and the source of each figure, the spec table, orderable units with their part numbers, size and model tables, images, documents available on request and pricing. Behaviour: a figure the factory has not supplied comes back as available on request, never left out, so an absent value is not read as zero. Any price in the record is indicative, never a quotation. An unknown sku returns ok:false with example ids and a search link. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
get_product_documents

List which documents exist for one Fortitude21 product and how to request them. Use when: the user asks for a certificate, test report, mill certificate, food-contact declaration, specification sheet or drawing. Instead: check_product_requirements for the scope of a UN status and what a quotation needs; get_product_details for specifications. Inputs: sku is read as in get_product_details; the part number of one size returns the documents for its whole product. Behaviour: it requests nothing itself; following request_url is the buyer's step. hosted is usually empty, because documents are issued against a specific design and production run. Each document says when it applies: a UN certificate only where the design carries one, a mill certificate for a stainless grade, a food-contact declaration where the product is specified for food or drinking water. An unknown sku returns ok:false with example ids. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
get_product_pricing

Get the published commercial terms for one Fortitude21 product: pricing type, currency, minimum order, quantity bands with any approved indicative unit price, validity, Incoterms and lead time. Use when: the user asks about price, minimum order or lead time for a known product. Instead: create_quote_request for an actual quotation; search_products with pricing_type to find products by pricing model. Inputs: sku is read as in get_product_details. Without quantity it returns every band. With quantity it also returns the band that covers it; below the minimum order no unit price is given and assumed says so; a quantity in the top band returns a quotation band rather than a price. A quantity under 1 returns ok:false. Behaviour: any price is indicative, never a quotation: binding is always false, and prices exclude freight, duty and taxes. Products priced on request return no number. An unknown sku returns ok:false with example ids. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
ibc_inspection_dates

Work out when an IBC (intermediate bulk container) is due for its leakproofness test and its 2.5-year and 5-year inspections, the last month it may be filled and, for plastic and composite IBCs, the end of its five-year life. Use when: the user asks whether an IBC is in date or may still be filled. Instead: decode_un_packaging_mark to read the rest of an IBC mark; bund_size to size spill containment under IBCs. Inputs: mark alone is enough, since the code and month of manufacture are read from it. Otherwise send made, plus code if known; without code a composite 31HA1 tote is assumed. leak and insp move the due dates on from the last test; without them every date counts from manufacture. bottle restarts the five-year life of a remanufactured composite. A full date is read only when its day cannot be mistaken for the month. regime=us has no five-year life. Behaviour: dates are judged against the current month, so the same IBC moves from ok to soon to overdue as time passes. Every default is listed in assumed; an unreadable date or code returns ok:false. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
jerry_can_quantity

Work out how much water or fuel to hold, with a margin, and how many jerry cans and 20 ft containers that takes. Use when: planning an emergency water store, or fuel for a trip, boat, generator or machinery. Instead: un_number_packaging for transport rules. Water (the default): people times days times the scenario's litres a person a day. Rates: relief 15 (Sphere minimum, the default); acute 7.5; protracted 50; survival 3; national advice nl, se and dk 3, no 2.86, fi and de 2; custom takes rate. National scenarios also supply a household of 4 and their own days when those are left out. Fuel (mode=fuel, or set by any fuel input): road and overland work from distance and consumption, and returnTrip=1 adds the way back on overland. marine, agri and generator work from hours and consumption; generator also takes kva and load instead of consumption. Hours or kva with no scenario selects generator. units=us switches to miles, mpg and US gallons. Either mode: volume with no scenario is the amount to hold. reserve sets the margin; by default 10% for water and 0 to 50% by fuel scenario. Behaviour: a missing people, days, distance or hours returns ok:false with needs naming it; no demo figure is substituted. A defaulted consumption, household or period is noted in assumed, and so are unknown arguments. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
search_products

Search the Fortitude21 catalogue of liquid containment: jerry cans, pails, tins, drums, spill pallets, closures and handling equipment in steel, stainless, aluminium, tinplate and UN-rated HDPE. Use when: finding products that fit a need. Then: get_product_details for one record, compare_products for two to six, get_product_pricing for terms, create_quote_request to ask for a price. Inputs: q and every filter combine with AND, so each one narrows the result. q expands synonyms, such as bund for spill pallet, and words no product mentions are named in query.terms_no_product_mentions so they can be dropped. category also takes the exact category name. application matches words in the product's listed uses. certification=UN matches any product with a UN status that is not excluded; a design code must appear in that status. sort defaults to relevance with q and to name without. Behaviour: a product with no recorded value for a filtered attribute is left out rather than assumed to match, so an empty result means nothing meets every condition: drop a filter and search again. An unknown category, pricing_type or sort returns ok:false listing the valid values. Results are summaries; get_product_details has the full record. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered
un_number_packaging

Find which UN-approved packagings may carry a dangerous liquid under ADR 2025 Table A and its packing instructions. Use when: the user has a UN number from section 14 of a safety data sheet, or a substance name, and asks what it can travel in and how large. Instead: decode_un_packaging_mark to read a mark already on a container; adr_1000_points to test a vehicle load. Inputs: send un or name. If both arrive, un wins and name is not read. name is a case-insensitive substring search over proper shipping names and common names and needs at least 3 characters, so a broad word such as "acid" returns up to 20 candidates to choose from. Where one candidate is the everyday meaning (petrol: UN 1203, paint: UN 1263), that entry is answered and the other matches are listed in assumed. Behaviour: covers 157 liquids for road transport under ADR; sea (IMDG Code) and air (IATA) rules can differ. An uncovered number returns ok:false with covered_un_numbers, and a name with no match returns ok:false asking for the number. A number with several Table A rows (packing groups or variants) returns each as its own entry, so choose by the packing group on the safety data sheet. Unknown arguments are ignored and named in assumed. Constraints: no authentication, key or headers. At most 10 requests per 10 seconds per IP address; above that HTTP 429, so space out repeated calls.

Discovered

Recent measurements

Probe history

View status
Latest stored probes. Raw probe rows are kept for 14 days.
CheckedResultResponseTools
Connected188 ms14