Guide

How to expose the Tandom AD/CVD lookup as a Claude MCP tool

Wire the Tandom AD/CVD lookup into Claude as a Model Context Protocol tool. Real JSON-RPC traces, the tool list, and a worked example, in 2026.

Updated 12 min readView the live MCP tool list
Share:

TL;DR

  • One MCP endpoint: POST https://mcp.tandom.ai/mcp. JSON-RPC 2.0, MCP protocol version 2024-11-05, auth via Authorization: Bearer tk_live_.... A no-auth public endpoint at compliance.tandom.ai/api/mcp exposes the four HTS catalog tools for testing without an account.
  • The AD/CVD tool: tandom_adcvd_check takes htsCode, countryOfOrigin, and entryDate; 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 at compliance.tandom.ai/adcvd-catalog.
  • Claude Desktop wiring: add a streamable-http connector entry pointing at mcp.tandom.ai/mcp in claude_desktop_config.json, restart, and Claude routes natural-language AD/CVD questions to the tool automatically. Claude Code accepts the same connector via claude config or 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. Wraps GET /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. Wraps GET /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.

AD/CVD lookup resultsHTS 7318.15.50.90, China, entry 2026-04-15
CaseTypeProductMatchRate
A-570-932ADSteel Threaded Rodheading (4-digit)206%
A-570-104ADAlloy and Certain Carbon Steel Threaded Rodheading (4-digit)48.91%
C-570-105CVDAlloy and Certain Carbon Steel Threaded Rodheading (4-digit)0%
A-570-909ADCertain Steel Nails from Chinaheading (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.

What is Model Context Protocol customs tooling, and why does it matter for brokers?
Model Context Protocol (MCP) is the open JSON-RPC spec, published at modelcontextprotocol.io, that lets a large-language-model client (Claude Desktop, Claude Code, an in-house AI agent) invoke external tools. For brokers, it means the AI assistant in your workstation can call Tandom's AD/CVD lookup, HTS classification, and duty calculator the same way a developer would call a REST API, with the LLM driving tool selection from a natural-language question. The broker keeps the workflow they already have; the AI does the lookup work behind the scenes.
What is the URL of the Tandom MCP server?
The canonical authenticated endpoint is https://mcp.tandom.ai/mcp. It accepts JSON-RPC 2.0 POST requests and authenticates with Authorization: Bearer tk_live_... API keys. A free, no-auth endpoint at https://compliance.tandom.ai/api/mcp exposes the four HTS catalog tools (lookup_hts_code, search_hts_codes, list_chapters, get_chapter_codes) and is useful for testing without an account. Both speak JSON-RPC 2.0; both publish the same machine-readable manifest on GET.
How do I install the Tandom MCP server in Claude Desktop?
Add a connector entry to claude_desktop_config.json with the URL pointing at https://mcp.tandom.ai/mcp and a transport of streamable-http. Pass your API key as Authorization: Bearer tk_live_... in the headers block. Restart Claude Desktop. The Tandom tools then appear in the connector picker, and Claude routes natural-language AD/CVD or HTS questions to them automatically.
Which tools does the MCP server expose?
The HTS catalog tier (lookup_hts_code, search_hts_codes, list_chapters, get_chapter_codes) is available without auth. The full surface adds tandom_duty_calculate, tandom_pga_check, tandom_chapter99_applicable, tandom_hts_search, tandom_hts_notes, tandom_hts_hierarchy, tandom_hts_expand_s301, tandom_hts_expand_ch99_scope, tandom_adcvd_check, tandom_adcvd_orders_search, tandom_adcvd_report_lookup, tandom_adcvd_rates_at, tandom_regulatory_status, plus closed-beta tools for classification (tandom_classify, tandom_classify_report), CBP 7501 generation, catalog monitoring, and landed-cost quoting. Hit GET https://mcp.tandom.ai/mcp for the live, machine-readable tool list.
What does an AI agent AD/CVD lookup actually look like at runtime?
Claude receives a natural-language question ("is HTS 7318.15.50.90 from China subject to AD/CVD?"), selects the tandom_adcvd_check tool from the MCP tool list, sends a JSON-RPC tools/call payload with htsCode, countryOfOrigin, and entryDate, receives the structured matches list (case numbers, order types, products, rates, match types, scope text), and synthesizes a broker-grade answer that names each case number with its rate and match confidence. The tool-use trace below shows the actual JSON exchange.
Is the MCP request path deterministic, or does it call Claude on every request?
The MCP server is a thin JSON-RPC adapter over the same Tandom REST API your TMS or broker software would call directly. It is DB plus arithmetic (and a bit of structured-data scope matching), no Claude call on the request path. Typical p50 latency is in the 200 to 600 ms range. The Claude calls happen on the client side, in Claude Desktop or your AI agent, when the LLM decides which tool to invoke.
Does mcp.tandom.ai support the JSON-RPC initialize handshake?
Yes. POST {"jsonrpc":"2.0","id":1,"method":"initialize"} returns the server's protocolVersion (currently 2024-11-05), capabilities ({tools: {}}), and serverInfo (name: tandom-customs-intelligence, version: 1.0.0). Claude Desktop runs initialize on connect; the response is what makes the tool list discoverable. The full handshake plus a tools/list call is what's needed to bring the connector online.
How do I use Tandom MCP tools in Claude Code or other MCP clients?
Any MCP-spec client works the same way. Claude Code accepts the connector via claude config (or a project-level .mcp.json), and the tools appear under the connector's namespace. JSON-RPC clients you build yourself (Python, TypeScript, anything) only need to POST initialize, then tools/list, then tools/call against https://mcp.tandom.ai/mcp with the Authorization: Bearer header. The wire protocol is identical across clients.
Where do I get a Tandom API key for the MCP endpoint?
Sign up at api.tandom.ai. The same tk_live_... key authenticates both the REST API and the MCP server, so a key issued for duty-calc usage will also work for AD/CVD MCP calls. Free tier covers 1,000 calls per month across the surface.
Share: