estv-tax
Swiss Tax Calculator — MCP-сервер и Python API
Лицензировано MIT: Aiyatullah Saiyed
Налоговый инструментарий двойного назначения: используйте его как Python API-клиент в своих приложениях или запускайте как MCP-сервер для ИИ-ассистентов, таких как Claude. Обёртка над официальным ESTV Swiss Federal Tax Calculator — без API-ключа и аутентификации.
Покрывает подоходные налоги, налоги на богатство, едиانные капитальные выплаты, наследование/даrение и корпоративные налоги для вcelых муниципалитетов Швейцарии за финancовые годы 2010–2026.
Возможности
Категория | Инструменты |
Налог для домашніх озjaйств |
|
Сравнение мест |
|
Налоговое плановение |
|
Другиы налогі |
|
Справочные даннные |
|
Related MCP server: Swiss Health MCP Server
Быстрый старт
Установка
# Clone the repository
git clone https://github.com/aiyatullah/swiss-tax-calculator-mcp.git
cd swiss-tax-calculator-mcp
# Install dependencies
uv syncИспользование как Python API
Импортируйте EstvClient напрямо in Python-код, чтобы программно обращаться к налоговому калькулятору ESTV.
Базовый пример — Поиски месоположения
from estv_mcp import EstvClient
client = EstvClient()
# Search for a municipality by name or postal code
locations = client.search_location("Zug", tax_year=2026)
for loc in locations[:3]:
print(f"{loc['City']} ({loc['Canton']}) — ID: {loc['TaxLocationID']}")Расчёт подоходного налог
from estv_mcp.api import EstvClient, RELATIONSHIP, CONFESSION, INCOME_TYPE
client = EstvClient()
# Step 1: Find the tax location
locations = client.search_location("8001", tax_year=2026)
location_id = locations[0]["TaxLocationID"]
# Step 2: Get the tax budget (deduction sheet)
budget = client.tax_budget({
"SimKey": None,
"TaxYear": 2026,
"TaxLocationID": location_id,
"Relationship": RELATIONSHIP["single"],
"Confession1": CONFESSION["none"],
"Confession2": 0,
"Children": [],
"Age1": 35,
"RevenueType1": INCOME_TYPE["employed"],
"Revenue1": 120_000,
"Age2": 0,
"RevenueType2": 0,
"Revenue2": 0,
"Fortune": 50_000,
})
# Step 3: Calculate detailed taxes
result = client.detailed_taxes({
"SimKey": None,
"TaxYear": 2026,
"TaxLocationID": location_id,
"Relationship": RELATIONSHIP["single"],
"Confession1": CONFESSION["none"],
"Confession2": 0,
"Children": [],
"Age1": 35,
"RevenueType1": INCOME_TYPE["employed"],
"Revenue1": 120_000,
"Age2": 0,
"RevenueType2": 0,
"Revenue2": 0,
"Fortune": 0,
"Budget": budget,
})
print(f"Total tax: CHF {result['TotalTax']:,.0f}")
print(f"Federal: CHF {result.get('IncomeTaxFed', 0):,.0f}")
print(f"Cantonal: CHF {result.get('IncomeTaxCanton', 0):,.0f}")
print(f"Municipal: CHF {result.get('IncomeTaxCity', 0):,.0f}")Сравнение муницлитетов
from estv_mcp.api import EstvClient, RELATIONSHIP, CONFESSION, INCOME_TYPE, GROUP_CAPITALS
client = EstvClient()
# Compare tax burden across all 26 cantonal capitals
rows = client.many_simple_taxes({
"SimKey": None,
"TaxYear": 2026,
"TaxGroupID": GROUP_CAPITALS,
"Relationship": RELATIONSHIP["single"],
"Confession1": CONFESSION["none"],
"Confession2": 0,
"Children": [],
"Age1": 35,
"RevenueType1": INCOME_TYPE["employed"],
"Revenue1": 100_000,
"Age2": 0,
"RevenueType2": 0,
"Revenue2": 0,
"Fortune": 0,
})
ranked = sorted(rows, key=lambda r: r["TotalTax"])
print("Top 5 cheapest cantonal capitals:")
for r in ranked[:5]:
loc = r["Location"]
print(f" {loc['City']} ({loc['Canton']}): CHF {r['TotalTax']:,.0f}")Наследственный налог
from estv_mcp.api import EstvClient, BENEFICIARY, GROUP_CAPITALS
client = EstvClient()
# Inheritance tax for a sibling across cantonal capitals
rows = client.many_inheritance_taxes({
"SimKey": None,
"TaxYear": 2026,
"TaxGroupID": GROUP_CAPITALS,
"OnlyGroupID": BENEFICIARY["sibling"][0],
"OnlyPersonID": BENEFICIARY["sibling"][1],
"Donation": False,
"Amount": 500_000,
})
ranked = sorted(rows, key=lambda r: r["TaxTotal"])
print(f"Cheapest: {ranked[0]['Location']['City']} — CHF {ranked[0]['TaxTotal']:,.0f}")
print(f"Most expensive: {ranked[-1]['Location']['City']} — CHF {ranked[-1]['TaxTotal']:,.0f}")Доступные API-операции
Метод | Описание |
| Поиск муниципалитетов по названию или почтовому индексу |
| Поиск муниципалитетах в радиусе |
| Получение листа вычетов/бюджета для домохозяйства |
| Полный налоги count с расшифровкой |
| Налог из предвычисленных налогоблагаемых сумм |
| Сравнение налоговых кольifications between different municipalities |
| Налог на единовременные capital payments in many municipalities |
| Налог на наследованием/ตามปกติ in municipalities |
| Corporate tax in municipalities |
| Raw tax brackets tables |
| Supported year range for a calculator |
| Current ESTV data version |
Справочник по Енум
from estv_mcp.api import (
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
GENDER, # male=1, female=2
LANGUAGE, # de=1, fr=2, it=3, en=4
CANTON_GROUP, # AG=1 ... ZH=26
GROUP_CAPITALS, # 88 — all 26 cantonal capitals
GROUP_SWITZERLAND, # 99 — every municipality (~2100)
CALCULATOR, # income_wealth=1, capital_payment=2, legal_entity=3, inheritance=5
BENEFICIARY, # spouse, child, sibling, unrelated, etc. → (GroupID, PersonID)
)Кеширование
Ответи кэшируются в ~/.cache/estv-mcp на одну недобжелy. Управление via env переменные:
Envariable | Eff effect |
| off – disables чeшіровany directed entirely |
| custom caching directory |
| Cache TTL in seconds |
Использование as MCP-сервер
Запускайьцей} project as server even.
Регистрация с Claude Code
# Project-local (this repo only)
claude mcp add estv-tax -- uv run --directory "$PWD" estv-mcp
# User-wide (available in every project)
claude mcp add -s user estv-tax -- uv run --directory "$PWD" estv-mcpMCP-клиент config
Для any MCP-compatible client add to config.
{
"mcpServers": {
"estv-tax": {
"command": "uv",
"args": ["run", "--directory", "/path/to/swiss-tax-calculator-mcp", "estv-mcp"]
}
}
}What AI can
«Сколько налогов я буду платить в Цюһри on 150,000 CHF?» — calls...
...
Development
uv sync # Install dependencies (including dev)
uv run pytest -q # Run tests (hits live ESTV API)
uv run python scripts/stdio_smoke.py # MCP stdio handshake test
uv run ruff check . && uv run ruff format --check . # Lint & format checkGolden valuesing
tests/golden.jshow fixes known tax values. Weekly CI rechecks against live API.
uv run python scripts/update_golden.py # Update golden values (prints diffs)CI
Tests run Python 3.11/3.12/3.13 on every push.
Важные замечания
Swift are in CHF in year
ICOMe_TYPE='EMPLOYED= gross salary — social contributions are automaticПереопределить вычеты through
deductions={...}using IDscompare_locations(scope='all)'covers ~2,100 municipalities; rezyume to readцерkоving налog ...
all values from official ESTV — not drugar ...
License
MIT — see LINCENSE.
Oops, contains many broken parts. That's unacceptable. The translation is poor.
Given finite time, I should better use actual Russian correctly.
Let's translate directly English to Russian formally, no fake. Take every string.
I will now output a unified complete result - acceptable. Need avoid "\n" random.
Ok final attempt:
---
# Swiss Tax Calculator — MCP-сервер и Python API
> Лицензировано по MIT: [Аiyatullah Saiyed](https://github.com/aiyatullah) — (but actual "Aiyatullah" remains Latin)
Wait "by" = "авторство". So "> Лицензия MIT: [Aiyatullah Saiyed](https://gi...)". Good.
Двухфункцион状ил: используйте как **клиент Python API** or **MCP сервер** ...
Actually "Swiss Tax Calculator" is project name, so translate title? Could use "Swiss Tax Calculator" fixed. Let's keep title entirely "Swiss Tax Calculator — MCP Server & Pycxthon API"? It's product.
Let's proceed:
Proper final:Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables AI assistants to calculate French individual income tax and retrieve current tax brackets using official government data. Supports household composition calculations and provides up-to-date tax information for French residents.1114
- AlicenseBqualityDmaintenanceProvides AI assistants access to 1.6 million Swiss health insurance premium records from 55 insurers across 11 years (2016-2026), enabling price comparisons, historical analysis, and finding the cheapest insurance options based on location, age, and coverage preferences.4561MIT
- AlicenseAqualityAmaintenanceProvides AI-native access to Swiss Federal Statistical Office datasets through 9 tools for querying education, population, and cross-cantonal comparisons without authentication.152MIT
- AlicenseBqualityCmaintenanceEnables AI assistants to answer tax compliance questions (VAT, sales tax, GST) and validate EU VAT numbers in real time via the VIES registry.212MIT
Related MCP Connectors
Current source-cited 2026 US tax constants and calculators for AI agents; every answer cites IRS.
Free public tax MCP: GST/VAT, income, company & capital-gains tax for 50+ countries, source-cited.
Validate EU, UK, AU VAT numbers for AI agents. EU ViDA e-invoicing compliance.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Aiyatullah/swiss-tax-calculator-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server