Swiss income tax by municipality, cheaper-town ranking, apartment listings and commute times.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Estimates the monthly cost in CHF of commuting between two Swiss places, as a transit-pass estimate priced from Swiss regional fare-zone data. Some pricing regimes are approximations rather than an exact tariff.
Origin as a place or station name, e.g. "Feusisberg". Not a postcode on its own.
Destination as a place or station name.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Estimates the monthly cost in CHF of commuting between two Swiss places, as a transit-pass estimate priced from Swiss regional fare-zone data. Some pricing regimes are approximations rather than an exact tariff.
| Argument | Type | Description |
|---|---|---|
| to | string | Destination as a place or station name. |
| from* | string | Origin as a place or station name, e.g. "Feusisberg". Not a postcode on its own. |
{
"type": "object",
"required": [
"from"
],
"properties": {
"to": {
"type": "string",
"default": "Zürich HB",
"maxLength": 80,
"description": "Destination as a place or station name."
},
"from": {
"type": "string",
"maxLength": 80,
"description": "Origin as a place or station name, e.g. \"Feusisberg\". Not a postcode on its own."
}
},
"additionalProperties": false
}Returns the public-transport journey time in minutes between two Swiss places, using the national timetable.
| Argument | Type | Description |
|---|---|---|
| to | string | Destination as a place or station name. |
| from* | string | Origin as a place or station name, e.g. "Uster". Not a postcode on its own. |
{
"type": "object",
"required": [
"from"
],
"properties": {
"to": {
"type": "string",
"default": "Zürich HB",
"maxLength": 80,
"description": "Destination as a place or station name."
},
"from": {
"type": "string",
"maxLength": 80,
"description": "Origin as a place or station name, e.g. \"Uster\". Not a postcode on its own."
}
},
"additionalProperties": false
}Ranks municipalities that are cheaper than, or within CHF 1000/yr of, a stated current home, by annual tax saving — municipalities near-identical in cost are included deliberately, not filtered out. Answered from cached figures only, so the ranking may be partial; the response states how many candidates were covered. Pass `near` (a town or station name) and `radiusKm` to keep only places around where the household lives or works; an unrecognised place is reported, not silently ignored.
| Argument | Type | Description |
|---|---|---|
| near | string | Town or station name to search around, e.g. "Winterthur". Not a postcode. |
| income* | integer | Gross annual income in CHF. |
| children | integer | Dependent children. |
| radiusKm | integer | Distance from `near` in km (default 20). Ignored without `near`. |
| confession | string | Church-tax affiliation. |
| currentBfsId* | integer | BFS id of the current home. |
| currentRooms | number | Size of the current home in rooms, used for the rent comparison. |
| relationship | string | Marital status. |
Lists apartments currently advertised in one municipality, cheapest first, with the local median asking rent. Indicative figures for browsing only: they come from a portal feed and are not verified against the listing page.
| Argument | Type | Description |
|---|---|---|
| bfsId* | integer | Municipality to search in. |
| limit | integer | Maximum listings to return (1-25). |
| rooms | number | Preferred size in rooms; re-ranks, never filters. |
| surface | number | Preferred living space in m²; re-ranks. |
{
"type": "object",
"required": [
"bfsId"
],
"properties": {
"bfsId": {
"type": "integer",
"maximum": 9999,
"minimum": 1,
"description": "Municipality to search in."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 25,
"minimum": 1,
"description": "Maximum listings to return (1-25)."
},
"rooms": {
"type": "number",
"maximum": 20,
"minimum": 1,
"description": "Preferred size in rooms; re-ranks, never filters."
},
"surface": {
"type": "number",
"maximum": 1000,
"minimum": 5,
"description": "Preferred living space in m²; re-ranks."
}
},
"additionalProperties": false
}Returns the tax picture for one municipality relative to a stated current home: the annual difference, the tax multiplier, and the multi-year trend where past years are known.
| Argument | Type | Description |
|---|---|---|
| bfsId* | integer | The municipality to describe. |
| years | integer | How many years of history to include. |
| income* | integer | Gross annual income in CHF. |
| children | integer | Dependent children. |
| confession | string | Church-tax affiliation. |
| currentBfsId* | integer | BFS id of the current home, which every difference is measured against. |
| relationship | string | Marital status. |
{
"type": "object",
"required": [
"bfsId",
"currentBfsId",
"income"
],
"properties": {
"bfsId": {
"type": "integer",
"maximum": 9999,
"minimum": 1,
"description": "The municipality to describe."
},
"years": {
"type": "integer",
"default": 5,
"maximum": 7,
"minimum": 1,
"description": "How many years of history to include."
},
"income": {
"type": "integer",
"maximum": 10000000,
"minimum": 1,
"description": "Gross annual income in CHF."
},
"children": {
"type": "integer",
"default": 0,
"maximum": 20,
"minimum": 0,
"description": "Dependent children."
},
"confession": {
"enum": [
"none",
"roman",
"protestant"
],
"type": "string",
"default": "none",
"description": "Church-tax affiliation."
},
"currentBfsId": {
"type": "integer",
"maximum": 9999,
"minimum": 1,
"description": "BFS id of the current home, which every difference is measured against."
},
"relationship": {
"enum": [
"single",
"married"
],
"type": "string",
"default": "single",
"description": "Marital status."
}
},
"additionalProperties": false
}Finds Swiss municipalities by name fragment or postcode. Returns the BFS id, name, canton and postcodes for each match. The BFS id is the key every other tool here takes.
| Argument | Type | Description |
|---|---|---|
| q | string | Name fragment, e.g. "Uster". Case-insensitive. |
| zip | string | Four-digit Swiss postcode, e.g. "8308" (which alone spans three Gemeinden). |
| limit | integer | Maximum matches to return (1-50). |
{
"type": "object",
"required": [],
"properties": {
"q": {
"type": "string",
"maxLength": 60,
"description": "Name fragment, e.g. \"Uster\". Case-insensitive."
},
"zip": {
"type": "string",
"maxLength": 4,
"description": "Four-digit Swiss postcode, e.g. \"8308\" (which alone spans three Gemeinden)."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 50,
"minimum": 1,
"description": "Maximum matches to return (1-50)."
}
},
"additionalProperties": false
}Reports the Swiss Federal Statistical Office's average monthly rent for a municipality, optionally for a given apartment size in rooms. BFS does not publish rent below canton level except for 10 named cities, so the figure may describe the CANTON rather than the municipality itself; the response states which.
| Argument | Type | Description |
|---|---|---|
| bfsId* | integer | Municipality BFS id, from municipality_search. |
| rooms | number | Apartment size in rooms, e.g. 3.5. Omit for the overall average. |
{
"type": "object",
"required": [
"bfsId"
],
"properties": {
"bfsId": {
"type": "integer",
"maximum": 9999,
"minimum": 1,
"description": "Municipality BFS id, from municipality_search."
},
"rooms": {
"type": "number",
"maximum": 20,
"minimum": 1,
"description": "Apartment size in rooms, e.g. 3.5. Omit for the overall average."
}
},
"additionalProperties": false
}Calculates the annual Swiss income tax for one municipality and one household profile, split into federal, cantonal and municipal parts. The figures come from the federal tax administration's calculation for the given gross income.
| Argument | Type | Description |
|---|---|---|
| year | integer | Tax year. Defaults to the year this installation is configured for. |
| bfsId* | integer | Municipality BFS id, from municipality_search. |
| income* | integer | Gross annual household income in CHF. |
| children | integer | Number of dependent children. |
| confession | string | Church-tax affiliation. |
| relationship | string | Marital status used for the tariff. |
{
"type": "object",
"required": [
"bfsId",
"income"
],
"properties": {
"year": {
"type": "integer",
"maximum": 2025,
"minimum": 2015,
"description": "Tax year. Defaults to the year this installation is configured for."
},
"bfsId": {
"type": "integer",
"maximum": 9999,
"minimum": 1,
"description": "Municipality BFS id, from municipality_search."
},
"income": {
"type": "integer",
"maximum": 10000000,
"minimum": 1,
"description": "Gross annual household income in CHF."
},
"children": {
"type": "integer",
"default": 0,
"maximum": 20,
"minimum": 0,
"description": "Number of dependent children."
},
"confession": {
"enum": [
"none",
"roman",
"protestant"
],
"type": "string",
"default": "none",
"description": "Church-tax affiliation."
},
"relationship": {
"enum": [
"single",
"married"
],
"type": "string",
"default": "single",
"description": "Marital status used for the tariff."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"currentBfsId",
"income"
],
"properties": {
"near": {
"type": "string",
"maxLength": 80,
"description": "Town or station name to search around, e.g. \"Winterthur\". Not a postcode."
},
"income": {
"type": "integer",
"maximum": 10000000,
"minimum": 1,
"description": "Gross annual income in CHF."
},
"children": {
"type": "integer",
"default": 0,
"maximum": 20,
"minimum": 0,
"description": "Dependent children."
},
"radiusKm": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Distance from `near` in km (default 20). Ignored without `near`."
},
"confession": {
"enum": [
"none",
"roman",
"protestant"
],
"type": "string",
"default": "none",
"description": "Church-tax affiliation."
},
"currentBfsId": {
"type": "integer",
"maximum": 9999,
"minimum": 1,
"description": "BFS id of the current home."
},
"currentRooms": {
"type": "number",
"maximum": 20,
"minimum": 1,
"description": "Size of the current home in rooms, used for the rent comparison."
},
"relationship": {
"enum": [
"single",
"married"
],
"type": "string",
"default": "single",
"description": "Marital status."
}
},
"additionalProperties": false
}