Skip to main content
Glama

Compute a tax figure with tested code

compute
Read-onlyIdempotent

Computes a tax figure with fixed, tested code instead of mental arithmetic. Use this for any figure an engine below covers; never compute that figure yourself. Pass only the facts the user gave: the engine applies the tax rules itself (allowances, standard deductions, bands, caps) and never asks you to decide a rule. Returns the result, every step, each rate used with its skill, section and quoted line, the engine's assumptions, skills_used with each skill's approval label (state it exactly as given) and a receipt id. Every engine takes tax_year and refuses a year it has no figures for. Facts marked * are required; an optional fact you leave out takes its default, and the answer states that as an assumption. If the engine returns missing_rule or needs_input, tell the user exactly what is missing or ask them for the fact. Never call again with guessed or altered facts to get a number, and never compute the figure yourself instead. Engines:

  • nl_vpb_2026 [NL]: Netherlands corporate income tax (vennootschapsbelasting) for 2026 on a BV/NV's taxable amount (after loss offset and exemptions). Facts: taxable_amount* (number), tax_year* (2026).

  • uk_ani_pension_target_2026_27 [GB]: UK 2026-27: how much to pay (net) into a relief-at-source personal pension to bring adjusted net income down to a limit. Targets: personal_allowance_taper (GBP 100,000), child_benefit_charge_nil (GBP 60,000), tax_free_childcare (limit not served by any skill: always returns missing_rule until a skill serves it). Facts: total_taxable_income* (number), existing_gross_ras_contributions (number, default 0), gross_gift_aid (number, default 0), target* (personal_allowance_taper|child_benefit_charge_nil|tax_free_childcare), tax_year* (2026-27).

  • uk_paye_take_home_2026_27 [GB]: UK employee annual income tax (rUK rates: England, Wales, Northern Ireland) and employee Class 1 NIC (category A) on salary for 2026-27, and take-home pay. Annual basis. Facts: annual_salary* (number), region* (england|wales|northern_ireland|scotland), nic_category (string, default A), other_income (number, default 0), gross_pension_contributions_ras (number, default 0), tax_year* (2026-27).

  • ca_income_tax_2026 [CA]: Canada personal income tax for 2026 or 2025 for a single person resident in Ontario, British Columbia or Alberta on 31 December: CPP and EI, net and taxable income, federal tax (basic personal amount with its phase-down, Canada employment amount), provincial tax (Ontario surtax, tax reduction, LIFT and Health Premium; BC tax reduction; Alberta 8% band and supplemental credit), the balance owing or refund against tax already paid, and what more RRSP saves. Quebec, dividends, a spouse or dependants, age 65 or over, and employment plus self-employment together are refused. Facts: province* (ON|BC|AB|QC), employment_income (number, default 0), self_employment_net_income (number, default 0), other_income (number, default 0), eligible_dividends (number, default 0), other_dividends (number, default 0), rrsp_deduction (number, default 0), tax_withheld (number, default 0), has_spouse_or_partner (boolean, default false), dependants (number, default 0), age_65_or_over (boolean, default false), tax_year* (2025|2026).

  • ca_cpp_ei_employee_2026 [CA]: Canada (outside Quebec) employee CPP (base + first additional), CPP2 and EI premiums for a full calendar year 2026 with one employer. Facts: annual_pensionable_earnings* (number), province* (string), months_employed (number, default 12), tax_year* (2026).

  • au_sbito_2026_27 [AU]: Australia 2026-27 small business income tax offset for an individual resident: 16% of the tax on net small business income, capped at $1,000, aggregated turnover under $5m. Facts: taxable_income* (number), net_small_business_income* (number), aggregated_turnover* (number), tax_year* (2026-27).

  • au_resident_tax_2026_27 [AU]: Australia, resident for the full 2026-27 year: income tax on taxable income less LITO, plus 2% Medicare levy, plus MLS check; take-home = gross income less those. Facts: gross_income* (number), other_deductions (number, default 0), has_salary_or_wage_income* (boolean), actual_work_expenses_claimed (number, default 0), has_private_hospital_cover* (boolean), has_help_debt (boolean, default false), tax_year* (2026-27).

  • ie_self_employed_2025_2026 [IE]: Ireland, self-employed sole trader, tax year 2025 or 2026: income tax (bands, personal, earned income and employee credits, pension relief), USC, PRSI Class S, the Form 11 balance, and the minimum preliminary tax for the next year (lowest of 90% of next year, 100% of this year, 105% of the year before for direct debit). Facts: tax_year* (2025|2026), status* (single|married_one_income|married_two_incomes|single_parent), trading_profit* (number), capital_allowances (number, default 0), other_income (number, default 0), other_income_is_paye (boolean), spouse_income (number), spouse_income_is_paye (boolean), paye_income_tax_deducted (number), paye_usc_deducted (number), pension_contributions (number, default 0), age (number), age_65_plus (boolean, default false), medical_card (boolean, default false), home_carer_credit (boolean, default false), preliminary_tax_paid (number, default 0), next_year_liability_estimate (number), pays_by_direct_debit (boolean, default false), liability_year_before (number).

  • ie_income_tax_usc_2026 [IE]: Ireland 2026: income tax (after personal + PAYE credits) and USC for a single PAYE employee for the full year, cumulative basis. Facts: gross_pay* (number), employee_pension_contribution (number, default 0), status* (string), age_70_or_full_medical_card (boolean, default false), tax_year* (2026).

  • mt_household_comparison_2026 [MT]: Malta resident married couple, basis year 2026 (year of assessment 2027) or basis year 2025 (year of assessment 2026): compares the joint computation on the married table, separate computation (article 49A or 50) with each spouse on the single or parent table, and either of those with spouse B's part-time self-employment profit taxed at the final 10% (article 90A, up to EUR 12,000), and says which gives the least tax. Facts: spouse_a_chargeable_income* (number), spouse_b_chargeable_income* (number), married_resident_living_together* (boolean), children (number), eu_eea_or_long_term_resident (boolean), children_born_and_resident_in_malta (number), separate_computation_available (boolean), spouse_a_parent (boolean), spouse_b_parent (boolean), spouse_b_part_time_profit (number, default 0), part_time_eligible (boolean), separate_route (article_50|article_49A), spouse_b_part_time_in_own_right (boolean), income_or_deductions_to_allocate (boolean, default false), credits_or_other_deductions (boolean, default false), tax_year* (2025|2026).

  • mt_income_tax_2026 [MT]: Malta resident income tax on chargeable income for basis year 2026 (year of assessment 2027) or basis year 2025 (year of assessment 2026): picks the single, married or parent table, including the 2026 qualifying-child tables, from the person's facts. Facts: chargeable_income* (number), resident* (boolean), status* (single|married_joint|parent|single_parent_sole_custody), children (number), eu_eea_or_long_term_resident (boolean), children_born_and_resident_in_malta (number), tax_paid (number, default 0), tax_year* (2025|2026).

  • de_est_tariff_2026 [DE]: Germany 2026 income tax from the § 32a EStG tariff on taxable income (zu versteuerndes Einkommen), Grundtarif or splitting. Excludes solidarity surcharge and church tax. Facts: taxable_income_zve* (number), assessment* (single|joint), tax_year* (2026).

  • pt_ss_independent_2026 [PT]: Portugal 2026: monthly social security contribution of a self-employed worker (quarterly regime) from the quarter's declared service/goods income; applies to the declaration month and the next two. Facts: quarter_services_income* (number), quarter_goods_income (number, default 0), is_eni_or_eirl (boolean, default false), base_adjustment_pct (number, default 0), exempt (boolean, default false), tax_year* (2026).

  • us_federal_income_tax_2026 [US]: US federal individual income tax on Form 1040 for tax year 2025 or 2026: AGI, standard or itemized deduction, the simplified QBI deduction, bracket tax with the 0%/15%/20% rates on qualified dividends and long-term gains, the child tax credit, self-employment tax, Additional Medicare Tax and net investment income tax, plus the estimated-tax safe harbour and due dates. Refuses the alternative minimum tax when it cannot be shown to be zero, QBI above the threshold, the child tax credit above its phase-out start, and 2025 married filing separately. Facts: filing_status* (single|married_filing_jointly|married_filing_separately|head_of_household), wages (number, default 0), w2_social_security_wages (number), w2_medicare_wages (number), self_employment_net_profit (number, default 0), self_employed_retirement_and_health_deductions (number, default 0), other_adjustments (number, default 0), interest (number, default 0), ordinary_dividends (number, default 0), qualified_dividends (number, default 0), short_term_capital_gains (number, default 0), long_term_capital_gains (number, default 0), other_ordinary_income (number, default 0), itemized_deductions (number), itemized_state_and_local_taxes (number), cash_charitable_gifts (number, default 0), dependents_under_17 (number, default 0), materially_participates (boolean), prior_year_tax (number), prior_year_agi (number), tax_year* (2025|2026).

  • us_se_tax [US]: US self-employment tax (Schedule SE regular method) for tax year 2025 or 2026: 92.35% of net profit, 12.4% social security up to the wage base less W-2 SS wages, 2.9% Medicare uncapped. Excludes the 0.9% Additional Medicare Tax (Form 8959). Facts: schedule_c_net_profit* (number), w2_social_security_wages (number, default 0), tax_year* (2025|2026).

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "engine": "<engine>",
      "facts": "<facts>"
    },
    "name": "compute"
  }
}

Input Schema

NameRequiredDescriptionDefault
factsYesThe engine's facts by name, e.g. {"annual_salary": 60000, "region": "england"}. Amounts are plain numbers in the engine's currency.
engineYesThe engine name, from the list in this description (or start's `engine.name`).
reasonNoOne sentence on WHY you're making this call, in the user's terms (for routing analysis only). Optional.

Output Schema

NameRequiredDescriptionDefault
whatNoneeds_input: the fact to ask for. missing_rule: the figure no skill serves.
stepsNo
engineNo
resultNolabel, value, currency and every computed line.
schemaNo
statusYes
messageNo
receiptNoid (sha256 of engine, version, facts and result), engine_version, computed_at.
tax_yearNoThe tax year the figures are for.
assumptionsNo
instructionNoOn a refusal: what to do next. Follow it.
next_actionNo
skills_usedNoslug, label ('Approved by [name]' or 'Not yet approved'), approval. Read live.
constants_usedNoname, value, slug, section, quote: each figure and the skill line it came from.
engine_versionNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / engine / enum
      Previous value: -[
      -  "nl_vpb_2026",
      -  "uk_ani_pension_target_2026_27",
      -  "uk_paye_take_home_2026_27",
      -  "ca_cpp_ei_employee_2026",
      -  "au_sbito_2026_27",
      -  "au_resident_tax_2026_27",
      -  "ie_self_employed_2025_2026",
      -  "ie_income_tax_usc_2026",
      -  "mt_household_comparison_2026",
      -  "mt_income_tax_2026",
      -  "de_est_tariff_2026",
      -  "pt_ss_independent_2026",
      -  "us_federal_income_tax_2026",
      -  "us_se_tax"
      -]New value: +[
      +  "nl_vpb_2026",
      +  "uk_ani_pension_target_2026_27",
      +  "uk_paye_take_home_2026_27",
      +  "ca_income_tax_2026",
      +  "ca_cpp_ei_employee_2026",
      +  "au_sbito_2026_27",
      +  "au_resident_tax_2026_27",
      +  "ie_self_employed_2025_2026",
      +  "ie_income_tax_usc_2026",
      +  "mt_household_comparison_2026",
      +  "mt_income_tax_2026",
      +  "de_est_tariff_2026",
      +  "pt_ss_independent_2026",
      +  "us_federal_income_tax_2026",
      +  "us_se_tax"
      +]
  2. Changed1 schema field changed
    • changedInput schema / properties / engine / enum
      Previous value: -[
      -  "nl_vpb_2026",
      -  "uk_ani_pension_target_2026_27",
      -  "uk_paye_take_home_2026_27",
      -  "ca_cpp_ei_employee_2026",
      -  "au_sbito_2026_27",
      -  "au_resident_tax_2026_27",
      -  "ie_self_employed_2025_2026",
      -  "ie_income_tax_usc_2026",
      -  "mt_household_comparison_2026",
      -  "mt_income_tax_2026",
      -  "de_est_tariff_2026",
      -  "pt_ss_independent_2026",
      -  "us_se_tax"
      -]New value: +[
      +  "nl_vpb_2026",
      +  "uk_ani_pension_target_2026_27",
      +  "uk_paye_take_home_2026_27",
      +  "ca_cpp_ei_employee_2026",
      +  "au_sbito_2026_27",
      +  "au_resident_tax_2026_27",
      +  "ie_self_employed_2025_2026",
      +  "ie_income_tax_usc_2026",
      +  "mt_household_comparison_2026",
      +  "mt_income_tax_2026",
      +  "de_est_tariff_2026",
      +  "pt_ss_independent_2026",
      +  "us_federal_income_tax_2026",
      +  "us_se_tax"
      +]
  3. Changed1 schema field changed
    • changedInput schema / properties / engine / enum
      Previous value: -[
      -  "nl_vpb_2026",
      -  "uk_ani_pension_target_2026_27",
      -  "uk_paye_take_home_2026_27",
      -  "ca_cpp_ei_employee_2026",
      -  "au_sbito_2026_27",
      -  "au_resident_tax_2026_27",
      -  "ie_income_tax_usc_2026",
      -  "mt_income_tax_2026",
      -  "de_est_tariff_2026",
      -  "pt_ss_independent_2026",
      -  "us_se_tax"
      -]New value: +[
      +  "nl_vpb_2026",
      +  "uk_ani_pension_target_2026_27",
      +  "uk_paye_take_home_2026_27",
      +  "ca_cpp_ei_employee_2026",
      +  "au_sbito_2026_27",
      +  "au_resident_tax_2026_27",
      +  "ie_self_employed_2025_2026",
      +  "ie_income_tax_usc_2026",
      +  "mt_household_comparison_2026",
      +  "mt_income_tax_2026",
      +  "de_est_tariff_2026",
      +  "pt_ss_independent_2026",
      +  "us_se_tax"
      +]
  4. Changed1 schema field changed
    • changedInput schema / properties / engine / enum
      Previous value: -[
      -  "nl_vpb_2026",
      -  "uk_ani_pension_target_2026_27",
      -  "uk_paye_take_home_2026_27",
      -  "ca_cpp_ei_employee_2026",
      -  "au_sbito_2026_27",
      -  "au_resident_tax_2026_27",
      -  "ie_income_tax_usc_2026",
      -  "de_est_tariff_2026",
      -  "pt_ss_independent_2026",
      -  "us_se_tax"
      -]New value: +[
      +  "nl_vpb_2026",
      +  "uk_ani_pension_target_2026_27",
      +  "uk_paye_take_home_2026_27",
      +  "ca_cpp_ei_employee_2026",
      +  "au_sbito_2026_27",
      +  "au_resident_tax_2026_27",
      +  "ie_income_tax_usc_2026",
      +  "mt_income_tax_2026",
      +  "de_est_tariff_2026",
      +  "pt_ss_independent_2026",
      +  "us_se_tax"
      +]
  5. Added

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 discloses the return contents, including the result, every step, rates with skill/section/quoted line, assumptions, skills_used approval labels, and a receipt id. It also explains engine refusal behavior for unsupported tax years and missing rules, which is substantial 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?

The description is long, but the length is justified by the 15 engines and their fact lists. It is front-loaded with core rules and then structured as a readable engine list, though some repetition about not computing manually could be trimmed.

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, the description is complete: it covers engine selection, fact passing, defaults, refusal behavior, return contents, and safety constraints. The output schema and annotations further support completeness without requiring the description to explain return values in more detail.

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 the top-level schema has full coverage, the nested facts object is open-ended and the description supplies the engine-specific fact names, required markers, defaults, and allowed values. This adds essential meaning that the schema alone cannot 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 states a specific verb and resource: compute a tax figure using fixed, tested code, and it lists the exact engines covered. It clearly separates this from mental arithmetic, but it does not explicitly differentiate itself from sibling tools such as get_skill or search_rules.

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?

It gives explicit when-to-use guidance: use this for any figure an engine covers and never compute the figure yourself. It also states what to do when the engine returns missing_rule or needs_input, and forbids retrying with guessed or altered facts.

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.