TL;DR
- One MCP endpoint:
POST https://mcp.tandom.ai/mcp. JSON-RPC 2.0, MCP protocol version 2024-11-05, auth viaAuthorization: Bearer tk_live_.... A no-auth public endpoint atcompliance.tandom.ai/api/mcpexposes the four HTS catalog tools for testing without an account. - The AD/CVD tool:
tandom_adcvd_checktakeshtsCode,countryOfOrigin, andentryDate; returns an array of matched orders with case numbers, types (AD or CVD), product descriptions, parsed rates, and full scope text. The same structured response that powers the Tandom AD/CVD catalog atcompliance.tandom.ai/adcvd-catalog. - Claude Desktop wiring: add a streamable-http connector entry pointing at
mcp.tandom.ai/mcpinclaude_desktop_config.json, restart, and Claude routes natural-language AD/CVD questions to the tool automatically. Claude Code accepts the same connector viaclaude configor a project.mcp.json. - Worked example below: ask Claude "is HTS 7318.15.50.90 from China subject to AD/CVD?" and watch the tool-use trace. The MCP request hits the live Tandom DB, returns four matched orders (A-570-932, A-570-104, C-570-105, A-570-909), and Claude writes a broker-grade synthesis with scope-by-scope guidance.
What is Model Context Protocol
Model Context Protocol (MCP) is the open JSON-RPC spec, published by Anthropic at modelcontextprotocol.io, that defines how an AI agent discovers and invokes external tools. It standardizes three things: how an agent asks a server what tools exist (tools/list), how it calls one (tools/call), and how the server replies. Everything else is regular JSON-RPC 2.0 over HTTP.
For trade compliance, the practical impact is that any MCP-spec client (Claude Desktop, Claude Code, in-house agents built on any LLM that supports MCP) can call Tandom's HTS, duty, and AD/CVD surface with no custom integration. The broker workstation, the internal compliance assistant, the in-app chat in a TMS, all discover the same tool list from the same endpoint.
The wire protocol is plain HTTP plus JSON. There is nothing model-specific about the server. Any MCP client can call it, including agents you build yourself in Python, TypeScript, or anything that can POST JSON.
Tandom MCP endpoints
Two endpoints. Pick the one that matches your auth situation.
Authenticated (full surface)
POST https://mcp.tandom.ai/mcp Authorization: Bearer tk_live_... Content-Type: application/json
Full tool surface: HTS catalog, duty calculation, AD/CVD, Chapter 99, PGA, regulatory data status, and closed-beta classification and customs-form generation. This is what a production integration uses.
Unauthenticated (HTS catalog free tier)
POST https://compliance.tandom.ai/api/mcp Content-Type: application/json
Same wire protocol, smaller tool list. Exposes lookup_hts_code, search_hts_codes, list_chapters, and get_chapter_codes without an API key. Useful for kicking the tires before signing up. AD/CVD, duty, and Chapter 99 tools require the authenticated endpoint.
Discover the tool list
A GET on the no-auth endpoint returns a machine-readable manifest with every tool name, description, input schema, and status (available, closed-beta). The same manifest is available on the authenticated endpoint with a Bearer token.
curl -sS https://compliance.tandom.ai/api/mcp | jq '.tools[].name'
Tool surface
The MCP server wraps the public REST API. Tool names and arguments map cleanly to REST endpoints under /v1/. The server is a thin JSON-RPC adapter, not a separate engine.
HTS catalog (free, no auth)
lookup_hts_code: full tariff profile for a US HTS code. Returns rates, Section 232 / 301 flags, AD/CVD presence, trade programs, PGA flags, related codes.search_hts_codes: keyword or prefix search across the schedule, with chapter filter and limit.list_chapters: all 22 sections plus chapter ranges.get_chapter_codes: hierarchical dump of one chapter.
Duty and trade-action (auth required)
tandom_duty_calculate: full landed-duty stack for an HTS line. WrapsGET /v1/duty/calculate.tandom_pga_check: Partner Government Agency flags and required documents.tandom_chapter99_applicable: applicable Chapter 99 additional duties and exclusions for HTS plus origin plus date.tandom_hts_search,tandom_hts_notes,tandom_hts_hierarchy: REST-API parity for HTS lookups, notes, and hierarchy traversal.
AD/CVD intelligence (auth required)
tandom_adcvd_check: returns matches against the active AD/CVD order list for a given HTS code, country, manufacturer or exporter, and entry date. WrapsGET /v1/adcvd/check.tandom_adcvd_orders_search: keyword or case-number search across the order list.tandom_adcvd_rates_at: rates for an order plus company plus effective date, with cash-deposit context.tandom_adcvd_report_lookup: structured AD/CVD intelligence for an existing report lookup.
Regulatory data and closed-beta tools
tandom_regulatory_status: freshness and version information for every regulatory data source feeding the engine.tandom_classify/tandom_classify_report(closed beta): HTS classification with GRI reasoning and reasonable-care report.tandom_forms_cbp7501(closed beta): CBP 7501 entry-summary draft from line data.tandom_monitor_catalog,tandom_quote_landed_cost(closed beta): catalog monitoring and quote-time landed-cost estimates.
Install in Claude Desktop
Three steps. The Anthropic docs at modelcontextprotocol.io cover the file location per platform; Tandom's connector slots in like any other streamable-http server.
1. Open the Claude Desktop config
On macOS: ~/Library/Application Support/Claude/claude_desktop_config.json. On Windows: %APPDATA%\Claude\claude_desktop_config.json. Create the file if it does not exist.
2. Add the Tandom connector entry
{
"mcpServers": {
"tandom": {
"transport": "streamable-http",
"url": "https://mcp.tandom.ai/mcp",
"headers": {
"Authorization": "Bearer tk_live_REPLACE_ME"
}
}
}
}3. Restart Claude Desktop
Quit and re-open Claude Desktop. The Tandom tools appear in the connector picker. Claude routes any natural-language AD/CVD, HTS, or duty question to them automatically; you do not need to name the tool by hand.
Claude Code wiring (optional)
For Claude Code, run claude mcp add tandom https://mcp.tandom.ai/mcp with your API key passed as a header, or commit a project-level .mcp.json with the same shape as the Desktop config. The connector then loads on every Claude Code session in that project.
Custom MCP clients
If you build your own AI agent in Python, TypeScript, or any stack that can POST JSON, the wire protocol is the same. Send a tools/list JSON-RPC call to discover tools, send tools/call with a tool name and arguments to invoke one. Reference clients in modelcontextprotocol on GitHub show the pattern.
Worked example
A real call against the live Tandom MCP server. Inputs: HTS 7318.15.50.90 (Studs of iron or steel, Other), country of origin China, entry date April 15, 2026.
1. Discover the tool list
curl -sS -X POST https://mcp.tandom.ai/mcp \
-H "Authorization: Bearer tk_live_..." \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}'The response carries every available tool with its input schema. The tandom_adcvd_check entry looks like this (trimmed):
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"tools": [
...,
{
"name": "tandom_adcvd_check",
"title": "Check AD/CVD Exposure",
"description": "Check whether a product, HTS code, country, manufacturer, or exporter may be subject to antidumping or countervailing duty orders.",
"inputSchema": {
"type": "object",
"properties": {
"htsCode": { "type": "string" },
"countryOfOrigin": { "type": "string" },
"entryDate": { "type": "string" },
"manufacturer": { "type": "string" },
"exporter": { "type": "string" }
},
"required": ["countryOfOrigin"]
},
"annotations": {
"readOnlyHint": true,
"destructiveHint": false,
"openWorldHint": false
}
},
...
]
}
}2. Call the AD/CVD lookup
curl -sS -X POST https://mcp.tandom.ai/mcp \
-H "Authorization: Bearer tk_live_..." \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "tandom_adcvd_check",
"arguments": {
"htsCode": "7318.15.50.90",
"countryOfOrigin": "CN",
"entryDate": "2026-04-15"
}
}
}'3. The response
The MCP envelope wraps a content array; the inner text payload is the same structured JSON that GET /v1/adcvd/check returns over REST.
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"content": [
{
"type": "text",
"text": "{
\"htsCode\": \"7318.15.50.90\",
\"countryCode\": \"CN\",
\"heading\": \"7318\",
\"matches\": [
{
\"caseNumber\": \"A-570-932\",
\"orderType\": \"AD\",
\"product\": \"Steel Threaded Rod\",
\"country\": \"China\",
\"rate\": \"206.00%\",
\"matchType\": \"heading\",
\"headingMatched\": \"7318\",
\"scopeText\": \"... steel threaded rod ... non-headed and threaded along greater than 25 percent of their total length ...\"
},
{
\"caseNumber\": \"A-570-104\",
\"orderType\": \"AD\",
\"product\": \"Alloy and Certain Carbon Steel Threaded Rod\",
\"rate\": \"48.91%\",
\"matchType\": \"heading\"
},
{
\"caseNumber\": \"C-570-105\",
\"orderType\": \"CVD\",
\"product\": \"Alloy and Certain Carbon Steel Threaded Rod\",
\"rate\": \"0.00%\",
\"matchType\": \"heading\"
},
{
\"caseNumber\": \"A-570-909\",
\"orderType\": \"AD\",
\"product\": \"Certain Steel Nails from China\",
\"rate\": \"118.04%\",
\"matchType\": \"heading\"
}
]
}"
}
]
}
}The four matches are heading-level (4-digit 7318) advisory flags, not confirmed assessments. The scope text on each determines whether the order actually reaches the studs.
4. The same response in the catalog visual
The catalog at compliance.tandom.ai/adcvd-catalog renders the same structured response in the Tandom AD/CVD lookup card visual.
| Case | Type | Product | Match | Rate |
|---|---|---|---|---|
| A-570-932 | AD | Steel Threaded Rod | heading (4-digit) | 206% |
| A-570-104 | AD | Alloy and Certain Carbon Steel Threaded Rod | heading (4-digit) | 48.91% |
| C-570-105 | CVD | Alloy and Certain Carbon Steel Threaded Rod | heading (4-digit) | 0% |
| A-570-909 | AD | Certain Steel Nails from China | heading (4-digit) | 118.04% |
Claude tool-use trace
What it looks like when a broker types the question into Claude Desktop with the Tandom connector wired in.
The user prompt
Is HTS 7318.15.50.90 from China subject to AD/CVD? Entry would be mid-April 2026.
Claude picks the tool
Claude reads the tool list returned by tools/list, sees tandom_adcvd_check's description, and emits a tool-use block.
{
"type": "tool_use",
"id": "toolu_01ABcD...",
"name": "tandom_adcvd_check",
"input": {
"htsCode": "7318.15.50.90",
"countryOfOrigin": "CN",
"entryDate": "2026-04-15"
}
}The MCP server runs and returns
The same structured payload from the previous section, wrapped in the MCP content envelope, comes back as the tool_result block.
{
"type": "tool_result",
"tool_use_id": "toolu_01ABcD...",
"content": [
{ "type": "text", "text": "{ \"matches\": [ ... 4 entries ... ] }" }
]
}Claude synthesizes a broker-grade answer
Yes, possibly. HTS 7318.15.50.90 (Studs, of iron or steel, Other) from China hits four AD/CVD orders at the 4-digit heading 7318. All four are heading-level advisory matches; you read each scope to decide which apply. A-570-932 Steel Threaded Rod (AD, 206%): scope explicitly names "studs." Plain carbon-quality steel studs are in scope. This is the controlling order for most carbon-steel cases. A-570-104 Alloy and Certain Carbon Steel Threaded Rod (AD, 48.91%) plus C-570-105 (CVD, 0%): covers alloy steel and certain carbon-steel threaded rod. If your studs are alloy steel, this order may apply additionally; if plain carbon steel, A-570-932 controls and these are out of scope. A-570-909 Certain Steel Nails: nails-only scope. Studs are not nails. Discard this advisory. Next steps: 1. Confirm the alloy composition. Plain carbon steel: A-570-932 only. Alloy steel: A-570-932 plus A-570-104 / C-570-105. 2. Identify the manufacturer and exporter on the entry. The 206% figure is the China-wide rate; company-specific rates from administrative reviews may apply. 3. Verify the deposit rate against the latest CSMS message for A-570-932 before filing. Source: Tandom AD/CVD lookup, entry date 2026-04-15. Full FR scope text available at compliance.tandom.ai/adcvd-catalog/orders/A-570-932.
That synthesis is the broker-grade output the MCP integration buys you. The structured matches plus the scope text in the payload are what let Claude discriminate between carbon and alloy steel and discard the nails false positive in one shot.
Common pitfalls
The mistakes that bite first-time MCP integrations.
Calling /api/mcp expecting AD/CVD tools
The unauthenticated endpoint at compliance.tandom.ai/api/mcp only exposes the four HTS catalog tools. AD/CVD, duty calculation, Chapter 99, PGA, and the rest of the surface require the authenticated endpoint at mcp.tandom.ai/mcp with an API key. If you call tandom_adcvd_check on the public endpoint, you get a structured error (code: -32000) telling you to use the authenticated URL.
Forgetting the Authorization header
Without Authorization: Bearer tk_live_..., mcp.tandom.ai/mcp returns a 401 with a tandom://errors/auth/missing-credentials problem document. Most clients surface that as an opaque error. Confirm the header is set in your client config.
Treating heading-level AD/CVD matches as confirmed
Same lesson as the calculator. When matchType is heading, the Tandom engine is flagging a candidate at the 4-digit level because that is how the order cites its HTSUS list in our DB. The dispositive answer is in the FR scope text. Have your AI agent read each scopeText field, not just the rate.
Skipping the entryDate
AD/CVD rates update through administrative reviews. Without anentryDate, the lookup picks the most recent published rate, which may not match the entry's actual filing date. Always pass entryDate in ISO format (YYYY-MM-DD).
Hard-coding the tool list in the client
MCP clients should call tools/list on connect rather than hard-coding the surface. Tandom adds tools as new REST endpoints ship; a client that reads the manifest at runtime picks up the new surface automatically.
Confusing the closed-beta tools with the available set
The tool manifest carries a _meta["tandom/status"] field. Tools marked closed-beta (tandom_classify, tandom_classify_report, tandom_forms_cbp7501, tandom_monitor_catalog, tandom_quote_landed_cost) require beta enrollment on the API key. Calling them with a vanilla key returns a 403. Filter by status if your agent should only call available tools.
Posting JSON-RPC ids as strings vs numbers
The spec accepts either, and Tandom echoes the id you sent. But some MCP clients break if you mix string ids and numeric ids in the same conversation. Pick one and stick with it.
Logging the API key in conversation transcripts
The Authorization header lives in the connector config, not in the conversation. Do not let your agent log or surface the header in tool-use traces; rotate the key if it leaks.
Treating the response payload as final advice
The MCP server returns the structured Tandom data verbatim. The synthesis Claude (or another LLM) writes on top of that data is a draft, not a filing. A licensed broker still owns the entry. Use the AI output to accelerate review, not to replace it.
Glossary
- MCP (Model Context Protocol)
- The open JSON-RPC spec at modelcontextprotocol.io that lets AI agents discover and invoke external tools. Tandom exposes an MCP server so any MCP-spec client can call our HTS, duty, and AD/CVD surface.
- MCP server
- An HTTP server that speaks JSON-RPC 2.0 with the MCP method set (initialize, tools/list, tools/call). Tandom's MCP server is at mcp.tandom.ai/mcp.
- JSON-RPC 2.0
- The underlying RPC protocol MCP uses on the wire. Every MCP request has jsonrpc, id, method, and params; every response has jsonrpc, id, and either result or error.
- tools/list
- The MCP method that returns the server's tool manifest. Each tool has name, title, description, inputSchema, and annotations (readOnly, destructive, openWorld hints).
- tools/call
- The MCP method that invokes a specific tool. Params carry the tool name and arguments object; the result wraps the tool's output in a content array.
- streamable-http transport
- The HTTP-based MCP transport that Claude Desktop and most production clients use. Tandom's server speaks streamable-http on port 443.
- claude_desktop_config.json
- The Claude Desktop config file (macOS: ~/Library/Application Support/Claude/; Windows: %APPDATA% /Claude/) that registers MCP connectors. Add a tandom entry under mcpServers and restart to load the connector.
- tandom_adcvd_check
- The MCP tool that wraps GET /v1/adcvd/check. Takes htsCode, countryOfOrigin, entryDate, and optional manufacturer or exporter; returns matched AD/CVD orders with case numbers, rates, and full scope text.
- matchType
- Field on each AD/CVD match indicating how confident the match is: exact (10-digit), subheading (6-digit), heading (4-digit), or advisory. Heading and advisory matches are candidates for scope review, not assessments.
- Authorization: Bearer tk_live_...
- The auth header for the authenticated MCP endpoint. The same tk_live_ key that authenticates the Tandom REST API also authenticates MCP. Issued at api.tandom.ai.
- protocolVersion
- The MCP spec version the server speaks. Tandom currently announces 2024-11-05. Clients negotiate this on initialize.
- connector surface
- The full list of REST endpoints the Tandom MCP server can wrap. The available subset is callable today; the closed-beta subset (classification, CBP 7501, monitoring, landed-cost) requires beta enrollment.
FAQ
High-intent questions developers and brokers wiring Tandom into AI workstations ask most often.