Skip to main content
Glama
dma9527

irs-taxpayer-mcp

by dma9527

🏛️ irs-taxpayer-mcp

An open-source tax estimation and planning assistant for US individual taxpayers using Model Context Protocol.

License: MIT CI npm TypeScript MCP

English | 中文 | Español | 日本語


⚠️ Disclaimer: This tool provides estimates for educational and informational purposes only. It does not constitute tax, legal, or financial advice. Always consult a qualified tax professional.

Legal Notice: This software is provided "as is" without warranty of any kind. The authors and contributors are not tax professionals, CPAs, enrolled agents, or attorneys. No attorney-client, CPA-client, or fiduciary relationship is created by using this software. Tax laws change frequently and vary by jurisdiction. The calculations may contain errors, omissions, or may not reflect the most recent legislative changes. You are solely responsible for your tax filing decisions. The authors disclaim all liability for any damages arising from the use of this software. See DISCLAIMER.md for full legal notice.

Why This MCP?

Tax season is stressful. You're juggling W-2s, 1099s, deductions, credits, and trying to figure out if you should itemize or take the standard deduction. You Google "SALT deduction limit 2025" and get 10 conflicting articles.

This MCP server puts a tax-aware assistant inside your AI chat. Ask about a supported tax scenario in plain language and get deterministic estimates from versioned TY2024 through TY2026 data. Calculations run locally on your machine. No IRS login or SSN is required.

It includes OBBB provisions modeled for TY2025, federal brackets, selected credits and deductions, and explicitly supported state-tax paths. Unsupported state calculations fail closed instead of applying a rough top-rate estimate.

Related MCP server: OpenAccountants

🔒 Privacy Architecture

Layer

Design

All tax calculations

100% local execution: zero network calls

User data storage

Stateless: nothing saved between calls

Authentication

Zero credentials: no SSN, no IRS login

Public IRS data

Bundled and versioned locally: zero runtime network calls

Telemetry

None: no analytics, no tracking, no logging

Source code

Fully open-source (MIT): audit every calculation

⚡ Getting Started

Step 1: Add to your AI assistant

Add this to your MCP client configuration:

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "irs-taxpayer": {
      "command": "npx",
      "args": ["-y", "irs-taxpayer-mcp"]
    }
  }
}

Kiro (.kiro/settings/mcp.json):

{
  "mcpServers": {
    "irs-taxpayer": {
      "command": "npx",
      "args": ["-y", "irs-taxpayer-mcp"]
    }
  }
}

Cursor: same format in Cursor's MCP settings.

Step 2: Restart your AI assistant

After saving the config, restart the app. The MCP server will auto-download and connect.

Step 3: Start asking tax questions

That's it. Just chat naturally:

  • "Calculate my federal tax: $150k income, married filing jointly, 2 kids"

  • "Compare California vs Texas vs Washington for $200k income"

  • "I'm a freelancer making $80k: what are my quarterly estimated taxes?"

  • "What tax credits am I eligible for? AGI $60k, single, one child"

  • "Should I itemize or take the standard deduction? I pay $15k in mortgage interest and $12k in state taxes"

  • "Explain the Backdoor Roth IRA strategy"

  • "How much is the EITC for a family of 4 earning $35k?"

  • "I exercised ISOs this year: will I owe AMT?"

  • "Help me plan my year-end tax moves. I have a 401k and HSA."

Alternative: Docker

docker build -t irs-taxpayer-mcp .
docker run -i irs-taxpayer-mcp

Alternative: Streamable HTTP Transport

npx irs-taxpayer-mcp --http --port 3000
# MCP endpoint: http://127.0.0.1:3000/mcp
# Health check: http://127.0.0.1:3000/health

HTTP mode is stateless and binds only to a loopback host by default. Browser requests must use an exact allowed Origin. Add a trusted browser Origin with a repeatable flag:

npx irs-taxpayer-mcp --http \
  --allowed-origin https://trusted-client.example

The legacy --sse flag remains a deprecated alias for --http. The old /sse and /messages endpoints are not exposed.

🛠️ Tools (44)

All tools use the current MCP registerTool API. Each advertises read-only annotations and an output schema, and returns both human-readable text and structuredContent. Error results include a stable error code, message, and recovery suggestion.

The 1.0 flagship generate_tax_plan workflow returns domain structured results, assumptions, official source provenance, a calculation trace, and explicit unsupported boundaries. It performs no network requests, persistence, or telemetry. Unsupported tax years, state profiles, and required worksheet facts fail closed. See Local Tax Planner 1.0 Contract.

Federal Tax Calculations

Tool

What it does

calculate_federal_tax

Full federal tax with bracket breakdown, AMT, NIIT (3.8%), Additional Medicare Tax (0.9%), QBI deduction, SE tax, capital gains, CTC

get_tax_brackets

Tax brackets and standard deduction by filing status and year

compare_filing_statuses

Side-by-side comparison of all 4 filing statuses for the same income

estimate_quarterly_tax

Estimated quarterly payments (1040-ES) with safe harbor guidance

calculate_total_tax

Combined federal + state tax in one call, with take-home pay and monthly income

calculate_w4_withholding

Per-paycheck withholding estimate with step-by-step W-4 form recommendations

Deduction Analysis

Tool

What it does

list_deductions

Browse all deductions with eligibility rules, limits, and forms

standard_vs_itemized

Compare standard vs itemized with year-specific SALT cap ($10K for TY2024, $40K for TY2025)

Tax Credits

Tool

What it does

list_tax_credits

20+ federal credits: CTC, EITC, AOTC, EV, solar, saver's credit, and more

check_credit_eligibility

Quick screening based on your income, family, and situation

calculate_eitc

Precise EITC calculation with phase-in/plateau/phase-out for 0-3 children

Retirement & Strategy

Tool

What it does

get_retirement_accounts

IRA, Roth, 401k, SEP, Solo 401k, HSA, 529: limits, tax treatment, tips

get_retirement_strategy

Backdoor Roth, Mega Backdoor, Roth Conversion Ladder, Tax Loss/Gain Harvesting

Tax Planning & Scenarios

Tool

What it does

generate_tax_plan

Privacy-first local plan with structured results, assumptions, sources, trace, and explicit boundaries

get_tax_planning_tips

Personalized year-end optimization: 401k maxing, HSA, Roth conversion, tax-loss harvesting, charitable bunching

compare_tax_years

Compare TY2024 vs TY2025 to see how bracket changes and OBBB affect your tax

estimate_self_employment_tax

Full SE tax breakdown: Schedule C profit, SE tax, QBI deduction, quarterly payments, SEP/Solo 401k limits

analyze_mortgage_tax_benefit

Mortgage interest + property tax deduction analysis with year-specific SALT cap

analyze_education_tax_benefits

AOTC vs Lifetime Learning Credit comparison, student loan deduction, 529 plan guidance

State Taxes

Tool

What it does

get_state_tax_info

Reference data and notes for all 50 states + DC

estimate_state_tax

Estimate supported state paths; unsupported bracket data fails closed

compare_state_taxes

Compare states only when every requested calculation is supported

list_no_income_tax_states

All 9 states with no broad individual income tax

IRS Information

Tool

What it does

get_tax_deadlines

Key IRS dates and deadlines by tax year

check_refund_status

How to check your refund (guidance only: no IRS account access)

get_irs_form_info

Info about 14 common IRS forms (1040, W-2, 1099s, Schedules, etc.)

OBBB Act (2025) Tools

Tool

What it does

calculate_obbb_deductions

Calculate all 4 new OBBB deductions: tips, overtime, senior bonus, auto loan interest

what_changed_between_tax_years

Diff any two supported years: brackets, deductions, credits, SALT, and OBBB provisions

Full Reports & Analysis

Tool

What it does

generate_full_tax_report

Estimation report: income, deductions, federal, FICA, supported state tax, take-home, and refund inputs

process_1099_income

Process multiple 1099 forms (NEC, INT, DIV, B, MISC) with tax impact by category

get_personalized_tax_calendar

Personalized deadlines based on your situation (self-employed, extension, investments)

analyze_paycheck

Verify paycheck withholding accuracy, project annual tax, suggest W-4 adjustments

compare_mfj_vs_mfs

MFJ vs MFS comparison with tax diff and all MFS restriction warnings

simulate_tax_scenario

What-if modeling: income changes, relocation, Roth conversion, 401k, filing status

assess_audit_risk

IRS audit risk scoring with red flag identification and mitigation tips

get_tax_document_checklist

Personalized filing document checklist based on your income and life events

optimize_capital_gains

Investment lot analysis: 0% bracket harvesting, tax-loss harvesting, wash sale warnings

plan_retirement_withdrawals

Optimal withdrawal order (Traditional/Roth/Taxable), RMD calculation, Roth conversion

plan_multi_year_taxes

3-5 year tax projection with bracket management and age milestones

analyze_relocation_taxes

In-depth state relocation analysis with multi-year savings and SALT impact

Guidance & Feedback

Tool

What it does

run_tax_health_check

Report tool coverage and the freshness of built-in tax-year data

lookup_tax_rule

Search the built-in tax knowledge base

get_form_filing_guide

Provide step-by-step guidance for supported IRS forms

submit_feedback

Generate a prefilled GitHub issue link without transmitting tax data

📊 Tax Year Coverage

TY2024

Supported historical calculation year using IRS Revenue Procedure 2023-34. Standard deduction $14,600 (single) / $29,200 (MFJ). CTC $2,000. SALT cap $10,000.

TY2025

Reflects OBBB signed July 4, 2025:

  • Standard deduction: $15,750 (single) / $31,500 (MFJ) / $23,625 (HoH)

  • Child Tax Credit: $2,200 per child (up from $2,000)

  • SALT cap: $40,000 for AGI ≤ $500K (was $10,000)

  • New deductions: tips ($25K), overtime ($12.5K), senior bonus ($6K age 65+), auto loan interest ($10K)

  • 401k catch-up: $11,250 for ages 60-63 (SECURE 2.0)

TY2026

Uses IRS Revenue Procedure 2025-32 and the SSA 2026 contribution and benefit base:

  • Standard deduction: $16,100 (single) / $32,200 (MFJ) / $24,150 (HoH)

  • Child Tax Credit: $2,200 per qualifying child, with up to $1,700 refundable

  • SALT cap: $40,400 for MAGI up to $505,000; $20,200 and $252,500 for MFS

  • Social Security wage base: $184,500

  • Updated ordinary, capital-gains, EITC, and AMT thresholds

Supported Scope and Boundaries

This project is a deterministic estimation and planning engine, not tax preparation or filing software.

  • Federal estimates cover the modeled TY2024 through TY2026 inputs exposed by each tool. They do not implement every Form 1040 line, schedule, election, limitation, carryforward, or dependency rule.

  • State reference information covers all 50 states and DC. Numeric estimates require an exact tax-year profile: TY2024 supports AK, CA, FL, NV, SD, TN, TX, and WY; TY2025 and TY2026 support AK, FL, NH, NV, SD, TN, TX, and WY. California TY2024 supports single and married brackets. Other state-year and filing-status paths return an error.

  • State calculations do not yet model part-year or nonresident allocation, every local tax, or separate HoH and MFS brackets.

  • QBI, AMT, audit-risk, retirement, relocation, and multi-year outputs are planning estimates with documented simplifications.

  • Refund projections depend only on the inputs and refundable credits modeled by the selected tool. They are not an IRS refund determination.

  • The server does not generate a tax return, sign a return, transmit MeF data, or provide filing eligibility validation.

See ROADMAP.md for the remaining work toward a filing-grade federal return engine.

🧮 Calculation Engine

Feature

Status

Federal income tax (7 brackets × 4 statuses)

Long-term capital gains (0%/15%/20%)

Capital-loss netting, annual limit, carryovers

Planning-grade

Social Security benefit taxation

Publication 915 planning model

Retirement distributions and early tax

Planning-grade from supplied 1099-R facts

Self-employment tax (SS + Medicare)

Net Investment Income Tax (3.8% NIIT)

Additional Medicare Tax (0.9%)

Alternative Minimum Tax (AMT)

Modeled with preferential rates and stated preference-item limits

QBI Deduction (Section 199A)

Planning-grade with wage, UBIA, and SSTB limits

Child Tax Credit with phase-out

AOTC and Lifetime Learning Credit

Form 8863 planning model

EITC TY2024/TY2025/TY2026 calculation

Standard vs itemized deduction

Year-specific SALT cap (OBBB)

State reference data (50 states + DC)

State numeric estimates

Supported paths only

20+ federal credit reference and screening

Retirement account reference and planning

Planning estimate

W-4 withholding calculator

Planning estimate

Numeric regression tests cite IRS Revenue Procedures, IRC sections, and relevant legislation. Reference and planning tools may summarize rules that are not fully represented in the calculation engine.

🏗️ Build from Source

Requires Node.js 20 or later.

git clone https://github.com/dma9527/irs-taxpayer-mcp.git
cd irs-taxpayer-mcp
npm install
npm run build
npm start          # stdio mode
npm run dev        # development mode (tsx)

🐛 Found a Bug?

🤝 Contributing

Contributions welcome. Please ensure:

  • All tests pass (npm test)

  • Build succeeds (npm run build)

  • No any types in TypeScript

  • Data changes include IRS source citations

See CONTRIBUTING.md for full guidelines.

📄 License

MIT

Available Tools

44 tools
analyze_education_tax_benefitsA
Read-onlyIdempotent

Compare education tax benefits: AOTC vs Lifetime Learning Credit, student loan interest deduction, and 529 plan advantages.

ParametersJSON Schema
NameRequiredDescriptionDefault
agiYesAdjusted Gross Income
has529PlanNoContributing to or using a 529 plan
isUndergradYesIs the student in first 4 years of undergrad?
tuitionPaidYesTuition and qualified expenses paid
filingStatusYes
contribution529No529 plan contribution this year
yearsAOTCClaimedNoYears AOTC already claimed (max 4)
studentLoanInterestNoStudent loan interest paid this year

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, fully covering the safety profile, and 'Compare' is consistent with a read-only analysis. The description adds scope context (which benefits are compared) but not assumptions like federal-only treatment, AGI phaseout handling, or that married_filing_separately filers are ineligible for AOTC/LLC. With strong annotations the burden on the description is lower, so 3 is appropriate. 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.

Conciseness5/5

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

A single 16-word sentence that leads with the verb 'Compare' and front-loads the resource before enumerating the benefit categories. Every word earns its place, with no filler and no repetition of schema or annotation content.

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

Completeness3/5

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

For an 8-parameter tool analyzing four distinct tax provisions with eligibility nuances (AOTC 4-year cap, MFS exclusion, income phaseouts), the description is adequate but thin: it names what is compared but not the assumptions or limitations (federal-only scope, whether the taxpayer is assumed to be the student, how phaseouts are applied). The presence of an output schema and strong annotations relieves it of return-value and safety explanation, which prevents a lower score.

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 88%, so the schema already documents 7 of 8 parameters (filingStatus is self-documenting via its enum), which sets the baseline at 3. The description adds modest value by mapping benefit categories to parameter groups the agent must supply, but it does not explain how values like yearsAOTCClaimed (the 4-year cap) or contribution529 influence the comparison.

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 uses a specific verb ('Compare') with a specific resource ('education tax benefits') and enumerates the four items covered: AOTC, Lifetime Learning Credit, student loan interest deduction, and 529 plan advantages. This enumerated scope clearly distinguishes it from overlapping siblings like list_tax_credits, check_credit_eligibility, and list_deductions without requiring the agent to open 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 Guidelines3/5

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

The use case is implied — an agent can infer this tool is for comparing education tax benefits — but the description never states when to prefer it over overlapping siblings such as check_credit_eligibility (for 'am I eligible for AOTC?') or list_tax_credits (for 'what credits exist?'). No routing conditions, exclusions, or alternatives are named, leaving selection to inference.

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

analyze_mortgage_tax_benefitA
Read-onlyIdempotent

Analyze the tax benefit of mortgage interest deduction and property taxes. Compares itemizing with mortgage vs taking the standard deduction.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year
grossIncomeYesGross income, also used as MAGI because this tool does not collect MAGI adjustments
filingStatusYes
interestRateNoMortgage interest rate (e.g., 0.065 for 6.5%)
otherItemizedNoOther itemized deductions (charity, medical, etc.)
propertyTaxesYesAnnual property taxes paid
mortgageBalanceNoCurrent mortgage balance
mortgageInterestYesAnnual mortgage interest paid
stateIncomeTaxesNoState/local income taxes paid

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already establish the tool is read-only and idempotent. The description adds the key behavioral trait that it performs a comparison (itemized-with-mortgage vs standard deduction), which is beyond what the annotations or schema names convey. It does not mention tax-law limitations, but those are not essential for safe invocation.

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?

Two short sentences, with the primary action first and the comparison logic second. Every word adds signal and none of the schema's parameter details are redundantly repeated.

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 and read-only/idempotent annotations, the description need not explain return values or safety. It gives enough context for an agent to know this is a mortgage-focused itemization comparison; only the missing guidance against the sibling standard_vs_itemized keeps this from a 5.

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 89%, so the schema carries most parameter meaning. The description highlights mortgage interest and property taxes as the core inputs but adds no detail beyond what the schema already provides, so it stays at the baseline.

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 uses a specific verb ('Analyze') and a concrete resource ('tax benefit of mortgage interest deduction and property taxes'), then states the comparison logic (itemizing with mortgage vs standard deduction). This clearly differentiates it from the general sibling standard_vs_itemized and the education-specific analyze_education_tax_benefits.

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 scenario is implied: use this when the user asks about mortgage-interest/property-tax itemization benefits. However, it never names the closest sibling standard_vs_itemized or states when to choose one over the other, so the agent must infer the boundary.

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

analyze_paycheckA
Read-onlyIdempotent

Analyze a paycheck to verify withholding accuracy. Input your pay stub numbers and see if your employer is withholding the right amount.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year
grossPayYesGross pay this period
stateCodeNo
filingStatusYes
payFrequencyYes
stateWithheldNoState tax withheld this period
retirement401kNo401k/403b pre-tax contribution this period
federalWithheldYesFederal tax withheld this period
hsaContributionNoHSA contribution this period
medicareWithheldNoMedicare withheld
socialSecurityWithheldNoSocial Security withheld

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare the operation read-only, idempotent, and non-destructive, so the description correctly avoids repeating those. It adds a behavioral trait beyond the annotations: the tool performs a comparison/evaluation against expected withholding, producing a correctness assessment rather than just returning configuration data or raw tax figures. This meaningfully enriches the agent's understanding.

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 description is exactly two sentences with no filler. The purpose is front-loaded ('Analyze a paycheck to verify withholding accuracy'), followed by a direct instruction on usage and expected outcome. Every word earns its 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?

For a tool with 11 parameters, required fields, and an output schema, the description gives enough context for correct selection and basic invocation: it tells the user to provide pay stub numbers and describes the verification outcome. It does not explicitly state that stateCode is needed for state withholding analysis or that optional inputs control analysis scope, but the input schema and output schema cover those details. Complete enough for a moderately complex 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?

The description only says 'Input your pay stub numbers' — a general instruction that maps to all parameters but adds little specific meaning. Schema descriptions already cover most fields (73% coverage) with clear text like 'Gross pay this period' and 'Federal tax withheld this period', though stateCode lacks a description. The tool description does not compensate for that gap, leaving parameter semantics at the baseline.

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 clear, specific verb and resource: 'Analyze a paycheck to verify withholding accuracy.' It further specifies the input ('your pay stub numbers') and the outcome ('see if your employer is withholding the right amount'), which distinguishes it from sibling tools like calculate_federal_tax or estimate_state_tax by focusing on verification of actual withholding rather than tax liability calculation.

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 provides clear usage context: it is used when you have a pay stub and want to check whether withholding is correct. However, it does not explicitly name alternatives or when-not conditions, such as using calculate_w4_withholding for planning future withholding instead of verifying current paycheck numbers. The context is clear but lacks explicit exclusions.

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

analyze_relocation_taxesB
Read-onlyIdempotent

In-depth relocation tax analysis using exact-year state profiles. Additional projection years require explicit annual federal and state data.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year
toStateYesTarget state code
fromStateYesCurrent state code
dependentsNo
grossIncomeYesAnnual gross income
capitalGainsNo
filingStatusYes
yearsToProjectNoYears to project with explicit annual profiles (default: 1)
incomeGrowthRateNoAnnual income growth rate (e.g., 0.03 for 3%)
selfEmploymentIncomeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint true, idempotentHint true, and destructiveHint false. The description adds the exact-year state profile requirement and the need for explicit annual federal/state data for projections, but it does not disclose other behavioral details such as whether the analysis covers federal tax, state tax, or both.

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?

Two sentences, both essential, with the core value stated first and the key limitation second. No wasted words or redundant information.

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

Completeness2/5

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

For a tool with 10 parameters, 5 required inputs, and an output schema, the description is too sparse. It does not explain what the analysis returns, how optional inputs like capital gains or self-employment income factor in, or what 'explicit annual federal and state data' means when supplying projection years. An agent would need additional inference to call this tool correctly.

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

Parameters2/5

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

Schema description coverage is 60%, and the description adds no per-parameter detail beyond what the schema already provides. Several parameters (dependents, capitalGains, selfEmploymentIncome) remain undocumented in both schema and description, and the phrase 'exact-year state profiles' only loosely relates to taxYear and yearsToProject without explaining input expectations.

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 task ('relocation tax analysis') with useful qualifiers ('in-depth', 'exact-year state profiles'). It clearly identifies the resource and domain, though it does not explicitly differentiate itself from siblings like compare_state_taxes or plan_multi_year_taxes.

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 implies the tool is for relocation tax analysis, which gives some usage context. However, it never states when to prefer this tool over alternatives such as calculate_total_tax or compare_state_taxes, and it only mentions the projection-year input requirement as a constraint.

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

assess_audit_riskA
Read-onlyIdempotent

Evaluate your IRS audit risk based on your tax return profile. Identifies red flags, scores your risk level, and provides tips to reduce audit exposure.

ParametersJSON Schema
NameRequiredDescriptionDefault
eitcClaimedNoClaiming EITC?
grossIncomeYesTotal gross income
largeRefundNoExpecting a very large refund?
cashBusinessNoIs your business cash-intensive (restaurant, salon, etc.)?
filingStatusYes
rentalLossesNoRental property losses claimed
roundNumbersNoAre most deductions round numbers ($5,000, $10,000)?
businessMealsNoBusiness meal deductions
foreignAccountsNoHave foreign bank accounts or assets?
vehicleDeductionNoVehicle/mileage deduction
charitableNonCashNoNon-cash charitable donations (clothing, property)
cryptoTransactionsNoHad cryptocurrency transactions?
charitableDonationsNoTotal charitable donations
homeOfficeDeductionNoClaiming home office deduction?
selfEmploymentIncomeNoSelf-employment income

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds that it analyzes the tax return profile and produces risk indicators and advice, but it does not disclose additional behavioral traits such as methodology, scoring scale, or data handling. 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.

Conciseness5/5

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

Three tightly written sentences with the main action front-loaded and no filler. Each sentence earns its place: purpose, output, and actionable benefit.

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?

For a read-only analysis tool with a rich input schema and an output schema, this description gives an agent enough to decide when to call it and what to expect. Minor gaps remain around optional-field usage and clarifying that the risk score is an estimate, but these do not undermine effective invocation.

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

Parameters3/5

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

Schema description coverage is 93%, so the schema already documents nearly every parameter. The description adds only the high-level framing that the inputs form a 'tax return profile' used for risk assessment, without providing detail 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?

The description uses a specific action ('Evaluate') on a specific resource ('IRS audit risk') and clearly states what the tool produces: red flags, a risk score, and reduction tips. This audit-risk focus distinguishes it from sibling tax calculation, deadline, and deduction tools.

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 intended use is implied: call this tool when a user wants to assess IRS audit exposure based on their tax profile. However, it does not explicitly state when not to use it or how to choose it over potentially overlapping tools like run_tax_health_check.

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

calculate_eitcA
Read-onlyIdempotent

Calculate the exact Earned Income Tax Credit (EITC) amount. The EITC is one of the largest refundable credits for low-to-moderate income workers.

ParametersJSON Schema
NameRequiredDescriptionDefault
agiYesAdjusted Gross Income
taxYearYesTax year (2024, 2025, or 2026)
earnedIncomeYesEarned income (wages, salary, self-employment)
filingStatusYes
investmentIncomeNoInvestment income (interest, dividends, capital gains)
qualifyingChildrenYesNumber of qualifying children (0-3)

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already disclose that the operation is read-only and idempotent, so the description does not need to restate that. It adds useful context that EITC is a refundable credit for low-to-moderate income workers, but it does not disclose operational behaviors such as phase-out limitations, tax-year-specific rules, or how special cases like married_filing_separately are handled.

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 description is two sentences with no fluff. The first sentence leads with the action, and the second adds brief helpful context about the credit. It is front-loaded, appropriately sized, and every sentence earns its 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?

Given an output schema, read-only annotations, and a schema covering most parameters, the description is nearly complete for selecting and invoking the tool. It could go further by noting a key eligibility rule such as the married_filing_separately exclusion or the investment income cap, but these are likely handled inside the calculation and are not necessary for basic invocation.

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

Parameters3/5

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

Schema description coverage is high at 83%, so the schema already documents most parameters. The description adds no parameter-level details beyond general EITC background; specifically, it does not clarify filingStatus semantics or investmentIncome restrictions, though the schema already names these fields.

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 uses a specific verb and resource: 'Calculate the exact Earned Income Tax Credit (EITC) amount.' This clearly states what the tool computes and distinguishes it from sibling tools like list_tax_credits or check_credit_eligibility, which have different purposes.

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 implies when to use the tool—whenever an exact EITC amount needs to be calculated—but it does not explicitly discuss alternatives or when not to use it. The tool's focused verb and resource make the main use case obvious, but no exclusions or sibling comparisons are provided.

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

calculate_federal_taxA
Read-onlyIdempotent

Calculate federal income tax for an individual taxpayer. Supports TY2024 through TY2026. Includes bracket breakdown, effective/marginal rates, SE tax, NIIT, Additional Medicare Tax, QBI deduction, capital gains, and child tax credit. All calculations run locally — no data is sent to any server.

ParametersJSON Schema
NameRequiredDescriptionDefault
blindNoTaxpayer is blind
taxYearYesTax year (2024, 2025, or 2026)
w2IncomeNoW-2 wage income
dependentsNoLegacy count of qualifying child dependents for nonrefundable CTC only
grossIncomeYesTotal gross income including supplied capital gains, qualified dividends, Social Security benefits, and gross retirement distributions
hasForm2555NoWhether Form 2555 is filed, which makes ACTC unavailable
age65OrOlderNoTaxpayer is 65 or older
capitalGainsNoLong-term capital gains (can be negative for losses)
earnedIncomeNoSchedule 8812 earned income used for ACTC
filingStatusYesFiling status
stateTaxDeductedNoState/local taxes included in itemized deductions (for AMT)
isoExerciseSpreadNoISO stock option exercise spread (for AMT calculation)
taxExemptInterestNoTax-exempt interest used by the Publication 915 worksheet
earnedIncomeCreditNoEITC used by the 3-or-more-child ACTC payroll-tax method
itemizedDeductionsNoTotal itemized deductions (if greater than standard deduction)
qualifiedDividendsNoQualified dividends included in gross income, taxed at preferential rates but not netted with capital losses
netInvestmentIncomeNoTotal net investment income for NIIT, including taxable interest, dividends, gains, rents, royalties, and passive income
capitalGainsLongTermNoWhether capital gains are long-term (default: true)
selfEmploymentIncomeNoSelf-employment income (Schedule C)
aotcRefundableAllowedNoWhether refundable AOTC is allowed after under-age-24 support rules
otherDependentsForOdcNoDependents already verified for the nonrefundable Credit for Other Dependents
shortTermCapitalGainsNoShort-term capital gain or loss
aboveTheLineDeductionsNoAbove-the-line deductions (HSA, student loan interest, etc.)
socialSecurityBenefitsNoNet Social Security benefits included in grossIncome
qualifiedBusinessIncomeNoQualified Business Income for Section 199A deduction
qualifiedBusinessIsSstbNoWhether the business is a specified service trade or business
retirementDistributionsNoGross Form 1099-R distributions included in grossIncome
socialSecurityTaxesPaidNoSchedule 8812 payroll-tax amount for the 3-or-more-child ACTC method
qualifiedBusinessW2WagesNoSection 199A W-2 wages; pass 0 when none
qualifyingChildrenForCtcNoChildren already verified as CTC/ACTC qualifying children under age 17 with required SSNs
aotcStudentQualifiedExpensesNoQualified AOTC expenses per already-verified eligible student
longTermCapitalLossCarryoverNoPrior-year long-term capital loss carryover as a positive amount
shortTermCapitalLossCarryoverNoPrior-year short-term capital loss carryover as a positive amount
qualifiedBusinessPropertyBasisNoUnadjusted basis immediately after acquisition of qualified property; pass 0 when none
taxableRetirementDistributionsNoTaxable Form 1099-R amount
lifetimeLearningQualifiedExpensesNoQualified LLC expenses not used for AOTC or another benefit
marriedFilingSeparatelyLivedWithSpouseNo
earlyRetirementDistributionSubjectToPenaltyNoTaxable early-distribution amount remaining after exceptions

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish that the tool is read-only, idempotent, and non-destructive. The description adds a meaningful behavioral guarantee beyond those annotations: calculations run locally with no data sent to a server. It also communicates the scope of calculations included, which helps set expectations for what the tool can handle.

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 description is four short, purposeful sentences: primary purpose first, then year support, covered calculations, and a privacy guarantee. There is no filler or redundancy, and the feature list earns its place by clarifying the tool's scope for a complex calculator.

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?

For a tool with 38 parameters, the description provides sufficient scope, supported years, covered tax areas, and privacy context, while the rich schema and output schema carry the remaining burden. Missing explicit alternative routing is a minor gap, but nothing essential 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 97%, so the schema already documents the 38 parameters in detail. The description's feature list maps high-level tax topics like NIIT, QBI, capital gains, and child tax credit to related inputs, but it does not add parameter-specific information 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 description clearly states the verb ('Calculate') and resource ('federal income tax for an individual taxpayer'), and it lists the major tax components covered. However, it does not explicitly differentiate itself from overlapping siblings such as calculate_total_tax or simulate_tax_scenario, so sibling distinction is only implicit.

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

Usage Guidelines3/5

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

The description gives useful selection context: federal individual income tax, supported tax years 2024–2026, and the breadth of calculations included. It does not explicitly state when to prefer this tool over alternatives like calculate_total_tax, get_tax_brackets, or calculate_eitc, nor does it provide any exclusions.

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

calculate_obbb_deductionsA
Read-onlyIdempotent

Calculate all OBBB (One Big Beautiful Bill) new deductions for TY2025+: tips income deduction, overtime pay deduction, senior bonus deduction, and auto loan interest deduction. Shows which deductions you qualify for and the total tax savings.

ParametersJSON Schema
NameRequiredDescriptionDefault
ageNoTaxpayer age (needed for senior bonus)
agiYesAdjusted Gross Income
taxYearYesTax year (2025+)
spouseAgeNoSpouse age if MFJ
tipIncomeNoAnnual tip income from qualifying occupation
overtimePayNoAnnual overtime premium pay
filingStatusYes
marginalRateNoYour marginal tax rate (for savings estimate, e.g. 0.22)
autoLoanInterestNoInterest paid on qualifying US-assembled new vehicle loan

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4.2/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds behavioral value beyond the annotations by stating that it determines qualification and reports total tax savings, which clarifies the computed output without contradicting the read-only nature.

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 description is exactly two sentences, front-loading the action and resource, and then listing the deductions and the output. Every sentence earns its place with no redundancy or filler.

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

Completeness4/5

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

Given the 9-parameter schema, output schema, and read-only annotations, the description is sufficiently complete: it names all deductions, scopes the tax years, and states the output. It could add a bit more about eligibility conditions or calculation assumptions, but the structured data covers much of that context.

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 89%, so the schema already documents most parameters such as age, AGI, tipIncome, and autoLoanInterest. The description names the four deduction categories, which helps map them to parameters, but it does not add new semantic details beyond what the schema provides.

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 uses a specific verb ('Calculate') and a precise resource ('all OBBB new deductions for TY2025+'), enumerating the four deduction types and the expected output. This clearly differentiates the tool from general tax calculators and list_deductions by naming its exact scope.

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 frames the tool for the OBBB new deductions in TY2025+, and the output statement ('Shows which deductions you qualify for') makes the use case apparent. It does not explicitly name alternative sibling tools or state when not to use them, but the context is strong enough for an agent to select it appropriately.

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

calculate_total_taxA
Read-onlyIdempotent

Calculate combined federal + state tax for a complete picture of total tax liability. Returns federal breakdown, state tax, and combined totals in one call.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year (2024, 2025, or 2026)
w2IncomeNoW-2 wage income
stateCodeYesTwo-letter state code (e.g., 'CA', 'TX', 'NY')
dependentsNoLegacy dependent count for nonrefundable CTC only
grossIncomeYesTotal gross income including supplied capital gains, qualified dividends, Social Security benefits, and gross retirement distributions
hasForm2555No
capitalGainsNoLong-term capital gains
earnedIncomeNoSchedule 8812 earned income for ACTC
filingStatusYesFiling status
taxExemptInterestNo
earnedIncomeCreditNoEITC used by 3-or-more-child ACTC method
itemizedDeductionsNoTotal itemized deductions
qualifiedDividendsNoQualified dividends included in gross income
netInvestmentIncomeNoTotal net investment income used for NIIT
capitalGainsLongTermNoWhether capital gains are long-term (default: true)
selfEmploymentIncomeNoSelf-employment income
aotcRefundableAllowedNo
otherDependentsForOdcNoVerified dependents for ODC
shortTermCapitalGainsNoShort-term capital gain or loss
aboveTheLineDeductionsNoAbove-the-line deductions
socialSecurityBenefitsNo
qualifiedBusinessIncomeNoQBI for Section 199A deduction
qualifiedBusinessIsSstbNo
retirementDistributionsNo
socialSecurityTaxesPaidNoPayroll-tax amount for 3-or-more-child ACTC method
qualifiedBusinessW2WagesNo
qualifyingChildrenForCtcNoVerified CTC/ACTC qualifying children
aotcStudentQualifiedExpensesNo
longTermCapitalLossCarryoverNoPrior-year long-term capital loss carryover
shortTermCapitalLossCarryoverNoPrior-year short-term capital loss carryover
qualifiedBusinessPropertyBasisNo
taxableRetirementDistributionsNo
lifetimeLearningQualifiedExpensesNo
marriedFilingSeparatelyLivedWithSpouseNo
earlyRetirementDistributionSubjectToPenaltyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and non-destructive behavior, so the description's burden is lower. The description adds useful behavioral context by disclosing the result composition (federal breakdown, state tax, combined totals) and the one-call efficiency, which is not visible from the annotations alone.

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 description is a single front-loaded sentence followed by a clear return-value sentence. Every word earns its place, and there is zero redundancy or filler.

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

Completeness3/5

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

Given the tool's complexity (35 parameters, many optional credits and deduction inputs), the description is minimally adequate but doesn't help the agent know which optional inputs matter for a given scenario. The output schema and property descriptions compensate partially, but the high parameter count creates a completeness gap.

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

Parameters2/5

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

The description provides no parameter-level guidance despite a large 35-parameter schema with 63% description coverage. It doesn't clarify how optional fields like capitalGains, itemizedDeductions, or earnedIncomeCredit feed into the combined calculation, leaving the agent to infer meaning from the schema alone.

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 specific verb ('calculate') and resource ('combined federal + state tax'), and explicitly lists what the call returns: federal breakdown, state tax, and combined totals. This clearly differentiates it from siblings like calculate_federal_tax and estimate_state_tax, which cover only one jurisdiction.

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 phrase 'complete picture of total tax liability' and 'in one call' implies this is the right tool when both federal and state results are needed together. It doesn't explicitly name alternatives like calculate_federal_tax or estimate_state_tax, but the context makes the intended use clear without excluding them.

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

calculate_w4_withholdingA
Read-onlyIdempotent

Calculate recommended W-4 withholding settings. Estimates per-paycheck federal tax and provides step-by-step W-4 form recommendations.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year (2024, 2025, or 2026)
deductionsNoExpected itemized deductions (if more than standard)
dependentsNoNumber of qualifying child dependents
otherIncomeNoOther annual income (interest, dividends, side gigs)
spouseWorksNoDoes your spouse also work?
annualSalaryYesAnnual salary from this job
filingStatusYesFiling status
multipleJobsNoDo you hold multiple jobs simultaneously?
payFrequencyYesHow often you get paid

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, covering safety. The description adds useful behavioral context—'estimates' signals approximate output and 'recommended'/step-by-step indicates advisory results—but does not go beyond that. 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.

Conciseness5/5

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

Two tightly written sentences with no filler. The primary purpose is front-loaded in the first sentence, and the second sentence efficiently describes what the user receives without introducing concepts not covered by the schema or output.

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?

Given the rich input schema (100% param coverage) and the presence of an output schema, the description is nearly complete for invocation. It explains the tool's purpose and result format; only a small gap is the absence of explicit caveats or assumptions (e.g., that the estimate assumes current federal withholding rules), but these are not necessary for selecting and calling the 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%, and the description does not explain any parameters. Each of the 9 parameters already has a meaningful schema description (e.g., taxYear with allowed years, filingStatus enum, payFrequency enum), so the description adds no additional semantic value.

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 opens with 'Calculate recommended W-4 withholding settings,' a specific verb and resource unique among the siblings (none mention W-4). It also specifies the output: per-paycheck federal tax estimate and step-by-step W-4 form recommendations, making the tool's role unambiguous.

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

Usage Guidelines2/5

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

No guidance is given on when to choose this tool over related siblings like calculate_federal_tax or analyze_paycheck. The W-4 focus is implicit, but there is no explicit 'use this when' context or exclusion, leaving the selection decision to inference.

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

check_credit_eligibilityA
Read-onlyIdempotent

Check which tax credits you may be eligible for based on your situation.

ParametersJSON Schema
NameRequiredDescriptionDefault
agiYesAdjusted Gross Income
boughtEVNoPurchased an electric vehicle this year
isStudentNoCurrently enrolled in post-secondary education
hasChildrenNoHave qualifying children under 17
numChildrenNo
filingStatusYes
hasChildcareNoPay for childcare to work
installedSolarNoInstalled solar panels or renewable energy
paidForeignTaxNoPaid income tax to a foreign country
hasEarnedIncomeNoHas earned income from work
hasStudentLoansNoPaying student loan interest
madeHomeImprovementsNoMade energy-efficient home improvements
hasMarketplaceInsuranceNoBought health insurance through ACA marketplace
hasRetirementContributionsNoContributed to IRA/401k

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.6/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so no safety contradiction exists. The description adds little behavioral detail beyond the word 'Check', but 'may be eligible' does convey that the result is conditional rather than a firm guarantee.

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 description is one concise, front-loaded sentence with no filler. It communicates the core purpose immediately and earns its 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?

Given the rich input schema, the required AGI and filing status fields, safety annotations, and an output schema, a short description is sufficient for an agent to select and call the tool. The generic wording leaves some situational details implicit, but the schema compensates.

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 high at 86%, so the schema already explains most parameters and the description does not need to repeat them. The description adds no extra parameter-level meaning and does not clarify the one weakly documented field, numChildren, but the high schema coverage keeps this at the 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 states a specific action ('Check'), a clear resource ('tax credits'), and a clear scope ('eligible based on your situation'). It distinguishes eligibility screening from sibling tools like list_tax_credits, though it does not explicitly name that alternative.

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 phrase 'based on your situation' implies this tool should be used when a user has personal/financial details and wants credit eligibility results. However, it does not explicitly state when to prefer this over list_tax_credits, calculate_eitc, or similar siblings, leaving usage somewhat to inference.

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

check_refund_statusA
Read-onlyIdempotent

Provide instructions on how to check IRS refund status. This tool does NOT access your IRS account — it provides the official links and requirements.

ParametersJSON Schema
NameRequiredDescriptionDefault
filedElectronicallyNoWhether the return was e-filed

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already convey readOnlyHint, idempotentHint, and non-destructive behavior. The description adds important behavioral context beyond annotations: it does not access the user's IRS account, and instead provides official links and requirements. This meaningfully reduces the risk of misuse.

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?

Two sentences with no filler. The first sentence states the core function, and the second corrects the most likely misconception about what the tool can and cannot do. Every sentence earns its 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?

For a simple reference tool with one optional, fully described parameter, an output schema, and safety-related annotations, the description is largely sufficient. The only notable gap is that it does not explain how the optional 'filedElectronically' parameter changes the provided instructions, though this is a minor omission.

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

Parameters3/5

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

The schema fully documents the single parameter 'filedElectronically' with a clear description, so the schema carries the parameter meaning. However, the tool description adds nothing about how this boolean affects the instructions, links, or requirements returned.

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 uses a specific verb and resource: 'Provide instructions on how to check IRS refund status.' It also explicitly disambiguates itself from an actual account-access tool by stating it does NOT access the IRS account, which is essential for correct agent selection.

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 usage context is implied through the task framing—when the user wants instructions on how to check a refund status—but there is no explicit when-to-use guidance or named alternatives among the many sibling tax tools. The non-access caveat helps, but it does not fully steer the agent away from or toward specific siblings.

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

compare_filing_statusesA
Read-onlyIdempotent

Compare tax liability across different filing statuses for the same income. Helps determine the most advantageous filing status.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year (2024, 2025, or 2026)
dependentsNoNumber of qualifying dependents
grossIncomeYesTotal gross income
itemizedDeductionsNoItemized deductions if applicable

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds the key behavioral trait that the tool compares multiple filing statuses for a fixed income and outputs the most advantageous option, which is useful beyond the annotations. No contradictions.

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?

Two short sentences front-load the action and add the value proposition without redundancy. Every word contributes meaning.

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

Completeness5/5

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

For a simple, read-only comparison tool with an output schema and fully documented parameters, the description is complete. It conveys the input constraint (same income) and the intended decision support, so nothing critical is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all parameters (taxYear, grossIncome, dependents, itemizedDeductions). The description adds no parameter-specific detail beyond referring to 'same income,' so it stays at the 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?

Description uses a specific verb ('compare') and resource ('tax liability across different filing statuses') and states the goal ('determine the most advantageous filing status'). However, it does not enumerate which statuses are included or differentiate itself from the sibling compare_mfj_vs_mfs, so it lacks explicit sibling distinction.

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 stated purpose implies when to use it: when comparing the same income under multiple filing statuses to find the best one. It provides clear context but no explicit exclusions or alternatives, so it does not reach the highest bar.

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

compare_mfj_vs_mfsA
Read-onlyIdempotent

Compare Married Filing Jointly (MFJ) vs Married Filing Separately (MFS). Shows tax difference and lists all MFS restrictions that may affect your situation.

ParametersJSON Schema
NameRequiredDescriptionDefault
hasEITCNoEither spouse would qualify for EITC
taxYearYesTax year (2024, 2025, or 2026)
dependentsNoNumber of qualifying children (maximum 20)
spouse1IncomeYesSpouse 1 gross income
spouse2IncomeYesSpouse 2 gross income
itemizedDeductionsNoTotal itemized deductions (combined for MFJ, split for MFS)
hasEducationCreditsNoEither spouse claiming AOTC or LLC
hasIRAContributionsNoEither spouse contributing to IRA
studentLoanInterestNoEither spouse paying student loan interest

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered and the bar is lower. The description adds useful output behavior (shows the tax difference, enumerates MFS restrictions), which goes beyond the schema. It does not, however, disclose caveats such as whether it returns a recommendation or how it treats edge cases like hasEITC under MFS.

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?

Two short sentences with zero filler. The primary action is front-loaded ('Compare Married Filing Jointly vs Married Filing Separately'), and the second sentence specifies the outputs. Every word earns its place.

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

Completeness3/5

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

The output schema covers return values and annotations cover the read-only/idempotent profile, so the description is only responsible for purpose and routing. It handles purpose and output behavior well, but it lacks any differentiation from or guidance around the closely related sibling compare_filing_statuses, which is a real completeness gap for a 9-parameter 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% — all 9 parameters carry type, constraints, and explanatory text (e.g., 'combined for MFJ, split for MFS'). The description adds no parameter-level meaning of its own, so it sits at the baseline 3; it neither enriches nor undermines the schema's documentation.

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 uses a specific verb ('Compare') with an exact resource (MFJ vs MFS) and states what the tool produces: a tax difference and a list of MFS restrictions. The scope is unambiguous and the name reinforces it. However, it never explicitly names or differentiates from the overlapping sibling compare_filing_statuses, so it stops short of a 5.

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

Usage Guidelines3/5

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

When to use this tool is implied by its name and content — an agent comparing MFJ vs MFS would naturally select it. But there is no explicit when/when-not language, no mention of prerequisites, and no routing to the broader compare_filing_statuses sibling for cases involving other filing statuses. The guidance is implicit rather than stated.

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

compare_state_taxesA
Read-onlyIdempotent

Compare state income tax for one tax year only when every requested state has an explicit calculation profile.

ParametersJSON Schema
NameRequiredDescriptionDefault
statesYesArray of state codes to compare (e.g., ['CA', 'TX', 'WA', 'NY'])
taxYearYesTax year for all versioned state calculation profiles
filingStatusNoFiling status (default: single)
taxableIncomeNoDeprecated alias for incomeBeforeStateDeductions
incomeBeforeStateDeductionsNoAnnual income before modeled state deductions

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is fully covered. The description adds useful behavioral context about the single-year restriction and the state-profile precondition, but leaves open what happens if a state lacks a profile and gives no hint about error behavior or output shape beyond the output schema.

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?

One sentence, front-loaded with the core action and then the two narrow constraints. No wasted words; every phrase earns its place.

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

Completeness3/5

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

Annotations and output schema carry much of the burden, but the key precondition 'explicit calculation profile' is not operationalized: an agent has no guidance on how to determine whether a state has one or which sibling to consult beforehand. For a tool with five parameters and a conditional availability constraint, this is a meaningful 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 the schema already documents all five parameters, including the deprecated taxableIncome alias and filingStatus default. The tool description adds no parameter-level detail and therefore sits at the baseline 3 for this dimension.

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') with a clear resource ('state income tax') and two scoping constraints: one tax year only, and the requirement that every requested state has an explicit calculation profile. This distinguishes it from siblings like compare_tax_years and estimate_state_tax without needing to open 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 states the condition under which the tool should be used ('only when every requested state has an explicit calculation profile') and constrains it to a single tax year. It does not name a specific alternative tool, but the context is clear enough for an agent to infer when to look elsewhere.

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

compare_tax_yearsA
Read-onlyIdempotent

Compare tax liability across different tax years for the same income. Shows how bracket changes and inflation adjustments affect your tax.

ParametersJSON Schema
NameRequiredDescriptionDefault
dependentsNo
grossIncomeYesGross income to compare across years
filingStatusYes
selfEmploymentIncomeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful context by explaining what the comparison highlights—bracket changes and inflation adjustments—which goes 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.

Conciseness5/5

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

The description is two short sentences with no filler. It front-loads the primary action and follows with useful context about what the comparison reveals.

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?

The tool has an output schema and annotations that cover return values and safety, so the description does not need to repeat those. The main missing piece is clearer differentiation from the closely named sibling what_changed_between_tax_years, but overall the description is adequate for selecting and invoking this tool.

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

Parameters2/5

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

Schema description coverage is only 25%, and the description does not compensate. It clarifies that income is held constant ('same income') and implies bracket relevance, but it does not explain dependents, filingStatus, or selfEmploymentIncome, leaving most parameter semantics undocumented.

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 uses a specific verb ('compare') and a specific resource ('tax liability across different tax years'), while clarifying the scope with 'for the same income.' It also names the output focus ('bracket changes and inflation adjustments'), which distinguishes it from other tax tools like calculate_total_tax or compare_filing_statuses.

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 gives clear context for when to use the tool: when comparing tax liability across years while holding income constant. It does not explicitly list alternatives or when-not-to-use conditions, but the intended scenario is reasonably evident.

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

estimate_quarterly_taxA
Read-onlyIdempotent

Calculate estimated quarterly tax payments (Form 1040-ES) for self-employed or other taxpayers who need to make estimated payments.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year
filingStatusYes
otherCreditsNoExpected other tax credits
w2WithholdingNoExpected total W-2 tax withholding for the year
expectedAnnualIncomeYesExpected total annual income
selfEmploymentIncomeNoExpected self-employment income

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already cover read-only, idempotent, non-destructive behavior, so the description only adds context about Form 1040-ES and the target taxpayer. It does not disclose assumptions, calculation approach, or limitations such as whether underpayment penalties or safe harbor rules are considered. This is acceptable but not rich.

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 description is a single, focused sentence with the core action front-loaded. It avoids redundancy and wasted words, while still conveying the purpose and target users.

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

Completeness3/5

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

With an output schema and annotations present, the description provides a minimum viable explanation. However, it lacks guidance on how this tool differs from close siblings like estimate_self_employment_tax or calculate_total_tax, and it does not mention whether the result is an estimated amount per quarter or an annual total. Slightly more context would improve confidence for an agent deciding among similar tools.

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 83%, so most parameters are already documented in the schema. The description loosely adds meaning by tying 'self-employed' to selfEmploymentIncome and 'expected' income to expectedAnnualIncome, but it does not explain relationships between parameters or any special requirements 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?

The description states a specific action ('Calculate estimated quarterly tax payments'), names a concrete resource (Form 1040-ES), and identifies the target audience. It does not explicitly contrast itself with siblings like estimate_self_employment_tax or calculate_total_tax, so it stops short of full differentiation.

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 implies when to use the tool ('for self-employed or other taxpayers who need to make estimated payments'), which gives clear context. However, it does not explicitly state when not to use it or name alternative tools for related calculations, such as calculate_total_tax or estimate_self_employment_tax.

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

estimate_self_employment_taxA
Read-onlyIdempotent

Detailed self-employment tax breakdown including Schedule C profit, SE tax, QBI deduction, and recommended quarterly payments. Above the annual QBI threshold, provide SSTB classification, W-2 wages, and qualified-property basis, using 0 where none apply.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year
dependentsNo
filingStatusYes
grossRevenueYesTotal business revenue (Schedule C line 1)
otherW2IncomeNoW-2 income from other jobs
businessExpensesYesTotal business expenses (Schedule C)
healthInsurancePremiumsNoSelf-employed health insurance premiums
qualifiedBusinessIsSstbNo
retirementContributionsNoSEP IRA or Solo 401k contributions
qualifiedBusinessW2WagesNo
qualifiedBusinessPropertyBasisNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly and idempotent, so the description's incremental value lies in the conditional behavior: above the QBI threshold it will include SSTB classification, W-2 wages, and qualified-property basis, defaulting to 0 when not applicable. This gives the agent useful expectation-setting about output variation. No contradiction with the safety annotations.

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?

Two sentences with no filler; the first fronts the core purpose and output list, the second adds conditional behavior. The wording is slightly dense, but every clause carries information. Efficient for an 11-parameter estimation tool.

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?

The combination of a rich output schema and detailed conditional description covers what the tool returns and when it changes behavior. The 'annual QBI threshold' is not defined, and no alternative tools are mentioned, but the required inputs are in the schema and the main ambiguity (zero-filling unapplicable QBI values) is resolved. Sufficient for 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?

With schema description coverage at 55%, the schema already documents revenue, expenses, W-2 income, premiums, and retirement contributions. The description adds meaning for the otherwise under-documented QBI parameters by naming them and explaining that W-2 wages and property basis default to 0 when not applicable. It does not detail every remaining optional parameter, but the most ambiguous ones are addressed.

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 opens with a specific verb phrase ('Detailed self-employment tax breakdown') and names distinct outputs: Schedule C profit, SE tax, QBI deduction, and quarterly payments. This makes the tool's scope evident and separates it from sibling calculators like calculate_total_tax or estimate_quarterly_tax. The conditional QBI sentence further specifies the resource's behavior.

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 establishes clear context: it is the tool for a comprehensive self-employment tax estimate, not a general tax calculation. It stops short of explicitly naming alternatives or stating when not to use it, but the 'detailed breakdown' framing differentiates it from sibling quarterly-payment and total-tax tools. No misleading exclusions are present.

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

estimate_state_taxA
Read-onlyIdempotent

Estimate state income tax using an explicit tax-year calculation profile. Unsupported state-year paths fail closed.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year for the versioned state calculation profile
stateCodeYesTwo-letter state code
filingStatusNoFiling status (default: single)
taxableIncomeNoDeprecated alias for incomeBeforeStateDeductions
incomeBeforeStateDeductionsNoState income before the modeled state standard deduction and personal exemption

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value beyond annotations by disclosing the fail-closed behavior ('Unsupported state-year paths fail closed') and the versioned-profile semantics, which tell the agent how errors and unsupported inputs are handled. 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.

Conciseness5/5

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

Two sentences totaling roughly 20 words, with the core purpose first and the critical fail-closed behavior second. Every word earns its place; no filler.

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

Completeness4/5

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

With an output schema present, full parameter documentation in the schema, and robust annotations, the description does not need to cover return values or safety. The fail-closed disclosure fills the main behavioral gap; the only omission is explicit routing guidance versus closely related siblings, which is already penalized under usage guidelines.

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 schema already documents taxYear, stateCode, filingStatus, the deprecated taxableIncome alias, and incomeBeforeStateDeductions. The description adds only the state-year path coupling, which is useful but does not substantially deepen parameter understanding 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?

The description states a specific verb ('Estimate'), resource ('state income tax'), and a defining mechanism ('explicit tax-year calculation profile'). It clearly carves out state-level estimation, distinguishing it from siblings like calculate_federal_tax and get_state_tax_info by scope, though it does not name any 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?

The phrase 'using an explicit tax-year calculation profile' and the fail-closed note imply the tool is for supported state-year combinations where the caller provides a concrete tax year. However, there is no explicit when-to-use/when-not-to-use guidance or naming of alternatives (e.g., calculate_total_tax, get_state_tax_info), leaving selection largely to inference.

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

generate_full_tax_reportB
Read-onlyIdempotent

Generate a detailed tax estimate combining federal tax, supported state tax, FICA, modeled credits, deductions, take-home pay, and refund inputs.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year (2024, 2025, or 2026)
w2IncomeNoW-2 wages
stateCodeNoState code for state tax estimate
dependentsNoChildren already verified as CTC, ACTC, and EITC qualifying children
hasForm2555NoWhether Form 2555 is filed
otherIncomeNoOther income (rental, alimony, etc.)
filingStatusYes
otherItemizedNoOther itemized deductions
stateWithheldNoState tax already withheld YTD
dividendIncomeNo1099-DIV ordinary dividends
interestIncomeNo1099-INT interest income
federalWithheldNoFederal tax already withheld YTD
medicalExpensesNoUnreimbursed medical expenses
otherDependentsNoDependents already verified for the nonrefundable ODC
mortgageInterestNoMortgage interest
taxExemptInterestNo
qualifiedDividendsNoQualified dividends (subset of dividends, taxed at CG rates)
charitableDonationsNoCharitable contributions
stateLocalTaxesPaidNoState/local/property taxes paid
longTermCapitalGainsNoLong-term capital gains/losses
selfEmploymentIncomeNoSelf-employment net profit
aotcRefundableAllowedNo
estimatedPaymentsMadeNoEstimated tax payments already made
shortTermCapitalGainsNoShort-term capital gains/losses
aboveTheLineDeductionsNoHSA, student loan interest, educator expenses, etc.
socialSecurityBenefitsNoNet benefits from Form SSA-1099 or RRB-1099
qualifiedBusinessIncomeNoQBI for Section 199A
qualifiedBusinessIsSstbNo
retirementDistributionsNoGross Form 1099-R distributions
socialSecurityTaxesPaidNoSchedule 8812 payroll-tax amount for 3-or-more-child ACTC method
qualifiedBusinessW2WagesNo
aotcStudentQualifiedExpensesNo
longTermCapitalLossCarryoverNoPrior-year long-term capital loss carryover
shortTermCapitalLossCarryoverNoPrior-year short-term capital loss carryover
qualifiedBusinessPropertyBasisNo
taxableRetirementDistributionsNo
lifetimeLearningQualifiedExpensesNo
marriedFilingSeparatelyLivedWithSpouseNo
earlyRetirementDistributionSubjectToPenaltyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safe compute-only profile is established without description help. The description adds modest context: the term 'supported state tax' hints that state coverage is conditional, and listing 'refund inputs' clarifies the report computes refund/amount-owed impact. No contradiction with annotations — 'generate an estimate' is consistent with a read-only computation. It stops short of explaining output format or behavior on unsupported states, but the output schema partially covers that.

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

Conciseness5/5

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

A single 22-word sentence that front-loads the verb and resource, then efficiently enumerates the report's coverage in one clause. There is zero filler, and the description earns its place by communicating scope without redundantly listing parameter names already visible in the schema.

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

Completeness2/5

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

For a tool with 39 parameters and two required fields, the one-sentence description is thin. It does not tell an agent which of the many optional parameters matter for common scenarios, does not clarify whether unspecified fields default to zero, and provides no contrast with the heavily overlapping sibling calculators. While the output schema and annotations reduce the burden on the description, an agent still lacks the context needed to reliably select this tool over calculate_total_tax or simulate_tax_scenario and to scope the parameter set for a real user situation.

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 72%, which is in the mid-range, so the schema carries most parameter documentation (with gaps like qualifiedDividends, taxExemptInterest, and qualifiedBusinessPropertyBasis having no descriptions). The tool description adds a light semantic overlay by grouping the 39 parameters into categories (federal inputs, state inputs, FICA, credits, deductions, take-home pay, refund inputs), which helps an agent mentally organize the parameter space. It does not add per-parameter detail beyond what the schema 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 description uses a specific verb ('Generate'), a clear resource ('detailed tax estimate'), and enumerates the components ('federal tax, supported state tax, FICA, modeled credits, deductions, take-home pay, and refund inputs'). This establishes it as a comprehensive aggregation tool. However, it does not explicitly differentiate from close siblings like calculate_total_tax or calculate_federal_tax; the 'combining' wording and 'full' in the name imply scope but the distinction is left to inference.

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

Usage Guidelines2/5

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

No usage guidance is provided. With 43 siblings including calculate_federal_tax, estimate_state_tax, calculate_total_tax, and simulate_tax_scenario, an agent has no explicit direction about when to invoke this comprehensive report instead of a single-component calculator. The description offers no 'use X instead when...' routing, leaving the agent to guess based on the word 'full'.

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

generate_tax_planA
Read-onlyIdempotent

Generate a deterministic, privacy-first local tax plan with structured results, assumptions, source provenance, calculation trace, and explicit unsupported boundaries.

ParametersJSON Schema
NameRequiredDescriptionDefault
familyNo
incomeYesAnnual income facts. Qualified dividends are included in ordinary dividends.
taxYearYesTax year: 2024, 2025, or 2026
businessNo
paymentsNo
educationNo
stateCodeNo
deductionsNo
filingStatusYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
planNo
textYes
errorNo
isErrorYes

TDQS

A3.5/5.0
Behavior5/5

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

The description adds meaningful behavioral context beyond the readOnly and idempotent annotations: the computation is deterministic, executed locally/privacy-first, and the output includes assumptions, source provenance, calculation trace, and explicit unsupported boundaries. This materially helps an agent trust and interpret the result.

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?

One dense sentence with no filler; every element—deterministic, privacy-first, structured results, assumptions, provenance, trace, unsupported boundaries—earns its place and conveys a distinct attribute of the tool.

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

Completeness2/5

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

The tool is complex: 9 parameters, nested income objects, four filing-status enums, and tax-year constraints. The description focuses on output characteristics rather than invocation context, required fields, or input categories. The output schema covers return shape, but the description leaves too much for an agent to infer about how to call this tool correctly.

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

Parameters1/5

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

Schema description coverage is only 22%, yet the description names no parameters and gives no hints about taxYear, filingStatus, income, family, business, payments, education, stateCode, or deductions. It does nothing to compensate for the low schema coverage, so parameter semantics are effectively absent.

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 uses a specific verb ('Generate') and a specific resource ('tax plan'), then distinguishes the tool through traits like 'deterministic', 'privacy-first local', 'source provenance', and 'calculation trace'. These traits separate it from sibling tools such as generate_full_tax_report or simulate_tax_scenario without needing to open 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 Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives like simulate_tax_scenario, generate_full_tax_report, or plan_multi_year_taxes. No exclusions, prerequisites, or decision conditions are given; usage context is only implied by the tool's name and the word 'plan'.

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

get_form_filing_guideA
Read-onlyIdempotent

Step-by-step guide for filling out a specific IRS form or schedule. Explains each section, what data you need, and common mistakes to avoid.

ParametersJSON Schema
NameRequiredDescriptionDefault
formNumberYesIRS form (e.g., '1040', 'Schedule C', 'Schedule D', 'Form 8949', 'W-4')

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds useful behavioral context about the returned content: section-by-section guidance, required data, and mistake warnings, without contradicting 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.

Conciseness5/5

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

The description is a single, information-dense sentence with no filler. It front-loads the core purpose and then quickly adds useful details about the guide's content.

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?

For a simple read-only lookup with one parameter and an output schema, the description is largely complete. It explains what the output covers, though it does not mention any limitations on form coverage or whether some forms/schedules are unsupported.

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?

The schema already documents formNumber at 100% coverage with concrete examples. The description adds only the generic concept of 'form or schedule' and provides no additional parameter-level meaning, so the baseline of 3 is appropriate.

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

Purpose4/5

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

The description clearly states the tool provides a step-by-step guide for a specific IRS form or schedule, and specifies what the guide contains (sections, required data, common mistakes). It distinguishes itself from general tax calculators, though it does not explicitly contrast with the similar sibling get_irs_form_info.

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 intended context is implied: use when someone needs help filling out an IRS form. However, the description provides no explicit guidance on when not to use it or which sibling tool (e.g., get_irs_form_info for form overviews) should be preferred instead.

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

get_irs_form_infoA
Read-onlyIdempotent

Get information about common IRS tax forms — what they are, who needs them, and where to find them.

ParametersJSON Schema
NameRequiredDescriptionDefault
formNumberYesIRS form number (e.g., '1040', 'W-2', '1099-NEC', 'Schedule C')

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish that this is a safe, read-only, idempotent operation. The description adds useful context about the scope ('common' forms) and the nature of the returned content (explanations, audience, and sources), which goes beyond the bare annotations without contradicting them.

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 description is a single sentence with no filler. The main action and resource are front-loaded, and the em-dash efficiently enumerates the three kinds of information provided.

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?

For a low-complexity tool with one parameter and an output schema, the description covers the essential purpose and content areas. It is slightly incomplete in that it does not clarify which forms are considered 'common' or how this relates to filing-format guidance from siblings, but this is 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?

The input schema already documents the single parameter formNumber with helpful examples, so the description carries little parameter burden. It does not add any additional semantic detail about the parameter, justifying the baseline score for high 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?

The description clearly identifies the verb ('Get information') and resource ('IRS tax forms'), and adds the scope qualifier 'common' to narrow the topic. It does not explicitly distinguish itself from the closely related sibling get_form_filing_guide, so it stops short of a 5.

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

Usage Guidelines3/5

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

The description implies the tool is for general lookup of IRS form information—what forms are, who needs them, and where to find them—but it gives no explicit guidance on when to prefer this tool over siblings like get_form_filing_guide or lookup_tax_rule. No alternatives or exclusions are mentioned.

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

get_personalized_tax_calendarA
Read-onlyIdempotent

Generate a personalized tax calendar based on your situation. Shows deadlines for filing, estimated payments, extensions, and key actions.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year to get calendar for
hasEmployerNoDo you have W-2 employment?
filedExtensionNoDid you file an extension?
hasInvestmentsNoDo you have investment accounts?
isSelfEmployedNoDo you have self-employment income?
hasRentalIncomeNoDo you have rental property income?

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint: true, idempotentHint: true, and destructiveHint: false, fully covering the safety profile. The description adds contextual value by stating the output covers 'deadlines for filing, estimated payments, extensions, and key actions,' but it does not disclose any behavioral quirks beyond what annotations and the output schema already convey. No contradiction exists.

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 description is two tight sentences with no wasted words. The action and resource are front-loaded in the first sentence, and the second sentence efficiently enumerates what the calendar includes.

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 a rich output schema and annotations covering read-only and idempotent behavior, the description plus schema are largely sufficient for an agent to invoke the tool correctly. The only notable gap is the lack of guidance for choosing between this tool and get_tax_deadlines, but the optional parameters and required taxYear are documented in the schema.

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 parameters are fully documented in the input schema. The description's phrase 'based on your situation' reinforces the purpose of the boolean flags but adds no specific meaning beyond what the schema already provides for each parameter.

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 ('Generate') and a clear resource ('personalized tax calendar based on your situation'), and it enumerates the calendar's contents: 'deadlines for filing, estimated payments, extensions, and key actions.' However, it does not explicitly differentiate itself from the sibling tool get_tax_deadlines, which likely serves a similar purpose for non-personalized deadlines.

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?

Usage context is implied through the phrase 'based on your situation' and the word 'personalized,' which suggests this tool should be used when tailoring a calendar to individual circumstances. There is no explicit when-to-use or when-not-to-use guidance, and no alternatives are named, so the agent must infer selection criteria from the tool name and description alone.

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

get_retirement_accountsA
Read-onlyIdempotent

Get details on retirement account types — contribution limits, tax treatment, income limits, and tips.

ParametersJSON Schema
NameRequiredDescriptionDefault
accountTypeNoSpecific account (e.g., 'roth_ira', '401k', 'hsa', 'sep_ira'). Leave empty for all

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds contextual value by specifying the content areas returned (limits, tax treatment, income limits, tips) without contradicting 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.

Conciseness5/5

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

The description is a single concise sentence that front-loads the action and resource, then lists specific content areas. Every word earns its place; there is no filler, repetition, or unnecessary detail.

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?

For a simple read-only lookup with one optional parameter and an output schema present, the description gives sufficient context to select and call the tool correctly. It would be slightly stronger with a pointer to sibling tools for strategic planning, but that gap is already reflected in the usage guidelines score.

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%, with the sole parameter accountType fully described including example values and empty behavior. The description adds no parameter-specific information, but none is needed given the schema's completeness; the baseline of 3 is appropriate.

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

Purpose4/5

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

The description uses a specific verb ('Get details') and identifies the resource ('retirement account types'), then enumerates key attributes (contribution limits, tax treatment, income limits, tips). This differentiates it from sibling tools like get_retirement_strategy or plan_retirement_withdrawals, though it does not explicitly disambiguate them.

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 implies its usage context (retrieving reference details about retirement account types) but provides no explicit when-to-use guidance or alternatives. With several retirement-related sibling tools, an agent must infer the boundary between this and tools like get_retirement_strategy.

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

get_retirement_strategyA
Read-onlyIdempotent

Get detailed info on tax-advantaged retirement strategies like Backdoor Roth, Mega Backdoor Roth, Roth Conversion Ladder, Tax Loss/Gain Harvesting.

ParametersJSON Schema
NameRequiredDescriptionDefault
strategyIdNoStrategy ID (e.g., 'backdoor_roth', 'mega_backdoor_roth', 'roth_conversion_ladder', 'tax_loss_harvesting', 'tax_gain_harvesting'). Leave empty for all

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, and the description's 'Get' wording is consistent with a safe read operation. It adds no significant behavioral context beyond the annotations, such as response scope or limitations, but it also contradicts nothing.

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 description is a single focused sentence that front-loads the action and resource, then lists illustrative examples. There is no redundant or filler content.

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 one optional parameter fully documented in the schema, strong annotations, and an output schema present, the description gives enough information to select and invoke the tool. It could be strengthened by distinguishing it from planning-focused siblings, but that is a usage-guidance nuance rather than a blocking 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 coverage is 100%, and the schema itself documents strategyId with concrete example values and the 'Leave empty for all' behavior. The description adds only conceptual framing by listing strategy names, which is helpful but not necessary because the schema already carries the parameter semantics. Baseline 3 applies.

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

Purpose4/5

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

The description opens with the verb 'Get' and identifies a specific resource ('detailed info on tax-advantaged retirement strategies') with concrete named examples. It is clearly understood as an informational lookup, but it does not explicitly differentiate itself from overlapping siblings such as plan_retirement_withdrawals or optimize_capital_gains.

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 statement implies when to use it (when detailed informational content on these retirement strategies is needed), and the named examples give useful context. However, it offers no explicit when-not-to-use guidance or alternatives, leaving an agent to infer the boundary with siblings like get_retirement_accounts and plan_retirement_withdrawals.

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

get_state_tax_infoB
Read-onlyIdempotent

Get state income tax information — rates, brackets, and key details for any US state.

ParametersJSON Schema
NameRequiredDescriptionDefault
stateCodeYesTwo-letter state code (e.g., 'CA', 'TX', 'NY')

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

B3.4/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds moderate context by listing rates, brackets, and key details, but it does not disclose edge cases such as whether territories are included or how federal versus state tax data is scoped.

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 description is a single well-structured sentence that front-loads the primary purpose and adds useful specifics. There is no filler, repetition, or unnecessary detail.

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?

This is a simple read-only lookup tool with one fully documented parameter, rich annotations, and an output schema available. The description covers the core scope and content well. It is not quite complete because it does not point to sibling tools for related use cases, but that is a secondary gap given the tool's low complexity.

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?

The schema provides 100% coverage for stateCode with type, length constraints, and an example. The description adds no new parameter-specific meaning beyond the broad scope of 'any US state,' so the schema carries the weight and the baseline of 3 is appropriate.

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

Purpose4/5

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

The description uses a specific verb ('get') and resource ('state income tax information'), and clarifies what is included: rates, brackets, and key details. It clearly identifies this as a state-level tax information tool, but it does not explicitly differentiate it from closely related siblings like get_tax_brackets or estimate_state_tax.

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

Usage Guidelines2/5

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

The description gives no explicit guidance about when to choose this tool over alternatives such as compare_state_taxes, estimate_state_tax, or get_tax_brackets. It only states that it covers state income tax information, leaving the agent to infer selection boundaries.

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

get_tax_bracketsA
Read-onlyIdempotent

Get federal income tax brackets and standard deduction for a given tax year and filing status.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year (2024, 2025, or 2026)
filingStatusYesFiling status

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is covered. The description adds that the tool returns both tax brackets and the standard deduction, which is useful scope information, but it does not discuss response size, pagination, or any other runtime behavior. No contradiction.

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?

A single 15-word sentence front-loads the verb and resource, then adds the two qualifiers. There is zero redundancy or 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?

Despite no explicit usage guidance, the definition is complete for a simple read-only lookup: annotations cover safety, schema covers all parameter constraints with 100% coverage, and an output schema exists to document the return shape. The description states the core resource and scope, so an agent can safely call it.

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

Parameters3/5

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

Schema description coverage is 100%: taxYear is documented as 'Tax year (2024, 2025, or 2026)' and filingStatus has an explicit enum. The description only restates the two dimensions ('given tax year and filing status') without adding format constraints, allowed values, or edge-case handling, so it adds no meaning 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?

The description uses the specific verb 'Get' with a precise resource: 'federal income tax brackets and standard deduction,' qualified by 'tax year and filing status.' This clearly distinguishes it from state-tax siblings like get_state_tax_info and calculation tools like calculate_federal_tax.

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?

No explicit when-to-use or when-not-to-use statements; it does not name alternative tools or exclusion criteria. The description implies use when a specific federal tax year and filing status are known, but the agent must infer this from the purpose, and many siblings overlap thematically.

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

get_tax_deadlinesB
Read-onlyIdempotent

Get important IRS tax deadlines and due dates for a given tax year.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearNoTax year (default: 2026)

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe, non-mutating lookup. The description adds modest scope context ('IRS', 'given tax year', 'important') but does not disclose any additional behavioral traits such as whether the returned list is comprehensive or filtered, or whether state deadlines are excluded.

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 description is a single, front-loaded sentence with no redundant phrasing. Every word contributes to the agent's understanding of the tool's purpose.

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?

For a simple read-only lookup with one optional parameter, an output schema, and full annotation coverage, the description is largely sufficient. The term 'important' is somewhat vague, and the description does not clarify whether it covers all deadlines or only key ones, but this is a minor gap given the output schema and sibling context.

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?

The schema already documents the only parameter 'taxYear' with its default value, and schema description coverage is 100%. The description rephrases the parameter as 'given tax year' but adds no new semantic detail 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?

The description clearly states the action ('Get') and the resource ('important IRS tax deadlines and due dates for a given tax year'). It is specific and understandable, but it does not explicitly differentiate from the sibling 'get_personalized_tax_calendar', which may serve a similar need.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool over alternatives. Siblings like 'get_personalized_tax_calendar' or 'lookup_tax_rule' exist, but the description gives no selection criteria or exclusions, leaving the agent to infer usage from the tool name alone.

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

get_tax_document_checklistA
Read-onlyIdempotent

Generate a personalized checklist of tax documents you need to gather for filing. Based on your income sources, deductions, and life events.

ParametersJSON Schema
NameRequiredDescriptionDefault
hasW2NoHave W-2 employment
hasHSANoHave HSA account
hadBabyNoHad a baby this year
boughtEVNoBought an electric vehicle
soldHomeNoSold a home this year
gotMarriedNoGot married this year
gotDivorcedNoGot divorced this year
hasChildrenNoHave dependent children
hasMortgageNoHave a mortgage
hasChildcareNoPay for childcare
hasInvestmentsNoHave investment accounts (stocks, bonds, crypto)
installedSolarNoInstalled solar panels
hasStudentLoansNoPaying student loans
hasRentalPropertyNoOwn rental property
hasSelfEmploymentNoHave self-employment/freelance income
hasForeignAccountsNoHave foreign bank accounts or income
hasHealthInsuranceNoHave health insurance (marketplace or employer)
hasEducationExpensesNoPaying tuition or student expenses
hasCharitableDonationsNoMade charitable donations
hasRetirementContributionsNoContributed to IRA/401k

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds useful behavioral context by indicating that the checklist is personalized and driven by the user's income sources, deductions, and life events. This goes beyond the annotations without contradicting them.

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 description is two sentences with no filler. The primary action and output are front-loaded, and the input basis is stated immediately after. Every sentence earns its place.

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

Completeness5/5

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

Given the rich input schema with 20 well-documented boolean parameters, an output schema, and annotations covering idempotence and safety, the description is complete enough for an agent to select and invoke the tool correctly. It explains what the tool produces and what factors influence the result; return-value details are covered by the output schema.

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%, and each boolean parameter already has a clear description. The tool description's reference to 'income sources, deductions, and life events' provides a light conceptual grouping, but it does not add meaningful parameter semantics beyond what the schema already supplies. Baseline 3 is appropriate.

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

Purpose5/5

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

The description uses a specific verb ('Generate') and resource ('personalized checklist of tax documents'), and clearly states the purpose: helping gather documents for filing. This is distinct from sibling tools like get_tax_deadlines or calculate_total_tax, so an agent can immediately tell what this tool is for.

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 phrase 'for filing' plus 'based on your income sources, deductions, and life events' gives clear context for when to use this tool: when a user needs a document-gathering checklist customized to their situation. It does not explicitly name alternatives or exclusions, but the purpose is sufficiently distinct among the sibling tools.

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

get_tax_planning_tipsB
Read-onlyIdempotent

Get personalized year-end tax optimization strategies based on your income, deductions, and situation. Suggests actions to reduce tax liability before year-end.

ParametersJSON Schema
NameRequiredDescriptionDefault
hasHSANoHave HSA-eligible health plan
taxYearYesTax year to plan for
hasMortgageNo
filingStatusYes
isSelfEmployedNo
estimatedIncomeYesExpected total income for the year
hasCapitalGainsNo
charitableGivingNoYTD charitable donations
hasCapitalLossesNo
hasRetirementPlanNoHave access to 401k/403b
currentWithholdingNoTotal tax already withheld/paid YTD
estimatedCapitalGainsNo
currentHSAContributionsNoYTD HSA contributions
estimatedItemizedDeductionsNo
currentRetirementContributionsNoYTD retirement contributions

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations (readOnlyHint=true, destructiveHint=false) already cover the safety profile, and the description aligns with those by using 'Get' and 'Suggests'. It adds some output context by saying the tool 'suggests actions,' but does not disclose whether the response is a ranked list, a single strategy, or if there are limitations like 'not financial advice.' With annotations covering the safety profile, a 3 is appropriate.

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 description is two short sentences with no redundancy. The primary purpose is front-loaded ('Get personalized year-end tax optimization strategies') and the second sentence adds clarifying output context without wasting words.

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

Completeness2/5

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

This tool has 15 parameters, 3 required, and an output schema, yet the description gives only a high-level overview. It does not mention required inputs (taxYear, filingStatus, estimatedIncome), how optional parameters factor in, or any scope limitations (e.g., US federal only). For a tool of this complexity, the description is too sparse to fully orient an agent.

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

Parameters2/5

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

Schema description coverage is only 53%, leaving several parameters (hasMortgage, isSelfEmployed, hasCapitalGains, hasCapitalLosses, estimatedCapitalGains, estimatedItemizedDeductions) undocumented. The description only broadly references 'income, deductions, and situation' and does not compensate for the missing parameter explanations. It also omits the required taxYear parameter entirely, leaving the agent to infer that it is needed.

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 clearly states a specific verb and resource: 'Get personalized year-end tax optimization strategies' and further clarifies it 'Suggests actions to reduce tax liability before year-end.' This distinguishes it from calculation and factual tools like calculate_total_tax or get_tax_brackets. However, it does not explicitly differentiate from the similarly broad sibling generate_tax_plan, so it falls short of a 5.

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

Usage Guidelines3/5

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

The phrase 'year-end tax optimization strategies' implies when to use the tool (before year-end, for personalized tax-saving advice), but gives no explicit when-not-to-use guidance or alternative routing. An agent must infer usage from the year-end context, and there is no mention of when to choose generate_tax_plan or plan_multi_year_taxes instead.

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

list_deductionsA
Read-onlyIdempotent

List available tax deductions with eligibility rules and limits. Covers both above-the-line and itemized deductions.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoFilter by deduction category (default: all)

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already cover the safety profile via readOnlyHint, idempotentHint, and destructiveHint. The description adds useful content context but does not disclose additional behavioral traits such as defaults, ordering, or filtering behavior beyond what the schema and annotations already 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?

Two short sentences, front-loaded with the core action and resource, and no filler. The scope statement earns its place by clarifying coverage.

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 simple read-only list tool with one optional, fully documented parameter and an output schema, the description covers purpose, scope, and content expectations. Nothing critical 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 category parameter is fully documented. The description's mention of above-the-line and itemized deductions aligns with enum values but adds no meaning 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 ('List') and resource ('tax deductions'), plus content scope ('eligibility rules and limits') and coverage ('above-the-line and itemized'). This distinguishes it from siblings like list_tax_credits and standard_vs_itemized.

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 implies when to use the tool, but does not explicitly name alternatives or state when not to use it. An agent can infer usage from the purpose, but the selection context versus overlapping tax tools is left implicit.

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

list_no_income_tax_statesA
Read-onlyIdempotent

List all US states with no state income tax.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered without description effort. The description adds only the completeness scope ('all US states'), which aligns with openWorldHint=false, but contributes no further behavioral context such as data recency or sensitivity to changing tax law.

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 description is a single, 9-word sentence with every word earning its place and no filler or redundancy. The core scoping ('all US states with no state income tax') is front-loaded.

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?

For a 0-parameter lookup whose output schema exists and whose annotations cover safety, the definition is nearly complete: an agent knows exactly what to invoke and what it will get. The only minor gap is the absence of a temporal caveat that state income-tax status can change over time.

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?

The tool has zero parameters and its input schema is trivially 100% covered, so there is nothing for the description to explain. Per the zero-parameter baseline of 4, the description needs no parameter documentation and adds appropriate value by narrowing the query scope.

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 uses a specific verb ('List') with an unambiguous resource ('all US states with no state income tax'), making the tool's scope instantly clear. It is inherently distinct from siblings like get_state_tax_info (per-state detail), compare_state_taxes (comparison), and analyze_relocation_taxes (relocation scenarios), none of which provide this exact filtered list.

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?

No explicit when-to-use or when-not-to-use guidance is given, and no alternatives are named. An agent must infer from the tool's name and clear scope that it is the right choice for a flat enumeration task, rather than being told to prefer compare_state_taxes for comparative analysis or get_state_tax_info for state-specific detail.

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

list_tax_creditsA
Read-onlyIdempotent

List available federal tax credits with eligibility, amounts, and phase-out rules. Covers family, education, energy, retirement, healthcare, and income-based credits.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoFilter by category (default: all)
refundableOnlyNoOnly show refundable credits

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so no further safety disclosure is required. The description adds some context about the returned content (eligibility, amounts, phase-out rules) but does not disclose additional behavioral traits such as data sources, rate limits, or side effects. With annotations already covering the behavioral profile, this is acceptable but not exemplary.

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 description is two sentences, front-loading the core action and resource before listing covered categories. Every phrase earns its place; there is no redundant or filler language. It is appropriately sized for a straightforward listing 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?

For a simple read-only listing tool with optional parameters, an output schema, and clear annotations, the description provides enough context for an agent to call it correctly. It covers the scope, the categories, and the kind of information the user will receive. No critical operational detail 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?

Both parameters are fully described in the input schema, with category providing an enum of options and refundableOnly described as 'Only show refundable credits'. The description repeats the category coverage but does not add meaning beyond the schema. Since schema description coverage is 100%, the baseline of 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 description clearly states the tool's action ('List') and resource ('available federal tax credits') and identifies the kind of information returned (eligibility, amounts, phase-out rules). It also distinguishes itself from sibling tools like list_deductions and calculate_eitc by focusing specifically on credits rather than deductions or a single credit calculation.

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 gives clear context for when this tool is appropriate: when an agent needs an overview of federal tax credits across categories such as family, education, energy, retirement, healthcare, and income. It does not explicitly name alternatives or state when not to use it, but the listing-oriented wording is enough to separate it from more targeted sibling tools like check_credit_eligibility.

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

lookup_tax_ruleA
Read-onlyIdempotent

Look up IRS tax rules, definitions, and common questions. Covers filing rules, income types, deduction rules, credit eligibility, stock options, wash sales, and more.

ParametersJSON Schema
NameRequiredDescriptionDefault
topicYesTax topic to look up (e.g., 'wash sale rule', 'ISO vs NSO', 'AOTC and LLC same year', 'gift tax', 'estimated tax penalty')

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to restate the safety profile. The description adds minimal behavioral context beyond the base 'look up' framing, such as that the output will be definitions or answers to common questions, but no detail on result structure or limitations is provided.

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?

Two short sentences, with the core action front-loaded and scope examples following. No repetitive filler or restatement of the tool name.

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 single-parameter, read-only lookup with a complete schema and an output schema present, the description provides adequate context: what the tool accesses (IRS rules), what topics it covers, and examples of valid topic values. Nothing critical for a correct call 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?

The schema's topic parameter is described at 100% coverage with concrete examples, so the schema carries the parameter documentation burden. The description only echoes those examples ('wash sales', 'credit eligibility') without adding format, constraints, or usage syntax 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?

The opening phrase 'Look up IRS tax rules, definitions, and common questions' names a specific verb and a substantive resource, so an agent can tell this is a reference lookup rather than a calculator or filing tool. However, it does not explicitly differentiate from specialized siblings such as list_deductions or check_credit_eligibility, and the trailing 'and more' is broad.

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 examples in the second sentence ('filing rules, income types, deduction rules, credit eligibility, stock options, wash sales') imply when the tool is appropriate. There is no explicit guidance about when to prefer a specialized sibling or when not to use this tool, leaving some routing to inference.

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

optimize_capital_gainsA
Read-onlyIdempotent

Analyze investment lots and suggest which to sell to minimize tax. Considers long-term vs short-term, 0% bracket space, loss harvesting, and wash sale rules.

ParametersJSON Schema
NameRequiredDescriptionDefault
lotsYesInvestment lots to analyze
taxYearYesTax year
filingStatusYes
ordinaryIncomeYesOrdinary income (W-2, SE, interest, etc.) before investment sales
targetGainOrLossNoTarget net gain/loss to realize (negative for harvesting losses)

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds meaningful behavioral detail about what the analysis considers, such as long-term vs short-term treatment, 0% bracket space, loss harvesting, and wash sale rules. It does not contradict 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.

Conciseness5/5

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

The description is a single, dense sentence that front-loads the core action and then lists relevant decision factors. It contains no filler, repetition, or unnecessary detail.

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?

Given the presence of an output schema and safety annotations, the description covers the core decision logic and input context well. It could more explicitly distinguish itself from overlapping planning siblings like plan_retirement_withdrawals or generate_tax_plan, but it is largely complete for a read-only optimization 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 80%, so the schema already documents most parameters. The description reinforces the high-level purpose around lots and tax minimization but does not add detail beyond what the schema provides, nor does it explain the optional targetGainOrLoss 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?

The description uses a specific verb ('Analyze'), a clear resource ('investment lots'), and an explicit outcome ('suggest which to sell to minimize tax'). It also names distinct decision factors (long-term vs short-term, 0% bracket space, loss harvesting, wash sale rules), making it easily distinguishable from sibling tax calculation 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?

The description clearly implies when to use it: when analyzing investment lots to minimize capital gains tax. It does not explicitly name alternatives or state when not to use it, but the context is strong enough for an agent to infer the intended scenario.

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

plan_multi_year_taxesA
Read-onlyIdempotent

Create a 3-5 year tax projection and strategy. Models income changes, Roth conversions, retirement contributions, and bracket management across multiple years.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearsYesYear-by-year projections
currentAgeYes
filingStatusYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context by specifying what the tool models: income changes, Roth conversions, retirement contributions, and bracket management. No contradiction between the 'Create' wording and the read-only annotation is present.

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 description is a single, well-structured sentence that front-loads the core purpose ('Create a 3-5 year tax projection and strategy') before listing the modeled factors. Every phrase earns its place with no redundancy or filler.

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

Completeness4/5

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

Given the rich input schema with required fields and an output schema, the description covers the strategic purpose sufficiently for an agent to select and invoke the tool. It could add more nuance about required per-year input structure, but the schema already documents those constraints, and the annotations cover the behavioral safety profile.

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 only 33%, but the description partially compensates by naming planning levers that map to parameters: Roth conversions (plannedRothConversion), retirement contributions (plannedIRA/planned401k), and income changes (expectedIncome). It does not explain top-level parameters like currentAge or per-year fields like stateCode and dependents, leaving some meaning to be inferred from 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 clearly states the verb 'Create' and the specific resource: a 3-5 year tax projection and strategy. It names the key modeled dimensions (income changes, Roth conversions, retirement contributions, bracket management), which helps identify the tool's purpose. It does not explicitly contrast with siblings like generate_tax_plan or simulate_tax_scenario, but 'multi-year' provides meaningful differentiation.

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 establishes clear context: this is for multi-year tax projection and strategy, which naturally distinguishes it from single-year calculators among the siblings. However, it does not explicitly state when not to use it or name alternatives, so it stops short of full routing guidance.

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

plan_retirement_withdrawalsA
Read-onlyIdempotent

Plan tax-efficient retirement withdrawals. Determines optimal order to draw from Traditional IRA, Roth IRA, and taxable accounts to minimize lifetime tax.

ParametersJSON Schema
NameRequiredDescriptionDefault
ageYesYour current age
taxYearYesTax year
rothBalanceYesRoth IRA/401k balance
filingStatusYes
pensionIncomeNoAnnual pension income
annualSpendingYesAnnual spending need (pre-tax)
taxableBalanceYesTaxable brokerage account balance
traditionalBalanceYesTraditional IRA/401k balance
socialSecurityIncomeNoAnnual Social Security income
rothConversionInterestNoInterested in Roth conversion strategy?

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds value by disclosing the analytic behavior — it computes a draw-order strategy rather than producing a single tax number — and states the optimization objective. No contradictions 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.

Conciseness5/5

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

Two sentences with zero filler: the first front-loads the headline purpose, the second supplies the concrete methodology (draw order, account types, optimization goal). Every clause earns its place, and the structure leads with the most 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?

Given an output schema exists (so return values need no explanation), rich safety annotations, and 90% parameter coverage, the description covers what an agent needs to select and invoke the tool. The only gap is silence on model assumptions — e.g., whether RMDs, state taxes, or future tax-law changes are modeled — which is useful but not essential for correct invocation.

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

Parameters3/5

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

Schema description coverage is 90%, so the schema already documents nearly all parameters. The description adds modest linkage value by naming the account types that map to traditionalBalance, rothBalance, and taxableBalance, which helps an agent map inputs to the strategy. This sits at the baseline for high-coverage schemas; no parameter syntax or format detail is needed beyond what the schema provides.

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 pairs a specific verb ('Plan'/'Determines') with a precise resource — the optimal withdrawal order across Traditional IRA, Roth IRA, and taxable accounts — and a measurable objective: minimize lifetime tax. This clearly differentiates it from siblings like calculate_total_tax or simulate_tax_scenario, and the account-type specificity prevents confusion with the more generic get_retirement_strategy.

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 use case is implied by the description: an agent would select this when asked to plan tax-efficient retirement withdrawals. However, it provides no explicit when/when-not guidance or alternatives — notably, get_retirement_strategy and simulate_tax_scenario are nearby siblings that could plausibly compete for the same request, and no routing criterion is given.

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

process_1099_incomeB
Read-onlyIdempotent

Process multiple 1099 forms and calculate the tax impact of each income type. Handles 1099-NEC (freelance), 1099-INT (interest), 1099-DIV (dividends), 1099-B (investments), 1099-MISC.

ParametersJSON Schema
NameRequiredDescriptionDefault
formsYesArray of 1099 forms
taxYearYesTax year
w2IncomeNoW-2 income (for context)
filingStatusYes
qualifiedBusinessIsSstbNo
qualifiedBusinessW2WagesNo
longTermCapitalLossCarryoverNo
shortTermCapitalLossCarryoverNo
qualifiedBusinessPropertyBasisNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile, so the bar is lower. The description adds that this is a batch operation on multiple forms producing per-income-type tax impact, which is useful context. However, it doesn't disclose which tax rules are applied — the schema's qualifiedBusiness* and capital-loss-carryover parameters imply QBI and capital-gain logic that the description never mentions, and 'Process' could be misread as a filing/submission action (mitigated only by 'calculate').

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?

Two sentences with zero filler. The first sentence front-loads the verb, resource, and outcome; the second earns its place by mapping supported form types to income categories. Nothing is redundant with the schema.

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

Completeness2/5

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

Despite having an output schema and strong safety annotations, this is a complex 9-parameter tool with a nested forms array, six enumerated form types, and undocumented QBI and capital-loss concepts. The description omits 1099-R (present in the schema enum), never explains the qualifiedBusiness* parameters or loss carryovers, and leaves 'tax impact of each income type' ambiguous. An agent will likely misconfigure or under-specify calls involving 1099-R, qualified business income, or capital loss carryovers.

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 only 33%, so the description needed to compensate. It does add real meaning to the `type` enum by mapping form types to income categories (freelance, interest, dividends, investments). However, six parameters — qualifiedBusinessIsSstb, qualifiedBusinessW2Wages, qualifiedBusinessPropertyBasis, longTermCapitalLossCarryover, shortTermCapitalLossCarryover, and filingStatus — have no schema description and no description-level guidance, so the compensation is incomplete.

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

Purpose4/5

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

States a specific verb and resource: 'Process multiple 1099 forms and calculate the tax impact of each income type.' The enumeration of supported form types with income categories (freelance, interest, dividends, investments) adds useful specificity and distinguishes it from generic tax-calc siblings like calculate_total_tax. Minor gap: the schema enum also supports 1099-R, which the description omits entirely.

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 form-type enumeration provides implied usage context: use this when the user has 1099-NEC, 1099-INT, 1099-DIV, 1099-B, or 1099-MISC forms and wants per-income-type tax impact. However, there are no explicit exclusions or named alternatives, even though overlapping siblings such as calculate_total_tax, calculate_federal_tax, and estimate_self_employment_tax exist. The agent is left to infer when this tool is the right choice.

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

run_tax_health_checkA
Read-onlyIdempotent

One-click tax health check. Analyzes your full financial picture and outputs a report with actionable findings: missed credits, withholding accuracy, deduction optimization, audit risk, retirement savings gaps, and year-end planning tips.

ParametersJSON Schema
NameRequiredDescriptionDefault
ageNo
taxYearYesTax year
boughtEVNo
w2IncomeNo
isStudentNo
stateCodeNo
dependentsNo
grossIncomeYes
capitalGainsNo
filingStatusYes
retirementIRANo
installedSolarNo
retirement401kNo
federalWithheldNo
stateLocalTaxesNo
hsaContributionsNo
mortgageInterestNo
hasHealthInsuranceNo
charitableDonationsNo
selfEmploymentIncomeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, non-destructive behavior. The description adds useful context by stating that it outputs a report with specific actionable findings, which clarifies it is an analysis/diagnostic tool rather than a filing or calculation tool. No contradiction with annotations exists.

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?

Two tight sentences: the first states the high-level purpose, and the second enumerates the report's value areas. There is no filler, and the structure is front-loaded and scannable.

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

Completeness3/5

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

The description covers the tool's purpose and report contents, and the output schema likely documents return structure. However, given the high complexity (20 parameters) and overlapping sibling tools, the description lacks guidance on when to choose this over similar broad tools and what inputs are expected.

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

Parameters2/5

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

Schema description coverage is only 5%, and the description does not compensate for this. It vaguely references the 'full financial picture' but never explains how the 20 parameters map to the report, which parameters matter most, or what values are expected. The required fields are left entirely implicit.

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 clearly identifies a specific resource and action: analyzing the user's full financial picture and producing a health-check report. The list of finding categories makes the scope concrete, though it does not explicitly differentiate itself from overlapping siblings like generate_full_tax_report or assess_audit_risk.

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 phrase 'One-click tax health check' and 'full financial picture' imply a broad, comprehensive assessment, which suggests use for an overall review rather than a narrow calculation. However, the description provides no explicit when-to-use guidance or exclusions naming alternative tools.

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

simulate_tax_scenarioA
Read-onlyIdempotent

What-if tax scenario simulator. Compare your current situation against a hypothetical change: income change, relocation, Roth conversion, filing status change, etc. Shows the exact tax impact of the change.

ParametersJSON Schema
NameRequiredDescriptionDefault
taxYearYesTax year
currentStateNoCurrent state code
filingStatusYes
currentIncomeYesCurrent gross income
whatIfNewStateNoNew state if relocating
currentDependentsNo
whatIfFilingStatusNoNew filing status
whatIfIncomeChangeNoIncome change amount (positive = more income, negative = less)
currentCapitalGainsNo
whatIfNewDependentsNoNew number of dependents
whatIfAdditional401kNoAdditional 401k contribution
whatIfItemizedChangeNoChange in itemized deductions
whatIfRothConversionNoAmount to convert from Traditional to Roth IRA
currentSelfEmploymentNo
currentItemizedDeductionsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds that the tool 'Shows the exact tax impact,' which gives some behavioral context about the output, but does not clarify behavior when only current parameters are supplied (e.g., whether a comparison is still returned) or any other operational caveats.

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 description is two sentences with no filler. The opening phrase 'What-if tax scenario simulator' immediately conveys the core function, and the rest adds example scenarios and the expected outcome efficiently.

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

Completeness3/5

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

For a tool with 15 parameters, the description provides a useful conceptual model but omits guidance on how to structure a scenario (e.g., which combinations of current and what-if fields are meaningful) and what exactly 'exact tax impact' includes. The output schema exists, so return-value details are covered, but the operational semantics are still somewhat underspecified.

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 67%, so the schema already documents many parameters. The description adds conceptual grouping by contrasting 'current' vs 'what-if' and names specific hypothetical changes that map to parameters, but it does not compensate for the undocumented parameters or clarify the required relationship between current and what-if inputs.

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 uses a specific verb ('compare') and resource ('tax scenario'), and explains the what-if nature with concrete examples (income change, relocation, Roth conversion, filing status change). It clearly describes what the tool does, though it does not explicitly differentiate itself from closely related siblings like compare_filing_statuses or analyze_relocation_taxes.

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 provides clear context for when to use it: when you want to compare a current situation against a hypothetical change. It does not explicitly mention alternatives or exclusions, but the 'What-if tax scenario simulator' framing makes the intended use case distinct enough.

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

standard_vs_itemizedB
Read-onlyIdempotent

Compare standard deduction vs itemized deductions to determine which is more beneficial.

ParametersJSON Schema
NameRequiredDescriptionDefault
agiYesAdjusted Gross Income (needed for medical expense threshold)
blindNo
taxYearYesTax year (2024, 2025, or 2026)
age65OrOlderNo
filingStatusYes
otherItemizedNoOther itemized deductions
medicalExpensesNoUnreimbursed medical expenses
stateLocalTaxesNoState/local income + property taxes paid
mortgageInterestNoHome mortgage interest paid
charitableDonationsNoCharitable contributions

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already cover the safe read-only, idempotent, and non-destructive nature of the tool, and the description does not contradict them. The description adds only that it determines 'which is more beneficial,' but it does not disclose how missing optional itemized inputs are handled or whether age/blind adjustments affect the standard deduction calculation.

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 a single, front-loaded sentence with no wasted words. It is concise and immediately clear about the tool's main purpose, though this brevity comes at the cost of usage and behavioral detail covered by other dimensions.

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

Completeness3/5

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

Given the 10-parameter schema, output schema, and strong annotations, the description provides minimally viable context but leaves gaps. Specifically, it does not mention that age65OrOlder and blind affect the standard deduction, nor how absent optional itemized categories are treated, which could matter for an accurate comparison.

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?

The description does not explain any of the 10 parameters, leaving the schema to carry most semantic weight; schema coverage is 70%. Missing descriptions for filingStatus, blind, and age65OrOlder are not compensated, though the parameter names are reasonably self-explanatory and the overall purpose clarifies that the monetary inputs are itemized deduction components.

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 action and resource combination: compare standard deduction vs itemized deductions and determine the more beneficial option. This clearly distinguishes it from siblings like list_deductions (which lists deductions) and compare_filing_statuses (which compares filing statuses).

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

Usage Guidelines2/5

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

No guidance is given on when to use this tool versus related alternatives such as list_deductions or calculate_obbb_deductions. There are no prerequisites, exclusions, or conditional scenarios stated, so the agent must infer when this comparison is appropriate.

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

submit_feedbackA
Read-onlyIdempotent

Generate a pre-filled GitHub Issue URL for reporting calculation errors or data issues. No data is sent. The user clicks the link to submit. Use this after verifying the user's inputs.

ParametersJSON Schema
NameRequiredDescriptionDefault
actualNoWhat the tool returned
taxYearNoTax year
expectedNoWhat the user expected
toolNameYesWhich tool produced the issue (e.g., calculate_federal_tax)
descriptionYesBrief description of the issue

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds critical behavioral context beyond those: 'No data is sent' and 'The user clicks the link to submit,' preventing the agent from assuming the tool actually submits the issue.

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 short sentences with no filler. The primary purpose is front-loaded, followed by the behavioral caveat ('No data is sent') and the usage instruction. Every sentence earns its place.

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

Completeness5/5

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

For a simple URL-generating tool, the description covers purpose, key behavioral caveat, and usage timing. With an output schema present, return-value details are already handled, and the annotations cover safety. Nothing essential 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 all five parameters are already documented. The description implies these fields become part of the pre-filled URL but adds no per-parameter meaning 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?

The description states a specific verb ('Generate'), a specific resource ('pre-filled GitHub Issue URL'), and the domain ('reporting calculation errors or data issues'). It clearly distinguishes this from all the sibling tax-calculation tools, which do not generate URLs.

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 explicitly says 'Use this after verifying the user's inputs,' giving a concrete condition for when to invoke the tool. The description also clarifies that it is for error/data-issue reporting, which distinguishes it from calculation tools without naming a direct alternative.

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

what_changed_between_tax_yearsB
Read-onlyIdempotent

Show all differences between two tax years — bracket changes, deduction limits, credit amounts, SALT cap, CTC, and new OBBB provisions. Great for understanding how tax law changes affect you.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYearYesLater tax year (e.g., 2025)
fromYearYesEarlier tax year (e.g., 2024)
filingStatusNoFiling status for specific comparisons (default: single)

Output Schema

ParametersJSON Schema
NameRequiredDescription
textYes
errorNo
isErrorYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds useful context about the categories of differences returned, but it does not disclose behavioral details such as the optional filingStatus default or potential scope limitations relative to 'all differences.'

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 compact and front-loaded with the core purpose and a useful list of coverage areas. The second sentence is somewhat generic and adds mild marketing tone, but it does not waste significant space.

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?

The tool has full parameter schema coverage, a rich output schema, and safe read-only annotations, so the description does not need to explain return values or side effects. The main gap is the lack of differentiation from the sibling compare_tax_years, but the description is otherwise adequate for calling the tool 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 fromYear, toYear, and filingStatus already have clear meanings. The description adds no parameter-specific detail beyond what the schema provides, which meets the baseline but does not elevate it.

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 clear verb and resource: 'Show all differences between two tax years,' and enumerates specific content like brackets, deductions, credits, SALT cap, CTC, and OBBB provisions. However, it does not distinguish itself from the sibling tool compare_tax_years, which appears to cover similar ground.

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

Usage Guidelines2/5

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

The description says it is 'great for understanding how tax law changes affect you,' which is a benefit statement rather than actionable guidance. It does not state when to prefer this tool over compare_tax_years or any other sibling, nor does it provide exclusions.

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. 44 tool updatesv1.0.1
    • Changedanalyze_education_tax_benefits1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedanalyze_mortgage_tax_benefit2 fields changed
      • addedInput schema / properties / grossIncome / description
        Added value: +"Gross income, also used as MAGI because this tool does not collect MAGI adjustments"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedanalyze_paycheck1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedanalyze_relocation_taxes2 fields changed
      • changedInput schema / properties / yearsToProject / description
        Previous value: -"Years to project savings (default: 5)"New value: +"Years to project with explicit annual profiles (default: 1)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedassess_audit_risk1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedcalculate_eitc2 fields changed
      • changedInput schema / properties / taxYear / description
        Previous value: -"Tax year (2024 or 2025)"New value: +"Tax year (2024, 2025, or 2026)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedcalculate_federal_tax27 fields changed
      • addedInput schema / properties / aotcRefundableAllowed
        Added value: +{
        +  "description": "Whether refundable AOTC is allowed after under-age-24 support rules",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / aotcStudentQualifiedExpenses
        Added value: +{
        +  "description": "Qualified AOTC expenses per already-verified eligible student",
        +  "items": {
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / dependents / description
        Previous value: -"Number of qualifying child dependents for Child Tax Credit"New value: +"Legacy count of qualifying child dependents for nonrefundable CTC only"
      • addedInput schema / properties / earlyRetirementDistributionSubjectToPenalty
        Added value: +{
        +  "description": "Taxable early-distribution amount remaining after exceptions",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / earnedIncome
        Added value: +{
        +  "description": "Schedule 8812 earned income used for ACTC",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / earnedIncomeCredit
        Added value: +{
        +  "description": "EITC used by the 3-or-more-child ACTC payroll-tax method",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / grossIncome / description
        Previous value: -"Total gross income in USD"New value: +"Total gross income including supplied capital gains, qualified dividends, Social Security benefits, and gross retirement distributions"
      • addedInput schema / properties / hasForm2555
        Added value: +{
        +  "description": "Whether Form 2555 is filed, which makes ACTC unavailable",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / lifetimeLearningQualifiedExpenses
        Added value: +{
        +  "description": "Qualified LLC expenses not used for AOTC or another benefit",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / longTermCapitalLossCarryover
        Added value: +{
        +  "description": "Prior-year long-term capital loss carryover as a positive amount",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / marriedFilingSeparatelyLivedWithSpouse
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / netInvestmentIncome
        Added value: +{
        +  "description": "Total net investment income for NIIT, including taxable interest, dividends, gains, rents, royalties, and passive income",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / otherDependentsForOdc
        Added value: +{
        +  "description": "Dependents already verified for the nonrefundable Credit for Other Dependents",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / qualifiedBusinessIsSstb
        Added value: +{
        +  "description": "Whether the business is a specified service trade or business",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / qualifiedBusinessPropertyBasis
        Added value: +{
        +  "description": "Unadjusted basis immediately after acquisition of qualified property; pass 0 when none",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / qualifiedBusinessW2Wages
        Added value: +{
        +  "description": "Section 199A W-2 wages; pass 0 when none",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / qualifiedDividends
        Added value: +{
        +  "description": "Qualified dividends included in gross income, taxed at preferential rates but not netted with capital losses",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / qualifyingChildrenForCtc
        Added value: +{
        +  "description": "Children already verified as CTC/ACTC qualifying children under age 17 with required SSNs",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / retirementDistributions
        Added value: +{
        +  "description": "Gross Form 1099-R distributions included in grossIncome",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / shortTermCapitalGains / description
        Previous value: -"Short-term capital gains (taxed as ordinary income)"New value: +"Short-term capital gain or loss"
      • addedInput schema / properties / shortTermCapitalLossCarryover
        Added value: +{
        +  "description": "Prior-year short-term capital loss carryover as a positive amount",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / socialSecurityBenefits
        Added value: +{
        +  "description": "Net Social Security benefits included in grossIncome",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / socialSecurityTaxesPaid
        Added value: +{
        +  "description": "Schedule 8812 payroll-tax amount for the 3-or-more-child ACTC method",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / taxExemptInterest
        Added value: +{
        +  "description": "Tax-exempt interest used by the Publication 915 worksheet",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / taxYear / description
        Previous value: -"Tax year (2024 or 2025)"New value: +"Tax year (2024, 2025, or 2026)"
      • addedInput schema / properties / taxableRetirementDistributions
        Added value: +{
        +  "description": "Taxable Form 1099-R amount",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedcalculate_obbb_deductions1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedcalculate_total_tax27 fields changed
      • addedInput schema / properties / aotcRefundableAllowed
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / aotcStudentQualifiedExpenses
        Added value: +{
        +  "items": {
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / dependents / description
        Previous value: -"Number of qualifying child dependents"New value: +"Legacy dependent count for nonrefundable CTC only"
      • addedInput schema / properties / earlyRetirementDistributionSubjectToPenalty
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / earnedIncome
        Added value: +{
        +  "description": "Schedule 8812 earned income for ACTC",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / earnedIncomeCredit
        Added value: +{
        +  "description": "EITC used by 3-or-more-child ACTC method",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / grossIncome / description
        Previous value: -"Total gross income in USD"New value: +"Total gross income including supplied capital gains, qualified dividends, Social Security benefits, and gross retirement distributions"
      • addedInput schema / properties / hasForm2555
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / lifetimeLearningQualifiedExpenses
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / longTermCapitalLossCarryover
        Added value: +{
        +  "description": "Prior-year long-term capital loss carryover",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / marriedFilingSeparatelyLivedWithSpouse
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / netInvestmentIncome
        Added value: +{
        +  "description": "Total net investment income used for NIIT",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / otherDependentsForOdc
        Added value: +{
        +  "description": "Verified dependents for ODC",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / qualifiedBusinessIsSstb
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / qualifiedBusinessPropertyBasis
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / qualifiedBusinessW2Wages
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / qualifiedDividends
        Added value: +{
        +  "description": "Qualified dividends included in gross income",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / qualifyingChildrenForCtc
        Added value: +{
        +  "description": "Verified CTC/ACTC qualifying children",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / retirementDistributions
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / shortTermCapitalGains
        Added value: +{
        +  "description": "Short-term capital gain or loss",
        +  "type": "number"
        +}
      • addedInput schema / properties / shortTermCapitalLossCarryover
        Added value: +{
        +  "description": "Prior-year short-term capital loss carryover",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / socialSecurityBenefits
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / socialSecurityTaxesPaid
        Added value: +{
        +  "description": "Payroll-tax amount for 3-or-more-child ACTC method",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / taxExemptInterest
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / taxYear / description
        Previous value: -"Tax year (2024 or 2025)"New value: +"Tax year (2024, 2025, or 2026)"
      • addedInput schema / properties / taxableRetirementDistributions
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedcalculate_w4_withholding2 fields changed
      • changedInput schema / properties / taxYear / description
        Previous value: -"Tax year (2024 or 2025)"New value: +"Tax year (2024, 2025, or 2026)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedcheck_credit_eligibility1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedcheck_refund_status1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedcompare_filing_statuses2 fields changed
      • changedInput schema / properties / taxYear / description
        Previous value: -"Tax year (2024 or 2025)"New value: +"Tax year (2024, 2025, or 2026)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedcompare_mfj_vs_mfs4 fields changed
      • changedInput schema / properties / dependents / description
        Previous value: -"Number of qualifying children"New value: +"Number of qualifying children (maximum 20)"
      • addedInput schema / properties / dependents / maximum
        Added value: +20
      • changedInput schema / properties / taxYear / description
        Previous value: -"Tax year (2024 or 2025)"New value: +"Tax year (2024, 2025, or 2026)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedcompare_state_taxes6 fields changed
      • addedInput schema / properties / filingStatus
        Added value: +{
        +  "description": "Filing status (default: single)",
        +  "enum": [
        +    "single",
        +    "married"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / incomeBeforeStateDeductions
        Added value: +{
        +  "description": "Annual income before modeled state deductions",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / taxYear
        Added value: +{
        +  "description": "Tax year for all versioned state calculation profiles",
        +  "type": "integer"
        +}
      • changedInput schema / properties / taxableIncome / description
        Previous value: -"Annual taxable income"New value: +"Deprecated alias for incomeBeforeStateDeductions"
      • changedInput schema / required
        Previous value: -[
        -  "states",
        -  "taxableIncome"
        -]New value: +[
        +  "states",
        +  "taxYear"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedcompare_tax_years1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedestimate_quarterly_tax1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedestimate_self_employment_tax4 fields changed
      • addedInput schema / properties / qualifiedBusinessIsSstb
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / qualifiedBusinessPropertyBasis
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / qualifiedBusinessW2Wages
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedestimate_state_tax5 fields changed
      • addedInput schema / properties / incomeBeforeStateDeductions
        Added value: +{
        +  "description": "State income before the modeled state standard deduction and personal exemption",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / taxYear
        Added value: +{
        +  "description": "Tax year for the versioned state calculation profile",
        +  "type": "integer"
        +}
      • changedInput schema / properties / taxableIncome / description
        Previous value: -"State taxable income (after state deductions)"New value: +"Deprecated alias for incomeBeforeStateDeductions"
      • changedInput schema / required
        Previous value: -[
        -  "stateCode",
        -  "taxableIncome"
        -]New value: +[
        +  "stateCode",
        +  "taxYear"
        +]
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedgenerate_full_tax_report20 fields changed
      • addedInput schema / properties / aotcRefundableAllowed
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / aotcStudentQualifiedExpenses
        Added value: +{
        +  "items": {
        +    "minimum": 0,
        +    "type": "number"
        +  },
        +  "type": "array"
        +}
      • changedInput schema / properties / dependents / description
        Previous value: -"Qualifying children under 17"New value: +"Children already verified as CTC, ACTC, and EITC qualifying children"
      • addedInput schema / properties / earlyRetirementDistributionSubjectToPenalty
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / hasForm2555
        Added value: +{
        +  "description": "Whether Form 2555 is filed",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / lifetimeLearningQualifiedExpenses
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / longTermCapitalLossCarryover
        Added value: +{
        +  "description": "Prior-year long-term capital loss carryover",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / marriedFilingSeparatelyLivedWithSpouse
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / otherDependents
        Added value: +{
        +  "description": "Dependents already verified for the nonrefundable ODC",
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / qualifiedBusinessIsSstb
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / qualifiedBusinessPropertyBasis
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / qualifiedBusinessW2Wages
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / retirementDistributions
        Added value: +{
        +  "description": "Gross Form 1099-R distributions",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / shortTermCapitalLossCarryover
        Added value: +{
        +  "description": "Prior-year short-term capital loss carryover",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / socialSecurityBenefits
        Added value: +{
        +  "description": "Net benefits from Form SSA-1099 or RRB-1099",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / socialSecurityTaxesPaid
        Added value: +{
        +  "description": "Schedule 8812 payroll-tax amount for 3-or-more-child ACTC method",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / taxExemptInterest
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / taxYear / description
        Previous value: -"Tax year (2024 or 2025)"New value: +"Tax year (2024, 2025, or 2026)"
      • addedInput schema / properties / taxableRetirementDistributions
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Addedgenerate_tax_plan
    • Changedget_form_filing_guide1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedget_irs_form_info1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedget_personalized_tax_calendar1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedget_retirement_accounts1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedget_retirement_strategy1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedget_state_tax_info1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedget_tax_brackets2 fields changed
      • changedInput schema / properties / taxYear / description
        Previous value: -"Tax year (2024 or 2025)"New value: +"Tax year (2024, 2025, or 2026)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedget_tax_deadlines2 fields changed
      • changedInput schema / properties / taxYear / description
        Previous value: -"Tax year (default: 2025)"New value: +"Tax year (default: 2026)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedget_tax_document_checklist1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedget_tax_planning_tips1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_deductions1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_no_income_tax_states1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_tax_credits1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedlookup_tax_rule1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedoptimize_capital_gains1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedplan_multi_year_taxes2 fields changed
      • changedInput schema / properties / years / items / properties / year / description
        Previous value: -"Tax year (2024 or 2025)"New value: +"Tax year (2024, 2025, or 2026)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedplan_retirement_withdrawals1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedprocess_1099_income9 fields changed
      • addedInput schema / properties / forms / items / properties / earlyDistributionSubjectToPenalty
        Added value: +{
        +  "description": "For 1099-R: taxable early-distribution amount after exceptions",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / forms / items / properties / taxableAmount
        Added value: +{
        +  "description": "For 1099-R: taxable amount in box 2a",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedInput schema / properties / forms / items / properties / type / enum
        Previous value: -[
        -  "1099-NEC",
        -  "1099-INT",
        -  "1099-DIV",
        -  "1099-B",
        -  "1099-MISC"
        -]New value: +[
        +  "1099-NEC",
        +  "1099-INT",
        +  "1099-DIV",
        +  "1099-B",
        +  "1099-MISC",
        +  "1099-R"
        +]
      • addedInput schema / properties / longTermCapitalLossCarryover
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / qualifiedBusinessIsSstb
        Added value: +{
        +  "type": "boolean"
        +}
      • addedInput schema / properties / qualifiedBusinessPropertyBasis
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / qualifiedBusinessW2Wages
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / shortTermCapitalLossCarryover
        Added value: +{
        +  "minimum": 0,
        +  "type": "number"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedrun_tax_health_check1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedsimulate_tax_scenario1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedstandard_vs_itemized2 fields changed
      • changedInput schema / properties / taxYear / description
        Previous value: -"Tax year (2024 or 2025)"New value: +"Tax year (2024, 2025, or 2026)"
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedsubmit_feedback1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
    • Changedwhat_changed_between_tax_years1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "error": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "code": {
        +          "type": "string"
        +        },
        +        "message": {
        +          "type": "string"
        +        },
        +        "suggestion": {
        +          "type": "string"
        +        }
        +      },
        +      "required": [
        +        "code",
        +        "message",
        +        "suggestion"
        +      ],
        +      "type": "object"
        +    },
        +    "isError": {
        +      "type": "boolean"
        +    },
        +    "text": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "text",
        +    "isError"
        +  ],
        +  "type": "object"
        +}
  2. 43 tool updatesv0.5.3
    • First observedanalyze_education_tax_benefits
    • First observedanalyze_mortgage_tax_benefit
    • First observedanalyze_paycheck
    • First observedanalyze_relocation_taxes
    • First observedassess_audit_risk
    • First observedcalculate_eitc
    • First observedcalculate_federal_tax
    • First observedcalculate_obbb_deductions
    • First observedcalculate_total_tax
    • First observedcalculate_w4_withholding
    • First observedcheck_credit_eligibility
    • First observedcheck_refund_status
    • First observedcompare_filing_statuses
    • First observedcompare_mfj_vs_mfs
    • First observedcompare_state_taxes
    • First observedcompare_tax_years
    • First observedestimate_quarterly_tax
    • First observedestimate_self_employment_tax
    • First observedestimate_state_tax
    • First observedgenerate_full_tax_report
    • First observedget_form_filing_guide
    • First observedget_irs_form_info
    • First observedget_personalized_tax_calendar
    • First observedget_retirement_accounts
    • First observedget_retirement_strategy
    • First observedget_state_tax_info
    • First observedget_tax_brackets
    • First observedget_tax_deadlines
    • First observedget_tax_document_checklist
    • First observedget_tax_planning_tips
    • First observedlist_deductions
    • First observedlist_no_income_tax_states
    • First observedlist_tax_credits
    • First observedlookup_tax_rule
    • First observedoptimize_capital_gains
    • First observedplan_multi_year_taxes
    • First observedplan_retirement_withdrawals
    • First observedprocess_1099_income
    • First observedrun_tax_health_check
    • First observedsimulate_tax_scenario
    • First observedstandard_vs_itemized
    • First observedsubmit_feedback
    • First observedwhat_changed_between_tax_years

TDQS

B3.4/5.0

Scored across 44 tools

Disambiguation2/5

Many tools are individually well-described, but the set has significant boundary overlap: calculate_total_tax, generate_full_tax_report, generate_tax_plan, run_tax_health_check, and simulate_tax_scenario all perform broad tax computations. Also, get_tax_deadlines vs get_personalized_tax_calendar and get_state_tax_info vs estimate_state_tax create ambiguity. An agent would struggle to reliably pick the right tool for a general tax question.

Naming Consistency4/5

The vast majority of tools follow a consistent snake_case verb_noun pattern such as calculate_federal_tax, list_tax_credits, compare_state_taxes, and analyze_paycheck. The main deviations are noun-phrase names like standard_vs_itemized and what_changed_between_tax_years, plus inconsistent use of calculate vs estimate for similar operations. Overall the convention is still predictable and readable.

Tool Count2/5

At 44 tools, this server is well into the 'too many' range and far beyond the typical well-scoped MCP surface. While the tax domain is broad, many tools are narrow one-off calculators that could be consolidated into parameterized tools, reducing cognitive load without losing capability.

Completeness4/5

The tool set is unusually comprehensive for individual taxpayer assistance, covering federal and state tax calculation, credits, deductions, W-4 withholding, quarterly estimates, retirement, capital gains, relocation, audit risk, and forms/deadlines. Minor gaps include no actual return preparation or filing submission, no explicit AMT tool, and unsupported state-year calculation paths. These are workable limitations rather than dead ends.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Tax-aware retirement planning for Canada and the US. CPP/OAS and Social Security timing, RRSP/TFSA/401k/IRA projections, Monte Carlo simulation, withdrawal order optimization, and historical backtesting against 150 years of market data.
    2
    -
  • A
    license
    A
    quality
    A
    maintenance
    Open-source, accountant-verified tax computation skills for AI agents. 261+ skills across 172+ jurisdictions covering income tax, VAT/GST, payroll, corporate tax, crypto, and cross-border planning. Every skill is verified section-by-section by licensed CPAs and chartered accountants. 3 tools (list_skills, get_skill, get_skill_sections) and 1 prompt (skill-review).
    3
    400
    AGPL 3.0
  • A
    license
    A
    quality
    A
    maintenance
    Deterministic US equity-compensation tax optimizer. Six tools cover ISO/AMT exercise scheduling, NSO sell-vs-hold, RSU vest-and-sell, single-stock concentration, protective put / zero-cost collar pricing, and Section 1202 QSBS qualification. Federal plus 50-state plus DC tax math.
    8
    49 npm
    5
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Calculate income tax (UK/US brackets), EU VAT, UK corporation tax, and capital gains tax. Provides estimates only - not professional tax advice.
    5 npm
    21 PyPI
    MIT