Gateway Lines Tariff
Server Details
US import duty, HTS classification and tariff changes from the Gateway Lines tariff engine.
- Status
- Healthy
- Uptime
- 100.0% over 17 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 3 tools
Each tool has a broadly distinct purpose (classification, cost calculation, policy change listing), though landed_cost called with a product argument returns candidate HTS codes, which overlaps with classify_hts. The descriptions explicitly explain this two-step workflow, so the overlap is mitigated but still a potential source of misselection.
The names follow three different patterns: classify_hts (verb_noun), landed_cost (noun_noun), and policy_changes_since (noun_phrase with a parameter baked in). They remain readable and descriptive, but there is no predictable convention across the set.
Three tools is on the thin side for a tariff/import-duty domain, where agents would plausibly expect things like rate lookup or batch classification. Each tool is substantive rather than trivial, so it is borderline rather than clearly wrong.
The surface covers the core lifecycle: classify a product, compute landed cost from a code, and track policy changes. Minor gaps exist, such as a direct duty-rate lookup by code without a full landed-cost calculation or batch processing, but agents can work around these using landed_cost.
Available Tools
3 toolsclassify_htsFind HTS classification codesARead-onlyIdempotentInspect
Find the US Harmonized Tariff Schedule classification for a product. Returns candidate HTS codes with their official descriptions and base duty rates. Use when the user wants the code itself rather than a cost. Not charged: it does not use a duty lookup.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Product description, e.g. "cotton t-shirts" or "lithium ion batteries". |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | |
| query | No | |
| source | No | |
| gateway | No | |
| results | No | Candidates ranked by text match, not a classification ruling. |
| warning | No | |
| disclaimer | No | |
| guest_allowance | No | |
| guest_lookups_remaining | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds value beyond that by disclosing the return shape (multiple candidate codes with descriptions and base duty rates) and that the call is not billed, which matters for planning.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what it does, then the return value, then the routing rule and billing note. No filler and no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need only be summarized, and the description does that. For a one-parameter read-only lookup this is nearly complete; it could add a hint about how specific the product description should be, which matters for classification quality.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter with 100% schema description coverage including concrete examples, so the schema does the work. The description adds nothing about how the query string is matched (keyword vs semantic, specificity expectations), so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: find the US Harmonized Tariff Schedule classification for a product, and names the return payload (candidate HTS codes with official descriptions and base duty rates). This clearly separates it from the landed_cost sibling, which is about cost rather than the code.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use when the user wants the code itself rather than a cost" gives an explicit selection condition against the cost-oriented sibling, and the billing note clarifies it is not a charged duty lookup. It stops short of naming landed_cost directly or covering edge cases such as ambiguous product descriptions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
landed_costCalculate landed cost and import dutyARead-onlyIdempotentInspect
Calculate US import duty and landed cost estimates. Give hts_code when you know it and this returns the calculated base duty and trade actions (Section 301, Section 232, Section 338, AD/CVD and others), estimated duty, fees and import cost. When estimate_status is partial, part of the duty is undetermined (AD/CVD deposits, or a per-unit duty that needs a quantity) and the amounts are provisional; convey that the estimate is incomplete, and read duty_total_bound for whether the total is a minimum. Give product instead and it returns candidate HTS codes WITHOUT pricing, because the classification decides the duty and guessing it produces confidently wrong numbers: confirm the right code with the user, then call again with hts_code. The candidate step is not charged, and neither is the same lookup repeated within ten minutes.
| Name | Required | Description | Default |
|---|---|---|---|
| product | No | Plain description, e.g. "outdoor metal furniture". Returns candidate codes to confirm, does not price. Provide this OR hts_code. | |
| hts_code | No | Exact HTS rate line, 8 or 10 digits, e.g. "9403.20.00.50". Takes precedence over product. 4 and 6 digit headings cannot be priced. | |
| quantity | No | Optional: the quantity, for lines whose duty is charged per unit (per kg, per dozen, per pair and so on). Without it that part of the duty is not priced and the total is a minimum. Send with quantity_unit. | |
| entry_date | No | Optional: the date the goods will be entered, YYYY-MM-DD (US Eastern time), today or later. Default today. | |
| country_code | Yes | ISO 2-letter country of ORIGIN (where the goods were made), e.g. "CN", "CA", "VN". | |
| quantity_unit | No | Optional, with quantity: kg, g, lb, each, dozen, pair, liter, m, m2, m3, cm, gross, head or barrel. Must be the unit the duty is charged in (duty_breakdown.base_duty.unit); convert first if it differs. | |
| shipment_mode | No | Optional: "ocean" (default), "air" or "truck" (a land border crossing from Canada or Mexico). Affects government fees only: only ocean pays the harbor maintenance fee and files an ISF. | |
| declared_value | Yes | Customs value of the shipment in USD. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fta | No | A free trade agreement rate the goods may qualify for. Not applied to the total; it requires a claim and proof of origin. |
| note | No | |
| source | No | |
| country | No | Country of origin, as resolved. |
| gateway | No | Guest tier only. |
| message | No | |
| hts_code | No | The HTS line the duty was calculated on. |
| quantity | No | Quantity used to price a per-unit duty, when one was given. |
| warnings | No | |
| candidates | No | Candidate HTS lines to confirm, present only when needs_classification is true. |
| disclaimer | No | Planning estimate, not a customs ruling. Pass this on to the user. |
| description | No | Official description of that line. |
| usmca_claim | No | Canada and Mexico: the duty with a USMCA claim, which needs the agreement's rules of origin to be met. The main figure is priced WITHOUT a claim; show this beside it, never in place of it. |
| service_fees | No | Filing and handling charges such as ISF. Not government fees; CBP charges nothing to receive an Importer Security Filing. |
| quantity_unit | No | Unit of that quantity, or the unit the per-unit duty is charged in. |
| adcvd_supplier | No | Supplier deposit evidence when supplied by the calculation: reviewed entry date, matched legal identities, rules, effective windows, official sources, and cases actually included. A matched case does not establish complete all-orders coverage. |
| declared_value | No | Customs value used, in USD. |
| duty_breakdown | No | Every trade action considered, keyed by authority (base_duty, section_301, section_232, section_338_canada and the rest). Each carries rate, applies, and often a reason and legal reference. An action with applies false and upcoming true is scheduled but not yet owed. |
| policy_notices | No | Source-backed scope and supplier notices affecting use of this estimate. |
| total_duty_usd | No | Calculated duty estimate in USD. When estimate_status.status is partial, this is provisional and is not the complete payable duty; duty_total_bound says whether it is a minimum. |
| duty_total_note | No | Present when duty_total_bound is not exact. Pass it to the user. |
| estimate_status | No | A partial status means part of the duty is undetermined (AD/CVD deposits, or a duty that needs a quantity) and this estimate is incomplete. Pass its message to the user; a zero calculated AD/CVD component does not establish zero liability. |
| government_fees | No | MPF and HMF, the fees CBP actually collects. |
| guest_allowance | No | Guest tier only: the allowance in words. |
| duty_total_bound | No | exact: every part of the duty is priced (AD/CVD notices may still make it provisional). at_least: a per-unit part is unpriced, so the total is a minimum; give quantity and quantity_unit to price it. unknown: a part is unpriced and the AD/CVD figure may overstate, so the total is neither complete nor a minimum. |
| total_duty_rate_pct | No | Calculated duty estimate as a percentage of declared value. Read estimate_status before describing this as a complete estimate. |
| usmca_auto_232_note | No | Canada and Mexico vehicles and parts: how a USMCA claim changes the Section 232 auto duty. |
| needs_classification | No | True when a product description was given instead of a code. Nothing was priced and nothing was charged; show the candidates and ask the user to confirm. |
| total_import_cost_usd | No | Calculated duties plus government and service fees, excluding merchandise and freight. Provisional when estimate_status is partial. |
| guest_lookups_remaining | No | Guest tier only: priced duty lookups left in the rolling 7 days. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses billing behavior, the caching window, and the crucial caveat that partial estimates are provisional with duty_total_bound indicating a minimum. That is real operational context an agent needs before presenting numbers to a user, not a restatement of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and the hts_code-vs-product fork are front-loaded, and every sentence carries content (modes, caveats, billing). It is dense and slightly run-on, packing the estimate_status and duty_total_bound caveats into one long clause, which costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With eight parameters, an output schema, and full annotation coverage, the remaining risk is interpretive rather than structural — and the description covers the two failure modes that matter (unpriced classification guesses and partial/provisional totals). An agent has enough to call this correctly and to report results honestly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds cross-parameter meaning the schema can't easily convey: hts_code takes precedence over product, product never returns prices, and quantity/quantity_unit must match the unit the duty is charged in. It adds workflow-level semantics rather than duplicating field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource (calculate US import duty and landed cost estimates), and the body clarifies the two operating modes: priced lookup by hts_code vs. unpriced candidate HTS codes by product. It never names the sibling classify_hts, even though the product-to-candidates path overlaps with it, so sibling differentiation is implied rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing rules: supply hts_code when known, supply product to get candidates, then confirm with the user and call again with hts_code. It also explains why guessing is harmful ('produces confidently wrong numbers') and how to interpret a partial result, plus cost conditions (candidate step free, repeats within ten minutes free).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
policy_changes_sinceList US trade policy changesARead-onlyIdempotentInspect
List US trade policy changes Gateway has published since a given date: new tariff actions, rate changes, effective dates and expirations, each with its official source. Also returns, under upcoming, earlier entries for changes announced or proposed but not yet in force. Use to answer "what changed recently" or "what is coming". Not charged: it does not use a duty lookup.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max entries to return, default 10, max 50. | |
| since | No | ISO date, e.g. "2026-07-01". Filters on when Gateway PUBLISHED the change. Defaults to 30 days ago. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | |
| since | No | The date filtered on, ISO. |
| source | No | |
| changes | No | |
| gateway | No | |
| upcoming | No | Entries published BEFORE `since` that are still pending or monitoring, newest first, so "what is coming" is answerable whatever date is asked about. |
| disclaimer | No | |
| guest_allowance | No | |
| guest_lookups_remaining | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnly/idempotent/non-destructive/openWorld, so the description needn't restate safety. It adds genuinely new behavior: a separate "upcoming" block containing entries announced or proposed but not yet in force (so results include non-effective items), sourcing per entry, and a cost note ("Not charged"). It stops short of describing volume/pagination behavior beyond limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the purpose and scope front-loaded, followed by the non-obvious "upcoming" behavior and the cost/boundary note. No filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return formatting needn't be explained, and the description still flags the non-obvious shape of the result (an "upcoming" group separate from in-force changes). Parameters, usage triggers, cost, and sibling boundary are all covered for a simple two-optional-param read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters are documented there, including default 30 days and max 50. The description reinforces that "since" filters on Gateway's PUBLISH date rather than effective date, but that distinction already appears in the schema, so it adds little beyond the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List US trade policy changes") plus the scope constraint ("since a given date") and enumerates exactly what each entry contains: tariff actions, rate changes, effective dates/expirations, official source. The closing "does not use a duty lookup" separates it from the duty-oriented siblings landed_cost and classify_hts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives two concrete question shapes it answers ("what changed recently", "what is coming") and signals the sibling boundary by noting it does not perform a duty lookup, pointing agents to the cost/HTS tools for that need. No inference is required to select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
- Changed
classify_hts1 field changed- added
Output schema / properties / guest_allowanceAdded value: +{ + "type": "string" +}
- Changed
landed_cost13 fields changed- added
Input schema / properties / quantityAdded value: +{ + "description": "Optional: the quantity, for lines whose duty is charged per unit (per kg, per dozen, per pair and so on). Without it that part of the duty is not priced and the total is a minimum. Send with quantity_unit.", + "type": "number" +} - added
Input schema / properties / quantity_unitAdded value: +{ + "description": "Optional, with quantity: kg, g, lb, each, dozen, pair, liter, m, m2, m3, cm, gross, head or barrel. Must be the unit the duty is charged in (duty_breakdown.base_duty.unit); convert first if it differs.", + "type": "string" +} - added
Output schema / properties / duty_total_boundAdded value: +{ + "description": "exact: every part of the duty is priced (AD/CVD notices may still make it provisional). at_least: a per-unit part is unpriced, so the total is a minimum; give quantity and quantity_unit to price it. unknown: a part is unpriced and the AD/CVD figure may overstate, so the total is neither complete nor a minimum.", + "enum": [ + "exact", + "at_least", + "unknown" + ], + "type": "string" +} - added
Output schema / properties / duty_total_noteAdded value: +{ + "description": "Present when duty_total_bound is not exact. Pass it to the user.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / estimate_status / descriptionPrevious value: -"A partial status means AD/CVD is undetermined and this estimate is incomplete. Pass its message to the user; a zero calculated AD/CVD component does not establish zero liability."New value: +"A partial status means part of the duty is undetermined (AD/CVD deposits, or a duty that needs a quantity) and this estimate is incomplete. Pass its message to the user; a zero calculated AD/CVD component does not establish zero liability." - added
Output schema / properties / ftaAdded value: +{ + "description": "A free trade agreement rate the goods may qualify for. Not applied to the total; it requires a claim and proof of origin.", + "type": [ + "object", + "null" + ] +} - added
Output schema / properties / guest_allowanceAdded value: +{ + "description": "Guest tier only: the allowance in words.", + "type": "string" +} - changed
Output schema / properties / guest_lookups_remaining / descriptionPrevious value: -"Guest tier only."New value: +"Guest tier only: priced duty lookups left in the rolling 7 days." - added
Output schema / properties / quantityAdded value: +{ + "description": "Quantity used to price a per-unit duty, when one was given.", + "type": [ + "number", + "null" + ] +} - added
Output schema / properties / quantity_unitAdded value: +{ + "description": "Unit of that quantity, or the unit the per-unit duty is charged in.", + "type": [ + "string", + "null" + ] +} - changed
Output schema / properties / total_duty_usd / descriptionPrevious value: -"Calculated duty estimate in USD. When estimate_status.status is partial, this is provisional and is not the complete payable duty."New value: +"Calculated duty estimate in USD. When estimate_status.status is partial, this is provisional and is not the complete payable duty; duty_total_bound says whether it is a minimum." - added
Output schema / properties / usmca_auto_232_noteAdded value: +{ + "description": "Canada and Mexico vehicles and parts: how a USMCA claim changes the Section 232 auto duty.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / usmca_claimAdded value: +{ + "description": "Canada and Mexico: the duty with a USMCA claim, which needs the agreement's rules of origin to be met. The main figure is priced WITHOUT a claim; show this beside it, never in place of it.", + "type": [ + "object", + "null" + ] +}
- Changed
policy_changes_since9 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max entries to return, default 20, max 50."New value: +"Max entries to return, default 10, max 50." - added
Output schema / properties / changes / items / properties / affectsAdded value: +{ + "description": "The products or goods affected.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / changes / items / properties / impact / descriptionAdded value: +"Gateway's risk rating for importers." - added
Output schema / properties / changes / items / properties / policy_type / descriptionAdded value: +"The trade authority, e.g. Section 232 or Section 301." - added
Output schema / properties / changes / items / properties / source_nameAdded value: +{ + "description": "The official source, e.g. a Federal Register document or CBP CSMS message.", + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / changes / items / properties / source_urlAdded value: +{ + "type": [ + "string", + "null" + ] +} - added
Output schema / properties / changes / items / properties / status / descriptionAdded value: +"implemented (in force), pending (announced, not yet in force), monitoring (proposed or under review), suspended, removed, reaffirmed or new." - added
Output schema / properties / guest_allowanceAdded value: +{ + "type": "string" +} - added
Output schema / properties / upcomingAdded value: +{ + "description": "Entries published BEFORE `since` that are still pending or monitoring, newest first, so \"what is coming\" is answerable whatever date is asked about.", + "items": { + "properties": { + "affects": { + "description": "The products or goods affected.", + "type": [ + "string", + "null" + ] + }, + "countries": { + "type": [ + "string", + "array", + "null" + ] + }, + "effective": { + "description": "Free text as published, e.g. \"In effect for goods entered on or after...\". Not a date and not parseable as one.", + "type": [ + "string", + "null" + ] + }, + "impact": { + "description": "Gateway's risk rating for importers.", + "type": [ + "string", + "null" + ] + }, + "policy_type": { + "description": "The trade authority, e.g. Section 232 or Section 301.", + "type": [ + "string", + "null" + ] + }, + "published": { + "description": "When Gateway published the entry. This is what `since` filters on.", + "type": [ + "string", + "null" + ] + }, + "source_name": { + "description": "The official source, e.g. a Federal Register document or CBP CSMS message.", + "type": [ + "string", + "null" + ] + }, + "source_url": { + "type": [ + "string", + "null" + ] + }, + "status": { + "description": "implemented (in force), pending (announced, not yet in force), monitoring (proposed or under review), suspended, removed, reaffirmed or new.", + "type": [ + "string", + "null" + ] + }, + "title": { + "type": "string" + }, + "what_changed": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" +}
1 tool update
- Changed
landed_cost1 field changed- changed
Input schema / properties / shipment_mode / descriptionPrevious value: -"Optional: \"ocean\" (default) or \"air\". Affects government fees only."New value: +"Optional: \"ocean\" (default), \"air\" or \"truck\" (a land border crossing from Canada or Mexico). Affects government fees only: only ocean pays the harbor maintenance fee and files an ISF."
1 tool update
- Changed
landed_cost1 field changed- added
Input schema / properties / entry_dateAdded value: +{ + "description": "Optional: the date the goods will be entered, YYYY-MM-DD (US Eastern time), today or later. Default today.", + "type": "string" +}
3 tool updates
- First observed
classify_hts - First observed
landed_cost - First observed
policy_changes_since
Related MCP Connectors
US import duty and HTS codes from the official USITC schedule, plus Section 301 China status. Free.
US HTS search, origin-specific duty breakdowns, tariff sources and missing-fact guidance.
US import tariff lookup against the official USITC Harmonized Tariff Schedule
Dated US import facts: CBP rulings, Section 301 ladder, landed cost, rule changes, recalls.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides access to US import tariff rates via the USITC Harmonized Tariff Schedule, enabling natural language queries for tariff data.464 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables US import compliance by providing CBP customs ruling letter searches and antidumping/countervailing duty order lookups, answering how Customs has classified products and whether trade-remedy duties apply.193 npmMIT
- AlicenseBqualityAmaintenanceTurns your AI assistant into a US import duty research tool, enabling HTS code lookup, landed-cost calculation, and tariff change tracking using official USITC data.549 npm3MIT
- AlicenseAqualityCmaintenanceLive US import tariff calculator covering 19,856 HTS codes, allowing AI to look up stacked tariff rates and project the November 10, 2026 cliff impact on any product.2668 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.