ru.xonta/customs
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., "@ru.xonta/customsCalculate duty and VAT for 1,000 leather shoes from China worth 20,000 CNY"
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.
Xonta Customs RU
MCP server for importing goods into Russia and the Eurasian Economic Union (EAEU). Free and open source.
What it does
Gives an AI agent the customs tools a Russian broker uses every day:
Tool | What it returns |
| Line items from a supplier invoice or packing list (Chinese, English, Russian headers): qty, price, amount, weights, HS code, Incoterms, origin, arithmetic checks, a TN VED search hint per line |
| TN VED EAEU (ТН ВЭД ЕАЭС) codes by product words or code prefix, with duty rates |
| Name, parent headings, parsed ETT duty rate, antidumping measures, EEC rulings for a code |
| Duty (ad valorem, specific, combined), antidumping, excise, VAT 22% / 10%, 2026 customs fee, total in RUB |
| Car recycling fee (утильсбор) for M1 vehicles by engine, volume, power, age and year (Dec 2025–2030), commercial and personal-use tables |
| 2026 customs clearance fee by declaration value, with the full bracket table |
| EAEU antidumping measures by code, product and origin country, with EEC decisions |
| EEC decisions on classification of specific goods (binding in all EAEU countries) |
| Official Bank of Russia rates used for customs payments |
| Data versions and sources |
What sets it apart:
Specific and combined rates. "10%, but not less than 2 EUR per pair" is parsed and computed, not skipped.
Every number has a source. Fees cite the Government decree, measures cite EEC decisions, rates cite the Bank of Russia.
No made-up numbers. If a rate can't be parsed or a measure's rate is unknown, the server says so and asks for it.
Russian legal context for 2026: VAT 22%, new customs fee scale, EAEU trade defence measures, the December 2025 power-based recycling fee for cars.
From invoice to payments. A Chinese invoice goes in, customs-ready lines come out: the supplier's HS code is used as the first 6 digits of TN VED, Incoterms tell what to add for customs value.
All results are informational. The final code and payments are decided by the declarant and customs.
Related MCP server: Bankr Industrial Customs MCP
Connect
Hosted (no install)
https://mcp.xonta.ru/customs/mcpClaude Desktop / Cursor / any client with remote MCP support:
{
"mcpServers": {
"xonta-customs": { "url": "https://mcp.xonta.ru/customs/mcp" }
}
}Local (stdio)
uvx xonta-customs-mcp{
"mcpServers": {
"xonta-customs": { "command": "uvx", "args": ["xonta-customs-mcp"] }
}
}The local server needs the tariff table for code search (calculation works without it if you pass the rate):
uvx --from xonta-customs-mcp xonta-customs-load-tariff tnved.xlsx --source "ETT EAEU, export of 05.11.2026"Any .xlsx or .csv with a header row containing a code column and a name column works;
the duty rate and unit columns are picked up when present.
Example
Shoes with leather uppers from China, 1 000 pairs, invoice value 20 000 CNY. What will customs cost?
The agent calls tnved_search("обувь с верхом из натуральной кожи"), then
calc_import_payments(customs_value=20000, currency="CNY", code="6403990000", quantity_pair=1000)
and gets duty by the specific part of the combined rate, VAT 22% on top, the 2026 fee and the total.
Here is the supplier's invoice (PDF). Work out the payments.
parse_invoice(file_url=...) returns three lines with quantities, prices, net weights and HS codes,
plus a note that FOB terms need freight and insurance added. Each line then goes through
tnved_search and calc_import_payments.
A 2 l, 170 hp car, 2 years old, imported by a company. Recycling fee?
calc_recycling_fee(engine="ice", power_hp=170, engine_volume_cc=1998) → coefficient 45, 900 000 RUB in 2026.
Data and sources
Data | Source | Updated |
TN VED EAEU and ETT rates | Decision of the EEC Council No. 80 of 14.09.2021, loaded from an export file | on load |
Customs fees 2026 | Government Decree No. 1637 of 28.11.2024 as amended by No. 1638 of 23.10.2025 | 01.01.2026 |
Import VAT | Tax Code art. 164 as amended by Federal Law No. 425-FZ | 01.01.2026 |
Antidumping measures | EEC Board decisions renewed in 2026 (partial list) | 05.11.2026 |
Classification rulings | EEC Board decisions (partial list) | 05.11.2026 |
Exchange rates | Bank of Russia, daily | live |
Car recycling fee | Government Decree No. 1291 of 26.12.2013, annex section I, as amended by No. 1713 of 01.11.2025 | 01.12.2025, schedule to 2030 |
Contributions of new measures and rulings are welcome: edit src/xonta_customs/data/*.json and open a PR.
Self-hosting
pip install xonta-customs-mcp
xonta-customs-load-tariff tnved.xlsx
ALLOWED_HOSTS=mcp.example.com xonta-customs-mcp --http --host 127.0.0.1 --port 8765Endpoints: /mcp (Streamable HTTP), /health, /.well-known/mcp/server-card.json.
See deploy/ for systemd and nginx examples, and Dockerfile.
PDF and scanned invoices are converted to Markdown by DocParse
(io.github.mrsergeiluzhnov/docparse in the MCP registry). Set DOCPARSE_URL (endpoint that takes {"url": ...} and
returns Markdown) and optionally DOCPARSE_TOKEN. Without it, .xlsx/.csv invoices still work,
and any client can pass invoice text directly in invoice_text. File links pointing to private or
local addresses are refused.
Development
pip install -e ".[dev]"
pytestLicense
MIT. Made by Xonta.
Xonta Customs RU — по-русски
Бесплатный MCP-сервер для импорта в Россию и ЕАЭС. Даёт ИИ-агенту инструменты таможенного брокера.
Инструменты
Инструмент | Что делает |
| Разбор инвойса или упаковочного листа поставщика (китайские, английские, русские заголовки): позиции, количество, цены, веса, HS-код, Инкотермс, проверка арифметики, подсказка для поиска ТН ВЭД |
| Подбор кодов ТН ВЭД ЕАЭС по описанию товара или началу кода, со ставками пошлин |
| Наименование, вышестоящие позиции, ставка ЕТТ в разобранном виде, антидемпинг, решения ЕЭК по коду |
| Пошлина (адвалорная, специфическая, комбинированная), антидемпинг, акциз, НДС 22% / 10%, сбор 2026 года, итог в рублях |
| Утильсбор на легковые автомобили по таблице с 01.12.2025 (по мощности), на 2026–2030 годы, для бизнеса и для личного пользования |
| Сбор за таможенные операции 2026 года по стоимости декларации |
| Антидемпинговые меры ЕАЭС по коду, товару и стране происхождения |
| Решения Коллегии ЕЭК о классификации отдельных товаров |
| Официальные курсы ЦБ РФ |
| Версии и источники данных |
Чем отличается
Считает специфические и комбинированные ставки: «10%, но не менее 2 евро за пару».
У каждой цифры есть источник: постановление, решение ЕЭК, курс ЦБ.
Не выдумывает цифры: если ставку не удалось разобрать или размер антидемпинговой пошлины неизвестен, сервер прямо об этом говорит.
Учитывает 2026 год: НДС 22%, новая шкала сборов, действующие меры защиты рынка ЕАЭС, утильсбор по мощности.
От инвойса до платежей: китайский инвойс на входе, готовые строки для расчёта на выходе.
Результаты справочные. Окончательно код и платежи определяют декларант и таможня.
Подключение
Удалённо, без установки
https://mcp.xonta.ru/customs/mcpClaude Desktop, Cursor и любой клиент с поддержкой удалённых MCP-серверов:
{
"mcpServers": {
"xonta-customs": { "url": "https://mcp.xonta.ru/customs/mcp" }
}
}Локально (stdio)
uvx xonta-customs-mcp{
"mcpServers": {
"xonta-customs": { "command": "uvx", "args": ["xonta-customs-mcp"] }
}
}Для поиска кодов локальному серверу нужна таблица ТН ВЭД. Расчёт работает и без неё, если передать ставку:
uvx --from xonta-customs-mcp xonta-customs-load-tariff tnved.xlsx --source "ЕТТ ЕАЭС, выгрузка от 05.11.2026"Подойдёт любой .xlsx или .csv со строкой заголовков, где есть колонки кода и наименования.
Колонки ставки и единицы измерения подхватываются, если они есть.
Примеры
Обувь с верхом из натуральной кожи из Китая, 1 000 пар, по инвойсу 20 000 юаней. Сколько заплатим на таможне?
Агент вызывает tnved_search("обувь с верхом из натуральной кожи"), затем
calc_import_payments(customs_value=20000, currency="CNY", code="6403990000", quantity_pair=1000)
и получает пошлину по специфической части комбинированной ставки, НДС 22% сверху, сбор 2026 года и итог.
Вот инвойс поставщика (PDF). Посчитай платежи.
parse_invoice(file_url=...) возвращает три позиции с количеством, ценами, весом нетто и HS-кодами,
и предупреждает, что при условиях FOB к таможенной стоимости нужно добавить фрахт и страховку.
Дальше каждая позиция проходит через tnved_search и calc_import_payments.
Автомобиль 2 л, 170 л. с., 2 года, ввозит компания. Какой утильсбор?
calc_recycling_fee(engine="ice", power_hp=170, engine_volume_cc=1998) → коэффициент 45, 900 000 рублей в 2026 году.
Данные и источники
Данные | Источник | Обновлено |
ТН ВЭД ЕАЭС и ставки ЕТТ | Решение Совета ЕЭК № 80 от 14.09.2021, загружается из файла выгрузки | при загрузке |
Таможенные сборы 2026 | Постановление Правительства № 1637 от 28.11.2024 в редакции № 1638 от 23.10.2025 | 01.01.2026 |
НДС при ввозе | Ст. 164 НК РФ в редакции Федерального закона № 425-ФЗ | 01.01.2026 |
Антидемпинговые меры | Решения Коллегии ЕЭК, продлённые в 2026 году (неполный список) | 05.11.2026 |
Решения о классификации | Решения Коллегии ЕЭК (неполный список) | 05.11.2026 |
Курсы валют | Банк России, ежедневно | в реальном времени |
Утильсбор на автомобили | Постановление Правительства № 1291 от 26.12.2013, приложение, раздел I, в редакции № 1713 от 01.11.2025 | 01.12.2025, график до 2030 |
Новые меры и решения можно добавить самому: правьте src/xonta_customs/data/*.json и присылайте pull request.
Своя установка
pip install xonta-customs-mcp
xonta-customs-load-tariff tnved.xlsx
ALLOWED_HOSTS=mcp.example.com xonta-customs-mcp --http --host 127.0.0.1 --port 8765Адреса: /mcp (Streamable HTTP), /health, /.well-known/mcp/server-card.json.
Примеры для systemd и nginx в папке deploy/, есть Dockerfile.
PDF и сканы инвойсов переводятся в Markdown через DocParse (io.github.mrsergeiluzhnov/docparse в реестре MCP).
Укажите DOCPARSE_URL (адрес, который принимает {"url": ...} и отдаёт Markdown) и при необходимости DOCPARSE_TOKEN.
Без этого инвойсы в .xlsx/.csv всё равно разбираются, а текст инвойса клиент может передать сам в invoice_text.
Ссылки на файлы с частных и локальных адресов сервер не открывает.
Разработка
pip install -e ".[dev]"
pytestЛицензия
MIT. Сделано в Xonta.
Available Tools
10 toolsantidumping_checkARead-onlyIdempotent
Check EAEU trade defence measures (antidumping duties) by code, product and origin country.
Returns matching measures with the Eurasian Economic Commission decision, the decision that sets duty rates per producer, expiry date and a link. The bundled list covers measures renewed in 2026 and is not exhaustive: absence of a match is not proof that no measure applies.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | TN VED EAEU code or prefix | |
| product | No | Product words in Russian or English, e.g. 'грузовые шины' | |
| origin_country | No | ISO alpha-2 country of origin, e.g. CN, UA, AZ |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered; the description adds real value on top by specifying the returned fields (EEC decision, per-producer duty rates, expiry date, link). Crucially it discloses the dataset's bounded coverage — measures renewed in 2026 only, not exhaustive — which is exactly the kind of non-obvious behavior that prevents false negatives.
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 is front-loaded in the first clause, followed by return contents and then the coverage caveat, so the agent gets what it needs early. The only waste is the awkward sentence break inside 'the decision that sets duty rates', which is a formatting artifact rather than redundant content.
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 correctly takes on the burden of describing return values (decision, rates, expiry, link), and the non-exhaustive caveat handles the main correctness risk. What is still missing is the filter-combination semantics for a tool whose three parameters are all optional, which matters for a lookup that may return everything.
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%, with each of the three parameters already documented including examples ('грузовые шины', 'CN, UA, AZ'), so the baseline is 3. The description restates the parameter names but does not explain how they combine (AND vs OR) or how prefix matching on the TN VED code behaves, so it adds little beyond the schema.
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 opens with a specific verb and resource — 'Check EAEU trade defence measures (antidumping duties)' — plus the three facets it can be queried by (code, product, origin country). This is a distinct domain from siblings like tnved_search or classification_rulings_search, so an agent can route to it without ambiguity.
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 only implied through the parameter list; the description never states when to prefer this over tnved_search or tnved_code_info, nor whether all three filters are optional (i.e. that an empty call lists everything). The one genuine guidance element is the caveat that absence of a match is not proof a measure applies, which tells the agent how to interpret a negative result.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calc_import_paymentsARead-onlyIdempotent
Calculate import customs payments into Russia for one goods item, in RUB.
Computes: import duty by the EAEU ETT rate (ad valorem, specific per kg/pcs/pair/litre, or combined 'X%, but not less than Y EUR per unit'), antidumping duty, excise, import VAT ((customs value + duty + antidumping + excise) x 22% or 10%) and the 2026 customs clearance fee by customs value bracket. Converts currencies at Bank of Russia rates. Returns a line-by-line breakdown with sources.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | TN VED EAEU code; its ETT duty rate is used if duty_rate is not given | |
| on_date | No | Declaration date YYYY-MM-DD for exchange rates; default today | |
| currency | No | Currency of customs_value: RUB, CNY, USD, EUR, etc. | RUB |
| vat_rate | No | Import VAT rate in 2026: 22 general, 10 for goods on Government lists (some food, children's goods, medical), 0 if exempt | |
| duty_rate | No | Duty rate as in the tariff, overrides the code: '10', '0', '0,6 евро за 1 кг', '15, но не менее 2,5 евро за 1 пару' | |
| excise_rub | No | Excise in RUB if the goods are excisable (alcohol, tobacco, fuel, cars) | |
| quantity_l | No | Litres | |
| quantity_kg | No | Net weight in kg, needed for per-kg specific rates | |
| quantity_m2 | No | Square metres | |
| quantity_cm3 | No | Engine displacement in cm3 | |
| quantity_pcs | No | Pieces, for per-piece rates | |
| customs_value | Yes | Customs value of the goods (usually CIF to the EAEU border) in `currency` | |
| quantity_pair | No | Pairs (footwear) | |
| exchange_rates | No | RUB per 1 unit, e.g. {'CNY': 11.2, 'EUR': 92.5}. If omitted, Bank of Russia rates for `on_date` are fetched | |
| recycling_fee_rub | No | Car recycling fee (утильсбор) in RUB from calc_recycling_fee, to show the full cost of importing a vehicle. Not part of the VAT base | |
| antidumping_rate_pct | No | Antidumping/countervailing/special duty rate in % of customs value, if a measure applies |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnly, idempotent, non-destructive, and openWorld; the description justifies the openWorld flag by disclosing that currencies are converted at Bank of Russia rates (a network fetch). It also discloses the VAT base composition and the shape of the result ('line-by-line breakdown with sources'), which is useful beyond the annotations. It stops short of stating failure behavior when neither code nor duty_rate is provided, or how rounding is handled.
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?
One line stating purpose and scope, followed by a compact formula digest and a return-value note. It is dense but front-loaded and every clause maps to a computed component or parameter family; minor cost is that the component list reads as a wall of commas rather than a structured list.
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 16-parameter calculator with no output schema, the description supplies the calculation logic, the currency-conversion behavior, and the return shape, which is most of what an agent needs to call it correctly. The remaining gap is edge-case behavior — what happens if both code and duty_rate are omitted, or if a specific rate is chosen without the matching quantity_* value.
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; the description earns above that by explaining why the quantity_* parameters exist, listing the rate forms (ad valorem, per kg/pcs/pair/litre, combined 'X% but not less than Y EUR') that the duty_rate string must match. It also clarifies the VAT base as customs value + duty + antidumping + excise, which is information the schema alone does not convey.
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 and resource — calculating Russian import customs payments for a single goods item in RUB — and enumerates the exact components computed (ETT duty, antidumping, excise, import VAT, 2026 clearance fee). That enumeration makes it unmistakable against siblings like tnved_search, antidumping_check, or customs_clearance_fee, which each cover only a fragment of this calculation.
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 phrase 'for one goods item' implicitly scopes usage to a single-line landed-cost calculation, and the formulas imply it is the aggregating tool. However, it never says when to use this versus customs_clearance_fee or calc_recycling_fee directly, nor what to do when no rate source is supplied. Guidance is inferable but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calc_recycling_feeARead-onlyIdempotent
Recycling fee (утилизационный сбор) for a passenger car (category M1) imported into Russia.
Uses the official coefficient table (Decree 1291 as amended by Decree 1713 of 01.11.2025): base rate 20 000 RUB x coefficient by engine type, volume, power band (kW), age and year (Dec 2025, 2026 ... 2030). Covers the commercial table and the personal-use table (0.17 / 0.26 for up to 160 hp and up to 3 l). Returns the coefficient, band and source.
| Name | Required | Description | Default |
|---|---|---|---|
| engine | Yes | ice = petrol/diesel; hybrid_parallel counts as ICE; ev = electric; hybrid_series = series hybrid (counts as EV) | |
| on_date | No | Date YYYY-MM-DD the fee is calculated for; default today. Tables run Dec 2025 - 2030 | |
| power_hp | No | Engine power in horsepower (л.с.); for EVs the 30-minute max power | |
| power_kw | No | Engine power in kW, alternative to power_hp | |
| personal_use | No | Imported by an individual for personal use (preferential 3 400 / 5 200 RUB up to 160 hp and 3 l) | |
| eaeu_extra_rub | No | For cars released in another EAEU country: sum of Ктп + Кндс + Ка (duty, VAT, excise differences), if known | |
| engine_volume_cc | No | Engine displacement in cm3 (required for ice and hybrid_parallel) | |
| older_than_3_years | No | True if more than 3 years have passed since the production date |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, closed-world, non-destructive), so the description's job is to add domain behavior — and it does: official coefficient table, base rate of 20 000 RUB, the temporal validity window of Dec 2025 through 2030, and the personal-use preferential rates. It even discloses the return payload (coefficient, band, source). It does not say what happens for a date outside the table window, which is the one behavioral gap.
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?
Three short paragraphs: what it computes, the table it uses, and what it returns — front-loaded and logically ordered. Slightly dense with legislative citations and duplicated rate figures, but every element is informative rather than filler.
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 an eight-parameter, read-only calculator with no output schema, the definition supplies scope, legal source, valid date window, and the shape of the result. The only missing pieces are out-of-range date handling and an explicit statement that parameter requirements (e.g. engine_volume_cc for ice) are enforced — the latter being covered by the schema.
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 the schema already documents every parameter including the engine enum, power units, and the ICE/hybrid volume requirement — baseline 3 applies. The description reinforces the banding logic (engine type, volume, kW power band, age, year) but adds no syntax or edge-case detail beyond what the schema states.
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 a specific verb+resource (calculating the recycling fee / утилизационный сбор) and pins the scope to M1 passenger cars imported into Russia, referencing the exact legal basis (Decree 1291 as amended by 1713). That is enough to separate it from siblings such as calc_import_payments or customs_clearance_fee, though it never explicitly states that it covers only the recycling fee and not the other import charges.
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 context is implied by the scope sentence (you are pricing a recycling fee for an imported passenger car), and the description notes both the commercial and personal-use tables. It gives no explicit when-to-use/when-not-to-use guidance against calc_import_payments, and does not warn that non-M1 vehicles (trucks, buses, motorcycles) are out of scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
classification_rulings_searchARead-onlyIdempotent
Search EEC (Eurasian Economic Commission) decisions on classification of specific goods.
These decisions are binding for all EAEU customs and are the strongest evidence for a code. Returns the decision number and date, the product, the TN VED code or heading and a source link.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | TN VED code or heading, e.g. '9013' | |
| query | No | Product words, e.g. 'прицел тепловизионный' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (read-only, idempotent, non-destructive), so the description's job is to add domain context, which it does: it discloses that results are legally binding across the EAEU and constitute the strongest evidence for a code, and it lists the returned fields (decision number, date, product, TN VED code/heading, source link). It does not mention result volume, ordering, or what happens when no ruling exists.
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?
Three short sentences, front-loaded with what the tool does, followed by the evidentiary weight rationale and then the return shape. No filler or restatement of the tool name.
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 properly compensates by enumerating the returned fields, and it conveys the legal significance of the data. Minor gap: nothing on combining the two optional filters or on behavior when no matching ruling is found.
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% and both parameters are documented in the schema with examples, so baseline 3 applies. The description adds nothing about the two parameters, notably not whether 'code' and 'query' are combined with AND semantics or whether one is preferred.
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 and resource: searching EEC decisions on classification of specific goods, with the scope narrowed to goods classification rather than tariff lookup generally. It implicitly distinguishes itself from tnved_search by framing the outputs as 'binding for all EAEU customs and the strongest evidence for a code', though it never names the sibling.
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 rather than stated: the note that these decisions are binding and are 'the strongest evidence for a code' tells an agent this is the authoritative source when a code needs justification. However, there is no explicit when-to-use/when-not, no mention of how it relates to tnved_search or tnved_code_info, and no guidance on when to query by code versus by product words.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
customs_clearance_feeARead-onlyIdempotent
Customs clearance fee (сбор за таможенные операции) for an import declaration into Russia in 2026.
The fee depends on the total customs value of the declaration: from 1 231 RUB (up to 200 000) to 73 860 RUB (over 10 million). Also returns the full bracket table and the legal source.
| Name | Required | Description | Default |
|---|---|---|---|
| total_customs_value_rub | Yes | Total customs value of all goods in the declaration, RUB |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world, and non-destructive behavior, so the bar is lower. Beyond that, the description adds genuinely useful context: the rate year (2026), the numeric bracket range (1 231 to 73 860 RUB), and that the bracket table plus legal source are returned alongside the fee.
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?
Three short lines, front-loaded with the definition, then the value range, then the return contents. The parenthetical Russian legal term is useful rather than filler; only mild redundancy between the fee range sentence and the parameter's name.
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 one required parameter and no output schema, the description fills the remaining gap by stating what is returned (fee, full bracket table, legal source) and which jurisdiction and year the rates apply to. Little an agent would need in order to call it correctly 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 coverage is 100% and the single parameter is fully documented in the schema. The description reinforces that the fee is driven by the total customs value of the declaration rather than per-item value, but adds no format or rounding detail beyond that, so the baseline of 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?
The description names the specific resource (customs clearance fee / сбор за таможенные операции), ties it to import declarations into Russia for 2026, and states the computation basis (total customs value). That is enough to separate it from siblings like calc_import_payments, calc_recycling_fee, and antidumping_check.
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 import-declaration context implies when the tool applies, but there is no explicit guidance such as when to use this versus calc_import_payments or calc_recycling_fee, and no stated prerequisites or exclusions. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
exchange_ratesARead-onlyIdempotent
Official Bank of Russia exchange rates (RUB per 1 unit) used for customs payments.
| Name | Required | Description | Default |
|---|---|---|---|
| on_date | No | Date YYYY-MM-DD; default today | |
| currencies | No | Currency codes, e.g. ['CNY','USD','EUR']; all if omitted |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds two genuinely useful facts beyond them, the authoritative source and the rate direction (RUB per 1 unit), but says nothing about the validity period of Central Bank rates or whether a non-trading day falls back to a prior quote.
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?
A single front-loaded sentence with the source, the unit convention and the use case packed into it; nothing is redundant and nothing needs reordering.
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 lookup with full annotation coverage and no output schema, the definition is nearly sufficient, and 'RUB per 1 unit' usefully implies the return shape. It stops short of noting that quotes are date-stamped by the Central Bank and may not exist for arbitrary dates, which an agent calling with a weekend date would want to know.
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%: on_date documents the YYYY-MM-DD format and today default, and currencies documents the code list plus the all-if-omitted behavior. The description adds no parameter meaning beyond that, which is the correct baseline when the schema does the work.
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 a specific resource (official Bank of Russia exchange rates), states the unit convention (RUB per 1 unit), and gives the business context (customs payments). It is distinguishable from every sibling, none of which is a rate lookup, though it never states the retrieval verb or scope explicitly.
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?
'used for customs payments' implies the context in which an agent would reach for this tool, but there is no explicit when-to-use rule, no mention of when a different tool (e.g. calc_import_payments, which presumably consumes these rates) is the better choice, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
parse_invoiceARead-onlyIdempotent
Parse a supplier's commercial invoice or packing list into customs-ready line items.
Extracts invoice number, date, parties, currency, Incoterms and country of origin, and for each line: description, model, material, supplier HS code, quantity, unit, price, amount, net and gross weight. Checks arithmetic (qty x price, sum vs total), explains what to add to the invoice value for customs value under the given Incoterms, and suggests a TN VED search query per line (HS code first 6 digits or Russian keywords). Feed the lines to tnved_search and calc_import_payments.
| Name | Required | Description | Default |
|---|---|---|---|
| file_url | No | Public link to the invoice file: .xlsx/.csv are parsed directly; PDF/scans/DOCX go through DocParse when the server has it configured | |
| invoice_text | No | Invoice or packing list as Markdown or plain text, e.g. the output of DocParse. Tables with English, Chinese (品名, 数量, 单价, 金额, 净重) or Russian headers |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world, so safety is covered. The description adds real value beyond that: it discloses arithmetic validation, an Incoterms-based customs value explanation, and per-line TN VED query suggestion — behaviors an agent couldn't infer from the schema. It doesn't mention behavior on unparseable or low-confidence files, which keeps it short of a 5.
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 with the purpose, then the extracted-field list, then the derived behaviors, then the handoff. Dense but every clause carries information; the field enumeration is long but directly useful for verifying extraction quality.
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 only two optional parameters, no output schema, and full schema coverage, the description compensates well by enumerating the returned line fields and the derived checks. The only gap is the concrete response envelope (e.g. how warnings about arithmetic mismatches are surfaced).
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% and both parameters are documented in-schema, including the xlsx/csv vs PDF/DOCX routing. The description adds no parameter-level guidance of its own, 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?
States a specific verb and resource (parse a supplier's commercial invoice or packing list into customs-ready line items) and enumerates exactly what is extracted, so an agent can tell it apart from tnved_search or calc_import_payments immediately.
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?
Explicitly routes the agent downstream: 'Feed the lines to tnved_search and calc_import_payments', establishing this as the first step of a pipeline. It lacks an explicit when-not-to-use clause, but the extraction-then-classify framing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
server_statusARead-onlyIdempotent
Data versions of this server: tariff load date and source, antidumping and rulings list dates, fee table source.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world, non-destructive behavior, so the safety profile is covered. The description adds value by disclosing what the response actually contains (load dates, list dates, sources), which is important because there is no output schema. It does not mention date formats or how missing/never-loaded data is represented.
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?
A single compact clause with no filler, and the most useful information (that it exposes data versions) is front-loaded. It is a sentence fragment rather than a full statement, which slightly reduces immediate clarity but wastes no words.
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 zero-parameter, read-only metadata tool with no output schema, the description covers the essential return contents well enough for an agent to decide to call it. Gaps are minor: no date format, no statement of which datasets are absent if not yet loaded.
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?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. The field list it does provide relates to the return payload rather than inputs, which is appropriate here.
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 precisely: data versions of this server, enumerated as tariff load date and source, antidumping and rulings list dates, and fee table source. It is clearly distinguishable from every sibling (searches, calculators, parsers) as the metadata/provenance tool. It lacks an explicit verb such as 'returns' and the name 'server_status' is broader than the actual content, which keeps it from a 5.
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 call this versus the sibling tools. Usage is only implied: an agent can infer it is for checking data currency/provenance before trusting tariff, antidumping, or fee results. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tnved_code_infoARead-onlyIdempotent
Get everything known about one TN VED EAEU code.
Returns the official name with parent headings, the ETT import duty rate parsed into ad valorem / specific / combined parts, EAEU antidumping measures that may apply (filtered by origin country if given) and EEC classification rulings for this heading.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | TN VED EAEU code, 4-10 digits, spaces allowed, e.g. '8413 60 310 0' | |
| origin_country | No | ISO 3166-1 alpha-2 country of origin, e.g. 'CN', to check antidumping measures |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, non-destructive, and closed-world, so safety and repeatability are known. The description adds real value beyond that by disclosing the returned data composition and that the duty rate is decomposed into ad valorem / specific / combined parts, plus the conditional filtering of antidumping measures. It does not cover behavior on invalid or out-of-range codes (schema allows 4–10 digits) or how requests behave for missing tariff lines.
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 with the core action in the first sentence, then a compact enumeration of return contents. No filler or restatement of the title; the phrasing is dense but readable. Slightly long return-list sentence could be tightened, but every element carries 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 carries the burden of describing returns, and it does so at a reasonable level — name, parent headings, duty rate decomposition, antidumping measures, and rulings. It is complete enough for an agent to judge relevance and call it correctly, though it stops short of describing output structure or edge-case behavior for unrecognized codes.
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 the schema already documents both parameters, making 3 the baseline. The description adds genuine meaning beyond the schema by clarifying that origin_country acts as a filter — omitted ('if given') it returns antidumping measures unfiltered rather than failing, a conditional behavior the schema does not state.
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 and resource ('Get everything known about one TN VED EAEU code') and scopes it to a single code, which implicitly separates it from the sibling tnved_search. The second paragraph enumerates exactly what 'everything' covers — official name with parent headings, parsed duty rate, antidumping measures, and classification rulings — so an agent knows what it will receive.
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 rather than stated: the description signals a single-code lookup and hints that origin_country is only relevant for antidumping checks ('filtered by origin country if given'). There is no explicit statement of when to prefer antidumping_check or classification_rulings_search, or when this aggregate tool is the better choice than those narrower siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tnved_searchARead-onlyIdempotent
Search the TN VED EAEU (ТН ВЭД ЕАЭС) commodity nomenclature by product words or code prefix.
Returns candidate 10-digit codes with official names and the ETT import duty rate. Use the candidates to pick a code, then call tnved_code_info for details. Text search matches nomenclature wording, so use technical terms (material, function), not brand names. Results are candidates, not a classification decision.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results | |
| query | Yes | Product description in Russian (e.g. 'насос шестеренный гидравлический') or a code prefix like '8413' or '8413603100' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real value beyond them: it discloses the return payload (candidate 10-digit codes, official names, ETT import duty rate) and the important interpretive caveat that matches are candidates rather than rulings. It stops short of stating how many candidates are typical or how ranking works, so it is strong but not exhaustive.
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?
Four short sentences, front-loaded with the action and query modes, followed by return shape, the follow-up tool, and the caveat. No filler or restatement of the tool name.
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 and only two parameters, the description carries the necessary burden: it covers input semantics, returned fields, and the downstream tool to call. An agent has everything needed to invoke it correctly and interpret results.
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; the description still adds meaning by specifying that queries should be Russian technical vocabulary (material, function) or a code prefix, reinforcing the schema's example. The limit parameter is left to the schema with no guidance on when to raise it.
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 verb plus resource ('Search the TN VED EAEU commodity nomenclature') and states both accepted query modes (product words or code prefix). An agent can immediately distinguish it from tnved_code_info, which is explicitly framed as the follow-up detail lookup.
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 explicit when-to-use ('text search matches nomenclature wording, so use technical terms... not brand names'), names the alternative and the handoff sequence ('Use the candidates to pick a code, then call tnved_code_info for details'), and adds a scope caveat that results are not a classification decision.
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.
10 tool updates
v0.2.1- First observed
antidumping_check - First observed
calc_import_payments - First observed
calc_recycling_fee - First observed
classification_rulings_search - First observed
customs_clearance_fee - First observed
exchange_rates - First observed
parse_invoice - First observed
server_status - First observed
tnved_code_info - First observed
tnved_search
TDQS
Scored across 10 tools
Each tool has a distinct primary role (nomenclature search vs. code detail vs. payment calc vs. invoice parsing vs. reference lookups), and descriptions explicitly chain them (parse_invoice → tnved_search → calc_import_payments). Minor overlap remains: calc_import_payments already computes the customs clearance fee that customs_clearance_fee exposes separately, and tnved_code_info returns antidumping measures that antidumping_check also covers (albeit with producer-level rates and origin filtering).
All names are snake_case and follow a legible scheme: lookups use domain+suffix (tnved_search, antidumping_check, classification_rulings_search), calculators use verb_noun (calc_import_payments, calc_recycling_fee, parse_invoice), and reference data uses plain nouns (exchange_rates, server_status). The mix of verb-first and noun-first patterns is a minor inconsistency but never confusing.
Ten tools is squarely in the well-scoped range, and each maps to a real step in the customs-classification-and-payment workflow rather than being filler. No tool feels redundant enough to be dropped outright (the clearance-fee tool is the only borderline case).
The surface covers the core lifecycle: invoice parsing, code search, code detail, duty/VAT/excise computation, recycling fee, clearance fee, antidumping measures, binding rulings, FX rates and data provenance. Gaps exist for adjacent needs (export payments, customs-value adjustment methods, personal-use import limits, or producing a declaration), but the stated classification/import-payment scope is well served.
Maintenance
Related MCP Connectors
Russian docs for AI agents: invoices/acts PDF, document parsing, INN checks, medical ad checks
Classify, validate & verify HS codes and access tariff compliance data for cross-border trade
Cross-border duty-rate and Trade & Tariff content lookups with product compliance and restrictions
Neutral freight reference + validation layer for AI agents: ADR, HS, UN/LOCODE, freight math
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceProvides 14 customs and trade operations as MCP tools, enabling AI agents to query tariff, track declarations, screen dual-use items, and generate AI-powered declarations.20 npm2MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to perform international trade operations such as calculating landed costs, classifying goods, explaining trade terms, estimating shipping, and converting currencies for Kazakhstan/EAEU/Central Asia trade routes.14 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to search EU/French customs codes, get duty rates, and monitor tariff changes via natural language, using the DouaneCode API.MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to track packages, rate and create shipments, manage pickups and customs documentation, and perform international shipping logistics checks through natural language.MIT