cbam-mcp
Answers EU CBAM questions from bundled copies of official EU sources: EUR-Lex/CELLAR consolidated legal texts (CBAM Regulation 2023/956, Implementing Regulation 2025/2621), the Commission's DG TAXUD default-values Excel, and the Publications Office's EU Vocabularies Combined Nomenclature (CN 2025/2026). Provides tools for checking whether a CN code is in CBAM scope (including 'ex' lines and Annex II/greenhouse gas details), retrieving default emission values per country of origin, comparing origins side by side, describing CN codes, and reporting source provenance, version dates and checks against the binding texts.
Click on "Deploy 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., "@cbam-mcpWhat default CBAM values apply to 7601 10 00 from India?"
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.
cbam-mcp
EU CBAM scope, default values and CN descriptions for a CN code, from dated copies of the official sources, as an MCP server and a command line. Every answer names the legally binding act, the data version, and says the data is not legally binding.
Importers, customs brokers and sustainability teams ask three questions about the EU Carbon Border
Adjustment Mechanism (CBAM): is this CN code in scope, in which goods category, for which greenhouse
gases; what default value applies to it from a given country of origin; what exactly does the code
describe. The answers sit in three places: the consolidated CBAM Regulation on EUR-Lex, an Excel of
default values on the Commission's site with 122 tables (121 countries and "Other countries and
territories"), and the Combined Nomenclature in the
Publications Office's linked-data store. cbam-mcp bundles dated copies of the three, answers from
them offline, and puts the legal status next to every number.
Example
Real output of cbam-mcp 0.1.0 on 2026-09-24, from the bundled data retrieved the same day.
$ cbam-mcp compare 7601 10 00 India Türkiye
7601 10 00: default values in tCO2e per tonne of good
table line 7601 Unwrought aluminium (Aluminium)
country total direct indirect route values from
India 1.870 1.870 N/A K India
Türkiye 1.700 1.700 N/A K Türkiye
Other countries and territories 2.203 2.203
Annex IV (origin unknown) 3.198
Note Values as listed, before the mark-up. The rule is quoted in markup_rule from the
consolidated text named there; this tool quotes it and does not apply it.
Mark-up rule "For the calculation of the number of CBAM certificates, the default values of
the column ‘total emissions’ shall be selected and increased as follows:" "For
goods in the cement, iron and steel, aluminium and hydrogen sectors, the mark-up
shall be 10 % for the year 2026, 20 % for the year 2027 and 30 % for the year
2028 and onwards." "For goods in the fertiliser sector, the mark-up shall be 1 %
for the year 2026 and onwards." (Annex I (introductory part), consolidated text
02025R2621-20260101 of Implementing Regulation (EU) 2025/2621 (consolidation
date 2026-01-01), retrieved 2026-09-24)
Legally binding no. Binding text: Annex I to Commission Implementing Regulation (EU) 2025/2621,
as replaced by Annex I to Commission Implementing Regulation (EU) 2026/1740 (OJ
L, 2026/1740, 31.7.2026)
Commission says "An Excel file is made available for information purposes only, while the
legally binding values are set out in Commission Implementing Regulation (EU)
2025/2621."
Data Commission Excel 'Default values definitive period', version 2 of 2026-08-06,
retrieved 2026-09-24 (Default values based on Annex I and II to Implementing
Regulation (EU) 2026/1740 adopted on 20 July 2026)
Checked At the last refresh (2026-09-24) this file was compared with the consolidated
text 02025R2621-20260101: 12540 of 12540 country lines and 283 of 283 Annex IV
lines identical.
Checked On 2026-09-24 cbam-mcp compared this file with the Official Journal text of
32026R1740: 12540 of 12540 country lines and 283 of 283 Annex IV lines
identical.
Warning 7601 10 00 is not a CN 2026 code; the table line shown is the one whose code it
starts with
Source: European Commission, DG TAXUD, default values Excel version 2, re-used under Commission Decision 2011/833/EU, retrieved 2026-09-24; decimal commas converted to numbers (derived)The warning is a finding, not noise: CN 2025 and CN 2026 split 7601 10 into 7601 10 10 (slabs) and 7601 10 90; the default-value table gives one line for all of heading 7601.
An "ex" line of Annex I is never reported as fully in scope:
$ cbam-mcp scope 2507 00 80
2507 00 80: partially in scope
Annex I line ex 2507 00 80 – Other kaolinic clays except non-calcined kaolinic clays
Goods category Cement
Greenhouse gases Carbon dioxide
Why Annex I lists 2507 00 80 as an 'ex' line: only the goods its text describes
(annex_i_line.text) are in scope, not every good under 2507 00 80.
Depends on whether the goods are the ones the text of the 'ex' line describes
(annex_i_line.text)
Annex II not listed in Annex II. Article 7(1): "Embedded emissions in goods shall be
calculated pursuant to the methods set out in Annex IV. For goods listed in
Annex II only direct emissions shall be calculated and taken into account."
CN 2026 2507 00 80 Other kaolinic clays. Kaolinic clays (other than kaolin)
De minimis Annex VII, point 1: "The single mass-based threshold referred to in Article 2a
shall be set at 50 tonnes of net mass." The threshold counts the net mass of all
CBAM goods an importer imports in a calendar year, not per CN code; this tool
cannot tell whether an importer is under it.
Legally binding no. Binding text: Annex I to Regulation (EU) 2023/956 as published in the
Official Journal (OJ L 130, 16.5.2023, p. 52) and amended by Regulation (EU)
2025/2083 (OJ L, 2025/2083, 17.10.2025)
Data consolidated text 02023R0956-20251020 of Regulation (EU) 2023/956 (consolidation
date 2025-10-20), retrieved 2026-09-24 from CELLAR
Source: EUR-Lex/CELLAR, consolidated text 02023R0956-20251020 of Regulation (EU) 2023/956, © European Union, CC BY 4.0, retrieved 2026-09-24; table derived by cbam-mcp$ cbam-mcp describe 7308 20 10
7308 20 10 (CN 2026): Tubular wind turbine steel towers and tower-sections
Self-explanatory Tubular wind turbine steel towers and tower-sections
Hierarchy XV SECTION XV - BASE METALS AND ARTICLES OF BASE METAL > 73 CHAPTER 73 -
ARTICLES OF IRON OR STEEL > 7308 Structures (excluding prefabricated buildings
of heading 9406) and parts of structures (for example, bridges and bridge-
sections, lock-gates, towers, lattice masts, roofs, roofing frameworks, doors
and windows and their frames and thresholds for doors, shutters, balustrades,
pillars and columns), of iron or steel; plates, rods, angles, shapes, sections,
tubes and the like, prepared for use in structures, of iron or steel > 7308 20
Towers and lattice masts
CN 2025 no such code
Legally binding no. Binding text: Annex I to Council Regulation (EEC) No 2658/87 as amended by
Commission Implementing Regulation (EU) 2025/1926 (Combined Nomenclature 2026),
as published in the Official Journal
Data CN 2026 (EU Vocabularies, scheme cn2026), bundled subset, retrieved 2026-09-24
Source: Publications Office of the European Union, EU Vocabularies, Combined Nomenclature 2026, European Commission reuse notice, retrieved 2026-09-24Related MCP server: ensmcp
Install
Standard library only, Python 3.9 or newer, no dependencies. The data ships inside the package, so answering needs no network.
As an MCP server in Claude Code:
claude mcp add cbam-mcp -- uvx cbam-mcpIn any other MCP client, the server is the command uvx cbam-mcp (or pipx run cbam-mcp) over stdio:
{"mcpServers": {"cbam-mcp": {"command": "uvx", "args": ["cbam-mcp"]}}}On the command line:
uvx cbam-mcp scope 7208 51 20
pipx run cbam-mcp value 7601 10 00 IndiaThe PyPI package is published by this repository's release workflow; until the first release, install
from a checkout with pip install ., or run python3 -m cbam_mcp in it.
Tools and commands
MCP tool | Command line | Answers |
|
|
|
|
| Direct, indirect and total default values in tCO2e per tonne of good as listed, production route and its meaning, the "Other countries and territories" values where Annex I says to use them for a listed country, the Annex IV value, and the mark-up rule quoted from the consolidated text (not applied). |
|
| The same for up to 30 countries side by side (one argument per country). |
|
| CN 2026 or CN 2025 label, self-explanatory text, hierarchy, sub-codes, and whether the other year differs. |
|
| URL, version, retrieval date, SHA-256, row counts, licence and legal status of every dataset, the checks against the legal texts, later acts found. |
| Rebuilds the data from the sources (below). |
CN codes are read as 7208 51 20, 72085120, 7208.51.20, with or without ex, at 2, 4, 6, 8 or 10
(TARIC) digits. Countries are read as the table names (Türkiye), other names from the EU country
authority table (Turkey, Republic of Korea, UK, Czech Republic), a few abbreviations of this
tool's own (PRC, S. Korea, UAE, DRC) or ISO 3166-1 alpha-2 codes (TR). A name that is none of
these is an error, never a fallback: for a third country the tables do not list, ask for country
Other countries and territories explicitly. --json prints the structure the MCP tool returns.
Exit codes: 0 answered, 2 the question or the data could not be read.
Every answer carries legally_binding (always false), legally_binding_source (the act that is
binding), data_version and an attribution line.
What the answers rest on
Each rule the answers state, where it was read, and when.
Rule used in answers | Source | Checked |
The goods, CN codes, "ex" lines, exceptions and greenhouse gases of Annex I; the goods of Annex II ("only direct emissions", Article 7(1)) | Regulation (EU) 2023/956 as amended by Regulation (EU) 2025/2083, consolidated text 02023R0956-20251020 (parsed at each refresh) | 2026-09-24 |
De minimis: Article 2a(1); "The single mass-based threshold referred to in Article 2a shall be set at 50 tonnes of net mass." (Annex VII, point 1); "This Article shall not apply to imports of electricity or hydrogen." (Article 2a(4)) | same consolidated text (parsed at each refresh) | 2026-09-24 |
Goods originating in Iceland, Liechtenstein, Norway, Switzerland, Büsingen, Heligoland, Livigno, Ceuta and Melilla are outside the Regulation (Article 2(4), Annex III point 1); it applies to goods "originating in a third country" (Article 2(1)) | same consolidated text (parsed at each refresh) | 2026-09-24 |
Mark-up: "For the calculation of the number of CBAM certificates, the default values of the column ‘total emissions’ shall be selected and increased as follows:" "For goods in the cement, iron and steel, aluminium and hydrogen sectors, the mark-up shall be 10 % for the year 2026, 20 % for the year 2027 and 30 % for the year 2028 and onwards." "For goods in the fertiliser sector, the mark-up shall be 1 % for the year 2026 and onwards." Annex IV: "The ‘highest default values’ in this Annex shall be increased by the mark-ups laid down in the introductory part of Annex I." | Annex I and IV (introductory parts), consolidated text 02025R2621-20260101 of Implementing Regulation (EU) 2025/2621 ("02025R2621 — EN — 01.01.2026 — 001.001", includes Implementing Regulation (EU) 2026/1740 as M1; parsed at each refresh). Quoted, not applied. | 2026-09-24 |
For a listed country, a missing line or a field showing "–": use the table "Other countries and territories"; a country not listed: the same table, which this tool gives only when that table is asked for | Annex I (introductory part) to Implementing Regulation (EU) 2025/2621 as replaced by Implementing Regulation (EU) 2026/1740; same words in 02025R2621-20260101 | 2026-09-24 |
Production routes (A) to (L); "If no production route is indicated for a CN code, the CBAM benchmark (BM) is independent of the production route."; and for a route given at HS level (4 or 6 digits), a CN code without a route in Implementing Regulation (EU) 2025/2620 has a benchmark "independent of the production route" | same | 2026-09-24 |
"The default values for direct emissions and indirect emissions in Annex I have only been provided for information." | Recital 10 of Implementing Regulation (EU) 2026/1740 | 2026-09-24 |
Annex IV is for "a precursor" whose "country of production cannot be identified" | Article 1(5) of Implementing Regulation (EU) 2025/2621 | 2026-09-24 |
Default values for electricity are in Annex III, emission factors for indirect emissions in Annex II; the regulation says their data "is subject to a Creative Commons Non-Commercial Share-Alike 4.0 CC BY NC SA licence" | Article 1(3) and (4), Annexes II and III of Implementing Regulation (EU) 2025/2621 | 2026-09-24 |
"An Excel file is made available for information purposes only, while the legally binding values are set out in Commission Implementing Regulation (EU) 2025/2621." | 2026-09-24 | |
CN 2026 is set by Commission Implementing Regulation (EU) 2025/1926, CN 2025 by (EU) 2024/2522 | CELLAR metadata; data.europa.eu datasets combined-nomenclature-2026 and -2025 | 2026-09-24 |
27 EU Member States (their origins get no default value) | https://european-union.europa.eu/principles-countries-history/eu-countries_en | 2026-09-24 |
Later acts, checked in CELLAR on 2026-09-24 (cbam_mcp/data/later_acts.json, repeated at every refresh): no
act amending or correcting Implementing Regulation (EU) 2025/2621 is dated after Implementing
Regulation (EU) 2026/1740 (20 July 2026), and none amending Regulation (EU) 2023/956 after the
consolidation date. CELLAR lists corrigenda to both acts (2023/956 R(01) to R(04), 2025/2621 R(01)),
none with an English version. The Commission's CBAM page listed Implementing Regulation (EU) 2026/1740
as its latest update ("UPDATE JULY 2026") and the same Excel file on that day.
Choices of this tool, not rules: the status names (partially_in_scope covers both an "ex" line and a
heading whose sub-codes differ, and the answer says what it depends on); for a code shorter than 8
digits the status is derived from its CN 2026 sub-codes, and a prefix wider than the bundled chapters
(such as 27, of which only 2716 is bundled) is never reported as fully in scope; a country name close
to a known one (similarity 0.75 or more) is an error with a suggestion; refresh refuses an Annex I of
fewer than 20 lines in 5 categories, a CN answer of fewer than 500 concepts, or a consolidated
default-value text without the mark-up paragraph, as signs of a truncated or changed source.
Data, licences and attribution
The bundled files are in cbam_mcp/data/; cbam_mcp/data/SOURCES.md lists for each the URL,
licence, retrieval date, SHA-256 of the raw file and row counts. Licence bases, as the EUR-Lex legal
notice (https://eur-lex.europa.eu/content/legal-notice/legal-notice.html; archived copy
https://web.archive.org/web/20260922160312/https://eur-lex.europa.eu/content/legal-notice/legal-notice.html)
separates them; the page answered HTTP 202 with an empty body to curl from here, and was read on
2026-09-24 through a web-fetch tool:
Data | Source | Licence basis |
| Consolidated text of Regulation (EU) 2023/956, CELEX 02023R0956-20251020, from CELLAR ( | CC BY 4.0: "The copyright for the editorial content of this website, the summaries of EU legislation and the consolidated texts, which is owned by the EU, is licensed under the Creative Commons Attribution 4.0 International licence." Attribution: © European Union, https://eur-lex.europa.eu. Changes: table extracted (codes, descriptions, gases, exceptions). |
Mark-up quotes and the line-by-line check (in | Consolidated text 02025R2621-20260101 of Implementing Regulation (EU) 2025/2621, from CELLAR | CC BY 4.0, as above (consolidated text). |
| European Commission, DG TAXUD, "Default values definitive period (Excel format)", version 2 of 2026-08-06, https://taxation-customs.ec.europa.eu/document/download/1c05d211-80cb-4aaa-8ef0-e08005a95d7e_en | A Commission document, re-usable under Commission Decision 2011/833/EU (http://data.europa.eu/eli/dec/2011/833/oj), Article 4: "All documents shall be available for reuse: (a) for commercial or non-commercial purposes under the conditions laid down in Article 6; ..."; the Article 6(2) conditions: acknowledge the source, do not distort the original meaning. Changes: decimal commas converted to numbers in answers. |
| Official Journal text of Implementing Regulation (EU) 2026/1740 | An OJ text, not CC BY: "Unless otherwise specified, you can re-use the legal documents published in EUR-Lex for commercial or non-commercial purposes." with Decision 2011/833/EU, Articles 4 and 6(2). |
| Combined Nomenclature 2026 and 2025, EU Vocabularies, via the CELLAR SPARQL endpoint https://publications.europa.eu/webapi/rdf/sparql; chapters 25, 28, 31, 72, 73 and 76 in full, headings 2601 and 2716 with their chapters | European Commission reuse notice (COM_REUSE, Commission Decision 2011/833/EU), the licence data.europa.eu gives both distributions of the datasets combined-nomenclature-2026 and -2025. Attribution: Publications Office of the European Union. Changes: English labels only; leading dashes turned into an indent number. |
On 2026-09-24 every value of the Excel was compared with the Official Journal text of Implementing Regulation (EU) 2026/1740 and with the consolidated text 02025R2621-20260101 (XHTML from CELLAR): in both, 12,540 of 12,540 country lines in 122 tables and 283 of 283 Annex IV lines were identical, and the rules quoted above were found. Every refresh repeats the check against the consolidated text.
Refreshing the data
cbam-mcp refresh # all sources into cbam_mcp/data/ (in a checkout)
cbam-mcp refresh --check-oj # also compare every value with the Official Journal text (16 MB)
cbam-mcp refresh --data-dir DIR # elsewhere; then run with CBAM_MCP_DATA_DIR=DIRStandard library only (urllib, zipfile, xml.etree). Each source is fetched, parsed and checked on its
own; one that fails keeps its previous file, and files are replaced atomically. The newest
consolidated texts are looked up in CELLAR first, with 02023R0956-20251020 and 02025R2621-20260101 as
fallbacks; the consolidated default-value text (12 MB) is read at every refresh for the mark-up rule and
the check. If the Commission publishes a new Excel under another link, pass it with --excel-url;
SOURCES.md records which default-value downloads the Commission's page listed. Exit codes: 0
refreshed, 1 a check found a difference, 2 a source could not be refreshed.
What it reads, what it sends
Answering (MCP server and commands other than
refresh): reads the JSON files incbam_mcp/data/, or inCBAM_MCP_DATA_DIRif set. Sends nothing, writes nothing, reads no configuration or home-directory files. Your CN codes and countries stay on your machine.refresh: sends HTTPS requests topublications.europa.eu(CELLAR documents and SPARQL queries; the queries contain only fixed act numbers, CN chapter prefixes and identifiers returned by the previous query) and totaxation-customs.ec.europa.eu(the Excel and the CBAM page), with the User-Agentcbam-mcp/0.1.0 (+https://github.com/Keremozdemirra/cbam-mcp). It writes only the data directory. URL passwords and query strings are masked in its messages.
Licence
MIT for the code. The bundled data keeps the licence bases listed above.
What this is not
Not legal advice. It is information from dated copies of public sources; read the Official Journal text before relying on it.
Not a CBAM declaration tool. It does not prepare, check or submit CBAM declarations, does not talk to the CBAM Registry, and computes no certificates, prices or free allocation adjustments.
Not the legally binding values. The Excel is published "for information purposes only"; the binding values are Annex I and IV to Implementing Regulation (EU) 2025/2621 as corrected by Implementing Regulation (EU) 2026/1740, as published in the Official Journal. The listed values are shown before the mark-up; the rule is quoted, not applied. Default values for electricity and emission factors for indirect emissions (Annexes II and III) are not included.
No duty rates. Duty rates live in TARIC, for which the Commission's TARIC page (https://taxation-customs.ec.europa.eu/online-services/online-services-and-databases-customs/eu-customs-tariff-taric_en) lists no public API (read 2026-09-24): it links to the TARIC consultation application and says "TARIC raw data is also freely available in Excel format". This tool gives no tariff, TARIC measure or preference.
Available Tools
5 toolscbam_scopeCBAM scope of a CN codeARead-onlyIdempotent
Whether goods under a CN code are in the scope of the EU Carbon Border Adjustment Mechanism, from Annex I of Regulation (EU) 2023/956 as amended by Regulation (EU) 2025/2083 (consolidated text of 2025-10-20). Returns status 'in_scope', 'partially_in_scope' or 'not_in_scope' with the reason; the deciding Annex I line (goods category, greenhouse gases, exceptions, 'ex' flag); whether Annex II limits the goods to direct emissions; the de minimis texts (Article 2a, Annex VII) where they apply; the CN 2026 description. 'partially_in_scope' means an 'ex' line (only part of the code is covered: read the line's text) or a heading whose sub-codes differ. For codes shorter than 8 digits it lists the CN 2026 sub-codes in and out of scope (up to limit per list). Not legally binding; information, not legal advice.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | sub-codes listed per status, default 50 | |
| cn_code | Yes | CN code, 2 to 8 digits (or a 10-digit TARIC code), with or without spaces or dots: '7208 51 20', '72085120', '7208.51.20', '7208' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, so the bar is lower. The description adds real behavioral context: the meaning of each status value, that 'ex' lines split codes, that short codes enumerate sub-codes capped by `limit`, and that results are informational, not legally binding.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded and information-dense, but the middle sentence is a long run-on enumerating every return field, and the legal-source parenthetical adds bulk. Every clause carries information, yet the packed structure reduces readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-code lookup with no output schema, the description fully enumerates the returned fields, the status semantics, the 'ex'-line edge case, the short-code sub-code listing, and the de minimis provisions. Nothing an agent needs to invoke or interpret the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (cn_code format with/without separators, and limit) are fully documented in the schema. The description adds context on how `limit` interacts with short codes but doesn't extend beyond what the schema already states. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: determining whether goods under a CN code fall within the EU CBAM scope, citing the exact legal source (Annex I of Reg. 2023/956 as amended). This is clearly distinct from siblings like cn_describe (code description) and compare_origins (origin emission comparisons).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains what it returns and how to interpret 'partially_in_scope', but never says when to reach for this tool vs siblings like cn_describe or default_value. Usage is implied by the purpose rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cn_describeCombined Nomenclature descriptionARead-onlyIdempotent
The Combined Nomenclature description of a code in CN 2026 or CN 2025: label, self-explanatory text, the hierarchy above it (section, chapter, heading, subheading), its sub-codes, and whether the other year differs. Covers chapters 25, 28, 31, 72, 73, 76 and headings 2601 and 2716 (where the CBAM goods are); other codes return found=false. Not legally binding: the binding CN is the Official Journal text of Commission Implementing Regulation (EU) 2025/1926 (CN 2026) or 2024/2522 (CN 2025).
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | CN version, default 2026 | |
| cn_code | Yes | CN code, 2 to 8 digits (or a 10-digit TARIC code), with or without spaces or dots: '7208 51 20', '72085120', '7208.51.20', '7208' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior, but the description adds real context beyond them: the full shape of the response, the found=false failure mode for uncovered codes, the other-year diff field, and the non-binding legal caveat with the authoritative source cited.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the returned payload, then coverage limits, then the legal disclaimer. Dense but each sentence carries distinct, actionable information; the disclaimer is arguably the least essential clause but is relevant for a customs tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the burden of describing return values and failure semantics, and it also documents the supported-code scope and authoritative-source caveat. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters (year enum, cn_code format examples) are already fully documented in the schema. The description adds no syntax or semantics beyond what the structured fields provide, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific resource (CN code description) and enumerates exactly what it returns: label, text, hierarchy, sub-codes, cross-year delta. This is clearly distinct from siblings like compare_origins and cbam_scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Defines the operative scope precisely: covers chapters 25, 28, 31, 72, 73, 76 and headings 2601/2716, with other codes returning found=false. That effectively tells the agent when this tool will and won't yield data, though it doesn't route to an alternative tool for out-of-scope codes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_originsCompare CBAM default values across originsARead-onlyIdempotent
The CBAM default values of one CN code for several countries of origin side by side (up to 30), with the 'Other countries and territories' row and the Annex IV value, in tCO2e per tonne of good as listed in the Commission's Excel (not legally binding; binding: Implementing Regulation (EU) 2025/2621 as corrected by 2026/1740). Each country shows where its values come from, including the fallback rule when used.
| Name | Required | Description | Default |
|---|---|---|---|
| cn_code | Yes | CN code, 2 to 8 digits (or a 10-digit TARIC code), with or without spaces or dots: '7208 51 20', '72085120', '7208.51.20', '7208' | |
| countries | Yes | country names or ISO 3166-1 alpha-2 codes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower. The description adds meaningful context beyond annotations: the 30-country cap, inclusion of the 'Other countries and territories' row and Annex IV value, units (tCO2e per tonne), the legal caveat (Excel values not legally binding; the binding source is named), and that provenance/fallback rules are surfaced. It does not describe output format or pagination, but this is a comparison listing, so that gap is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence packing the 30-cap, special rows, units, legal caveat, and provenance behavior — front-loaded with the core purpose but burdened with parenthetical legal detail that partly competes with the main action. Efficient but somewhat overloaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only comparison tool with no output schema, the description supplies the essential domain context: scope (one CN code, several origins), special rows included, units, and the legal non-binding caveat with a pointer to the binding regulation. It does not specify return structure, but the comparison intent is adequately conveyed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema documents cn_code formats and the countries array with max 30. The description does not restate parameter syntax, but it reinforces the max-30 constraint and clarifies that origins are shown 'side by side', which frames how the countries array is used. Given the high schema coverage, this is above the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (compare side by side) and resource (CBAM default values of a CN code across countries of origin). It is reasonably distinguishable from siblings like default_value (single value) and sources, though it does not explicitly name or contrast against those siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the tool's purpose (comparing multiple origins at once, up to 30), but the description never explicitly states when to use this versus default_value for a single origin, nor when-not to use. No exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
default_valueCBAM default value for a CN code and originARead-onlyIdempotent
CBAM default values for goods under a CN code from one country of origin, from the Commission's Excel of definitive-period default values (the binding values are in Annex I to Implementing Regulation (EU) 2025/2621 as replaced by Implementing Regulation (EU) 2026/1740). Returns per matching table line: direct, indirect and total embedded emissions in tCO2e per tonne of good as listed, before the mark-up (markup_rule quotes the rule from the consolidated text; this tool does not apply it), the production-route letter and its meaning, the 'Other countries and territories' values where Annex I says to use them for a listed country (no line, or '–'), and the Annex IV value for precursors whose country of production is unknown. A country name the tool does not recognise is an error, never a fallback; for a third country the tables do not list, ask for country 'Other countries and territories'. EU Member States and Annex III origins (e.g. Norway, Switzerland) get an explanation instead of values; a code outside CBAM scope gets no value. No values for electricity (2716) and no indirect-emission factors: those are Annexes II and III, not in the Excel. Not legally binding.
| Name | Required | Description | Default |
|---|---|---|---|
| cn_code | Yes | CN code, 2 to 8 digits (or a 10-digit TARIC code), with or without spaces or dots: '7208 51 20', '72085120', '7208.51.20', '7208' | |
| country | Yes | country of origin: name as in the tables ('Türkiye', 'Korea, Republic of (South Korea)'), a common name ('Turkey'), or an ISO 3166-1 alpha-2 code ('TR') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, and the description adds substantial behavior beyond them: mark-up is not applied (a separate markup_rule quotes it), EU/Annex III origins return an explanation, unrecognised countries error, and Annex II/III content is deliberately excluded. That is richer disclosure than the safety hints alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded, but the body is a single sprawling paragraph mixing return fields, exclusions, error behavior and legal citations. Every clause is informative, yet the run-on structure makes it harder to scan than it needs to be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return-value burden and does so well: it enumerates direct, indirect and total embedded emissions, production-route letter, fallback values, and precursor handling. Combined with the coverage of error and exclusion cases, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning about the country parameter: it accepts table names, common names, or ISO alpha-2 codes, unrecognised names error rather than fall back, and it names the special sentinel 'Other countries and territories'. This goes beyond the schema's examples.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource pair: CBAM default values for goods under a CN code from a country of origin, and even names the authoritative source (the Commission's Excel). It implicitly separates itself from cbam_scope by noting that a code outside CBAM scope gets no value, but it never names siblings explicitly the way a 5 would.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete routing rules: unrecognised country is an error and never a fallback, third countries not listed should be queried as 'Other countries and territories', EU Member States and Annex III origins get an explanation instead of values, and electricity (2716) is out of scope. An agent knows exactly when this tool applies and what to do in edge cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sourcesSources, versions and licencesARead-onlyIdempotent
Where the answers come from: for each bundled dataset the URL, version label, retrieval date, SHA-256, row counts, legal status, licence and attribution line, the result of the check against the Official Journal text, and the later amending or correcting acts found in CELLAR at the last refresh.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, closed-world, non-destructive behavior, so the description does not need to restate safety. It adds valuable behavioral context by enumerating the return payload (URL, version, SHA-256, legal status, Official Journal check, CELLAR amendments) and noting the data is 'at the last refresh.'
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence that lists the returned provenance fields without filler. The enumeration is dense but appropriate because there is no output schema to carry that information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain the return values, and it does so comprehensively for each bundled dataset. Combined with annotations that cover safety and idempotency, it gives the agent enough to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero input parameters, so the baseline is 4. The description does not need to explain parameters and correctly focuses on the returned data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource ('Where the answers come from') and enumerates the exact provenance fields returned for each bundled dataset, so the agent knows it retrieves source/version/licence metadata. It does not explicitly contrast with sibling tools like compare_origins, so it misses the top tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit statement of when to use this tool versus alternatives, nor any exclusions. The opening phrase implies provenance lookup, but an agent must infer the use case from the field list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
cbam_scope - First observed
cn_describe - First observed
compare_origins - First observed
default_value - First observed
sources
TDQS
Scored across 5 tools
Each tool targets a distinct output: scope determination (cbam_scope), values for one origin (default_value), values across many origins (compare_origins), nomenclature lookup (cn_describe), and provenance (sources). The only real overlap is default_value vs. compare_origins, which are effectively single-origin vs. batched multi-origin views of the same data, but both descriptions make the split clear.
Names are all snake_case and readable, but verb placement is inconsistent: verb_noun (compare_origins), prefixed noun (cbam_scope), bare noun (default_value, sources), and noun_verb (cn_describe). A predictable pattern is not established, though an agent can still infer each tool's role.
Five tools are well-scoped for a reference-data lookup service: scope, single-origin values, multi-origin comparison, nomenclature description, and source metadata. No tool feels redundant or filler, and nothing essential appears missing from the count perspective.
The surface covers the core CBAM data workflows (scope check, default values, comparison, code descriptions, provenance). Gaps are minor-to-moderate: no keyword/reverse lookup for CN codes, no listing of in-scope goods, and markup is returned but never applied in a calculation, though that may be intentionally out of scope.
Maintenance
Related MCP Connectors
EU customs tariff classification: CN/HS code + GIR rule, MFN duty and EUDR scope. Sourced.
Deterministic HS6/TARIC customs resolution engine and bilingual FTS5 nomenclature API (UNE Node 04).
Verified CO2e for any transaction, activity, flight, shipment or CBAM import. 200+ countries.
Browser compatibility and Baseline status for any web feature — offline, from bundled MDN data.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceAn MCP-native compliance agent for the EU's Carbon Border Adjustment Mechanism (CBAM), enabling natural-language queries to validate shipments, calculate embedded emissions, and generate CBAM declarations.-
- AlicenseBqualityAmaintenanceProvides offline access to Spanish national security framework (ENS) measures, enabling querying of Annex II, applicability matrices, and audit checklists for compliance assessments.19MIT
- AlicenseAqualityCmaintenanceEnables users to determine whether an undertaking is in scope of the EU CSRD and from which financial year, returning a cited chain of rules and flagging issues that depend on national law. It runs offline and can show the article behind each scope step.4MIT
- AlicenseAqualityCmaintenanceEnables querying a local copy of the EU ETS Union Registry to search installations by name, country or activity, trace any installation's yearly verified emissions, free allocation and surrendered units, aggregate company installations by LEI, and rank top emitters, each answer carrying the snapshot date and attribution.5MIT