Czech DIY Retail MCP Server
This server is a read-only MCP server for searching and comparing products, store details, and stock availability across Czech DIY retailers (BAUHAUS, HORNBACH, OBI, Baumax).
Search products across all or selected retailers with optional filters for maximum price and result count.
Get product details by retailer and product ID, including EAN/GTIN, brand, price, category, specifications, images, and availability.
List physical stores for a retailer, with optional filtering by city, postcode, or name.
Check in-store stock for a specific product at a specific store, returning availability status, quantity when exposed, and pickup/reservation flags.
Compare prices across retailers, sorted ascending by price, with per-retailer errors included.
Honor data availability rules: returns
UNKNOWNorNOT_SUPPORTEDrather than inventing stock levels, and never converts missing quantities to zero.
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., "@Czech DIY Retail MCP ServerCompare prices for Makita drill across all retailers"
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.
Czech DIY Retail MCP Server (czech-diy-mcp)
Model Context Protocol (MCP) server for Czech DIY retail discovery. The server uses live current retailer pages for BAUHAUS CZ, HORNBACH CZ, OBI CZ and Baumax CZ.
Release status
1.0.0 is the production release. Live product search/detail is implemented for all four retailers; BAUHAUS and OBI expose live store stock, HORNBACH exposes qualitative store offers where present, and Baumax store stock is explicitly NOT_SUPPORTED.
Česká dokumentace
czech-diy-mcp je read-only MCP server pro vyhledávání zboží v českých hobby marketech a stavebninách. Nabízí jednotné rozhraní pro BAUHAUS CZ, HORNBACH CZ, OBI CZ a Baumax CZ.
Server poskytuje:
vyhledávání produktů, cen a kategorií;
detail produktu včetně technických parametrů, EAN/GTIN a obrázků, pokud jsou dostupné;
seznam prodejen;
dostupnost produktu v konkrétní prodejně;
porovnání cen mezi podporovanými prodejci.
Veřejné MCP nástroje jsou search_products, get_product, list_stores, get_stock a compare_price. Primární transport je Streamable HTTP na /mcp; kontrola dostupnosti aplikace je na /healthz.
Rychlé spuštění
uv sync --extra dev
uv run python -m czech_diy_mcp --transport http --port 8000Poté je MCP server dostupný na http://localhost:8000/mcp a health endpoint na http://localhost:8000/healthz.
Docker
docker build -t czech-diy-mcp:1.0.0 .
docker run --rm -p 8000:8000 czech-diy-mcp:1.0.0Důležitá pravidla dostupnosti
Pokud prodejce neposkytne spolehlivý údaj o skladovosti, server vrací UNKNOWN nebo NOT_SUPPORTED. Chybějící množství se nikdy nepřevádí na nulu a server nevymýšlí stav skladu. Skladová data jsou pouze okamžitý údaj a mohou se mezi jednotlivými požadavky změnit.
Server neprovádí objednávky, nepřidává zboží do košíku, nepřihlašuje zákazníky, nezpracovává platby a neřeší CAPTCHA ani jiné interaktivní výzvy.
Bezpečnost provozu
Server nepřijímá libovolné URL a používá pouze pevně definované domény prodejců. Přesto MCP endpoint nevystavujte přímo do veřejného internetu bez TLS, autentizace, rate limitu a firewallu. Podrobnosti jsou v Operations Manual a Security Policy.
Related MCP server: Shoptera Product Intelligence
1. Retailer Support Matrix
Retailer | Priority | Search | Details | Stores | Stock | Quantity |
BAUHAUS CZ | P0 (Primary) | ✅ | ✅ | ✅ | ✅ | Exact numerical stock exposed ( |
HORNBACH CZ | P1 | ✅ live | ✅ live | ✅ live | ✅ live/unknown | JSON-LD stock offers where exposed |
OBI CZ | P2 | ✅ live | ✅ live | ✅ live | ✅ live | quantity/status parsed from the selected store page |
Baumax CZ | P3 | ✅ live | ✅ live | ✅ live |
| retailer exposes no reliable store stock API |
DEK | P4 | 🔮 Future | 🔮 Future | 🔮 Future | 🔮 Future | 🔮 Future |
2. MCP Tools
The server exposes five normalized MCP tools:
search_products(query, retailer="all", max_price=None, max_results=20)Search all live-enabled retailers in production.
get_product(retailer, product_id)Retrieve full product details, GTIN/EAN, specifications, manufacturer info, and retailer-provided in-store positions where available.
list_stores(retailer, query=None)List physical store locations matching an optional query string (city, postcode, name).
get_stock(retailer, product_id, store_id)Query store-specific physical stock availability with maximum 60s cache TTL. When exposed by the retailer, the result also contains
location.row(řada),location.section(sekce), description and source timestamp.
compare_price(query, retailers=None, max_results_per_retailer=10)Compare prices across all four currently enabled retailer adapters; results include per-retailer errors and do not invent unavailable stock.
3. Installation & Local Development
Requirements
Python 3.12+
Setup
uv sync --extra dev4. Operational Commands & Testing
Run Tests with 100% Line & Branch Coverage
uv run pytest -m "not smoke and not container" --cov=czech_diy_mcp --cov-branch --cov-report=term-missing --cov-fail-under=100Run Live Retailer Smoke Suite
pytest -m smokeCode Formatting & Type Checking
uv run ruff check .
uv run ruff format --check .
uv run pyrightMutation testing for critical parsing and comparison logic:
python scripts/run_mutation_audit.py5. Running the MCP Server
Streamable HTTP (Default)
python -m czech_diy_mcp --transport http --port 8000MCP endpoint:
POST /mcpHealth check:
GET /healthz
Stdio Transport
python -m czech_diy_mcp --transport stdio6. Docker Deployment
Build Image
docker build -t czech-diy-mcp .Run Container
docker run -d -p 8000:8000 --name czech-diy-mcp czech-diy-mcpDocker Compose
docker compose up -d7. Configuration
Environment variables (or .env file):
Variable | Default | Description |
|
| Bind host for HTTP server |
|
| Bind port for HTTP server |
|
| MCP endpoint path |
|
| Maximum search results per retailer |
|
| HTTP request timeout in seconds |
|
| Search cache TTL (seconds) |
|
| Product detail cache TTL (seconds) |
|
| Stock lookup cache TTL (seconds) |
|
| Store list cache TTL (seconds) |
|
| Max concurrent requests per retailer |
8. Architecture
MCP Client
│
▼
┌───────────────┐
│ MCP Server │
│ server.py │
└───────┬───────┘
│
▼
┌───────────────┐
│ Service Layer │
│ catalog.py │
└───────┬───────┘
│
┌─────────────────┼──────────────────┐
│ │ │
▼ ▼ ▼
BAUHAUS HORNBACH OBI
Adapter Adapter Adapter9. License
10. Documentation
Additional release documentation is maintained in docs/:
Architecture — application boundaries, adapters, data flow and normalized models.
Operations Manual — deployment, health checks, configuration, logs and incident handling.
Development and Testing — local workflow, fixtures, quality gates and live smoke tests.
Release Checklist — reproducible release procedure and acceptance criteria.
11. Data and availability policy
The server is read-only. It never places orders, adds products to baskets, authenticates users, solves challenges or accepts arbitrary URLs.
Retailer data is request-time data and may change between calls. UNKNOWN means that the retailer did not provide a reliable signal; it is never converted to OUT_OF_STOCK, and an absent quantity is never converted to zero. fetched_at is returned with normalized records.
BAUHAUS is the primary production adapter. HORNBACH and OBI provide live catalogue/store integrations; their stock precision depends on the signal exposed by the Czech site. Baumax store stock is intentionally NOT_SUPPORTED where no reliable upstream signal exists.
When BAUHAUS provides shelf placement, get_stock correlates the requested store's live warehouse code with the product detail response and returns the matching position, for example location.row = "174" and location.section = "4". Missing placement data remains null; it is never copied from another store.
12. Release limitations
Retailer pages can rate-limit or challenge automated requests. Such responses are surfaced as structured errors.
Stock is inherently volatile and is cached for at most the configured stock TTL (60 seconds by default).
Exact quantity is returned only when the retailer explicitly exposes it.
The in-memory cache is process-local and is not a shared distributed cache.
DEK is reserved for a future adapter.
Available Tools
5 toolscompare_priceA
Compare product prices across DIY retailers, sorted ascending by price.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| retailers | No | ||
| max_results_per_retailer | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| errors | No | |
| results | Yes | |
| returned | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It discloses one useful behavioral trait (results sorted ascending by price), but does not mention whether the comparison is real-time, how unavailable items are handled, or any other operational effects. The description adds some transparency but leaves significant gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, compact sentence with no filler or redundant information. Every word adds meaning, and the core action ('compare product prices') is front-loaded. It is an excellent example of concise, efficient writing.
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?
An output schema exists, so return values are covered. However, the description provides no guidance on how to fill the three input parameters, and 0% schema coverage leaves the agent in the dark about query semantics, retailer filtering, and result limits. The description is incomplete for a tool with this parameter complexity.
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 0%, so the description must compensate by explaining parameter semantics. It does not mention what 'query' should contain, how to use the 'retailers' filter, or what 'max_results_per_retailer' limits. The description is completely silent on all three parameters, making it impossible for an agent to construct correct arguments from the text alone.
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 uses a specific verb ('compare'), a clear resource ('product prices across DIY retailers'), and a distinct behavior ('sorted ascending by price'). This clearly differentiates it from siblings like search_products (searching general products) and get_stock (stock levels). An agent can immediately understand what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states a clear context: use this tool when you need to compare product prices across DIY retailers. It does not explicitly name alternatives or exclusions, but the purpose is specific enough for an agent to infer when to select it over the sibling tools. Lacks explicit 'when not to use' guidance, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productB
Get detailed product information by product ID / SKU.
| Name | Required | Description | Default |
|---|---|---|---|
| retailer | Yes | ||
| product_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | Yes | |
| ean | No | |
| url | No | |
| gtin | No | |
| name | Yes | |
| brand | No | |
| image | No | |
| price | No | |
| category | No | |
| currency | No | |
| retailer | Yes | |
| promotion | No | |
| fetched_at | Yes | |
| unit_price | No | |
| description | No | |
| manufacturer | No | |
| package_unit | No | |
| original_price | No | |
| specifications | No | |
| unit_price_unit | No | |
| package_quantity | No | |
| online_availability | No | |
| minimum_order_quantity | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. The verb 'Get' signals a read-only lookup, and 'detailed product information' implies a richer response than a search result. However, it does not disclose behavior for missing or invalid product IDs, retailer-specific data differences, or any authorization requirements, leaving notable gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, repetition, or unnecessary detail. The key lookup concept 'by product ID / SKU' is front-loaded, and every word earns its place. It is concise without being truncated.
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?
The tool is simple, the output schema exists, and the parameters are straightforward, so the description does not need to explain return values in depth. However, there are no annotations, no explicit usage routing among siblings, and no clarification of retailer semantics. This makes the description minimally viable but noticeably incomplete.
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 0%, so the description must compensate. It does clarify that product_id is an ID or SKU, but it says nothing about the retailer parameter, such as whether product_id is retailer-specific or how the retailer enum scopes the lookup. Only one of two parameters receives meaningful semantic treatment.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete action ('Get') on a specific resource ('product information') and a precise lookup key ('product ID / SKU'). This distinguishes it from search_products, which finds products without an exact identifier, and from get_stock/compare_price, which focus on narrower aspects. Some vagueness remains in the word 'detailed,' but the core purpose is clear.
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 'by product ID / SKU' implies the correct use case is when an identifier is already known, and that search_products would be the alternative for discovering one. However, the description never explicitly states when not to use the tool or how to choose among the sibling tools, so the guidance remains only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stockA
Get current product stock level at a specific physical store branch.
| Name | Required | Description | Default |
|---|---|---|---|
| retailer | Yes | ||
| store_id | Yes | ||
| product_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | Yes | |
| quantity | No | |
| retailer | Yes | |
| store_id | Yes | |
| fetched_at | Yes | |
| product_id | Yes | |
| store_name | Yes | |
| pickup_available | No | |
| reservation_available | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden of disclosing safety and behavior. The verb 'Get' and the word 'current' clearly signal a read-only, real-time lookup with no destructive side effects. It does not conceal extra mutations or unexpected behavior.
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 sentence, front-loaded with the action and object, with no filler or redundancy. Every word earns its place.
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 simple read operation with a rich output schema, the description adequately conveys what is returned (stock level) and where (specific physical branch). It could mention a prerequisite like using list_stores to find store_id, but nothing critical is missing for correct invocation.
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 0%, but parameter names (retailer, store_id, product_id) are self-explanatory and retailer has an explicit enum. The description adds useful context by tying the tool to a 'specific physical store branch,' but it does not explain each parameter's format or relationship in detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a clear resource ('current product stock level'), and a precise scope ('at a specific physical store branch'). This clearly distinguishes it from siblings like get_product (product details) and compare_price (pricing comparisons).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'at a specific physical store branch' implies when this tool should be used and that it requires a store_id. However, it never explicitly names alternatives or says when not to use it, so an agent must infer the routing to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_storesC
List physical stores for a retailer with optional query filter.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | ||
| retailer | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| stores | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden for behavioral disclosure. It implies a read-only listing and mentions an optional filter, but it does not explain how filtering behaves, whether results are paginated, what fields are returned, or whether the retailer value is required. The output schema may cover return shape, but the description adds little behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no filler, and the core action is front-loaded. However, the conciseness comes at the expense of necessary detail about the query filter and usage context, so it is under-specified rather than efficiently complete.
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 parameters, an output schema, and a simple listing operation, the tool is not highly complex. Still, the vague query semantics and lack of usage guidance leave noticeable gaps for an agent deciding how to invoke it correctly. It is minimally viable but not complete.
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 0%, so the description must compensate for parameter meaning. It adds only 'with optional query filter,' which gives minimal meaning to 'query' without saying what it filters on (name, location, etc.). The 'retailer' parameter is not explained, though its enum values are self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: 'List physical stores for a retailer.' This distinguishes it from the sibling product/stock/price tools at a basic level. However, the 'optional query filter' is vague about what the query targets, which keeps it from being fully precise.
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 guidance about when to use this tool versus alternatives, and no exclusions or preconditions. The sibling names imply it is for store lookups rather than product searches, but that is left to inference rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_productsC
Search products across Czech DIY retailers (bauhaus, hornbach, obi, baumax, all).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| retailer | No | all | |
| max_price | No | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| query | Yes | |
| errors | No | |
| results | Yes | |
| returned | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
There are no annotations, so the description must carry full disclosure burden, but it only states the core search scope. It does not describe filtering behavior, defaults, rate limits, or what happens with invalid or empty results. The operation is likely read-only, which lowers risk, but behavioral detail beyond the bare action is missing.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, scannable sentence with no filler, and the retailer scope is front-loaded. It is concise, though it could have used the available space to add parameter guidance without harming readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With four parameters, no annotations, and zero schema property descriptions, this definition is too thin for an agent to call optimally. The output schema covers return values, but parameter semantics, defaults, and the relationship to sibling tools such as compare_price or get_product are not addressed.
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 0%, so the description must compensate. It adds the retailer list inline, which aligns with the retailer parameter, and search implies the query parameter. However, max_price and max_results semantics are left entirely to the schema, with no explanation of how filtering or result limiting actually behaves.
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 clearly states the verb and resource: searching products, with a specific scope across Czech DIY retailers and even lists the allowed retailer values. It distinguishes itself from siblings like get_product and list_stores by emphasizing a cross-retailer product search, though it doesn't explicitly contrast them.
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 'search products across Czech DIY retailers' implies that this tool is for querying product availability across those retail chains. There is no explicit when-to-use or when-not-to-use guidance, and alternatives like get_product, get_stock, or compare_price are not mentioned, so the agent must infer the intended use case from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v1.0.0- First observed
compare_price - First observed
get_product - First observed
get_stock - First observed
list_stores - First observed
search_products
TDQS
Scored across 5 tools
Each tool targets a clearly distinct task: searching, fetching product details, listing stores, checking stock, and comparing prices. There is no meaningful overlap between these operations.
All tool names follow the same snake_case verb_noun pattern, such as search_products, list_stores, and compare_price. The naming is predictable and easy to understand.
Five tools is well-scoped for a retail-focused API covering search, product details, store locations, stock, and price comparison. Each tool serves a clear purpose without unnecessary bloat.
The tool set covers the core read-only workflows for a DIY retail assistant: discover products, inspect details, find stores, check availability, and compare prices. Minor gaps like browsing categories or fetching stock across all stores at once are not critical for the stated domain.
Maintenance
Related MCP Connectors
Search ~8.5M products from 2,500+ Central European e-shops. Semantic, keyword, GTIN lookup.
Danish grocery catalog as MCP tools: live offers across all major chains, stores, EAN lookup, stock.
Search 100+ US retailers, 260M+ products with real-time pricing, stock, and price history. Documentation - https://www.lemmebuyit.com/developer Homepage - https://www.lemmebuyit.com
Real-time product data, semantic search and more from dm-drogerie markt, Europe's leading drugstore.
Related MCP Servers
- AlicenseAqualityBmaintenanceSearch for products available in physical stores near you. Find prices, stock, and store locations for hardware, tools, and construction supplies. Useful when you need something today and can't wait for delivery. 5 tools: search products, search stores, get product details, get store details, list categories. No authentication required. Covers ~2400 products across ~4000 stores in Spain.181Apache 2.0
- AlicenseNot gradedqualityDmaintenanceSearch product catalogs across thousands of Central European e-shops. Semantic search, keyword matching, GTIN/EAN lookup — via REST API or MCP. \~2,500 e-shops | ~8.5M products | 7 countries (CZ, SK, PL, HU, RO, DE, AT)MIT
- FlicenseAqualityDmaintenanceEnables searching Canadian Tire's product catalogue, checking product details, store-level stock, and finding nearby stores.4-

idealo MCP Serverofficial
AlicenseNot gradedqualityFmaintenanceEnables product search, price comparison, and price history analysis across 6 European marketplaces (DE, AT, GB, FR, IT, ES).19MIT