Skip to main content
Glama

euroref — European government reference data

Server Details

European govt data, cited: rates, VAT, tax, wages, holidays, FX. 34 countries + EU; Germany free.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.3% over 63 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.1/5.0

Scored across 25 tools

Disambiguation4/5

Most tools have crisp, distinct purposes (get_series vs get_series_history vs get_snapshot, or compute_vat vs compute_income_tax vs compute_employment_cost), and the elaborate descriptions help differentiate. However, business_days_between and count_working_days both count working days in a range, and get_series/get_snapshot/get_country_brief/compare_series overlap in what they return, so a couple of boundaries require careful reading.

Naming Consistency4/5

Nearly everything is snake_case, and verb families are used meaningfully (compute_* for numeric calc, check_* for verdicts, validate_* for format checks, get_* for retrieval). Minor deviations exist: business_days_between and settlement_date lack a verb prefix and is_business_day uses an interrogative predicate style.

Tool Count4/5

25 tools is on the heavy side, but the server genuinely spans many distinct data products (calendars, tax/wage/series computations, validation, monitoring, receipts), so most tools earn their place. It sits right at the upper bound of what is comfortable before the set starts feeling sprawling.

Completeness5/5

The surface comprehensively covers the reference-data lifecycle: discovery (list_series), retrieval (get_series/history/snapshot/brief/compare), computations (VAT, income tax, employment cost, statutory interest, minimum wage), validation (tax IDs), date/calendar arithmetic, filing deadlines, settlement, alerting, and receipt verification. No obvious dead ends for a read-only statutory-reference domain.

Available Tools

25 tools
add_business_daysAdd business days to a dateA
Read-onlyIdempotent
Inspect

FREE, unmetered. The date n business days after (or, for negative n, before) a start date. The start date is day 0 and never counted; n = 0 returns the date itself if it is a business day, otherwise the next one. Lists every non-business day skipped and why. Uses the country's national public-holiday calendar and its statutory weekend rule (Gulf Friday+Saturday, Israel Saturday-only, India 2nd/4th Saturdays, Nepal's 2026 change, China's multi-day breaks and make-up working days). A date in a year whose holidays we do not hold is refused with error year_not_held and the years_held list; it is never computed from weekends alone. A statutory holiday whose date is not yet fixed is refused as holiday_date_pending. Regional (sub-national) holidays are not applied.

ParametersJSON Schema
NameRequiredDescriptionDefault
nYesBusiness days to add; negative walks backward
dateYesStart date (day 0), YYYY-MM-DD
countryYesISO 3166-1 alpha-2 country code, e.g. 'za', 'ae', 'in'. Every country we hold a holiday calendar for is accepted on every brand, not only this brand's region.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nNo
freeNo
yearNoOn year_not_held: the year we do not hold
basisNo
errorNoPresent on a free refusal or error; no charge
priceNo
caveatsNo
countryNo
reachedNoOn a refusal: the first date the calculation could not classify
weekendNoWeekend days applied, the basis of that rule, and any dated or sub-national note
calendarNoHoliday calendar used: years_held, source, last_confirmed, stale
directionNo
no_chargeNo
price_usdNo
conventionNo
disclaimerNo
how_to_payNo
start_dateNo
years_heldNoOn year_not_held: the years whose holidays we do hold
bind_seriesNo
explanationNo
result_dateNo
x_next_bindNo
country_nameNo
http_endpointNo
result_weekdayNo
what_you_can_doNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card
calendar_days_movedNo
non_business_days_skippedNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, closed-world behavior, but the description goes well beyond them: it enumerates the country statutory weekend rules, discloses that regional holidays are NOT applied, and names two concrete refusal modes (year_not_held with years_held, holiday_date_pending). That is exactly the behavioral context an agent cannot get from structured fields alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the metering status and the core operation, then progressively narrows to edge cases, refusal modes, and exclusions. It is dense and multi-clause, but nearly every sentence carries a distinct rule an agent needs; only the parenthetical country-rule laundry list is slightly over-packed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-shape details are correctly omitted, and the description still covers the failure modes, the calendar-coverage boundary, and the exclusions an agent must know to call this safely. Little is left for the agent to discover at runtime.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the description genuinely adds semantics beyond the schema: the start date is day 0 and never counted, n=0 returns the date itself if it is a business day else the next one, and negative n walks backward. The only gap is that the +/-500 bound and country-code format are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Precise verb+resource: add N business days to a start date, with the direction (negative n walks backward) stated up front. This cleanly separates it from siblings like business_days_between, count_working_days, and is_business_day, which count or test rather than advance a date.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the day-0 convention and the n=0 edge case, which implies the correct usage context, but it never explicitly names an alternative tool or states when to prefer this over business_days_between/count_working_days. Usage is inferable rather than routed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

business_days_betweenCount business days between two datesA
Read-onlyIdempotent
Inspect

FREE, unmetered. Business days between two dates. business_days counts (from, to] and is negative when to is before from, so add_business_days(from, business_days) lands on to whenever to is a business day; business_days_inclusive counts both ends. Also returns weekend days and the public holidays in range. Uses the country's national public-holiday calendar and its statutory weekend rule (Gulf Friday+Saturday, Israel Saturday-only, India 2nd/4th Saturdays, Nepal's 2026 change, China's multi-day breaks and make-up working days). A date in a year whose holidays we do not hold is refused with error year_not_held and the years_held list; it is never computed from weekends alone. A statutory holiday whose date is not yet fixed is refused as holiday_date_pending. Regional (sub-national) holidays are not applied.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRange end, YYYY-MM-DD
fromYesRange start, YYYY-MM-DD
countryYesISO 3166-1 alpha-2 country code, e.g. 'za', 'ae', 'in'. Every country we hold a holiday calendar for is accepted on every brand, not only this brand's region.

Output Schema

ParametersJSON Schema
NameRequiredDescription
toNo
freeNo
fromNo
yearNoOn year_not_held: the year we do not hold
basisNo
errorNoPresent on a free refusal or error; no charge
priceNo
caveatsNo
countryNo
reachedNoOn a refusal: the first date the calculation could not classify
weekendNoWeekend days applied, the basis of that rule, and any dated or sub-national note
calendarNoHoliday calendar used: years_held, source, last_confirmed, stale
no_chargeNo
price_usdNo
conventionNo
disclaimerNo
how_to_payNo
years_heldNoOn year_not_held: the years whose holidays we do hold
bind_seriesNo
explanationNo
x_next_bindNo
country_nameNo
weekend_daysNo
business_daysNoBusiness days in (from, to]; negative when to is before from
http_endpointNo
what_you_can_doNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card
business_days_inclusiveNoBusiness days counting both ends
calendar_days_inclusiveNo
public_holidays_on_weekdaysNo
public_holidays_on_weekendsNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description adds substantial behavioral detail: it is free and unmetered, defines the counting semantics including negative ranges, explains that weekend days and public holidays are returned, lists specific statutory weekend rules, and documents error behaviors such as year_not_held and holiday_date_pending. These are all meaningful operational traits not covered by the readOnly/idempotent annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and key constraint, and most sentences are dense with useful detail. It is somewhat long and includes several illustrative country examples that, while relevant, could be trimmed for brevity, but the structure remains clear and purposeful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and the existence of an output schema, the description is complete enough for correct invocation. It covers calculation semantics, return contents, calendar limitations, and explicit error conditions, leaving no significant ambiguity for an agent to resolve.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is already 100%, the description adds important semantic meaning: country selects a national public-holiday calendar and statutory weekend rule, from/to follow half-open interval semantics with potential negative counts, and regional holidays are excluded. This goes well beyond the schema's terse date and country-code descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a precise verb and resource: counting business days between two dates. It distinguishes itself from the sibling add_business_days by explaining the inverse relationship and the interval convention '(from, to]', and it clarifies the inclusive-counting variant, so an agent can identify the tool's exact purpose 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains when the tool is appropriate: counting business days between two dates while accounting for national holidays and statutory weekends. It also notes limitations such as regional holidays not being applied and errors for unsupported years, but it does not explicitly contrast with other date-related siblings like is_business_day or count_working_days.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_minimum_wageA
Read-onlyIdempotent
Inspect

PAID ($0.02). Compliance verdict: is a salary at, above or below the country's statutory minimum wage? Returns verdict, margin, the statutory floor and the legal instrument it rests on. Honest statuses when no enforceable floor exists or the period doesn't match the floor's period (cross-period conversion is never guessed). Pass api_key if you have one (instant card checkout at /pricing); otherwise the response explains how to pay via x402. The evaluation country is free to try (see list_series). Optional receipt (boolean, default false): on a paid success, include an Ed25519 answer receipt at no extra USDC. An answer receipt is not a series certified extract (GET /v1/certified/{country}/{series} is $0.10 and is not an MCP tool) and is not legal advice. Verify with verify_answer_receipt against /certified/public-key.

ParametersJSON Schema
NameRequiredDescriptionDefault
amountYesWage to check, in the country's own currency
periodYesPeriod the amount covers — must match the statutory floor's period
api_keyNoAPI key (bypasses x402; metered for invoicing)
countryYesISO country code
receiptNoDefault false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool).

Output Schema

ParametersJSON Schema
NameRequiredDescription
basisNo
errorNoPresent on a free refusal or error; no charge
floorNo
statusNoAnswer status, e.g. computed or an honest no-answer status
countryNo
receiptNoEd25519 answer receipt when receipt=true on a paid success
verdictNo
questionNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
provenanceNoCited official sources behind the answer
bind_seriesNo
explanationNo
label_basisNoInputs and the rule ids that produced the two labels
x_next_bindNo
http_endpointNo
coverage_labelNoHow much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules
confidence_labelNoEvidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/non-destructive, and the description adds substantial behavior beyond them: a $0.02 price, the api_key-vs-x402 payment branch, honest statuses when no enforceable floor exists, an explicit refusal to guess cross-period conversions, and the receipt-vs-certified-extract distinction. It also disclaims legal advice, which matters for a compliance verdict.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core verdict question, then the return shape, then payment mechanics and caveats. Dense and mostly waste-free, though the receipt/certified-extract distinction is stated twice (once in the description body, once echoed in the schema), adding slight redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paid, open-world compliance tool with 5 params, an output schema, and full annotation coverage, the description supplies everything an agent needs: the question answered, the return shape, the payment path, edge-case statuses, and the receipt verification route. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds real meaning: period 'must match the statutory floor's period' and cross-period conversion is never guessed, and the receipt flag's downstream effect (included only on paid success, not on 402/free refusals, not a certified extract) goes beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+scope: 'is a salary at, above or below the country's statutory minimum wage?' and enumerates the return payload (verdict, margin, statutory floor, legal instrument). This is clearly distinguishable from siblings like compute_employment_cost or compute_income_tax, which cover different compliance questions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives practical invocation context (pass api_key, otherwise x402 flow; evaluation country is free; see list_series) and routes the agent to verify_answer_receipt for verification. However, it never states when to prefer this tool over neighboring compliance tools such as compute_employment_cost, so sibling selection is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compare_seriesA
Read-onlyIdempotent
Inspect

PAID ($0.02). One series (e.g. vat, policy-rate, minimum-wage, corporate-tax) across up to 10 countries of this brand in one call; each row carries its own source, dates and labels, and countries without the series are listed under missing. Malformed requests are refused free. Pass api_key if you have one; otherwise the response explains how to pay via x402. After a 200, bind get_changes (free poll) or register_alert (HMAC push; Register: $0 · Delivery after trial: $0.05) on this series so a later gazette does not silently retire the value.

ParametersJSON Schema
NameRequiredDescriptionDefault
seriesYesSeries id from list_series, e.g. vat
api_keyNoAPI key
countriesYesISO 3166-1 alpha-2 codes on this brand, at most 10

Output Schema

ParametersJSON Schema
NameRequiredDescription
rowsNo
as_ofNo
countNo
errorNoPresent on a free refusal or error; no charge
seriesNo
missingNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
x_next_bindNo
http_endpointNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing cost ($0.02), that malformed requests are refused free, that missing countries are surfaced under a 'missing' key, that each row carries its own source/dates/labels, and the api_key vs x402 payment path. Annotations cover safety/idempotency, but this adds concrete pricing, error and auth behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the paid cost and the core one-series-many-countries scope, and each clause carries operational detail. It is a dense run-on paragraph and includes sibling pricing ('Register: $0 · Delivery after trial: $0.05') that is arguably outside this tool's remit.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paid, open-world read tool with an output schema, the description covers cost, payment/auth paths, error handling, the missing-countries behavior, and the recommended follow-up binding. Nothing an agent needs to invoke it correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, and the description adds value by giving concrete series examples (vat, policy-rate, minimum-wage, corporate-tax) and restating the 10-country cap, plus explaining the api_key alternative path. It stops short of documenting any format beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (compare) and resource (one series across countries) with scope bounded to 'up to 10 countries of this brand in one call'. It is clearly distinguishable from siblings like get_series (single fetch) and get_series_history (time series) because it frames the multi-country, single-call dimension.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when it applies (one series, many countries) and names the correct follow-up tools (get_changes or register_alert) to use after a 200. It does not, however, explicitly contrast itself with get_series/get_snapshot, so the 'when not to use' side is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compute_employment_costA
Read-onlyIdempotent
Inspect

PAID ($0.05). Cost to employ: prices every statutory contribution on both the employee and employer sides for a gross salary, returning line-by-line amounts with instrument citations and an explicit refused list for schemes that could not be priced (unknown, not zero). Does NOT compute income tax — use compute_payroll for gross-to-net take-home where supported. Pass api_key if you have one (instant card checkout at /pricing); otherwise the response explains how to pay via x402. The evaluation country is free to try (see list_series). Optional receipt (boolean, default false): on a paid success, include an Ed25519 answer receipt at no extra USDC. An answer receipt is not a series certified extract (GET /v1/certified/{country}/{series} is $0.10 and is not an MCP tool) and is not legal advice. Verify with verify_answer_receipt against /certified/public-key.

ParametersJSON Schema
NameRequiredDescriptionDefault
grossYesGross pay in local currency
periodNoPeriod the gross covers (default month)
api_keyNoAPI key (bypasses x402; metered for invoicing)
countryYesISO country code with a costed contribution schedule
receiptNoDefault false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool).
contractNoContract type where rates differ
nationalityNoGulf nationality for pension reach
subdivisionNoOptional ISO 3166-2 regional schedule (e.g. CA-QC, DE-SN)
childless_over_23NoGermany care surcharge
children_under_25NoGermany per-child care reduction
workplace_pensionNoAuto-enrolment / PPK participation (default true)
zusatzbeitrag_rateNoGermany sickness-fund supplement

Output Schema

ParametersJSON Schema
NameRequiredDescription
basisNo
errorNoPresent on a free refusal or error; no charge
statusNoAnswer status, e.g. computed or an honest no-answer status
countryNo
receiptNoEd25519 answer receipt when receipt=true on a paid success
questionNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
provenanceNoCited official sources behind the answer
bind_seriesNo
explanationNo
label_basisNoInputs and the rule ids that produced the two labels
x_next_bindNo
http_endpointNo
coverage_labelNoHow much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules
confidence_labelNoEvidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, non-destructive). The description adds substantive behavior annotations do not: it is a paid call ($0.05), payment can be settled either by api_key or via x402, refusals are explicit and mean "unknown, not zero", the evaluation country is free to try, and receipts are only issued on paid successes. That is exactly the extra context the 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and every clause is informative, but the receipt/certified-extract/legal-advice passage is repeated nearly verbatim from the schema's receipt description, adding length without new information. A dense single paragraph also makes the payment-mechanics detail harder to scan than it needs to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no further explanation, yet the description still characterizes them usefully (line-by-line amounts, citations, refused list). Payment paths, receipt semantics, free-trial scope, and the income-tax boundary are all covered, leaving nothing an agent needs to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across all 12 parameters, so the schema already documents gross, country, period, receipt, and the country-specific knobs. The description restates the receipt parameter at length but adds no format or syntax detail beyond the schema, which is the baseline-3 case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — pricing every statutory contribution on both employee and employer sides for a gross salary — and specifies the output shape (line-by-line amounts, instrument citations, explicit refused list). It also explicitly bounds the scope by excluding income tax, so an agent can separate it from compute_income_tax at a glance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear when-not rule ("Does NOT compute income tax — use compute_payroll for gross-to-net") and routes payment questions to api_key vs x402 and to list_series for the free evaluation country. The only weakness is that the named alternative, compute_payroll, does not appear in the sibling list (which offers compute_income_tax), which could misdirect an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compute_income_taxA
Read-onlyIdempotent
Inspect

PAID ($0.02). Statutory income tax on a TAXABLE-income figure using the country's verified marginal bracket schedule, with full per-bracket workings, effective rate and marginal rate. You pass the amount in local currency. IMPORTANT: this is tax on taxable income, NOT net take-home pay — reliefs/allowances and social-security contributions are the caller's concern and are not applied (see the response scope_note). Pass api_key if you have one (instant card checkout at /pricing); otherwise the response explains how to pay via x402. The evaluation country is free to try (see list_series). Optional receipt (boolean, default false): on a paid success, include an Ed25519 answer receipt at no extra USDC. An answer receipt is not a series certified extract (GET /v1/certified/{country}/{series} is $0.10 and is not an MCP tool) and is not legal advice. Verify with verify_answer_receipt against /certified/public-key.

ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNoAPI key (bypasses x402; metered for invoicing)
countryYesISO country code
receiptNoDefault false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool).
taxable_incomeYesTaxable income in the country's local currency, in the schedule's own period basis (annual for most; monthly for Côte d'Ivoire, Uganda, Ethiopia, Costa Rica)

Output Schema

ParametersJSON Schema
NameRequiredDescription
taxNo
basisNo
errorNoPresent on a free refusal or error; no charge
statusNoAnswer status, e.g. computed or an honest no-answer status
countryNo
receiptNoEd25519 answer receipt when receipt=true on a paid success
questionNo
breakdownNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
provenanceNoCited official sources behind the answer
scope_noteNo
bind_seriesNo
explanationNo
label_basisNoInputs and the rule ids that produced the two labels
x_next_bindNo
http_endpointNo
marginal_rateNo
coverage_labelNoHow much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules
effective_rateNo
confidence_labelNoEvidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the readOnly/idempotent/openWorld annotations: the tool is paid ($0.02), explains x402 fallback vs api_key, the scope_note in the response, the receipt behavior on paid success, and that it is not legal advice. This is rich disclosure of cost, auth, and output-scope traits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the paid aspect and the core purpose, then covers scope and payment. It is dense and information-rich, though the payment/receipt/verification sentences are somewhat sprawling and could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be re-explained, and the description fully covers cost, auth, scope limits, receipt semantics, and verification path. Nothing material to correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 four parameters including the currency/basis caveats. The description adds only marginal detail ('You pass the amount in local currency') that largely restates the schema, 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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — computing statutory income tax on a taxable-income figure — with the exact basis (country's verified marginal bracket schedule) and delivered outputs (per-bracket workings, effective rate, marginal rate). This clearly distinguishes it from siblings like compute_vat and compute_employment_cost.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly scopes what the tool does and does NOT do: 'this is tax on taxable income, NOT net take-home pay — reliefs/allowances and social-security contributions are the caller's concern.' It also routes to alternatives (list_series for the free country, verify_answer_receipt for verification, the non-MCP certified-extract endpoint).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compute_statutory_interestA
Read-onlyIdempotent
Inspect

PAID ($0.02). Simple statutory interest on a principal at the cited statutory-interest series rate: Actual/365 simple, principal × (rate/100) × (days/365). Pass days, or from and to as YYYY-MM-DD (from inclusive, to exclusive). If both are sent and disagree, the call is refused free. A series with no numeric rate after materialization (mechanism-only) is refused free — a non-answer is not sold. Not legal advice. Jurisdiction-specific compounding and day-count statutes are not applied. Pass api_key if you have one (instant card checkout at /pricing); otherwise the response explains how to pay via x402. Every DE series is free to try. Optional receipt (boolean, default false): on a paid success, include an Ed25519 answer receipt at no extra USDC. An answer receipt is not a series certified extract (GET /v1/certified/{country}/{series} is $0.10 and is not an MCP tool) and is not legal advice. Verify with verify_answer_receipt against /certified/public-key.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoPeriod end, YYYY-MM-DD, exclusive.
daysNoDay-count days. Omit when from and to are set. If both are sent and disagree, the answer is refused free (HTTP 400).
fromNoPeriod start, YYYY-MM-DD, inclusive. Pair with to. Day count is calendar days from inclusive to to exclusive (UTC dates).
api_keyNoAPI key (bypasses x402; metered for invoicing)
countryYesISO country code
receiptNoDefault false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool).
principalYesPrincipal in the country's own currency. Must be a finite number greater than 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription
basisNo
errorNoPresent on a free refusal or error; no charge
statusNoAnswer status, e.g. computed or an honest no-answer status
countryNo
receiptNoEd25519 answer receipt when receipt=true on a paid success
questionNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
provenanceNoCited official sources behind the answer
bind_seriesNo
explanationNo
label_basisNoInputs and the rule ids that produced the two labels
x_next_bindNo
http_endpointNo
coverage_labelNoHow much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules
confidence_labelNoEvidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Far exceeds the annotations: it discloses the price ($0.02), that refusals are free, the non-answer policy, the legal-advice disclaimer, the free DE-series trial, x402 payment flow, and receipt mechanics. This behavioral context (cost, failure policy) is not available anywhere in 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The calculation is front-loaded well, but the text is bloated with marketing/payment content and repeats itself ('not legal advice' twice; the certified-extract caveat is restated). Several clauses about the certified extract and receipt could be trimmed without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and full annotation coverage, the description still accounts for pricing, payment fallback, refusal behavior, and receipt verification via the verify_answer_receipt sibling. Nothing an agent needs 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so most semantics (from/to inclusive-exclusive, days conflict, receipt default, principal > 0, country enum) are already in the schema. The description largely restates these, adding only framing rather than new per-parameter meaning, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource and the exact calculation: simple statutory interest on a principal at the statutory-interest series rate using Actual/365. An agent can immediately tell this apart from sibling compute_* tax/VAT/wage tools because the domain (statutory interest on principal) and method are named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains how to supply the period ('Pass days, or from and to'), what happens on conflict (refused free), when a series is unusable (mechanism-only), and how payment works (api_key vs x402). It stops short of explicitly contrasting against sibling tools, but the routing conditions it gives are clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

compute_vatA
Read-onlyIdempotent
Inspect

PAID ($0.01). VAT breakdown for an amount: net, tax and gross using the country's current statutory rate, including per-levy components where the rate is composite (e.g. Ghana VAT + NHIL + GETFund). mode=add treats the amount as net; mode=extract backs VAT out of a gross amount. Pass api_key if you have one (instant card checkout at /pricing); otherwise the response explains how to pay via x402. The evaluation country is free to try (see list_series). Optional receipt (boolean, default false): on a paid success, include an Ed25519 answer receipt at no extra USDC. An answer receipt is not a series certified extract (GET /v1/certified/{country}/{series} is $0.10 and is not an MCP tool) and is not legal advice. Verify with verify_answer_receipt against /certified/public-key.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoadd = amount is net (default); extract = amount is gross
amountYesAmount in the country's own currency
api_keyNoAPI key
countryYesISO country code
receiptNoDefault false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool).

Output Schema

ParametersJSON Schema
NameRequiredDescription
netNo
taxNo
rateNo
basisNo
errorNoPresent on a free refusal or error; no charge
grossNo
statusNoAnswer status, e.g. computed or an honest no-answer status
countryNo
receiptNoEd25519 answer receipt when receipt=true on a paid success
questionNo
workingsNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
provenanceNoCited official sources behind the answer
bind_seriesNo
explanationNo
label_basisNoInputs and the rule ids that produced the two labels
x_next_bindNo
http_endpointNo
coverage_labelNoHow much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules
confidence_labelNoEvidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare safety/idempotency, so the description carries cost and flow context: a $0.01 paid call, api_key vs. x402 payment paths, the free evaluation-country exception, and the optional Ed25519 receipt on paid successes. It also flags legal-advice disclaimers and the verify_answer_receipt verification path, well beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and mode behavior are front-loaded in the first two sentences, which is ideal. The middle sentence on payment logistics and the trailing disclaimer/receipt caveats are dense, but each conveys a distinct, call-relevant fact rather than filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values needn't be spelled out, and the description fills the remaining gaps: payment mechanics, country enumeration pointer (list_series), receipt semantics, and post-call verification. Nothing an agent needs 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the 3 baseline applies, but the description meaningfully elaborates: it restates and explains mode=add/extract behavior, describes the receipt toggle's effect on output and pricing, and clarifies the currency context. This adds real meaning over the enum/field labels, though it mostly mirrors schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('VAT breakdown for an amount: net, tax and gross') and clarifies the statutory-rate basis, including composite rates like Ghana VAT+NHIL+GETFund. An agent can distinguish it from siblings such as compute_income_tax or compute_employment_cost 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly defines the two operating modes (mode=add treats amount as net, mode=extract backs VAT out of gross) and when to pass api_key vs. paying via x402. It also routes the agent away from a lookalike ('answer receipt is not a certified extract; that SKU is not an MCP tool'), but stops short of enumerating when VAT is needed over other tax tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

count_working_daysA
Read-onlyIdempotent
Inspect

PAID ($0.002). Working days in a date range for a country: weekends (Egypt's Fri–Sat handled) and statutory public holidays applied, with the holidays hit by name and the next working day after the range. Range max 366 days. Pass api_key if you have one (instant card checkout at /pricing); otherwise the response explains how to pay via x402. The evaluation country is free to try (see list_series). Optional receipt (boolean, default false): on a paid success, include an Ed25519 answer receipt at no extra USDC. An answer receipt is not a series certified extract (GET /v1/certified/{country}/{series} is $0.10 and is not an MCP tool) and is not legal advice. Verify with verify_answer_receipt against /certified/public-key.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRange end, YYYY-MM-DD, inclusive
fromYesRange start, YYYY-MM-DD, inclusive
api_keyNoAPI key
countryYesISO country code
receiptNoDefault false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool).
subdivisionNoOptional ISO 3166-2 region code (e.g. 'DE-BY') to apply that region's statutory holidays on top of the national calendar. Regions are listed under `subdivisions` by get_public_holidays. Unknown code is refused free with the list.

Output Schema

ParametersJSON Schema
NameRequiredDescription
basisNo
errorNoPresent on a free refusal or error; no charge
statusNoAnswer status, e.g. computed or an honest no-answer status
countryNo
receiptNoEd25519 answer receipt when receipt=true on a paid success
questionNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
provenanceNoCited official sources behind the answer
bind_seriesNo
explanationNo
label_basisNoInputs and the rule ids that produced the two labels
x_next_bindNo
http_endpointNo
coverage_labelNoHow much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules
confidence_labelNoEvidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing cost ($0.002), the payment path, the free evaluation-country tier, the 366-day range cap, Egypt's Fri–Sat weekend handling, and the receipt semantics (included at no extra USDC on paid success, verify with verify_answer_receipt). This is exactly the extra 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose leads, but the paragraph then mixes pricing, receipt mechanics, the certified-extract SKU, and a legal-advice disclaimer in one dense block. The pricing and legal-receipt asides are relevant but verbose, so not every sentence is tightly earning its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. The description still covers cost, payment, free tier, range limits, weekend/holiday behavior, and receipt verification, leaving nothing an agent needs in order to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 the schema lacks: the 366-day maximum on from/to, the free-evaluation-country retry behavior, and the guidance to pass api_key when available. It does not add much on subdivision beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and scope: working days in a date range for a country, with weekends and statutory public holidays applied. It does not, however, explicitly distinguish itself from the closely named sibling business_days_between, so the differentiation falls to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives useful operational guidance (the evaluation country is free to try, pass api_key if you have one, otherwise pay via x402) but never says when to choose this over business_days_between or add_business_days. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_calendarA
Read-onlyIdempotent
Inspect

FREE, unmetered. GET /v1/calendar for this brand's continent. Optional country (ISO 3166-1 alpha-2) and series. Derives reverify_by from last_confirmed + update_cycle_days (the same window that sets stale) and, only when current.effective_to is a non-empty string, next_effective_known with basis effective_to. status unknown omits that date. Never parses notes. Does not invent MPC, budget, or wage-review dates. next_effective_known is the recorded end of the current value, not a promised gazette event. A 402 is a gate bug — do not pay. Past changes stay on get_changes.

ParametersJSON Schema
NameRequiredDescriptionDefault
seriesNoOptional series id (for example policy-rate). Omit for every series. A valid country with no match stays free.
countryNoOptional ISO 3166-1 alpha-2. Omit for every series on this brand's continent. Unknown to the catalog is 404 free. Not two letters is 400 free.

Output Schema

ParametersJSON Schema
NameRequiredDescription
as_ofNo
brandNo
countNo
errorNoPresent on a free refusal or error; no charge
entriesNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
x_next_bindNo
http_endpointNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, openWorld, non-destructive), yet the description adds substantial context beyond them: no metering/cost, 400/404 responses are free, and a 402 is flagged as a gate bug that should not be paid. It also exposes derivation rules (reverify_by from last_confirmed + update_cycle_days), the conditional emission of next_effective_known, and anti-hallucination guarantees (never parses notes, does not invent MPC/budget/wage-review dates).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Cost and endpoint are sensibly front-loaded, but the text then runs into a dense stream of caveats with undefined jargon (last_confirmed, update_cycle_days, stale, MPC) that assumes prior knowledge, harming readability. Several clauses are genuinely useful, but the run-on construction and internal shorthand could be tightened.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be re-explained, yet the description still covers derived fields, conditional omissions, error-code economics, and where historical data lives. The main omission is a plain statement of what the calendar contains for a first-time caller, but overall an agent has enough to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the two parameters are fully documented in the schema (ISO 3166-1 alpha-2 format, series example policy-rate, omission semantics, free-on-mismatch behavior). The description reinforces the same facts but adds little syntax or format detail the schema lacks, so this lands at the baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the concrete resource/endpoint (GET /v1/calendar) and scope (this brand's continent, optional country/series), and it names the sibling that owns past data (get_changes), so it is distinguishable from adjacent tools. It stops short of plainly saying 'returns upcoming compliance/effective-date events with reverify windows', leaving the actual subject matter to be inferred from field names like reverify_by and next_effective_known.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operating context: FREE and unmetered, omit country for all series on the continent, valid-but-unmatched country stays free, and past changes belong on get_changes. This routes the agent to the right tool for historical vs current data. It lacks an explicit 'use this when you need X' framing and does not contrast with the many compute_* siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_changesA
Read-onlyIdempotent
Inspect

FREE unmetered change + freshness feed. After any paid series or answer call, call this before you assume the cached value is still the law. Returns every series whose current value took effect on or after since (default last 30 days), newest first, each with last_confirmed and stale, PLUS a dataset-wide freshness summary: how many of the served series were re-verified within 1/7/30/90 days, how many are past their window, and which single series has gone longest without a check. Freshness is checkable or it is marketing. Args: since? (YYYY-MM-DD). Do not re-pay get_series to discover a diff. For a push bind, use register_alert (Register: $0 · Delivery after trial: $0.05). For a filing freeze of the current value, GET /v1/certified/{country}/{series} ($0.10).

ParametersJSON Schema
NameRequiredDescriptionDefault
sinceNoYYYY-MM-DD. Omit for the server default (last 30 days). Free, unmetered.

Output Schema

ParametersJSON Schema
NameRequiredDescription
as_ofNo
errorNoPresent on a free refusal or error; no charge
sinceNo
changesNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
x_next_bindNo
http_endpointNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, idempotent, open-world, and non-destructive traits, and the description still adds substantial behavioral context beyond them: return ordering (newest first), per-row fields (last_confirmed, stale), the 1/7/30/90-day freshness buckets, and pricing/metering ($0 free, alternatives at $0.05/$0.10). Nothing is left for the agent to infer about cost or shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the key fact ('FREE unmetered') and well organized, but it carries some non-essential weight: the slogan 'Freshness is checkable or it is marketing' does no routing work, and pricing parentheticals add length. Still, most sentences earn their place by steering the agent away from paid alternatives.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be fully enumerated, yet the description still describes the shape (per-series freshness fields plus a dataset summary). Combined with the alternatives and cost model, an agent has everything needed to select and invoke this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single `since` parameter, so the baseline is 3, but the description adds genuine semantic meaning beyond the schema's format note: it defines what `since` filters on (series whose current value *took effect* on or after that date) and restates the default window. The added value is real, though modest for a one-param tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource combination ('FREE unmetered change + freshness feed') and precisely what it returns: every series whose current value took effect on or after `since`, plus a dataset-wide freshness summary. It differentiates itself from siblings by naming get_series, register_alert, and the certified endpoint as distinct things to use instead.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit trigger ('After any paid series or answer call, call this before you assume the cached value is still the law'), an explicit anti-pattern ('Do not re-pay get_series to discover a diff'), and named alternatives with conditions ('For a push bind, use register_alert', 'For a filing freeze ... GET /v1/certified/...'). When/when-not/alternatives are all covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_country_briefA
Read-onlyIdempotent
Inspect

PAID ($0.01). Country brief: every reference series we hold for one country (policy rate, VAT/GST, CPI, taxes, minimum wage, holidays...) in one call, each with value, unit, effective and last-confirmed dates, official source and confidence label. Cheaper than buying the series one by one. Pass api_key if you have one (card checkout at /pricing); otherwise the response explains how to pay via x402. After a 200, bind get_changes (free poll) or register_alert (HMAC push; Register: $0 · Delivery after trial: $0.05) on this series so a later gazette does not silently retire the value.

ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNoAPI key
countryYesISO country code

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNo
as_ofNo
errorNoPresent on a free refusal or error; no charge
seriesNo
countryNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
x_next_bindNo
series_countNo
http_endpointNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnly, idempotent, non-destructive, openWorld), but the description goes further: it discloses the $0.01 cost, the payment fallback behavior, the shape of each returned series (value, unit, effective/last-confirmed dates, source, confidence), and the risk of values being silently retired without an alert.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: purpose and price come first, then payment, then follow-up. Nearly every sentence carries unique information, though the long parenthetical list of series types and the pricing aside make it slightly heavier than needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, cost, auth path, return contents, and downstream sibling routing; with an output schema present it is more than complete for an agent to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% so both parameters are already documented. The description still adds value by clarifying api_key is optional and what happens without it (x402 payment instructions), which is not in the schema's terse 'API key' text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific resource (a bundled country brief of every reference series held for one country) and enumerates what it includes, so an agent can instantly distinguish it from get_series/list_series which fetch individual series.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says it is cheaper than buying series one by one, explains the api_key vs x402 payment paths, and prescribes follow-up actions (bind get_changes or register_alert) after a 200. Clear when-to-use and what-to-do-next guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_filing_deadlinesStatutory filing deadlinesA
Read-onlyIdempotent
Inspect

PAID ($0.003, same as any series). Recurring statutory tax deadlines for a country — VAT/GST returns and payments, PAYE/payroll withholding remittances, corporate income tax returns and provisional/instalment payments — as RULES, each cited to the official source with the verbatim phrase that states it, plus the actual DUE DATES in a window, rolled for the country's weekend and national public holidays (every skipped day is listed). Where a rule's source does not say which way a weekend deadline moves, the date is flagged roll_unverified rather than guessed. Countries or taxes we could not verify are returned as a free coverage_gap with reasons, never invented. Pass year_end (MM-DD) to re-anchor corporate-tax rules on the company's own accounting year end. The HTML page /{country}/filing-deadlines shows the rules free. Every DE series is free to try. After a 200, bind get_changes (free poll) or register_alert (HMAC push; Register: $0 · Delivery after trial: $0.05) on this series so a later gazette does not silently retire the value.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoWindow end, YYYY-MM-DD. Default from + 365 days; at most 400 days after from
taxNoOnly this tax's rules and dates
fromNoWindow start, YYYY-MM-DD. Default today
api_keyNoAPI key (bypasses x402; metered for invoicing)
countryYesISO country code
year_endNoCompany accounting year end, MM-DD (e.g. 06-30). Applies to rules marked year_end_variable

Output Schema

ParametersJSON Schema
NameRequiredDescription
gapsNo
unitNo
errorNoPresent on a free refusal or error; no charge
notesNo
staleNo
valueNoThe rules. Each carries its own source {name, url, anchor} and last_confirmed
seriesNo
sourceNo
statusNoOn a coverage gap: researched_no_verified_rule or not_yet_researched
countryNo
due_datesNoComputed occurrences in the window, sorted by due_date
no_chargeNo
price_usdNo
confidenceNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
label_basisNoInputs and the rule ids that produced the two labels
x_next_bindNo
coverage_gapsNoTaxes in scope with no verified rule for this country, and why
http_endpointNo
coverage_labelNoHow much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules
effective_fromNo
last_confirmedNo
confidence_labelNoEvidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card
computed_disclaimerNo

TDQS

A4.5/5.0
Behavior5/5

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 bar is low, yet the description adds substantial nuance: weekend/holiday rolling with every skipped day listed, a roll_unverified flag instead of guessing direction, and coverage_gap entries for unverifiable countries/taxes. Pricing and the change-tracking workflow are also disclosed. This is unusually rich behavioral context beyond 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The substantive content is dense and useful, but the description is front-loaded with a pricing note and padded with cross-sell copy (get_changes poll, register_alert HMAC push with two price points, the free HTML page). Those sentences serve commerce more than tool selection, so the structure is not tight even though little is factually wrong.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter tool with an output schema, the description covers what an agent needs: output shape (rules with verbatim citations plus dated deadlines), uncertainty handling (roll_unverified, coverage_gap), and the effect of the key optional parameter. Nothing essential about calling it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 meaning by explaining what year_end actually does (re-anchors corporate-tax rules on the company's own accounting year end) rather than just naming the field. It does not, however, clarify from/to defaults or the 400-day cap beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource and enumerates exactly what is returned: VAT/GST returns and payments, PAYE remittances, CIT returns and instalments, delivered as cited rules plus rolled due dates. That is clearly distinguishable from siblings like get_public_holidays or compute_vat. The only dilution is the leading pricing note, but the purpose is unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete context for the optional parameters (year_end to re-anchor corporate-tax rules, tax to narrow to one regime) and points to a free HTML alternative for the rules. It also suggests binding get_changes/register_alert after a 200. What it lacks is any explicit exclusion – e.g. when this is the wrong tool versus get_calendar or the individual compute_* tax tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_key_balanceA
Read-onlyIdempotent
Inspect

FREE. Remaining allowance for an API key (free, card or metered): plan, quota, used, remaining, reset date and what the key covers. Never metered. Pass api_key, or send the key as the X-API-Key header on /mcp.

ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNoAPI key. Optional when sent as the X-API-Key header on /mcp.

Output Schema

ParametersJSON Schema
NameRequiredDescription
planNo
usedNo
errorNoPresent on a free refusal or error; no charge
quotaNo
coversNo
no_chargeNo
price_usdNo
remainingNo
resets_onNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
x_next_bindNo
http_endpointNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and openWorld. The description adds real value beyond them: the pricing behavior ('FREE', 'Never metered') and the dual auth path. It does not mention pagination or error behavior, but with an output schema present the return shape is covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: cost and return contents come first, then auth mechanics. Every phrase carries information, though the parenthetical '(free, card or metered)' packs three concepts into a fragment that reads slightly telegraphically.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a zero-required-parameter, single-purpose read tool: it covers cost, return fields, plan/coverage semantics, and both authentication paths, while the output schema handles return structure. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already explains api_key is optional when sent as a header. The description reinforces this by stating the alternative header mechanism explicitly, adding marginal convenience rather than new semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (get key balance) and enumerates exactly what is returned: plan, quota, used, remaining, reset date, coverage. No sibling tool overlaps this domain, and the name alone would be ambiguous without this detail.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'FREE' and 'Never metered', telling the agent this is a no-cost, non-billing call, and explains the two calling conventions (api_key param or X-API-Key header). It stops short of naming alternatives or when-not-to-call, but for a one-purpose utility tool there is little ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_public_holidaysA
Read-onlyIdempotent
Inspect

FREE. Official public-holiday calendar for a supported country, including gazetted movable holidays, with the official government source cited. Some countries also carry sub-national calendars (e.g. the German Laender): the subdivisions field lists them, and passing subdivision (ISO 3166-2, e.g. 'DE-BY') returns the national calendar merged with that region's statutory days.

ParametersJSON Schema
NameRequiredDescriptionDefault
countryYesISO country code
subdivisionNoOptional ISO 3166-2 region code (e.g. 'DE-BY'). Returns national + that region's statutory holidays, each tagged national/regional. Omit for the national calendar.

Output Schema

ParametersJSON Schema
NameRequiredDescription
unitNo
errorNoPresent on a free refusal or error; no charge
notesNo
staleNo
valueNo
seriesNo
sourceNo
countryNo
no_chargeNo
price_usdNo
confidenceNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
label_basisNoInputs and the rule ids that produced the two labels
subdivisionNo
x_next_bindNo
http_endpointNo
coverage_labelNoHow much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules
effective_fromNo
last_confirmedNo
confidence_labelNoEvidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card
available_subdivisionsNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context beyond them: the tool is free, results carry an official government source citation, and subdivision requests return a merged national+regional result set.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the cost and core purpose front-loaded, then the subdivision nuance. No filler, though the subdivision explanation is dense enough that it slightly crowds the second sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers cost, scope, source citation, and the optional regional behavior. The only gap is the absence of explicit routing against nearby calendar/business-day siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 in the schema. The description reinforces the subdivision merge semantics ('national calendar merged with that region's statutory days') and mentions the subdivisions field, but adds little beyond what the schema and output schema already convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Official public-holiday calendar for a supported country') and adds scope detail (gazetted movable holidays, cited government source). It does not name the obvious sibling get_public_holidays_worldwide, so the single-country vs worldwide distinction is only implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the subdivision behavior and that omitting it yields the national calendar, which implies when to use the optional parameter. But it never states when to prefer this tool over get_public_holidays_worldwide, is_business_day, or count_working_days, leaving sibling routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_public_holidays_worldwideA
Read-onlyIdempotent
Inspect

FREE with any API key, including the free key by email (https://euroref.dev/free-key). Same as get_public_holidays, but for every country across all seven brands, not only European. Unmetered: never counts against the key's allowance. Pass api_key, or send the key as the X-API-Key header on /mcp.

ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNoAny valid API key. Optional when the key is sent as the X-API-Key header on /mcp.
countryYesISO country code, any covered country
subdivisionNoOptional ISO 3166-2 region code (e.g. 'DE-BY'). Returns national + that region's statutory holidays, each tagged national/regional. Omit for the national calendar.

Output Schema

ParametersJSON Schema
NameRequiredDescription
unitNo
errorNoPresent on a free refusal or error; no charge
notesNo
staleNo
valueNo
seriesNo
sourceNo
countryNo
no_chargeNo
price_usdNo
confidenceNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
label_basisNoInputs and the rule ids that produced the two labels
subdivisionNo
x_next_bindNo
http_endpointNo
coverage_labelNoHow much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules
effective_fromNo
last_confirmedNo
confidence_labelNoEvidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card
available_subdivisionsNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond that: it is free and unmetered (never counts against the allowance) and documents the two auth paths (api_key param or X-API-Key header). No return-format detail, but the output schema covers that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, with the strongest selection signal (free/unmetered) front-loaded and the sibling comparison immediately after. The free-key URL is slightly promotional but functional, and no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. Combined with annotations and the description's cost, auth and scope coverage, an agent has what it needs to call the tool correctly; only a note on behavior with an invalid/unsupported country would improve it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the enum country list and the subdivision semantics are already fully documented by the schema. The description's auth note about api_key largely repeats the schema's own api_key description, adding no new meaning for country or subdivision. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the resource (public holidays) and its distinguishing scope (every country across all seven brands, not only European) and explicitly names the sibling get_public_holidays as the narrower variant. The verb is only implied via 'Same as get_public_holidays', but the resource and scope are unambiguous and the agent can separate it from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It clearly frames when to pick this over get_public_holidays (worldwide vs European-only) and notes the cost condition (free/unmetered with any key). It stops short of explicit exclusions or a full alternative-selection rule, but the routing signal is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_seriesA
Read-onlyIdempotent
Inspect

PAID ($0.003). Current value of a reference series — e.g. series=policy-rate, vat, minimum-wage. Every value carries its official source citation, effective date, last-confirmed date and staleness flag. Pass api_key if you have one (instant card checkout at /pricing); otherwise the response explains how to pay via x402. Every DE series is free to try. After a 200, bind get_changes (free poll) or register_alert (HMAC push; Register: $0 · Delivery after trial: $0.05) on this series so a later gazette does not silently retire the value.

ParametersJSON Schema
NameRequiredDescriptionDefault
seriesYesSeries id, e.g. policy-rate, vat, minimum-wage
api_keyNoAPI key (bypasses x402; metered for invoicing)
countryYesISO country code

Output Schema

ParametersJSON Schema
NameRequiredDescription
unitNo
errorNoPresent on a free refusal or error; no charge
notesNo
staleNo
valueNo
seriesNo
sourceNo
countryNo
no_chargeNo
price_usdNo
confidenceNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
label_basisNoInputs and the rule ids that produced the two labels
x_next_bindNo
http_endpointNo
coverage_labelNoHow much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules
effective_fromNo
last_confirmedNo
confidence_labelNoEvidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent safety, but the description adds substantial context they cannot: pricing ($0.003), two payment paths (api_key vs x402), the free DE-series trial, and the exact payload contents (source citation, effective date, last-confirmed date, staleness flag). It even warns about a real failure mode ('a later gazette does not silently retire the value').

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the cost and core purpose, and every sentence carries operational information. It is dense and slightly run-on with several parenthetical clauses, but nothing is truly wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still tells the agent what a value contains, how payment works, and what to do after success. For a paid, open-world read tool, nothing an agent needs 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.

Parameters3/5

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, and the series examples in the description duplicate the schema's own example. The only added nuance is the role of api_key ('Pass api_key if you have one'), which is marginal; baseline 3 is appropriate when the schema carries the semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Current value of a reference series') with concrete examples (policy-rate, vat, minimum-wage). The word 'Current' implicitly distinguishes it from get_series_history and compare_series, so an agent can place it among siblings 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear follow-up routing — bind get_changes for free polling or register_alert for HMAC push after a 200 — which tells the agent how this tool fits into a workflow. It does not, however, explicitly name when to prefer this over get_series_history or compare_series for the primary read, so the when-not guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_series_historyA
Read-onlyIdempotent
Inspect

PAID ($0.003). Historical values of a reference series with effective date ranges, optionally filtered by from/to (YYYY-MM-DD). Pass api_key if you have one (instant card checkout at /pricing); otherwise the response explains how to pay via x402. Every DE series is free to try. After a 200, bind get_changes (free poll) or register_alert (HMAC push; Register: $0 · Delivery after trial: $0.05) on this series so a later gazette does not silently retire the value.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLatest effective date, YYYY-MM-DD
fromNoEarliest effective date, YYYY-MM-DD
seriesYesSeries id
api_keyNoAPI key
countryYesISO country code

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent on a free refusal or error; no charge
staleNo
seriesNo
countryNo
entriesNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
label_basisNoInputs and the rule ids that produced the two labels
x_next_bindNo
http_endpointNo
coverage_labelNoHow much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules
confidence_labelNoEvidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent and non-destructive, so the description is free to spend its words on things annotations cannot express: the $0.003 price, the two payment paths (api_key vs x402), the free DE trial, and the warning that unbound values can be silently retired by a later gazette. That is substantive operational context rather than restatement.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The price and paid status are front-loaded, followed by purpose and then follow-up routing, so an agent can triage quickly. It is dense and slightly cluttered by pricing fragments ('Register: $0 · Delivery after trial: $0.05'), but no sentence is pure filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the description covers the gaps that matter for a paid, multi-country, date-ranged tool: cost, auth/payment path, free tier and recommended follow-up calls. Only failure/error behavior is left to inference, which is a minor omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all five parameters are already documented with types, formats and a country enum. The description only echoes the YYYY-MM-DD date format and the api_key option, adding essentially nothing beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Historical values of a reference series with effective date ranges') and the optional from/to scoping, so the agent knows it returns a dated value history rather than a snapshot. It does not explicitly contrast itself with close siblings like get_series or get_snapshot, which 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.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real invocation context (pass api_key, otherwise the response explains x402 payment, DE series are free to try) and routes the agent to follow-up tools (get_changes, register_alert). However it never says when to prefer this over get_series/get_snapshot, so the when-to-use selection guidance is only implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_snapshotA
Read-onlyIdempotent
Inspect

PAID ($0.02). Snapshot of every series for every country in one call. Pass api_key if you have one (instant card checkout at /pricing); otherwise the response explains how to pay via x402. Every DE series is free to try. After a 200, bind get_changes (free poll) or register_alert (HMAC push; Register: $0 · Delivery after trial: $0.05) on this series so a later gazette does not silently retire the value.

ParametersJSON Schema
NameRequiredDescriptionDefault
api_keyNoAPI key

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent on a free refusal or error; no charge
resultNoOne entry per country; every series value carries confidence_label, coverage_label and label_basis
countriesNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
x_next_bindNo
http_endpointNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/non-destructive/openWorld, so safety is handled. The description adds genuinely new behavior: a $0.02 cost, x402 fallback payment flow, a free DE trial, and the warning that an unbound series can be 'silently retired' by a later gazette. This is strong added context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the critical 'PAID ($0.02)' signal in the first token, which is the right priority. It is a single dense paragraph mixing purpose, pricing, auth and follow-up advice, so some promotional phrasing ('instant card checkout at /pricing') is not strictly necessary, but little is outright waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, and annotations cover the safety profile. The description supplies the missing commercial and lifecycle context (cost, payment, follow-up binding). It is essentially complete for correct invocation, with only the when-to-call routing gap remaining.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter at 100% schema coverage, so the baseline is 3. The description adds meaning beyond the schema's bare 'API key': it explains the optional-vs-paid path ('Pass api_key if you have one... otherwise the response explains how to pay via x402'), which tells the agent what happens when the param is omitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and an unusual scope: 'Snapshot of every series for every country in one call.' The phrase 'every series for every country in one call' distinguishes it from siblings like get_series/list_series/get_series_history without needing to open their schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operating context (pass api_key or pay via x402) and explicitly names the follow-up alternatives get_changes and register_alert with their cost model. It stops short of stating when to prefer this tool over list_series/get_series for a first call, so routing is implied rather than spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

is_business_dayIs it a business day?A
Read-onlyIdempotent
Inspect

FREE, unmetered. Is this date a business day in this country? Returns is_business_day, the reason (weekend, public_holiday, makeup_workday…), the holiday names, and the next and previous business day. Uses the country's national public-holiday calendar and its statutory weekend rule (Gulf Friday+Saturday, Israel Saturday-only, India 2nd/4th Saturdays, Nepal's 2026 change, China's multi-day breaks and make-up working days). A date in a year whose holidays we do not hold is refused with error year_not_held and the years_held list; it is never computed from weekends alone. A statutory holiday whose date is not yet fixed is refused as holiday_date_pending. Regional (sub-national) holidays are not applied.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateYesDate to classify, YYYY-MM-DD
countryYesISO 3166-1 alpha-2 country code, e.g. 'za', 'ae', 'in'. Every country we hold a holiday calendar for is accepted on every brand, not only this brand's region.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateNo
freeNo
yearNoOn year_not_held: the year we do not hold
basisNo
errorNoPresent on a free refusal or error; no charge
priceNo
reasonNo
caveatsNo
countryNo
reachedNoOn a refusal: the first date the calculation could not classify
weekdayNo
weekendNoWeekend days applied, the basis of that rule, and any dated or sub-national note
calendarNoHoliday calendar used: years_held, source, last_confirmed, stale
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
years_heldNoOn year_not_held: the years whose holidays we do hold
bind_seriesNo
explanationNo
x_next_bindNo
country_nameNo
http_endpointNo
is_weekend_dayNo
is_business_dayNo
public_holidaysNo
what_you_can_doNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card
next_business_dayNo{date, weekday}, or date null with why_unknown when it falls outside the held calendar
previous_business_dayNo

TDQS

A4.5/5.0
Behavior5/5

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), yet the description adds substantial behavior: the 'FREE, unmetered' cost signal, the refusal semantics (year_not_held with years_held, holiday_date_pending), the guarantee that results are never inferred from weekends alone, and the explicit exclusion of sub-national holidays. This is well beyond what structured fields convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the cost signal and the core question, followed by returns and then edge-case behavior; every clause carries operational information. The dense weekend-rule parenthetical is long but earns its place by pre-empting surprising classifications.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter classification tool with an output schema and full annotations, the description covers purpose, return shape, error/refusal paths, cost, and scope exclusions. Nothing an agent needs to call it correctly or interpret a refusal is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters (date YYYY-MM-DD, ISO alpha-2 country) are fully documented in the schema itself. The description reinforces the scope of 'country' (national calendar, accepted across brands) but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

'Is this date a business day in this country?' is a precise verb+resource, and the stated single-date classification scope implicitly separates it from the range-based siblings (business_days_between, count_working_days, add_business_days). The return summary (reason code, holiday names, adjacent business days) makes the operation unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description sets clear usage boundaries — it explicitly says regional/supranational holidays are not applied, that unheld years are refused, and which weekend regimes apply, which tells an agent when the answer is authoritative. It does not, however, name an alternative sibling (e.g. get_public_holidays_worldwide or count_working_days) or state when to prefer them, so it stops short of full when/when-not routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_seriesA
Read-onlyIdempotent
Inspect

FREE. Catalog of all euroref reference-data series: supported countries, series ids, descriptions, freshness metadata and per-series URLs. Call this first to discover what data exists. Paid answer tools accept receipt=true (included in the answer price, no extra USDC) and, on a paid success, return an Ed25519 answer receipt (kind answer_receipt). That receipt is not a series certified extract and is not legal advice. Series certified extracts are GET /v1/certified/{country}/{series} at $0.10 and are not an MCP tool. Verify a receipt with verify_answer_receipt (free, public key only) against /certified/public-key. get_changes is free. get_calendar is free. register_alert registration is free.

ParametersJSON Schema
NameRequiredDescriptionDefault
detailNoDefault false. Without country, false returns a compact index (country -> series ids). true returns the full catalog, which is large.
countryNoOptional ISO country code. Returns full per-series metadata (source, freshness, bands) for that country only.

Output Schema

ParametersJSON Schema
NameRequiredDescription
noteNo
errorNoPresent on a free refusal or error; no charge
countriesNoCountry entries ({country, name, series}); on an unknown-country refusal, the list of valid codes
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
x_next_bindNo
http_endpointNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint=false), and the description adds genuinely useful traits beyond them: the call is free, and detail=true returns 'a large' full catalog versus a compact index. The remaining receipt/certified-extract text concerns other tools rather than this one.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded, but the bulk of the text is off-topic for this tool — receipts, Ed25519 signatures, certified-extract URLs, verify_answer_receipt, and the free status of get_calendar/get_changes/register_alert. Much of it does not describe list_series at all and dilutes the signal.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the discovery role of the tool is adequately conveyed. However, the description spends most of its length on unrelated receipt and pricing mechanics, leaving the description padded rather than complete on this tool's own behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters (detail, country) are already fully documented, including the compact-vs-full catalog behavior and per-country expansion. The description adds no parameter detail beyond the schema, making 3 the correct baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a concrete verb and resource ('Catalog of all euroref reference-data series') and enumerates what the catalog contains. It distinguishes itself functionally from sibling get_series via 'Call this first to discover what data exists', though it never names that sibling directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit sequencing instruction: call this first to discover available data. It also notes which other tools are free (get_changes, get_calendar, register_alert), which aids routing, but it does not state when NOT to use list_series or contrast it with get_series/get_snapshot.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

register_alertAInspect

Bind a webhook so the next gazette does not silently stale a value you already paid for. REGISTERING IS FREE. Register: $0 · Delivery after trial: $0.05. First 3 deliveries are free; later deliveries are $0.05 and refunded if the webhook fails to send. HMAC-SHA256 signed. Two watch types on the same call: • series: ["za/vat-registration-threshold", "ke/", ""] → series.changed when the served value or its effective date moves. On usaref those watches are statutory (minimum-wage, income-tax, statutory-interest, sales-tax, public-holidays), not a FRED-macro subscription. • sources: [""] → source.changed when the document BYTES change (old/new sha256 + citing series). Bytes ≠ value. Value changes arrive as series.changed. Unknown URLs refuse free (source_not_fingerprinted). Max 20 series + 20 sources. Required: url. Optional: api_key stored on the subscription to fund deliveries after the trial. This call does not meter that key. Prefer this over polling get_changes if you are a long-running agent. This is retention, not a new data product.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYesWebhook endpoint that will receive HMAC-SHA256 signed events
seriesNoValue watches, e.g. ["za/vat-registration-threshold", "ke/*", "*"]
api_keyNoOptional prepaid key stored on the subscription to fund deliveries after the trial. This call does not meter it.
sourcesNoExact official-source URLs from a series source.url. Unknown URLs are refused free.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent on a free refusal or error; no charge
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
x_next_bindNo
http_endpointNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (openWorld, non-idempotent, non-destructive), the description discloses cost structure ($0 register, $0.05 delivery after trial, first 3 free, refunded on send failure), HMAC-SHA256 signing, hard limits (20 series + 20 sources), and refusal behavior (source_not_fingerprinted for unknown URLs). This is exactly the extra behavioral context an agent needs and cannot get from the 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded and the watch-type bullets are useful, but pricing is repeated ('REGISTERING IS FREE', '$0 · Delivery after trial: $0.05', 'First 3 deliveries are free'), and asides like 'not a FRED-macro subscription' and 'This is retention, not a new data product' are editorial noise. Several sentences do not earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the description covers costs, limits, signing, and error behavior well. It omits lifecycle details an agent would want: idempotency of repeated registrations (annotations flag idempotent=false) and how to remove or update a subscription. Minor but real gaps for a subscription-creating tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema coverage at 100%, the baseline is 3, but the description adds genuine meaning: it explains that series watches fire on value/effective-date movement (and contrasts statutory watches vs a FRED-macro subscription), that sources watches fire on document BYTES change with old/new sha256, and that api_key funds deliveries without being metered by this call. That goes meaningfully beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource (bind a webhook / register an alert) and spells out two watch types (series → series.changed, sources → source.changed). It even differentiates from the sibling get_changes. The opening sentence ('so the next gazette does not silently stale a value you already paid for') is indirect and marketing-flavored, delaying the actual purpose, which 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly routes the agent: 'Prefer this over polling get_changes if you are a long-running agent,' naming the alternative and the condition that selects it. It also implies the monitoring use case via the two watch types, but gives no explicit when-not guidance (e.g. one-shot checks or short-lived agents), 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.

settlement_dateA
Read-onlyIdempotent
Inspect

PAID ($0.02). Settlement/value date: the date n business days after a trade date, computed on the INTERSECTION of the calendars you name, with a per-day trail showing every skipped day and why, on which calendar. Supply business_days for a cycle you are trading under, or market + instrument_class to have a settlement cycle applied that we cite to its primary source (e.g. US equities T+1 under 17 CFR 240.15c6-1(a); UK gilts T+1 by DMO convention, which is NOT the T+2 equity cycle; Japan equities T+2 but JGBs T+1). Calendars are NATIONAL statutory holiday calendars with researched statutory weekend rules (Israel Saturday-only, Gulf Friday+Saturday, India Sundays plus the 2nd and 4th Saturday), NOT CSD or exchange calendars — each response states the basis and any known divergence. Use 'eu.t2' for the euro cash leg. We refuse FREE rather than guess: beyond published calendar coverage, no cited cycle for the instrument (government bonds never inherit an equity cycle), a cycle not in force on the trade date, or FX spot value dates. Free companion: GET /settlement-conventions. Optional receipt (boolean, default false): on a paid success, include an Ed25519 answer receipt at no extra USDC. An answer receipt is not a series certified extract (GET /v1/certified/{country}/{series} is $0.10 and is not an MCP tool) and is not legal advice. Verify with verify_answer_receipt against /certified/public-key.

ParametersJSON Schema
NameRequiredDescriptionDefault
marketNoISO country of the market whose cited cycle should apply (with instrument_class)
api_keyNoAPI key (bypasses x402; metered for invoicing)
receiptNoDefault false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool).
calendarsYesCalendar ids to intersect: two-letter ISO country codes, plus 'eu.t2' for the euro cash leg
trade_dateYesTrade/reference date, YYYY-MM-DD. Day 0: never counted, never rolled.
business_daysNoThe offset you are trading under (T+n)
instrument_classNoInstrument class — a government bond never inherits an equity cycle

Output Schema

ParametersJSON Schema
NameRequiredDescription
basisNo
errorNoPresent on a free refusal or error; no charge
statusNoAnswer status, e.g. computed or an honest no-answer status
countryNo
receiptNoEd25519 answer receipt when receipt=true on a paid success
questionNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
provenanceNoCited official sources behind the answer
bind_seriesNo
explanationNo
label_basisNoInputs and the rule ids that produced the two labels
x_next_bindNo
http_endpointNo
coverage_labelNoHow much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules
confidence_labelNoEvidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds substantial context beyond them: the $0.02 paid nature, the free-refusal policy, the statutory-vs-CSD calendar basis with stated divergence disclosure, and the optional Ed25519 receipt mechanics. This is exactly the kind of behavioral detail 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.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core definition is front-loaded, which is good, but the body is an overstuffed block that folds pricing, receipt semantics, legal disclaimers, and verification instructions into one paragraph. The receipt explanation is largely duplicated in the schema description, and the wall-of-text form hurts scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no prose, and the description still covers pricing, refusal behavior, calendar provenance, the receipt option, and how to verify it. For a paid, citation-bearing computation tool this leaves no material gap for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents every parameter; the description still adds meaning by explaining the market+instrument_class pairing, the 'eu.t2' pseudo-id for the euro cash leg, and the rule that government bonds never inherit an equity cycle. That is more than a restatement of the schema, though it does not add syntax detail for every field.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: compute a settlement/value date n business days after a trade date on the intersection of named calendars, with a per-day audit trail. The scope is precise enough to separate it from generic siblings like add_business_days or is_business_day, since it layers cited settlement cycles on top of plain calendar arithmetic.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing between the two input paths (business_days for a cycle you are trading under vs market + instrument_class for a cited cycle) and enumerates the refusal conditions (uncovered calendars, no cited cycle, cycle not in force, FX spot). It does not compare itself against sibling MCP tools, only a non-MCP companion endpoint, 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.

validate_tax_idA
Read-onlyIdempotent
Inspect

PAID ($0.003). Offline format and check-digit validation of a business tax ID or VAT number for one country of this brand: valid/invalid, normalised form, id type, check level (checksum only where the authority publishes the algorithm) and why it failed, with official sources. Does not confirm registration; follow official_lookup for that. Countries without a sourced rule answer free with status 'unknown'. Pass api_key if you have one; otherwise the response explains how to pay via x402. After a 200, bind get_changes (free poll) or register_alert (HMAC push; Register: $0 · Delivery after trial: $0.05) on this series so a later gazette does not silently retire the value.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe tax ID / VAT number as written; spaces, dots, dashes and a VAT country prefix are accepted
api_keyNoAPI key
countryYesISO country code

Output Schema

ParametersJSON Schema
NameRequiredDescription
as_ofNo
errorNoPresent on a free refusal or error; no charge
validNo
reasonNo
statusNo
countryNo
id_typeNo
sourcesNo
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
normalisedNo
bind_seriesNo
check_levelNo
explanationNo
reason_codeNo
x_next_bindNo
http_endpointNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the annotations: pricing ($0.003), the free 'unknown' status for countries without a sourced rule, the x402 payment fallback, the meaning of check level (checksum only where the authority publishes the algorithm), and the post-200 alerting model with its own costs. Idempotency/read-only safety is already covered by annotations; this adds cost, coverage-gap, and result-shape context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The price and core purpose are front-loaded in the first clause, and each subsequent sentence carries operational information (coverage gaps, payment, follow-up binding). It is dense and long-winded with several stacked parentheticals, which slightly hurts scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is unnecessary; the description instead covers the non-obvious essentials an agent needs — cost, auth/payment path, coverage limitations, and next-step tools. Nothing material is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and all three parameters carry descriptions (including accepted id formatting and the ISO enum), so the schema does the heavy lifting. The description adds only indirect value via output concepts like 'normalised form' and 'why it failed', not parameter-level guidance, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Offline format and check-digit validation of a business tax ID or VAT number for one country of this brand') with explicit scope (offline, per-country, checksum-only-where-published). An agent can distinguish it from calculation siblings like compute_vat or list_series 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit boundaries: 'Does not confirm registration; follow official_lookup for that', plus the free path for unsourced countries and the follow-up routing ('bind get_changes ... or register_alert'). It also states the payment condition ('Pass api_key if you have one; otherwise ... x402'), which tells the agent exactly how to proceed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_answer_receiptA
Read-onlyIdempotent
Inspect

FREE. Verify an answer receipt (kind answer_receipt) with the Ed25519 public key only. Pass the receipt object or its canonical JSON, signature_value when the signature is not inside the receipt, and public_key_pem to verify offline. If public_key_pem is omitted, the tool may GET signature.public_key (/certified/public-key) and read public_key_pem. Never send a private key. A valid signature shows this service issued that exact receipt. It does not turn the receipt into a series certified extract (GET /v1/certified/{country}/{series} at $0.10, not an MCP tool) and it is not legal advice. Same key and canonical-JSON rule as /certified/public-key.

ParametersJSON Schema
NameRequiredDescriptionDefault
receiptYesAnswer receipt object (signature may be nested) or the canonical JSON of that object. A canonical JSON string of the signed body (signature omitted) is accepted when signature_value is also passed.
public_key_pemNoSPKI public key PEM from GET /certified/public-key (field public_key_pem). Required for offline verify. A private key PEM is refused.
public_key_urlNoOptional GET /certified/public-key URL used only when public_key_pem is omitted. Ignored when the PEM is present.
signature_valueNoBase64 Ed25519 signature. Required when the receipt object or JSON string does not already include signature.value. Overrides a nested signature when both are sent.

Output Schema

ParametersJSON Schema
NameRequiredDescription
okNo
whyNo
errorNoPresent on a free refusal or error; no charge
no_chargeNo
price_usdNo
disclaimerNo
how_to_payNo
bind_seriesNo
explanationNo
x_next_bindNo
http_endpointNo
payment_requiredNotrue when the call needs payment; how_to_pay explains x402 or card

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, openWorld and non-destructive. The description adds real context beyond them: it discloses that the tool may perform a network GET of /certified/public-key when the PEM is absent, that it is FREE, and that a private key must never be sent. It does not discuss failure modes or error behavior, so it is useful but not exhaustive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with 'FREE. Verify...' and dense with no filler, though the closing 'Same key and canonical-JSON rule as /certified/public-key' and the repeated canonical-JSON instruction are mildly redundant. Appropriate length for a cryptographic verification tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and the description covers offline vs. online verification, cost, security constraints, and scope limits. Nothing an agent needs 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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description largely restates what the schema documents (public_key_pem requirement, public_key_url only used when the PEM is absent, signature_value overriding a nested signature) and adds only the canonical-JSON rule and the private-key refusal warning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (verify) plus resource (answer receipt) and the exact cryptographic method (Ed25519 public key only). It also sharply bounds the claim of what a valid result means, so an agent can distinguish this from any sibling 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says what to pass (receipt object or canonical JSON, signature_value when the signature is not nested, public_key_pem for offline) and what happens when public_key_pem is omitted. It names the alternative path (GET /v1/certified/{country}/{series} at $0.10, explicitly not an MCP tool) and states the exclusion that a valid signature is not a certified extract.

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.

  1. 16 tool updates
    • Changedcheck_minimum_wage4 fields changed
      • removedOutput schema / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedcompare_series4 fields changed
      • removedOutput schema / properties / rows / items / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / rows / items / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / rows / items / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / rows / items / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedcompute_employment_cost4 fields changed
      • removedOutput schema / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedcompute_income_tax4 fields changed
      • removedOutput schema / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedcompute_statutory_interest4 fields changed
      • removedOutput schema / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedcompute_vat4 fields changed
      • removedOutput schema / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedcount_working_days4 fields changed
      • removedOutput schema / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedget_country_brief4 fields changed
      • removedOutput schema / properties / series / items / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / series / items / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / series / items / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / series / items / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedget_filing_deadlines4 fields changed
      • removedOutput schema / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedget_public_holidays4 fields changed
      • removedOutput schema / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedget_public_holidays_worldwide4 fields changed
      • removedOutput schema / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedget_series4 fields changed
      • removedOutput schema / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedget_series_history8 fields changed
      • removedOutput schema / properties / entries / items / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / entries / items / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / entries / items / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / entries / items / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedget_snapshot4 fields changed
      • removedOutput schema / properties / result / items / properties / series / items / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / series / items / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / result / items / properties / series / items / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / result / items / properties / series / items / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedsettlement_date4 fields changed
      • removedOutput schema / properties / label_basis / properties / source_type / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / source_type / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / label_basis / properties / verification_age_days / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / label_basis / properties / verification_age_days / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedvalidate_tax_id6 fields changed
      • removedOutput schema / properties / normalised / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / normalised / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / reason_code / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / reason_code / type
        Added value: +[
        +  "string",
        +  "null"
        +]
      • removedOutput schema / properties / valid / anyOf
        Removed value: -[
        -  {
        -    "type": "boolean"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / valid / type
        Added value: +[
        +  "boolean",
        +  "null"
        +]
  2. 1 tool update
    • Addedvalidate_tax_id
  3. 2 tool updates
    • Addedcompare_series
    • Addedget_country_brief
  4. 7 tool updates
    • Changedcheck_minimum_wage1 field changed
      • changedInput schema / properties / receipt / description
        Previous value: -"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool)."New value: +"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool)."
    • Changedcompute_employment_cost1 field changed
      • changedInput schema / properties / receipt / description
        Previous value: -"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool)."New value: +"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool)."
    • Changedcompute_income_tax1 field changed
      • changedInput schema / properties / receipt / description
        Previous value: -"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool)."New value: +"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool)."
    • Changedcompute_statutory_interest1 field changed
      • changedInput schema / properties / receipt / description
        Previous value: -"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool)."New value: +"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool)."
    • Changedcompute_vat1 field changed
      • changedInput schema / properties / receipt / description
        Previous value: -"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool)."New value: +"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool)."
    • Changedcount_working_days1 field changed
      • changedInput schema / properties / receipt / description
        Previous value: -"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool)."New value: +"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool)."
    • Changedsettlement_date1 field changed
      • changedInput schema / properties / receipt / description
        Previous value: -"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool)."New value: +"Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.10; that SKU is not an MCP tool)."
  5. 15 tool updates
    • Changedcheck_minimum_wage3 fields changed
      • addedOutput schema / properties / confidence_label
        Added value: +{
        +  "description": "Evidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules",
        +  "enum": [
        +    "high",
        +    "medium",
        +    "low"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / coverage_label
        Added value: +{
        +  "description": "How much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules",
        +  "enum": [
        +    "ready",
        +    "partial",
        +    "gap"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / label_basis
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Inputs and the rule ids that produced the two labels",
        +  "properties": {
        +    "confidence_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "coverage_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "inputs": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "rules": {
        +      "type": "string"
        +    },
        +    "rules_version": {
        +      "type": "string"
        +    },
        +    "source_type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "verification_age_days": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcompute_employment_cost3 fields changed
      • addedOutput schema / properties / confidence_label
        Added value: +{
        +  "description": "Evidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules",
        +  "enum": [
        +    "high",
        +    "medium",
        +    "low"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / coverage_label
        Added value: +{
        +  "description": "How much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules",
        +  "enum": [
        +    "ready",
        +    "partial",
        +    "gap"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / label_basis
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Inputs and the rule ids that produced the two labels",
        +  "properties": {
        +    "confidence_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "coverage_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "inputs": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "rules": {
        +      "type": "string"
        +    },
        +    "rules_version": {
        +      "type": "string"
        +    },
        +    "source_type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "verification_age_days": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcompute_income_tax3 fields changed
      • addedOutput schema / properties / confidence_label
        Added value: +{
        +  "description": "Evidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules",
        +  "enum": [
        +    "high",
        +    "medium",
        +    "low"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / coverage_label
        Added value: +{
        +  "description": "How much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules",
        +  "enum": [
        +    "ready",
        +    "partial",
        +    "gap"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / label_basis
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Inputs and the rule ids that produced the two labels",
        +  "properties": {
        +    "confidence_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "coverage_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "inputs": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "rules": {
        +      "type": "string"
        +    },
        +    "rules_version": {
        +      "type": "string"
        +    },
        +    "source_type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "verification_age_days": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcompute_statutory_interest3 fields changed
      • addedOutput schema / properties / confidence_label
        Added value: +{
        +  "description": "Evidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules",
        +  "enum": [
        +    "high",
        +    "medium",
        +    "low"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / coverage_label
        Added value: +{
        +  "description": "How much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules",
        +  "enum": [
        +    "ready",
        +    "partial",
        +    "gap"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / label_basis
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Inputs and the rule ids that produced the two labels",
        +  "properties": {
        +    "confidence_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "coverage_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "inputs": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "rules": {
        +      "type": "string"
        +    },
        +    "rules_version": {
        +      "type": "string"
        +    },
        +    "source_type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "verification_age_days": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcompute_vat3 fields changed
      • addedOutput schema / properties / confidence_label
        Added value: +{
        +  "description": "Evidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules",
        +  "enum": [
        +    "high",
        +    "medium",
        +    "low"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / coverage_label
        Added value: +{
        +  "description": "How much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules",
        +  "enum": [
        +    "ready",
        +    "partial",
        +    "gap"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / label_basis
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Inputs and the rule ids that produced the two labels",
        +  "properties": {
        +    "confidence_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "coverage_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "inputs": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "rules": {
        +      "type": "string"
        +    },
        +    "rules_version": {
        +      "type": "string"
        +    },
        +    "source_type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "verification_age_days": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcount_working_days3 fields changed
      • addedOutput schema / properties / confidence_label
        Added value: +{
        +  "description": "Evidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules",
        +  "enum": [
        +    "high",
        +    "medium",
        +    "low"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / coverage_label
        Added value: +{
        +  "description": "How much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules",
        +  "enum": [
        +    "ready",
        +    "partial",
        +    "gap"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / label_basis
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Inputs and the rule ids that produced the two labels",
        +  "properties": {
        +    "confidence_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "coverage_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "inputs": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "rules": {
        +      "type": "string"
        +    },
        +    "rules_version": {
        +      "type": "string"
        +    },
        +    "source_type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "verification_age_days": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Addedget_filing_deadlines
    • Addedget_key_balance
    • Changedget_public_holidays3 fields changed
      • addedOutput schema / properties / confidence_label
        Added value: +{
        +  "description": "Evidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules",
        +  "enum": [
        +    "high",
        +    "medium",
        +    "low"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / coverage_label
        Added value: +{
        +  "description": "How much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules",
        +  "enum": [
        +    "ready",
        +    "partial",
        +    "gap"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / label_basis
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Inputs and the rule ids that produced the two labels",
        +  "properties": {
        +    "confidence_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "coverage_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "inputs": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "rules": {
        +      "type": "string"
        +    },
        +    "rules_version": {
        +      "type": "string"
        +    },
        +    "source_type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "verification_age_days": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Addedget_public_holidays_worldwide
    • Changedget_series3 fields changed
      • addedOutput schema / properties / confidence_label
        Added value: +{
        +  "description": "Evidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules",
        +  "enum": [
        +    "high",
        +    "medium",
        +    "low"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / coverage_label
        Added value: +{
        +  "description": "How much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules",
        +  "enum": [
        +    "ready",
        +    "partial",
        +    "gap"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / label_basis
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Inputs and the rule ids that produced the two labels",
        +  "properties": {
        +    "confidence_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "coverage_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "inputs": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "rules": {
        +      "type": "string"
        +    },
        +    "rules_version": {
        +      "type": "string"
        +    },
        +    "source_type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "verification_age_days": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_series_history7 fields changed
      • changedOutput schema / description
        Previous value: -"Historical entries of one series"New value: +"Historical entries of one series; top-level labels describe the current value, and each entry carries its own"
      • addedOutput schema / properties / confidence_label
        Added value: +{
        +  "description": "Evidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules",
        +  "enum": [
        +    "high",
        +    "medium",
        +    "low"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / coverage_label
        Added value: +{
        +  "description": "How much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules",
        +  "enum": [
        +    "ready",
        +    "partial",
        +    "gap"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / entries / items / additionalProperties
        Added value: +{}
      • addedOutput schema / properties / entries / items / properties
        Added value: +{
        +  "confidence": {},
        +  "confidence_label": {
        +    "description": "Evidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules",
        +    "enum": [
        +      "high",
        +      "medium",
        +      "low"
        +    ],
        +    "type": "string"
        +  },
        +  "country": {
        +    "type": "string"
        +  },
        +  "coverage_label": {
        +    "description": "How much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules",
        +    "enum": [
        +      "ready",
        +      "partial",
        +      "gap"
        +    ],
        +    "type": "string"
        +  },
        +  "effective_from": {},
        +  "label_basis": {
        +    "additionalProperties": {},
        +    "description": "Inputs and the rule ids that produced the two labels",
        +    "properties": {
        +      "confidence_reasons": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "coverage_reasons": {
        +        "items": {
        +          "type": "string"
        +        },
        +        "type": "array"
        +      },
        +      "inputs": {
        +        "items": {},
        +        "type": "array"
        +      },
        +      "rules": {
        +        "type": "string"
        +      },
        +      "rules_version": {
        +        "type": "string"
        +      },
        +      "source_type": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      },
        +      "stale": {
        +        "type": "boolean"
        +      },
        +      "verification_age_days": {
        +        "anyOf": [
        +          {
        +            "type": "number"
        +          },
        +          {
        +            "type": "null"
        +          }
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "last_confirmed": {},
        +  "notes": {},
        +  "series": {
        +    "type": "string"
        +  },
        +  "source": {},
        +  "stale": {
        +    "type": "boolean"
        +  },
        +  "unit": {},
        +  "value": {}
        +}
      • addedOutput schema / properties / entries / items / type
        Added value: +"object"
      • addedOutput schema / properties / label_basis
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Inputs and the rule ids that produced the two labels",
        +  "properties": {
        +    "confidence_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "coverage_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "inputs": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "rules": {
        +      "type": "string"
        +    },
        +    "rules_version": {
        +      "type": "string"
        +    },
        +    "source_type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "verification_age_days": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_snapshot1 field changed
      • addedOutput schema / properties / result
        Added value: +{
        +  "description": "One entry per country; every series value carries confidence_label, coverage_label and label_basis",
        +  "items": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "country": {
        +        "type": "string"
        +      },
        +      "series": {
        +        "items": {
        +          "additionalProperties": {},
        +          "properties": {
        +            "confidence": {},
        +            "confidence_label": {
        +              "description": "Evidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules",
        +              "enum": [
        +                "high",
        +                "medium",
        +                "low"
        +              ],
        +              "type": "string"
        +            },
        +            "country": {
        +              "type": "string"
        +            },
        +            "coverage_label": {
        +              "description": "How much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules",
        +              "enum": [
        +                "ready",
        +                "partial",
        +                "gap"
        +              ],
        +              "type": "string"
        +            },
        +            "effective_from": {},
        +            "label_basis": {
        +              "additionalProperties": {},
        +              "description": "Inputs and the rule ids that produced the two labels",
        +              "properties": {
        +                "confidence_reasons": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                },
        +                "coverage_reasons": {
        +                  "items": {
        +                    "type": "string"
        +                  },
        +                  "type": "array"
        +                },
        +                "inputs": {
        +                  "items": {},
        +                  "type": "array"
        +                },
        +                "rules": {
        +                  "type": "string"
        +                },
        +                "rules_version": {
        +                  "type": "string"
        +                },
        +                "source_type": {
        +                  "anyOf": [
        +                    {
        +                      "type": "string"
        +                    },
        +                    {
        +                      "type": "null"
        +                    }
        +                  ]
        +                },
        +                "stale": {
        +                  "type": "boolean"
        +                },
        +                "verification_age_days": {
        +                  "anyOf": [
        +                    {
        +                      "type": "number"
        +                    },
        +                    {
        +                      "type": "null"
        +                    }
        +                  ]
        +                }
        +              },
        +              "type": "object"
        +            },
        +            "last_confirmed": {},
        +            "notes": {},
        +            "series": {
        +              "type": "string"
        +            },
        +            "source": {},
        +            "stale": {
        +              "type": "boolean"
        +            },
        +            "unit": {},
        +            "value": {}
        +          },
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
    • Changedlist_series1 field changed
      • changedOutput schema / description
        Previous value: -"Catalog: brand metadata plus countries[] (compact: country, name, series ids; with country or detail: full per-series metadata)"New value: +"Catalog: brand metadata plus countries[] (compact: country, name, series ids; with country or detail: full per-series metadata including confidence_label and coverage_label)"
    • Changedsettlement_date3 fields changed
      • addedOutput schema / properties / confidence_label
        Added value: +{
        +  "description": "Evidence verdict derived from source type, verification age and the stale flag (answers: the weakest series read). Rules at /label-rules",
        +  "enum": [
        +    "high",
        +    "medium",
        +    "low"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / coverage_label
        Added value: +{
        +  "description": "How much of the question is covered: ready = complete; partial = held with a disclosed limitation or default; gap = no number served. Rules at /label-rules",
        +  "enum": [
        +    "ready",
        +    "partial",
        +    "gap"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / label_basis
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Inputs and the rule ids that produced the two labels",
        +  "properties": {
        +    "confidence_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "coverage_reasons": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "inputs": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "rules": {
        +      "type": "string"
        +    },
        +    "rules_version": {
        +      "type": "string"
        +    },
        +    "source_type": {
        +      "anyOf": [
        +        {
        +          "type": "string"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    },
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "verification_age_days": {
        +      "anyOf": [
        +        {
        +          "type": "number"
        +        },
        +        {
        +          "type": "null"
        +        }
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
  6. 3 tool updates
    • Addedadd_business_days
    • Addedbusiness_days_between
    • Addedis_business_day
  7. 16 tool updates
    • Changedcheck_minimum_wage1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Minimum-wage compliance verdict",
        +  "properties": {
        +    "basis": {},
        +    "bind_series": {},
        +    "country": {
        +      "type": "string"
        +    },
        +    "disclaimer": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "floor": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "provenance": {
        +      "description": "Cited official sources behind the answer"
        +    },
        +    "question": {},
        +    "receipt": {
        +      "description": "Ed25519 answer receipt when receipt=true on a paid success"
        +    },
        +    "status": {
        +      "description": "Answer status, e.g. computed or an honest no-answer status",
        +      "type": "string"
        +    },
        +    "verdict": {},
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedcompute_employment_cost1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Employee and employer statutory contributions with citations",
        +  "properties": {
        +    "basis": {},
        +    "bind_series": {},
        +    "country": {
        +      "type": "string"
        +    },
        +    "disclaimer": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "provenance": {
        +      "description": "Cited official sources behind the answer"
        +    },
        +    "question": {},
        +    "receipt": {
        +      "description": "Ed25519 answer receipt when receipt=true on a paid success"
        +    },
        +    "status": {
        +      "description": "Answer status, e.g. computed or an honest no-answer status",
        +      "type": "string"
        +    },
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedcompute_income_tax1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Income tax on taxable income with per-bracket workings",
        +  "properties": {
        +    "basis": {},
        +    "bind_series": {},
        +    "breakdown": {},
        +    "country": {
        +      "type": "string"
        +    },
        +    "disclaimer": {},
        +    "effective_rate": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "marginal_rate": {},
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "provenance": {
        +      "description": "Cited official sources behind the answer"
        +    },
        +    "question": {},
        +    "receipt": {
        +      "description": "Ed25519 answer receipt when receipt=true on a paid success"
        +    },
        +    "scope_note": {},
        +    "status": {
        +      "description": "Answer status, e.g. computed or an honest no-answer status",
        +      "type": "string"
        +    },
        +    "tax": {},
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedcompute_statutory_interest1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Simple statutory interest at the cited rate",
        +  "properties": {
        +    "basis": {},
        +    "bind_series": {},
        +    "country": {
        +      "type": "string"
        +    },
        +    "disclaimer": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "provenance": {
        +      "description": "Cited official sources behind the answer"
        +    },
        +    "question": {},
        +    "receipt": {
        +      "description": "Ed25519 answer receipt when receipt=true on a paid success"
        +    },
        +    "status": {
        +      "description": "Answer status, e.g. computed or an honest no-answer status",
        +      "type": "string"
        +    },
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedcompute_vat1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "VAT breakdown",
        +  "properties": {
        +    "basis": {},
        +    "bind_series": {},
        +    "country": {
        +      "type": "string"
        +    },
        +    "disclaimer": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "gross": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "net": {},
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "provenance": {
        +      "description": "Cited official sources behind the answer"
        +    },
        +    "question": {},
        +    "rate": {},
        +    "receipt": {
        +      "description": "Ed25519 answer receipt when receipt=true on a paid success"
        +    },
        +    "status": {
        +      "description": "Answer status, e.g. computed or an honest no-answer status",
        +      "type": "string"
        +    },
        +    "tax": {},
        +    "workings": {},
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedcount_working_days1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Working-day count over a range with holidays hit",
        +  "properties": {
        +    "basis": {},
        +    "bind_series": {},
        +    "country": {
        +      "type": "string"
        +    },
        +    "disclaimer": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "provenance": {
        +      "description": "Cited official sources behind the answer"
        +    },
        +    "question": {},
        +    "receipt": {
        +      "description": "Ed25519 answer receipt when receipt=true on a paid success"
        +    },
        +    "status": {
        +      "description": "Answer status, e.g. computed or an honest no-answer status",
        +      "type": "string"
        +    },
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedget_calendar1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Derived reverify_by and next_effective_known dates",
        +  "properties": {
        +    "as_of": {},
        +    "bind_series": {},
        +    "brand": {},
        +    "count": {
        +      "type": "number"
        +    },
        +    "disclaimer": {},
        +    "entries": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedget_changes1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Value changes since a date",
        +  "properties": {
        +    "as_of": {},
        +    "bind_series": {},
        +    "changes": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "disclaimer": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "since": {},
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedget_public_holidays1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Holiday calendar series with cited source; with subdivision, merged national+regional days",
        +  "properties": {
        +    "available_subdivisions": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "bind_series": {},
        +    "confidence": {},
        +    "country": {
        +      "type": "string"
        +    },
        +    "disclaimer": {},
        +    "effective_from": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "last_confirmed": {},
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "notes": {},
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "series": {
        +      "type": "string"
        +    },
        +    "source": {},
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "subdivision": {},
        +    "unit": {},
        +    "value": {},
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedget_series1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Current value of one series with source, effective date, last_confirmed and stale flag",
        +  "properties": {
        +    "bind_series": {},
        +    "confidence": {},
        +    "country": {
        +      "type": "string"
        +    },
        +    "disclaimer": {},
        +    "effective_from": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "last_confirmed": {},
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "notes": {},
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "series": {
        +      "type": "string"
        +    },
        +    "source": {},
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "unit": {},
        +    "value": {},
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedget_series_history1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Historical entries of one series",
        +  "properties": {
        +    "bind_series": {},
        +    "country": {
        +      "type": "string"
        +    },
        +    "disclaimer": {},
        +    "entries": {
        +      "items": {},
        +      "type": "array"
        +    },
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "series": {
        +      "type": "string"
        +    },
        +    "stale": {
        +      "type": "boolean"
        +    },
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedget_snapshot1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Every series for every country of this brand",
        +  "properties": {
        +    "bind_series": {},
        +    "countries": {},
        +    "disclaimer": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedlist_series1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Catalog: brand metadata plus countries[] (compact: country, name, series ids; with country or detail: full per-series metadata)",
        +  "properties": {
        +    "bind_series": {},
        +    "countries": {
        +      "description": "Country entries ({country, name, series}); on an unknown-country refusal, the list of valid codes",
        +      "items": {},
        +      "type": "array"
        +    },
        +    "disclaimer": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "note": {
        +      "type": "string"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedregister_alert1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Alert subscription result (id, secret, trial) or refusal",
        +  "properties": {
        +    "bind_series": {},
        +    "disclaimer": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedsettlement_date1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Settlement date on intersected calendars with per-day trail",
        +  "properties": {
        +    "basis": {},
        +    "bind_series": {},
        +    "country": {
        +      "type": "string"
        +    },
        +    "disclaimer": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "provenance": {
        +      "description": "Cited official sources behind the answer"
        +    },
        +    "question": {},
        +    "receipt": {
        +      "description": "Ed25519 answer receipt when receipt=true on a paid success"
        +    },
        +    "status": {
        +      "description": "Answer status, e.g. computed or an honest no-answer status",
        +      "type": "string"
        +    },
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
    • Changedverify_answer_receipt1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Receipt verification result",
        +  "properties": {
        +    "bind_series": {},
        +    "disclaimer": {},
        +    "error": {
        +      "description": "Present on a free refusal or error; no charge"
        +    },
        +    "explanation": {},
        +    "how_to_pay": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "http_endpoint": {
        +      "type": "string"
        +    },
        +    "no_charge": {
        +      "type": "boolean"
        +    },
        +    "ok": {
        +      "type": "boolean"
        +    },
        +    "payment_required": {
        +      "description": "true when the call needs payment; how_to_pay explains x402 or card",
        +      "type": "boolean"
        +    },
        +    "price_usd": {
        +      "type": "number"
        +    },
        +    "why": {
        +      "type": "string"
        +    },
        +    "x_next_bind": {}
        +  },
        +  "type": "object"
        +}
  8. 1 tool update
    • Changedlist_series2 fields changed
      • addedInput schema / properties / country
        Added value: +{
        +  "description": "Optional ISO country code. Returns full per-series metadata (source, freshness, bands) for that country only.",
        +  "type": "string"
        +}
      • addedInput schema / properties / detail
        Added value: +{
        +  "description": "Default false. Without country, false returns a compact index (country -> series ids). true returns the full catalog, which is large.",
        +  "type": "boolean"
        +}
  9. 1 tool update
    • Addedget_calendar
  10. 1 tool update
    • Addedcompute_statutory_interest
  11. 7 tool updates
    • Changedcheck_minimum_wage1 field changed
      • addedInput schema / properties / receipt
        Added value: +{
        +  "default": false,
        +  "description": "Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool).",
        +  "type": "boolean"
        +}
    • Changedcompute_employment_cost1 field changed
      • addedInput schema / properties / receipt
        Added value: +{
        +  "default": false,
        +  "description": "Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool).",
        +  "type": "boolean"
        +}
    • Changedcompute_income_tax1 field changed
      • addedInput schema / properties / receipt
        Added value: +{
        +  "default": false,
        +  "description": "Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool).",
        +  "type": "boolean"
        +}
    • Changedcompute_vat1 field changed
      • addedInput schema / properties / receipt
        Added value: +{
        +  "default": false,
        +  "description": "Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool).",
        +  "type": "boolean"
        +}
    • Changedcount_working_days1 field changed
      • addedInput schema / properties / receipt
        Added value: +{
        +  "default": false,
        +  "description": "Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool).",
        +  "type": "boolean"
        +}
    • Changedsettlement_date1 field changed
      • addedInput schema / properties / receipt
        Added value: +{
        +  "default": false,
        +  "description": "Default false. When true, a paid success includes an Ed25519 answer receipt (kind answer_receipt) at no extra USDC. Unpaid 402 and free refusals do not include one. Not a series certified extract (GET /v1/certified/{country}/{series} at $0.25; that SKU is not an MCP tool).",
        +  "type": "boolean"
        +}
    • Addedverify_answer_receipt
  12. 2 tool updates
    • Addedget_changes
    • Addedregister_alert
  13. 1 tool update
    • Addedcompute_employment_cost
  14. 7 tool updates
    • Changedcheck_minimum_wage1 field changed
      • changedInput schema / properties / country / enum
        Previous value: -[
        -  "at",
        -  "be",
        -  "bg",
        -  "ch",
        -  "cz",
        -  "de",
        -  "dk",
        -  "ee",
        -  "es",
        -  "eu",
        -  "fi",
        -  "fr",
        -  "gb",
        -  "gr",
        -  "hu",
        -  "ie",
        -  "is",
        -  "it",
        -  "lt",
        -  "lv",
        -  "nl",
        -  "no",
        -  "pl",
        -  "pt",
        -  "ro",
        -  "rs",
        -  "se",
        -  "tr",
        -  "ua"
        -]New value: +[
        +  "at",
        +  "be",
        +  "bg",
        +  "ch",
        +  "cy",
        +  "cz",
        +  "de",
        +  "dk",
        +  "ee",
        +  "es",
        +  "eu",
        +  "fi",
        +  "fr",
        +  "gb",
        +  "gr",
        +  "hr",
        +  "hu",
        +  "ie",
        +  "is",
        +  "it",
        +  "lt",
        +  "lu",
        +  "lv",
        +  "mt",
        +  "nl",
        +  "no",
        +  "pl",
        +  "pt",
        +  "ro",
        +  "rs",
        +  "se",
        +  "si",
        +  "sk",
        +  "tr",
        +  "ua"
        +]
    • Changedcompute_income_tax1 field changed
      • changedInput schema / properties / country / enum
        Previous value: -[
        -  "at",
        -  "be",
        -  "bg",
        -  "ch",
        -  "cz",
        -  "de",
        -  "dk",
        -  "ee",
        -  "es",
        -  "eu",
        -  "fi",
        -  "fr",
        -  "gb",
        -  "gr",
        -  "hu",
        -  "ie",
        -  "is",
        -  "it",
        -  "lt",
        -  "lv",
        -  "nl",
        -  "no",
        -  "pl",
        -  "pt",
        -  "ro",
        -  "rs",
        -  "se",
        -  "tr",
        -  "ua"
        -]New value: +[
        +  "at",
        +  "be",
        +  "bg",
        +  "ch",
        +  "cy",
        +  "cz",
        +  "de",
        +  "dk",
        +  "ee",
        +  "es",
        +  "eu",
        +  "fi",
        +  "fr",
        +  "gb",
        +  "gr",
        +  "hr",
        +  "hu",
        +  "ie",
        +  "is",
        +  "it",
        +  "lt",
        +  "lu",
        +  "lv",
        +  "mt",
        +  "nl",
        +  "no",
        +  "pl",
        +  "pt",
        +  "ro",
        +  "rs",
        +  "se",
        +  "si",
        +  "sk",
        +  "tr",
        +  "ua"
        +]
    • Changedcompute_vat1 field changed
      • changedInput schema / properties / country / enum
        Previous value: -[
        -  "at",
        -  "be",
        -  "bg",
        -  "ch",
        -  "cz",
        -  "de",
        -  "dk",
        -  "ee",
        -  "es",
        -  "eu",
        -  "fi",
        -  "fr",
        -  "gb",
        -  "gr",
        -  "hu",
        -  "ie",
        -  "is",
        -  "it",
        -  "lt",
        -  "lv",
        -  "nl",
        -  "no",
        -  "pl",
        -  "pt",
        -  "ro",
        -  "rs",
        -  "se",
        -  "tr",
        -  "ua"
        -]New value: +[
        +  "at",
        +  "be",
        +  "bg",
        +  "ch",
        +  "cy",
        +  "cz",
        +  "de",
        +  "dk",
        +  "ee",
        +  "es",
        +  "eu",
        +  "fi",
        +  "fr",
        +  "gb",
        +  "gr",
        +  "hr",
        +  "hu",
        +  "ie",
        +  "is",
        +  "it",
        +  "lt",
        +  "lu",
        +  "lv",
        +  "mt",
        +  "nl",
        +  "no",
        +  "pl",
        +  "pt",
        +  "ro",
        +  "rs",
        +  "se",
        +  "si",
        +  "sk",
        +  "tr",
        +  "ua"
        +]
    • Changedcount_working_days1 field changed
      • changedInput schema / properties / country / enum
        Previous value: -[
        -  "at",
        -  "be",
        -  "bg",
        -  "ch",
        -  "cz",
        -  "de",
        -  "dk",
        -  "ee",
        -  "es",
        -  "eu",
        -  "fi",
        -  "fr",
        -  "gb",
        -  "gr",
        -  "hu",
        -  "ie",
        -  "is",
        -  "it",
        -  "lt",
        -  "lv",
        -  "nl",
        -  "no",
        -  "pl",
        -  "pt",
        -  "ro",
        -  "rs",
        -  "se",
        -  "tr",
        -  "ua"
        -]New value: +[
        +  "at",
        +  "be",
        +  "bg",
        +  "ch",
        +  "cy",
        +  "cz",
        +  "de",
        +  "dk",
        +  "ee",
        +  "es",
        +  "eu",
        +  "fi",
        +  "fr",
        +  "gb",
        +  "gr",
        +  "hr",
        +  "hu",
        +  "ie",
        +  "is",
        +  "it",
        +  "lt",
        +  "lu",
        +  "lv",
        +  "mt",
        +  "nl",
        +  "no",
        +  "pl",
        +  "pt",
        +  "ro",
        +  "rs",
        +  "se",
        +  "si",
        +  "sk",
        +  "tr",
        +  "ua"
        +]
    • Changedget_public_holidays1 field changed
      • changedInput schema / properties / country / enum
        Previous value: -[
        -  "at",
        -  "be",
        -  "bg",
        -  "ch",
        -  "cz",
        -  "de",
        -  "dk",
        -  "ee",
        -  "es",
        -  "eu",
        -  "fi",
        -  "fr",
        -  "gb",
        -  "gr",
        -  "hu",
        -  "ie",
        -  "is",
        -  "it",
        -  "lt",
        -  "lv",
        -  "nl",
        -  "no",
        -  "pl",
        -  "pt",
        -  "ro",
        -  "rs",
        -  "se",
        -  "tr",
        -  "ua"
        -]New value: +[
        +  "at",
        +  "be",
        +  "bg",
        +  "ch",
        +  "cy",
        +  "cz",
        +  "de",
        +  "dk",
        +  "ee",
        +  "es",
        +  "eu",
        +  "fi",
        +  "fr",
        +  "gb",
        +  "gr",
        +  "hr",
        +  "hu",
        +  "ie",
        +  "is",
        +  "it",
        +  "lt",
        +  "lu",
        +  "lv",
        +  "mt",
        +  "nl",
        +  "no",
        +  "pl",
        +  "pt",
        +  "ro",
        +  "rs",
        +  "se",
        +  "si",
        +  "sk",
        +  "tr",
        +  "ua"
        +]
    • Changedget_series1 field changed
      • changedInput schema / properties / country / enum
        Previous value: -[
        -  "at",
        -  "be",
        -  "bg",
        -  "ch",
        -  "cz",
        -  "de",
        -  "dk",
        -  "ee",
        -  "es",
        -  "eu",
        -  "fi",
        -  "fr",
        -  "gb",
        -  "gr",
        -  "hu",
        -  "ie",
        -  "is",
        -  "it",
        -  "lt",
        -  "lv",
        -  "nl",
        -  "no",
        -  "pl",
        -  "pt",
        -  "ro",
        -  "rs",
        -  "se",
        -  "tr",
        -  "ua"
        -]New value: +[
        +  "at",
        +  "be",
        +  "bg",
        +  "ch",
        +  "cy",
        +  "cz",
        +  "de",
        +  "dk",
        +  "ee",
        +  "es",
        +  "eu",
        +  "fi",
        +  "fr",
        +  "gb",
        +  "gr",
        +  "hr",
        +  "hu",
        +  "ie",
        +  "is",
        +  "it",
        +  "lt",
        +  "lu",
        +  "lv",
        +  "mt",
        +  "nl",
        +  "no",
        +  "pl",
        +  "pt",
        +  "ro",
        +  "rs",
        +  "se",
        +  "si",
        +  "sk",
        +  "tr",
        +  "ua"
        +]
    • Changedget_series_history1 field changed
      • changedInput schema / properties / country / enum
        Previous value: -[
        -  "at",
        -  "be",
        -  "bg",
        -  "ch",
        -  "cz",
        -  "de",
        -  "dk",
        -  "ee",
        -  "es",
        -  "eu",
        -  "fi",
        -  "fr",
        -  "gb",
        -  "gr",
        -  "hu",
        -  "ie",
        -  "is",
        -  "it",
        -  "lt",
        -  "lv",
        -  "nl",
        -  "no",
        -  "pl",
        -  "pt",
        -  "ro",
        -  "rs",
        -  "se",
        -  "tr",
        -  "ua"
        -]New value: +[
        +  "at",
        +  "be",
        +  "bg",
        +  "ch",
        +  "cy",
        +  "cz",
        +  "de",
        +  "dk",
        +  "ee",
        +  "es",
        +  "eu",
        +  "fi",
        +  "fr",
        +  "gb",
        +  "gr",
        +  "hr",
        +  "hu",
        +  "ie",
        +  "is",
        +  "it",
        +  "lt",
        +  "lu",
        +  "lv",
        +  "mt",
        +  "nl",
        +  "no",
        +  "pl",
        +  "pt",
        +  "ro",
        +  "rs",
        +  "se",
        +  "si",
        +  "sk",
        +  "tr",
        +  "ua"
        +]

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    The standard VAT rate in any of the 27 EU member states on any date since 2016, including temporary cuts. Runs offline with no API key.
    4
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server for EU company and business data. 9 tools: company search (GLEIF, 2M+ entities), LEI lookup, corporate structures (parent/subsidiaries), trade register search, EU VAT validation (VIES), GDP, unemployment, inflation, and business demography (Eurostat). All APIs free, no keys required.
    9
    6
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources