Skip to main content
Glama

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

parse_invoice

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

tnved_search

TN VED EAEU (ТН ВЭД ЕАЭС) codes by product words or code prefix, with duty rates

tnved_code_info

Name, parent headings, parsed ETT duty rate, antidumping measures, EEC rulings for a code

calc_import_payments

Duty (ad valorem, specific, combined), antidumping, excise, VAT 22% / 10%, 2026 customs fee, total in RUB

calc_recycling_fee

Car recycling fee (утильсбор) for M1 vehicles by engine, volume, power, age and year (Dec 2025–2030), commercial and personal-use tables

customs_clearance_fee

2026 customs clearance fee by declaration value, with the full bracket table

antidumping_check

EAEU antidumping measures by code, product and origin country, with EEC decisions

classification_rulings_search

EEC decisions on classification of specific goods (binding in all EAEU countries)

exchange_rates

Official Bank of Russia rates used for customs payments

server_status

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/mcp

Claude 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 8765

Endpoints: /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]"
pytest

License

MIT. Made by Xonta.


Xonta Customs RU — по-русски

Бесплатный MCP-сервер для импорта в Россию и ЕАЭС. Даёт ИИ-агенту инструменты таможенного брокера.

Инструменты

Инструмент

Что делает

parse_invoice

Разбор инвойса или упаковочного листа поставщика (китайские, английские, русские заголовки): позиции, количество, цены, веса, HS-код, Инкотермс, проверка арифметики, подсказка для поиска ТН ВЭД

tnved_search

Подбор кодов ТН ВЭД ЕАЭС по описанию товара или началу кода, со ставками пошлин

tnved_code_info

Наименование, вышестоящие позиции, ставка ЕТТ в разобранном виде, антидемпинг, решения ЕЭК по коду

calc_import_payments

Пошлина (адвалорная, специфическая, комбинированная), антидемпинг, акциз, НДС 22% / 10%, сбор 2026 года, итог в рублях

calc_recycling_fee

Утильсбор на легковые автомобили по таблице с 01.12.2025 (по мощности), на 2026–2030 годы, для бизнеса и для личного пользования

customs_clearance_fee

Сбор за таможенные операции 2026 года по стоимости декларации

antidumping_check

Антидемпинговые меры ЕАЭС по коду, товару и стране происхождения

classification_rulings_search

Решения Коллегии ЕЭК о классификации отдельных товаров

exchange_rates

Официальные курсы ЦБ РФ

server_status

Версии и источники данных

Чем отличается

  • Считает специфические и комбинированные ставки: «10%, но не менее 2 евро за пару».

  • У каждой цифры есть источник: постановление, решение ЕЭК, курс ЦБ.

  • Не выдумывает цифры: если ставку не удалось разобрать или размер антидемпинговой пошлины неизвестен, сервер прямо об этом говорит.

  • Учитывает 2026 год: НДС 22%, новая шкала сборов, действующие меры защиты рынка ЕАЭС, утильсбор по мощности.

  • От инвойса до платежей: китайский инвойс на входе, готовые строки для расчёта на выходе.

Результаты справочные. Окончательно код и платежи определяют декларант и таможня.

Подключение

Удалённо, без установки

https://mcp.xonta.ru/customs/mcp

Claude 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 tools
antidumping_checkA
Read-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.

NameRequiredDescriptionDefault
codeNoTN VED EAEU code or prefix
productNoProduct words in Russian or English, e.g. 'грузовые шины'
origin_countryNoISO alpha-2 country of origin, e.g. CN, UA, AZ

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_paymentsA
Read-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.

NameRequiredDescriptionDefault
codeNoTN VED EAEU code; its ETT duty rate is used if duty_rate is not given
on_dateNoDeclaration date YYYY-MM-DD for exchange rates; default today
currencyNoCurrency of customs_value: RUB, CNY, USD, EUR, etc.RUB
vat_rateNoImport VAT rate in 2026: 22 general, 10 for goods on Government lists (some food, children's goods, medical), 0 if exempt
duty_rateNoDuty rate as in the tariff, overrides the code: '10', '0', '0,6 евро за 1 кг', '15, но не менее 2,5 евро за 1 пару'
excise_rubNoExcise in RUB if the goods are excisable (alcohol, tobacco, fuel, cars)
quantity_lNoLitres
quantity_kgNoNet weight in kg, needed for per-kg specific rates
quantity_m2NoSquare metres
quantity_cm3NoEngine displacement in cm3
quantity_pcsNoPieces, for per-piece rates
customs_valueYesCustoms value of the goods (usually CIF to the EAEU border) in `currency`
quantity_pairNoPairs (footwear)
exchange_ratesNoRUB per 1 unit, e.g. {'CNY': 11.2, 'EUR': 92.5}. If omitted, Bank of Russia rates for `on_date` are fetched
recycling_fee_rubNoCar 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_pctNoAntidumping/countervailing/special duty rate in % of customs value, if a measure applies

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_feeA
Read-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.

NameRequiredDescriptionDefault
engineYesice = petrol/diesel; hybrid_parallel counts as ICE; ev = electric; hybrid_series = series hybrid (counts as EV)
on_dateNoDate YYYY-MM-DD the fee is calculated for; default today. Tables run Dec 2025 - 2030
power_hpNoEngine power in horsepower (л.с.); for EVs the 30-minute max power
power_kwNoEngine power in kW, alternative to power_hp
personal_useNoImported by an individual for personal use (preferential 3 400 / 5 200 RUB up to 160 hp and 3 l)
eaeu_extra_rubNoFor cars released in another EAEU country: sum of Ктп + Кндс + Ка (duty, VAT, excise differences), if known
engine_volume_ccNoEngine displacement in cm3 (required for ice and hybrid_parallel)
older_than_3_yearsNoTrue if more than 3 years have passed since the production date

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

customs_clearance_feeA
Read-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.

NameRequiredDescriptionDefault
total_customs_value_rubYesTotal customs value of all goods in the declaration, RUB

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_ratesA
Read-onlyIdempotent

Official Bank of Russia exchange rates (RUB per 1 unit) used for customs payments.

NameRequiredDescriptionDefault
on_dateNoDate YYYY-MM-DD; default today
currenciesNoCurrency codes, e.g. ['CNY','USD','EUR']; all if omitted

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_invoiceA
Read-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.

NameRequiredDescriptionDefault
file_urlNoPublic link to the invoice file: .xlsx/.csv are parsed directly; PDF/scans/DOCX go through DocParse when the server has it configured
invoice_textNoInvoice or packing list as Markdown or plain text, e.g. the output of DocParse. Tables with English, Chinese (品名, 数量, 单价, 金额, 净重) or Russian headers

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_statusA
Read-onlyIdempotent

Data versions of this server: tariff load date and source, antidumping and rulings list dates, fee table source.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_infoA
Read-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.

NameRequiredDescriptionDefault
codeYesTN VED EAEU code, 4-10 digits, spaces allowed, e.g. '8413 60 310 0'
origin_countryNoISO 3166-1 alpha-2 country of origin, e.g. 'CN', to check antidumping measures

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 10 tool updatesv0.2.1
    • First observedantidumping_check
    • First observedcalc_import_payments
    • First observedcalc_recycling_fee
    • First observedclassification_rulings_search
    • First observedcustoms_clearance_fee
    • First observedexchange_rates
    • First observedparse_invoice
    • First observedserver_status
    • First observedtnved_code_info
    • First observedtnved_search

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation4/5

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).

Naming Consistency4/5

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.

Tool Count5/5

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).

Completeness4/5

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

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides 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 npm
    2
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to search EU/French customs codes, get duty rates, and monitor tariff changes via natural language, using the DouaneCode API.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to track packages, rate and create shipments, manage pickups and customs documentation, and perform international shipping logistics checks through natural language.
    MIT