Skip to main content
Glama

Afriref: cited government reference data

Server Details

Cited official data: tax, VAT, CPI, policy rates, wages, holidays, FX. 128 countries+EU, 7 regions.

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
98.3% over 77 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.7/5.0

Scored across 35 tools

Disambiguation2/5

Several tools have unclear boundaries, most damagingly the working-day family: is_business_day, add_business_days and business_days_between are FREE while count_working_days ($0.002) covers nearly identical ground, and settlement_date overlaps add_business_days. Likewise get_filing_deadlines ($0.003) vs next_filings ($0.35), get_public_holidays vs get_public_holidays_worldwide, and compute_vat vs charge_sale vs invoice_check vs invoice_payable force the agent to reverse-engineer scope and price differences from long descriptions rather than distinct tool purposes.

Naming Consistency4/5

The set is overwhelmingly consistent snake_case with a verb_noun shape (get_series, compute_vat, validate_tax_id, verify_answer_receipt, register_alert). Deviations exist — noun phrases like domain_age, evidence_pack, next_filings, settlement_date, invoice_payable, plus ordering quirks (hire_compare vs compare_series) — but they remain readable and predictable.

Tool Count2/5

35 tools is heavy for a reference-data service, and the count is inflated by redundant free/paid pairs (count_working_days vs business_days_between, next_filings vs get_filing_deadlines, get_public_holidays vs get_public_holidays_worldwide) rather than by distinct capabilities.

Completeness4/5

Coverage of the domain is genuinely broad: discovery (list_series), point reads, history, snapshots, cross-country comparison, change/freshness feeds, alerts with HMAC push, computations, compliance checks and receipt verification. Gaps are minor: register_alert has no list/unregister counterpart, and the repeatedly referenced certified-extract endpoint is explicitly not exposed as a tool.

Available Tools

35 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.

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

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.

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

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.

charge_saleA
Read-onlyIdempotent
Inspect

PAID ($0.50). Charge this sale: should this invoice carry VAT, which country's and how much - place of supply under the EU, UK and South Africa rules, net/VAT/gross, registration threshold, rule cited. Omit buyer_country for single-country rate maths. Anything we cannot answer in full is refused free (coverage_gap, no_charge). Shares the 3 free calls per IP per day with the answer tools. Pass api_key if you have one (card checkout at /pricing); otherwise the result is the x402 payment requirement. 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.

NameRequiredDescriptionDefault
bandNoVAT band key, e.g. reduced
amountYesSale amount
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).
amount_isNonet adds VAT (default); gross extracts it
buyer_typeNoDefault unknown
buyer_countryNoOmit for single-country rate maths
seller_countryYesISO 3166-1 alpha-2 (EL = Greece, UK = United Kingdom)

Output Schema

NameRequiredDescription
jobNo
errorNoPresent on a free refusal or error; no charge
statusNo
evidenceNo
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 (readOnly/idempotent/openWorld), it discloses pricing ($0.50), the x402 payment flow, shared rate limits (3 free calls per IP per day), free refusals on incomplete coverage (coverage_gap, no_charge), and receipt issuance/verification semantics. This is unusually rich behavioral disclosure for a paid tool.

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?

It is front-loaded with the price and action, but the remainder is a dense run-on mixing pricing, payment, rate limits, receipt semantics, and verification. The receipt explanation partially duplicates the schema's own description, adding some redundancy.

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 described, and the description covers payment, refusals, limits, and receipt behavior. It is close to complete for a complex paid tool, missing only explicit sibling routing.

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 already 100%, so the baseline is 3, but the description adds genuine semantics: omitting buyer_country for single-country maths, api_key bypassing x402, and the receipt flag's effect on paid successes. It goes beyond restating the schema.

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 and resource ('Charge this sale') and enumerates the deliverable precisely: VAT applicability, place of supply under EU/UK/South Africa rules, net/VAT/gross, registration threshold, and rule cited. It distinguishes the answer receipt from the certified extract, though it does not explicitly differentiate itself from the sibling compute_vat.

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 gives concrete invocation conditions: 'Omit buyer_country for single-country rate maths', 'Pass api_key if you have one; otherwise the result is the x402 payment requirement', and the free-refusal behavior. However, it never routes the agent explicitly between charge_sale and the sibling compute_vat or charge_sale_certified.

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

charge_sale_certifiedA
Read-onlyIdempotent
Inspect

PAID ($0.75). The charge_sale dossier plus an Ed25519-signed certified extract of the governing VAT rate, for a filing. Refused free when the governing source cannot be certified right now. Anything we cannot answer in full is refused free (coverage_gap, no_charge). Shares the 3 free calls per IP per day with the answer tools. Pass api_key if you have one (card checkout at /pricing); otherwise the result is the x402 payment requirement. 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.

NameRequiredDescriptionDefault
bandNoVAT band key, e.g. reduced
amountYesSale amount
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).
amount_isNonet adds VAT (default); gross extracts it
buyer_typeNoDefault unknown
buyer_countryNoOmit for single-country rate maths
seller_countryYesISO 3166-1 alpha-2 (EL = Greece, UK = United Kingdom)

Output Schema

NameRequiredDescription
jobNo
errorNoPresent on a free refusal or error; no charge
statusNo
evidenceNo
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.4/5.0
Behavior5/5

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

Beyond the annotations it discloses price ($0.75), the free-refusal policy and its reasons, rate limiting (3 free/IP/day), auth paths (api_key bypasses x402), and exactly when a receipt is and is not included. This is unusually rich behavioral disclosure for a paid tool.

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?

It front-loads the price and the core deliverable, then the refusal policy, then auth. Efficient but dense, with the receipt/certified-extract distinction repeated in both description and schema, which costs a little polish.

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, complex, high-stakes tool this covers cost, payment paths, refusal semantics, rate limits, and verification route, and an output schema exists so return values need no prose. 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.

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 8 parameters including net/gross, buyer_type defaults and api_key bypass. The description largely restates the receipt flag rather than adding new parameter semantics, 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?

The opening line states a concrete verb, resource and price: 'charge_sale dossier plus an Ed25519-signed certified extract of the governing VAT rate.' It explicitly differentiates from the answer-receipt SKU and the non-MCP /v1/certified series extract, so an agent can situate it against sibling charge_sale and the answer tools.

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 gives strong operating context: use 'for a filing', refusal is free for coverage_gap/no_charge, 3 free calls per IP per day shared with answer tools, and api_key vs x402 fallback. What is missing is an explicit routing statement against the sibling charge_sale (when to pay $0.75 for certification vs the plain charge).

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.

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

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.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds real behavioral context beyond that: pricing ($0.02, PAID), the x402/API-key payment paths, honest statuses when no enforceable floor exists, and the rule that cross-period conversion is never guessed. Some of this (receipt, api_key) duplicates the schema, keeping it from a 5.

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

Conciseness3/5

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

Front-loaded with the core purpose, which is good, but the body is dense with pricing, payment mechanics, a legal disclaimer, and receipt caveats — much of which repeats the schema's receipt/api_key descriptions. Several sentences could be trimmed without losing decision-relevant information.

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 needn't be spelled out, yet the description still summarizes them usefully. Combined with payment, receipt, and edge-case behavior (no floor, period mismatch), the definition is nearly complete for invoking the tool 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%, so the baseline is 3, but the description adds meaning beyond the schema: it stresses that the period must match the floor's period and that mismatches are surfaced honestly rather than converted, and it clarifies the api_key bypass and receipt-at-no-extra-cost 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 ('Compliance verdict: is a salary at, above or below the country's statutory minimum wage?') and explicitly enumerates the returned artifacts (verdict, margin, statutory floor, legal instrument). It also distinguishes itself from the certified-extract SKU, so an agent can tell it apart from siblings without opening a schema.

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

Usage Guidelines4/5

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

Gives clear context for use: the evaluation country is free to try (routing to list_series), api_key bypasses x402, and the paid receipt path is optional. It names adjacent tools (list_series, verify_answer_receipt) and the non-MCP certified endpoint, but stops short of explicit when-to-use/when-not guidance versus the compute_* siblings.

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.

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

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_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.

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

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.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, openWorld), and the description adds substantial context beyond them: the $0.02 price, the api_key/x402 payment paths, that unpaid 402 and free refusals omit a receipt, that scope_note appears in the response, and the legal-advice disclaimer. This is the kind of billing and response-shape disclosure annotations cannot convey.

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

Conciseness4/5

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

Front-loads price and purpose, but is dense and packs several cross-references (certified endpoint, verify_answer_receipt, list_series) into one block. Nearly every sentence earns place, though the pricing/receipt detail is verbose enough to slightly reduce 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?

With an output schema present, return values need not be described, and the description still covers pricing, payment, receipt semantics, scope limitations, and verification path. Nothing an agent needs in order 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.

Parameters4/5

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

Schema description coverage is 100%, so baseline is 3. The description adds contextual meaning, especially around the receipt parameter (paid-success-only Ed25519 receipt, not a certified extract) and the taxable-income period basis caveat (monthly for a subset of countries), above 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 (compute) and resource (statutory income tax on a taxable-income figure) and names the concrete scope: marginal bracket schedule with per-bracket workings, effective and marginal rates. It explicitly distinguishes its input from a related but different quantity (net take-home pay) and thus differentiates itself from siblings like compute_payroll.

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 when-to-use and when-NOT: '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.' It also routes payment decisions (api_key vs x402, /pricing) and points to list_series for free-country evaluation.

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

compute_payrollA
Read-onlyIdempotent
Inspect

PAID ($0.05). Gross-to-net take-home pay for Nigeria or Kenya: applies PAYE (on the verified brackets) plus the statutory employee deductions (Nigeria: pension/NHF/NHIS; Kenya: NSSF/SHIF/Affordable Housing Levy) and reliefs, returning net pay with full workings, per-contribution citations and DISCLOSED assumptions. Nigeria's pension base needs pay composition — pass basic/housing/transport for an exact figure, or a market-convention 40/30/10 split is assumed and disclosed. 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.

NameRequiredDescriptionDefault
basicNoNigeria: basic pay component
grossYesGross pay in local currency
periodNoPeriod the gross covers (default month)
sectorNoNigeria: public applies NHF; private (default) sets NHF 0
api_keyNoAPI key (bypasses x402; metered for invoicing)
countryYesPayroll is supported for Nigeria (ng) and Kenya (ke)
housingNoNigeria: housing allowance
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).
transportNoNigeria: transport allowance
annual_rentNoNigeria: annual rent paid (unlocks rent relief)
nhis_premiumNoNigeria: NHIS employee premium if deducted
pensionable_payNoKenya: pensionable pay for NSSF tiers
insurance_premiumNoKenya: insurance premium for 15% relief

Output 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.6/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 on top: a $0.05 price, two payment paths (api_key vs x402), disclosed fallback assumptions when pay composition is omitted, receipt behavior (Ed25519, only on paid success, no extra USDC), and explicit scope disclaimers (not a certified extract, not legal advice). This is exactly the beyond-annotation disclosure the dimension asks for.

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 enough and dense with useful information, but the receipt/certified-extract explanation appears twice (once in the description body, again nearly verbatim in the receipt parameter), and leading with 'PAID ($0.05).' before the purpose is a slightly awkward opener. Still largely earns its length for a 13-parameter paid 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, the description need not explain returns, and it still covers pricing, both authentication paths, country scope, assumption disclosure, receipt semantics and legal boundaries. Nothing an agent needs to invoke this correctly — including the free-trial escape hatch via list_series — 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, but the description adds real meaning the schema does not carry: the 40/30/10 fallback convention for Nigeria's pension base and what happens when basic/housing/transport are omitted, plus the api_key-vs-x402 behavior attached to that parameter. The receipt and certified-extract distinction is also disambiguated 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 and resource — gross-to-net take-home pay computation — and names the exact statutory machinery (PAYE, pension/NHF/NHIS for Nigeria; NSSF/SHIF/AHL for Kenya) plus the return content (net pay with workings and citations). An agent can immediately tell this apart from compute_income_tax, compute_vat or check_minimum_wage.

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 conditional input guidance: pass basic/housing/transport for an exact Nigeria pension base or a 40/30/10 market convention is assumed and disclosed; pass api_key for instant card checkout, otherwise x402 explains payment; the evaluation country is free. It lacks explicit when-not-to-use guidance relative to siblings like compute_income_tax, 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.

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 GH 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.

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

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.4/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld/no-destructive, and the description adds substantial context beyond them: price ($0.02), free refusal semantics for mechanism-only series and conflicting dates, x402 payment flow, optional Ed25519 receipt behavior, and explicit scope limits (jurisdiction compounding/day-count not applied, not legal advice).

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 pricing and the formula, which is the most decision-relevant content. It is dense and repeats the receipt/certified-extract distinction that also lives in the schema, but every sentence carries genuine information and none is 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?

For a paid, open-world computation tool with an output schema already defined, the description covers the computation method, refusal conditions, payment paths, receipt verification, and scope limitations. An agent has everything needed to call and interpret 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%, so the fields (days, from, to, api_key, receipt, principal, country) are already documented in the schema. The description restates the days-vs-from/to rule and receipt semantics but adds little syntax beyond what the schema provides, 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?

States a specific verb and resource (compute statutory interest) and goes further by giving the exact formula and day-count convention (Actual/365 simple, principal × (rate/100) × (days/365)). This clearly separates it from siblings like compute_vat, compute_income_tax, and compute_payroll without requiring 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 tells the agent how to supply the period (pass days, or from/to, with disagreement refused) and how payment works (api_key vs x402), and it names related SKUs (certified extract, verify_answer_receipt). It stops short of explicit when-to-use/when-not guidance against the compute_* siblings, but the context is otherwise clear.

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

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.

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

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?

Goes well beyond the readOnly/idempotent annotations: discloses the $0.01 price, the x402 pay-per-call flow, optional api_key for instant card checkout, free evaluation country, the receipt opt-in at no extra USDC, and explicitly that the output is not a certified extract nor legal advice. 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.

Conciseness4/5

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

Front-loads the core purpose and mode semantics in the first two sentences, then handles payment and receipt details. Slightly overloaded with parenthetical asides and repeated receipt explanation (also present in the schema), but every sentence still carries actionable information.

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 detail is not required. Given that, the description covers pricing, payment paths, mode selection, receipt semantics, verification route and legal caveats—everything an agent needs to invoke and interpret a paid, open-world compute 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?

Schema coverage is already 100%, so the baseline is 3; the description adds value by framing mode in terms of net-vs-gross semantics and by clarifying what the receipt flag actually returns and when it is absent. It does not add much beyond the schema for amount or country, which are self-explanatory.

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 (VAT breakdown: net, tax, gross) plus the rate basis (country statutory rate) and composite-levy handling. This clearly separates it from siblings like compute_income_tax, compute_payroll and compute_statutory_interest without needing to open 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 Guidelines4/5

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

Explains the two operating modes (add treats amount as net, extract backs VAT out of gross) and the api_key/payment fork, plus points to list_series for the free evaluation country. It gives clear context for calling it, but never states when to prefer it over adjacent siblings or when it is the wrong tool.

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

cost_hireA
Read-onlyIdempotent
Inspect

PAID ($0.50). Cost this hire: one cited dossier for a salary - wage-floor verdict, employer and employee contributions (or PAYE net pay for NG/KE), employer cost, optional income tax on taxable_income and first working day on or after start_date. Countries here: KE, NG. Anything we cannot answer in full is refused free (coverage_gap, no_charge). Shares the 3 free calls per IP per day with the answer tools. Pass api_key if you have one (card checkout at /pricing); otherwise the result is the x402 payment requirement. 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.

NameRequiredDescriptionDefault
grossYesGross pay, local currency
periodNoDefault month
api_keyNoAPI key (bypasses x402; metered for invoicing)
countryYesISO country code with a full cost-this-hire dossier
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).
start_dateNoYYYY-MM-DD; returns the first working day on or after it
subdivisionNoContribution region where held (e.g. CA-QC)
hours_per_weekNoLets an hourly wage floor be checked
taxable_incomeNoAnnual taxable income; applies the income-tax schedule

Output Schema

NameRequiredDescription
jobNo
errorNoPresent on a free refusal or error; no charge
statusNo
evidenceNo
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?

Annotations only cover the safety profile (readOnly, idempotent, non-destructive, openWorld). The description goes well beyond that with price ($0.50), the no-charge refusal path, rate-limit sharing, auth mechanics (api_key bypassing x402, card checkout at /pricing), receipt semantics, and an explicit disclaimer that a receipt is not a certified extract or legal advice.

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 price and the core verdict, which is the right ordering for an agent deciding whether to call it. It is dense and information-rich, but the receipt paragraph is nearly duplicated verbatim in the schema's receipt description, so some sentences do not fully earn their 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?

For a 9-parameter paid tool with an output schema and full annotation coverage, nothing material is missing: cost, refusal behavior, auth paths, rate limits, country scope, and receipt/verification flow are all stated. Return values are covered by the output schema, so the description need not restate them.

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 still adds value beyond the schema by explaining the api_key bypass/metering context and the receipt's conditions (only on paid success, not on 402 or free refusals, no extra USDC) plus the verify_answer_receipt follow-up. It largely restates taxable_income, start_date, and hours_per_week, which the schema already documents.

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?

Opens with a specific verb+resource ("Cost this hire") and enumerates exactly what the dossier contains: wage-floor verdict, employer/employee contributions, employer cost, optional income tax, and first working day. This cleanly separates it from siblings like check_minimum_wage, compute_payroll, and hire_compare, and it scopes the resource to KE and NG.

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 operative context: the two supported countries, the free-refusal contract (coverage_gap, no_charge), the shared 3-calls-per-IP-per-day budget with the answer tools, and the api_key-vs-x402 path. It does not explicitly contrast against the nearest sibling tools (e.g. hire_compare or check_minimum_wage), so routing between them is still left to inference.

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.

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

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.1/5.0
Behavior5/5

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

Annotations already cover safety (read-only, idempotent, non-destructive), yet the description adds substantial behavior: the $0.002 price, api_key vs x402 payment paths, the 366-day range limit, the free evaluation country, and precisely what the receipt flag does and does not yield. It also warns the output is not legal advice.

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 purpose is buried after a parenthetical price tag, and the text is a dense run-on packed with payment and legal caveats that crowd the operational facts. Everything is arguably relevant, but the structure is cluttered rather than front-loaded and clean.

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 the description covers pricing, payment fallbacks, range limits, subdivision behavior, and receipt semantics. It is essentially complete for a paid read tool, with only sibling-disambiguation left implicit.

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 meaningfully extends two fields: api_key gains payment mechanics (card checkout at /pricing vs x402) that the schema stub lacks, and the description clarifies that the receipt is an answer receipt, not a certified extract.

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 and resource — counting working days in a date range for a country — and specifies the inputs it accounts for (weekends incl. Egypt's Fri–Sat, statutory holidays). It does not, however, differentiate itself from the very close sibling business_days_between, leaving overlap unexplained.

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 gives clear context: free evaluation country, paid otherwise, and routes the agent to list_series and verify_answer_receipt explicitly. It also distinguishes itself from the non-MCP certified-extract SKU. It stops short of saying when to prefer this over business_days_between or add_business_days.

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

domain_ageA
Read-onlyIdempotent
Inspect

PAID ($0.005). Not for registries without RDAP, e.g. .za/.co.za, .me, .de, .io, .eu: refused free (422). Use when you need to know which registrar holds a domain, how old it is, and whether it is a risky newly-registered domain. $0.005. From the registry's RDAP: registrar name and IANA ID (no registrant or contact data), created, expires, last changed, status flags, DNSSEC delegation, nameservers; fail under 30 days old or expired, warn under 180 days, expiring within 30 days or on hold. A registry without RDAP is refused free. MCP: pass api_key (an Afriref key, card credit at https://afriref.dev/pricing); per-call x402/MPP payment is HTTP only, so without a key the result is an api_key_required error naming the HTTP endpoint.

NameRequiredDescriptionDefault
domainYesDomain or hostname, e.g. example.com (no URL, no IP)
api_keyNoAPI key (bypasses x402; metered for invoicing)

Output Schema

NameRequiredDescription
fixNo
errorNoPresent on a free refusal or error; no charge
gradeNo
notesNo
domainNo
findingNo
diagnosisNo
no_chargeNo
price_usdNo
checked_atNo
how_to_payNo
explanationNo
registrationNo
http_endpointNo

TDQS

A4.2/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, and the description adds substantial context on top: paid pricing, free refusal for non-RDAP registries, fail/warn thresholds (under 30 days, under 180 days, expiring within 30 days, on hold), and an explicit auth failure mode (api_key_required when no key is supplied over MCP). This is rich, non-obvious behavioral detail 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 description repeats itself: the $0.005 price appears twice and the non-RDAP free-refusal (422) is stated twice. The lead opens with pricing and exclusions before stating the core purpose, so it is not fully front-loaded. Still, each block is on-topic and no filler content is present.

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 lookup tool with an output schema already covering return values, the description covers everything an agent needs: purpose, price, auth path (api_key vs HTTP x402), failure modes, TLD exclusions, and the fail/warn decision thresholds. There is no material gap affecting correct invocation.

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. The description adds real meaning for api_key: that it is an Afriref key with card credit, that per-call x402/MPP payment is HTTP-only, and that omitting it over MCP yields an api_key_required error naming the HTTP endpoint. That materially explains the second parameter beyond the schema's one-line note.

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 precisely what the tool returns: registrar name and IANA ID, created/expires/changed dates, status flags, DNSSEC, and nameservers, all from the registry's RDAP. It also frames the use case (registrar ownership, domain age, risky newly-registered domains), which differentiates it in practice from a generic check. It never names the sibling domain_check, so sibling differentiation is implicit rather than explicit.

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

Usage Guidelines4/5

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

It gives clear when-to-use ("when you need to know which registrar holds a domain, how old it is, and whether it is a risky newly-registered domain") and a concrete when-not (registries without RDAP, listing .za/.co.za, .me, .de, .io, .eu, which are refused with 422). It stops short of naming the alternative tool to use for those cases, so the routing is incomplete.

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

domain_checkA
Read-onlyIdempotent
Inspect

PAID ($0.01). Use when mail lands in spam, before an email campaign, for vendor due diligence or to confirm a Microsoft 365 tenant: graded SPF, DKIM, DMARC, MX, MTA-STS, DNSSEC, CAA, TLS and domain age, plus BIMI and blocklist info, each with the exact fix record. Non-intrusive. $0.01 per domain. Returns a 0-100 score and, per check (spf, dkim, dmarc, mx, tls = website certificate, m365, registration, mta_sts, tls_rpt, dnssec, caa, bimi, dnsbl = UCEPROTECT blocklist), a pass/warn/fail/info grade, the finding and the exact record or step that fixes it. Info checks do not move the score. Invalid, nonexistent or private-only domains are refused free. MCP: pass api_key (an Afriref key, card credit at https://afriref.dev/pricing); per-call x402/MPP payment is HTTP only, so without a key the result is an api_key_required error naming the HTTP endpoint.

NameRequiredDescriptionDefault
domainYesDomain or hostname, e.g. example.com (no URL, no IP)
api_keyNoAPI key (bypasses x402; metered for invoicing)

Output Schema

NameRequiredDescription
fixNo
errorNoPresent on a free refusal or error; no charge
notesNo
scoreNo
checksNo
domainNo
letterNo
summaryNo
diagnosisNo
no_chargeNo
price_usdNo
checked_atNo
how_to_payNo
explanationNo
http_endpointNo

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, and the description still adds substantial behavioral context: it is PAID at $0.01 per domain, non-intrusive, refuses invalid/nonexistent/private-only domains for free, and the MCP path requires an api_key (x402 payment is HTTP-only, otherwise an api_key_required error names the HTTP endpoint). That is exactly the auth/cost/error disclosure structured fields 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.

Conciseness4/5

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

Dense but front-loaded — cost, then use cases, then the check inventory, then the return shape, then payment mechanics. Minor redundancy: the $0.01 price is stated twice ('PAID ($0.01)' and '$0.01 per domain'), and the long parenthetical listing every check code is heavy.

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 external-scan tool this is complete: cost, auth path, refusal behavior, return shape (0-100 score plus per-check pass/warn/fail/info grades with fix records) and the note that info checks don't move the score. An output schema exists, yet the description still frames the result usefully.

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, but the description adds real meaning: api_key is an Afriref key purchasable at https://afriref.dev/pricing, it bypasses x402, is metered for invoicing, and its absence produces a specific api_key_required error. domain format detail (no URL, no IP) is left 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?

The description names a specific verb+resource — a domain/email security check that grades SPF, DKIM, DMARC, MX, MTA-STS, DNSSEC, CAA, TLS, domain age, BIMI and blocklists. It is unmistakably distinct from the sibling domain_age, which covers only one of the many signals enumerated here.

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?

Explicit trigger scenarios are given: 'when mail lands in spam, before an email campaign, for vendor due diligence or to confirm a Microsoft 365 tenant.' That is strong when-to-use guidance, but it offers no when-not conditions and never references the domain_age sibling as an alternative.

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

evidence_packA
Read-onlyIdempotent
Inspect

PAID ($0.25). Country evidence pack: the full cited country brief plus up to 3 Ed25519-signed certified extracts (default the first certifiable of vat, policy-rate, minimum-wage). Named series must all be certifiable. Anything we cannot answer in full is refused free (coverage_gap, no_charge). Shares the 3 free calls per IP per day with the answer tools. Pass api_key if you have one (card checkout at /pricing); otherwise the result is the x402 payment requirement. 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.

NameRequiredDescriptionDefault
seriesNo1 to 3 series ids to certify
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

NameRequiredDescription
jobNo
errorNoPresent on a free refusal or error; no charge
statusNo
evidenceNo
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
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, yet the description adds pricing, the free-refusal path (coverage_gap, no_charge), the shared rate limit, the payment flow, and receipt semantics. This is unusually rich behavioral disclosure for a read-only tool and materially de-risks an unexpected charge.

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 payload is front-loaded well ('PAID ($0.25). Country evidence pack...'), but it reads as a single dense run-on with a long parenthetical and repeats the receipt-vs-certified-extract distinction that the schema already states. Every fact is relevant, yet the packaging is not tight.

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 detail is not required, and the description covers payment, refusal, defaults, rate limits, and verification path (verify_answer_receipt against /certified/public-key). An agent has enough to call this correctly and anticipate cost outcomes.

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: what happens when series is omitted (default first certifiable of vat/policy-rate/minimum-wage) and the constraint that all named series must be certifiable. It also restates the receipt caveat, which the schema already covers.

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 composition: 'the full cited country brief plus up to 3 Ed25519-signed certified extracts.' It also gives the default series set (vat, policy-rate, minimum-wage), which lets an agent distinguish this bundle from get_country_brief and from the non-MCP certified-extract endpoint.

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 usage context — it is paid ($0.25), requires certifiable series, shares 3 free calls/IP/day with the answer tools, and returns an x402 payment requirement without an api_key. However, it never explicitly says when to prefer this over siblings like get_country_brief or get_series, so routing 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.

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.

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

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).

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

Output 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.

NameRequiredDescriptionDefault
api_keyNoAPI key
countryYesISO country code

Output 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.3/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/openWorld/non-destructive, so the description earns credit for adding the non-obvious commercial and auth behavior: $0.01 cost, two payment paths (api_key or x402), and the post-call binding recommendation. It omits error/rate-limit behavior, and the register_alert pricing line reads as cross-sell rather than behavior of this tool.

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 purpose and value in the first sentence, then cost/auth, then follow-up — a sensible order with little waste. The trailing register_alert pricing parenthetical adds length that serves the vendor's upsell more than the caller's decision, slightly diluting an otherwise tight paragraph.

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?

Covers what the payload contains (value, unit, effective and last-confirmed dates, official source, confidence label), the cost, the auth paths, and the recommended next step. With an output schema present the return shape need not be restated, so the only real omission is failure-mode behavior (e.g., what happens without payment or for an unsupported country code).

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 country enum is self-documenting, so the baseline is 3. The description goes slightly beyond by explaining the role of api_key ('if you have one; card checkout at /pricing') and the fallback payment flow, which the schema's bare 'API key' label does not convey.

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 concrete verb+resource ('Country brief: every reference series we hold for one country') and enumerates the content types (policy rate, VAT/GST, CPI, taxes, minimum wage, holidays). This clearly separates it from single-series siblings like get_series/get_series_history, so an agent can pick it 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 Guidelines4/5

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

Gives clear context ('Cheaper than buying the series one by one') that positions it against per-series calls, plus the auth prerequisite ('Pass api_key if you have one... otherwise the response explains how to pay via x402'). It also prescribes a follow-up ('bind get_changes or register_alert'). It stops short of an explicit when-not or a named alternative tool, so not a 5.

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

get_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 GH 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.

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

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 readOnly/idempotent/non-destructive, yet the description adds substantial behavioral context beyond them: pricing, holiday and weekend rolling with every skipped day listed, the roll_unverified flag instead of guessing, coverage_gap for unverifiable countries with explicit 'never invented' guarantee, and post-response polling/alert guidance. That is materially richer than 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 core purpose is front-loaded and dense with useful detail, but the description is padded with pricing/marketing text ('PAID ($0.003, same as any series)', 'Every GH series is free to try', the register_alert price breakdown) that does not help an agent select or invoke the tool. Several sentences earn their place; several do not.

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 six-parameter, high-complexity tool with an output schema and annotations present, the description covers what an agent needs: scope, the year_end re-anchoring behavior, integrity flags (roll_unverified, coverage_gap), and follow-up polling. Return-value shapes are handled by the output schema, so nothing critical 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. The description adds real meaning for year_end (re-anchors corporate-tax rules on the company's accounting year end, targeting year_end_variable rules) and reinforces the from/to window semantics and the tax filter. This exceeds what the schema alone conveys, though most parameters remain fully documented in 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+resource: recurring statutory tax deadlines for a country, and enumerates the content precisely (VAT/GST returns and payments, PAYE remittances, CIT returns and provisional instalments) as cited RULES plus rolled DUE DATES. This is clearly distinguishable from calculation siblings like compute_vat or compute_statutory_interest, which produce amounts rather than deadlines. An agent can identify the tool's output shape 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 context for optional behavior (pass year_end to re-anchor corporate-tax rules) and for follow-up actions (bind get_changes to poll, register_alert for HMAC push after a 200), plus a free alternative view via the HTML page. It does not explicitly say when to prefer this over sibling tax tools or name any exclusion, 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.

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.

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

Output 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.

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

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 cover readOnly/idempotent/non-destructive/openWorld, so the bar is lower. The description still adds real behavioral context: the call is FREE, results cite an official government source, sub-national calendars exist where available, and passing `subdivision` returns national plus regional days tagged national/regional. No freshness/rate-limit or error behavior is mentioned, keeping it below 5.

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?

Three sentences, front-loaded with the free/country-scope framing before the subdivision detail. Every clause carries information (source citation, merge semantics, code format) with no 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?

An output schema exists, so return values need no explanation, and the two parameters are fully covered in the schema. The description supplies the remaining context an agent needs, the country scope, the data provenance, and the sub-national merge behavior, making it complete for this read-only tool.

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, including the exact merge behavior and the 'DE-BY' style example that the description repeats. The description's only added nuance is pointing at the response's `subdivisions` field to discover valid region codes, which is marginal given full schema coverage.

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, official government source cited). It implicitly separates itself from get_public_holidays_worldwide by emphasizing a single supported country, but never names that sibling explicitly.

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 conditional guidance for the `subdivision` parameter ('omit for the national calendar'), which is useful. However, it offers no tool-selection guidance against nearby siblings such as get_public_holidays_worldwide, is_business_day, or get_calendar, leaving when-to-use-this-vs-that 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://afriref.dev/free-key). Same as get_public_holidays, but for every country across all seven brands, not only Pan-African. Unmetered: never counts against the key's allowance. Pass api_key, or send the key as the X-API-Key header on /mcp.

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

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 readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds genuinely useful non-annotation context: it is free/unmetered, never counts against the key's allowance, and supports auth via either the api_key parameter or the X-API-Key header. That quota and auth detail earns credit above the annotation baseline.

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?

Three tightly packed sentences with the value proposition front-loaded. The free-key URL and 'seven brands' phrasing lean promotional but stay short, 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?

With an output schema present, return values need not be explained. The description covers scope, sibling routing, cost/quota, and auth mechanism, which is what an agent needs to invoke it. Only the optional subdivision behavior is left entirely to the schema, a minor gap.

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 all three parameters (api_key, country, subdivision) are already documented in the schema, including the enum and the subdivision format. The description only restates the api_key/header auth option and adds nothing about the subdivision parameter. Baseline 3 applies when the schema carries the load.

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 scope by direct analogy: 'Same as get_public_holidays, but for every country across all seven brands, not only Pan-African.' Combined with the name, an agent knows this returns public holidays globally. It stops short of a standalone verb+resource statement, relying on the sibling for the base meaning.

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 establishes when to pick this over get_public_holidays (all countries vs. Pan-African only), which is the key routing decision between the two siblings. There is no explicit when-not-to-use or mention of non-holiday alternatives, but the primary selection condition is covered.

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 GH 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.

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

Output 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.3/5.0
Behavior5/5

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

Annotations already declare read-only, idempotent, open-world, non-destructive, but the description goes well beyond them: it discloses the $0.003 cost, both payment paths (api_key vs x402 fallback), the free trial for GH series, and the exact fields each value carries (source citation, effective date, last-confirmed date, staleness flag). This is rich, actionable behavioral context.

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

Conciseness4/5

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

Front-loads price and purpose, then packs payment, return-field, and follow-up details into a single dense paragraph. Every sentence carries information, though the follow-up-tool sentence with its pricing parenthetical is slightly overloaded.

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, payment-gated tool this covers everything an agent needs: cost, auth options, payment fallback, what the response contains, and what to do next. An output schema exists, so return-value explanation is a bonus rather than a requirement.

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, but the description adds meaning the schema lacks — the api_key parameter's fallback behavior (response explains x402 payment) and the 'every GH series is free to try' caveat. The series-id examples largely duplicate the schema.

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 ('Current value of a reference series') and gives concrete series examples (policy-rate, vat, minimum-wage). The word 'Current' implicitly separates it from get_series_history and list_series, but neither sibling is named, so the differentiation is inferential rather than explicit.

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

Usage Guidelines4/5

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

Gives clear operational context: pass api_key if you have one, otherwise the response explains x402 payment, and it tells the agent to bind get_changes or register_alert after a 200. It does not explicitly route to get_series_history for past values, so the alternative-selection guidance is incomplete.

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 GH 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.

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

Output 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.8/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses the $0.003 cost, that an api_key is optional, the x402 fallback payment path, that every GH series is free to try, and recommended follow-up bindings. This is exactly the kind of cost/auth/behavioral context annotations cannot express.

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?

Front-loads the PAID marker and purpose, which is good, but then rambles into payment checkout mechanics and alert-delivery pricing that is dense and partly tangential to the tool's core function. Several clauses could be trimmed without loss.

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 needn't be explained, and the description covers cost, auth, filtering, and follow-up options. It is close to complete, though it omits any explicit statement of what the series values represent or pagination/size expectations.

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 restates the from/to YYYY-MM-DD format already present in the schema and adds only marginally that api_key is optional; it adds little semantic meaning beyond the schema.

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 ('Historical values of a reference series with effective date ranges'), which an agent can act on. It distinguishes the temporal/history nature implicitly, but never explicitly contrasts itself with siblings like get_series or compare_series, so an agent must infer which returns history vs. current values.

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 gives post-call guidance (bind get_changes or register_alert after a 200) and payment workflow context, but provides no guidance on when to choose this tool over get_series, get_snapshot, or compare_series. Usage is implied rather than stated as a selection rule.

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 GH 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.

NameRequiredDescriptionDefault
api_keyNoAPI key

Output 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/5.0
Behavior4/5

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

Annotations cover readOnly/idempotent/destructive, but the description adds highly relevant behavior the annotations cannot convey: PAID ($0.02), optional api_key, an x402 payment fallback, and the free-trial scope for GH series. It also warns that series values can be silently retired, motivating the alert chaining. Lacks rate/limit or response-shape detail, but that is largely covered elsewhere.

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?

Cost is front-loaded as the first token, which is the right priority. Four dense sentences carry distinct payloads (pricing, auth, free trial, chaining), though 'so a later gazette does not silently retire the value' is jargon-heavy and could be plainer.

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 fills the genuinely missing pieces: cost, auth mechanics, and recommended post-call chaining. It omits any note on response size or ordering for a tool that returns 'every series for every country,' a minor gap for a bulk endpoint.

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 baseline is 3. The description meaningfully exceeds the bare 'API key' schema description by establishing that api_key is optional and describing the alternative payment path (card checkout at /pricing or x402 instructions in the response).

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 with scope: 'Snapshot of every series for every country in one call.' The 'every series / every country / one call' scope implicitly distinguishes it from single-series siblings like get_series or get_series_history, but no sibling is named explicitly, so an agent must infer the contrast.

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?

Clear context for use: pass api_key if available, otherwise x402 payment, and GH series are free to try. It also routes the agent to follow-on tools (get_changes, register_alert) after a 200. It stops short of stating when NOT to use it versus alternatives such as get_series.

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

hire_compareA
Read-onlyIdempotent
Inspect

PAID ($0.75 for 2 countries, $1.00 for 3-5). Employer cost, employer and employee contributions, on-cost percent and wage-floor verdict side by side and ranked, every figure cited. Countries (any brand): AE, AU, CA, DE, ES, GB, IT, MX, PL, US. Gross is in each country's own currency; currencies are not converted. Anything we cannot answer in full is refused free (coverage_gap, no_charge). Shares the 3 free calls per IP per day with the answer tools. Pass api_key if you have one (card checkout at /pricing); otherwise the result is the x402 payment requirement. 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.

NameRequiredDescriptionDefault
hiresYes2 to 5 hires
periodNoDefault month
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).

Output Schema

NameRequiredDescription
jobNo
errorNoPresent on a free refusal or error; no charge
statusNo
evidenceNo
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
Behavior5/5

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

Annotations already declare the safe read-only/idempotent profile, and the description adds substantial behavioral context on top: cost tiers, the api_key-vs-x402 payment branch, free coverage_gap refusals, quota sharing with the answer tools, the optional Ed25519 receipt only on paid success, and the verification path. This is exactly the beyond-annotation detail an agent needs.

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?

A single dense paragraph that leads with pricing rather than the tool's purpose, and repeats the receipt/certified-extract distinction that also appears verbatim in the schema. Every fact is relevant, but the ordering and duplication cost readability.

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, the description needn't explain return values, and it still covers pricing, coverage limits, refusal semantics, payment flow, and receipt verification. Nothing an agent needs to call this 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, and the description goes further by stating gross is in each country's own currency with no conversion, listing the allowed country brands, and confirming 2-5 hires. Those currency and range clarifications are genuine meaning beyond the schema fields.

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 and enumerates the exact outputs (employer cost, employer/employee contributions, on-cost percent, wage-floor verdict) computed 'side by side and ranked' for 2-5 hires. This implicitly separates it from single-hire siblings like compute_employment_cost and cost_hire, but never names them, so the differentiation is inferred rather than explicit.

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

Usage Guidelines4/5

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

Gives clear operating context: 2-5 countries from a fixed list, pricing tiers ($0.75 for 2, $1.00 for 3-5), free refusal for unanswerable requests, and shared 3-free-calls-per-IP quota. It stops short of telling the agent when to prefer a sibling tool (e.g. compute_employment_cost for a single hire) or when not to call this at all.

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

invoice_checkA
Read-onlyIdempotent
Inspect

PAID ($0.60). Check an invoice in one call: is the VAT right (place of supply, rate, expected amount vs vat_charged), is it overdue and how much statutory late interest is owed, and do seller/buyer tax IDs pass the official format check. Seller countries here: BF, BJ, BW, CI, CM, DZ, EG, ET, MA, ML, MU, MZ, NA, NE, SN, TG, TN, ZA. Send due_date, or invoice_date with terms_days. Anything we cannot answer in full is refused free (coverage_gap, no_charge). Shares the 3 free calls per IP per day with the answer tools. Pass api_key if you have one (card checkout at /pricing); otherwise the result is the x402 payment requirement. 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.

NameRequiredDescriptionDefault
as_ofNoYYYY-MM-DD; default today
amountYesInvoice amount, local currency
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).
due_dateNoYYYY-MM-DD contractual due date
amount_isNoDefault net
buyer_typeNo
terms_daysNoAgreed payment term in days
vat_chargedNoVAT amount on the invoice, to be checked
buyer_tax_idNoNeeds buyer_country
invoice_dateNoYYYY-MM-DD; with terms_days instead of due_date
buyer_countryNoISO code; omit for a domestic invoice
seller_tax_idNo
seller_countryYesISO country code of the seller

Output Schema

NameRequiredDescription
jobNo
errorNoPresent on a free refusal or error; no charge
statusNo
evidenceNo
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 readOnly/idempotent annotations, the description discloses price ($0.60), the free-refusal behavior (coverage_gap, no_charge), the shared 3-free-calls-per-IP-per-day quota, the x402 fallback, and the receipt semantics including what a receipt is NOT (not a certified extract, not legal advice) plus how to verify it. This is exactly the behavioral 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 cost and purpose are front-loaded well, but the prose is dense and run-on, packing pricing, quotas, receipts, disclaimer language, and a pointer to a non-MCP SKU into long sentences. Much of the receipt/legal-advice caveat duplicates the receipt parameter description in the schema, so some sentences don't fully 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?

With an output schema present, return values needn't be explained, and the description covers the remaining agent-facing concerns: cost, quotas, payment modes, refusal semantics, and receipt verification. It is thorough for a 14-parameter, high-complexity composite tool, with only minor redundancy against the parameter docs.

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 86%, so the schema already documents most parameters; the description still adds cross-field constraints the schema only hints at (due_date vs. invoice_date+terms_days) and, critically, enumerates the supported seller countries, which is a real usage constraint not expressible via the free-form country field. It adds genuine meaning over the schema 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 description names a concrete action ("Check an invoice") and enumerates the three checks it bundles: VAT correctness, overdue status plus statutory late interest, and tax-ID format validation. It implicitly distinguishes itself from the granular siblings (compute_vat, compute_statutory_interest, validate_tax_id) by framing itself as "in one call," though it never names those siblings explicitly.

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

Usage Guidelines4/5

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

It gives concrete invocation guidance: "Send due_date, or invoice_date with terms_days," and explains the payment path (api_key if you have one, otherwise the x402 payment requirement). It also states the coverage boundary — unsupported seller countries are refused free with coverage_gap. What's missing is an explicit statement of when to prefer this composite over the individual sibling tools.

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

invoice_payableA
Read-onlyIdempotent
Inspect

PAID ($0.40). Is this invoice overdue, by how many days, and how much statutory late-payment interest is owed (Actual/365 simple, rate and workings cited). Late-payment regime: none here; statutory interest only: BF, BJ, BW, CI, CM, DZ, EG, ET, MA, ML, MU, MZ, NA, NE, SN, TG, TN, ZA. Send due_date, or invoice_date with terms_days. Anything we cannot answer in full is refused free (coverage_gap, no_charge). Shares the 3 free calls per IP per day with the answer tools. Pass api_key if you have one (card checkout at /pricing); otherwise the result is the x402 payment requirement. 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.

NameRequiredDescriptionDefault
as_ofNoYYYY-MM-DD payment date or day asked about; default today
debtorNoDefault business
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).
due_dateNoYYYY-MM-DD contractual due date
principalYesUnpaid amount, local currency
terms_daysNoAgreed payment term in days
invoice_dateNoYYYY-MM-DD; with terms_days instead of due_date

Output Schema

NameRequiredDescription
jobNo
errorNoPresent on a free refusal or error; no charge
statusNo
evidenceNo
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.7/5.0
Behavior5/5

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

Annotations only cover read-only/open-world/idempotent safety. The description adds payment requirement ($0.40/x402), shared free-call limits, no_charge refusal behavior, receipt issuance details, legal disclaimer, and verification path, which is rich context beyond 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.

Conciseness2/5

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

It front-loads the purpose, but the wall of sentences mixes pricing, free calls, receipt mechanics, legal disclaimers, and verification. The 'PAID ($0.40).' opening and overall length are noisy rather than concise.

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 details need not be repeated. The description covers inputs, country coverage, refusal semantics, payment model, and receipt behavior, making it nearly complete for a paid read-only computation tool, though not elegantly organized.

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 baseline is 3. The description restates the due_date vs invoice_date+terms_days alternative and the country list, but adds little syntax or format detail beyond what the schema already provides.

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 question-form first sentence names the computation: invoice overdue status/days and statutory late-payment interest, with covered countries listed. It distinguishes from certified extracts and legal advice, but does not explicitly contrast with sibling compute_statutory_interest.

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?

Provides an input recipe (due_date or invoice_date with terms_days) and payment/free-call constraints, plus refusal behavior. It does not state when to choose this tool over compute_statutory_interest or other interest siblings.

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.

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

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 afriref 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.

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

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.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so safety is covered, and the description adds the useful "FREE" cost signal. The detail-size warning lives in the schema rather than the description. Most of the remaining text (receipts, certified extracts, other free tools) describes other endpoints rather than this tool's behavior, adding noise more than transparency. No contradiction with annotations.

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 first two sentences are tight and front-loaded, but they are followed by a long, off-topic block covering answer receipts, certified extracts, verify_answer_receipt, get_changes, get_calendar, and register_alert. This unrelated material bloats the definition and buries the tool's actual behavior.

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 the essential purpose, cost, and discovery-first role are all present. Nothing critical to calling a read-only catalog tool is missing; the main defect is the volume of extraneous cross-tool content rather than an 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 description coverage is 100%, so both parameters (detail, country) are already fully documented in the schema, including the compact-vs-full behavior. The description adds no syntax or format detail beyond that, so the baseline of 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?

Opens with a specific verb+resource: a catalog of afriref reference-data series, enumerating what it returns (countries, series ids, descriptions, freshness metadata, per-series URLs). This clearly separates it from get_series, which fetches one series. The purpose is clear, though the definition is diluted by a large block of text about receipts and other tools that has nothing to do with listing series.

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?

"Call this first to discover what data exists" is an explicit, actionable directive that positions the tool as the entry point before other calls. However, it never names the alternative for retrieving an individual series (get_series) or explains when not to use this tool, so the routing guidance is partial rather than complete.

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

next_filingsA
Read-onlyIdempotent
Inspect

PAID ($0.35). Upcoming VAT, PAYE and corporate-tax due dates in a window (default the next 90 days), rolled for weekends and national public holidays, each rule cited. Countries with verified rules here: EG, GH, KE, MU, NG, RW, SN, TN, TZ, UG, ZA. Anything we cannot answer in full is refused free (coverage_gap, no_charge). Shares the 3 free calls per IP per day with the answer tools. Pass api_key if you have one (card checkout at /pricing); otherwise the result is the x402 payment requirement. 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.

NameRequiredDescriptionDefault
toNoYYYY-MM-DD, max 366 days after from
taxNo
fromNoYYYY-MM-DD, default today
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).
year_endNoMM-DD financial year end

Output Schema

NameRequiredDescription
jobNo
errorNoPresent on a free refusal or error; no charge
statusNo
evidenceNo
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
Behavior5/5

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

Far exceeds the annotations: it discloses price ($0.35), the free coverage_gap/no_charge refusal path, the shared 3-free-calls-per-IP-per-day limit, the x402 fallback when no api_key is passed, and that a paid success can include an Ed25519 receipt verifiable via verify_answer_receipt. The 'not legal advice' disclaimer and the distinction from certified extracts are exactly the behavioral context an agent needs.

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 price and the core purpose, and every sentence carries a distinct obligation (coverage, refusal, billing, receipt). Some redundancy remains: the receipt/certified-extract caveat appears in both the description body and the schema, and the pricing/verification sentences 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?

With an output schema present, return values need no prose, and the description still covers everything else an agent needs: price, payment modes, rate limits, coverage boundaries, refusal semantics, and receipt verification. Nothing material about invoking this tool correctly is left unstated.

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 already 86%, but the description still adds meaning: receipt is tied to paid successes only (unpaid 402 and free refusals exclude it) and api_key is described as bypassing x402 while remaining metered. It does not clarify country/tax/date interaction beyond what the enum and descriptions provide.

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 names a specific verb and resource (upcoming VAT/PAYE/cit due dates in a window) with concrete scope: weekend/holiday rolling and an enumerated country set. It differentiates itself from related SKUs like the series certified extract, but never explicitly distinguishes itself from the close sibling get_filing_deadlines or get_calendar.

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 states the conditions that make the tool usable: the verified-country list, the default 90-day window, the free refusal path for anything not answerable in full, and how api_key vs x402 payment works. It stops short of naming an alternative tool for callers whose country is not covered, so the routing guidance is implied rather than explicit.

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.

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

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.

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

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.

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

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.8/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent/non-destructive/open-world, and the description adds substantial behavior beyond that: it is a paid call ($0.003), validation is offline and checksum-only where the authority publishes an algorithm, unsupported countries return 'unknown' for free, and the response explains x402 payment when no api_key is supplied. That is exactly the kind of cost, degradation, and auth context annotations cannot express.

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?

Price and purpose are front-loaded, and each sentence carries a distinct fact (scope, non-registration, unknown fallback, payment, follow-up). It is dense and relies on long compound sentences, and the register_alert pricing tail reads partly promotional, but little is truly redundant.

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-field explanation is unnecessary; the description instead covers the non-obvious essentials: cost, payment path, degraded 'unknown' behavior, and the follow-up series tools. Nothing an agent needs to invoke and interpret this 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% and id/country are already documented in the schema, so baseline would be 3. The description still adds meaning: the concept that a call validates exactly one country and that country choice determines whether a sourced rule exists (and therefore whether the call is free), plus the api_key-vs-x402 payment path for the third parameter.

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?

Opens with a specific verb+resource: 'Offline format and check-digit validation of a business tax ID or VAT number for one country'. It even enumerates the outputs (valid/invalid, normalised form, id type, check level, failure reason) and explicitly distinguishes itself from the sibling official_lookup, so an agent can route correctly without opening a schema.

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

Usage Guidelines5/5

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

States a clear boundary ('Does not confirm registration; follow official_lookup for that'), a per-country constraint, and a fallback for unsupported countries ('answer free with status unknown'). It also tells the agent how to proceed on payment (pass api_key, otherwise x402) and what to bind afterwards, so both when-to-use and when-not-to-use are covered.

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.

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

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. 1 tool update
    • Addedinvoice_check
  2. 2 tool updates
    • Changeddomain_age16 fields changed
      • changedOutput schema / description
        Previous value: -"Finished-job dossier: verdict or summary, line items, evidence with official sources. On 402 the x402 PaymentRequired object (isError)"New value: +"Registration from the registry's RDAP: grade, finding, fix and registrar, created, expires, status and nameservers. A refusal (invalid domain, registry without RDAP, api_key_required) is isError with error and explanation; nothing is charged"
      • removedOutput schema / properties / bind_series
        Removed value: -{}
      • addedOutput schema / properties / checked_at
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / diagnosis
        Added value: +{}
      • removedOutput schema / properties / disclaimer
        Removed value: -{}
      • addedOutput schema / properties / domain
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / evidence
        Removed value: -{
        -  "items": {},
        -  "type": "array"
        -}
      • addedOutput schema / properties / finding
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / fix
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / grade
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / job
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / notes
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / payment_required
        Removed value: -{
        -  "description": "true when the call needs payment; how_to_pay explains x402 or card",
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / registration
        Added value: +{}
      • removedOutput schema / properties / status
        Removed value: -{
        -  "type": "string"
        -}
      • removedOutput schema / properties / x_next_bind
        Removed value: -{}
    • Changeddomain_check17 fields changed
      • changedOutput schema / description
        Previous value: -"Finished-job dossier: verdict or summary, line items, evidence with official sources. On 402 the x402 PaymentRequired object (isError)"New value: +"Domain and email security report: 0-100 score, letter, summary and one entry per check with grade, finding and fix. A refusal (invalid or unknown domain, broken DNS, api_key_required) is isError with error and explanation; nothing is charged"
      • removedOutput schema / properties / bind_series
        Removed value: -{}
      • addedOutput schema / properties / checked_at
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / checks
        Added value: +{
        +  "items": {
        +    "additionalProperties": {},
        +    "properties": {
        +      "check": {
        +        "type": "string"
        +      },
        +      "finding": {
        +        "type": "string"
        +      },
        +      "fix": {
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "grade": {
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / diagnosis
        Added value: +{}
      • removedOutput schema / properties / disclaimer
        Removed value: -{}
      • addedOutput schema / properties / domain
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / evidence
        Removed value: -{
        -  "items": {},
        -  "type": "array"
        -}
      • addedOutput schema / properties / fix
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • removedOutput schema / properties / job
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / letter
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / notes
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • removedOutput schema / properties / payment_required
        Removed value: -{
        -  "description": "true when the call needs payment; how_to_pay explains x402 or card",
        -  "type": "boolean"
        -}
      • addedOutput schema / properties / score
        Added value: +{
        +  "type": "number"
        +}
      • removedOutput schema / properties / status
        Removed value: -{
        -  "type": "string"
        -}
      • addedOutput schema / properties / summary
        Added value: +{
        +  "type": "string"
        +}
      • removedOutput schema / properties / x_next_bind
        Removed value: -{}
  3. 2 tool updates
    • Addeddomain_age
    • Addeddomain_check
  4. 7 tool updates
    • Addedcharge_sale
    • Addedcharge_sale_certified
    • Addedcost_hire
    • Addedevidence_pack
    • Addedhire_compare
    • Addedinvoice_payable
    • Addednext_filings
  5. 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"
        +]
    • Addedcompare_series
    • 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_payroll4 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"
        +]
    • Addedget_country_brief
    • 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"
        +]
    • Addedvalidate_tax_id
  6. 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_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_payroll1 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)."
  7. 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_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_payroll3 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"
        +}
  8. 3 tool updates
    • Addedadd_business_days
    • Addedbusiness_days_between
    • Addedis_business_day
  9. 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_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_payroll1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": {},
        +  "description": "Gross-to-net payroll with workings and 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_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_series3 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"
        +}
      • 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"
        +}
  10. 1 tool update
    • Addedget_calendar
  11. 1 tool update
    • Addedcompute_statutory_interest
  12. 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_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_payroll1 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
  13. 2 tool updates
    • Addedget_changes
    • Addedregister_alert

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to retrieve and compare verified country facts such as VAT/GST, public holidays, visas, tipping, and minimum wages across 70 countries, with automatic x402 micropayments in USDC on Base per call.
    107 npm
    MIT
  • 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
    C
    maintenance
    Official economic statistics with full citations — World Bank, IMF WEO, ECB — plus verify_stat to check a claimed figure against the official series. Free, remote, no auth.
    12
    1
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Query current and historical UK official figures (tax bands, minimum wage, benefits, energy price cap and 100+ more) with effective dates and links to official government sources. Data refreshed whenever the official sources change.
    -
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources