Fordeal
Server Details
Price comparison for CZ/SK: product prices, shops, digital plans via Streamable HTTP.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 55 tools
Most tools have a clear role, but the set contains several adjacent price/product-discovery tools (search_products, find_best_price, get_product, price_history, daily_deals, cheaper_abroad, product_rows, trending_new_products) whose boundaries require careful reading. Similar overlap appears between compare_energy and compare_energy_from_bill, and between check_shop_feed and get_shop_feed_diagnostics. Detailed descriptions help, but misselection is still plausible.
Names are overwhelmingly snake_case and follow predictable verb_noun or noun_phrase patterns, with clear CRUD families such as create_list, add_to_list, update_list, delete_list and list_my_lists. Minor deviations are mostly noun-form data endpoints like api_price_breakdown, daily_deals, product_rows and insurance_guide, but they remain readable and consistent.
At 55 tools, the server is far beyond a well-scoped MCP surface and spans product comparison, digital subscriptions, energy, favorites/lists/watches, shop onboarding, reporting, and contact workflows. Many tools are individually useful, but the overall set is too large for a single server and would be easier to use if split by domain.
The surface covers a wide lifecycle: product search/comparison/history, favorites and lists, price watches, saved comparisons, shop registration and diagnostics, energy and digital comparisons, reporting, and contact forms. Minor gaps remain, such as no standalone category listing or shop-detail tool and no explicit cancel/update for shop registrations beyond re-registration.
Available Tools
55 toolsadd_to_listAdd a product to a named listAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | A private note to the product (at most 280 characters); never shown on the share link. | |
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| list_id | Yes | The list's id from list_my_lists. | |
| product_slug | Yes | The product's slug (search_products, find_best_price). | |
| deliver_to_country | No | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the saved_total snapshot behavior, the maximum of 200 products per list, the re-add semantics, and the ownership/not_found behavior. These details materially improve an agent's ability to predict side effects and errors.
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 compact and front-loaded: it states the core action first, then adds only high-value behavioral details about saved_total, re-adding, limits, and ownership errors.
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 five-parameter mutation with no output schema, the description covers the important behavioral and error semantics. It does not describe the success response shape, but the omission is minor given the otherwise complete operational context.
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 coverage is 100%, so parameter documentation is already strong. The description still adds useful meaning by explaining how deliver_to_country affects the saved total and by reinforcing that the note is private.
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 and resource: adding a product by slug to one of the signed-in person's lists, with an optional note. It also distinguishes this from list-management siblings like remove_from_list and update_list by making clear this operation adds a product and is idempotent on re-add.
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?
It clearly explains that the list must belong to the signed-in person and that another person's list returns not_found. It also clarifies the re-add behavior, which helps an agent decide whether to call it again or use a note-update path, but it does not explicitly name remove_from_list as the alternative for removal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
api_price_breakdownCost split of AI API modelsBRead-onlyIdempotentInspect
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 names (batch discount and whether it applied, the dearer long-prompt band and whether the request is in it, the context window, cache_write_not_stated when the price list names no write price and writes were billed as ordinary input), what is included, and the official source_url with verified_on. Default scenario: 1 000 requests a month, 1 500 input and 600 output tokens each, 40 % of the input read from the cache and 10 % written; every field can be changed. Nothing is estimated beyond the stated prices.
| Name | Required | Description | Default |
|---|---|---|---|
| batch | No | Batch processing at the provider's batch discount, where it offers one. | |
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| models | No | Comma-separated plan ids from /digital/plans (category ai-api), e.g. claude-sonnet-5-5. | |
| currency | No | Override the local currency. | |
| provider | No | Only this provider's models (Anthropic, OpenAI, Google, DeepSeek, Mistral, xAI, AI21 Labs, Amazon...), case-insensitive. | |
| cache_share | No | Share of the input read from the cache (0-1). Default 0.4. | |
| input_tokens | No | Input tokens of one request. Default 1 500. | |
| output_tokens | No | Output tokens of one request. Default 600. | |
| cache_write_share | No | Share of the input written into the cache (0-1, with cache_share at most 1). Default 0.1. | |
| deliver_to_country | No | The buyer's country; decides the local currency. | |
| messages_per_month | No | Requests a month. Default 1 000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already establish that this is a read-only, idempotent, non-destructive operation. The description adds meaningful behavioral context beyond that: it explains the FX source and date, notes that each item includes official source_url and verified_on, and explicitly says nothing is estimated beyond stated prices. It does not contradict the annotations.
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 purpose and default scenario are front-loaded, and the clause-heavy content is largely relevant because there is no output schema. However, the description is a single sprawling sentence with nested parentheticals, which makes it harder to parse than necessary.
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 11 parameters, no output schema, and only read-only annotations, the description does substantial work by enumerating the returned cost components, currencies, FX handling, shares, batch/long-prompt details, cache_write_not_stated, and source provenance. It is therefore largely complete for an agent to call and interpret the tool, despite omitting explicit sibling-selection guidance.
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 100%, so the schema already documents all 11 parameters in detail. The description reinforces the default scenario across several parameters and states that every field can be changed, but it does not add much parameter semantics beyond what the schema provides.
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 a specific computation: monthly AI API cost per bill item for every compared model or a selected provider/model set, broken into input, cache read/write, output, and total. It is easy to distinguish from generic product or energy tools, but it does not name or contrast with relevant siblings such as compare_digital or digital_price_history.
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?
It supplies a default scenario and notes that every field can be changed, but it gives no explicit guidance on when to choose this tool versus alternatives like compare_digital or digital_price_history. There are also no stated exclusions or prerequisites for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_energy_watchCancel a fixation-end watch (deletes it)ADestructiveIdempotentInspect
Deletes the watch behind a token from any watcher e-mail (confirmation or alert). The row is gone at once; the token stops working.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered. The description still earns credit by adding non-obvious behavior: the row is removed immediately, the token becomes unusable, and the call works with tokens from either watcher e-mail type.
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?
Two short sentences with the destructive outcome and the token-scope note front-loaded. No filler or restatement of the title beyond what adds information.
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 one-parameter destructive tool with annotations covering destructiveness and idempotency, and no output schema, the description covers effect and irreversibility. The remaining gap is what an agent should expect on an already-consumed or invalid token.
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 coverage is 0% and the single token parameter has no format, length, or example guidance in the schema. The description partially compensates by explaining where the token comes from (confirmation or alert e-mail), but says nothing about invalid/expired-token behavior or the 10-200 char constraint.
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?
States a concrete verb and resource: deletes the watch identified by a token. The parenthetical '(confirmation or alert)' clarifies which tokens qualify, which distinguishes it from confirm_energy_watch and energy_watch_status, though it doesn't name those siblings explicitly.
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?
Usage is implied by the word 'Deletes' and by the token-source note, but the description never states when to choose this over confirm_energy_watch or watch_energy_fixation, nor whether an active alert must be cancelled before re-watching. The agent must infer the lifecycle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cheaper_abroadProducts cheaper from a shop in another countryARead-onlyIdempotentInspect
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 returns but support may be in another language; find_best_price shows the cross_border block for one product.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| deliver_to_country | No | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context the annotations cannot: savings are point-in-time estimates tied to captured_at and saving_basis, and cross-border offers carry EU warranty and returns but possible foreign-language support. It does not mention pagination or default limit 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?
The definition is front-loaded in the first clause, and each subsequent clause adds non-redundant information (saving semantics, estimate caveat, cross-border caveats, sibling pointer). The nested parentheticals and backtick field references make it dense to parse, costing a point on 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?
For a read-only list tool with no output schema, the description names the fields an agent will encounter (saving_kind, saving_basis, captured_at) and explains what a returned row represents. What is missing is result-size/pagination behavior tied to the limit parameter, which an agent would want before calling.
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 coverage is 67%, with locale and deliver_to_country already documented in the schema. The description reinforces deliver_to_country by explaining the saving is expressed in that currency, but it says nothing about the limit parameter or default result counts. That is the expected baseline when the schema does most of the work.
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 gives a specific verb-and-resource definition: products whose cheapest total (goods + shipping + FX) comes from an abroad shop and beats the cheapest domestic offer. It explicitly differentiates itself from find_best_price, which shows the cross-border block for a single product, so an agent can pick between the two without opening either schema.
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 final clause ('find_best_price shows the cross_border block for one product') implicitly routes the agent: use this for a bulk/list view, find_best_price for one product. It also gives presentation guidance ('present it as an estimate, never a guaranteed result'). There is no explicit 'when not to use' or prerequisite statement, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_shop_feedCheck a shop's product feed and preview its offersARead-onlyIdempotentInspect
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, with a file, its domain. The answer: health ok | warn | fail, counts (items, skipped, with EAN, price, picture, availability, shipping, category), 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_missing, stale_feed) with the first affected items by the shop's own id and name, blocking = the error codes to fix first, validation = the required-field check (title, price, URL, EAN) in Czech sentences for Heureka, Zboží, Google and CSV feeds, and preview.shown = the first items as the comparison would show them (goods price, shipping to the country from the feed, total, stock, picture, what each lacks). Nothing is stored and nothing is mailed. A feed that cannot be read answers health fail with read_error {code, message, fix}. Next: register_shop with the same feed. Public; ten checks a minute per caller.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | No | The shop's host, e.g. www.obchod.cz; required with a file, the feed's host by default. | |
| format | No | The feed format when known; detected from the content otherwise. | |
| country | Yes | The shop's delivery country (ISO code from GET /api/v1/deals/countries): its currency and the shipping the total uses. | |
| feed_url | No | The feed's public address (Heureka, Zboží, Google Merchant, Ceneo, Idealo, Árukereső XML or CSV). Either this or a file. | |
| filename | No | The file's name, echoed back. | |
| feed_base64 | No | The feed file's bytes as base64, for a gzip-packed file (.xml.gz). ZIP is refused. | |
| feed_content | 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. | |
| preview_items | No | How many items the preview shows (default 6, at most 24). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent and non-destructive, and the description still adds substantial behavior beyond them: SSRF-guarded fetch with public-hosts-only, FordealBot user agent, robots.txt and a 20 s cap; 8 MB content cap with a 2 MB MCP request ceiling; gzip accepted, ZIP refused; and a rate limit of ten checks per minute per caller. It also discloses the side-effect profile (nothing stored, nothing mailed), which is exactly what the annotations cannot say.
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 first sentence front-loads the purpose and the input choice; nothing is filler. The second sentence is a long run-on enumeration of every issue code and output field, which is dense but defensible given there is no output schema, though it could have been broken into a short list for scanability.
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 no output schema, the description carries the full burden of explaining the return value, and it does: health status, count fields, issue codes, blocking vs non-blocking, the Czech validation sentences, preview payload, and the read_error shape for unreadable feeds. An agent has everything it needs to call this and interpret the result.
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 coverage is 100%, so a baseline 3 is available, and the description earns more by adding semantics the schema lacks: feed_url is fetched through the SSRF guard, feed_content is raw text capped at 8 MB while feed_base64 is gzip-only, and country drives currency and shipping in the total. It stops short of clarifying the interplay between domain and format and the required-with-a-file rule is only partial.
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?
States a specific verb and resource — reads one product feed and answers whether Fordeal can use it — and scopes it as a pre-registration check, which separates it from register_shop and get_shop_feed_diagnostics. An agent can tell immediately what this tool does and what it does not do (nothing stored, nothing mailed).
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?
"Before or instead of registering" gives explicit timing and an explicit next step ("Next: register_shop with the same feed"), and the description says which of the three input modes to pick. It never mentions get_shop_feed_diagnostics, the closest sibling, so the agent is left to infer that distinction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_digitalCompare digital services by price per monthARead-onlyIdempotentInspect
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 output tokens of the main models: OpenAI, Anthropic, Google, Mistral, xAI, DeepSeek, AI21, Amazon Nova), ai-creative (Midjourney, Runway, Kling, Leonardo, Canva, Firefly, ElevenLabs, Suno… per month, per picture or second of video when stated), streaming, music, vpn, cloud, office (Microsoft 365, Google Workspace, Zoho, Notion, Slack, Zoom… personal, family and business per user; business prices usually exclude VAT), creative (Adobe Creative Cloud, Canva, Figma, CapCut, DaVinci Resolve Studio… monthly, yearly or a one-time purchase: such a row has oneTimeLocal instead of a monthly price), passwords (1Password, Bitwarden, Dashlane). usage turns the list into a cost of that use: for ai-api messages_per_month (+ input_tokens and output_tokens per message, default 1 500 and 600) (+ cache_share 0–1 and batch) gives usage_cost a month, usage_breakdown (input, cached input, output; whether the long-prompt band or the batch discount applied) and break_even_messages (below it the API is cheaper than the provider's cheapest paid chat plan); for ai-creative images_per_month and video_seconds_per_month. A null price means the official page did not show one; it is never guessed. Each row carries data_location from the provider's own privacy policy (controller, storedIn country codes, inChina, authoritiesClause, quote, url, checked), null when we have not read it. Where the same plan is also sold inside the app (inAppPrices: the App Store's price for the buyer's country, with VAT, verifiedOn and sourceUrl), inApp compares a month on the web (the price list's price, plus the country's VAT when the list excludes it: web.vatAdded) with a month in the app, both in the buyer's currency: cheaper (web | app | same) and difference a month; inAppYearly does the same for yearly billing. Say both prices and which is cheaper; a plan without inApp has no store price read (never assume the app costs the same). Every row carries price, the one amount to show (the same as fordeal.ai shows): price.monthly and price.yearly (12 × monthly; yearlyWhenYearly = 12 × the month paid yearly) in the buyer currency with the buyer country VAT added where the price list excludes it (price.vat: included | by_law | added | excluded | unknown, price.vatRate), price.billing, price.channel (web) and price.rateDate; rows are ranked by price.monthly. promo (an open promotion) has monthlyLocal as converted and monthlyLocalGross on the same VAT basis as price: show the gross one, then price.monthly after it, both with the VAT word of price.vat. kind says who can buy the plan: regular (anyone), student (verified students or educators), business (companies and teams) or promo (only under the offer terms); never present a non-regular plan as the generic cheapest without saying who is eligible.
| Name | Required | Description | Default |
|---|---|---|---|
| tier | 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. | |
| batch | No | Flat form of usage.batch (true / false). | |
| usage | No | How the buyer uses the service; omit for the plain price list. | |
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| purpose | 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 does not state is 'not stated', not 'no'. | |
| category | Yes | ai-chat | ai-api | ai-creative | streaming | music | vpn | cloud | office | creative | passwords | |
| currency | No | Override the currency (e.g. EUR for a Czech buyer). | |
| cache_share | No | Flat form of usage.cache_share. | |
| input_tokens | No | Flat form of usage.input_tokens. | |
| output_tokens | No | Flat form of usage.output_tokens. | |
| images_per_month | No | Flat form of usage.images_per_month. | |
| deliver_to_country | No | The buyer's country; decides the currency and the local prices (CZ prices for CZ). Default: the first compared country. | |
| messages_per_month | No | Flat form of usage.messages_per_month (REST query strings). | |
| video_seconds_per_month | No | Flat form of usage.video_seconds_per_month. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it read-only, idempotent and non-destructive, yet the description still discloses real behavioral traits: null prices are never guessed, rows are ranked by price.monthly, VAT is added where the list excludes it, web-vs-app comparisons are sourced from store prices, and non-regular plans must not be presented as the generic cheapest. These are decision-relevant facts an agent could not infer from annotations alone.
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?
Front-loaded with purpose, but the rest is a single massive run-on paragraph packed with nested parentheticals and long enumerations of vendors. Much of the content earns its place, yet the lack of sentence breaks or grouping makes it hard to parse and far from concise.
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?
Given 14 parameters, a nested usage object and no output schema, the description does substantial work: it documents row fields (source_url, verified_on, fx_date, price.*, inAppPrices, data_location, promo, kind) and the usage-cost outputs. Coverage is close to complete; only the tier/purpose/locale parameters rely wholly on the schema.
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 coverage is 100%, so the baseline is 3, but the description meaningfully extends the usage parameter: messages_per_month with default input/output tokens, cache_share, batch, and the resulting usage_cost, usage_breakdown and break_even_messages outputs. With no output schema, explaining what usage produces is genuine added value; tier, purpose, locale and currency are left to the schema.
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?
States a specific verb and resource: prices of digital services for a buyer's country, cheapest first, with a detailed list of the ten supported categories. An agent can tell this is the digital-subscription comparison tool. It never names a sibling (e.g. digital_price_history or cheaper_abroad) to distinguish scope, so it stops short of a 5.
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?
Usage is implied by the category list and by lines like 'omit for the plain price list' and 'usage turns the list into a cost of that use', which tell you when to supply usage. But there is no explicit when-to-use/when-not guidance and no routing to related tools such as digital_price_history for past prices or cheaper_abroad for cross-country checks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_energyHousehold electricity and gas by yearly costARead-onlyIdempotentInspect
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. The bill is split into the regulated part (distribution, system services, renewables support, market operator, tax: set by the energy regulator for the distributor, the same with every supplier) and the supplier part (commodity price and monthly fee: what switching changes). Every offer has the supplier's official price list (source_url, verified_on, valid_from) and says whether the price is fixed (fixed_months or fixed_until) or variable. Spot and formula prices are never ranked; they are listed in not_ranked. Offers whose price list was read only for another distributor's area are left out. Electricity: distributor (cez-distribuce | egd | pre-distribuce), rate (D01d, D02d, D25d, D26d, D27d, D35d, D45d, D56d, D57d, D61d), mwh = yearly high-tariff (or all) consumption, nt_mwh = low-tariff consumption; breaker = main breaker (1x25, 3x10, 3x16, 3x20, 3x25 default, 3x32, 3x40, 3x50, 3x63; it sets the fixed monthly distribution price from the regulator's table); postcode (5 digits) instead of distributor picks the distributor area as an estimate (area.estimate = true; two candidates when the postcode spans an area boundary: then pass distributor). Every result is an estimate (result_type: estimate, guaranteed: false): the binding bill depends on the actual consumption, the distributor stated on the bill and the contract. Gas: distributor (gasnet | gas-distribution | ppd), mwh = yearly consumption up to 63 MWh; postcode instead of distributor picks the gas area the same way (estimate; two candidates around Prague or on an area boundary: then pass distributor). Call without a distributor to get the distributors, rates (rate_info: low-tariff hours a day), products and the regulated price tables. COMPARISON TEMPLATE (20 Oct 2026): every ranked offer carries the forDeal score 0–10 (score, score_parts price / conditions / rating, score_weights as used, score_missing when a part is absent), labels (cheapest = lowest total of the list; best_value = highest score), a one-sentence reason, conditions (fixation months and bucket, term indefinite | fixed_term, notice_months, termination_fee none | stated, green; null = the price list does not state it) and the supplier's public rating (source, score, scale, count, source_url, fetched_on; counted only from 10 reviews; null = we have none, and the weights are renormalised, the answer says so). Filters: fixation none | 12 | 24 | 36 (variable price, or fixed up to 1 / 2 / 3+ years), pricing fixed | variable | spot (spot = market-price products, listed without a total), green true, no_penalty true (no fee for leaving stated); filter_counts says how many offers each chip would leave. sort score (default) | price. compare = up to 3 offer ids: the answer adds comparison with the same parameters side by side. Method and weights: scoring. What the household pays today, best first: current_offer (an id from products), or its own prices current_vt_price + current_nt_price + current_fee_month (current_prices_vat), or current_monthly (the advance); each offer then carries saving_year against it and the answer states saving_basis (offer | own_prices | advance) and warnings (e.g. nt_mwh_missing for a two-tariff rate without low-tariff consumption).
| Name | Required | Description | Default |
|---|---|---|---|
| mwh | No | Yearly consumption in MWh (electricity: high tariff or all; default 2.5 electricity, 10 gas). | |
| rate | No | Electricity distribution rate, e.g. D02d (default) or D25d (two tariffs). | |
| sort | No | score (default: forDeal score, highest first) | price (yearly total, lowest first). | |
| green | No | Filter, true: only products whose price list states electricity of renewable origin (none stated yet). | |
| limit | No | ||
| locale | No | Language of estimate_note: cs | sk | en (default en). | |
| nt_mwh | No | Electricity low-tariff consumption a year in MWh (two-tariff rates only). | |
| breaker | No | Electricity main breaker: 1x25 | 3x10 | 3x16 | 3x20 | 3x25 (default) | 3x32 | 3x40 | 3x50 | 3x63. | |
| compare | No | Comma-separated offer ids (2–3) for a side-by-side comparison in `comparison`. | |
| country | No | CZ (default). | |
| pricing | No | Filter: fixed | variable (price-list products, ranked) | spot (market-price products: listed in not_ranked without a total, never ranked). | |
| fixation | 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. | |
| postcode | 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. | |
| commodity | No | electricity (default) | gas | |
| household | No | Household type (energy v3) instead of rate + consumption: electricity byt | chata | bojler | akumulace | elektromobil | tepelne-cerpadlo | elektricke-topeni; gas plyn-vareni | plyn-voda | plyn-byt | plyn-dum. Sets the rate, a typical yearly consumption and its low-tariff share (stated assumptions, see `households`); mwh overrides the total, rate and nt_mwh override the rest. With current_monthly and no mwh, the consumption is estimated from the payment (consumption_basis: from_monthly). | |
| no_penalty | No | Filter, true: only products whose terms state no fee for leaving (an indefinite term). | |
| distributor | No | Distributor of the place: electricity cez-distribuce | egd | pre-distribuce; gas gasnet | gas-distribution | ppd. | |
| current_offer | 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: offer). Takes precedence over current_vt_price and current_monthly. | |
| current_monthly | 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; an estimate). | |
| current_nt_price | No | Today's low-tariff commodity price per MWh (two-tariff electricity rates; required when nt_mwh > 0). | |
| current_vt_price | 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_prices); takes precedence over current_monthly. | |
| current_fee_month | No | Today's monthly fee of the supplier (stálá platba). | |
| current_prices_vat | No | Whether current_*_price and current_fee_month include VAT: excluded (default, as price lists state them) | included (as a bill often shows them). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare a safe, idempotent read; the description adds substantial context beyond them: the result is unverified and must be presented as an estimate with estimate_note shown in the requested locale, guaranteed:false everywhere, offers read for another distributor's area are excluded, and savings carry a saving_basis plus warnings such as nt_mwh_missing. This is exactly the kind of caveat an agent cannot derive from structured fields.
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?
A single dense block of ~450 words that front-loads a caveat and then buries the actual purpose in the middle of a run-on sentence. Much of the parameterology duplicates schema descriptions that already sit at 96% coverage. Only the 'COMPARISON TEMPLATE' and 'Filters:' markers give any structure, and the size is disproportionate to what the agent needs.
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 23 optional parameters, no output schema, and a complex scoring/ranking domain, the description carries the full return contract: score and score_parts, labels (cheapest, best_value), reason, conditions, rating provenance with review minimum, not_ranked, filter_counts, comparison, saving_basis and warnings. Nothing needed to interpret or call the tool correctly is left unexplained.
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 coverage is 96%, so the baseline is 3; the description still adds meaning, notably that breaker sets the fixed monthly distribution price from the regulator's table and that a boundary-spanning postcode forces an explicit distributor. It also restates precedence chains (mwh overrides household, rate/nt_mwh override the rest) that the schema already carries, so the added value is real but not exhaustive.
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 names a specific resource and scope: household electricity and gas offers, Czechia only, ranked by yearly bill for a stated consumption in one distributor's area, with VAT. The electricity/gas parameter split and the regulated-vs-supplier bill breakdown make the tool's function unmistakable. It never explicitly distinguishes itself from close siblings like compare_energy_from_bill or energy_suppliers, so it stops short of a 5.
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?
Strong operational routing: 'Call without a distributor to get the distributors, rates, products and the regulated price tables', and 'postcode instead of distributor ... two candidates ... then pass distributor' tell the agent exactly which path to take. Filter semantics (fixation, pricing, green, no_penalty) and the rule that spot/formula prices are never ranked are spelled out. What is missing is explicit guidance on when to prefer this tool over compare_energy_from_bill, which the agent must infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_energy_from_billHousehold electricity or gas from the values on a billARead-onlyIdempotentInspect
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 the bill's own prices (saving_basis: own_prices) or against the monthly advance. Consumption of a billed period other than a year is scaled to 365 days by period_days. Confirm the values with the person before calling; nothing is stored.
| Name | Required | Description | Default |
|---|---|---|---|
| rate | No | Electricity distribution rate, e.g. D25d. | |
| limit | No | ||
| locale | No | Language of estimate_note: cs | sk | en (default en). | |
| nt_mwh | No | Low-tariff consumption in MWh in the billed period. | |
| vt_mwh | Yes | Consumption in MWh in the billed period: high tariff or all (gas: all). | |
| breaker | No | Main breaker, e.g. 3x25. | |
| commodity | Yes | electricity | gas | |
| fee_month | No | Supplier's monthly fee without VAT. | |
| distributor | Yes | cez-distribuce | egd | pre-distribuce | gasnet | gas-distribution | ppd | |
| period_days | No | Days of the billed period (default 365). | |
| nt_price_mwh | No | Supplier's low-tariff price per MWh without VAT. | |
| vt_price_mwh | No | Supplier's commodity price per MWh without VAT. | |
| monthly_advance | No | Monthly advance with VAT (used when the prices are missing). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive behavior. The description adds important caveats beyond annotations: the calculation is indicative (verified: false), includes an estimate_note like compare_energy, scales non-year periods to 365 days, and stores nothing.
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 front-loaded with the key caveat (indicative calculation), then input sources, output behavior, scaling rule, and confirmation requirement. It is dense but every sentence carries useful information with no fluff.
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 13 parameters, 92% schema coverage, and no output schema, the description is complete enough: it explains input provenance, returned ranking and savings basis, period scaling, and the need to confirm values. Annotations cover safety, so no important behavioral gap remains.
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 coverage is high at 92%, so baseline is 3. The description still adds meaningful semantics: period_days drives scaling of non-year billed periods to 365 days, and monthly_advance is used for savings when bill prices are missing. This goes beyond the individual field descriptions.
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 and resource: pass bill values and get the same ranked energy offer comparison as compare_energy. It clearly distinguishes this from generic comparison tools by tying inputs to a household bill and naming the related endpoint.
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?
It gives clear context for when to use the tool: when values come from a household electricity or gas bill, whether read via the API, extracted from the document, or typed. It also names compare_energy as the equivalent ranked output, but does not explicitly state when to prefer this tool over compare_energy or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_internetCompare home internet providersARead-onlyIdempotentInspect
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; unknown values stay null, and availability must be confirmed with the provider.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | ||
| limit | No | ||
| offset | No | ||
| country | Yes | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. | |
| provider | No | ||
| max_price | No | ||
| min_price | No | ||
| technology | No | ||
| min_speed_mbps | No | ||
| commitment_months | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real value beyond that: the data source file, the null-preservation rule for unknown values, the note that results include each provider's availability checker and source links, and the caveat that ranges are not address-specific. Pagination behavior is unmentioned.
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?
Three sentences, each front-loaded with the most decision-relevant content: what it compares, how to filter/sort, and what the results and caveats are. No filler or repetition of schema enums verbatim.
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 no output schema, the description helpfully states what each result contains (availability checker, source links) and the null/verification caveats. It is nearly complete for a read-only query tool, but omits pagination semantics and default sort behavior, which an agent needs to page results correctly.
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 only 10%, so the description must carry the load. It does map most filters semantically (country, technology, advertised speed, listed monthly price, commitment duration, provider) and explains sort keys including 'indicative price per advertised Mbps'. However, limit/offset pagination is never mentioned, units for price and speed are not clarified, and the schema's odd 'country required but documented as optional' tension is left unaddressed.
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?
States a specific verb and resource ('Compare provider-level home internet summaries') and names its data source, immediately distinguishing it from siblings like compare_mobile, compare_energy, and compare_digital. An agent can identify the tool's scope without opening the schema.
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 gives clear usage context: filter/sort dimensions and the crucial exclusion that this source holds summarized ranges, not individual address quotes, so availability must be confirmed with the provider. It stops short of naming alternative sibling tools or explicitly stating when not to use it versus, say, compare_mobile.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_mobileMobile tariffs by what you needARead-onlyIdempotentInspect
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 remain null and never satisfy positive filters.
| Name | Required | Description | Default |
|---|---|---|---|
| sms | No | ||
| esim | No | ||
| sort | No | ||
| limit | No | ||
| five_g | No | ||
| country | Yes | CZ | SK; required so results and currency stay within one market. | |
| data_gb | No | GB of mobile data a month (default 0). | |
| minutes | No | Call minutes a month (default 0). | |
| operator | No | ||
| no_commitment | No | Only tariffs without a contract period. | |
| roaming_eu_gb | No | EU roaming data needed a month. | |
| unlimited_calls | No | Filter to tariffs with unlimited calls (true), or explicitly finite calls (false). | |
| commitment_months | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description adds real context on top: every result carries source URL, checked date and quote, and unknown values stay null and never satisfy positive filters. That null-handling rule is a non-obvious semantic that directly affects filter interpretation and is not derivable from annotations or schema.
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?
Four sentences, purpose front-loaded, no filler. The long filter enumeration is dense but each item maps to a parameter, so it earns its place; a short list format would read more cleanly.
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 13-parameter read-only query tool with no output schema, the description covers filtering, sorting, result provenance and null behavior, which is what an agent needs. Minor gaps remain around pagination/limit behavior and whether commitment_months is a maximum or exact match.
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 coverage is only 46%, so the description must compensate, and it largely does: it names nearly every parameter and adds meaning beyond the schema, e.g. data_gb as a minimum threshold, the unlimited-calls boolean semantics, and the fact that minutes/SMS/no_commitment/roaming_eu_gb still work. Only limit and commitment_months semantics (minimum vs exact) are left unstated.
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?
States a specific verb and resource (compare sourced CZ and SK mobile tariff records) and even names the backing dataset file, which pins down the exact scope. An agent can distinguish it from siblings like compare_internet, compare_digital and compare_energy purely from the domain and market named.
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?
Explicitly declares country as required and explains why (results and currency stay within one market), then enumerates the usable filter sets and the two sort orders. It also carves out the legacy-style filters so the agent knows both filtering styles are valid, leaving no ambiguity about how to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
confirm_energy_watchConfirm a fixation-end watch (the person's click)AIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description usefully adds the authorization constraint ('only the person who received the e-mail holds the token'), but says nothing about expired/invalid tokens or what state change results beyond 'turns the watch on'.
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?
Two short sentences with the effect stated first and the token provenance second; nothing is redundant. The leading noun phrase 'The double opt-in click:' is slightly fragmentary but front-loads the concept efficiently.
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?
There is no output schema and this is a mutating step in a multi-part watch flow, so the description should ideally state what a successful confirmation yields or how failures (expired/used token) behave. Annotations cover safety and idempotency, but the operational outcome of the call remains underspecified.
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 coverage is 0%, so the description must carry the token parameter, and it does add real meaning: the token originates from the first watcher e-mail and is held only by the recipient. It stops short of describing format, length or expiry, which the schema only partially constrains (10-200 chars).
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?
Names a specific action (confirming a watch via token) and its effect ('turns the watch on'), which cleanly separates it from watch_energy_fixation and energy_watch_status. The scope ('fixation-end watch') is implied by the tool name and title rather than restated, so it is slightly less explicit than it could be.
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 double opt-in click' implies it is the second step after the initial watch e-mail, and 'the first watcher e-mail' hints at the prerequisite. However, it never names watch_energy_fixation as the setup step or states what to do when no confirmation e-mail was received, leaving the when-to-use routing implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_listCreate a named listAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The list's name, e.g. Narozeniny (1 to 80 characters). | |
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds value beyond the annotations: the list starts empty, is private to the signed-in account, and is capped at 50 per person — a quota the annotations do not express. It does not clarify what is returned on success or what happens at the cap, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence front-loads the verb, resource, and scope, then appends the follow-up action and the quota. No filler.
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?
Covers purpose, follow-up flow, privacy, and the quota, which is sufficient for a simple two-parameter create tool with full schema coverage and no output schema. Only the return value/shape of the created list is left unstated.
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 coverage is 100% and both parameters are fully documented in the schema, including length bounds and locale format. The description's examples (Narozeniny, Nová kuchyň) merely echo the schema's example, adding no new semantics.
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?
States a specific verb and resource ("Creates an empty private list") plus the scope ("in the signed-in person's account"), and gives concrete naming examples. It is clearly distinguishable from siblings like list_my_lists, update_list, and delete_list.
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?
Explicitly routes the follow-up step to add_to_list and states the 50-list cap, which tells the agent when creation will fail. It lacks an explicit "to see existing lists use list_my_lists" style exclusion, but the operational context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
daily_dealsBiggest price drops of the last 24 hoursARead-onlyIdempotentInspect
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 verified by us, at most 50 %). Never an average or other shops' prices. For one country, optionally one category of any level and a minimum percent. for one country and optionally one category slug (from the deal categories). Shops on a risk list and shops without a rating are never included. Each row carries the current price, the previous price, the drop, the shop with its trust label and the capture time. Next: find_best_price with the product name for the full comparison.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| country | No | Country of the shops. Default: the first compared country. | |
| category | No | Category slug of any level of the tree, e.g. mobily, elektronika, televize. | |
| min_percent | No | Only discounts of at least this many percent. | |
| stated_only | 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. | |
| max_per_shop | 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnly/idempotent annotations: it discloses the exact discount methodology (lowest 30-day price per EU Omnibus, fallback to shop-stated price capped at 50%, tagged via discount_basis), states what is never used (averages, other shops' prices), and lists what each row returns. That is precisely the interpretive context an agent needs for a price-change feed.
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?
Front-loaded and information-dense, but it carries a garbled, near-duplicated clause about country/category filtering mid-sentence and an inline case-law citation that slows parsing. Several sentences earn their place; the redundancy does not.
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 filter/listing tool with no output schema, it describes the returned fields (current price, previous price, drop, shop with trust label, capture time) and the safety/exclusion rules. Remaining gaps are minor: the default limit and the interaction between ordering and max_per_shop are not restated in prose.
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?
With 83% schema coverage the schema already documents country, category, min_percent and max_per_shop. The description adds meaning on top: category is 'of any level', results are for a single country, and the discount interpretation depends on history depth. It does not explain limit or stated_only, so not a 5.
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?
Opens with a specific verb+resource+ordering: discounts at rated shops in the last 24 hours, sorted by biggest absolute saving. It is clearly distinguishable from find_best_price, which it names. Clutter from the repeated 'for one country ... for one country and optionally one category slug' sentence and the legal citation keeps it short of a 5.
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?
States the exclusion criteria (risk-listed and unrated shops are never included) and explicitly routes the agent onward: 'Next: find_best_price with the product name for the full comparison.' It gives a clear operating context but does not spell out when to prefer this over, e.g., product_rows or trending_new_products.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_comparisonDelete a saved comparisonADestructiveIdempotentInspect
Deletes one of the signed-in person's saved comparisons; its share link stops working.
| Name | Required | Description | Default |
|---|---|---|---|
| comparison_id | Yes | The comparison's id from list_my_comparisons. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds genuinely new context beyond them: the associated share link stops working, which tells the agent the blast radius extends to other users. It stops short of stating whether deletion is recoverable or whether non-owners are rejected.
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?
A single sentence, front-loaded with the verb and scope, with the side effect appended rather than buried. No filler.
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 one-parameter destructive tool with rich annotations and a fully documented schema, the description covers identity, scope, and the key side effect. Only irreversibility and ownership/permission behavior are left unstated, which are minor gaps given the annotation coverage.
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?
Only one parameter and schema coverage is 100%, with the schema itself pointing to list_my_comparisons as the source of the id. The description adds no format, provenance, or error semantics beyond that, so baseline 3 applies.
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?
States a specific verb (deletes) and a precisely scoped resource (the signed-in person's saved comparisons), which separates it from siblings like delete_list and delete_price_watch without needing their schemas. The clause about the share link adds a concrete distinguishing effect.
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?
Usage is only implied: an agent can infer 'call this when you want a saved comparison gone,' but the description never states when to choose this over delete_list or whether confirmation is expected. No exclusions or alternative routing are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_listDelete a named listADestructiveIdempotentInspect
Deletes one of the signed-in person's lists with its products; its share link stops working. Another id answers not_found.
| Name | Required | Description | Default |
|---|---|---|---|
| list_id | Yes | The list's id from list_my_lists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, yet the description still adds real context: the products inside the list are destroyed too, and the share link stops working (a side effect on third parties). It does not say whether deletion is permanent/undoable or what permissions are required, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the primary effect front-loaded and the side effects following. The telegraphic 'Another id answers not_found
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 single-parameter destructive tool with no output schema, the description covers the action, what is destroyed, the share-link consequence, and the cross-account error case. Only auth/permission requirements and undo-ability are left unstated, which a caller might still want.
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 coverage is 100% and the parameter already documents where list_id comes from (list_my_lists), so the schema carries the load. The description adds only an indirect constraint — an id belonging to someone else or nonexistent yields not_found rather than another error — which is more behavioral than parameter semantics.
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?
States a specific verb (deletes) and a precisely scoped resource (one of the signed-in person's lists, including its products), which distinguishes it from remove_from_list and delete_comparison in substance. It never names those siblings explicitly, so differentiation is inferential rather than stated.
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 explicit when-to-use or when-not-to-use guidance, and no alternative is named even though remove_from_list and delete_comparison are close cousins. Usage is only implied by the phrase 'one of the signed-in person's lists'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_price_watchCancel a price watchADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| watch_id | Yes | The watch's id from list_my_price_watches. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already declaring destructiveHint=true and idempotentHint=true, the description adds useful context: the effect of stopping emails and the not_found behavior for IDs outside the token's ownership. It does not repeat the annotations but supplements them with consequence and error details.
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 two short, front-loaded sentences with no wasted words. It starts with the core action and follows with important scope and error details.
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 single-parameter destructive tool with no output schema, the description covers the essential aspects: what it does, the effect, the ownership constraint, and the error behavior for invalid IDs. Nothing critical is missing.
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 100%, and the schema already documents the watch_id parameter with its source ('from list_my_price_watches'). The description adds only the error behavior for an invalid ID, not additional syntax or format details, so the baseline of 3 is appropriate.
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 and resource: 'Deletes one of the signed-in person's watches', and clarifies the scope ('signed-in person's watches'). This distinguishes it clearly from sibling tools like update_price_watch and list_my_price_watches.
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?
It gives clear context for use: deleting one of the signed-in person's watches, with the outcome that no more mails are sent. It also states an ownership constraint ('Only the token's own watches') and the error behavior for other IDs, though it does not explicitly name alternatives like update_price_watch.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
digital_price_historyRecorded price changes of digital plansARead-onlyIdempotentInspect
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 list means no change since tracking_since. An unchanged price renewed by the daily check is no change. Filter by plan (the id from /digital/plans).
| Name | Required | Description | Default |
|---|---|---|---|
| plan | No | One plan id from /digital/plans. | |
| limit | No | At most this many changes (default 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, and the description adds real behavioral context: newest-first ordering, the tracking_since horizon with no back-fill, what an empty list means, and the meaning of the two source values (person vs catalog). The only omission is nothing about pagination/limits behavior beyond the schema's default, which is minor here.
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?
Front-loaded with the core statement ('Every recorded change of a digital plan's price, newest first'), then fields, then caveats. It is dense but nearly every clause carries information; the field enumeration and source definitions are justified, though the sentence run is long.
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 and no output schema, the description compensates by documenting the return shape (plan_id, verified_on, from/to, source, source_url) plus the critical caveats about tracking_since and non-back-filled history. An agent has everything needed to call it and interpret results correctly.
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 100% and both parameters are documented there (plan = one id from /digital/plans; limit default 100, max 500). The description largely restates the plan parameter and adds no syntax or format detail beyond the schema, so baseline 3 applies.
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?
States a specific verb (records price changes) and resource (digital plan prices) and enumerates the returned fields, so the agent knows precisely what it gets. It is clearly a digital-plan tool rather than the generic price_history or energy_price_history, but it never names those siblings, so the differentiation is implicit rather than explicit.
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?
Gives practical guidance on filtering ('Filter by plan, the id from /digital/plans') and how to interpret an empty result (no change since tracking_since; renewals at the same price are not changes). It does not, however, say when to prefer this over price_history or compare_digital, so the alternative-routing guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
energy_price_historyHousehold electricity and gas prices over timeARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | CZ (default) | |
| commodity | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/no-destructive, and the description adds substantive behavior: semi-annual granularity, taxes and levies included, a fixed consumption band, 'never interpolated', and that the response carries the dataset link and fetch date. These are exactly the caveats an agent needs to interpret the numbers.
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?
Purpose is front-loaded in the first clause and every clause carries information (source, cadence, tax scope, band, non-interpolation). The long parenthetical makes the first sentence dense and slightly harder to scan, but nothing is wasted or repeated.
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 no output schema, the description usefully discloses what comes back (series values plus dataset link and fetch date). It omits the historical coverage window / number of semi-annual points, which would help an agent judge whether the series is sufficient — a minor but real gap.
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 coverage is only 50% — country has a description ('CZ (default)') but commodity's enum has none. The description implies Czechia-only data and electricity/gas scope, which partly compensates, but it does not explain the country parameter's restriction or what happens for non-CZ input. Baseline 3 for partial coverage.
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?
Names a specific resource and verb ('Development of household electricity and gas prices per kWh') and pins down the source, cadence, tax treatment, and consumption band (Eurostat, semi-annual, all taxes and levies, most common band). It is clearly separable from energy_unit_prices (today's price) and the own_history_since readings.
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?
Explicitly routes the agent to energy_unit_prices for today's prices from current price lists, and clarifies that own price-list readings are not yet a series. It doesn't state an explicit 'do not use this for X' exclusion for non-Czech countries, but the alternative is named concretely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
energy_suppliersHousehold energy suppliers with their products and where to find the billARead-onlyIdempotentInspect
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 the reason), its products with the prices of the official price lists (electricity: commodity price per MWh by rate and the monthly fee; gas: price and fee by consumption band; all without VAT, with source_url, valid_from and verified_on), whether each price is fixed and until when, and the bill guide (bill_guide: the customer portal and the steps to find and download the bill, from the supplier's own help page). Former suppliers (e.g. Bohemia Energy) are listed with what happened to their customers. No contract can be signed here and no link earns a commission.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Supplier id from the list, e.g. cez-prodej. | |
| locale | No | Language of the bill guide steps: cs | sk | en (default en). | |
| country | No | CZ (default) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description's job is to add context, and it does: the `verified: false` flag means the yearly calculation is not independently checked, `estimate_note` carries the source sentence and date, and it states no contract can be signed and no link earns commission. The one real gap is return shape/pagination, which is not addressed.
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 content is valuable but delivered as one very long sentence with deeply nested parentheses, which makes it hard to scan. It is front-loaded with the verification caveat, but a reader must re-parse the middle clause to extract the electricity vs gas price structure.
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?
There is no output schema, so the description carries the return-value burden and largely does so: product prices, fees, VAT exclusion, source_url, valid_from, verified_on, fixation, bill guide, and former-supplier handling. What is missing is any notion of result size, ordering, or pagination for the 46-supplier country listing.
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 coverage is 100%, so the baseline is 3, but the description adds real meaning: `id` selects a single supplier instead of the country list, and `country` defines the enumeration scope (Czechia: 46). `locale` is only indirectly covered via 'the bill guide steps', so it is not fully compensated for.
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?
States concretely what is returned: suppliers of a country or one supplier by id, their official price-list products with commodity price per MWh, monthly fees, fixation status, and a bill guide. It is clearly a read-only reference lookup, which separates it from transactional siblings like compare_energy or set_price_watch. It never explicitly names a sibling to differentiate against, so it stops short of a 5.
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?
Usage is only implied: you call it to enumerate suppliers or fetch one supplier's price lists and bill-finding instructions. There is no explicit 'use this when…, use compare_energy instead when…' routing, and the list-mode vs single-id-mode switch is described but not framed as a choice criterion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
energy_unit_pricesPrice of one kWh of electricity and gasARead-onlyIdempotentInspect
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, renewables support, tax; the same with every supplier), supplier_kwh (commodity price: min, median, max over the priced offers), marginal_kwh (regulated + supplier: the cost of one more kWh, what an appliance costs to run) and all_in_kwh (the yearly total for mwh with every fixed fee spread over its kWh). Electricity for one rate (default D02d) and 2.5 MWh a year by default; gas for 9 MWh a year by default. Spot and formula prices are never counted. Use estimate_appliance_energy for an appliance's yearly cost.
| Name | Required | Description | Default |
|---|---|---|---|
| mwh | No | Yearly electricity consumption for all_in_kwh, default 2.5. | |
| rate | No | Electricity distribution rate, default D02d. | |
| locale | No | Language of estimate_note: cs | sk | en (default en). | |
| country | No | CZ (default) | |
| gas_mwh | No | Yearly gas consumption for all_in_kwh, default 9. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the description need not repeat safety. It adds genuinely non-obvious behavior: the values are indicative and unverified (verified: false), and the caller must surface estimate_note alongside the result, plus the data provenance and the exclusion of spot/formula pricing.
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 unverified-data caveat is correctly front-loaded, but the body is one long run-on sentence with deeply nested parentheses that is hard to scan. Every clause carries information, yet the blocky structure taxes comprehension for a tool an agent will call often.
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 no output schema, the description carries the return-value burden and does so by naming and explaining all four output fields and the accompanying estimate_note. It leaves minor gaps — currency/units of the returned prices and whether per-distributor areas are returned as a list — but nothing that would cause a mis-call.
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 coverage is 100% with defaults already documented, so the baseline is 3. The description still adds meaning: mwh drives all_in_kwh by spreading every fixed fee over that consumption, the rate must be a single-rate tariff (D02d default), and gas_mwh is the parallel gas figure — clarifying what each knob actually changes.
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?
States a concrete resource and scope: the per-kWh household price with VAT for a country (Czechia only), per distributor area, built solely from regulator tables and supplier price lists. It enumerates the four resulting figures (regulated_kwh, supplier_kwh, marginal_kwh, all_in_kwh), so an agent knows exactly what comes back and how it differs from the sibling cost estimators.
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?
Explicitly routes appliance running costs to estimate_appliance_energy and excludes spot/formula prices, plus gives the default assumptions (D02d rate, 2.5 MWh electricity, 9 MWh gas). It never states the negative case for this tool itself (e.g. when a bill-based comparison is preferable over compare_energy_from_bill), so it falls short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
energy_watch_statusState of a fixation-end watch from its e-mail linkARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/closed-world, so the bar is lower, and the description adds real value on top: it discloses the returned fields and the not_found outcome for watches that were cancelled or deleted (i.e. soft-deleted records remain queryable but report not_found). It does not discuss token expiry or whether the token itself acts as authorization, which is the one remaining behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, no filler, with the resource and the token's provenance front-loaded and the error behavior last. The phrasing is slightly telegraphic ("The watch behind a token"), but nothing is wasted.
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 single-parameter read with no output schema, the description supplies the return shape (status, end date, alert day, masked e-mail) and the principal failure mode, which is what an agent needs to call and interpret it. Only the auth/expiry story is left implicit.
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 coverage is 0% and there is one parameter, so the description must carry the meaning — and it does, explaining that `token` is the `t` value from the watcher e-mail link, which tells the agent exactly where to obtain it. It does not mention the 10-200 character constraint, but the schema handles that.
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 names a specific resource (a fixation-end watch identified by an e-mail token) and enumerates what it reports: status pending|confirmed, end date, alert day, masked e-mail. Combined with the title it is clearly a read/lookup, distinguishable from siblings like confirm_energy_watch, cancel_energy_watch and list_my_price_watches, though the verb itself is implied rather than stated.
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?
Usage context is implied by "a token from a watcher e-mail (the `t` of the link)", telling the agent this is for someone following an e-mail link. There is no explicit when-to-use vs. list_my_price_watches or confirm_energy_watch, and no statement of prerequisites or alternatives beyond the not_found behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
estimate_appliance_energyYearly consumption and cost of a fridge, a washing machine or heatingARead-onlyIdempotentInspect
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 house 50 kWh/m² a year by ČSN 73 0540-2), source direct | heat_pump | gas_boiler with scop (heat pump, default 3) or efficiency (gas boiler, default 0.9). Answers kWh a year and the yearly and monthly cost at the price of one more kWh (median marginal price in the distributor area from energy_unit_prices, or price_per_kwh if given); defaults names every value that was assumed.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | ||
| scop | No | ||
| locale | No | Language of estimate_note: cs | sk | en (default en). | |
| source | No | ||
| area_m2 | No | ||
| country | No | CZ (default) | |
| efficiency | No | ||
| distributor | No | Distributor area for the price (default: the first area with priced offers). | |
| price_per_kwh | No | Own price of one kWh with VAT instead of ours. | |
| label_kwh_year | No | ||
| washes_per_week | No | ||
| heat_need_kwh_m2 | No | ||
| kwh_per_100_cycles | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, so the safety profile is covered; the description goes well beyond by disclosing that results are unverified, that an estimate_note carries the price date, that `defaults` names every assumed value, and how the kWh price is sourced (median marginal price in the distributor area, or price_per_kwh when supplied). It also names concrete defaults (washes_per_week 4, scop 3, efficiency 0.9) and the fallback distributor area, which is exactly the kind of assumption disclosure a calculator needs.
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?
Every clause carries real information, but the entire description is a single semicolon-and-parenthesis-chained run-on that is difficult to parse. It is front-loaded with the outcome, yet an agent must re-read it to extract per-kind requirements; a short structured breakdown by kind would be far more usable at the same length.
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?
There is no output schema, and the description does cover the return surface: kWh per year, yearly and monthly cost, the verified flag, estimate_note, and the `defaults` object. For a 13-parameter calculator that is nearly complete, with only minor gaps such as error behavior for invalid kinds or missing required fields.
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 coverage is only 31%, but the description compensates heavily: it defines label_kwh_year, kwh_per_100_cycles, area_m2, heat_need_kwh_m2 (with units and reference values 20/50 kWh/m²a per ČSN 73 0540-2), source, scop, efficiency, price_per_kwh and washes_per_week with defaults. Locale and country are left to the schema (which documents them), and distributor's default is explained, so the coverage gap is largely closed.
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 and resource: it estimates yearly kWh and cost for one of three appliance kinds (fridge, washer, heating), and enumerates the input each kind takes. An agent can tell it apart from sibling tools like compare_energy or energy_unit_prices, though the opening clause ('An estimate (verified: false...)') is telegraphic rather than a clean statement of purpose.
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?
Usage is implied through the per-kind branching (which parameters each appliance kind requires), which effectively tells the agent when each mode applies. However, there is no explicit statement of when to use this versus compare_energy, energy_unit_prices, or energy_price_history, and no when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_best_priceFind the best price for a productARead-onlyIdempotentInspect
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 EAN, or a product URL from any e-shop. Returns one card: match (exact | close: close means the nearest product is another variant than the query names, e.g. iPhone 16 Plus for "iPhone 16 256 GB"; match_note says how, warnings opens with it and reasons carries close_match; never present a close card as the asked-for item), verdict (buy_now | wait | buy_alternative | no_offer) with a headline and explanation in locale, the recommended offer best (shop, trust label verified | rated | unknown, rating 0-1, total.goods = the product price and total.shipping in the deliver-to currency, total.total = their sum, FX date, capture time), cheapest_total (the offer with the lowest total including shipping), three alternatives (cheapest domestic, cheapest cross-border, best rated), every shown offer with its blockers and price_status (verified = goods + stated shipping, the sum the buyer pays; estimate = the shop states only its lowest "from" shipping rate; incomplete = shipping to the country unknown or import duties open, a lower bound that is never the cheapest), a 90-day price history, and commission_disclosure. Every offer carries labels (lowest_price = the lowest product price; recommended = best when it is dearer than that, never call it the cheapest; lowest_verified_total = the cheapest total with a stated, not "from", shipping), shipping_is_estimate (a "from" or unknown shipping: the total is a lower bound) and saving_is_estimate (its savings_vs_best rests on such a shipping: say estimated, never a certain saving). Rules: a shop on a consumer-protection risk list is never shown; a shop without a rating is never best; an offer with unknown shipping or a price older than 36 hours is never best. Cross-border offers carry cross_border (EU warranty, returns, support languages). Send the buyer to best.url (Fordeal's click URL, which forwards to the shop) and tell them the product price, the shipping and the capture time. Next: price_history for the trend, or find_best_price again with verified_only=true.
| Name | Required | Description | Default |
|---|---|---|---|
| deep | 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 in the background. | |
| sort | 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_country`. The card says which in `sort`; `cheapest_total` is the lowest total either way. | |
| query | Yes | Product name, model, EAN, or a product URL. | |
| budget | No | Budget in the deliver-to currency; a total above it turns the verdict into buy_alternative. | |
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| verified_only | No | Only shops with a customer rating. | |
| include_shipping | No | Same as sort=total: count shipping in the order (the website's "Zahrnout dopravu"). Default false. | |
| deliver_to_country | No | Where the buyer wants delivery (ISO 3166-1 alpha-2). Default: the first compared country. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish read-only/open-world/idempotent; the description goes far beyond by disclosing the exclusion rules (risk-list shops never shown, unrated shops never `best`, offers with unknown shipping or prices older than 36 hours never `best`) and by explaining that close matches must never be presented as the asked-for item. It also explains price_status, labels and the estimate semantics that determine what the buyer is actually told.
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 core purpose is front-loaded, but the body is a single dense run-on block of backticked field names that is hard to scan and partly re-states what the schema already documents for `sort`. Given there is no output schema the volume is defensible, yet the lack of paragraph or bullet structure costs it.
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 no output schema, the description carries the entire return contract and does so thoroughly: card fields, verdict enumeration, offer-level labels, price_status tiers, 90-day history and commission disclosure. Nothing an agent needs in order to interpret the response or act on it appears missing.
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 coverage is 100%, so the baseline is 3; the description earns more by giving concrete `query` forms (free text with example, model, EAN, any e-shop URL) and by stating the equivalence between `sort=total` and `include_shipping=true`, a relationship the schema states only separately. It still leaves `budget`, `deep` and `deliver_to_country` to the schema.
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 opening clause names the concrete task — find where to buy a product cheapest today — and immediately defines the ranking basis (real product price with FX conversion) plus the trust dimension. It is clearly distinguishable from siblings like search_products, get_product and price_history, which do discovery or trend work rather than a single ranked buy-verdict card.
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?
It gives explicit follow-on routing ("Next: price_history for the trend, or find_best_price again with verified_only=true") and documents the sort=total / include_shipping=true variant as an in-tool alternative. What's missing is an explicit statement of when to reach for this instead of search_products or get_product, so the agent must infer the entry-point role.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productToday's card for a known product idARead-onlyIdempotentInspect
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 siblings). Answers from stored prices with the rule-based verdict; every offer carries source_name, captured_at, blockers, and the card reasons and warnings. An unknown id is error.code not_found. Next: product_variants for the other capacities or colours, price_history for the trend.
| Name | Required | Description | Default |
|---|---|---|---|
| ai | No | Also run the shops live and let the model write the verdict (slower). Default false: stored prices and the rules. | |
| sort | 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_country`. The card says which in `sort`; `cheapest_total` is the lowest total either way. | |
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| product | Yes | Product slug (the stable product id), e.g. apple-iphone-16-128-gb. | |
| verified_only | No | Only shops with a customer rating. | |
| include_shipping | No | Same as sort=total: count shipping in the order (the website's "Zahrnout dopravu"). Default false. | |
| deliver_to_country | No | Where the buyer wants delivery (ISO 3166-1 alpha-2). Default: the first compared country. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, closed-world, non-destructive, so the description's job is context — and it delivers: answers from stored prices with a rule-based verdict, each offer carries source_name/captured_at/blockers/reasons/warnings, and an unknown id surfaces as error.code not_found. It stops short of covering the offers list shape or any limits, but the error semantics and stored-vs-live framing are real additions.
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?
Purpose and the identity precondition are front-loaded, and the trailing 'Next:' sentence is a useful routing cue rather than padding. A few clauses are dense and jargon-heavy ("without reading a query", "blockers"), but almost every sentence carries information.
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 7 optional-leaning params, no output schema, and full annotation coverage, the description covers purpose, id sourcing, return contents, error behavior and next steps. Only minor gaps remain, such as the exact shape of `offers` or whether the card is cached versus live when `ai` is false.
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 coverage is 100%, so the baseline is 3; the description earns above that by explaining that `product` accepts a slug or a variant id from specific sibling tools, and that `product.variant` exposes storage, colour, model words, connectivity, size and family_id. The `ai`, `sort` and `include_shipping` semantics live mostly in the schema itself.
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?
It defines the tool concretely — the product card for a product id you already hold — and anchors it against find_best_price and the website's /{locale}/p/{product} page. The key distinction (no query interpretation, so no risk of resolving to a different variant) makes it trivially separable from search_products and find_best_price.
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?
It states the precondition (you already hold product.slug / product.variant.id) and names the source tools that supply it, plus the explicit handoff: product_variants for other capacities or colours, price_history for the trend. When-to-use and alternatives are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_shop_feed_diagnosticsFeed diagnostics of a compared shopARead-onlyIdempotentInspect
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_missing, stale_feed) each with a count, a share and the first five affected items by the shop's own item id and name. Public: no feed address, no item links (the partner's signed-in view at GET /api/v1/partner/feed-diagnostics carries the item links). error.code not_found when the shop is unknown or has no feed run yet. For a feed that is not compared yet use check_shop_feed.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The shop's slug from list_shops or GET /api/v1/deals/shops. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a read-only, idempotent, non-destructive public read, and the description adds meaningful disclosure: no feed address, no item links, partner signed-in view alternative, and error.code not_found behavior. This is substantially more behavioral context than the annotations alone provide.
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 front-loaded with the report purpose and contains no filler. However, it is a single very dense sentence with a long enumeration of issue codes, so the structure could be clearer even though the content is useful.
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?
There is no output schema, so the description carries the burden of explaining return contents; it does so with health states, counts, issue codes, affected items, visibility limits, and error behavior. Together with the explicit alternative for uncompared feeds, this is complete 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?
The schema has 100% description coverage and already documents slug as coming from list_shops or the deals shops endpoint. The description does not add further meaning about the slug parameter, so the baseline 3 is appropriate.
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 resource and operation: the feed-read diagnostic report for a compared shop. It names the core contents (health, counts, coded issues) and distinguishes the tool from check_shop_feed for shops not yet compared.
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?
It explicitly routes the agent to check_shop_feed when the feed is not compared yet. It also states that this is the public view without feed addresses or item links, clarifying the context in which this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_shop_registrationStatus of a shop registrationARead-onlyIdempotentInspect
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 links), next = what happens now, and the shop's page once it exists. The contact e-mail and the feed address are never returned. Older requests of the feeds-job flow answer their own statuses (pending, feed_found, …). Public.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The request id from the registration answer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the existing readOnlyHint, idempotentHint, and non-destructive annotations, the description discloses important behavioral details: the contact e-mail and feed address are never returned, the tool is public, and older feeds-job requests answer their own statuses. It also describes the return content in enough detail for the agent to understand what will and will not be exposed. The description does not contradict any annotation.
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 front-loaded with purpose and then packs the return-field details into one dense sentence. Every clause contributes to understanding the status payload, though the long parenthetical sentence is less scannable than a short structured list. It is appropriately informative given the absence of an output schema.
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?
Because there is no output schema, the description must carry the return-value burden, and it does so comprehensively: status values, contact confirmation, decision reason and timing, feed source and fingerprint, public report contents, `next`, and shop page availability. It also handles privacy exclusions and older feeds-job status variants, leaving no significant gap for an agent calling this tool.
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?
The schema already documents the single `id` parameter at 100% coverage, so the baseline is 3. The description adds useful meaning by stating that the id comes from the register_shop answer and that it is the key with nothing else required. This is meaningful parameter guidance beyond the schema's generic 'request id' wording.
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 immediately states it reports what happened to a registration and then enumerates the concrete statuses, decision details, feed source, report data, and next-step field. It explicitly distinguishes itself from register_shop by noting that register_shop supplies the id used here. An agent can identify this as a read-only status lookup without opening the schema.
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 tells the agent where the required id comes from ('register_shop answers `id`; the id is the key, nothing else is needed') and notes that older feeds-job requests expose their own statuses. It does not explicitly name when not to use this tool, but the register_shop relationship and status-focused scope provide clear usage context. No direct sibling alternative exists for this exact status lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_shop_statisticsClicks Fordeal sent to a shopARead-onlyIdempotentInspect
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 are estimated (own-programme orders are in the partner portal). truncated: true when the window held more than 50 000 rows (the numbers are then a lower bound). Needs the signed-in person's Supabase access token and a shop of list_my_shops; another shop answers 403.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Last UTC day (YYYY-MM-DD); today by default. | |
| from | No | First UTC day (YYYY-MM-DD); 29 days before `to` by default. | |
| shop | Yes | The shop's slug from list_my_shops. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description layers on real operational detail: robots and partner test clicks are excluded and surfaced in `excluded`, results become a lower bound with `truncated: true` past 50 000 rows, and a Supabase access token plus a shop from list_my_shops is required. That is exactly the beyond-annotation context an agent needs before calling.
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 dense but front-loaded block: the core question comes first, then scope, exclusions, truncation, and auth constraints. Every clause carries information, though the single run-on structure makes it heavier to parse than a short sentence list would be.
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 no output schema, the description carries the full burden and does so: it describes the returned total, the zero-filled daily series, the country and channel dimensions, the `excluded` and `truncated` fields, and the precondition of authentication plus shop ownership. Nothing material for a correct call is missing.
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 coverage is 100%, so the baseline is 3; the description earns more by adding semantics the schema lacks: both bounds are inclusive, dates are UTC days, the default is the last 30 days, and the window is capped at 366 days. It also ties `shop` to its source of truth (list_my_shops).
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 opens with a precise verb+resource framing ('How many people Fordeal sent to the shop') and immediately enumerates the exact breakdowns returned: total, per day, per delivery country, per channel. It also draws a hard boundary against adjacent concerns ('no orders or revenue are estimated (own-programme orders are in the partner portal)'), so an agent can separate it from feed/registration siblings without inspecting a schema.
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?
Usage context is strong: default window is the last 30 days, max 366, UTC days inclusive, and alternative shops answer 403. It also signals when-not by redirecting order/revenue questions to the partner portal. It stops short of naming a sibling tool for a related traffic question, so it is clear context rather than full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
insurance_guideInsurance: insurers' facts, public ratings and official websites (no prices, no ranking)ARead-onlyIdempotentInspect
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 insurance for foreigners, other) with the four things to compare besides the price, and cards: one per insurer with the kinds its public site offers, the products in the insurer's words (products: name, kind, online), the kinds that can be concluded online on the official site (online_kinds; online_unknown_kinds = the site does not say), a nonstop assistance line, a mobile app and an online claim form, each a fact {value: true | false | null, note, source_url, checked_on} where null means the site does not state it (never a no), the IČO from the ČNB register (registry; cross_border: true for an offer without a Czech IČO), the public customer rating (source: Firmy.cz or Google Maps by its link; score, scale, count, source_url, fetched_on; only from 10 reviews, otherwise null = no rating yet), factual tags and the official website (commission: false, affiliate: false, no tracking parameters). Filters: kind, online (online for the asked kind), assistance, app, claim_online (true); filter_counts says how many insurers each option leaves. sort: name (default, alphabetical) | rating (public rating from the highest, insurers without a rating last) | kinds (number of kinds offered). compare = 2–3 insurer ids for comparison side by side. Tell the person to read the terms on the insurer's site; the premium and the contract are the insurer's.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | true: only insurers with an official mobile app for clients. | |
| kind | No | Only the insurers of this kind of insurance. | |
| sort | No | name (default) | rating | kinds. Never a recommendation. | |
| locale | No | Language of the guide URLs (cs | sk | en …, default cs). | |
| online | No | true: only insurers whose official site concludes the asked kind (or any kind) online. | |
| compare | No | Comma-separated insurer ids (2–3) for `comparison`. | |
| country | No | CZ (default). | |
| assistance | No | true: only insurers whose site states a nonstop (24/7) assistance line. | |
| claim_online | No | true: only insurers whose site takes a claim report online. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint/idempotent already declared, the description still adds substantial behavior: null means 'the site does not state it (never a no)', ratings only from 10+ reviews with source (Firmy.cz / Google Maps) and fetch date, IČO from the ČNB register, cross_border flag, and an explicit no-commission/no-affiliate/no-tracking stance. `filter_counts` and the 'unrated last' rule for the rating sort are also disclosed.
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?
Content largely earns its place, and the key caveat (not a ranking, no prices) is front-loaded. However, the body is one long run-on with deeply nested parentheticals, making it harder to parse than a few short sentences would be — density without structure.
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 no output schema, the description does the heavy lifting by enumerating the returned card fields (kinds, products, online_kinds, assistance, app, claim form, registry, rating, tags, website). Minor gaps: `country` and `locale` behaviour and result volume/coverage 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 coverage is 100%, so baseline is 3; the description adds real meaning on top — sort ordering semantics (rating highest first, unrated last), the 2–3 id constraint for `compare`, and the kind/online/assistance/app/claim_online filter meanings. It does not clarify the `locale` parameter or repeat the enum tokens, but it goes beyond the schema in the areas that matter.
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?
States a concrete verb and resource: answers the kinds of insurance for a country and returns `cards` with comparable non-price facts per insurer. It explicitly distances itself from price/ranking siblings (compare_energy, compare_mobile, find_best_price) with 'prices: false, ranking: false, score: null', so an agent can tell it apart without opening the schema.
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?
Scope is implied (insurance in CZ) and the two modes — filtered list vs `compare` for 2–3 ids — are described, but there is no explicit 'use this when…' or 'do not use when…' guidance relative to the many compare_* siblings. The only directive given is a downstream instruction ('Tell the person to read the terms on the insurer's site'), not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_couponsShop coupons and promotions valid todayARead-onlyIdempotentInspect
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; up_to = "up to"; null when the text states no size of the discount, never a guess), min_order {amount, currency} when the text names a minimum order ("nákup nad 1 000 Kč"; it is never the discount), valid_from, valid_until (a date = the whole day), url the network's tracked link (Fordeal earns a commission on a purchase through it; the ranking never depends on it), image the card photo with image_source "shop_product" (a product of the shop's own offers in its main category) or "category" (our picture of that category; null = none, show logo_url), and fetched_at of the list. Next: find_best_price with a product name to compare the shop's prices.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| country | No | Country of the shops. Default: the first compared country. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by disclosing the affiliate source, a 3-hour refresh cadence, exclusions (never newsletters/emails, never risk-list shops), explicit null semantics for discount (never a guess), date-range interpretation (a date = the whole day), commission disclosure with ranking independence, and image sourcing rules. Annotations already cover read-only/idempotent safety, but the description adds rich operational 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?
Reasonably sized for a complex listing tool with no output schema, and the purpose is front-loaded. However, the field enumeration is a dense, semicolon-heavy run-on that is harder to parse than it needs to be, though most sentences earn their 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?
With no output schema, the description carries the full burden and does so thoroughly: it describes every returned field (shop, type, title, discount, up_to, min_order, valid dates, url, image, image_source, fetched_at) and the ordering rule. Nothing an agent needs to call or interpret the tool correctly is missing.
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 coverage is 50% (country documented there, limit not). The description adds meaning for country (one country, the shop's country) but does not explain the limit parameter, how many rows it caps, or pagination behavior. Baseline 3 is appropriate given the schema handles the other half.
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?
States a specific verb and resource (coupon codes and promotions), scopes it to compared shops and today, and names the data source (eHUB). It is clearly distinguishable from siblings like daily_deals and find_best_price, the latter being explicitly named as a follow-up.
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?
Gives concrete context: one country (the shop's country), soonest ending first, and directs the agent to find_best_price with a product name for price comparison. It does not explicitly say when not to use this versus daily_deals or list_shops, but the usage context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_comparisonsThe signed-in person's saved comparisonsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower; the description still earns credit by disclosing ordering (newest first), record shape (2–4 plans per comparison), which fields come back (page address, share link when shared), and the privacy rule (private unless `shared: true`). It omits pagination, result caps, and behavior on an empty account — notable given there is no output schema.
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?
A single dense sentence with zero filler: ordering, record shape, returned fields, and privacy rule all front-loaded before any elaboration. Every clause carries information the agent could not get from the schema or annotations.
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 no output schema, the description correctly takes on describing returned content (page address, share link, ordering) and its access model (private unless shared). A read-only, single-optional-param listing tool is adequately covered; only pagination/result-count expectations and the empty-list case are missing.
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?
There is a single optional parameter (locale) and schema description coverage is 100%, so the schema fully documents format and default behavior. The description adds nothing about locale or how it affects the returned page address/share link. Baseline 3 is the correct ceiling here.
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?
States a specific resource with scope: comparisons saved by the signed-in person, itemized as 2–4 digital plans each and ordered newest first. An agent can tell this is a personal saved-items listing, but the description never differentiates it from the lookalike siblings (list_my_favorites, list_my_lists, list_my_price_watches, list_my_shops).
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?
Usage is only implied by the resource name — an agent infers 'use this to see saved comparisons'. There is no explicit when-to-use/when-not or pointer to the sibling that covers favorites, lists, or price watches, so routing between the four list_my_* tools relies on the agent's own inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_favoritesThe signed-in person's favouritesARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive and closed-world, so safety is covered. The description adds genuine context beyond that: an access token is required, results are newest first, and prices are a snapshot ("total saved at that time"). It says nothing about result size or failure modes when unauthenticated, so it adds value but not a rich behavioral picture.
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?
Front-loaded with the resource and return shape in one dense sentence, then auth, then alternatives. The telegraphic final fragment ("Live prices: search_products / compare_digital.") is terse but earns its place as a routing hint.
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 no parameters and no output schema, the description carries the burden of describing return shape, and it does name the kinds, keys, ordering and price snapshot. It stops short of saying whether results are paginated or capped, which matters for a list tool with an unbounded favourite set.
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?
Zero input parameters, so baseline is 4; the schema is empty and the description correctly implies no filtering arguments are accepted. No parameter-level detail is needed or missing.
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?
States a specific verb (list) and resource (the signed-in person's hearted favourites), and enumerates the two record kinds it returns with their identifying keys (product by slug, digital plan by plan id). An agent can tell it apart from save_favorite/remove_favorite and from search_products without opening a schema.
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 closing line names alternatives (search_products / compare_digital) and the condition that selects them: live prices. It lacks explicit exclusions such as when to use list_my_lists instead, so usage context is clear but not fully routable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_listsThe signed-in person's named listsARead-onlyIdempotentInspect
Every named list of the person whose Supabase access token is sent (Authorization: Bearer ; 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=.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, idempotent, non-destructive, closed-world; the description goes well beyond by disclosing the auth model (token type, refusal of agent API keys) and the exact result shape including ordering and the conditional share link ("when the person chose to share it"). That is precisely the kind of context annotations cannot carry.
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 scope and ordering are front-loaded and the sibling disambiguation is compact. The closing "Live prices: GET /api/v1/deals/products?slugs=" is a useful but tangential pointer that slightly dilutes focus and makes the single sentence dense.
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?
There is no output schema, so the description must describe the return — it does so completely: ordering of lists, ordering of nested products, which fields are included, and the conditional share link. An agent can call this and predict the payload without further inspection.
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 coverage is 100% and the single optional locale parameter is fully documented in the schema (BCP 47, defaults to country locale). The description adds nothing about locale, so the baseline 3 applies — the schema does all the work here.
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?
States a specific verb and resource (enumerate every named list of the authenticated person) plus ordering (oldest first) and contents (products, private note, historical total, share link). It explicitly disambiguates from the closest sibling: "The heart's favourites are separate: list_my_favorites."
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?
It names the alternative for the overlapping concept (list_my_favorites) and states a hard usage constraint — a Supabase Bearer token is required and an agent API key is refused. It doesn't spell out a when-to-use trigger phrase or note that create_list/update_list exist for mutation, but the context needed to select it is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_price_watchesThe signed-in person's price watches with today's priceARead-onlyIdempotentInspect
Every price watch of the person whose Supabase access token is sent (Authorization: Bearer ; 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 + shipping, shop, captured_at; recommended: false when no offer passes the trust rules). Next: update_price_watch to pause, resume or change the target, delete_price_watch to cancel.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds substantial context beyond the readOnly/idempotent annotations: the authentication model (bearer token of the signed-in person, agent API keys rejected), the alert semantics (alerts fire only below saved_total), and the meaning of `current` including the `recommended: false` trust-rule outcome. This is exactly the operational detail an agent needs before calling.
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?
Front-loaded with the resource and auth constraint, then the row shape, then next actions — a logical order. It is dense and the field enumeration is long, but nearly every clause carries decision-relevant information rather than filler.
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 no output schema, the description carries the full burden of describing the return shape and does so thoroughly: every row field, the target/saved total relationship, currency/country, timestamps, and today's nested price semantics. Nothing material is missing for correct invocation or interpretation.
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?
There is only one parameter (locale) and its schema description is complete at 100% coverage, so the baseline of 3 applies. The description does not mention the locale parameter at all, adding no meaning beyond the schema.
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?
States a specific resource (price watches) with a specific scope (the person identified by the Authorization bearer token), and the title reinforces that today's price is included. It is immediately distinguishable from set_price_watch, update_price_watch and delete_price_watch.
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 closing sentence explicitly routes the agent to update_price_watch (pause/resume/change target) and delete_price_watch (cancel) as follow-on actions. It also states the negative condition that an agent API key is refused, which prevents a failed call. It stops short of naming set_price_watch as the creation path, but the when-to-use context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_shopsShops the signed-in person looks afterARead-onlyIdempotentInspect
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 , the website holds it after the e-mail sign-in link); an agent API key is refused. Each row: slug, name, domain, country, status, access, the shop's page. Next: get_shop_statistics with a slug.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive, closed-world behavior, and the description adds substantially more: the exact auth mechanism (Bearer Supabase token, agent API key refused), the pending-partner empty-result behavior, and the row shape returned. This is meaningful context an agent cannot get from structured fields.
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?
Front-loaded with purpose, then eligibility, auth, output fields, and next step in a logical order. The eligibility clause is a long, punctuation-heavy run-on that takes effort to parse, but no sentence is padding.
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 no parameters and no output schema, the description carries the full load and does so: it specifies auth, eligibility filtering, absent-result behavior, returned fields, and the natural follow-up tool. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero input parameters, so the baseline is 4; there is nothing schema-level to explain. The description does cover the implicit request-level requirement (Authorization header) that the empty schema cannot express.
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?
States a specific verb+resource (list the shops the signed-in person may read) and precisely defines the two qualifying conditions (approved partner with proven domain, or approved registration contact). It distinguishes scope implicitly from the public catalog tool via 'signed-in person', but never names list_shops as the sibling alternative, so full differentiation is left to inference.
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?
Gives clear context for use (the caller must be a signed-in person with a Supabase token; 'a pending partner sees nothing here' and 'an agent API key is refused' set explicit preconditions). It also points to the follow-up call, get_shop_statistics with a slug. It stops short of an explicit when-not/alternative-vs-list_shops statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_shopsWhich shops are compared, with ratingsARead-onlyIdempotentInspect
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".
| Name | Required | Description | Default |
|---|---|---|---|
| country | No | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds value beyond that by disclosing the payload semantics: ratings on a 0..1 scale, a rating source, a trust label, and a separate group of shops still waiting for their feed. It does not mention pagination or result size, a minor gap.
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?
Two tight sentences with zero filler, front-loading the returned data and then the questions it answers. The opening is a noun phrase rather than a verb phrase, which slightly slows comprehension, but nothing is wasteful.
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?
There is no output schema, so the description must carry return-value disclosure, and it does: it names the rating range, rating source, trust label and the pending-feed shops. Combined with a fully documented optional parameter and complete annotations, an agent has what it needs; only ordering/count behavior is unstated.
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 100% and the single country parameter is fully documented as an optional ISO 3166-1 alpha-2 code normally derived from the address. The description only echoes 'for a delivery country' and adds no format or fallback detail, so the baseline 3 applies.
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 concretely what the tool returns: shops whose prices flow today for a delivery country, their rating (0..1), rating source and trust label, plus shops still awaiting a feed. That is a specific resource with a clear scope. It does not explicitly distinguish itself from near-siblings such as list_my_shops or get_shop_statistics, which keeps it at 4 rather than 5.
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?
It gives concrete question-shaped triggers: 'can I trust shop X' and 'do you compare shop Y'. That is clear usage context. It stops short of exclusions or naming alternatives (e.g., use list_my_shops for your own registered shops), so no 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
price_historyPrice history of a productARead-onlyIdempotentInspect
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_history|stale, percentile, days, basis} rates the latest price against the last 90 days of our own captured daily lows (no judgement under 14 days; never a discount claim); find_best_price carries the same object. Next: find_best_price for the current recommendation.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Window in days. Default 365. | |
| product | Yes | Product slug or id from find_best_price. | |
| currency | No | Currency of the points. Default: the currency of the first offer. | |
| deliver_to_country | No | Country whose shown price is the last point (today). Default: the country of the currency. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive/closed-world, and the description goes well beyond them: it defines what each data point is (daily lowest across compared shops), what the final point means (today's main product-page price), and discloses the exact semantics and constraints of price_verdict (low|usual|high|short_history|stale, 90-day basis, no judgement under 14 days, never a discount claim). That is substantive behavioral context annotations cannot convey.
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?
Front-loaded with the core definition, then progressively adds semantics and the next-step pointer. It is dense but each clause carries information; the parenthetical about today's price and the price_verdict field list are both load-bearing. Slightly dense for a single paragraph.
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 no output schema, the description carries the return-value burden and does so: the daily series, current offers with capture time, and the full price_verdict object shape. An agent knows what it will get back and how to interpret it.
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 coverage is 100%, so the baseline is 3. The description adds genuine meaning beyond the schema: it explains that the last data point is the price the product page shows as its main price, which ties deliver_to_country and currency choices to a concrete visible outcome. It restates the product slug/id origin, which the schema already documents.
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 opens with a precise verb-and-resource statement: daily lowest price series across compared shops plus every current offer with capture time. It separates itself from find_best_price explicitly. It does not, however, distinguish itself from the similarly named sibling tools digital_price_history and energy_price_history, so an agent choosing among the three price-history tools must infer the difference.
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?
"Use it to say whether today's price is a low, and how much it moved" gives a concrete trigger condition, and "Next: find_best_price for the current recommendation" names the follow-on tool. There is no explicit when-not guidance, but the pairing with find_best_price implies the division of labor well.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
product_rowsToday's product rows: deals of the day, trending, seasonal gift tipsARead-onlyIdempotentInspect
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 + interest) × 0.5^(age_days / 14), interest = searches, product-page views and shop clicks of the last 30 days, age = days since the product entered the catalogue; 2+ shops only) and the seasonal rows of the buyer country's calendar (Black Friday, Christmas gifts by budget and for whom, Valentine's, Mother's Day, Father's Day, back to school, summer), e.g. christmas:budget-500 or christmas:for_her. No product stands in two rows, one shop is behind at most 3 cards of a row, a row under 4 products is left out. formulas states every rule; seasons the active windows. date (YYYY-MM-DD) reads the calendar of another day with today's products. Next: get_product with a product slug for the full comparison.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The day the seasonal calendar is read for (default today). | |
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| deliver_to_country | No | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With read-only/idempotent annotations already covering the safety profile, the description still adds substantial behavioral detail: dedup rule (no product in two rows), max 3 cards per shop per row, rows under 4 products dropped, cap of 12 products, and the exact discount and trending formulas including edge cases (missing 30-day history, 2+ shops required).
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?
Front-loaded with what the rows are, followed by row types, invariants, and next step in a logical order. It is dense and its long parenthetical formula clauses make it heavy to parse, but no sentence is filler.
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 no-output-schema, zero-required-param read tool this is close to complete: return shape (up to 12 products per row with `search_products` summary fields), suppression rules, and next step are all stated. It leans on `search_products` to define those shared fields rather than spelling them out, which leaves a small dependency gap.
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 coverage is 100%, so the schema already documents all three parameters. The description still adds real value by clarifying that `date` reads another day's seasonal calendar while products stay today's, and by naming the `formulas`/`seasons` fields that expose the rules; `locale` and `deliver_to_country` are left to the schema.
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?
States a specific verb and resource — the rows shown above the full product list (/produkty) for a buyer country — and enumerates them (`deals`, `trending`, seasonal rows). Named sibling references (`search_products` for field shape, `get_product` as the next step) make it clearly distinguishable from `daily_deals` and `trending_new_products`.
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?
Gives clear context for when the tool applies (homepage rows for a buyer country) and an explicit follow-up route: `get_product` with a slug for full comparison. It does not, however, say when to prefer it over sibling `daily_deals` or `trending_new_products`, which cover overlapping signals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
product_variantsOther capacities, colours and sizes of a productARead-onlyIdempotentInspect
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 asked for, then get_product with that id. A product without siblings answers itself only. Mirrors GET /api/v1/deals/products/{slug}/variants.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| product | Yes | Product slug (the stable product id). | |
| deliver_to_country | No | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real behavior: `current` marks the requested variant and is always listed, `family_id` names the group, `axes` explains differentiation, and prices reflect `deliver_to_country`. It also discloses the upstream endpoint it mirrors, aiding predictability.
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?
Front-loaded with the resource, then the returned fields, then the usage instruction and the endpoint mirror. Dense but every clause carries information; the long field enumeration makes it slightly hard to scan in one pass.
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 no output schema, the description takes on documenting return fields and does so thoroughly, plus tells the agent the next call. Enough to use it correctly, though a note on ordering or pagination is absent.
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 coverage is 100% so the baseline is 3, but the description adds meaning: `product` is confirmed to be the product slug / stable id, and `deliver_to_country` is tied to the 'lowest total' figure returned. Only `locale` is left unaddressed.
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?
Names the resource precisely (variants of one product) and enumerates what each variant carries, so an agent knows exactly what comes back. It routes to get_product by id, distinguishing it from that sibling, though it never contrasts with search_products or product_rows.
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?
'Use it to switch from a card to the exact variant the buyer asked for, then get_product with that id' gives an explicit trigger and follow-up call. The edge case 'A product without siblings answers itself only' sets expectations, but no when-not-to-use condition is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_shopRegister a shop for the comparisonAInspect
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 refused: 422 upload_zip_unsupported, 413 upload_too_large) and only its sha-256 and size are kept. Either way the feed is diagnosed (P04) and the 202 answer carries feed.health ok | warn | fail with the top three issues; the full report is stored on the request, feed_source says url or upload. One open request per domain: a second call updates it and answers the same id with duplicate: true; a declined domain may register again. The contact gets the shop_registration_received mail (its language: locale, else the country's default) with the confirmation link and the status page; the operator gets one notice. verification.ownership carries the token for the meta tag or file proof (verify_shop_domain). A shop on the ČOI / SOI risk list is refused (403). A registration never lists a shop by itself: the operator decides. A shop registered with a file only is listed as still being added until it sends a feed address. Follow it with get_shop_registration. Six calls a minute per caller.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | ||
| Yes | Contact e-mail of the shop; it receives the confirmation link and the decision. Never shown. | ||
| domain | Yes | The shop's domain or URL, e.g. www.obchod.cz. | |
| locale | No | Language of the mails (cs, sk, en, …); the country's default language when absent. | |
| country | Yes | Delivery country of the shop, ISO 3166-1 alpha-2 from GET /api/v1/deals/countries. | |
| website | No | Leave empty (spam trap: a filled value is discarded quietly). | |
| feed_url | 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. | |
| affiliate | 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". | |
| shop_name | Yes | The shop's name as it should appear in the comparison. | |
| feed_base64 | No | The feed file's bytes as base64, for a gzip-packed file (.xml.gz, .csv.gz). ZIP is refused: unpack it first. | |
| accept_terms | Yes | true = the contact accepts the partner terms of the given version. | |
| feed_content | 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_filename | No | The uploaded file's name, kept with its fingerprint. | |
| terms_version | Yes | The partner terms version being accepted; today 2026-10-09 (the terms are at /partner/smlouva). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the annotations: states the SSRF guard on feed_url (public hosts only, 422 url_rejected, 12 s cap), the upload rules (8 MB max, gzip allowed, ZIP refused with 422 upload_zip_unsupported, 413 upload_too_large), that only sha-256 and size are retained, the 202 response shape (feed.health ok|warn|fail, feed_source, verification.ownership), the e-mails sent, the 403 risk-list refusal, and 6 calls/minute throttling. The mutating, non-idempotent, open-world annotation profile is fully consistent with this narrative.
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?
Front-loaded with the action and the required inputs, and nearly every clause carries operational payload (error codes, limits, duplicate handling, follow-up tool). It is a single dense paragraph of long semicolon-linked sentences, which makes it slower to scan than it needs to be for a 14-parameter tool.
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 14-parameter mutation with no output schema, the description covers the write path, validation failures, side effects (mail, operator notice, diagnostics), what the 202 contains, and the follow-up call. Nothing an agent needs in order to invoke it correctly is missing.
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 coverage is 93%, so the schema already carries most semantics; the description adds the important relational fact that the feed is supplied either as feed_url or as a file (feed_content/feed_base64) and that a file-only shop is listed as still being added until a feed address arrives. It otherwise enumerates parameter groups already documented in the schema and does not explain note, website, or feed_filename beyond what the schema says.
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?
Opens with a specific verb and resource ('One call registers a shop (P01)') and immediately enumerates the business objects involved (domain, delivery country, feed, commission, terms version). An agent can distinguish it from get_shop_registration, list_my_shops, and verify_shop_domain without opening any schema.
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?
Gives clear conditions: one open request per domain (a second call updates and returns duplicate: true), a declined domain may re-register, risk-listed shops are refused with 403, and registration never lists a shop by itself. It also routes forward ('Follow it with get_shop_registration', 'verify_shop_domain' for the ownership token). It does not explicitly contrast against siblings an agent might reach for first (e.g. check_shop_feed, list_my_shops), so it stops short of a full when/when-not/alternatives map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_favoriteRemove a favouriteADestructiveIdempotentInspect
Removes a product or a digital plan from the signed-in person's favourites. removed: false when it was not there.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| kind | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is largely covered. The description adds useful behavior beyond that: removal is scoped to the signed-in person's favourites and returns `removed: false` when the item was not present.
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?
Two short sentences, front-loaded with the action and target, followed by a compact return-value note. There is no redundant or padded content.
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 mutation tool with rich annotations and no output schema, the description covers the action, target resource, signed-in context, and one important return behavior. The main gap is parameter-level detail, which is partly mitigated by the schema's types, enum, and constraints.
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 needs to compensate. It only loosely maps to `kind` by saying a product or digital plan can be removed, and says nothing about the `id` parameter or the enum and length constraints already visible in the schema.
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?
States a specific verb and resource: removes a product or digital plan from the signed-in person's favourites. This clearly separates it from list-oriented siblings such as remove_from_list, though it does not explicitly name an alternative.
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?
Usage is implied by the purpose: use it to remove an item from favourites. However, there is no explicit when-to-use guidance, exclusion, prerequisite, or direct comparison to siblings like remove_from_list or save_favorite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_from_listRemove a product from a named listADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| list_id | Yes | The list's id from list_my_lists. | |
| product_slug | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry destructiveHint=true, idempotentHint=true, and readOnlyHint=false. The description adds genuine value beyond them: the return signal when the item is absent ('removed: false') and the cross-user outcome ('not_found'), both of which an agent needs to handle results correctly.
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?
Two compact clauses, with the ownership scope leading and the two outcome codes following. Nothing is repeated from the title or schema, and no sentence is wasted.
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 three-parameter mutation, the definition covers scope, the resulting codes, and the permission boundary. It does not state authentication prerequisites explicitly or whether removal is reversible, but nothing critical for correct invocation is missing.
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 67%; list_id is documented as coming from list_my_lists and locale is documented inline. The description adds nothing about product_slug, the one undocumented parameter, so baseline 3 is appropriate.
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?
States a specific verb and resource ('Removes a product from one of the signed-in person's lists'), which distinguishes it from add_to_list and from delete_list/remove_favorite. It never names a sibling explicitly, so the differentiation is inferential rather than stated.
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?
Usage is implied by the ownership scoping ('signed-in person's lists'), but there is no explicit guidance on when to use this versus add_to_list's inverse, remove_favorite, or delete_list when a whole list should go. An agent must infer the boundary from names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_illegal_contentReport illegal content (DSA Art. 16)AIdempotentInspect
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's name and email, and good_faith: true confirming the notice is accurate and complete to the best of the notifier's knowledge. A person reviews every notice; the e-mail gets a confirmation of receipt at once and the decision later. For a wrong price or variant use report_issue instead. Public, no key; the anonymous rate limit applies.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The notifier's name (Art. 16(2)(c)). | |
| Yes | The notifier's e-mail: the confirmation of receipt and the decision go there. | ||
| locale | No | Language of the confirmation. | |
| ip_hash | No | sha-256 of the notifier's address with a daily salt (the website computes it); counts the per-visitor limit. | |
| website | No | Leave empty (spam trap). | |
| page_url | No | The exact page of the content (Art. 16(2)(b)). | |
| good_faith | Yes | Confirms the bona fide belief that the information is accurate and complete (Art. 16(2)(d)). | |
| explanation | Yes | Why the content is illegal (Art. 16(2)(a)). | |
| content_kind | Yes | What content the notice is about. | |
| product_slug | No | Product slug when the content is on a product page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the post-submission lifecycle: a human reviews every notice, an immediate confirmation of receipt is emailed, and the decision follows later. Combined with the auth model (public, no key, rate-limited) and the required good-faith attestation, an agent has a clear picture of consequences that annotations alone do not convey.
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?
Front-loads the purpose, then the parameter contract, then the workflow and the sibling alternative — a sensible order with no filler. The middle parameter enumeration is dense, but every clause maps to a real requirement.
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 10 parameters, no output schema, and a legal-submission workflow, the description supplies the field contract, the reviewer/confirmation flow, and the alternative tool. The only gap is that the anti-spam and locale fields are left to the schema, which is reasonable for a description of this length.
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 coverage is 100%, so baseline is 3, but the description adds genuine semantics: it states the conditional relationship ('product_slug when it is on a product page'), the 20–4000 character explanation bound, and the meaning of good_faith as an attestation. It does not cover the website-only fields (locale, ip_hash, website), which is acceptable since the site computes them.
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?
Names the specific legal instrument and action: a DSA Article 16 notice that content on fordeal.ai is illegal, enumerating the covered content kinds (review, product info, offer, image, other). It is clearly distinguishable from report_issue, which is named for the adjacent but different case of wrong price/variant.
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?
Explicitly routes the wrong-case to a named sibling: 'For a wrong price or variant use report_issue instead.' It also states the access conditions (public, no key, anonymous rate limit applies), so an agent knows both when to pick this tool and what to expect operationally.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
report_issueReport a wrong price, variant or shopAIdempotentInspect
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 message saying what you saw (at most 1000 characters). An optional email gets the founder's answer; it is never shown. Every report goes to a queue a person reads; the same report sent twice within a day answers the first id with duplicate true. Public, no key; the anonymous rate limit applies.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | What is wrong: the price, the variant or product, the category the product is filed under, the shop or link, or something else. | |
| No | Where the answer goes. Optional, never shown. | ||
| locale | No | Language of the answer. | |
| ip_hash | 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. | |
| message | Yes | What you saw, e.g. the price on the shop's page and when. | |
| website | No | Leave empty (spam trap). | |
| offer_id | No | The offer the report is about (offer_id in the card). | |
| page_url | No | The page the report was made on. | |
| shop_slug | No | The shop's slug, when known. | |
| product_slug | Yes | Product slug (the stable product id). | |
| user_agent_hash | No | sha-256 of the reporter's user agent (the website computes it); only for spotting floods. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses that reports land in a human-read queue, that the email is never shown but receives the founder's answer, that the endpoint is public with no key but subject to the anonymous rate limit, and it gives concrete semantics for idempotency ('the same report sent twice within a day answers the first id with duplicate true'). That last point turns the abstract idempotentHint into observable 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?
Front-loads the triggering condition before the parameter walkthrough, and every clause carries information. It is a single dense paragraph with stacked parentheticals, though, which makes the required-vs-optional split harder to scan than a short bulleted structure would.
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 an 11-parameter mutation with no output schema, the description covers the essentials an agent cannot get elsewhere: no auth required, the rate limit, the human-queue consequence, and the duplicate-response shape. The undocumented remaining parameters are all explained in the schema itself.
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 coverage is 100%, so the baseline is 3, but the description adds genuine value: it tells the agent where `product_slug` comes from (find_best_price or search_products), that `offer_id` comes from the card's offers and is optional, and restates the 1000-character `message` limit alongside guidance on what to say. It leaves `locale`, `page_url`, `shop_slug`, `ip_hash`, and the `website` spam trap to the schema, which is acceptable.
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?
States a specific verb and resource ('file a report' about a wrong offer on a product page) and immediately bounds the scope with the enumerated `kind` values price | variant | category | shop | other. An agent can tell this is the complaint-filing tool, not a data-read tool, without opening the schema.
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?
Gives a rich set of triggering conditions ('the shop's page shows another price, the offer is another variant or product, the link leads to the wrong shop or page'), which is far more than most tools offer. It does not, however, route the agent away from the similar sibling `report_illegal_content`, leaving the boundary between 'wrong' and 'illegal' for the agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_comparisonSave a comparison of digital plansAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| items | Yes | ||
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-readonly, non-idempotent, non-destructive write with closed-world behavior. The description adds meaningful behavioral context beyond that: the saved comparison is private to the signed-in account and cannot be opened by others until share_comparison creates a link.
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 two tight sentences with no wasted wording. The core action and privacy constraint are front-loaded, followed by the important sharing condition.
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 private save operation, the description covers the essential behavior, source of plan ids, count limits, and the share_comparison relationship, while annotations cover mutation safety. It is not fully complete because optional parameters such as name and locale are not explained, and no return behavior is described, though there is no output schema to document.
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 low at 33%, so the description should compensate, but it only reinforces the items parameter by saying 2 to 4 plans and naming the source tools. It says nothing about the optional name parameter or locale behavior, leaving those to sparse or missing schema documentation.
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 gives a specific verb and resource: saving 2 to 4 digital plans as a private comparison in the signed-in person's account. It also names the sibling tools that supply plan ids (compare_digital / compare_mobile) and the downstream sharing tool (share_comparison), so an agent can distinguish it from related comparison and sharing tools.
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?
Usage is clearly implied: use this after obtaining plan ids from compare_digital or compare_mobile, and use share_comparison later to create a link. The description does not state explicit exclusions or contrast with alternatives like list_my_comparisons, so it is strong context but not complete when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_favoriteSave a product or a digital plan to favouritesAIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| kind | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-read-only, non-destructive, idempotent operation. The description adds that it applies to the signed-in person, which is useful auth context, and confirms idempotency by saying saving twice changes nothing; it does not describe error behavior, but the annotation coverage lowers the burden.
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 two compact sentences with no wasted text, and the core action plus parameter semantics are front-loaded. It is appropriately sized for a two-parameter mutation tool.
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 two-parameter save operation with rich annotations and no output schema, the description contains what an agent needs: supported kinds, id source per kind, signed-in scope, and idempotency. No important calling detail is missing.
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 carry parameter meaning. It does so well: kind selects between product and digital, product id is a slug, and digital id is a plan id from compare_digital or compare_mobile.
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 and resource: adding a product or digital plan to the signed-in person's favourites. It clearly distinguishes the two supported kinds and maps each to the correct id meaning, so an agent can tell exactly 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?
It gives useful context for when to use it by explaining that digital plan ids come from compare_digital or compare_mobile, and product ids are slugs. It does not explicitly name when-not-to-use cases or contrast with siblings such as add_to_list or remove_favorite, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_productsSearch and filter compared productsARead-onlyIdempotentInspect
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 14 digits are an EAN, matched exactly) and/or category (a slug from GET /api/v1/deals/categories, e.g. letni-pneumatiky, mobilni-telefony), or neither to browse the whole catalogue (the website's /produkty page), or slugs (product slugs) to compare named products side by side; then any filters: price_min/price_max, brand, shops, shop_country (e.g. DE for offers from Germany), in_stock, on_sale, free_shipping, min_shop_rating, min_product_rating, attr (key:value pairs); sort price (lowest product price first, the default), price_desc, total (lowest total with shipping, opt-in; or include_shipping=true), total_desc, discount, shops, popular, rating, score, name. Answers at most limit products (default 20) from offset; total_matches counts every match, and facets: true adds the brands, shops, price range and attribute values with counts over the whole filtered list. Next: find_best_price with a product name for the full card with every offer, or price_history with slug.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Short name of `query` (the same search; `query` wins when both are given). | |
| attr | No | Attribute filter as `key:value` pairs (comma-separated in a query string, or repeated). The same key twice means any of its values; different keys must all match. Keys and values are those of `facets.attributes` (stored attributes plus storage_gb, ram_gb, diagonal and tyre_size read from the name), e.g. attr=storage_gb:256 GB,storage_gb:512 GB,ram_gb:8 GB. | |
| sort | No | relevance = best match first (the default with `query`; the answer card names the first row), price = lowest product price first (the default without `query`; shipping is shown per product, not counted), price_desc = most expensive product price, total = lowest total with shipping first (opt-in, the same as include_shipping=true), total_desc = highest total with shipping, discount = biggest discount, shops = most shops, popular = most searched and clicked, rating = best rated product (shops' and forDeal reviews, fewer reviews count less), score = forDeal score 0–100 (popularity, shops, price vs. 30 days, shop rating, product rating; each product carries `score.parts`), goods = older name of price, name = alphabetical. | |
| brand | No | Brand or brands (comma-separated in a query string). | |
| limit | No | ||
| query | 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). | |
| shops | No | Shop slugs (e.g. datart-cz); a product passes when one of them prices it. | |
| 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. | |
| facets | 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 attribute values with counts. Each facet is counted over the products that pass every other filter, so the counts say what picking that value would give. With `facets` (or `attr`) every product's `attributes` also carries the derived keys (storage_gb, ram_gb, diagonal, tyre_size). `facets.categories` counts the leaf categories of the filtered list, `facets.price_p99` is the total 99 % of products stay under (a slider's upper end), `facets.price_p05` the total 95 % of products are at or above (a robust lower end; one wrong 0 price does not move it). | |
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| offset | 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. | |
| on_sale | No | Only products with a shop discount or a measured drop. | |
| category | No | Category slug (leaf, main category or group). | |
| in_stock | No | Only products whose shown offer is in stock. | |
| price_max | No | Highest product price in the deliver-to currency (shipping not counted). | |
| price_min | No | Lowest product price in the deliver-to currency (the shown offer's goods price, shipping not counted). | |
| shop_country | No | Country codes of the shops (e.g. DE to see offers from Germany). | |
| free_shipping | No | Only products with free delivery at the shown offer. | |
| min_shop_rating | No | Lowest rating of the shown shop, 0..1 (0.9 = 90 % / 4.5 stars). | |
| facet_attributes | No | false = facets without `attributes` (the whole catalogue without a category has about 1 800 attribute keys; the website's /produkty asks without them). | |
| include_shipping | No | Order by the total with shipping to `deliver_to_country` instead of the product price (sort=total). Default false. | |
| deliver_to_country | No | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. | |
| min_product_rating | No | Lowest rating of the product itself, 0..1: the shops' own customer reviews and forDeal reviews (0.9 = 90 %). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations it discloses substantive behavior: default `limit` 20, offset paging, that `total_matches` counts all matches, that `facets` is computed over the whole filtered list rather than the page, that prices are expressed in `deliver_to_country` currency with capture time, and that `price_status` may be verified, estimate or incomplete. Minor internal inconsistency: the prose says `total_matches` while the schema says `total` in the answer, which could confuse pagination logic. No annotation contradiction.
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 information density is high and little is truly redundant, but it is delivered as a single monstrous run-on paragraph with deeply nested parentheses that makes it hard to scan. It also front-loads return-field semantics (`lowest_goods`, `lowest_shipping`, `lowest_total`) before the agent has been told what the tool is for. A bulleted split of purpose / inputs / filters / paging / next steps would cost no words and be far more usable.
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 23 optional parameters and no output schema, the description covers the important ground: what each result row carries, currency and shipping semantics, paging, facet scoping and defaults. It is missing guidance on the large param set that is neither mentioned nor critical (q, locale, facet_attributes) and says nothing about result size or cost. Given the absent output schema, it does a reasonable job of telling the agent what comes back.
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 coverage is 96%, so the baseline is 3, and the description does add value on top: it names the source of `category` slugs (GET /api/v1/deals/categories) with examples, explains the EAN interpretation of 8-14-digit input, clarifies that `total` is opt-in or reachable via include_shipping=true, and spells out the sort order meanings. It omits a few params entirely (q, locale, facet_attributes) and mostly restates the rest, so it is not a full substitute for reading the schema.
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?
It makes clear this is the product search/browse grid with filtering, and that `slugs` turns it into a side-by-side comparison, so the verb+resource is identifiable. It also routes to find_best_price and price_history, but never distinguishes itself from other product siblings such as get_product, product_rows or product_variants. The opening noun-phrase frame ('The website's category and search grid for an agent') is unusual and buries the action behind a long parenthetical about price fields.
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 explicitly gives the three entry modes (query, category, or neither to browse the whole catalogue) plus slugs for named comparison, and states the follow-up path ('Next: find_best_price ... or price_history with slug'). That is real routing guidance rather than implication. It stops short of exclusions, though — there is no statement of when NOT to use it and no mention of the sibling tools that also return product data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_contact_messageWrite a message to Fordeal (the contact form)AIdempotentInspect
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 one day answers the same id with duplicate: true. A shop that wants to be compared uses register_shop; a partner, the media or a creator may use send_cooperation_inquiry for a structured request. Public, no key; five messages a minute per caller.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Who writes (a name or how to address the person). | |
| Yes | Where the answer goes; never shown, never mailed by the form itself. | ||
| topic | 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 about personal data (GDPR: access, erasure, objection). | |
| locale | No | Language of the page the person wrote from (cs, sk, en, …). | |
| ip_hash | No | sha-256 of the sender's address with a daily salt (the website computes it); counts the per-visitor limit. Never stored. | |
| message | Yes | The message itself, 10 to 4 000 characters. | |
| nickname | No | Leave empty (spam trap: a filled value is discarded quietly). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, destructive=false, idempotent=true, openWorld=false; the description goes well beyond that by disclosing that the message lands as a single notice to hello@fordeal.ai with the sender as Reply-To, that no automatic e-mail is sent back, that a repeat on the same day returns the same id with duplicate: true (consistent with idempotentHint), and the 5-per-minute rate limit with no key required.
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?
Front-loaded with the purpose, then throttling and duplicate semantics, then alternatives — a logical order with no filler. It is dense to the point of being crammed into semicolon-chained clauses, which costs a little 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?
There is no output schema, and the description covers the return shape (an id, or duplicate: true) plus delivery and rate-limit behavior, so nothing an agent needs to invoke and interpret the call is missing.
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 coverage is 100%, so every parameter including locale, ip_hash and the nickname honeypot is already documented in the schema. The description reinforces the email/answer-path semantics and the message length bounds, but adds no format or syntax detail beyond the structured fields — baseline 3 applies.
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?
States a concrete verb and resource ('The /kontakt form without the website') and immediately enumerates what it submits. It also names the sibling tools it is not (register_shop, send_cooperation_inquiry), so an agent can discriminate it without opening a schema.
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?
Explicit routing conditions: a shop wanting comparison goes to register_shop; partners/media/creators may use send_cooperation_inquiry for a structured request; everything else falls here. The topic enum in the schema further partitions general/support/privacy, complementing rather than repeating the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_cooperation_inquiryWrite to Fordeal about cooperation (partners, media, creators)AIdempotentInspect
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 YYYY-MM-DD and links) or creator (name or channel, website = the main channel, topic = the content's topic and audience, message = the idea, optional links: other channels, media kit). A shop that wants to be compared uses register_shop instead. A person reads every message; the sender gets a confirmation of receipt (not an approval) and the operator one notice. The same message twice within a day answers the first id with duplicate true. Public, no key; five messages a minute per caller. 503 not_available until migration 0065 is applied.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | Who writes: partner | media | creator. | |
| name | Yes | The contact person (partner, media) or the name of the channel (creator). | |
| Yes | Where the confirmation and the answer go; never shown. | ||
| links | No | Documentation, a feed, the article, other channels or a media kit (links as text). | |
| topic | No | The creator's topic and audience (required for a creator). | |
| locale | No | Language of the confirmation (cs, sk, en; others get English). | |
| ip_hash | 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. | |
| markets | No | Markets the offer is about, ISO codes (partner, required): an array or a comma-separated string. | |
| message | Yes | The offer and its terms (partner), the topic or the information needed (media), the idea (creator). | |
| website | No | The partner's website or the creator's main channel (required for both). | |
| deadline | No | The day the media need an answer by (YYYY-MM-DD). | |
| nickname | No | Leave empty (spam trap: a filled value is discarded quietly). | |
| organization | No | The company or network (partner, required), the newsroom or medium (media, required). | |
| cooperation_type | No | What a partner offers (required for a partner). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations: a human reads every message, the sender gets a receipt rather than an approval, the operator gets a notice, a repeat within a day returns the first id with duplicate=true, and there is a five-per-minute per-caller limit. It also discloses public/no-key access and a 503 not_available state pending migration 0065, which is exactly the operational context annotations cannot express. Nothing contradicts readOnlyHint=false or idempotentHint=true.
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?
All content is substantive, but it is delivered as one dense run-on paragraph starting with an opaque internal reference (docs/texty/formulare.md 2–4) that means nothing to an agent. The most decision-relevant facts (register_shop alternative, duplicate behavior, rate limit) are buried mid-block rather than front-loaded.
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 14-parameter, three-variant submission tool with no output schema, the description covers what happens after the call (confirmation email, human review, duplicate response), access requirements, rate limits and a known service-unavailable state. An agent has everything needed to call it and set expectations for the caller.
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 100%, and the schema already marks conditional requirements per kind (e.g. 'required for a partner'), so the description's per-kind field breakdown largely restates structured data. It adds some synthesis by grouping fields into the three submission shapes, but gives no new format or validation detail beyond what the schema carries.
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?
States a specific action (sending a cooperation inquiry to Fordeal) and enumerates the three addressee types it covers (partner, media, creator). It explicitly carves itself out from register_shop, so an agent can separate it from the shop-registration path without opening a schema.
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?
Gives an explicit exclusion with the alternative named: 'A shop that wants to be compared uses register_shop instead.' It also defines the selecting condition for each kind. It does not mention send_contact_message, the nearest sibling for general messages, leaving that boundary to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_price_watchWatch the total price of a productADestructiveIdempotentInspect
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's step, e.g. 50 CZK). Today's total is stored as saved_total. Needs the person's access token. Answers the watch as list_my_price_watches shows it.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | Language of the alert mails. Default: the person's, then the country's. | |
| product_slug | Yes | The product's slug (search_products, find_best_price). | |
| target_total | 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 | No | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses the notification contract ('never twice for one price and at most once a day'), the one-watch-per-product cap, the auth requirement, and that today's total is persisted as saved_total — none of which is in readOnlyHint/destructiveHint/idempotentHint. It does not explain what the destructiveHint=true reset actually discards (e.g. whether an existing target is overwritten), which is the one behavioral gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first clause and each subsequent sentence carries distinct information (trigger rules, default behavior, auth, return shape). The telegraphic phrasing ('Fordeal mails the person', 'same meaning as on the website') is efficient but slightly dense; no sentence is pure filler.
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 no output schema, the description compensates by stating that it 'Answers the watch as list_my_price_watches shows it', and it covers auth, idempotent reset semantics, and notification frequency. Only the destructive-reset consequences (what an existing watch loses) are left implicit.
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 coverage is already 100%, so the baseline is 3. The description does add real meaning for target_total — the default of today's total and the currency-step rule ('by the currency's step, e.g. 50 CZK') — and explains deliver_to_country's 'goods + shipping, same meaning as on the website'. That is marginal added value on top of a fully documented schema.
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?
States a specific verb and resource — 'Creates (or resets) the signed-in person's watch of one product (one per product)' — so the agent knows exactly what is created and the uniqueness constraint. It even points at list_my_price_watches for the resulting shape. It does not, however, distinguish itself from the sibling update_price_watch, leaving the set-vs-update split to inference.
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 implies usage (create an alert for one product, mail fires on the drop) and states a prerequisite, 'Needs the person's access token.' But it never says when to choose set_price_watch over update_price_watch, delete_price_watch, or list_my_price_watches, and gives no explicit exclusion or when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trending_new_productsThe most searched new products today (the home page's first row)ARead-onlyIdempotentInspect
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 among the line's generations, days since the family entered the catalogue, decayed interest, Search Console weight, shops that started to list it, variants). A product qualifies when its model number is the newest or the one before in its line (iPhone 18 against iPhone 17), or its model family entered the catalogue in the last 75 days, and someone searched for it, clicked to a shop, found it on Google or a shop started to list it; the score adds model generation 40, newness 10, searches (halved every 7 days over 28 days) and human clicks 25 × log2(1 + n), Search Console 15 × log2(1 + n), new shops 12 × log2(1 + n). Colours and capacities are one card (the cheapest variant); at most 4 cards per category, 3 per brand and 3 per shop. Only products with two or more shops, a rated shop with known shipping and a price in stock; a shop on the ČOI/SOI risk list is never shown. Recomputed by the worker each night; generated_at says when, null before the first run. Next: get_product with a product slug for the full comparison.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Cards to return, at most 12 (default 12). | |
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| deliver_to_country | No | ISO 3166-1 alpha-2 country code, e.g. "CZ". Optional: normally derived from the address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, non-destructive, idempotent and closed-world, and the description goes far beyond them: nightly worker recomputation, `generated_at` null before the first run, qualification rules (newest or one-before model number, or family entering the catalogue in 75 days, plus a signal), scoring weights and decay, de-duplication caps (colours/capacities as one card, 4 per category, 3 per brand/shop), shop quality gates, and the ČOI/SOI risk-list exclusion. That is exactly the behavioral context annotations cannot convey.
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 key information (what it is, up to 12, card shape, qualification and next step) is front-loaded, but the middle is a dense run-on that recites the full scoring formula (40 / 10 / 25 / 15 / 12 weights and log2 terms) which duplicates what the `score`/`parts` fields already expose. Those sentences do not help an agent decide or invoke, so the piece is longer than its job requires.
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?
There is no output schema, and the description carries the return-shape burden fully: the search_products-style summary fields plus `trending` with `score`, `parts` points and `raw` diagnostics, along with `generated_at`. For a zero-required-parameter list tool it tells the agent everything needed to call it and interpret the result.
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 100%, so the schema already documents `limit`, `locale` and `deliver_to_country`. The description only echoes the 12-card ceiling that `limit`'s maximum already encodes and says nothing about locale or country derivation, so it adds no meaning beyond structured data.
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?
States a specific resource and scope: the products shown in the home page's first row, found by data rather than a curated model-name list, up to 12 cards. It names the sibling it resembles ('a summary like search_products') and the follow-up ('get_product with a product slug'), so an agent can place it among product_rows, daily_deals and search_products without opening a schema.
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?
Gives a clear next step ('Next: get_product with a product slug for the full comparison') and a contrast against model-name-driven listings. It does not explicitly say when NOT to use it versus daily_deals or product_rows, but the framing (non-personalized, trending-only, home-page row) makes the context unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_listRename, share or stop sharing a named listADestructiveInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | The list's name, e.g. Narozeniny (1 to 80 characters). | |
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| shared | No | ||
| list_id | Yes | The list's id from list_my_lists. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say destructiveHint=true and idempotentHint=false; the description goes well beyond by explaining that sharing mints a new random token and invalidates the previous link, and that the public view exposes name and products at today's prices but never owner, notes or saved prices. It also documents the not_found error for a foreign id, which no annotation conveys.
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?
Three compact clauses, each mapping to a distinct behavior (rename, share/unshare with token rotation, public-view scope, error case). The most consequential detail, link invalidation, is stated inline with the action that causes it.
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 4-param mutation tool with no output schema, it covers side effects, visibility of shared data and the not_found case, which is what an agent most needs. The only gap is the effect of `locale` on the response.
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 coverage is 75%, and the one undescribed property, the bare `shared` boolean, is fully explained in the description including both true and false semantics. `name` and `list_id` are already covered by the schema; only `locale` is left entirely undocumented.
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?
States a specific verb and resource ('Changes one of the signed-in person's lists') and then enumerates the two mutation modes, name and shared. It is trivially distinguishable from delete_list, create_list and add_to_list without opening a schema.
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 makes clear this is the tool for renaming and for turning sharing on/off, and the 'shared: false removes the link' phrasing tells the agent this is the unshare path rather than a separate tool. It does not explicitly name an alternative or exclusion, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_price_watchPause, resume or change the target of a price watchADestructiveIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| locale | No | BCP 47 locale for human-readable strings, e.g. "en", "cs", "sk". Defaults to the country's default locale. | |
| paused | No | ||
| watch_id | Yes | The watch's id from list_my_price_watches. | |
| target_total | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds behavior the annotations cannot: that `paused: true` suppresses mail until set back to false, that `target_total: null` means any real drop under the saved total, and that cross-account ids yield not_found. It does not say what the response contains or whether omitted fields are left untouched.
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?
A single dense sentence that leads with the operation, then attaches per-parameter semantics, then the ownership/error caveat. Every clause carries information; the semicolon chaining is compact but readable, with no filler.
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 no output schema, the description covers the important unknowns for a destructive, idempotent mutation: what each modifiable field does, the null sentinel, and ownership scoping. It stops short of stating that only supplied fields are changed (partial-update semantics) and says nothing about the returned watch state.
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 coverage is 50%: locale and watch_id are documented in the schema, while paused and target_total are bare. The description compensates precisely for that gap by defining the effect of `paused: true/false` and the meaning of a null `target_total`, which the schema's anyOf type does not convey. Only `locale` remains unaddressed, and it is already covered by the schema.
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?
States a concrete verb and resource — 'Changes one of the signed-in person's watches' — and the two named fields make it clearly a mutation of an existing watch. Siblings like set_price_watch, delete_price_watch, and list_my_price_watches are not named explicitly, so differentiation relies on inference from the field semantics rather than a direct contrast.
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?
'Only the token's own watches; another id answers not_found' gives a useful ownership constraint and the failure mode for a wrong id. However, there is no explicit guidance on when to call this versus set_price_watch (create) or delete_price_watch (remove), leaving the agent to infer the boundary from the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_shop_domainProve a shop's domain with a meta tag or a fileAIdempotentInspect
After register_shop: publish 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), or error.code not_found (no request with this domain and token) | not_verified (neither place carries the token; a CDN cache may take minutes). Proving the domain marks the request as confirmed, like the e-mail link; the operator still decides. Public.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | The token from verification.ownership of the registration answer. | |
| domain | Yes | The shop's domain as registered. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses outbound requests to both www and bare host with an identified bot, the possible ok/error responses, CDN caching delay, and that verification marks the request as confirmed but leaves the final decision to the operator. This is rich behavioral context with no contradiction.
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 dense but front-loaded with the required action and call instruction. It includes necessary response and error details, though the long sentence structure could be split for easier scanning.
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 an open-world verification tool with no output schema, the description covers setup, request behavior, success and error meanings, caching caveats, side effects, and visibility. An agent has enough information to invoke it correctly.
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 100%, so both parameters are already documented. The description reinforces that the domain should be the registered domain and the token comes from verification.ownership, but adds little beyond the schema.
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 and resource: verify a shop domain after register_shop by publishing a meta tag or file token, then calling this tool. It clearly differentiates the tool from registration and explains its verification role.
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?
It explicitly says to use this after register_shop, gives both acceptable verification methods, and explains the required domain/token inputs. It also distinguishes the meta and file paths and describes error outcomes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watch_energy_fixationWatch the end of a fixed energy price (e-mail before it ends)AInspect
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 clicks it (an agent cannot confirm for the person). A confirmed watch gets one e-mail 45 days before the end with the offers cheaper for its need (from the official price lists; an estimate). Every mail has a cancel link. Unconfirmed watches are deleted after 7 days, every watch 30 days after its end date. No account, no contract, no commission. At most 5 watches per e-mail. Ask the person for consent before passing their e-mail.
| Name | Required | Description | Default |
|---|---|---|---|
| mwh | No | Yearly consumption MWh (high tariff or all). | |
| rate | No | Electricity rate, default D02d. | |
| Yes | The person's e-mail (they confirm it themselves). | ||
| locale | No | Language of the e-mails: cs | sk | en. | |
| nt_mwh | No | ||
| country | No | CZ (default) | |
| ip_hash | No | sha-256 of the visitor's address with a daily salt (the website computes it). | |
| website | No | Leave empty (spam trap). | |
| commodity | Yes | ||
| distributor | No | cez-distribuce | egd | pre-distribuce | gasnet | gas-distribution | ppd: without it the alert is a reminder without prices. | |
| supplier_id | No | ||
| fixation_end | Yes | Last day of the fixed price, YYYY-MM-DD. | |
| current_offer_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses the full lifecycle: double opt-in with nothing sent before the click, one mail 45 days before the end, a cancel link in every mail, unconfirmed watches deleted after 7 days, all watches deleted 30 days after the end date, and no account/contract/commission. That is exactly the context annotations cannot carry, plus an auth-like constraint ('an agent cannot confirm for the person').
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?
Purpose is front-loaded and every sentence carries a behavioral fact (opt-in, timing, retention, rate limit, consent). It is a dense single block of parentheticals, though, so an agent must parse mid-sentence clauses to extract the constraints.
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 13-parameter, no-output-schema creation tool, the description covers consent, retention, limits and downstream behavior well. The notable gap is what a successful call returns (a pending/unconfirmed state), which matters because there is no output schema to fall back on.
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 coverage is 69%, and the description adds real meaning on top: the valid window for fixation_end, the commodity choice, that distributor determines whether prices appear ('without it the alert is a reminder without prices'), and where supplier_id and current_offer_id come from. It leaves mwh, nt_mwh, rate, locale and ip_hash entirely to the schema, so it is strong but not exhaustive.
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 first sentence names a specific verb and resource ('watch the end of a fixed electricity or gas price'), states the required inputs and the YYYY-MM-DD range ('today to 5 years ahead'), and makes clear this is an e-mail reminder service rather than a product price watch. An agent can separate it from set_price_watch and from compare_energy without opening either schema.
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?
It spells out when to use it and what it needs: the person must give consent, an agent cannot click the confirmation link for them, and at most 5 watches per e-mail. It also points at the sibling tools that supply optional values ('supplier_id from energy_suppliers', 'current_offer_id from compare_energy products'), which is explicit routing, not inference.
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.
55 tool updates
- First observed
add_to_list - First observed
api_price_breakdown - First observed
cancel_energy_watch - First observed
cheaper_abroad - First observed
check_shop_feed - First observed
compare_digital - First observed
compare_energy - First observed
compare_energy_from_bill - First observed
compare_internet - First observed
compare_mobile - First observed
confirm_energy_watch - First observed
create_list - First observed
daily_deals - First observed
delete_comparison - First observed
delete_list - First observed
delete_price_watch - First observed
digital_price_history - First observed
energy_price_history - First observed
energy_suppliers - First observed
energy_unit_prices - First observed
energy_watch_status - First observed
estimate_appliance_energy - First observed
find_best_price - First observed
get_product - First observed
get_shop_feed_diagnostics - First observed
get_shop_registration - First observed
get_shop_statistics - First observed
insurance_guide - First observed
list_coupons - First observed
list_my_comparisons - First observed
list_my_favorites - First observed
list_my_lists - First observed
list_my_price_watches - First observed
list_my_shops - First observed
list_shops - First observed
price_history - First observed
product_rows - First observed
product_variants - First observed
register_shop - First observed
remove_favorite - First observed
remove_from_list - First observed
report_illegal_content - First observed
report_issue - First observed
save_comparison - First observed
save_favorite - First observed
search_products - First observed
send_contact_message - First observed
send_cooperation_inquiry - First observed
set_price_watch - First observed
share_comparison - First observed
trending_new_products - First observed
update_list - First observed
update_price_watch - First observed
verify_shop_domain - First observed
watch_energy_fixation
Related MCP Connectors
Price comparison for Germany and Austria. Read-only, no account. Shop links carry a commission.
Search ~8.5M products from 2,500+ Central European e-shops. Semantic, keyword, GTIN lookup.
Compare 18M+ prices across Denmark, Sweden, Norway and Germany: product search, wishlists. No login.
Compare prices across Latvian online retailers: offers, price history and wishlists.
Related MCP Servers
- 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
- AlicenseAqualityCmaintenanceEnables searching products, retrieving product details, listing stores, checking stock availability, and comparing prices across Czech DIY retailers.5MIT

idealo MCP Serverofficial
AlicenseNot gradedqualityFmaintenanceEnables product search, price comparison, and price history analysis across 6 European marketplaces (DE, AT, GB, FR, IT, ES).21MIT- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to search and compare live prices from Finnish marketplaces (Hinta.fi, Tori.fi, Huuto.net) for new and used products like electronics, furniture, and more.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.