@cyanheads/un-comtrade-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@cyanheads/un-comtrade-mcp-serverGet top trading partners for Germany in 2023"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Note: The UN Comtrade license agreement (§5) prohibits redistributing data without prior written UN permission. Connect with your own Comtrade subscription key.
Tools
9 tools covering the full UN Comtrade workflow — reference resolution, trade data retrieval, aggregated rankings, and coverage checking:
Tool | Description |
| Resolve country and area names to Comtrade M49 numeric codes. Accepts partial names or ISO alpha-2/alpha-3 codes. Returns matching entries with |
| Find HS commodity codes by keyword, partial description, or code prefix. Returns codes at 2-, 4-, or 6-digit aggregation with descriptions, parent code, leaf status, and a |
| List EBOPS 2010 service trade categories — the services-domain equivalent of |
| Fetch bilateral trade flow records. Returns |
| Compute trade balance (exports minus imports) for a country over one or more periods with optional commodity filter. Fetches export and import totals in parallel; returns signed balance, component values, and coverage ratio. |
| Rank trading partners for a reporter by trade value for a given commodity and flow direction. Returns top N partners sorted by descending value for a single period. |
| Rank commodity categories for a reporter by trade value for a given flow direction and period. Returns top N HS chapters (2-digit) or headings (4-digit) sorted by descending value. |
| Fetch international trade-in-services data (EBOPS 2010). Same bilateral structure as goods trade: returns flow value, period, and reporter/partner/category metadata. |
| Check which reporter/period/classification combinations have published data before constructing expensive queries. Returns record count and publication date per dataset. |
comtrade_lookup_countries
Resolve reporter and partner codes from natural-language names or ISO identifiers.
Accepts partial country name, ISO alpha-2 (
US), or ISO alpha-3 (USA)rolefilter:"reporter","partner", or"any"— narrows results to only valid reporters or all partner areasvalidAsReporterflag on each result — regional groupings (e.g.,Africa,ASEAN) are valid as partners but cannot be used asreporter_codeOptional
include_groupsto surface regional aggregate codesReference data is loaded from UN static files at startup — no key required, instant response
comtrade_search_commodities
Find the HS code for any product before querying trade flows.
Free-text keyword search across HS descriptions (e.g.,
"semiconductors","crude oil")Accepts known code prefixes —
"8471"returns the matching chapter and all descendantsAggregation level control: start with
aggr_level: 2(chapters) to scope a sector, then narrow to4or6for specific headings or subheadingsrecommended_query_codefield on each result — the best level for downstreamcomtrade_get_trade_flowscallsReference data loaded at startup from UN HS files, covering HS combined and editions H0–H6
comtrade_get_trade_flows
Fetch bilateral trade records — the primary data retrieval tool.
reporter_code+flow_code(Mimport /Xexport /RXre-export /RMre-import) +period[]requiredperiodaccepts annual (YYYY) or monthly (YYYYMM); pass multiple years as an array for time-series in one request (avoids multiple API calls against the 500-req/day free limit)partner_code: 0aggregates across all partners (World total) — no partner lookup neededcmd_code[]accepts comma-separated HS codes; omit or useTOTALfor cross-commodity totalsFree-tier cap: 500 records per call;
truncated: true+ hint when the cap is hitJoins country and commodity descriptions from the in-memory reference cache — preview-endpoint responses omit
*Descfields
comtrade_get_trade_balance
Compute signed trade balance from parallel export + import fetches.
Runs export (
flowCode=X) and import (flowCode=M) requests in parallel, then computes locallyReturns
balance(USD, signed),exports,imports, andcoverageRatio(exports / imports)Optional
cmd_codefilter for commodity-specific balance (e.g., energy trade balance)Surfaces mirror-asymmetry caveat — the balance reflects values as reported by this country, not the mirror reporter
comtrade_get_top_partners
Rank trading partners by value for a single period.
Fetches one record per partner by omitting the partner filter, then sorts locally
Joins partner names from the in-memory reference cache
limitcontrols N returned (default 10)Answers "who does Germany mainly export machinery to?" in one call
comtrade_get_top_commodities
Rank commodity chapters or headings by value for a single period.
aggr_level: 2for HS chapter ranking (21 sections),4for heading rankingOptional
partner_codeto scope the ranking to a specific bilateral relationshipAnswers "what does Japan mainly import?" — symmetric counterpart to
comtrade_get_top_partners
comtrade_get_data_availability
Check data coverage before querying.
Accepts optional
reporter_code,period,freq(Aannual /Mmonthly), andclassificationfiltersReturns dataset records with period, classification, record count, and publication date
Annual data is typically published 3–12 months after the reference year — call this before querying recent periods to avoid empty results
comtrade_get_services_trade
Fetch services trade data (EBOPS 2010 classification).
Same bilateral structure and parameters as
comtrade_get_trade_flowsservice_codeaccepts an EBOPS category code — usecomtrade_list_service_categoriesto find the right codeCovers financial services, transport, travel, insurance, and all EBOPS 2010 categories
Related MCP server: supply-chain-mcp-server
Resources and prompts
Type | Name | Description |
Resource |
| Complete country/area code list — M49 numeric codes, ISO identifiers, |
Resource |
| Top-level HS commodity hierarchy at aggregation level |
All resource data is also reachable via tools. comtrade://hs-classification/{level} provides a browsable hierarchy; for keyword resolution use comtrade_search_commodities instead.
Features
Built on @cyanheads/mcp-ts-core:
Declarative tool and resource definitions — single file per primitive, framework handles registration and validation
Unified error handling — handlers throw, framework catches, classifies, and formats
Pluggable auth:
none,jwt,oauthSwappable storage backends:
in-memory,filesystem,Supabase,Cloudflare KV/R2/D1Structured logging with optional OpenTelemetry tracing
STDIO and Streamable HTTP transports
UN Comtrade-specific:
Reference data (country codes, HS hierarchy, EBOPS categories) loaded at startup from UN static files — fast keyword search with no per-request fetches
Authenticated (
data/v1/get) and public preview (public/v1/preview) endpoint support — tools fall back to the preview endpoint when no subscription key is setParallel sub-request execution for workflow tools (
comtrade_get_trade_balanceruns export + import fetches concurrently)Exponential backoff with retry on 429 responses
Description enrichment — joins country names and HS/EBOPS descriptions from the in-memory reference cache before returning results, covering the preview endpoint's omission of
*Descfields
Agent-friendly output:
truncated: true+ hint on any response where the 500-record free-tier cap was hit — agents know when results are incomplete and can narrow the queryisReportedflag on trade flow records — distinguishes directly reported values from UN-estimated/aggregated rows so agents can reason about data reliabilityvalidAsReporteron country lookups — prevents agents from constructing invalid queries with partner-only area codesMirror-asymmetry caveat on trade balance output — agents can surface methodological notes to users without parsing error text
Getting started
Prerequisites: A UN Comtrade subscription key is optional but recommended. Without one, tools fall back to the public preview endpoint (500 records/call, lower rate limit). With a free-tier key you get the same record cap but higher request headroom.
Add the following to your MCP client configuration file.
{
"mcpServers": {
"un-comtrade-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/un-comtrade-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"COMTRADE_SUBSCRIPTION_KEY": "your-key-here"
}
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"un-comtrade-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/un-comtrade-mcp-server@latest"],
"env": {
"MCP_TRANSPORT_TYPE": "stdio",
"MCP_LOG_LEVEL": "info",
"COMTRADE_SUBSCRIPTION_KEY": "your-key-here"
}
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 COMTRADE_SUBSCRIPTION_KEY=... bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.3.0 or higher (or Node.js v24+).
Optional: a UN Comtrade subscription key for full API access. Without one, all tools fall back to the public preview endpoint (500 records/call). Reference/lookup tools (
comtrade_lookup_countries,comtrade_search_commodities,comtrade_list_service_categories) never require a key — they query static UN reference files.
Installation
Clone the repository:
git clone https://github.com/cyanheads/un-comtrade-mcp-server.gitNavigate into the directory:
cd un-comtrade-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env and set COMTRADE_SUBSCRIPTION_KEY if you have oneConfiguration
All configuration is validated at startup via Zod schemas in src/config/server-config.ts.
Variable | Description | Default |
| Azure API Management subscription key from comtradedeveloper.un.org. Without it, tools use the public preview endpoint (500-record cap). | — |
| Override the Comtrade API base URL. |
|
| Transport: |
|
| HTTP server port. |
|
| HTTP endpoint path. |
|
| Public origin override for reverse-proxy deployments. | — |
| Auth mode: |
|
| Log level ( |
|
| Directory for log files (Node.js only). |
|
| Storage backend: |
|
| Enable OpenTelemetry instrumentation. |
|
See .env.example for the full list of optional overrides.
Running the server
Local development
Build and run:
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:httpRun checks and tests:
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
Docker
docker build -t un-comtrade-mcp-server .
docker run --rm -e COMTRADE_SUBSCRIPTION_KEY=your-key -p 3010:3010 un-comtrade-mcp-serverThe Dockerfile defaults to HTTP transport, stateless session mode, and logs to /var/log/un-comtrade-mcp-server. OpenTelemetry peer dependencies are installed by default — build with --build-arg OTEL_ENABLED=false to omit them.
Project structure
Directory | Purpose |
|
|
| Environment variable parsing and validation with Zod. |
| Tool definitions ( |
| Resource definitions ( |
|
|
|
|
|
|
| Unit and integration tests mirroring |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor request-scoped logging,ctx.statefor tenant-scoped storageRegister new tools and resources via the barrels in
src/mcp-server/*/definitions/index.tsWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Reference data (countries, HS codes) joins must pull from the startup cache, not per-request fetches
Contributing
Issues and pull requests are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
Apache-2.0 — see LICENSE for details.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/cyanheads/un-comtrade-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server