# EU Trade Explorer

> EU customs-trade & industrial-production statistics (Eurostat Comext/PRODCOM)

- name: eu.tradedashboard/eu-trade-explorer
- version: 1.0.2
- connection class: R0 (autonomous)
- trust: 80/100 flags: no-repository
- quality: 74/100 (needs work)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/eu.tradedashboard%2Feu-trade-explorer
- tools: https://api.protogrid.dev/v1/servers/eu.tradedashboard%2Feu-trade-explorer/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "eu-trade-explorer": {
      "type": "http",
      "url": "https://mcp.tradedashboard.eu/mcp"
    }
  }
}
```


## Trust

- hygiene: 80
- liveness: 100
- freshness: 85
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-100% ~updated-51d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 74/100 (needs work)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 50 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 3 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- fail `tools.annotations`: no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: get_supply_shocks (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); get_map_data (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); get_volatility (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
- fail `tools.token_cost`: about 33,553 tokens to load every tool, a large share of an agent's context
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: 4 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 37, about 33,553 tokens to load them all
- tool set hash: 346028a1f04dd8b1ed39e3c154d0d216
- tools last changed: 2026-09-30T22:08:08.083Z
- badge: [![protogrid quality](https://protogrid.dev/badge/eu.tradedashboard/eu-trade-explorer.svg)](https://protogrid.dev/servers/eu.tradedashboard/eu-trade-explorer)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-09-30 `get_specialisation` changed (inputSchema)
- 2026-09-30 `get_concentration_map` changed (inputSchema)
- 2026-09-30 `get_reporter_benchmark` changed (inputSchema)
- 2026-09-30 `guidelines_for_a_short_report` changed (description)
  - before: Read this first for a quick report. Returns the short-report workflow: resolve a product code, then call `get_full_report` for the five most important report sections in one shot -- enough for a quick, simple report. Also covers access/quota, the shared `query` object and the `compact` option.
  - after: Read this first for a quick report. Returns the short-report workflow: resolve a product code, then call `get_full_report` for the five most important report sections in one shot -- enough for a quick, simple report. Also covers access, the shared `query` object and the `compact` option.

Full history: https://api.protogrid.dev/v1/servers/eu.tradedashboard%2Feu-trade-explorer/changes

## Remotes

- https://mcp.tradedashboard.eu/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (37)

- `get_autonomy_summary`: Report-section helper ("Autonomy & vulnerability"): net import
reliance (`get_net_import_reliance`) is always the headline fact/chart.
Trade intensity and export propensity (`get_trade_intensity` /
`get_export_propensity`) are both computed, then a deterministic
salience score -- distance from an unremarkable ~50% band, plus the
magnitude of its own change -- decides which one leads the narrative;
this choice is never left to the caller. `trade_intensity_pct` is
returned fully unit-consistent (first/last/min/max all expressed as a
percentage, matching `export_propensity_pct`). Sub-contracting is
deliberately not included in this section at all -- it is an unrelated,
tiny-base PRODCOM series that only muddied the narrative.

Returns `{narrative_facts, chart_data, available, reason}`.
- `get_chapters`: List all top-level Combined Nomenclature chapters (2-digit codes).

Bootstraps browsing the nomenclature top-down; drill into a chapter with
`get_subtree`.
- `get_concentration`: Herfindahl-Hirschman Index (HHI) of trade concentration across
partners or member states, per period (0 = perfectly spread, 10000 = one
entity holds the whole market), plus the top-8-by-value share breakdown
(rest bundled as 'Others'). Higher HHI = more dependent on a handful of
counterparties.
- `get_concentration_compare`: Partner-concentration (HHI) compared across sub-products: one HHI
line per sub-product rather than per flow, to see which sub-products
drive a parent code's overall concentration.
- `get_concentration_map`: Cross-sectional HHI per country for one year -- the choropleth
counterpart of get_concentration. 'partner' entity_level = for every EU
member state, HHI of its trade across partners; 'reporter' = for every
partner, HHI of its trade across EU member states (subject to the
Rotterdam/Antwerp entry-point distortion).
- `get_countries`: Reference data for reporters/partners: selectable EU/Euro-area/member
states, named partner presets, predefined reporter/partner groups, and
per-language country-name translations. Use this to find valid values
for the `reporter`, `partner_set`, `partners` and `reporter_members`
fields used throughout the other tools' `query` argument.
- `get_data_range`: Return the period coverage (`data_min`/`data_max`, 'YYYY-MM') actually
cached for the given product code(s) -- use before picking
`period_start`/`period_end` so you don't request an empty window.
- `get_export_propensity`: Export Propensity = Exports / Production, annual: the share of EU
production that is exported. Not clamped -- values above 100% are
legitimate (re-exports, stock drawdown, scope differences). Returns the
export-propensity matrix, a sibling/per-code comparison, resolved
PRODCOM codes and availability notes.
- `get_full_report`: Fetch every report section (scope, overview, market structure,
volatility, autonomy) for one shared `query` in a single call, instead
of calling `get_product_profile` / `get_market_summary` /
`get_market_structure_summary` / `get_volatility_summary` /
`get_autonomy_summary` separately yourself. Guarantees all five
sections describe the exact same product/reporter/partner/period
slice -- five separate calls have no such guarantee, since nothing
stops `query` from being re-typed slightly differently across them, or
one of the five simply being forgotten.

`query`'s own field defaults (`reporter='European Union'`,
`partner_set='non-EU countries'`, `period_start='2015-01'`,
`frequency='quarter'`, `remove_outliers=true`, ...) are exactly the
sensible defaults for a first-cut report; override any of them for a
different slice -- e.g. a specific member state, a custom partner
group, a narrower period.

Returns `{"query": {...}, "sections": {<name>: {narrative_facts,
chart_data, links, available, reason}, ...}}` for `<name>` in
`product_profile`, `market_summary`, `market_structure`, `volatility`,
`autonomy`. `links` maps each `narrative_facts` key to a ready-made
`https://tradedashboard.eu/...` URL for that same fact -- never
construct one of these yourself; use the one already provided.
- `get_map_data`: Choropleth-ready aggregates: per-period totals (quantity, value,
price) for imports and exports, keyed by GISCO country code on both the
reporter and partner sides.
- `get_market_structure_summary`: Report-section helper ("Market structure"): combines, in priority
order, the intra-EU specialisation snapshot (`get_specialisation`,
already map-ready), partner-concentration detail (`get_concentration`,
keeping the top-8-by-value share breakdown as `chart_data` alongside the
condensed HHI trend) and, when a PRODCOM mapping exists for the product,
EU production volumes (`get_production_series`). These three are
independent data sources bundled only because they all describe "market
structure" -- the specialisation RSCA is trade-based and has no relation
to the PRODCOM production figures; treat them as separate findings, not
a single connected story. `most_specialised_reporters` /
`least_specialised_reporters` are pre-sorted by actual RSCA (highest/
lowest first respectively) -- use them as-is rather than re-deriving a
ranking. `query.prodcom_code` is passed through untouched -- picking
among ambiguous PRODCOM mappings is left to the caller, never guessed
here.

Returns `{narrative_facts, chart_data, available, reason}`.
- `get_market_summary`: Report-section helper ("General overview"): condensed, report-ready
digest of how a market has evolved over the chosen window -- one call
instead of separately fetching and cross-referencing get_overview +
get_reporter_detail + get_concentration + get_net_import_reliance
yourself. Set `query.frequency = "year"` for a multi-year evolution
summary (recommended over the model's default of "quarter").

Every figure reflects `query` exactly as given -- the same
product/reporter/partner_set/period slice a dashboard user would have
selected. Nothing here substitutes a different reporter or partner_set
(e.g. to contrast intra-EU against extra-EU trade): call this again
with a different `query.partner_set` for that, the same way a dashboard
user would switch the sidebar's selector.

Returns `{narrative_facts, chart_data, available, reason}`.
`narrative_facts` combines, for the flow selected by `query.partner_set`:
- Headline trade: first/last/min/max/pct_change for export & import
  value, quantity and price, plus the trade-balance trend.
- Partner concentration: first/last/pct_change of the value-based HHI
  for imports and exports.
- Top partners *and* top EU reporters by value: each one's
  first/last/pct_change -- i.e. who is gaining or losing share.
- Net import reliance: first/last/pct_change of the annual NIR % for
  `query`'s own `reporter`/`partner_set` (only `frequency` is normalised
  to "year", since NIR is structurally annual and the upstream API
  always returns it that way regardless); omitted if the product has no
  PRODCOM mapping.
`chart_data` carries the full-fidelity headline trade and top-partner/
top-reporter series for charting.
- `get_net_import_reliance`: Net Import Reliance (NIR) = (Imports - Exports) / Apparent
consumption, annual, joining PRODCOM production with Comext trade. E.g.
40% means 40% of EU consumption is met by imports; negative means the EU
is a net exporter. Returns the NIR % series, its supply/disposition
components, sibling-category/per-code comparisons, the resolved PRODCOM
codes and availability notes (CN-to-PRODCOM mapping is not always 1:1;
see the `self.notes` / `unavailability_type` fields in the response). Use
`query.prodcom_code` to pin a specific mapping.
- `get_overview`: Headline figures: total import/export quantities, values and
weighted-average prices per period, the trade balance, and a top-partner
breakdown. The best first call for any new product/reporter slice.
- `get_partner_detail`: Per-partner import/export breakdown. For each flow, the top-N trading
partners ranked both by quantity and by value (so you can compare
volume-based vs. value-based rankings), each with its own quantity,
value and price time series, plus an optional 'Other' bucket.
- `get_pattern_shift`: Before/after trade-pattern shift around a split point
(`query.midpoint`): for each entity, compares average quantity and price
before vs. after, and returns scatter points (quantity-change % vs.
price-change %) with quadrant labels -- top-right = demand-driven growth,
top-left = supply constraint/monopoly risk, bottom-right =
dumping/oversupply risk, bottom-left = market contraction. Suggested
workflow: spot a shock date via get_supply_shocks / get_price_shocks
first, then set it as `query.midpoint` here.
- `get_price_shocks`: Detect sudden price regime shifts ("rapid price changes"), accounting
for each flow's usual volatility so naturally volatile flows aren't
over-flagged. Returns ranked shock events per flow with timeline phases
(price spike/drop, volatile trade, return to baseline, ...), magnitude
and series.
- `get_product_compare`: Sub-product comparison: for a single parent CN code, expands into its
children (or, for a multi-code request, compares the entered codes
directly) and returns per-subcode quantity/value/price series for both
flows -- so each sub-product plots as its own line instead of being
aggregated away. A leaf code with no children returns `leaf: true`.
- `get_production_concentration`: How concentrated production of a product is across all DS-059358
reporting countries (PRODCOM; EU member states plus EFTA/candidate/other
reporters -- not only the EU-27). HHI of PRODVAL across countries over
time, plus each country's production share. Suppressed/absent country
figures come back as null, not zero. Use `query.prodcom_code` to pin a
specific PRODCOM mapping.
- `get_production_series`: EU27 and per-country PRODCOM production series: EU quantity, EU
production unit value, and the same two per reporting country (all
DS-059358 reporters, not just EU-27, since production data carries no
trade columns). Country-level figures are heavily confidentiality
-suppressed; suppressed/absent values come back as null, not zero. Use
`query.prodcom_code` to pin a specific PRODCOM mapping when a CN code
maps to several.
- `get_product_profile`: Report-section helper ("Scope & definitions"): the resolved product
code + label, a one-sentence caveat when the code bundles several
sub-products (`has_subcodes`), the data-coverage window actually cached
for it, and whether it has a usable PRODCOM mapping (gating the
autonomy/vulnerability section). Deliberately thin -- no full CN
hierarchy breadcrumb or sibling enumeration.

Returns `{narrative_facts, chart_data, available, reason}` -- see
`get_market_summary` for the shape this convention follows across all of
this bridge's report-section helpers.
- `get_reporter_benchmark`: Every EU reporter ranked by value for one year -- the country-view
counterpart of `get_reporter_detail`. Returns a single-year snapshot
(every real EU member state's quantity, value and price per flow,
ranked by value) plus a benchmark price time series: the weighted
average across whichever reporters `query.reporter` resolves to (the
whole EU by default, or narrower when `query.reporter` is itself an
aggregate -- euro area, a named group, or an ad hoc custom group), the
cross-reporter min/max envelope, and the selected reporter's own line
when `query.reporter` is a single real member state. Use it to answer
"how does this country -- or reporter group -- compare to every other
reporter?".
- `get_reporter_detail`: Per-EU-member-state import/export breakdown -- the reporter-side
counterpart of `get_partner_detail`. Top-N member states (by quantity and
by value) with their quantity, value and price series. Aggregate
reporters (EU, Euro area, groups) are excluded from the ranking.
- `get_specialisation`: Intra-EU revealed symmetric comparative advantage (RSCA) per member
state -- a Balassa index benchmarked against the EU instead of the
world. Runs -1 (under-specialised) to +1 (strongly specialised), value
-based and intra-EU only. Treat with caution: intra-EU flows are
distorted by the Rotterdam/Antwerp quasi-transit effect.
- `get_subcontracting`: EU27 sub-contracting intensity: the share of sold production that is
toll (sub-contracted) manufacturing rather than own-account output.
Returns intensity (%) across value/quantity, its component series,
per-period data-quality status, resolved PRODCOM codes and availability
notes. The own/sub split only exists from 2021 onward.
- `get_subcontracting_members`: Per-country sub-contracting intensity (PRODCOM): for each reporting
country, the share of its sold production that is toll manufacturing --
which countries act as processing hubs vs. autonomous producers. Spans
all DS-059358 reporters that report the own/sub split; others simply
don't appear. Country cells are heavily confidentiality-suppressed
(null, not zero, when absent).
- `get_subtree`: Return the Combined Nomenclature sub-tree rooted at `code` (its
children, and their children, ...), each with a `code` and a `text`
description. Use this to see whether a heading you're about to use (e.g.
as `query.product` elsewhere) is actually a clean match, or bundles
several distinct sub-products together.
- `get_supply_shocks`: Detect abnormal collapses in trade volumes ("sudden volume changes").
Flags periods where a partner/product pair's volume drops well below its
historical average (>2 sigma by default). Returns ranked shock events
per flow, each with timeline phases (baseline, decline, disruption,
recovery, ...), magnitude, abnormality score and underlying series.
- `get_top_entities`: Just the ordered list of top entities for a slice -- no time series.
A lightweight helper for populating entity pickers or quickly checking
who the top partners/reporters are without pulling full series.
- `get_trade_intensity`: Trade Intensity (TI) = (Imports + Exports) / (Imports + Production),
annual. Near 1 = highly trade-exposed sector; near 0 = predominantly
domestic. Used in the Commission's CEEAG methodology for carbon-leakage
/ State-aid eligibility. Returns the TI series, its components,
sibling-category/per-code comparisons, resolved PRODCOM codes and
availability notes.
- `get_volatility`: Coefficient-of-variation (CV = stdev / mean) volatility per
partner/reporter x product pair, over inactive-period-excluded history.
Higher CV = the flow swings more relative to its typical level. Returns
per-entity CV bars (with drill-down series) and, unless
include_heatmap=false, an entity x sub-product CV heatmap.
- `get_volatility_summary`: Report-section helper ("Volatility & shocks"): the entities analysed
are picked by `get_volatility` (ranks by trade volume, reports each
one's CV) and by `get_price_shocks`/`get_supply_shocks` at default
parameters (both already scoped to top-value partners via
`cumulative_share=0.8`) -- never re-picked from the shocks themselves.
Retries shock detection once with loosened thresholds before concluding
"no shocks"; an empty result is itself a reportable finding, not a gap.
When shocks are found, the top events by abnormality and their series
are the section's findings; when none are found (even after the retry),
stability is the finding. `get_pattern_shift` is intentionally not part
of this bundle -- its before/after quadrant framing is too easily
misread; call it directly if you specifically need it.

Returns `{narrative_facts, chart_data, available, reason}`.
- `guidelines_for_a_long_report`: Read this first for an in-depth report. Returns the long-report
workflow: which of the 35+ tools to combine per angle (partners,
concentration, volatility & shocks, autonomy), the dashboard menu/tab
structure for pointing readers at views, and the methodological notes
needed to interpret and cite figures correctly. Call this before
guessing at tool use.
- `guidelines_for_a_short_report`: Read this first for a quick report. Returns the short-report
workflow: resolve a product code, then call `get_full_report` for the
five most important report sections in one shot -- enough for a quick,
simple report. Also covers access, the shared `query` object and
the `compact` option.
- `resolve_product_code`: Resolve a free-text query or CN code(s) into validated product
code(s) with descriptions -- the recommended first step before using
a code as `product` in any other tool's `query`. Saves the search ->
validate -> (optional) subtree round-trip: a bare keyword runs a search,
a single code (or comma-separated list) is validated and described
directly.

Tip: Comext/CN nomenclature is frequently coarser than a colloquial
product name (e.g. there is no code for "glass jars" alone -- only
heading 7010, which bundles jars with bottles, flasks and closures).
Check `has_subcodes` and, if useful, set `include_children=true` to see
whether a finer sub-code is actually a better match before committing to
one code for a whole report.
- `search_codes`: Keyword/code search over the Combined Nomenclature (or PRODCOM).

Returns ranked `{code, label, path}` candidates. Prefer
`resolve_product_code` for a one-call keyword-or-code helper; use this
directly if you specifically want the raw ranked candidate list.
- `validate_code`: Validate and describe one or more Combined Nomenclature codes.

For a single code, returns the full hierarchy of description levels
(`levels`), the resolved `product_name`, and `has_subcodes`. For a
comma-separated list, returns `{"results": [...]}` with one entry per
code (each either a success dict or an `{"code", "error"}` pair).
