The platform speaks the Model Context Protocol over Streamable HTTP at https://dutydrawback.ai/api/mcp, authenticated by a bearer API key. Any MCP client with custom header support connects — no SDK, no vendor lock. Create keys under Settings → API Keys; discovery and tool list live at /api/mcp/info.
Pass the server in the Messages API's mcp_servers block — the key rides authorization_token:
Messages API request fragment
{
"mcp_servers": [
{
"type": "url",
"url": "https://dutydrawback.ai/api/mcp",
"name": "drawback",
"authorization_token": "dk_live_YOUR_KEY"
}
]
}One command
claude mcp add --transport http drawback https://dutydrawback.ai/api/mcp \ --header "Authorization: Bearer dk_live_YOUR_KEY"
Then /mcp shows the connection and tools/list the 14 tools.
Point a Streamable-HTTP client at https://dutydrawback.ai/api/mcp and send Authorization: Bearer dk_live_… on every request. Unauthenticated requests receive a spec-standard 401 challenge. Read-only keys can call every read tool; mutating tools (upload_file, validate_file, run_analysis, cancel_job, generate_report, generate_abi) need the write scope.
claude.ai custom connectors are a named future slot — they GA on OAuth; this server will add the RFC 9728 metadata when that lands.
retry-after header, and the tool error text repeats the wait ("Rate limited. Retry after N seconds.") so an agent can back off.write scope is inspected; read access is implicit, so a key created without write can call every read tool and nothing else./api/v1/auth/* (except /api/v1/auth/introspect, which whoami uses) and on /api/v1/api-keys — keys are created, rotated, and revoked in the portal, never by another key.status: failed through get_job; the reason itself currently reaches clients only through the backend's webhook payloads.get_referenceProvision codes, claim methods, BOM rules, CATAIR designation methods
whoamiConnected credential (org, scopes, key last-use) + month-to-date usage
list_filesUploaded data files with validation status; filterable by kind
upload_fileUpload a CSV as inline text (max 8 MB) as imports/exports/bom/accessory
validate_fileRe-run validation on an uploaded file and return refreshed status
run_analysisSubmit a matching analysis (provision-aware; BOM gate for 51/52/76)
get_jobA job's status, progress, and timestamps
list_jobsThe account's jobs, newest first; filterable by type
cancel_jobCancel a queued or running job
wait_for_jobPoll a job to completion (bounded 120s) with MCP progress notifications
get_job_resultsCompleted-analysis summary: totals, validation checks, top matches
generate_reportQueue a report (csv/json/html/excel) from a completed analysis
get_reportFetch a report artifact — inline text under 1 MB, else download instructions
generate_abiQueue CBP ABI (CATAIR) record generation from a completed analysis
Typical flow: upload_file → run_analysis → wait_for_job → get_job_results → generate_report or generate_abi.