Skip to main content
Glama

AI2Fin (2Fin) Tax MCP

Multi-country tax comparison

compare_countries
Read-onlyIdempotent

Compare headline tax rates — GST/VAT, top personal income tax and company tax — across several countries at once. Use it to shortlist or contrast jurisdictions (relocation, expansion, pricing); for one country's full detail use tax_rate_lookup, and to apply a rate to an amount use compute_gst_vat. Pass income to add, per country, the income_tax_estimate result for that income (income tax, total tax, take-home, average rate, with its own source). The same number is read in each country's own currency and is not converted between currencies. Income tax is estimated for 57 countries; any other row reports 'not covered' for that part and still shows its headline rates. Codes the dataset does not cover are reported back in unmatchedCodes rather than silently dropped; every matched row cites its national tax authority. Results may include one sourced background fact (relatedFact); the figures do not depend on it.

Input Schema

NameRequiredDescriptionDefault
incomeNoOptional gross annual income, before tax. The same number is applied in EACH country's own local currency — it is NOT converted (120000 means AUD 120,000 in AU, GBP 120,000 in GB and SGD 120,000 in SG). When given, each row adds an income-tax estimate for that income
taxYearNoOptional, only with income: the tax-year label passed to the income-tax estimate for every country, e.g. '2025-26' (AU/NZ/GB/IN) or '2026' (calendar-year countries). Labels differ by country; a country without that year reports the years it has instead of a figure. Omit for each country's current tax year
countriesYesCountries to compare — two or more makes a meaningful comparison

Output Schema

NameRequiredDescriptionDefault
rowsYesOne row per matched country
sourceYesThe national tax authority the figures were verified against (e.g. 'ATO — ato.gov.au')
sourceUrlNohttps link to the authority page the rate was verified against. Present only on rate answers backed by a verified ledger row — absent (never empty) otherwise, so its presence is itself the claim
disclaimerYesGeneral-information note that must accompany any figure shown to a person
mayBeStaleYesTrue once the verification date is over a year old — re-confirm with the authority
relatedFactNoOne sourced background fact about the country's consumption tax; the figures do not depend on it. Absent when no sourced fact fits.
dataVerifiedOnYesISO date the rate data was last confirmed against the authority
unmatchedCodesYesRequested codes with no data — nothing was guessed for these

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changed
    • addedInput schema / properties / income
      Added value: +{
      +  "description": "Optional gross annual income, before tax. The same number is applied in EACH country's own local currency — it is NOT converted (120000 means AUD 120,000 in AU, GBP 120,000 in GB and SGD 120,000 in SG). When given, each row adds an income-tax estimate for that income",
      +  "examples": [
      +    120000
      +  ],
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / taxYear
      Added value: +{
      +  "description": "Optional, only with income: the tax-year label passed to the income-tax estimate for every country, e.g. '2025-26' (AU/NZ/GB/IN) or '2026' (calendar-year countries). Labels differ by country; a country without that year reports the years it has instead of a figure. Omit for each country's current tax year",
      +  "type": "string"
      +}
    • addedOutput schema / properties / relatedFact
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "One sourced background fact about the country's consumption tax; the figures do not depend on it. Absent when no sourced fact fits.",
      +  "properties": {
      +    "context": {
      +      "description": "Present on a state or provincial answer: the fact is about the country as a whole",
      +      "enum": [
      +        "national"
      +      ],
      +      "type": "string"
      +    },
      +    "country": {
      +      "description": "2-letter ISO code of the country the fact is about",
      +      "type": "string"
      +    },
      +    "detail": {
      +      "description": "Longer supporting detail, when the corpus has it",
      +      "type": "string"
      +    },
      +    "fact": {
      +      "description": "The fact, in one or two sentences",
      +      "type": "string"
      +    },
      +    "kind": {
      +      "description": "'origin' = when the tax began and what it replaced; 'anniversary' = the same, on the anniversary of its start date; 'story' = a dated story from the facts corpus",
      +      "enum": [
      +        "origin",
      +        "story",
      +        "anniversary"
      +      ],
      +      "type": "string"
      +    },
      +    "more": {
      +      "description": "The tool that returns the full sourced fact set for this country",
      +      "enum": [
      +        "tax_facts"
      +      ],
      +      "type": "string"
      +    },
      +    "sourceName": {
      +      "description": "Who the fact is sourced to",
      +      "type": "string"
      +    },
      +    "sourceUrl": {
      +      "description": "Link to that source — always present",
      +      "type": "string"
      +    },
      +    "topic": {
      +      "description": "Which tax the fact is about",
      +      "enum": [
      +        "gst",
      +        "income",
      +        "company",
      +        "cgt",
      +        "super",
      +        "studentloan",
      +        "general"
      +      ],
      +      "type": "string"
      +    },
      +    "verifiedDate": {
      +      "description": "ISO date the fact was last checked against its source, when recorded",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "kind",
      +    "topic",
      +    "country",
      +    "fact",
      +    "sourceName",
      +    "sourceUrl",
      +    "more"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / rows / items / properties / dataVerifiedOn
      Added value: +{
      +  "description": "ISO date this country's rate was last confirmed against the authority",
      +  "type": "string"
      +}
    • addedOutput schema / properties / rows / items / properties / incomeTaxEstimate
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Present only when income was passed: income_tax_estimate's result for this country, in this country's own currency",
      +  "properties": {
      +    "assumptions": {
      +      "description": "Assumptions the figures depend on",
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "averageRate": {
      +      "description": "Total tax over gross, as a fraction",
      +      "type": "number"
      +    },
      +    "currency": {
      +      "description": "Currency of every monetary field",
      +      "type": "string"
      +    },
      +    "dataVerifiedOn": {
      +      "description": "ISO date that source was last checked",
      +      "type": "string"
      +    },
      +    "gross": {
      +      "description": "Gross annual income used",
      +      "type": "number"
      +    },
      +    "incomeTax": {
      +      "description": "Income tax before levies and offsets",
      +      "type": "number"
      +    },
      +    "mayBeStale": {
      +      "description": "True when that date is over a year old, or the source is unverified",
      +      "type": "boolean"
      +    },
      +    "reason": {
      +      "description": "Why there is no figure (not-covered / unavailable only)",
      +      "type": "string"
      +    },
      +    "source": {
      +      "description": "The income-tax source for this country — says 'not verified' when it was not",
      +      "type": "string"
      +    },
      +    "sourceUrl": {
      +      "description": "https link to the income-tax source — present only when verified",
      +      "type": "string"
      +    },
      +    "status": {
      +      "description": "'computed' = figures below; 'not-covered' = income tax is not estimated for this country; 'unavailable' = covered, but not for these inputs (reason says why)",
      +      "enum": [
      +        "computed",
      +        "not-covered",
      +        "unavailable"
      +      ],
      +      "type": "string"
      +    },
      +    "takeHome": {
      +      "description": "Gross minus total tax",
      +      "type": "number"
      +    },
      +    "taxYear": {
      +      "description": "Tax year the brackets belong to",
      +      "type": "string"
      +    },
      +    "totalTax": {
      +      "description": "Total tax after levies and offsets",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "status"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / rows / items / properties / mayBeStale
      Added value: +{
      +  "description": "True when that date is over a year old, or the row is unverified",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / rows / items / properties / source / description
      Previous value: -"National tax authority for this row"New value: +"Authority this country's GST/VAT rate was verified against — says 'citation pending — not verified' when it was not"
    • addedOutput schema / properties / rows / items / properties / sourceUrl
      Added value: +{
      +  "description": "https link to the authority page for the GST/VAT rate — present only for verified rows",
      +  "type": "string"
      +}
    • addedOutput schema / properties / sourceUrl
      Added value: +{
      +  "description": "https link to the authority page the rate was verified against. Present only on rate answers backed by a verified ledger row — absent (never empty) otherwise, so its presence is itself the claim",
      +  "type": "string"
      +}
  2. First observed

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare a read-only, idempotent, non-destructive, closed-world read, but the description goes well beyond them: it explains that income is read in each country's own currency and never converted, that income tax is only estimated for 57 countries, that unknown codes come back in unmatchedCodes instead of being dropped, and that every row cites a tax authority. That is exactly the kind of edge-case behavior structured fields do not carry.

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?

The core purpose and the income semantics are front-loaded, and every subsequent sentence adds an operational fact (alternatives, coverage limits, unmatched codes, currency handling, relatedFact) rather than padding. Dense but nothing is wasted.

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

Completeness5/5

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

With an output schema present the description need not restate return values, and instead covers the failure modes an agent must anticipate: uncovered codes, uncovered income-tax countries, tax-year label mismatches, and the non-converted income number. Nothing needed to call or interpret this tool 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 schema already documents all three parameters including the non-conversion example. The description still adds real meaning: which output fields appear when income is passed (income tax, total tax, take-home, average rate, with source) and the limited 57-country coverage of the income 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?

States a specific verb (Compare) and resource (headline tax rates: GST/VAT, top personal income tax, company tax) plus scope (several countries at once). It explicitly contrasts itself with two named siblings, so an agent can distinguish 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 Guidelines5/5

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

Gives concrete when-to-use scenarios (relocation, expansion, pricing) and names the alternative for the excluded case: tax_rate_lookup for one country's full detail, compute_gst_vat for applying a rate to an amount. Both routing conditions are explicit.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources