Kuaidi100 launched China's first MCP-protocol-compatible logistics information service platform. The core API services of Kuaidi100's Baidiy
Fordeal is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Price comparison for CZ/SK: product prices, shops, digital plans via Streamable HTTP.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http fordeal-mcp https://fordeal.ai/mcp
# 2 — ask your agent for something these tools do
# compare_internet, search_products, cheaper_abroad and 52 more
Fordeal costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http fordeal-mcp https://fordeal.ai/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
Nothing is required, but it can take Authorization header (Optional Bearer agent API key (fd_live_… / fd_test_…) to raise rate limits; public tools work without it.) if you want to set it. Its publisher says some of its tools need it, and the rest work without.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
55 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Compare provider-level home internet summaries from docs/data/internet.json. Filter by country, technology, advertised speed, listed monthly price, commitment duration, or provider; sort by price, indicative price per advertised Mbps, or speed. Each result includes the provider's address-availability checker and source links. This source contains summarized ranges, not individual address quotes; u
| Parameter | Type | Required | Notes |
|---|---|---|---|
| country | string | yes | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
| technology | string | no | — |
| min_speed_mbps | number | no | — |
| min_price | number | no | — |
| max_price | number | no | — |
| commitment_months | integer | no | — |
| provider | string | no | — |
| sort | string | no | — |
| limit | integer | no | — |
| offset | integer | no | — |
The website's category and search grid for an agent: products with the product price of their shown offer (lowest_goods, in the deliver_to_country currency; its shipping lowest_shipping and the total lowest_total beside it, with capture time and price_status verified | estimate | incomplete), number of shops, best shop and trust label. Give query (free text, every word must match; 8 to
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | no | Free text; every word must appear in the product name. 8 to 14 digits are an EAN (exact match on the product's or an offer's barcode). |
| q | string | no | Short name of query (the same search; query wins when both are given). |
| category | string | no | Category slug (leaf, main category or group). |
| slugs | no | Product slugs (comma-separated or an array): only these products, every filter still applies. The website's product comparison (/produkty/porovnat?p=a,b,c) compares up to 4. | |
| deliver_to_country | string | no | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
| limit | integer | no | — |
| offset | integer | no | Rows to skip before limit (paging). total in the answer is the number of matching products before offset and limit, so offset + count < total means there is another page. |
| facets | boolean | no | true = also answer facets over the WHOLE filtered list, not just this page: brands, shops and shop countries with counts, the price range (min/max total), in_stock/on_sale/free_shipping counts and a |
| facet_attributes | boolean | no | false = facets without attributes (the whole catalogue without a category has about 1 800 attribute keys; the website's /produkty asks without them). |
| price_min | number | no | Lowest product price in the deliver-to currency (the shown offer's goods price, shipping not counted). |
| price_max | number | no | Highest product price in the deliver-to currency (shipping not counted). |
| brand | no | Brand or brands (comma-separated in a query string). | |
| shops | no | Shop slugs (e.g. datart-cz); a product passes when one of them prices it. | |
| shop_country | no | Country codes of the shops (e.g. DE to see offers from Germany). | |
| in_stock | boolean | no | Only products whose shown offer is in stock. |
| on_sale | boolean | no | Only products with a shop discount or a measured drop. |
| free_shipping | boolean | no | Only products with free delivery at the shown offer. |
| min_shop_rating | number | no | Lowest rating of the shown shop, 0..1 (0.9 = 90 % / 4.5 stars). |
| min_product_rating | number | no | Lowest rating of the product itself, 0..1: the shops' own customer reviews and forDeal reviews (0.9 = 90 %). |
Products whose cheapest total (goods + shipping + FX to deliver_to_country) comes from a shop abroad and beats the cheapest domestic offer, with the saving in the deliver-to currency (saving_kind: "estimate": the difference at the prices and shipping captured at captured_at, with saving_basis; present it as an estimate, never a guaranteed result). Cross-border offers carry EU warranty and
| Parameter | Type | Required | Notes |
|---|---|---|---|
| deliver_to_country | string | no | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
| limit | integer | no | — |
The shops whose prices flow today for a delivery country (with their rating 0..1, rating source and trust label) and the shops still waiting for their feed. Use it to answer "can I trust shop X" or "do you compare shop Y".
| Parameter | Type | Required | Notes |
|---|---|---|---|
| country | string | no | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
Where to buy a product cheapest today: offers ranked by the real product price (converted to the buyer's currency with a dated rate), the shipping to the buyer's country shown as its own value on every offer, and whether the shop can be trusted. sort=total (or include_shipping=true) orders by goods + shipping instead. query is free text ("washing machine under 12 000, 60 cm"), a model name, an
| Parameter | Type | Required | Notes |
|---|---|---|---|
| query | string | yes | Product name, model, EAN, or a product URL. |
| deliver_to_country | string | no | Where the buyer wants delivery (ISO 3166-1 alpha-2). Default: the first compared country. |
| verified_only | boolean | no | Only shops with a customer rating. |
| sort | string | no | Order of offers and the price best is chosen by: product = lowest product price (the default; every offer still carries its shipping and total), total = lowest total with shipping to `deliver_to_c |
| include_shipping | boolean | no | Same as sort=total: count shipping in the order (the website's "Zahrnout dopravu"). Default false. |
| budget | number | no | Budget in the deliver-to currency; a total above it turns the verdict into buy_alternative. |
| deep | boolean | no | Let the model weigh the verdict and write the explanation (adds seconds). Default false: stored prices and the rules answer in under 2 s; refresh_pending true means the shops are being asked again i |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
The same card as find_best_price and the website's product page /{locale}/p/{product}, for a product id you already hold (product.slug / product.variant.id from search_products, find_best_price or product_variants), without reading a query: no risk of landing on another variant. product.variant names the variant (storage, colour, model words, connectivity, size, family_id shared by its sib
| Parameter | Type | Required | Notes |
|---|---|---|---|
| product | string | yes | Product slug (the stable product id), e.g. apple-iphone-16-128-gb. |
| deliver_to_country | string | no | Where the buyer wants delivery (ISO 3166-1 alpha-2). Default: the first compared country. |
| verified_only | boolean | no | Only shops with a customer rating. |
| sort | string | no | Order of offers and the price best is chosen by: product = lowest product price (the default; every offer still carries its shipping and total), total = lowest total with shipping to `deliver_to_c |
| include_shipping | boolean | no | Same as sort=total: count shipping in the order (the website's "Zahrnout dopravu"). Default false. |
| ai | boolean | no | Also run the shops live and let the model write the verdict (slower). Default false: stored prices and the rules. |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
The variants of one product, each with a stable id (its product slug), current (true for the one asked for, always listed), storage, size, colour and color_id, its lowest total for deliver_to_country and stock. family_id names the set (a garment's item group, or the model line line:<words>), axes says what tells them apart. Use it to switch from a card to the exact variant the buyer
| Parameter | Type | Required | Notes |
|---|---|---|---|
| product | string | yes | Product slug (the stable product id). |
| deliver_to_country | string | no | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
Daily lowest price of a product across compared shops for up to 365 days (the last point, today, is the product price the product page shows as its main price), plus every current offer with its capture time. product is the slug from find_best_price (product.slug) or a product id. Use it to say whether today's price is a low, and how much it moved. price_verdict {level low|usual|high|short_h
| Parameter | Type | Required | Notes |
|---|---|---|---|
| product | string | yes | Product slug or id from find_best_price. |
| days | integer | no | Window in days. Default 365. |
| currency | string | no | Currency of the points. Default: the currency of the first offer. |
| deliver_to_country | string | no | Country whose shown price is the last point (today). Default: the country of the currency. |
Discounts at rated shops today, biggest absolute saving first: with 30 days of our own history for the offer, the discount is measured only against its lowest price in the 30 days before the reduction (EU Omnibus, CJEU C-330/23; discount_basis "lowest_30d", price_before = lowest_30d); until that history exists, only against the old price the shop itself states (discount_basis "shop_stated", not ve
| Parameter | Type | Required | Notes |
|---|---|---|---|
| country | string | no | Country of the shops. Default: the first compared country. |
| category | string | no | Category slug of any level of the tree, e.g. mobily, elektronika, televize. |
| min_percent | number | no | Only discounts of at least this many percent. |
| stated_only | boolean | no | Kept for compatibility; every row carries a struck price (the offer's 30-day low or, until 30 days of history exist, the shop's stated price), with or without it. |
| limit | integer | no | — |
| max_per_shop | integer | no | Shop diversity: the first 48 rows take the shops in turns, at most this many rows per shop; the rest follows by saving. The website asks 4. |
Coupon codes and promotions of compared shops, valid today, from the affiliate network eHUB (refreshed every 3 hours; never from newsletters or e-mails, never a shop on a risk list). For one country (the shop's country), the soonest ending first. Each row: the shop, type voucher (has a code) | action (no code), the advertiser's title, discount read from it (percent or amount with currency;
| Parameter | Type | Required | Notes |
|---|---|---|---|
| country | string | no | Country of the shops. Default: the first compared country. |
| limit | integer | no | — |
The rows the website shows above the full product list (/produkty) for a buyer country, each a list of up to 12 products with the same summary fields as search_products: deals (today's price drops; discount against the offer's lowest price of the 30 days before the drop when 30 days of its history exist, else against the shop's own stated price; never an average), trending (trend = (1 + intere
| Parameter | Type | Required | Notes |
|---|---|---|---|
| deliver_to_country | string | no | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
| date | string | no | The day the seasonal calendar is read for (default today). |
The products the home page's first row shows, found by the data and not by a list of model names: new products people look for, up to 12, each a summary like search_products (total price with shipping at a rated shop, shops, in stock, capture time) plus trending with score, parts (the points of generation, newness, interest, gsc, growth, keyword, seed) and raw (model number and its place a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| deliver_to_country | string | no | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
| limit | integer | no | Cards to return, at most 12 (default 12). |
When an offer on a product page is wrong (the shop's page shows another price, the offer is another variant or product, the link leads to the wrong shop or page, or anything else), file a report: kind price | variant | category | shop | other, product_slug (the stable product id from find_best_price or search_products), the offer_id of the offer (from the card's offers; optional) and a `mess
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | yes | What is wrong: the price, the variant or product, the category the product is filed under, the shop or link, or something else. |
| product_slug | string | yes | Product slug (the stable product id). |
| message | string | yes | What you saw, e.g. the price on the shop's page and when. |
| offer_id | string | no | The offer the report is about (offer_id in the card). |
| shop_slug | string | no | The shop's slug, when known. |
| string | no | Where the answer goes. Optional, never shown. | |
| locale | string | no | Language of the answer. |
| page_url | string | no | The page the report was made on. |
| user_agent_hash | string | no | sha-256 of the reporter's user agent (the website computes it); only for spotting floods. |
| ip_hash | string | no | sha-256 of the reporter's address with a daily salt (the website computes it); the per-visitor limit of five reports a minute counts by it. Never stored. |
| website | string | no | Leave empty (spam trap). |
A notice under Article 16 of the Digital Services Act that content on fordeal.ai is illegal (a user review, product information, an offer, an image or anything else). Give content_kind review | product_info | offer | image | other, the page_url of the content (and the product_slug when it is on a product page), an explanation of why the content is illegal (20–4000 characters), the notifier
| Parameter | Type | Required | Notes |
|---|---|---|---|
| content_kind | string | yes | What content the notice is about. |
| page_url | string | no | The exact page of the content (Art. 16(2)(b)). |
| product_slug | string | no | Product slug when the content is on a product page. |
| explanation | string | yes | Why the content is illegal (Art. 16(2)(a)). |
| name | string | yes | The notifier's name (Art. 16(2)(c)). |
| string | yes | The notifier's e-mail: the confirmation of receipt and the decision go there. | |
| good_faith | boolean | yes | Confirms the bona fide belief that the information is accurate and complete (Art. 16(2)(d)). |
| locale | string | no | Language of the confirmation. |
| ip_hash | string | no | sha-256 of the notifier's address with a daily salt (the website computes it); counts the per-visitor limit. |
| website | string | no | Leave empty (spam trap). |
Compare the sourced CZ and SK mobile tariff records in docs/data/mobilni-tarify.json. Filter by country (required), operator, minimum data, unlimited calls, commitment, eSIM and 5G; legacy needs filters for minutes, SMS, no commitment and EU roaming also work. Sort by listed monthly price or the sourced price per GB. Every result includes its source URL, checked date and quote. Unknown values rema
| Parameter | Type | Required | Notes |
|---|---|---|---|
| country | string | yes | CZ | SK; required so results and currency stay within one market. |
| operator | string | no | — |
| data_gb | number | no | GB of mobile data a month (default 0). |
| unlimited_calls | boolean | no | Filter to tariffs with unlimited calls (true), or explicitly finite calls (false). |
| commitment_months | integer | no | — |
| esim | boolean | no | — |
| five_g | boolean | no | — |
| sort | string | no | — |
| minutes | integer | no | Call minutes a month (default 0). |
| sms | integer | no | — |
| no_commitment | boolean | no | Only tariffs without a contract period. |
| roaming_eu_gb | number | no | EU roaming data needed a month. |
| limit | integer | no | — |
An indicative calculation, not yet checked by an independent expert (verified: false): present the result as an estimate, never as a guaranteed price; show estimate_note (the sentence with the day of the data, in locale cs | sk | en) with every result. Household electricity and gas offers (Czechia for now) ranked by the yearly bill for a stated consumption in one distributor's area, with VAT. Th
| Parameter | Type | Required | Notes |
|---|---|---|---|
| country | string | no | CZ (default). |
| commodity | string | no | electricity (default) | gas |
| distributor | string | no | Distributor of the place: electricity cez-distribuce | egd | pre-distribuce; gas gasnet | gas-distribution | ppd. |
| rate | string | no | Electricity distribution rate, e.g. D02d (default) or D25d (two tariffs). |
| mwh | number | no | Yearly consumption in MWh (electricity: high tariff or all; default 2.5 electricity, 10 gas). |
| nt_mwh | number | no | Electricity low-tariff consumption a year in MWh (two-tariff rates only). |
| breaker | string | no | Electricity main breaker: 1x25 | 3x10 | 3x16 | 3x20 | 3x25 (default) | 3x32 | 3x40 | 3x50 | 3x63. |
| postcode | string | no | Postcode of the supply point (e.g. 602 00), electricity or gas; picks the distributor when none is given. An estimate from the post's postcode list and the distributors' coverage by district. |
| current_monthly | number | no | What the household pays today a month with VAT (the current advance), in the country's currency. Each offer then carries saving_year = current_monthly × 12 − total_year (positive = cheaper than today; |
| current_offer | string | no | Id of the household's current product from products (energy v2): today's yearly total is then priced from that price list for the same need, and saving_year compares like with like (saving_basis: of |
| current_vt_price | number | no | Today's commodity price per MWh from the household's bill or price list (electricity: high tariff or all; gas: the gas price). With current_fee_month it gives today's yearly total (saving_basis: own_p |
| current_nt_price | number | no | Today's low-tariff commodity price per MWh (two-tariff electricity rates; required when nt_mwh > 0). |
| current_fee_month | number | no | Today's monthly fee of the supplier (stálá platba). |
| current_prices_vat | string | no | Whether current_*_price and current_fee_month include VAT: excluded (default, as price lists state them) | included (as a bill often shows them). |
| fixation | string | no | Filter, one of none | 12 | 24 | 36: none = variable price without fixation; 12 / 24 / 36 = fixed price up to 1 / 2 / 3 or more years. |
| pricing | string | no | Filter: fixed | variable (price-list products, ranked) | spot (market-price products: listed in not_ranked without a total, never ranked). |
| green | string | no | Filter, true: only products whose price list states electricity of renewable origin (none stated yet). |
| no_penalty | string | no | Filter, true: only products whose terms state no fee for leaving (an indefinite term). |
| sort | string | no | score (default: forDeal score, highest first) | price (yearly total, lowest first). |
| compare | string | no | Comma-separated offer ids (2–3) for a side-by-side comparison in comparison. |
Prices of digital services for a buyer's country, cheapest first, from the providers' official price lists (each row has source_url and verified_on) converted to the buyer's currency by the Czech National Bank rate (fx_date). Categories: ai-chat (ChatGPT, Claude, Gemini, Copilot, Perplexity, Grok, Mistral Vibe, GitHub Copilot, Cursor, Jasper, DeepL… subscriptions), ai-api (price per 1M input and o
| Parameter | Type | Required | Notes |
|---|---|---|---|
| category | string | yes | ai-chat | ai-api | ai-creative | streaming | music | vpn | cloud | office | creative | passwords |
| usage | object | no | How the buyer uses the service; omit for the plain price list. |
| messages_per_month | integer | no | Flat form of usage.messages_per_month (REST query strings). |
| input_tokens | integer | no | Flat form of usage.input_tokens. |
| output_tokens | integer | no | Flat form of usage.output_tokens. |
| cache_share | number | no | Flat form of usage.cache_share. |
| batch | string | no | Flat form of usage.batch (true / false). |
| images_per_month | integer | no | Flat form of usage.images_per_month. |
| video_seconds_per_month | integer | no | Flat form of usage.video_seconds_per_month. |
| purpose | string | no | ai-chat: what the buyer needs it for. coding = plans whose page states an agent or coding tool, images / voice / video = plans whose page states that feature, writing = every plan. A feature the page |
| tier | string | no | Only plans of this tier: free | basic | pro | max (AI subscriptions and picture/video tools), basic | standard | premium (streaming, music, VPN, cloud). Compare plans only within one tier. |
| deliver_to_country | string | no | The buyer's country; decides the currency and the local prices (CZ prices for CZ). Default: the first compared country. |
| currency | string | no | Override the currency (e.g. EUR for a Czech buyer). |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
What a month of AI API use costs per bill item for every model we compare (or one provider / chosen models): fresh input, input read from the cache, input written into the cache, output, and the total, per request and per month in the price list's currency (USD) and in the buyer's currency by the Czech National Bank rate (fx_date), each item's whole-percent share, every other item the price list n
| Parameter | Type | Required | Notes |
|---|---|---|---|
| provider | string | no | Only this provider's models (Anthropic, OpenAI, Google, DeepSeek, Mistral, xAI, AI21 Labs, Amazon...), case-insensitive. |
| models | string | no | Comma-separated plan ids from /digital/plans (category ai-api), e.g. claude-sonnet-5-5. |
| messages_per_month | integer | no | Requests a month. Default 1 000. |
| input_tokens | integer | no | Input tokens of one request. Default 1 500. |
| output_tokens | integer | no | Output tokens of one request. Default 600. |
| cache_share | number | no | Share of the input read from the cache (0-1). Default 0.4. |
| cache_write_share | number | no | Share of the input written into the cache (0-1, with cache_share at most 1). Default 0.1. |
| batch | string | no | Batch processing at the provider's batch discount, where it offers one. |
| deliver_to_country | string | no | The buyer's country; decides the local currency. |
| currency | string | no | Override the local currency. |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
Every recorded change of a digital plan's price, newest first: plan_id, verified_on (the day it changed), from and to (price and currency), source (person = confirmed against the official page in our review; catalog = the stored price list changed between two daily snapshots) and source_url. Recording started on tracking_since; nothing before it is known and nothing is back-filled, so an empty lis
| Parameter | Type | Required | Notes |
|---|---|---|---|
| plan | string | no | One plan id from /digital/plans. |
| limit | integer | no | At most this many changes (default 100). |
An indicative calculation (verified: false, with estimate_note like compare_energy). Pass the values from the household's electricity or gas bill (as read by POST /api/v1/digital/energy/bill, by yourself from the document, or typed by a person) and get the same ranked answer as compare_energy: yearly totals of every priced offer for that distributor area, rate and breaker, with the saving against
| Parameter | Type | Required | Notes |
|---|---|---|---|
| commodity | string | yes | electricity | gas |
| distributor | string | yes | cez-distribuce | egd | pre-distribuce | gasnet | gas-distribution | ppd |
| rate | string | no | Electricity distribution rate, e.g. D25d. |
| breaker | string | no | Main breaker, e.g. 3x25. |
| vt_mwh | number | yes | Consumption in MWh in the billed period: high tariff or all (gas: all). |
| nt_mwh | number | no | Low-tariff consumption in MWh in the billed period. |
| period_days | integer | no | Days of the billed period (default 365). |
| vt_price_mwh | number | no | Supplier's commodity price per MWh without VAT. |
| nt_price_mwh | number | no | Supplier's low-tariff price per MWh without VAT. |
| fee_month | number | no | Supplier's monthly fee without VAT. |
| monthly_advance | number | no | Monthly advance with VAT (used when the prices are missing). |
| locale | string | no | Language of estimate_note: cs | sk | en (default en). |
| limit | integer | no | — |
An indicative calculation, not yet checked by an independent expert (verified: false); show estimate_note with the result. Price of one kWh with VAT for households of a country (Czechia for now), per distributor area, computed only from the energy regulator's tables and the suppliers' official price lists we read: regulated_kwh (variable regulated part: distribution of the rate, system services, r
| Parameter | Type | Required | Notes |
|---|---|---|---|
| country | string | no | CZ (default) |
| rate | string | no | Electricity distribution rate, default D02d. |
| mwh | number | no | Yearly electricity consumption for all_in_kwh, default 2.5. |
| gas_mwh | number | no | Yearly gas consumption for all_in_kwh, default 9. |
| locale | string | no | Language of estimate_note: cs | sk | en (default en). |
Development of household electricity and gas prices per kWh (Czechia), as published by Eurostat (semi-annual, all taxes and levies included, the most common consumption band), with the dataset link and the day it was fetched; never interpolated. Our own price-list readings start on own_history_since and are not yet a series. Use energy_unit_prices for today's price from the current price lists.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| country | string | no | CZ (default) |
| commodity | string | no | — |
Facts from the suppliers' official price lists (verified: false: the yearly calculation built on them is not yet checked by an independent expert; estimate_note gives the sentence and the day of the price lists). Every household electricity and gas supplier of a country we know of (Czechia: 46), or one supplier with id: its official price-list page, whether we priced it (status priced | gap with
| Parameter | Type | Required | Notes |
|---|---|---|---|
| country | string | no | CZ (default) |
| id | string | no | Supplier id from the list, e.g. cez-prodej. |
| locale | string | no | Language of the bill guide steps: cs | sk | en (default en). |
An estimate (verified: false, estimate_note with the day of the prices). kind fridge: label_kwh_year from the EU energy label (kWh/annum). kind washer: kwh_per_100_cycles from the EU energy label and washes_per_week (default 4). kind heating: area_m2 and heat_need_kwh_m2 (specific heat need for heating from the building's energy performance certificate; references: passive house 20, low-energy hou
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | yes | — |
| label_kwh_year | number | no | — |
| kwh_per_100_cycles | number | no | — |
| washes_per_week | number | no | — |
| area_m2 | number | no | — |
| heat_need_kwh_m2 | number | no | — |
| source | string | no | — |
| scop | number | no | — |
| efficiency | number | no | — |
| distributor | string | no | Distributor area for the price (default: the first area with priced offers). |
| price_per_kwh | number | no | Own price of one kWh with VAT instead of ours. |
| country | string | no | CZ (default) |
| locale | string | no | Language of estimate_note: cs | sk | en (default en). |
A household gives its e-mail and the last day of its fixed electricity or gas price (fixation_end YYYY-MM-DD, today to 5 years ahead); optionally the distributor area, today's supplier (supplier_id from energy_suppliers) or product (current_offer_id from compare_energy products) and the consumption. Double opt-in: the e-mail first gets a confirmation link and nothing else is sent before the person
| Parameter | Type | Required | Notes |
|---|---|---|---|
| string | yes | The person's e-mail (they confirm it themselves). | |
| fixation_end | string | yes | Last day of the fixed price, YYYY-MM-DD. |
| commodity | string | yes | — |
| distributor | string | no | cez-distribuce | egd | pre-distribuce | gasnet | gas-distribution | ppd: without it the alert is a reminder without prices. |
| rate | string | no | Electricity rate, default D02d. |
| mwh | number | no | Yearly consumption MWh (high tariff or all). |
| nt_mwh | number | no | — |
| supplier_id | string | no | — |
| current_offer_id | string | no | — |
| country | string | no | CZ (default) |
| locale | string | no | Language of the e-mails: cs | sk | en. |
| ip_hash | string | no | sha-256 of the visitor's address with a daily salt (the website computes it). |
| website | string | no | Leave empty (spam trap). |
The watch behind a token from a watcher e-mail (the t of the link): status pending | confirmed, the end date, the day of the alert, the e-mail masked. Answers not_found when the watch was cancelled or deleted.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| token | string | yes | — |
The double opt-in click: the confirmation token from the first watcher e-mail turns the watch on. Only the person who received the e-mail holds the token.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| token | string | yes | — |
Deletes the watch behind a token from any watcher e-mail (confirmation or alert). The row is gone at once; the token stops working.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| token | string | yes | — |
An information comparison, not a ranking (prices: false, ranking: false, score: null): Fordeal is not an insurance intermediary, sells no insurance, shows no premium and recommends no policy. For a country (CZ for now) it answers the kinds of insurance (motor third-party liability, comprehensive motor, home contents, property, travel, personal liability, accident, life, legal protection, health in
| Parameter | Type | Required | Notes |
|---|---|---|---|
| country | string | no | CZ (default). |
| kind | string | no | Only the insurers of this kind of insurance. |
| online | string | no | true: only insurers whose official site concludes the asked kind (or any kind) online. |
| assistance | string | no | true: only insurers whose site states a nonstop (24/7) assistance line. |
| app | string | no | true: only insurers with an official mobile app for clients. |
| claim_online | string | no | true: only insurers whose site takes a claim report online. |
| sort | string | no | name (default) | rating | kinds. Never a recommendation. |
| compare | string | no | Comma-separated insurer ids (2–3) for comparison. |
| locale | string | no | Language of the guide URLs (cs | sk | en …, default cs). |
Every price watch of the person whose Supabase access token is sent (Authorization: Bearer <token>; an agent API key is refused). Each row: id, product, status (active | paused), target_total and saved_total (the total when the watch was set or of the last alert; alerts fire only below it), the delivery country and currency, last_alert_at and current = today's total for that country (goods + shi
| Parameter | Type | Required | Notes |
|---|---|---|---|
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
Creates (or resets) the signed-in person's watch of one product (one per product). Fordeal mails the person when the recommended total for deliver_to_country (goods + shipping, same meaning as on the website) falls under target_total, never twice for one price and at most once a day. Without target_total the target is today's total: the mail comes when the price really drops (by the currency
| Parameter | Type | Required | Notes |
|---|---|---|---|
| product_slug | string | yes | The product's slug (search_products, find_best_price). |
| target_total | number | no | Mail when the total falls to or under this amount, in the currency of deliver_to_country. Default: today's total. |
| deliver_to_country | string | no | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
| locale | string | no | Language of the alert mails. Default: the person's, then the country's. |
Changes one of the signed-in person's watches: paused: true stops the mails until paused: false; target_total sets a new limit (null = any real drop under the saved total). Only the token's own watches; another id answers not_found.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| watch_id | string | yes | The watch's id from list_my_price_watches. |
| paused | boolean | no | — |
| target_total | no | — | |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
Deletes one of the signed-in person's watches; no more mails for it. Only the token's own watches; another id answers not_found.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| watch_id | string | yes | The watch's id from list_my_price_watches. |
Products (kind product, by slug, with the total saved at that time) and digital plans (kind digital, by plan id) the person saved with the heart, newest first. Needs the person's access token. Live prices: search_products / compare_digital.
No parameter schema on file.
Adds a product (kind product, id = slug) or a digital plan (kind digital, id = plan id from compare_digital or compare_mobile) to the signed-in person's favourites. Saving twice changes nothing.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | yes | — |
| id | string | yes | — |
Removes a product or a digital plan from the signed-in person's favourites. removed: false when it was not there.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | yes | — |
| id | string | yes | — |
Comparisons the person saved (2 to 4 digital plans each), newest first, with the page address and, when the person chose to share one, its share link. Private unless shared: true.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
Saves 2 to 4 digital plans (plan ids from compare_digital / compare_mobile) as a private comparison in the signed-in person's account. Private: nobody else can open it until share_comparison makes a link.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| items | array | yes | — |
| name | string | no | — |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
shared: true makes a read-only link (a new random token; an older link stops working); shared: false removes the link. The link shows the plans at today's prices and the name, never the owner.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| comparison_id | string | yes | The comparison's id from list_my_comparisons. |
| shared | boolean | yes | — |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
Deletes one of the signed-in person's saved comparisons; its share link stops working.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| comparison_id | string | yes | The comparison's id from list_my_comparisons. |
Every named list of the person whose Supabase access token is sent (Authorization: Bearer <token>; an agent API key is refused), oldest first, each with its products (newest first, the private note and the total saved at that time), and the share link when the person chose to share it. The heart's favourites are separate: list_my_favorites. Live prices: GET /api/v1/deals/products?slugs=.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
Creates an empty private list (e.g. Narozeniny, Nová kuchyň) in the signed-in person's account; add products with add_to_list. At most 50 lists per person.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | The list's name, e.g. Narozeniny (1 to 80 characters). |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
Changes one of the signed-in person's lists: name renames it; shared: true makes a read-only link (a new random token, an older link stops working), shared: false removes the link. The link shows the list's name and products at today's prices, never the owner, the notes or the saved prices. Another id answers not_found.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list's id from list_my_lists. |
| name | string | no | The list's name, e.g. Narozeniny (1 to 80 characters). |
| shared | boolean | no | — |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
Deletes one of the signed-in person's lists with its products; its share link stops working. Another id answers not_found.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list's id from list_my_lists. |
Adds a product (by slug) to one of the signed-in person's lists with an optional private note; the product's total for deliver_to_country today is kept as saved_total (for "the price changed since you saved it"). Adding it again only changes the note. At most 200 products per list. Another person's list answers not_found.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list's id from list_my_lists. |
| product_slug | string | yes | The product's slug (search_products, find_best_price). |
| note | no | A private note to the product (at most 280 characters); never shown on the share link. | |
| deliver_to_country | string | no | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
Removes a product from one of the signed-in person's lists; removed: false when it was not there. Another person's list answers not_found.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| list_id | string | yes | The list's id from list_my_lists. |
| product_slug | string | yes | — |
| locale | string | no | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
Before or instead of registering: reads one product feed and answers whether Fordeal can use it. Give the feed's public address in feed_url (read through the SSRF guard: public hosts only, FordealBot, robots.txt respected, 20 s cap) or the file itself in feed_content (XML or CSV text, at most 8 MB) or feed_base64 (a gzip-packed file; ZIP is refused), plus the shop's delivery country and, w
| Parameter | Type | Required | Notes |
|---|---|---|---|
| feed_url | string | no | The feed's public address (Heureka, Zboží, Google Merchant, Ceneo, Idealo, Árukereső XML or CSV). Either this or a file. |
| feed_content | string | no | The feed file as text (XML or CSV), at most 8 MB. Over MCP the whole request is limited to 2 MB; send bigger files to POST /api/v1/shops/feed-check. |
| feed_base64 | string | no | The feed file's bytes as base64, for a gzip-packed file (.xml.gz). ZIP is refused. |
| filename | string | no | The file's name, echoed back. |
| country | string | yes | The shop's delivery country (ISO code from GET /api/v1/deals/countries): its currency and the shipping the total uses. |
| domain | string | no | The shop's host, e.g. www.obchod.cz; required with a file, the feed's host by default. |
| format | string | no | The feed format when known; detected from the content otherwise. |
| preview_items | integer | no | How many items the preview shows (default 6, at most 24). |
One call registers a shop (P01): name, domain, delivery country, contact e-mail, the feed (its address in feed_url, or the file in feed_content / feed_base64), how commission is paid and the accepted partner terms version. An address is read at once through the SSRF guard (public hosts only, 422 url_rejected otherwise) with a 12 s cap; a file is decoded (at most 8 MB, gzip allowed, ZIP refus
| Parameter | Type | Required | Notes |
|---|---|---|---|
| shop_name | string | yes | The shop's name as it should appear in the comparison. |
| domain | string | yes | The shop's domain or URL, e.g. www.obchod.cz. |
| country | string | yes | Delivery country of the shop, ISO 3166-1 alpha-2 from GET /api/v1/deals/countries. |
| string | yes | Contact e-mail of the shop; it receives the confirmation link and the decision. Never shown. | |
| feed_url | string | no | The product feed (Heureka, Zboží, Google Merchant, Ceneo, Idealo, Árukereső XML or CSV). Read at once; the answer carries the diagnostics report. Public hosts only. Either this or a file. |
| feed_content | string | no | The feed as a file instead of an address: the XML or CSV text itself (at most 8 MB). Checked once and dropped; only its sha-256 and size are kept. Regular price updates still need a feed_url later. |
| feed_base64 | string | no | The feed file's bytes as base64, for a gzip-packed file (.xml.gz, .csv.gz). ZIP is refused: unpack it first. |
| feed_filename | string | no | The uploaded file's name, kept with its fingerprint. |
| affiliate | string | yes | How commission is paid: "own" = forDeal's own programme (5 % of the net order value, partner portal), a network name the country lists (ehub, cj, awin, dognet, …), "other", or "none". |
| terms_version | string | yes | The partner terms version being accepted; today 2026-10-09 (the terms are at /partner/smlouva). |
| accept_terms | boolean | yes | true = the contact accepts the partner terms of the given version. |
| locale | string | no | Language of the mails (cs, sk, en, …); the country's default language when absent. |
| note | string | no | — |
| website | string | no | Leave empty (spam trap: a filled value is discarded quietly). |
What happened to a registration (register_shop answers id; the id is the key, nothing else is needed): status diagnosing | received | approved | rejected | active, whether the contact confirmed, the decision with its reason and when, where the feed came from (feed_source url | upload, and the upload's fingerprint), the public feed report (health, summary, counts, the first issues without item
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | The request id from the registration answer. |
After register_shop: publish <meta name="fordeal-verification" content="TOKEN"> on the shop's home page, or the token as the whole content of https://DOMAIN/fordeal-verification.txt, then call this with the domain and the token from verification.ownership. One request to each address with Fordeal's identified bot (www. and the bare host). The answer: ok with the method (meta | file, or already),
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | The shop's domain as registered. |
| token | string | yes | The token from verification.ownership of the registration answer. |
The report of a compared shop's last feed read (P04): health ok | warn | fail, counts (items, with EAN, price, picture, availability, shipping, category), and coded issues (no_items, items_skipped, feed_unreadable, price_zero, currency_mismatch, url_not_shop_host, duplicate_item_id, encoding_suspect, price_outlier, missing_ean, availability_unknown, shipping_missing, image_missing, category_missin
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | The shop's slug from list_shops or GET /api/v1/deals/shops. |
The shops whose numbers the signed-in person may read: a contact of a shop in Fordeal's own affiliate programme whose partnership the operator approved and whose domain is proven (access: partner; a pending partner sees nothing here), or the contact e-mail of a registration the operator approved (access: registration). Needs that person's Supabase access token (Authorization: Bearer <token>, t
No parameter schema on file.
How many people Fordeal sent to the shop in a window of UTC days (from/to YYYY-MM-DD, both included; the last 30 days by default, at most 366): the total, every day (zero days included), per delivery country and per channel (web | mcp | api | social). Only counted clicks of people from click_log: robots and the partner's test clicks are left out and reported in excluded; no orders or revenue
| Parameter | Type | Required | Notes |
|---|---|---|---|
| shop | string | yes | The shop's slug from list_my_shops. |
| from | string | no | First UTC day (YYYY-MM-DD); 29 days before to by default. |
| to | string | no | Last UTC day (YYYY-MM-DD); today by default. |
The cooperation forms (docs/texty/formulare.md 2–4) without the website. kind partner (an affiliate network, a feed provider or a technical integration: organization, website, markets as ISO codes, cooperation_type affiliate | feed | integration | other, message = the offer and its terms), media (name, organization = the newsroom, message = the topic or the information needed, optional deadline
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | yes | Who writes: partner | media | creator. |
| name | string | yes | The contact person (partner, media) or the name of the channel (creator). |
| string | yes | Where the confirmation and the answer go; never shown. | |
| message | string | yes | The offer and its terms (partner), the topic or the information needed (media), the idea (creator). |
| organization | string | no | The company or network (partner, required), the newsroom or medium (media, required). |
| website | string | no | The partner's website or the creator's main channel (required for both). |
| markets | no | Markets the offer is about, ISO codes (partner, required): an array or a comma-separated string. | |
| cooperation_type | string | no | What a partner offers (required for a partner). |
| topic | string | no | The creator's topic and audience (required for a creator). |
| deadline | string | no | The day the media need an answer by (YYYY-MM-DD). |
| links | string | no | Documentation, a feed, the article, other channels or a media kit (links as text). |
| locale | string | no | Language of the confirmation (cs, sk, en; others get English). |
| ip_hash | string | no | sha-256 of the sender's address with a daily salt (the website computes it); counts the per-visitor limit. Never stored as an address. |
| nickname | string | no | Leave empty (spam trap: a filled value is discarded quietly). |
The /kontakt form without the website: name, email (where the answer goes), topic general | support | cooperation | privacy and message (10 to 4 000 characters). The message goes as one notice to hello@fordeal.ai with the sender as Reply-To; a person answers by e-mail. The sender gets no automatic e-mail (the answer here is the confirmation of receipt, with id). The same message twice on
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Who writes (a name or how to address the person). |
| string | yes | Where the answer goes; never shown, never mailed by the form itself. | |
| topic | string | yes | general = a question about Fordeal, a price or a shop; support = a problem with the website or the account; cooperation = partners, media, creators (shops register on /obchody); privacy = a request ab |
| message | string | yes | The message itself, 10 to 4 000 characters. |
| locale | string | no | Language of the page the person wrote from (cs, sk, en, …). |
| ip_hash | string | no | sha-256 of the sender's address with a daily salt (the website computes it); counts the per-visitor limit. Never stored. |
| nickname | string | no | Leave empty (spam trap: a filled value is discarded quietly). |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Fordeal or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
| Term | Level | What it prices | Points |
|---|---|---|---|
| capability-exposure | moderate | capability blast radius (moderate) — client exposure if the model is manipulated | −3 |
| coverage-honesty | manifest | inspection depth (manifest) — how much of the target the scan could see | −4 |
What the scan could actually read
A grade is only as meaningful as its coverage, so the scanner publishes its own depth before it publishes its result.
The scan read each tool’s name, description, input schema and annotations exactly as the server listed them the last time it answered us; no code was reviewed. We ask the server again about once a month, and a list that changed is graded again.
The implementation source was not read — this reflects the declared tool metadata only.
Capability — what it could do if the model were manipulated
Tags derived from each tool’s schema and the implementation, not from what the tool calls itself. moderate is the level these add up to.
| Tool | Capability tags | Why the tag was assigned |
|---|---|---|
| compare_internet | no tags | |
| search_products | untrusted-input | untrusted-input: keyword "browse" |
| cheaper_abroad | no tags | |
| list_shops | no tags | |
| find_best_price | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| get_product | no tags | |
| product_variants | no tags | |
| price_history | no tags | |
| daily_deals | no tags | |
| list_coupons | no tags | |
| product_rows | no tags | |
| trending_new_products | no tags | |
| report_issue | state-write | state-write: declares readOnlyHint: false |
| report_illegal_content | state-write | state-write: declares readOnlyHint: false |
| compare_mobile | no tags | |
| compare_energy | no tags | |
| compare_digital | no tags | |
| api_price_breakdown | no tags | |
| digital_price_history | no tags | |
| compare_energy_from_bill | no tags | |
| energy_unit_prices | no tags | |
| energy_price_history | no tags | |
| energy_suppliers | untrusted-input | untrusted-input: keyword "download" |
| estimate_appliance_energy | no tags | |
| watch_energy_fixation | state-write | state-write: declares readOnlyHint: false |
| energy_watch_status | no tags | |
| confirm_energy_watch | state-write | state-write: declares readOnlyHint: false |
| cancel_energy_watch | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| insurance_guide | no tags | |
| list_my_price_watches | no tags | |
| set_price_watch | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| update_price_watch | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| delete_price_watch | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| list_my_favorites | no tags | |
| save_favorite | state-write | state-write: declares readOnlyHint: false |
| remove_favorite | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| list_my_comparisons | no tags | |
| save_comparison | state-write | state-write: declares readOnlyHint: false |
| share_comparison | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| delete_comparison | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| list_my_lists | no tags | |
| create_list | state-write | state-write: declares readOnlyHint: false |
| update_list | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| delete_list | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| add_to_list | state-write | state-write: declares readOnlyHint: false |
| remove_from_list | state-write | state-write: declares readOnlyHint: false, destructiveHint: true |
| check_shop_feed | untrusted-input | untrusted-input: declares openWorldHint: true (interacts with entities outside the server) |
| register_shop | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| get_shop_registration | no tags | |
| verify_shop_domain | external-sink | external-sink: declares readOnlyHint: false, openWorldHint: true |
| get_shop_feed_diagnostics | no tags | |
| list_my_shops | no tags | |
| get_shop_statistics | no tags | |
| send_cooperation_inquiry | state-write | state-write: declares readOnlyHint: false |
| send_contact_message | state-write | state-write: declares readOnlyHint: false |
Toxic-flow graph
The lethal trifecta, checked as a graph rather than as a checklist: untrusted input, a sensitive source and an external sink have to meet before there is a path worth worrying about.
Supply chain and provenance
This is the first scan of this surface here, so there is nothing yet to compare it against.
Every result on this tab comes from one deterministic pass over the published package — offline, rule by rule, and auditable line by line above. Same methodology version, same bytes, same score.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 1.0.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Fordeal can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.