estv-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@estv-mcpcalculate income tax for Zurich 2024"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
estv-mcp
MCP server for the official Swiss federal tax administration calculator at swisstaxcalculator.estv.admin.ch.
It wraps the undocumented JSON API behind that SPA (no key, no auth) and exposes income, wealth, lump-sum, inheritance and corporate tax figures for every Swiss municipality and tax years 2010-2026.
Tools
Household income and wealth:
Tool | What it does |
| Postal code or place name to |
| Federal, cantonal, municipal and church tax from gross income, wealth and family situation |
| The ESTV budget sheet with its default values, and which lines you may override |
| Applies the tax scales to taxable income read off an assessment |
| The statutory rate ladder and where an income sits in it |
Comparing places:
Tool | What it does |
| Ranks municipalities by total burden for the same household |
| Same ranking, restricted to a radius around a point |
Planning:
Tool | What it does |
| Cheapest way to split a pension lump sum across tax years |
| What a deduction is worth, franc by franc, at this income |
Other taxes:
Tool | What it does |
| Tax on a pillar 2 / pillar 3a lump-sum withdrawal, single place or ranked |
| Inheritance and gift tax by beneficiary relationship |
| Profit and capital tax for a GmbH or AG |
| Covered year range per calculator and the ESTV data version |
Related MCP server: Schwaizer BFS MCP Server
Install
uv syncRegister with Claude Code
From inside the repository:
claude mcp add estv-tax -- uv run --directory "$PWD" estv-mcpAdd -s user to make it available in every project rather than just this one.
Or in any MCP client config, with /path/to/estv-mcp replaced by wherever you
cloned it:
{
"mcpServers": {
"estv-tax": {
"command": "uv",
"args": ["run", "--directory", "/path/to/estv-mcp", "estv-mcp"]
}
}
}Development
uv sync # install, including dev group
uv run pytest -q # tool-level tests plus golden values
uv run python scripts/stdio_smoke.py # real MCP stdio handshake
uv run ruff check . && uv run ruff format --check .Tests hit the live ESTV API, so they need network access but no credentials. CI runs lint, the suite on Python 3.11/3.12/3.13, and the stdio smoke check on every push and pull request, plus weekly on a schedule.
Golden values
tests/golden.json pins recorded figures for a closed tax year, where the
scales should never move again. tests/test_golden.py re-checks them against
the live API with caching disabled, so the weekly run reports upstream drift as
a concrete diff rather than just confirming the endpoint still answers.
When a golden test fails, read the diff first. It usually means ESTV changed something, not that this repo is broken. Once the change is understood:
uv run python scripts/update_golden.py # prints every value that movedCaching
Responses are cached under ~/.cache/estv-mcp for a week, which matters because
the planning tools fan out into dozens of sub-queries. ESTV_MCP_NO_CACHE=1
disables it, ESTV_MCP_CACHE_DIR and ESTV_MCP_CACHE_TTL override the
location and lifetime.
Notes
Amounts are CHF per year.
income_type='employed'means gross salary; the model derives AHV/IV/EO, ALV, NBU and BVG contributions itself.Deduction overrides go through
deductions={id: value}oncalculate_tax, using the ids fromlist_deductions(PRAEMIEN3Apillar 3a,SCHULDZINSENmortgage interest,KKPRAEMIENhealth insurance premiums,MIETAUSGABENrent,KINDBETREUUNGSKOSTENchildcare, and so on).compare_locations(scope='switzerland')covers ~2100 municipalities; only the extremes plus summary statistics come back so results stay readable.Church tax is only charged for
confessionvalues other thannone.plan_capital_withdrawalsmodels the rule that payouts received in the same calendar year are aggregated before the rate applies, so splitting within a year correctly shows no saving. It does not model the federal aggregation of a spouse's payouts, and years beyond ESTV's published range are priced with the latest available scales. Both are stated in the result'scaveats.explain_tax_bracketsalways takes the amount from ESTV. The ladder is rebuilt from the published scale and reproduces ESTV exactly for the ZUERICH and BUND table layouts; splitting cantons apply extra rounding (flagged vialadder_note), and BL, FR, VD and VS publish formulas rather than tables, where the ladder is omitted rather than guessed at.Figures are the official ESTV model, not a binding assessment.
API notes
Base URL: https://swisstaxcalculator.estv.admin.ch/delegate/ost-integration/v1/lg-proxy/operation/c3b67379_ESTV.
Every operation is a POST with a JSON body answering {"response": ...}. Bad
input returns an HTML 500 page rather than a structured error, which
api.EstvClient translates into an EstvError.
Enum values (from the SPA bundle):
Relationship: single 1, married 2, concubinage 3, registered partnership 4
Confession: reformed 1, roman catholic 2, christ catholic 3, none 4, other 5
Income type: employed 1, self-employed 2, pensioner 3, other 4
Language: de 1, fr 2, it 3, en 4
TaxGroupID: cantons alphabetically 1-26 (AG=1 … ZH=26), capitals 88, all of Switzerland 99
Two gotchas worth recording:
API_exportManyTaxScalesreuses the same field names for two different layouts. InZUERICHtablesAmountis the width of a band; inBUNDtables it is the lower threshold andTaxescarries the tax already due at it. Reading aBUNDtable with theZUERICHrule gives a plausible but wrong number, soTableTypehas to be honoured.The geo search returns at most 200 results, silently clipping a large radius.
find_cheapest_nearbydetects the cap and says so.
Available Tools
13 toolscalculate_capital_payment_taxA
Tax on a lump-sum payout from pillar 2 or pillar 3a.
Capital withdrawals are taxed separately from ordinary income at a reduced
rate, and the rate varies a lot between cantons. Pass a canton code,
'capitals' or 'switzerland' as location to rank places instead of
computing a single figure.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | When comparing many locations, how many to return per end of the ranking. | |
| gender | No | male | |
| capital | Yes | Lump sum paid out, CHF. | |
| language | No | de | |
| location | Yes | Tax location id, postal code, municipality name, canton code, 'capitals' or 'switzerland'. | |
| tax_year | No | ||
| confession1 | No | none | |
| confession2 | No | ||
| relationship | No | single | |
| age_at_payment | Yes | Age of the beneficiary when the capital is paid out. | |
| number_of_children | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It discloses that capital withdrawals are taxed separately at a reduced rate and that the tool can either compute a single figure or rank places. Yet it doesn't specify return format, error handling, or side effects (likely none), leaving some behavioral aspects opaque.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs with no filler. The description front-loads the purpose and then adds a key parameter behavior, making it concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has 11 parameters and a low schema coverage, the description is insufficient. It doesn't explain the meaning of many inputs, nor what the output looks like (despite an output schema), nor constraints beyond schema min/max. The complexity warrants more detail than provided.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 36%, and the description only clarifies the `location` parameter by listing valid inputs and the ranking mode. Other parameters like `gender`, `tax_year`, `confession1`, `relationship`, etc., remain undocumented in both schema and description, leaving the agent to guess their semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly defines the tool as 'Tax on a lump-sum payout from pillar 2 or pillar 3a', which is specific and distinct from general tax tools. It also explains the separate reduced-rate taxation and the ranking mode, making the purpose immediately unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates when to use it: for capital withdrawal taxes, and how to trigger ranking via 'capitals' or 'switzerland'. However, it does not explicitly mention alternatives like calculate_tax for regular income, so the guidance is contextual but not fully exclusive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_company_taxA
Profit and capital tax for a company (GmbH, AG or similar).
Pass a canton code, 'capitals' or 'switzerland' as location to rank
places, which is the usual reason to ask: cantonal profit tax rates for
legal entities differ by a factor of roughly two across Switzerland.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | When ranking locations, how many to return per end. | |
| language | No | de | |
| location | Yes | Tax location id, postal code, municipality name, canton code, 'capitals' or 'switzerland'. | |
| tax_year | No | ||
| total_assets | No | Balance sheet total, CHF. Some cantons need it for the capital tax. | |
| share_capital | No | Nominal share capital, CHF. Defaults to taxable_capital. | |
| taxable_profit | Yes | Taxable profit, CHF. | |
| taxable_capital | Yes | Taxable capital (equity), CHF. | |
| patent_box_relief | No | Combined patent box, R&D and equity-interest relief, CHF. | |
| profit_before_taxes | No | True if taxable_profit is stated before tax is deducted. | |
| taxable_profit_federal | No | Federal taxable profit if it differs from the cantonal figure. | |
| participation_net_profit | No | Net profit from qualifying participations, for participation relief. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden. It adds useful context about cantonal rate variation and location-driven ranking, but does not mention read-only behavior, defaults, or how the tax result is structured. The output schema helps, but the description itself is somewhat minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the core purpose, and the second gives the most important usage pattern without redundant detail. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the large 12-parameter schema, a detailed output schema, and strong per-parameter descriptions, the tool description does not need to explain every field. It supplies the missing context: what the tool is for, who it targets, and how to invoke the ranking mode. It could have been more explicit about sibling distinctions, but is otherwise complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is high at 83%, so the schema already documents most parameters. The description adds meaning beyond the schema by explaining that location values like canton codes, 'capitals' and 'switzerland' trigger ranking, and by framing the calculation around company profit and capital taxes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool computes profit and capital tax for companies (GmbH, AG or similar), which distinguishes it from personal-tax siblings like calculate_tax. It also hints at a ranking behavior via location, adding functional clarity beyond the tool name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly explains when to use the tool: pass a canton code, 'capitals' or 'switzerland' as location to rank places, and notes this is the usual reason to call it. It does not explicitly name alternatives or state when not to use it, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_inheritance_taxA
Inheritance and gift tax, which is cantonal and varies enormously.
Spouses and direct descendants are exempt in most cantons while unrelated
beneficiaries and unmarried partners can pay a quarter of the estate, so
the beneficiary relationship matters more than the amount. Omit
beneficiary to see every relationship for one place, or pass a canton
code, 'capitals' or 'switzerland' to rank places for one relationship.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | When ranking locations, how many to return per end. | |
| amount | Yes | Value of the estate share or gift, CHF. | |
| is_gift | No | True for a lifetime gift, False for an inheritance. | |
| language | No | de | |
| location | Yes | Tax location id, postal code, municipality name, canton code, 'capitals' or 'switzerland'. | |
| tax_year | No | ||
| beneficiary | No | Who receives it, e.g. 'child', 'spouse', 'sibling', 'cohabiting_partner', 'unrelated'. Omit to list every relationship. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does substantial work: it discloses that rates are cantonal and vary enormously, that spouses/direct descendants are usually exempt, that unrelated beneficiaries/unmarried partners may pay about a quarter, and that relationship outweighs amount. It doesn't discuss output shape, but the presence of an output schema 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: domain context, behavioral insight, and usage modes. The only slight weakness is the opening fragment, but the overall size and front-loading are appropriate.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with an output schema, the description gives the essential domain logic and the two main query modes without restating schema fields. It could more explicitly say that providing a specific beneficiary and location returns a single tax calculation, but the existing wording is sufficient for an agent to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is moderate at 71%, and the description enriches the two most complex parameters: beneficiary (relationship matters more than amount; omitting it changes the query mode) and location (canton code/'capitals'/'switzerland' triggers ranking). Other parameters are adequately documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as covering inheritance and gift tax and frames the key determinant (beneficiary relationship), so an agent can see what domain it covers. It lacks an explicit verb like 'calculates', but the tool name and first sentence make the purpose unambiguous, and the domain distinguishes it from sibling tax calculators.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second half gives concrete usage instructions: omit beneficiary to list all relationships for a place, or pass a canton code/'capitals'/'switzerland' to rank places for a relationship. It does not explicitly name alternatives such as calculate_tax, but the scenarios are specific enough to guide correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_taxA
Compute federal, cantonal, municipal and church tax for a household.
Uses ESTV's detailed model: it derives social-insurance contributions and
standard deductions from the gross figures, so you only need income,
wealth and family situation. Call list_deductions first if you want to
supply pillar 3a, mortgage interest or other real deductions.
| Name | Required | Description | Default |
|---|---|---|---|
| age1 | No | ||
| age2 | No | ||
| wealth | No | Net taxable wealth at year end, CHF. | |
| income1 | Yes | Annual income of person 1, CHF. Gross salary when income_type1='employed'. | |
| income2 | No | Annual income of the spouse, CHF. Only used for married/registered partners. | |
| language | No | de | |
| location | Yes | Tax location id, postal code or municipality name. | |
| tax_year | No | ||
| deductions | No | Overrides for the ESTV budget sheet, keyed by the ids from list_deductions, e.g. {'PRAEMIEN3A': 7258}. | |
| confession1 | No | none | |
| confession2 | No | ||
| income_type1 | No | employed | |
| income_type2 | No | employed | |
| relationship | No | single | |
| children_ages | No | Age of each dependent child, e.g. [4, 9]. | |
| include_breakdown | No | Include the line-by-line derivation of taxable income. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool uses ESTV's detailed model and derives social-insurance contributions and standard deductions from gross figures, which is beyond what the schema reveals. This helps the agent understand the calculation behavior and why certain inputs suffice. No contradictions with annotations (none provided), so score is limited by not describing output format or edge cases, but behavioral context is solid.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short paragraphs. The first sentence states the purpose, and the second paragraph explains the model and gives actionable guidance. Every sentence earns its place; there is no repetition or fluff. The information is front-loaded with the core purpose, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (16 parameters) and low schema coverage, the description is not fully complete. It communicates the high-level model and the optional deduction flow but does not explain how to set parameters like relationship, confession, children_ages, or how to interpret location. The output schema exists, so return values are covered, but the input attribution for many parameters remains unclear. It is adequate for a high-level overview but lacks depth for a complex tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 44%, so the description needs to compensate. It explains that income, wealth, and family situation are the core inputs, and that deductions are optional overrides from list_deductions. However, it does not explain parameters like age, children_ages, relationship, confession, or location, leaving many parameters under-specified. It adds value for the deductions and overall model but doesn't fully compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Compute federal, cantonal, municipal and church tax for a household.' This clearly distinguishes it from siblings like calculate_tax_from_taxable_amounts, which computes from taxable amounts, and other tax tools. The scope (household) and the authoritative model (ESTV) are also explicit, leaving no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit guidance to call `list_deductions` first when real deductions are needed, which is a clear alternative/ prerequisite step. However, it does not explicitly contrast with `calculate_tax_from_taxable_amounts` or other siblings, so the agent must infer when to use this tool instead. The context 'you only need income, wealth and family situation' implies this is the right tool for gross-figure inputs, but the exclusion of alternatives is not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
calculate_tax_from_taxable_amountsA
Apply the tax scales to amounts already known to be taxable.
Use this when the user reads figures off a tax assessment or return
(steuerbares Einkommen / revenu imposable) instead of a gross salary.
Note that cantonal and federal taxable income usually differ.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | de | |
| location | Yes | Tax location id, postal code or municipality name. | |
| tax_year | No | ||
| confession1 | No | none | |
| confession2 | No | ||
| relationship | No | single | |
| children_ages | No | ||
| taxable_wealth | No | Taxable net wealth per the cantonal assessment, CHF. | |
| taxable_income_federal | Yes | Taxable income per the federal assessment, CHF. | |
| taxable_income_cantonal | Yes | Taxable income per the cantonal assessment, CHF. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the behavioral disclosure burden. It clearly states that inputs must be already-taxable amounts and that no gross-salary processing is involved, and it surfaces the important caveat that cantonal and federal taxable income can differ. It does not describe output structure or side effects, but this is a pure calculation tool and the output schema covers return expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: the main action is in the first sentence, the usage trigger in the second, and the domain caveat in the third. There is no filler or redundant repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool, the description provides the essential contextual cue that distinguishes it from calculate_tax and warns about the typical federal/cantonal discrepancy. The output schema exists, so return-value details are not required here. It is slightly light on family/confession parameter guidance, but those are enumerated in the schema and are standard tax inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%, so the description should compensate. It does clarify the key income parameters by stating they are assessed taxable amounts, not gross salaries, and it explains the federal/cantonal distinction. However, it says nothing about tax_year, confession, relationship, or children_ages, leaving the agent to rely on schema titles and enums for many parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names a specific operation ('apply the tax scales') on a specific input class ('amounts already known to be taxable'). The second sentence clearly separates this tool from gross-salary-based tax calculation, which is exactly the relevant distinction among the sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit trigger condition: use this when the user is reading figures off a tax assessment or return rather than providing a gross salary. It also contrasts with the gross-salary alternative, effectively telling the agent which path not to take.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_locationsA
Rank municipalities by total tax burden for one and the same household.
Answers "where would I pay the least?". Scanning all of Switzerland covers
~2100 municipalities, so only the extremes plus summary statistics are
returned; narrow with scope or only_cantons to see a specific region.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | How many cheapest and most expensive municipalities to return. | |
| age1 | No | ||
| age2 | No | ||
| scope | No | 'switzerland' for every municipality, 'capitals' for the 26 cantonal capitals, or a canton code such as 'ZG'. | capitals |
| wealth | No | Net taxable wealth, CHF. | |
| income1 | Yes | Annual income of person 1, CHF. | |
| income2 | No | Annual income of the spouse, CHF. | |
| language | No | de | |
| tax_year | No | ||
| confession1 | No | none | |
| confession2 | No | ||
| income_type1 | No | employed | |
| income_type2 | No | employed | |
| only_cantons | No | Restrict the ranking to these canton codes, e.g. ['ZH','ZG','SZ']. | |
| relationship | No | single | |
| children_ages | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It usefully reveals that only the extremes plus summary statistics are returned for full-Switzerland scans, which is genuine added value. However, it doesn't disclose behavior for narrow scopes, authentication needs, or how the summary statistics are composed, leaving gaps for a tool with zero annotation cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose, followed by the behavioral caveat and the narrowing advice. Efficient and orderly, though the second sentence is somewhat dense. No redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, covering return values, and the core purpose plus narrowing workflow is clear. But with 16 parameters and only 38% schema coverage, the description does not explain how the household is assembled (which fields belong to person 1 vs person 2, what children_ages or relationship drive), leaving meaningful ambiguity for a complex input set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 38% across 16 parameters, so the description should compensate — but it only references `scope` and `only_cantons`. The household parameters (income1/2, age1/2, confession1/2, children_ages, relationship) and income_type fields are left entirely unexplained, so an agent cannot correctly structure a household input from this definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (rank), resource (municipalities), and basis (total tax burden for one and the same household), and explicitly frames the question it answers ('where would I pay the least?'). It is clearly distinct from siblings like calculate_tax and find_cheapest_nearby, so an agent can select it without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance on the default full-Switzerland scan (~2100 municipalities) and instructs narrowing with `scope` or `only_cantons` to target a specific region or canton. It communicates when the result set is restricted, though it does not name a specific alternative tool to prefer in other cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
deduction_valueA
Measure what a deduction is actually worth to this household.
Sweeps a budget line (pillar 3a by default) and reports the tax saved at each level, plus the saving on each additional franc. Because rates are progressive the last franc of a deduction is worth more than the first, and the return flattens once a bracket boundary is crossed.
| Name | Required | Description | Default |
|---|---|---|---|
| age1 | No | ||
| age2 | No | ||
| wealth | No | Net taxable wealth, CHF. | |
| amounts | No | Deduction amounts to price. Defaults to five steps from 0 to max_amount. | |
| income1 | Yes | Annual income of person 1, CHF. | |
| income2 | No | Annual income of the spouse, CHF. | |
| language | No | de | |
| location | Yes | Tax location id, postal code or municipality name. | |
| tax_year | No | ||
| max_amount | No | Upper end of the default sweep, CHF. | |
| confession1 | No | none | |
| confession2 | No | ||
| deduction_id | No | Which budget line to sweep, from list_deductions. | PRAEMIEN3A |
| income_type1 | No | employed | |
| income_type2 | No | employed | |
| relationship | No | single | |
| children_ages | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It explains that the tool sweeps a budget line, reports tax saved at each level plus marginal saving per franc, and also shares a non-obvious behavioral trait: progressive rates make the last franc worth more, and the return flattens at bracket boundaries. This gives the agent a mental model of the tool's output dynamics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place. The first states the purpose, the second explains the mechanism, and the third illuminates the progressive-rate behavior. It is front-loaded with the core value proposition and contains no fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (17 params, output schema present), the description provides a coherent overview of what the tool does and how the sweep works. It does not detail every parameter, but the schema covers required fields and the output schema covers return structure. The only minor omission is explicit mention of household inputs, but the description's focus on the deduction sweep is sufficient for an agent to understand the core intent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 41%, so the description should compensate for the undocumented params. It does add context around key parameters: 'pillar 3a by default' clarifies deduction_id, and 'sweeps a budget line' clarifies amounts and max_amount. However, many household parameters (age, confession, children, etc.) remain unexplained, so the description only partially compensates for the schema gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Measure what a deduction is actually worth to this household.' It goes on to explain the sweep of a budget line and reporting of tax saved, which clearly differentiates it from siblings like calculate_tax or list_deductions. The purpose is unambiguous and actionable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use the tool: when you need to understand the value of a specific deduction to a household. It provides context but does not explicitly name alternatives or exclusions; however, the context is strong enough for an agent to infer the right scenario. No misleading guidance is present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_tax_bracketsA
Show the statutory rate ladder and where an income sits in it.
Explains the number rather than just producing it: which bracket the household is in, the marginal rate there, and how far the next threshold is. The cantonal figure is the simple tax (einfache Staatssteuer), which the canton and municipality then multiply by their own rates.
The tax amount always comes from ESTV itself. The ladder is rebuilt from
the published scale, which a few cantons express as a formula rather than
a table; there the amount is still exact and ladder is simply absent.
| Name | Required | Description | Default |
|---|---|---|---|
| target | No | Which scale to explain. | cantonal |
| language | No | de | |
| location | Yes | Tax location id, postal code or municipality name. | |
| tax_year | No | ||
| has_children | No | Whether the household has dependent children, which selects the married/family scale in most cantons. | |
| relationship | No | single | |
| taxable_income | Yes | Taxable income to locate in the scale, CHF. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It discloses that the cantonal figure is 'einfache Staatssteuer', that the amount comes from ESTV, and that the `ladder` may be absent for formula-based cantons. These specifics go beyond the generic read-only implication of 'show' and add real, useful behavioral context. It does not explicitly state that the tool makes no modifications, but the verbs and content strongly imply a non-mutating operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a one-line summary, followed by a paragraph on explanatory behavior, and a final note on an edge case. Each sentence contributes useful information without redundancy. It is not as tight as a two-sentence version, but it earns a 4 for efficiency and logical flow.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is moderately complex (7 parameters, 2 required, with an output schema). The description covers the core purpose, differentiates from alternatives, and discloses an important edge case (ladder absence). It does not explain the output structure, but that is covered by the output schema. It also omits explicit guidance on `tax_year` or `language`, though these are self-explanatory. Overall, an agent has enough context to choose and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 57% (4 of 7 parameters have descriptions). The tool description adds minimal parameter-specific meaning: it references 'the household' in connection to bracket determination, but this is already implied by the `has_children` and `relationship` parameters. The description does not clarify syntax, units, or the meaning of `ladder` absence per parameter. It adds marginal value beyond the schema, so a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Show the statutory rate ladder and where an income sits in it', which names a specific verb, resource, and outcome. It further differentiates itself from pure tax computation by saying 'Explains the number rather than just producing it', making the tool's purpose unmistakable and distinct from siblings like calculate_tax.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys when to use this tool ('Explains the number rather than just producing it'), implying a contrast with calculation-only tools, but it never names an alternative explicitly or states a when-not condition. This is clear context but lacks explicit exclusions, so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_cheapest_nearbyA
Rank municipalities within a radius of a point by tax burden.
The relocation question people actually ask: given that I have to stay within commuting distance of somewhere, where is the cheapest place to live? Pass the coordinates of the office or station and a radius.
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | How many municipalities to return per end of the ranking. | |
| age1 | No | ||
| age2 | No | ||
| wealth | No | Net taxable wealth, CHF. | |
| income1 | Yes | Annual income of person 1, CHF. | |
| income2 | No | Annual income of the spouse, CHF. | |
| language | No | de | |
| latitude | Yes | WGS84 latitude of the reference point, e.g. the office. | |
| tax_year | No | ||
| longitude | Yes | WGS84 longitude of the reference point. | |
| radius_km | Yes | Search radius in kilometres. | |
| confession1 | No | none | |
| confession2 | No | ||
| income_type1 | No | employed | |
| income_type2 | No | employed | |
| relationship | No | single | |
| children_ages | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of explaining behavior. It does disclose that the tool ranks municipalities by tax burden and that the search is radius-based. However, it does not explain that the ranking depends on the supplied household profile (income, relationship, children, confession), which is material for correct use.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short, front-loaded with the core action, and adds only a helpful real-world framing in the second paragraph. No sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 17-parameter tool with no annotations and only 41% schema coverage, this description is too sparse. It does not mention the required income1 input or that tax burden is computed for a household profile, so an agent could invoke it with just coordinates and radius and get an incomplete or misleading result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 41%, so the description should compensate. It adds useful meaning to latitude/longitude/radius by framing them as the office/station and commuting distance. But it omits the required income1 parameter and gives no guidance on the many household-profile parameters that affect the ranking.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific action and resource: 'Rank municipalities within a radius of a point by tax burden.' This clearly sets it apart from the tax-calculation siblings, though it does not explicitly name an alternative tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete use scenario: finding the cheapest place to live within commuting distance of a location. It instructs the agent to pass coordinates and a radius, but it does not state when not to use the tool or reference alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_locationA
Resolve a place name or postal code to an ESTV tax location id.
Municipal tax multipliers differ inside a canton and sometimes inside a
postal code, so every calculation is anchored on a tax_location_id.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results. | |
| query | Yes | Postal code, municipality or city name, e.g. '8001', 'Zug', 'Lausanne'. | |
| language | No | de | |
| tax_year | No | Tax year the location must exist in. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It explains the purpose and rationale but does not disclose behavior such as fuzzy matching, multiple possible results, no-match behavior, language sensitivity, or how tax_year affects the resolution. The agent is left to infer these from the schema and 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the core action and result, then adds a concise justification for why this lookup matters. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the four parameters and the presence of an output schema, the description provides enough context to understand what the tool returns and why it is needed. It is slightly incomplete only because it lacks explicit usage boundaries relative to sibling location-related tools, but overall it is adequate for a straightforward lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so most parameters are already documented in the schema. The description adds useful domain context about why query resolves to a tax_location_id, but it does not add meaning for limit, language, or tax_year beyond what the schema already provides. This matches the baseline for schema-supported parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Resolve' and names the exact resource: a place name or postal code to an ESTV tax location id. It also gives the domain rationale for why this id matters, which clearly distinguishes it from calculation-focused sibling tools like calculate_tax and compare_locations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies this is a prerequisite step for calculations by explaining that every calculation is anchored on a tax_location_id. However, it does not explicitly say when not to use this tool or name alternatives such as find_cheapest_nearby or compare_locations, so it stops just short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tax_yearsA
Report which tax years each ESTV calculator currently covers.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden. 'Report' implies a read-only operation, and the absence of parameters suggests no side effects, but this is only implied, not explicitly stated. For an introspection tool with no parameters, the behavior is fairly clear, but it does not disclose exactly what 'currently covers' means or whether results vary by location.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence, front-loaded with the core action and subject. There is no filler or redundant content; every word adds meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and an output schema present, the description fully explains what the tool does. The absence of details on return format is acceptable because the output schema is provided. For its simplicity, the description is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is empty. Per the rubric, with 0 parameters the baseline is 4. The description does not need to explain parameter semantics since there are none.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Report') and a specific resource ('which tax years each ESTV calculator currently covers'). This clearly distinguishes the tool from sibling tools that deal with calculations, comparisons, or deductions, none of which address tax-year coverage.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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. Since it takes no parameters and is a simple query, the intended use might be obvious, but the description does not explicitly state prerequisites, context, or when it would be preferable to other tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_deductionsA
Show the deduction/budget sheet ESTV derives for a household.
Returns every line item with the value ESTV assumes by default. Lines
marked editable can be overridden through the deductions argument of
calculate_tax (keyed by id), e.g. PRAEMIEN3A for pillar 3a
contributions or SCHULDZINSEN for mortgage interest. Non-editable lines
(gross salary, AHV/ALV/BVG contributions) are computed by the model.
| Name | Required | Description | Default |
|---|---|---|---|
| age1 | No | ||
| age2 | No | ||
| wealth | No | Net wealth at year end, CHF. | |
| income1 | Yes | Annual income of person 1, CHF. | |
| income2 | No | Annual income of the spouse, CHF. | |
| language | No | de | |
| location | Yes | Tax location id, postal code or municipality name. | |
| tax_year | No | ||
| confession1 | No | none | |
| confession2 | No | ||
| income_type1 | No | employed | |
| income_type2 | No | employed | |
| relationship | No | single | |
| children_ages | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden. It discloses that the tool returns default values, marks editable lines, and notes that non-editable lines are computed by the model. It also reveals the integration point with calculate_tax. It does not explicitly state whether the call is read-only, but 'Show' strongly implies a non-mutating operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then adds only essential detail: what line items are returned, which are editable, how overrides work, and which lines are model-computed. Every sentence earns its place; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description explains the output semantics and the connection to calculate_tax well, and an output schema exists to cover return structure. However, with 14 parameters, no annotations, and only 29% schema description coverage, the input side is under-served. The agent can infer some meaning from parameter names and defaults, but the description does not explain how household characteristics map to the deduction sheet.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 29%, so the description needed to compensate by explaining how parameters like location, income1, tax_year, relationship, and others affect the output. It does not; it focuses entirely on the output shape and the link to calculate_tax. The example deduction ids (PRAEMIEN3A, SCHULDZINSEN) relate to the output, not to the input parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Show the deduction/budget sheet ESTV derives for a household.' It then clarifies the exact scope by saying it returns every line item with default values and distinguishes editable from non-editable lines. This clearly differentiates it from calculate_tax and other siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains how the tool relates to calculate_tax: editable lines can be overridden through the `deductions` argument of calculate_tax, keyed by id. This implies the intended workflow of inspecting defaults before overriding them, though it does not explicitly state 'use this when...' or list exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_capital_withdrawalsA
Find the cheapest way to split a lump-sum withdrawal across tax years.
Capital payouts are taxed on a steeply progressive separate scale, so
spreading a pension pot over several calendar years can save a large
amount. Splitting within one year saves nothing: all payouts received in
the same calendar year are added together before the rate is applied, and
this tool models that. Read the caveats in the result before acting.
| Name | Required | Description | Default |
|---|---|---|---|
| gender | No | male | |
| language | No | de | |
| location | Yes | Tax location id, postal code or municipality name. | |
| tranches | No | Price a specific plan instead of searching, e.g. [{'year': 2030, 'amount': 200000}, ...]. | |
| first_year | Yes | Calendar year of the first withdrawal. | |
| confession1 | No | none | |
| confession2 | No | ||
| max_tranches | No | Largest number of tranches to evaluate. | |
| relationship | No | single | |
| total_capital | Yes | Total pillar 2 / pillar 3a capital to withdraw, CHF. | |
| years_between | No | Calendar years between consecutive tranches. | |
| number_of_children | No | ||
| age_at_first_withdrawal | Yes | Age of the beneficiary in the first withdrawal year. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does meaningful work: it discloses the same-year aggregation rule, states that splitting within one year saves nothing, and warns the agent to read `caveats` in the result before acting. This gives the agent important information about the tool's model and limitations beyond what the schema provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no filler. The purpose is front-loaded, followed by the tax rationale and a practical caveat warning. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter planning tool with an output schema and no annotations, the description explains the core objective, the tax rule being modeled, and directs attention to result caveats. It does not enumerate every input dependency or the returned plan structure, but the schema and output schema cover those. It is sufficiently complete for an agent to decide when and how to invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 54%, so the schema already documents several key parameters such as location, total_capital, first_year, tranches, max_tranches, years_between, and age_at_first_withdrawal. The description adds conceptual context but no per-parameter detail and does not compensate for undocumented demographic parameters like gender, confession, relationship, or number_of_children. The score reflects adequate but not exceptional parameter guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Find the cheapest way to split a lump-sum withdrawal across tax years.' It clearly signals an optimization/planning tool and distinguishes it from siblings like calculate_capital_payment_tax by focusing on multi-year splitting rather than single-payment tax calculation. The objective is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes a clear use case: optimizing a lump-sum pension withdrawal across calendar years, and explains why splitting matters due to progressive taxation and same-year aggregation. However, it does not explicitly name alternatives or say when not to use this tool, such as when a single-year capital payment tax calculation is needed via calculate_capital_payment_tax. The guidance is therefore implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
13 tool updates
v0.1.0- First observed
calculate_capital_payment_tax - First observed
calculate_company_tax - First observed
calculate_inheritance_tax - First observed
calculate_tax - First observed
calculate_tax_from_taxable_amounts - First observed
compare_locations - First observed
deduction_value - First observed
explain_tax_brackets - First observed
find_cheapest_nearby - First observed
find_location - First observed
get_tax_years - First observed
list_deductions - First observed
plan_capital_withdrawals
TDQS
Scored across 13 tools
Each tool targets a distinct tax calculation or query scenario. While `calculate_tax` and `calculate_tax_from_taxable_amounts` both compute tax, they differ in input types (gross vs taxable amounts). Similarly, `compare_locations` and `find_cheapest_nearby` both rank municipalities but one is global with optional filtering and the other is radius-based. Overall, descriptions clearly differentiate purposes, minimizing confusion.
All tool names follow a consistent verb_noun pattern using lowercase with underscores (e.g., `find_location`, `calculate_tax`, `explain_tax_brackets`). The verbs are action-oriented (find, list, calculate, compare, get, plan, explain) and the nouns describe the domain entity. No mixing of conventions, making the pattern predictable.
With 13 tools, the server covers the core Swiss tax calculation domain comprehensively without being bloated. Each tool serves a distinct purpose: location resolution, deduction listing, multiple tax computations (income, capital, inheritance, company), comparison utilities, planning, and bracket explanation. The count feels well-scoped for the complexity of the domain.
The tool set covers the full lifecycle of typical Swiss tax queries: resolving locations, understanding deductions, computing taxes from various inputs, comparing municipalities, optimizing capital withdrawals, and explaining brackets. Missing aspects like tax form filing or historical data are outside the server's stated purpose. The surface is complete for calculation and planning tasks.
Maintenance
Related MCP Connectors
opendata.swiss MCP — Switzerland's federal open-data portal (CKAN catalogue).
Free public tax MCP: GST/VAT, income, company & capital-gains tax for 50+ countries, source-cited.
MCP server for Quaderno — tax-rate calculation, invoices, contacts, products, receipts & expenses.
MCP server for Statistics Sweden (SCB) - 1200+ tables with population, economy, environment data
Related MCP Servers
- AlicenseAqualityAmaintenanceAn MCP server providing access to Swiss direct democracy data, covering all federal popular votes since 1848 and elections since 1900.102MIT
- AlicenseAqualityDmaintenanceAn unofficial MCP server for accessing Swiss Federal Statistical Office (BFS) data.81MIT
- AlicenseNot gradedqualityCmaintenanceAn MCP server for interacting with Kanton Luzern tax declarations on eSteuern.LU, enabling field catalogue search and live declaration editing.MIT
- AlicenseAqualityAmaintenanceMCP server for the Canton of Bern tax portal TaxMe/BE-Login that reads account statements and tax returns via Playwright browser automation.135 npmMIT