Skip to main content
Glama
cyrusgch

geneva-tax-mcp

by cyrusgch

Geneva Tax MCP

A strictly read-only local MCP server for Geneva (Switzerland) personal tax declarations (GeTax / Dr. Tax PDFs) and tax simulations via the official ESTV calculator.

No write, submit or send tool. Read-only by construction.

Quick examples

Show my 2024 salary and tax totals, including the source page and extraction confidence.

Compare my 2023 and 2024 declarations and show only recognized differences.

Estimate the tax for a hypothetical single household in Geneva, using only the income and deductions I provide explicitly.

Related MCP server: akd-vaultpdf-mcp

Features

MCP tool

Purpose

list_tax_returns()

Years and documents available in the local folder

get_tax_return(year, sections, include_raw)

Normalized declaration (ICC/IFD totals, key fields, provenance, confidence)

compare_tax_returns(year1, year2)

Differences between two years on recognized fields

simulate(...)

Tax simulation via the official ESTV calculator (Geneva included)

find_location(query, year)

Resolve a municipality/postal code to an ESTV tax location id

list_deductions_estv(...)

ESTV deduction sheet for a household

Every extracted value carries its provenance (document, original label, and page for text-layer PDFs) and a confidence level (exact / approx), and distinguishes zero / absent / unrecognized. Responses only expose paths relative to the tax folder.

Installation

Prerequisites: Python 3.11+, Tesseract (for OCR of scanned PDFs, optional).

git clone https://github.com/cyrusgch/geneva-tax-mcp.git mcp-taxes
cd mcp-taxes
py -m venv .venv                      # or python3 -m venv .venv
.venv/Scripts/python.exe -m pip install -e .   # Windows
# .venv/bin/pip install -e .                    # macOS / Linux

# French language pack for OCR (optional, ~1.1 MB)
curl -L -o tessdata/fra.traineddata https://github.com/tesseract-ocr/tessdata_fast/raw/main/fra.traineddata

MCP configuration

The tax folder is auto-detected (Windows: My Drive\Impots, Impots, Documents\Impots; macOS: Google Drive, Documents/Impots; Linux: ~/Impots...). Override:

export GENEVA_TAX_DATA_ROOT="/path/to/my/tax/folder"   # optional

Claude Code

claude mcp add geneva-tax -s project \
  -e "GENEVA_TAX_DATA_ROOT=C:\path\to\tax\folder" \
  -- "/path/to/mcp-taxes/.venv/Scripts/python.exe" -m geneva_tax_mcp.server

Codex (OpenAI)

codex mcp add geneva-tax \
  --env "GENEVA_TAX_DATA_ROOT=C:\path\to\tax\folder" \
  -- "C:\path\to\mcp-taxes\.venv\Scripts\python.exe" -m geneva_tax_mcp.server

Or directly in ~/.codex/config.toml:

[mcp_servers.geneva-tax]
command = "C:/path/to/mcp-taxes/.venv/Scripts/python.exe"
args = ["-m", "geneva_tax_mcp.server"]
env = { GENEVA_TAX_DATA_ROOT = "C:/path/to/tax/folder" }

Verify with codex mcp list.

Generic format (any stdio MCP client)

{
  "mcpServers": {
    "geneva-tax": {
      "command": "/path/to/.venv/bin/python",
      "args": ["-m", "geneva_tax_mcp.server"],
      "env": { "GENEVA_TAX_DATA_ROOT": "/path/to/tax/folder" }
    }
  }
}

Tests

.venv/Scripts/python.exe -m pip install -e ".[dev]"   # installs pytest
.venv/Scripts/python.exe -m pytest tests/ -q

Anonymized fixtures (Jean Dupont), no real data. Includes store, simulator (mocked HTTP), OCR, symlink and corrupted-PDF tests.

.venv/Scripts/ruff.exe check src tests scripts      # lint
.venv/Scripts/ruff.exe format --check src tests scripts
.venv/Scripts/python.exe -m pytest tests/ -q --cov=geneva_tax_mcp --cov-fail-under=70

A GitHub Actions workflow (.github/workflows/ci.yml) runs lint, format and the coverage-gated suite on every push and pull request (Ubuntu + Windows, Python 3.11/3.12/3.13).

Security and privacy

  • No writes into the data folder (PDFs opened read-only). The only writes are the technical ESTV cache, which is forced to the project cache/ folder (an external ESTV_MCP_CACHE_DIR cannot redirect it), gitignored, purged after 7 days, and contains only the explicit simulation parameters you sent and the returned estimates (no PDF content). Note: because the project lives in a cloud-synced folder (e.g. Google Drive), this cache is synchronized too — it is not encrypted.

  • Simulations only send explicit parameters to the official ESTV calculator (swisstaxcalculator.estv.admin.ch, whitelisted), and return the sent payload for audit.

  • Simulation results = estimates produced by the official ESTV calculator, non-binding.

  • MCP responses expose paths relative to the tax folder (no username/machine layout).

Known limitations

  • 2025 "Dr. Tax" PDF: partially badly encoded fonts (partial extraction).

  • Scanned forms: automatic OCR via Tesseract (approx confidence).

  • .tax GeTax files: binary dvbern-tax format, encrypted, not usable without GeTax (see scripts/spike_tax.py).

  • Undocumented ESTV API: may change without notice; retry on rate limit.

Structure

src/geneva_tax_mcp/   MCP server, PDF parser, store, simulator, ESTV client, OCR
scripts/              tools (.tax spike)
tests/                anonymized fixtures + regression tests
ARCHITECTURE.md       design decisions, trust boundaries and roadmap
AGENTS.md             guide for AI agents

License

MIT — see LICENSE. The ESTV client (src/geneva_tax_mcp/estv_client.py) is vendored code from noaahh/estv-mcp (MIT), attribution kept.

Available Tools

6 tools
compare_tax_returnsA

Compare two declarations on the recognized fields (totals + key fields).

Returns the values for both years and the difference (year2 - year1). Only fields recognized with confidence are compared.

ParametersJSON Schema
NameRequiredDescriptionDefault
year1Yes
year2Yes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral disclosure burden. It usefully discloses that only fields recognized with confidence are compared and that the difference is calculated as year2 minus year1. It stops short of describing edge cases or explicitly confirming non-mutation, but the compare semantics and confidence limitation are meaningful transparency.

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 three short sentences with no filler. The purpose, return content, and important confidence limitation are each given a focused sentence. 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 two-required-integer tool, the description covers the core invocation needs: what is compared, what is returned, and a key caveat about recognized fields. An output schema exists to document return structure, so the description does not need to elaborate further. Minor gaps remain around missing-year behavior or whether unrecognized fields are silently omitted.

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 input schema provides no descriptions (0% coverage), so the description must compensate. It partially does by clarifying the difference order (year2 - year1) and indicating that year1 and year2 correspond to the two declarations being compared. The integer-year meaning is apparent from the parameter names, and the formula clarifies the relationship between them.

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 action (compare), a specific resource (two declarations/tax returns), and a focused scope (recognized fields: totals + key fields). It is clearly distinguishable from siblings like get_tax_return and list_tax_returns, which retrieve single returns or lists rather than compare two years.

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: when an agent needs side-by-side comparison and year-over-year difference for two declarations. However, it does not explicitly mention alternatives or state when not to use this tool, leaving the routing decision somewhat implicit.

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

find_locationB

Resolve a municipality name or postal code to an ESTV tax location id (for simulate).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
languageNofr
tax_yearNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It says 'Resolve' which suggests a read-like operation, but it does not disclose potential failures (e.g., what happens if the municipality/postal code is not found), authentication requirements, or any side effects. For a tool with zero annotation coverage, this is a notable gap.

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 zero waste. It states the action and the target immediately, and the parenthetical 'for simulate' adds relevant context. It is ideally concise.

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?

Given three parameters, zero schema descriptions, and no annotations, the description is incomplete. It does not explain 'language' or 'tax_year', nor does it mention error behavior or fallback logic. Although an output schema exists, the input side is under-specified for an agent to call this tool correctly in all cases.

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 0%, so the description must explain the parameters. It only hints that the input is a municipality name or postal code, which maps to the 'query' parameter. The 'language' and 'tax_year' parameters are left unexplained, and the description does not clarify their enums or defaults. This is insufficient given the low 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 states a specific verb ('Resolve'), a clear resource ('a municipality name or postal code to an ESTV tax location id'), and ties it to a sibling ('for simulate'). It is clear and distinct from the other tools, which deal with tax returns and deductions. However, it does not explicitly contrast itself with any sibling (e.g., 'use this before simulate'), so it falls just 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 usage context: it is a preparatory step for the 'simulate' tool. It gives a clear reason to use it, but it does not explicitly state when not to use it or name an alternative. There is no exclusion guidance, so it is adequate but not explicit.

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

get_tax_returnA

Return the normalized declaration for a year.

sections filters the detailed fields (e.g. ["salary", "movable_wealth"]). Summary totals (ICC/IFD) are always included. include_raw=True adds all raw PDF lines with their page number.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearYes
sectionsNo
include_rawNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden. It discloses meaningful behavior: sections filters detailed fields, summary totals are always included, and include_raw adds raw PDF lines with page numbers. It does not cover error cases or auth, but it explains the main execution traits.

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 compact and front-loaded: purpose in the first sentence, then parameter behavior in three short lines. No filler, and the most important output constraint (summary totals always included) is stated directly.

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 get-one-year tool with an output schema, the description is nearly complete: it covers selection by year, optional field filtering, and raw output inclusion. It is only missing guidance about when to prefer this over sibling tools and possible valid values for sections.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must define all parameters. It explains sections with examples ('salary', 'movable_wealth') and its filtering effect, include_raw with page-number detail, and year via 'for a year'. This goes well beyond the bare 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 opens with 'Return the normalized declaration for a year,' which names a specific verb, resource, and scope. This distinguishes it from siblings such as list_tax_returns and compare_tax_returns, which clearly list or compare rather than fetch one declaration.

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 guidance on when to use this tool instead of list_tax_returns, compare_tax_returns, or simulate. It implies retrieval use via 'Return...', but never states conditions or exclusions, leaving the choice to inference from sibling names.

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

list_deductions_estvC

List the ESTV deduction sheet for a household (ids to pass to simulate).

ParametersJSON Schema
NameRequiredDescriptionDefault
age1No
age2No
wealthNo
income1Yes
income2No
languageNofr
locationYes
tax_yearNo
confession1Nonone
confession2No
income_type1Noemployed
income_type2Noemployed
relationshipNosingle
children_agesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.1/5.0
Behavior1/5

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

No annotations are provided, so the description carries the full burden. It does not disclose whether the operation is read-only (though 'List' implies it), what side effects exist, what the output contains, or any rate limits. The one-line text provides essentially no behavioral context beyond the verb.

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

Conciseness2/5

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

The description is one short sentence, which is concise, but it is under-specified rather than appropriately sized. It omits essential information and does not front-load key constraints or outputs. It reads as a placeholder, not a useful guide.

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

Completeness1/5

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

Given the tool's complexity (14 parameters, 5 enums, no output schema explanation) and the presence of sibling tools with similar purposes, this description is woefully incomplete. An agent cannot determine correct usage, expected results, or why to pick this over alternatives without external context.

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 0% and the description mentions zero parameters. With 14 parameters (including required ones like location and income1), the description adds no meaning to any parameter, leaving agents to guess from property names alone. It fails to compensate for the low 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 states a specific verb ('List'), a resource ('ESTV deduction sheet'), and a scope ('for a household'), and adds a hint about passing IDs to simulate. This distinguishes it from entirely unrelated tools but does not differentiate from siblings like list_tax_returns or simulate, which are closer in function.

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 only usage signal is 'ids to pass to simulate', which implies this tool is a precursor to simulation but does not explicitly state when to use it vs. alternatives, nor does it mention any exclusions or conditions. No guidance on prerequisites or scenarios.

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

list_tax_returnsA

List the tax years and documents available in the local folder.

Returns, per year, the documents found (GeTax form, summary, supporting documents, scans) and whether a text-layer form is usable. Paths are relative to the tax folder.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral burden. It discloses that results are grouped per year, which document types are found, whether a text-layer form is usable, and that paths are relative to the tax folder. This is sufficient transparency for a read-only listing operation.

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 compact and front-loaded: the first sentence identifies the tool's primary action and scope, and the second adds return-value details without unnecessary filler. 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 no-parameter, locally scoped listing tool with an output schema present, the description is complete. It explains not only what is listed but also the document categories, text-layer usability, and path semantics, which covers the agent's likely decision needs.

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 takes zero parameters, so the description needs no parameter-level explanation. The zero-parameter baseline applies here, and the description correctly focuses on what the tool returns.

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 explicitly states the verb ('List') and resource ('tax years and documents available in the local folder'), making the tool's purpose immediately clear. It also distinguishes itself from siblings like get_tax_return by describing a folder-level listing rather than fetching a single return.

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 guidance on when to use this tool instead of its siblings such as get_tax_return, compare_tax_returns, or list_deductions_estv. The local-folder context implies inspection before retrieval, but that relationship is never made explicit.

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

simulateA

Simulate the tax of a household with the official ESTV calculator.

EXPLICIT parameters (no data is injected automatically from the PDFs). location: postal code or municipality name (e.g. '1201', 'Genève', 'Carouge'). deductions: ids from the ESTV sheet (see list_deductions_estv), e.g. {'PRAEMIEN3A': 7258}. Returns the payload sent (audit) and a non-binding estimate.

ParametersJSON Schema
NameRequiredDescriptionDefault
age1No
age2No
wealthNo
income1Yes
income2No
languageNofr
locationYes
tax_yearNo
deductionsNo
confession1Nonone
confession2No
income_type1Noemployed
income_type2Noemployed
relationshipNosingle
children_agesNo
include_breakdownNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations provided, the description carries the full behavioral burden. It discloses that parameters are explicit (no automatic PDF injection), that it returns both the payload sent (audit) and a non-binding estimate, and that it uses the official ESTV calculator. These are meaningful traits beyond the schema. It does not mention network dependencies or side effects, but for a simulation tool the read-only nature is implied. The disclosure is solid and goes beyond a minimal statement.

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 concise and well-structured: it leads with the purpose, then states the explicit-parameter caveat, highlights the two key parameters, and closes with return behavior. Every sentence earns its place, and there is no fluff. It is appropriately sized for the tool's complexity and front-loaded with the most critical information.

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 16 parameters, the description covers the essentials but not all. It explains location and deductions, mentions the audit and non-binding estimate, and points to a sibling for deduction IDs. The output schema exists, so return details are covered elsewhere. However, it does not explain how parameters like relationship, income_type, or children_ages affect the calculation, nor does it clarify required vs. optional fields beyond the schema. The description is adequate for a basic call but leaves some nuance to the agent.

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 0%, so the description must compensate. It explains the two most complex parameters: location (with examples of postal codes and municipality names) and deductions (as IDs from the ESTV sheet, referencing list_deductions_estv, with an example). The other 14 parameters are left to their titles and enums, which are mostly self-explanatory. While the key parameters are clarified, the description does not address relationships like income1/income2 or children_ages, leaving some ambiguity for an agent.

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 clear, specific statement: 'Simulate the tax of a household with the official ESTV calculator.' It names the action (simulate), the resource (tax of a household), and the mechanism (official ESTV calculator). It also distinguishes from sibling tools like get_tax_return or compare_tax_returns, which deal with returns rather than simulation, making the purpose unmistakable.

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 provides implicit usage guidance via 'EXPLICIT parameters (no data is injected automatically from the PDFs)', which hints that this tool is for when you have manual data rather than PDF-derived data. It also references list_deductions_estv for deduction IDs, suggesting a workflow. However, it does not explicitly state when to use this over alternatives or when not to use it, leaving the agent to infer the decision boundary.

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. 6 tool updatesv0.1.0
    • First observedcompare_tax_returns
    • First observedfind_location
    • First observedget_tax_return
    • First observedlist_deductions_estv
    • First observedlist_tax_returns
    • First observedsimulate

TDQS

A3.5/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct operation: listing available returns, retrieving a normalized declaration, comparing two declarations, listing deduction options, simulating tax, and resolving location IDs. Even the two list_* tools are clearly separated by their object.

Naming Consistency4/5

Most tools follow a clear snake_case verb_noun pattern such as get_tax_return, list_tax_returns, and find_location. The single tool named simulate is the only mild deviation because it lacks an explicit object, but the pattern remains predictable overall.

Tool Count5/5

Six tools is a well-scoped size for this domain. Each tool supports a distinct part of the tax workflow without redundancy or unnecessary surface area.

Completeness5/5

The toolset covers the full local workflow: discover available returns, retrieve normalized data, compare years, load deduction options, resolve locations, and run simulations. There are no apparent dead ends for an agent trying to analyze or estimate a household's Swiss tax situation.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers