commerce-validators
Commerce validators: live EU VAT (VIES), EORI, email/MX lookups; IBAN/ABA/GTIN checksums; VAT rates.
Should I use this
Quality & Safety
Findings (2)
- LOWin payout_reconciliation
- LOWin reorder_point
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"commerce-validators": {
"url": "https://mcp.scienceswarm.org/mcp"
}
}
}Remote endpoints
https://mcp.scienceswarm.org/mcpstreamable-httpWhat it can do
Tool inventory
Tools (10)
⚪validate_iban(iban)
Validate an IBAN (International Bank Account Number) by structure + the ISO 7064 mod-97 checksum. Catches typos/invalid accounts before you initiate a transfer. Pure-algorithm; no data leaves the machine.
Input Schema
{
"type": "object",
"properties": {
"iban": {
"title": "Iban",
"type": "string"
}
},
"required": [
"iban"
],
"title": "validate_ibanArguments"
}🟢validate_gtin(code)
Validate a GTIN / UPC / EAN barcode (GTIN-8/12/13/14) by its check digit. Catches mistyped product barcodes in inventory/catalog workflows. Pure-algorithm.
Input Schema
{
"type": "object",
"properties": {
"code": {
"title": "Code",
"type": "string"
}
},
"required": [
"code"
],
"title": "validate_gtinArguments"
}⚪validate_aba_routing(routing_number)
Validate a US ABA bank routing number (9 digits) by its checksum. Catch typos before initiating an ACH/wire payout. Pure-algorithm; nothing leaves the machine.
Input Schema
{
"type": "object",
"properties": {
"routing_number": {
"title": "Routing Number",
"type": "string"
}
},
"required": [
"routing_number"
],
"title": "validate_aba_routingArguments"
}⚪validate_eu_vat(vat_number)
Validate an EU VAT number against the official EU VIES service (live government lookup). Returns whether it is registered/valid and, if available, the registered trader name + address. An LLM cannot know this without the real lookup — use this before invoicing/reverse-charging an EU B2B customer. Input e.g. 'DE811569869' or 'IE6388047V' (country code + number).
Input Schema
{
"type": "object",
"properties": {
"vat_number": {
"title": "Vat Number",
"type": "string"
}
},
"required": [
"vat_number"
],
"title": "validate_eu_vatArguments"
}🟢validate_eori(eori)
Validate an EORI number (Economic Operators Registration and Identification) against the official EU customs database (live lookup). An EORI is required for EU imports/exports — check a trading partner's or your own EORI before customs filings / freight bookings. Input e.g. 'DE1234567890123' (country code + number).
Input Schema
{
"type": "object",
"properties": {
"eori": {
"title": "Eori",
"type": "string"
}
},
"required": [
"eori"
],
"title": "validate_eoriArguments"
}🟢check_email_domain(email_or_domain)
Check whether a domain can actually receive email (has MX records) via a real DNS-over-HTTPS lookup — validate a customer/supplier email's domain before sending or invoicing. An LLM can't know current DNS; this does the live lookup.
Input Schema
{
"type": "object",
"properties": {
"email_or_domain": {
"title": "Email Or Domain",
"type": "string"
}
},
"required": [
"email_or_domain"
],
"title": "check_email_domainArguments"
}🟡vat_rate_by_country(country_code, date)
EU VAT rates (standard / reduced / super-reduced / parking) for a country, from the maintained ibericode/vat-rates dataset (fetched live, cached 24h) — including which rate set was in force on an optional 'date' (YYYY-MM-DD) and the names of regional exceptions (e.g. Canary Islands). Input e.g. 'DE', 'FR', 'HU'.
Input Schema
{
"type": "object",
"properties": {
"country_code": {
"title": "Country Code",
"type": "string"
},
"date": {
"default": "",
"title": "Date",
"type": "string"
}
},
"required": [
"country_code"
],
"title": "vat_rate_by_countryArguments"
}🟢stripe_connect_split(charge_amount, application_fee_pct, application_fee_fixed, processing_pct, processing_fixed, ...)
Compute the Stripe Connect three-way split for one charge. Returns what the buyer pays, what Stripe takes, what the platform nets (its application fee), and what the connected seller nets — plus the platform's effective take rate. fee_bearer: 'seller' | 'platform' | 'buyer' (who absorbs the Stripe processing fee). Rates are editable; defaults are US card standard 2.9%+$0.30.
Input Schema
{
"type": "object",
"properties": {
"charge_amount": {
"title": "Charge Amount",
"type": "number"
},
"application_fee_pct": {
"default": 0,
"title": "Application Fee Pct",
"type": "number"
},
"application_fee_fixed": {
"default": 0,
"title": "Application Fee Fixed",
"type": "number"
},
"processing_pct": {
"default": 2.9,
"title": "Processing Pct",
"type": "number"
},
"processing_fixed": {
"default": 0.3,
"title": "Processing Fixed",
"type": "number"
},
"fee_bearer": {
"default": "seller",
"title": "Fee Bearer",
"type": "string"
}
},
"required": [
"charge_amount"
],
"title": "stripe_connect_splitArguments"
}🟢payout_reconciliation(gross_sales, refunds, processing_fees, chargebacks, other_deductions, ...)
Explain why a payout is less than sales: walk gross -> deductions -> expected, and (if actual_deposit given) flag the unexplained gap (shortfall/surplus).
Input Schema
{
"type": "object",
"properties": {
"gross_sales": {
"title": "Gross Sales",
"type": "number"
},
"refunds": {
"default": 0,
"title": "Refunds",
"type": "number"
},
"processing_fees": {
"default": 0,
"title": "Processing Fees",
"type": "number"
},
"chargebacks": {
"default": 0,
"title": "Chargebacks",
"type": "number"
},
"other_deductions": {
"default": 0,
"title": "Other Deductions",
"type": "number"
},
"actual_deposit": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "Actual Deposit"
}
},
"required": [
"gross_sales"
],
"title": "payout_reconciliationArguments"
}⚪reorder_point(avg_daily_sales, lead_time_days, safety_stock, on_hand)
Reorder point = lead-time demand + safety stock. If on_hand is given, returns whether to reorder now and the days of cover remaining.
Input Schema
{
"type": "object",
"properties": {
"avg_daily_sales": {
"title": "Avg Daily Sales",
"type": "number"
},
"lead_time_days": {
"title": "Lead Time Days",
"type": "number"
},
"safety_stock": {
"default": 0,
"title": "Safety Stock",
"type": "number"
},
"on_hand": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"default": null,
"title": "On Hand"
}
},
"required": [
"avg_daily_sales",
"lead_time_days"
],
"title": "reorder_pointArguments"
}Community
Evidence