Skip to main content
Glama

AI2Fin (2Fin) Tax MCP

Capital gains tax estimate (71 countries)

cgt_estimate
Read-onlyIdempotent

Estimate capital gains tax on one sale of shares or property by a resident individual, for 71 countries (AE, AR, AT, AU, BE, BG, BR, CA, CH, CL, CN, CO, CY, CZ, DE, DK, EE, EG, ES, FI, FR, GB, GH, GR, GT, HK, HR, HU, ID, IE, IL, IN, IS, IT, JM, JP, KE, KR, LI, LK, LT, LU, LV, MT, MU, MX, MY, NG, NL, NO, NZ, PH, PK, PL, PT, QA, RO, RS, RU, SA, SE, SG, SI, SK, TR, TW, TZ, UA, UG, US, ZA). Where the country's rule can be computed the answer is a figure; where it depends on facts the engine cannot model, the answer is the rule itself (rate, holding period, annual exemption, main residence) with the reason — never a borrowed number. Any other country returns 'not covered'. Pass income (other taxable income for the year) where the gain is taxed at marginal rates, and heldMoreThan12Months or holdingMonths where the holding period matters (the Australian 50% discount, the US long-term rate). capitalLosses apply before any discount. Finland (FI) adds its own detail: the better of the actual cost or the deemed acquisition cost (hankintameno-olettama: 20% of the price, 40% after 10 years), the 1 000 € small-disposals rule and 30%/34% capital income tax — pass yearsHeld, and otherCapitalIncome if there is any; costBase may be omitted there. Each answer cites the capital-gains source and date for that country — not the GST/VAT one. For pay without an asset sale use income_tax_estimate. Non-resident rules are out of scope. Results may include one sourced background fact (relatedFact); the figures do not depend on it.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
assetNoWhat was sold: 'shares' (shares and funds) or 'property' (real estate). Rules differ by asset in many countriesshares
incomeNoOther taxable income for the year, in local currency — sets the marginal rate where the gain is taxed as income (e.g. AU, US short-term). Required where the rule needs it; the answer says so
countryNo2-letter ISO code of a covered country (upper case); defaults to AUAU
taxYearNoFI: calendar tax year like '2026'; omit for the current year
costBaseNoWhat the asset cost, in local currency, including eligible incidental costs. Required except for FI, where omitting it uses the deemed acquisition cost (pass FI buying and selling costs as saleExpenses)
proceedsYesSale price of the asset, in local currency
yearsHeldNoFI: whole years owned — 10 or more raises the deemed acquisition cost from 20% to 40% of the price
saleExpensesNoFI: brokerage, fees and other costs of buying and selling
capitalLossesNoCapital losses to offset — applied before any discount; FI: from this year or carried forward (five years)
holdingMonthsNoWhole months the asset was held; overrides heldMoreThan12Months
otherCapitalIncomeNoFI: other capital income this year (dividends, rent, other gains) — decides how much of the gain falls above the 30 000 € threshold
heldMoreThan12MonthsNoTrue when the asset was held at least 12 months (e.g. the AU 50% discount, the US long-term rate). Shorthand for holdingMonths: true = 12, false = 0
totalProceedsThisYearNoFI: the year's total sale prices, this sale included, for the 1 000 € small-disposals rule; omit when this is the only sale

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
lossNoFI: the loss on this sale, if any (only ever from the actual cost)
ruleNoThe country's rule as written, for relaying — especially when status is rule-only
stepNoWhich holding-period step applied, when the rule has steps
notesNoFI: rules that decided the answer, in plain words
methodNoFI: whether the actual cost or the deemed acquisition cost was deducted
reasonNoWhy no figure was computed (rule-only), in plain words
sourceYesThe national tax authority the figures were verified against (e.g. 'ATO — ato.gov.au')
statusYes'computed' = a figure; 'rule-only' = the rule text and the reason no figure is given (cgtPayable and taxableGain are then null)
countryYesCountry estimated (2-letter ISO code)
taxYearYesTax year whose rules were used, when the rule is year-based
currencyNoCurrency of every monetary field
grossGainYesProceeds minus cost (FI: minus the larger of actual or deemed cost). Floored at 0, local currency
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
cgtPayableYesExtra tax caused by the gain, in local currency; null when rule-only
disclaimerYesGeneral-information note that must accompany any figure shown to a person
lossOffsetYesCapital losses actually applied
mayBeStaleYesTrue once the verification date is over a year old — re-confirm with the authority
assumptionsNoAssumptions the answer depends on — relay them with the figure
relatedFactNoOne sourced background fact about the country's capital gains tax; the figures do not depend on it. Absent when no sourced fact fits.
taxableGainYesGain the tax was charged on; null when rule-only
costDeductedNoFI: the cost deducted from the price
dataVerifiedOnYesISO date the rate data was last confirmed against the authority
lossDeductibleNoFI: whether that loss can be deducted
discountAppliedYesWhether a discount or inclusion rate reduced the taxable gain (e.g. the AU 50% discount). Always false for FI
exemptionAppliedNoAnnual exempt amount or allowance used, where there is one
smallDisposalsExemptNoFI: true when the year's sale prices total 1 000 € or less, making every gain tax-free

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed43 schema fields changed
    • addedInput schema / properties / asset
      Added value: +{
      +  "default": "shares",
      +  "description": "What was sold: 'shares' (shares and funds) or 'property' (real estate). Rules differ by asset in many countries",
      +  "enum": [
      +    "shares",
      +    "property"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / capitalLosses / description
      Previous value: -"Capital losses to offset, in AUD — applied against the gross gain before any discount"New value: +"Capital losses to offset — applied before any discount; FI: from this year or carried forward (five years)"
    • changedInput schema / properties / costBase / description
      Previous value: -"Cost base in AUD — what the asset cost, including eligible incidental costs"New value: +"What the asset cost, in local currency, including eligible incidental costs. Required except for FI, where omitting it uses the deemed acquisition cost (pass FI buying and selling costs as saleExpenses)"
    • addedInput schema / properties / country
      Added value: +{
      +  "default": "AU",
      +  "description": "2-letter ISO code of a covered country (upper case); defaults to AU",
      +  "enum": [
      +    "AE",
      +    "AR",
      +    "AT",
      +    "AU",
      +    "BE",
      +    "BG",
      +    "BR",
      +    "CA",
      +    "CH",
      +    "CL",
      +    "CN",
      +    "CO",
      +    "CY",
      +    "CZ",
      +    "DE",
      +    "DK",
      +    "EE",
      +    "EG",
      +    "ES",
      +    "FI",
      +    "FR",
      +    "GB",
      +    "GH",
      +    "GR",
      +    "GT",
      +    "HK",
      +    "HR",
      +    "HU",
      +    "ID",
      +    "IE",
      +    "IL",
      +    "IN",
      +    "IS",
      +    "IT",
      +    "JM",
      +    "JP",
      +    "KE",
      +    "KR",
      +    "LI",
      +    "LK",
      +    "LT",
      +    "LU",
      +    "LV",
      +    "MT",
      +    "MU",
      +    "MX",
      +    "MY",
      +    "NG",
      +    "NL",
      +    "NO",
      +    "NZ",
      +    "PH",
      +    "PK",
      +    "PL",
      +    "PT",
      +    "QA",
      +    "RO",
      +    "RS",
      +    "RU",
      +    "SA",
      +    "SE",
      +    "SG",
      +    "SI",
      +    "SK",
      +    "TR",
      +    "TW",
      +    "TZ",
      +    "UA",
      +    "UG",
      +    "US",
      +    "ZA"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / heldMoreThan12Months / description
      Previous value: -"True when the asset was held over 12 months, which halves the taxable gain (the 50% CGT discount)"New value: +"True when the asset was held at least 12 months (e.g. the AU 50% discount, the US long-term rate). Shorthand for holdingMonths: true = 12, false = 0"
    • addedInput schema / properties / holdingMonths
      Added value: +{
      +  "description": "Whole months the asset was held; overrides heldMoreThan12Months",
      +  "minimum": 0,
      +  "type": "integer"
      +}
    • changedInput schema / properties / income / description
      Previous value: -"Other taxable income for the year in AUD (salary etc.) — sets the marginal rate the gain stacks on"New value: +"Other taxable income for the year, in local currency — sets the marginal rate where the gain is taxed as income (e.g. AU, US short-term). Required where the rule needs it; the answer says so"
    • addedInput schema / properties / otherCapitalIncome
      Added value: +{
      +  "default": 0,
      +  "description": "FI: other capital income this year (dividends, rent, other gains) — decides how much of the gain falls above the 30 000 € threshold",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • changedInput schema / properties / proceeds / description
      Previous value: -"Sale price of the asset in AUD"New value: +"Sale price of the asset, in local currency"
    • addedInput schema / properties / saleExpenses
      Added value: +{
      +  "default": 0,
      +  "description": "FI: brokerage, fees and other costs of buying and selling",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / taxYear
      Added value: +{
      +  "description": "FI: calendar tax year like '2026'; omit for the current year",
      +  "pattern": "^\\d{4}$",
      +  "type": "string"
      +}
    • addedInput schema / properties / totalProceedsThisYear
      Added value: +{
      +  "description": "FI: the year's total sale prices, this sale included, for the 1 000 € small-disposals rule; omit when this is the only sale",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • addedInput schema / properties / yearsHeld
      Added value: +{
      +  "description": "FI: whole years owned — 10 or more raises the deemed acquisition cost from 20% to 40% of the price",
      +  "minimum": 0,
      +  "type": "number"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "income",
      -  "proceeds",
      -  "costBase",
      -  "heldMoreThan12Months"
      -]New value: +[
      +  "proceeds"
      +]
    • addedOutput schema / properties / assumptions
      Added value: +{
      +  "description": "Assumptions the answer depends on — relay them with the figure",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / cgtPayable / description
      Previous value: -"Extra tax caused by the gain (AUD)"New value: +"Extra tax caused by the gain, in local currency; null when rule-only"
    • changedOutput schema / properties / cgtPayable / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • addedOutput schema / properties / costDeducted
      Added value: +{
      +  "description": "FI: the cost deducted from the price",
      +  "type": "number"
      +}
    • changedOutput schema / properties / country / description
      Previous value: -"Always AU — this tool is Australia-only"New value: +"Country estimated (2-letter ISO code)"
    • removedOutput schema / properties / country / enum
      Removed value: -[
      -  "AU"
      -]
    • addedOutput schema / properties / currency
      Added value: +{
      +  "description": "Currency of every monetary field",
      +  "type": "string"
      +}
    • changedOutput schema / properties / discountApplied / description
      Previous value: -"Whether the 50% discount halved the taxable gain"New value: +"Whether a discount or inclusion rate reduced the taxable gain (e.g. the AU 50% discount). Always false for FI"
    • addedOutput schema / properties / exemptionApplied
      Added value: +{
      +  "description": "Annual exempt amount or allowance used, where there is one",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / grossGain / description
      Previous value: -"Proceeds minus cost base, floored at 0 (AUD)"New value: +"Proceeds minus cost (FI: minus the larger of actual or deemed cost). Floored at 0, local currency"
    • changedOutput schema / properties / grossGain / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • addedOutput schema / properties / loss
      Added value: +{
      +  "description": "FI: the loss on this sale, if any (only ever from the actual cost)",
      +  "type": "number"
      +}
    • addedOutput schema / properties / lossDeductible
      Added value: +{
      +  "description": "FI: whether that loss can be deducted",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / lossOffset / description
      Previous value: -"Capital losses actually applied (AUD)"New value: +"Capital losses actually applied"
    • changedOutput schema / properties / lossOffset / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • addedOutput schema / properties / method
      Added value: +{
      +  "description": "FI: whether the actual cost or the deemed acquisition cost was deducted",
      +  "enum": [
      +    "actual",
      +    "deemed"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / notes
      Added value: +{
      +  "description": "FI: rules that decided the answer, in plain words",
      +  "items": {
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / reason
      Added value: +{
      +  "description": "Why no figure was computed (rule-only), in plain words",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / relatedFact
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "One sourced background fact about the country's capital gains 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 / rule
      Added value: +{
      +  "description": "The country's rule as written, for relaying — especially when status is rule-only",
      +  "properties": {
      +    "annualExemption": {
      +      "type": "string"
      +    },
      +    "holdingPeriod": {
      +      "type": "string"
      +    },
      +    "mainResidence": {
      +      "type": "string"
      +    },
      +    "notes": {
      +      "type": "string"
      +    },
      +    "rule": {
      +      "type": "string"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / smallDisposalsExempt
      Added value: +{
      +  "description": "FI: true when the year's sale prices total 1 000 € or less, making every gain tax-free",
      +  "type": "boolean"
      +}
    • 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"
      +}
    • addedOutput schema / properties / status
      Added value: +{
      +  "description": "'computed' = a figure; 'rule-only' = the rule text and the reason no figure is given (cgtPayable and taxableGain are then null)",
      +  "enum": [
      +    "computed",
      +    "rule-only"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / step
      Added value: +{
      +  "description": "Which holding-period step applied, when the rule has steps",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / taxYear / description
      Previous value: -"Financial year whose brackets were used"New value: +"Tax year whose rules were used, when the rule is year-based"
    • changedOutput schema / properties / taxYear / type
      Previous value: -"string"New value: +[
      +  "string",
      +  "null"
      +]
    • changedOutput schema / properties / taxableGain / description
      Previous value: -"Gain added on top of other income (AUD)"New value: +"Gain the tax was charged on; null when rule-only"
    • changedOutput schema / properties / taxableGain / type
      Previous value: -"number"New value: +[
      +  "number",
      +  "null"
      +]
    • changedOutput schema / required
      Previous value: -[
      -  "country",
      -  "taxYear",
      -  "grossGain",
      -  "lossOffset",
      -  "discountApplied",
      -  "taxableGain",
      -  "cgtPayable",
      -  "source",
      -  "dataVerifiedOn",
      -  "mayBeStale",
      -  "disclaimer"
      -]New value: +[
      +  "country",
      +  "status",
      +  "taxYear",
      +  "grossGain",
      +  "lossOffset",
      +  "discountApplied",
      +  "taxableGain",
      +  "cgtPayable",
      +  "source",
      +  "dataVerifiedOn",
      +  "mayBeStale",
      +  "disclaimer"
      +]
  2. First observed

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources