mcpField
T
toll402 – EU & Nordic Data (x402)

toll402 – EU & Nordic Data (x402)

Remote

About toll402 – EU & Nordic Data (x402)

toll402 is a remote MCP server and HTTP API for agents that need EU and Nordic public-sector and related data. It charges per request through x402 stablecoin payments, without requiring an API key or account.

Key features

  1. 01EU VAT and company lookups
  2. 02Sanctions and MiCA checks
  3. 03ECB and Danish FX rates
  4. 04Nordic calendars and Danish energy data
  5. 05Search, jobs, ads and procurement data

Use cases

  1. 01Check VAT numbers and sanctions
  2. 02Convert currencies using official rates
  3. 03Find working days and electricity windows
  4. 04Search tenders, jobs and public ad libraries

MCP support

Provides a streamable HTTP MCP server at https://toll402.io/mcp, exposing data endpoints as tools. Calls use x402 payments; an unpaid request returns payment requirements for the agent to satisfy.

Configuration

Remote servers need no local install. Pick your client, then copy the config or install in one click.

Endpointhttps://toll402.io/mcp
Copy install command
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

Run commands in a terminal; paste JSON into the client’s MCP config and restart. Servers that need sign-in will prompt on first connect.

Tools

Details

From the project README

toll402: EU & Nordic data for AI agents, paid per call (x402 + MCP)

25 live data endpoints · $0.005–$0.03 per call · no API key, no account, no signup · non-custodial

x402 · MCP · AI agents · agent payments · USDC / EURC on Base · USDC on Polygon & Arc · XRP & RLUSD on the XRP Ledger (RLUSD: non-EU buyers only) · EU VAT / VIES · EU, OFAC, UK & UN sanctions screening · MiCA · ECB FX · Nordic calendars · Danish energy data · Google Trends · Indeed jobs (DK/SE/NO + 57 countries)

Runnable examples (curl, Node x402 client, MCP configs): AtlasDataDenmark/toll402-examples

toll402 is an HTTP API and a remote MCP server that sells official EU and Danish/Nordic public-sector data to AI agents one call at a time. It uses the x402 protocol: an unpaid request gets 402 Payment Required with the payment requirements in the PAYMENT-REQUIRED header (x402 v2) and mirrored in the JSON body (x402Version + accepts), the agent's wallet signs a stablecoin payment, and the call goes through. Funds go straight from the buyer to the seller's address. toll402 never holds funds.

Why: agents that do invoicing, payroll, compliance, logistics or energy scheduling keep needing small facts like "is this VAT number valid?", "is the 24th a Danish banking day?" or "what is the ECB rate for that date?". Today each of those means a separate API key and account. With toll402 one wallet covers all of them, and you pay only for the calls you make.

Endpoints and prices

MCP toolHTTP endpointWhat it returnsPrice (USD)
eu_vat_checkGET /v1/eu/vat-check?vat=DK10150817Live EU VAT number validation against the European Commission's VIES service0.01
no_companyGET /v1/no/company?orgnr=923609016Norwegian company lookup in Brønnøysund Enhetsregisteret by orgnr or name (NLOD 2.0)0.01
fi_companyGET /v1/fi/company?businessId=0112038-9Finnish company lookup in PRH/YTJ open data v3 by Business ID or name (CC BY 4.0)0.01
lei_lookupGET /v1/lei?lei=5493001KJTIIGC8Y1R12Legal Entity Identifier lookup in the GLEIF Global LEI Index by LEI or legal name (CC0)0.01
eu_vat_ratesGET /v1/eu/vat-rates?country=DKStandard, reduced, super-reduced and parking VAT rates for EU member states0.005
eu_sanctionsGET /v1/eu/sanctions?name=WagnerScreen a person or company name against the EU consolidated financial sanctions list (fuzzy match, refreshed every 6 h)0.02
sanctions_screen_globalGET /v1/sanctions/screen?name=WagnerScreen a name against EU, US OFAC SDN, UK Sanctions List (FCDO, incl. HM Treasury/OFSI asset freezes) and UN Security Council lists at once; per match: list, programme, reference, match_score, matched_alias (lists=eu,ofac,uk,un to narrow; refreshed every 6 h)0.03
mica_token_statusGET /v1/eu/mica/token?token=EURCMiCA e-money-token status from ESMA's register0.01
mica_caspGET /v1/eu/mica/casp?name=CoinbaseWhether a crypto firm holds a MiCA CASP authorisation0.01
fx_ecbGET /v1/fx/convert?from=USD&to=DKK&amount=250Conversion at official ECB euro reference rates (~30 currencies, historical dates)0.005
fx_dkkGET /v1/fx/dkk?currency=USD&amount=100Official Danmarks Nationalbank DKK rates0.005
eu_holidaysGET /v1/calendar/holidays?country=SE&year=2026Public holidays, EU/EEA/Nordic (+CH, GB)0.005
eu_working_daysGET /v1/calendar/working-days?country=DK&from=2026-12-01&to=2026-12-31Working days between dates, or date + N working days0.005
dk_bank_daysGET /v1/dk/bank-days?date=2026-12-24&add=3Danish banking days and payment deadlines0.005
dk_power_priceGET /v1/dk/power-price?area=DK2Day-ahead electricity spot prices, 15-min (DK1, DK2, NO2, SE3, SE4, DE-LU)0.005
dk_power_cheapest_windowGET /v1/dk/power-cheapest-window?area=DK1&hours=3Cheapest N-hour window for running a load (EV charging, heat pumps, batch jobs), same zones0.005
dk_co2GET /v1/dk/co2?area=DK2CO₂ intensity of Danish electricity0.005
dk_addressGET /v1/dk/address?q=Rådhuspladsen 1, KøbenhavnDanish address validation + geocoding (official Danish Address Register, DAR)0.005
dk_weatherGET /v1/dk/weather?lat=55.68&lon=12.57Latest DMI weather observation from the nearest station0.005
dk_sea_levelGET /v1/dk/port-sea-level?port=EsbjergSea level and water temperature at Danish ports0.005
stablecoin_receiptGET /v1/accounting/stablecoin-receipt?token=USDC&amount=12.5&date=2026-10-27EUR/DKK accounting voucher data for a stablecoin payment0.01

Temporarily unavailable: dk_company (/v1/dk/company) has been taken out of the paid catalog while we move it to the official CVR source from the Danish Business Authority, because the previous upstream's terms do not allow paid reuse. The path returns 503 and never asks for payment. For a Danish VAT/CVR number, eu_vat_check (VIES) still returns the registered name and address.

From Atlas Data (third-party seller)

These endpoints are provided by Atlas Data, the first outside seller on toll402. toll402 calls Atlas Data's own Apify actors (atlasdata/google-trends-scraper-reliable, atlasdata/indeed-jobs-scraper-reliable, atlasdata/facebook-ad-library-scraper-reliable, atlasdata/linkedin-ad-library-scraper-reliable, atlasdata/eu-tenders-ted-scraper-reliable, atlasdata/finland-ais-vessel-tracker-reliable, atlasdata/eudr-scope-risk-checker-reliable, atlasdata/cbam-cost-calculator-reliable) and returns clean JSON with source and provider set to Atlas Data. Payment works the same as for the other endpoints, on the same rails and to the same addresses.

MCP toolHTTP endpointWhat it returnsPrice (USD)
google_trendsGET /v1/trends/google?keywords=bitcoin,ethereum&geo=DK&timeRange=today%203-mGoogle Trends for 1–5 keywords: relative interest over time (0–100), interest by region, top and rising related queries. Optional category, property (web/images/news/youtube/shopping), compare, maxItems (≤20 per list)0.03
indeed_jobsGET /v1/jobs/indeed?keywords=developer&location=København&country=dk&maxItems=20Live Indeed job listings (Denmark, Sweden, Norway and 57 other Indeed country sites): title, company, location, salary where shown, job type, remote flag, posting date, apply link. Up to 3 keywords, maxItems ≤50; optional radius, datePosted, jobType, remote, minSalary, sort, includeDescription0.02
meta_adsGET /v1/ads/meta?keywords=lego&country=DK&maxItems=10Search the Meta (Facebook/Instagram) Ad Library, Meta's public ad-transparency archive, by keyword or advertiser pageIds: advertiser page, ad text, format, landing page, platforms, start/end dates, active status, and spend/impression ranges where Meta publishes them. Up to 3 searches, maxItems ≤20; optional activeStatus, adType, mediaType, platforms, languages, exactPhrase, dateFrom, dateTo, sort0.02
linkedin_adsGET /v1/ads/linkedin?advertiser=HubSpot&maxItems=10Search the LinkedIn Ad Library, LinkedIn's public ad-transparency archive, by advertiser or keyword: advertiser, headline, ad text, format, landing page; with includeDetails=true also run dates, impression ranges and targeting. Optional countries, dateRange or startDate/endDate, maxItems ≤20. Best-effort: LinkedIn sometimes blocks automated access; a failed run returns 503 within about 40 s and is not charged. Use meta_ads for a more reliable ad source0.02
eu_tendersGET /v1/tenders/eu?keywords=software&countries=DK&onlyOpen=true&maxItems=10EU public procurement notices from TED (Tenders Electronic Daily, official TED Search API): title, buyer, country, CPV, procedure, estimated/awarded value, winners, deadline and TED links, newest first. Filters: keywords (≤5), countries (≤10), cpvCodes (≤10), noticeType, publishedSince (date or e.g. 7 days; default 30 days), publishedUntil, onlyOpen, language, expertQuery (≤300 chars), maxItems ≤25 (default 10). © European Union, https://ted.europa.eu0.03
maritime_vesselsGET /v1/maritime/vessels?lat=60.15&lon=24.95&radiusKm=20&maxItems=10Live AIS vessel positions, northern Baltic Sea and Finland only (Finnish AIS base stations, about 57–66°N, 17–35°E; not global AIS): ships near a point (radiusKm ≤1000, the circle must reach the coverage area) or by mmsi, imo, vesselName, shipCategories; name, IMO, type, speed, course, nav status, destination, ETA, size. maxItems ≤30. Not for navigation0.02
maritime_port_callsGET /v1/maritime/port-calls?ports=FIHEL&maxItems=10Port calls at Finnish ports (Portnet): expected/arrived/departed ships with ETA/ETD/ATA/ATD, berth, vessel name/IMO/MMSI/flag/type, previous/next port. Filters: ports (Finnish UN/LOCODEs), mmsi, imo, vesselName, from/to, status; maxItems ≤150.02
eudr_check`GET /v1/eu/eudr?codes=1801%2000%2000CI,4407%2011SE&companySize=large_or_medium`
cbam_calc`GET /v1/eu/cbam?lines=7208%2051%2020TR100

Input is checked strictly before the 402 step. Only the listed parameters are accepted, the keyword count is capped and maxItems is clamped. Bad input returns 400 with no payment requested. A request with no parameters at all (directory probes) gets the normal 402; if someone pays it anyway, the handler returns 400 and the payment is not settled. Identical queries are cached for up to 6 h (trends, ad libraries), 24 h (EUDR, CBAM), 1 h (jobs, TED tenders), 15 min (port calls) or 3 min (vessel positions), and responses include cached and fetched_at. If the upstream run fails (503, upstream temporarily unavailable) or times out (504; about 40–55 s), or Google Trends has no data (404), the payment is not settled: only 2xx responses are ever settled. Google Trends values are relative interest, not absolute search volume. Ad library results contain only what the public ad library shows; for LinkedIn advertisers that are individual people, profile URL and photo are left out, and message-ad sender names are never returned. /v1/ads/linkedin is best-effort: LinkedIn sometimes blocks automated access, so a run can fail (503) or time out (504); neither is charged.

Prices are per successful call: payment is verified first, and only settled after the endpoint returns a successful (2xx) response. On Base and Polygon the minimum is $0.01 per call, so the $0.005 tools cost $0.01 there; on XRPL and Arc they cost $0.005. The live catalog (prices, input schemas, example outputs) is always at /.well-known/x402 and /openapi.json.

Payment rails

RailNetworkFacilitator
USDC, EURCBase (eip155:8453)PayAI
USDCPolygon (eip155:137)PayAI
USDCArc (eip155:5042)TRDEFI
XRPXRP Ledger (xrpl:0)t54
RLUSD (non-EU buyers only)XRP Ledger, Baset54, PayAI

RLUSD is offered only to buyers outside the EU, because it is not a MiCA-authorised e-money token. Buyers in the EU see USDC, EURC and XRP. Solana USDC is planned.

Use it from Claude Desktop, Cursor or VS Code (MCP)

Cursor (~/.cursor/mcp.json), VS Code and other clients that support remote MCP servers:

{
  "mcpServers": {
    "toll402": { "url": "https://toll402.io/mcp" }
  }
}

Claude Desktop (claude_desktop_config.json), via the mcp-remote bridge:

{
  "mcpServers": {
    "toll402": { "command": "npx", "args": ["-y", "mcp-remote", "https://toll402.io/mcp"] }
  }
}

tools/list is free. A tool call returns an x402 payment-required error until it is paid, so paid calls need an x402-capable MCP client such as @x402/mcp (example below).

Use it over HTTP

curl -i "https://toll402.io/v1/eu/vat-rates?country=DE"
# HTTP/2 402
# PAYMENT-REQUIRED: <base64 JSON listing the accepted rails, amounts and payTo>
# body: {"x402Version":2,"error":"Payment required","resource":{...},"accepts":[...same requirements...]}
x402 client (TypeScript, @x402/fetch)
import { x402Client, wrapFetchWithPayment } from "@x402/fetch";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

// Use a dedicated agent wallet holding a small amount of USDC on Base
const client = new x402Client();
registerExactEvmScheme(client, { signer: privateKeyToAccount(process.env.AGENT_KEY as `0x${string}`) });

const pay = wrapFetchWithPayment(fetch, client);
const res = await pay("https://toll402.io/v1/eu/vat-check?vat=DK10150817");
console.log(await res.json());
Paid MCP calls (TypeScript, @x402/mcp)
import { createx402MCPClient } from "@x402/mcp";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import { ExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const account = privateKeyToAccount(process.env.AGENT_KEY as `0x${string}`);
const mcp = createx402MCPClient({
  name: "my-agent", version: "1.0.0",
  schemes: [{ network: "eip155:8453", client: new ExactEvmScheme(account) }],
  autoPayment: true,
});
await mcp.connect(new StreamableHTTPClientTransport(new URL("https://toll402.io/mcp")));
const r = await mcp.callTool("dk_bank_days", { date: "2026-12-24", add: "3" });
console.log(r.content[0].text);

Self-hosting and development

Production runs on Cloudflare Workers (src/worker.mjs, Hono + @x402/hono). There is also a local Express gateway (src/gateway.mjs) for tests.

npm install
npm test                      # unit + integration tests
cp .env.example .env.testnet  # public receive addresses only, never keys
npm run gateway               # local gateway on testnets

To add an endpoint, add a file in src/endpoints/ and register it in src/endpoints/index.mjs. It is then served over HTTP and MCP and appears in the manifests and tests automatically.

Data sources

European Commission (VIES, EU VAT rates, EU sanctions list), U.S. Treasury OFAC SDN list (public domain; fetched from OFAC, or when OFAC's server is unreachable from Cloudflare, from the SDN entries of the U.S. International Trade Administration Consolidated Screening List at data.trade.gov, also public domain), UK Sanctions List (FCDO; contains public sector information licensed under the Open Government Licence v3.0), UN Security Council Consolidated List, Brønnøysund Register Centre (Enhetsregisteret, NLOD 2.0), Finnish Patent and Registration Office / YTJ open data (CC BY 4.0), GLEIF Global LEI Index (CC0), ESMA (interim MiCA register), European Central Bank, Danmarks Nationalbank, Energi Data Service (Source: Energinet, energidataservice.dk, CC BY 4.0; also used for NO2/SE3/SE4/DE prices), DMI, Danish Address Register (DAR, © Klimadatastyrelsen, CC BY 4.0, via adressevaelger.dk). Google Trends, Indeed, Meta Ad Library, LinkedIn Ad Library, TED and Digitraffic data are collected, and the EUDR and CBAM calculations are made, by Atlas Data. EUDR/CBAM: © European Union, reuse under Commission Decision 2011/833/EU; informational only, not legal or tax advice and not legally binding (only the Official Journal texts are authentic). TED notices: © European Union, https://ted.europa.eu (reuse under Commission Decision 2011/833/EU). AIS and port calls: Source: Fintraffic / digitraffic.fi, license CC 4.0 BY. toll402 and Atlas Data are not affiliated with Google, Indeed, Meta or LinkedIn. toll402 is not affiliated with any of these bodies. Check legally binding facts with the primary source.

Comments

Markdown supported

New to MCP?

From what the protocol is to installing your first server, these answers cover most first questions.

An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.