# Spick Me — Swiss public transport (remote · spickme.ch)

Swiss trains, trams, buses, boats: door-to-door journeys with pictures, boards, days out, reach maps

- Trust score: 86/100 (high trust)
- Change this week: +2
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `spickme.ch`: 86/100 (this document), [markdown](https://verifymcp.io/servers/ch-spickme-swiss-public-transport/spickme.md), [page](https://verifymcp.io/servers/ch-spickme-swiss-public-transport/spickme)

## Channel facts

- Endpoint: `https://spickme.ch/mcp`
- Transports: `streamable-http, sse`
- Auth: `none`
- Version: `1.2.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Endpoint Security**: 77/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Nothing on it is marked destructive, but we can't show that an anonymous caller can only read: full credit needs the server to list at least one tool and every tool to be verifiably read-only. We use a best-effort check of tool names and descriptions to tell read-only tools from tools that change things, so some genuinely read-only tools may not get full credit. Names that start with a read verb (get, list, read, search and similar) and accurate readOnlyHint annotations help. Meet that to earn full credit, or require authorisation.
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 74/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 4304 tokens (~478/item across 9 items; 6 tools + 3 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 100/100
  - No destabilizing schema changes in the last 30 days.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 6 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 8 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).
  - Supports UI / widget rendering.

## Install

### How do I install the Spick Me — Swiss public transport MCP server?

Spick Me — Swiss public transport is a hosted endpoint at https://spickme.ch/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http ch-spickme-swiss-public-transport 'https://spickme.ch/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "ch-spickme-swiss-public-transport": {
      "url": "https://spickme.ch/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "ch-spickme-swiss-public-transport": {
      "type": "http",
      "url": "https://spickme.ch/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.ch-spickme-swiss-public-transport]
url = "https://spickme.ch/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ch-spickme-swiss-public-transport": {
      "type": "remote",
      "url": "https://spickme.ch/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add ch-spickme-swiss-public-transport --url 'https://spickme.ch/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  ch-spickme-swiss-public-transport:
    url: "https://spickme.ch/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "ch-spickme-swiss-public-transport": {
      "Transport": "http",
      "Url": "https://spickme.ch/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add ch-spickme-swiss-public-transport -t streamable-http -u 'https://spickme.ch/mcp'
```

### Other

```json
{
  "mcpServers": {
    "ch-spickme-swiss-public-transport": {
      "type": "http",
      "url": "https://spickme.ch/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-03 (score 86, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “plan_day_out” rewrote its description, which is the text the model reads
- [security] Tool “plan_journey” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: 415 → 478
- [cosmetic] “plan_day_out” added an optional parameter “punctuality”
- [cosmetic] “plan_journey” added an optional parameter “punctuality”

### 2026-11-02 (score 86, 0)

- [security] Stability: 0.97 → pass

### 2026-11-01 (score 86, +1)

No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-30 (score 85, +1)

No change was recorded against any check on this day. Stability & Change Management went from 87 to 90. That category is still filling its 30-day observation window: 26 days of observed history at the previous scan, 27 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-28 (score 84, +1)

No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-26 (score 83, +1)

No change was recorded against any check on this day. Stability & Change Management went from 73 to 77. That category is still filling its 30-day observation window: 22 days of observed history at the previous scan, 23 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-25 (score 82, 0)

- [security] The server rewrote its instructions, which are the text every model session reads
- [security] Tool “departures” rewrote its description, which is the text the model reads
- [security] Tool “find_place” rewrote its description, which is the text the model reads
- [security] Tool “plan_day_out” rewrote its description, which is the text the model reads
- [security] Tool “plan_journey” rewrote its description, which is the text the model reads
- [security] Tool “reachable_area” rewrote its description, which is the text the model reads
- [security] Tool “travel_time_matrix” rewrote its description, which is the text the model reads

### 2026-10-23 (score 82, +1)

No change was recorded against any check on this day. Stability & Change Management went from 63 to 67. That category is still filling its 30-day observation window: 19 days of observed history at the previous scan, 20 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (6)

### `find_place` (~372 tokens)

Find a station, stop, address or place in Switzerland

Look up what a place name means in the Swiss public-transport network: stations and stops, street addresses, and named places (a university, a museum, a mountain), ranked best first, each with a stable place_id.

Use it when the user names a place you are not sure of, when another tool answered that a name is ambiguous, or to get coordinates for a place. You do not need it before plan_journey or departures for ordinary names — those tools accept names directly and say how they read them. A station or stop in Switzerland carries a page_url: its page on spickme.ch, with its departures, its lines and the places it reaches directly.

Inputs: query is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofstrasse 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. limit is how many candidates to return (1–10, default 5). near is an optional latitude/longitude that breaks ties between equally good matches.

Example: {"query": "Winterthur Spital"} returns the stop "Winterthur, Kantonsspital" with its place_id, which you can pass to plan_journey as from or to.

Input parameters:

- `limit` (integer): How many candidates to return, best first.
- `near` (object): Where the user is, if known: prefers nearer matches among equally good ones.
- `query` (string, required): The name, address or coordinate to look up.

Output parameters:

- `candidates` (array)
- `data` (object)
- `query` (string)

### `plan_journey` (~949 tokens)

Plan a public-transport journey in Switzerland

Find the best connections by train, tram, bus, boat and mountain railway between two places in Switzerland, over the official Swiss timetable. Door to door: an address or a named place works as well as a station, and the walk to and from the nearest stops is included.

Use it for "how do I get from A to B", "the next connections from Olten to Zürich", "when is the next train to …", "I need to be in Bern by 9" — it gives departure and arrival times, changes and platforms. Prefer it to the departure board for any question with a destination. Every journey comes with a picture_url: a link that opens a ready-made image of the connection, for looking at or sharing. The answer's open_url opens the same search on spickme.ch, where the connections are shown with their live delays.

Inputs: from and to are each A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofstrasse 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. Give departure (leave at or after) or arrival (be there by), not both; with arrival, the answer also brings the first connection arriving up to 30 minutes after it, for a user who said "around"; both are Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now. via is up to three stations or stops the journey must pass through (then one best journey is returned); to stop somewhere on the way, use plan_day_out. max_transfers caps the number of changes (0 = direct only). limit is how many alternatives to return (1–8, default 4). punctuality says how much of the trains' past record to include (default "summary").

Every journey also carries its track record from the days before (up to eight weeks): track_record says on how…

Input parameters:

- `arrival` (string): Arrive by this time. Give this or departure, not both.
- `departure` (string): Leave at or after this time. Omit both departure and arrival for now.
- `from` (string, required): Where the journey starts.
- `limit` (integer): How many alternative journeys to return.
- `max_transfers` (integer): The most changes of vehicle allowed; 0 for direct connections only.
- `punctuality` (string): How much of the trains' record on past days to include. "summary" (default): for each ride, on how many of the last days (up to eight weeks) it was on time at the station you get off; for each change…
- `to` (string, required): Where the journey ends.
- `transfer_time_factor` (number): How much time to allow for changing trains, as a multiple of the timetable's minimum change times: 1 (default) is the timetable's own; 1.5 for luggage, children or reduced mobility; 0.7 for a fast wa…
- `via` (array): Stations or stops the journey must pass through, in order. With via, one best journey is returned.

Output parameters:

- `arriving_just_after` (object)
- `data` (object)
- `from` (object)
- `interpreted` (array)
- `journeys` (array)
- `open_url` (string)
- `to` (object)
- `walk_instead` (object)

### `departures` (~478 tokens)

Departure board for a Swiss station or stop

List the next departures from one station or stop, as the board on the platform would: time, line, direction, platform, kind of vehicle, and the next stops it calls at.

Use it for "what leaves from Bern in the next hour", "when is the next tram from Bellevue", or to see how often a place is served. With to, it lists only what calls at that station later, each with its arrival time there — "trains from Olten to Zürich HB" — including trains whose destination is further on. For connections that may need a change, or door to door, use plan_journey. The answer's open_url opens the station's live board on spickme.ch.

Inputs: station is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofstrasse 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. If it is an address or coordinate, the nearest stop is used and named in the answer. to (optional) is a station the departures must call at, read the same way. time is when the board starts; Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now. limit is how many departures (1–40, default 12).

Times are planned timetable times with their Swiss offset; live delays and cancellations are not included.

Example: {"station": "Luzern", "time": "2026-09-26T17:30", "limit": 8}

Input parameters:

- `limit` (integer): How many departures to list.
- `station` (string, required): The station or stop whose board to show.
- `time` (string): When the board starts. Omit for now.
- `to` (string): Only departures that call at this station later, with their arrival there.

Output parameters:

- `data` (object)
- `departures` (array)
- `open_url` (string)
- `station` (object)
- `to` (object)

### `plan_day_out` (~772 tokens)

Plan a day out with several stops in Switzerland

Plans a multi-stop day with a stay at each stop, timing each leg from when the previous stay ends: the train there, the hours somewhere, the connection on, and the way home.

Use it for "a day trip from Bern to Grindelwald with four hours hiking, then dinner in Interlaken", "visit Thun, Spiez and Interlaken today", or an evening out and back. For a single A-to-B trip, use plan_journey.

Inputs: start is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofstrasse 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. stops is the list of places in order (1–12), each with stay_minutes (default 120; 0 means pass through without stopping) or leave_at ("HH:MM", move on at that time — a night away works: the next such time), and an optional note. end defaults to start, which makes it a round trip. departure is when the day starts: Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now.

Each leg comes with a picture_url that opens an image of that connection, and the answer's open_url opens the whole day on spickme.ch, where a stay can be changed, the day re-planned for another date, and the plan shared. Each leg also carries its track record from the days before, as plan_journey's journeys do: on how many of them it ran smoothly, how punctual each train was where you get off, and how often each change was too short; punctuality sets how much of it (default "summary").

Example: {"start": "Bern", "stops": [{"place": "Grindelwald", "stay_minutes": 240, "note": "hike"}, {"place": "Interlaken Ost", "stay_minutes": 90, "note": "dinner"}], "departure": "2026-09-26T08:00"}

Input parameters:

- `departure` (string): When the day starts. Omit for now.
- `end` (string): Where the day ends; defaults to start.
- `punctuality` (string): How much of the trains' record on past days to include. "summary" (default): for each ride, on how many of the last days (up to eight weeks) it was on time at the station you get off; for each change…
- `start` (string, required): Where the day starts.
- `stops` (array, required): The places to visit, in order.
- `transfer_time_factor` (number): How much time to allow for changing trains, as a multiple of the timetable's minimum change times: 1 (default) is the timetable's own; 1.5 for luggage, children or reduced mobility; 0.7 for a fast wa…

Output parameters:

- `back` (string)
- `data` (object)
- `leaving` (string)
- `legs` (array)
- `minutes_travelling` (integer)
- `open_url` (string)
- `stays` (array)

### `reachable_area` (~536 tokens)

Everywhere reachable by public transport within a time budget

List every station and stop in Switzerland reachable from one place within a number of minutes by public transport, nearest first, with the earliest arrival at each.

Use it for "where can I get to from Bern in 45 minutes", "which towns are within an hour's commute of Zug", catchment areas and isochrones. For the travel time between specific places, use travel_time_matrix; for how to make a particular journey, plan_journey. The answer's open_url opens the area as a map on spickme.ch, with every place reached and a picture of it to share.

Inputs: from is A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofstrasse 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. (an address or coordinate is snapped to its nearest stop, which the answer names). departure is when to leave: Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now. max_minutes is the time budget (default 60), waiting for the first vehicle included. limit is how many places to list (default 50). max_transfers caps changes.

Minutes are timetable minutes from the departure time given, on that day's planned timetable; live delays are not included.

Example: {"from": "Bern", "departure": "2026-09-28T07:30", "max_minutes": 45}

Input parameters:

- `departure` (string): When to leave. Omit for now.
- `from` (string, required): Where to start.
- `limit` (integer): How many places to list, nearest first.
- `max_minutes` (integer): The time budget in minutes, waiting included.
- `max_transfers` (integer): The most changes of vehicle allowed.
- `transfer_time_factor` (number): How much time to allow for changing trains, as a multiple of the timetable's minimum change times: 1 (default) is the timetable's own; 1.5 for luggage, children or reduced mobility; 0.7 for a fast wa…

Output parameters:

- `data` (object)
- `departure` (string)
- `from` (object)
- `max_minutes` (integer)
- `open_url` (string)
- `places` (array)
- `total_reachable` (integer)
- `truncated` (boolean)

### `travel_time_matrix` (~530 tokens)

Public-transport travel times between many origins and destinations

Compute the public-transport travel time in minutes from each of several origins to each of several destinations in Switzerland, for one departure time. For comparing locations: which office site is best reached from where staff live, which flat has the shortest commutes, how well a venue is connected.

Use it when there are several places on either side. For one pair with the actual connection, use plan_journey; for everywhere reachable, reachable_area. Each origin in the answer carries a reach_url: the places reachable from it, as a map on spickme.ch.

Inputs: origins and destinations are lists of places, each A station or stop name ("Zürich HB", "Bern", "Lausanne, Flon"), an address ("Bahnhofstrasse 1, Winterthur"), a named place ("ETH Zürich", "Kunsthaus"), a coordinate as "geo:47.3769,8.5417", or a place_id returned by find_place ("stop:8503000"). Names are read the way a rider types them; an ambiguous name returns candidates instead of a guess. (addresses and coordinates are snapped to their nearest stop, named in the answer). departure: Swiss local time in ISO 8601, e.g. "2026-09-26T08:00"; an explicit offset or Z is converted. A bare "08:00" means today (tomorrow if it has long passed). Omit for now. max_transfers caps changes.

The answer is minutes[i][j] from origins[i] to destinations[j], waiting for the first vehicle included, or null where no connection exists that day. Planned timetable; live delays are not included.

Example: {"origins": ["Winterthur", "Baden", "Zug"], "destinations": ["Zürich HB", "Zürich Oerlikon"], "departure": "2026-09-28T07:30"}

Input parameters:

- `departure` (string): When to leave. Omit for now.
- `destinations` (array, required): Where each column of the matrix ends.
- `max_transfers` (integer): The most changes of vehicle allowed.
- `origins` (array, required): Where each row of the matrix starts.
- `transfer_time_factor` (number): How much time to allow for changing trains, as a multiple of the timetable's minimum change times: 1 (default) is the timetable's own; 1.5 for luggage, children or reduced mobility; 0.7 for a fast wa…

Output parameters:

- `data` (object)
- `departure` (string)
- `destinations` (array)
- `minutes` (array)
- `origins` (array)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/ch-spickme-swiss-public-transport/spickme#diagnostics

## Score history

- 2026-11-05: 86
- 2026-11-04: 86
- 2026-11-03: 86
- 2026-11-02: 86
- 2026-11-01: 86
- 2026-10-31: 85
- 2026-10-30: 85
- 2026-10-29: 84
- 2026-10-28: 84
- 2026-10-27: 83
- 2026-10-26: 83
- 2026-10-25: 82
- 2026-10-24: 82
- 2026-10-23: 82
- 2026-10-22: 81
- 2026-10-21: 81
- 2026-10-20: 80
- 2026-10-19: 80
- 2026-10-18: 79
- 2026-10-17: 79
- 2026-10-16: 79
- 2026-10-15: 78
- 2026-10-14: 78
- 2026-10-13: 77
- 2026-10-12: 77
- 2026-10-10: 76
- 2026-10-04: 73
- 2026-10-03: 72

## Common questions

### What is the Spick Me — Swiss public transport MCP server?

Spick Me — Swiss public transport is an MCP server listed in the public MCP registry as ch.spickme/swiss-public-transport. Swiss trains, trams, buses, boats: door-to-door journeys with pictures, boards, days out, reach maps. This page covers its hosted endpoint (https://spickme.ch/mcp).

### Is the Spick Me — Swiss public transport MCP server safe to use?

Spick Me — Swiss public transport scores 86 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Spick Me — Swiss public transport MCP server expose?

Spick Me — Swiss public transport exposes 6 tools: find_place, plan_journey, departures, plan_day_out, reachable_area, travel_time_matrix. Their descriptions and schemas cost roughly 3,637 tokens of context every time the server is loaded.

### Does the Spick Me — Swiss public transport MCP server require authentication?

No. We connected to Spick Me — Swiss public transport without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the Spick Me — Swiss public transport MCP server still maintained?

Spick Me — Swiss public transport is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What did VerifyMCP test on the Spick Me — Swiss public transport MCP server?

VerifyMCP ran 14 checks on Spick Me — Swiss public transport, covering TLS certificate, Authorization, HTTPS, HSTS header and 10 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- Remote endpoint: https://spickme.ch/mcp
- Website: https://spickme.ch/ai
- Changelog RSS feed: https://verifymcp.io/servers/ch-spickme-swiss-public-transport/spickme.xml
- Changelog JSON feed: https://verifymcp.io/servers/ch-spickme-swiss-public-transport/spickme/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/ch-spickme-swiss-public-transport/spickme.json
- HTML version of this page: https://verifymcp.io/servers/ch-spickme-swiss-public-transport/spickme
