sbb-mcp 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -1
- package/dist/formatters.d.ts +10 -8
- package/dist/formatters.js +66 -45
- package/dist/formatters.js.map +1 -1
- package/dist/i18n.d.ts +22 -0
- package/dist/i18n.js +36 -0
- package/dist/i18n.js.map +1 -0
- package/dist/profile.d.ts +3 -1
- package/dist/profile.js +10 -3
- package/dist/profile.js.map +1 -1
- package/dist/tools.js +72 -32
- package/dist/tools.js.map +1 -1
- package/dist/transport/smapi-client.js +1 -0
- package/dist/transport/smapi-client.js.map +1 -1
- package/dist/transport/smapi-journey.d.ts +9 -4
- package/dist/transport/smapi-journey.js +7 -6
- package/dist/transport/smapi-journey.js.map +1 -1
- package/dist/transport/smapi-mock.d.ts +6 -2
- package/dist/transport/smapi-mock.js +9 -2
- package/dist/transport/smapi-mock.js.map +1 -1
- package/dist/transport/smapi-prices.d.ts +3 -2
- package/dist/transport/smapi-prices.js +5 -3
- package/dist/transport/smapi-prices.js.map +1 -1
- package/package.json +7 -1
package/README.md
CHANGED
|
@@ -17,7 +17,9 @@ Works with Claude Desktop, Claude Code, Cursor, Windsurf, VS Code Copilot, ChatG
|
|
|
17
17
|
- **Pagination** -- browse earlier/later connections
|
|
18
18
|
- **Trip details** -- intermediate stops, occupancy, platform changes
|
|
19
19
|
- **Journey planning** -- built-in prompt for end-to-end trip planning
|
|
20
|
+
- **Destination weather** -- automatic weather forecast for your destination (powered by [swiss-weather-mcp](https://www.npmjs.com/package/swiss-weather-mcp))
|
|
20
21
|
- **Multi-traveler** -- family trip pricing when connected to SwissTrip (partner, kids, each with their own reduction card)
|
|
22
|
+
- **Multilingual** -- output in 9 languages: de, fr, it, en, es, pt, ru, ar, zh (v0.4.0+)
|
|
21
23
|
- **Mock mode** -- works without credentials for testing and demos
|
|
22
24
|
|
|
23
25
|
## Quick Start
|
|
@@ -130,6 +132,25 @@ npx sbb-mcp
|
|
|
130
132
|
|
|
131
133
|
This lets you test the MCP server with realistic Swiss station data without SBB API credentials.
|
|
132
134
|
|
|
135
|
+
## Multilingual output (v0.4.0+)
|
|
136
|
+
|
|
137
|
+
Every tool accepts an optional `language` argument — one of `de`, `fr`, `it`, `en`, `es`, `pt`, `ru`, `ar`, `zh`. This controls the output language for labels, date/time formatting, and the ticket-buy button text. It also sets the `Accept-Language` header on SBB API calls so station names come back in the requested language where the SBB API supports it (de/fr/it/en).
|
|
138
|
+
|
|
139
|
+
Resolution order: `language` arg → saved profile language (`save_profile`) → English.
|
|
140
|
+
|
|
141
|
+
```jsonc
|
|
142
|
+
// Example: French output
|
|
143
|
+
{ "from": "Zurich HB", "to": "Bern", "language": "fr" }
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
The SBB deep link path uses `de/fr/it/en` where supported and falls back to `en` for other languages (SBB.ch serves those four).
|
|
147
|
+
|
|
148
|
+
Save a default language once per user:
|
|
149
|
+
|
|
150
|
+
```jsonc
|
|
151
|
+
{ "tool": "save_profile", "language": "de" }
|
|
152
|
+
```
|
|
153
|
+
|
|
133
154
|
## Tools
|
|
134
155
|
|
|
135
156
|
### search_stations
|
|
@@ -155,6 +176,8 @@ Find train connections between two stations. Automatically resolves station name
|
|
|
155
176
|
|
|
156
177
|
**Example:** "Show me trains from Zurich to Bern tomorrow at 9am"
|
|
157
178
|
|
|
179
|
+
Results automatically include destination weather when coordinates are available (e.g. **Bern weather:** 6-18°C, mostly sunny, 10% rain).
|
|
180
|
+
|
|
158
181
|
### get_trip_details
|
|
159
182
|
|
|
160
183
|
Get detailed stop-by-stop information for a connection including intermediate stops, platforms, and occupancy forecasts.
|
|
@@ -267,10 +290,25 @@ Also available as: [sbb-mcp-official](https://www.npmjs.com/package/sbb-mcp-offi
|
|
|
267
290
|
|
|
268
291
|
## About
|
|
269
292
|
|
|
270
|
-
Built on the official SBB Swiss Mobility API (SMAPI) with OSDM-compliant journey planning and pricing. Covers the entire Swiss public transport network including SBB, BLS, SOB, and regional operators.
|
|
293
|
+
Built on the official SBB Swiss Mobility API (SMAPI) with OSDM-compliant journey planning and pricing. Covers the entire Swiss public transport network including SBB, BLS, SOB, and regional operators. Weather data powered by [swiss-weather-mcp](https://www.npmjs.com/package/swiss-weather-mcp) (MeteoSwiss + Open-Meteo).
|
|
271
294
|
|
|
272
295
|
**SBB** (Schweizerische Bundesbahnen) / **CFF** (Chemins de fer federaux suisses) / **FFS** (Ferrovie federali svizzere) -- Swiss Federal Railways operates one of the densest rail networks in the world with over 10,000 daily connections.
|
|
273
296
|
|
|
297
|
+
## Changelog
|
|
298
|
+
|
|
299
|
+
### v0.4.0 — Multilingual
|
|
300
|
+
|
|
301
|
+
- Every tool now accepts an optional `language` parameter (`de | fr | it | en | es | pt | ru | ar | zh`).
|
|
302
|
+
- Labels, date/time formatting, and the SBB ticket-buy button text are translated.
|
|
303
|
+
- `Accept-Language` is passed to SBB SMAPI so station names come back in the requested language where supported (de/fr/it/en).
|
|
304
|
+
- `save_profile` stores a preferred language; later tool calls default to it when `language` is omitted.
|
|
305
|
+
- **Breaking:** default output locale with no profile and no tool arg is now `en` (was implicitly `de-CH`). Set a profile or pass `language: 'de'` to restore the old behavior.
|
|
306
|
+
- Translations shared with the WhatsApp/Telegram bots via the new [`sbb-i18n`](https://www.npmjs.com/package/sbb-i18n) package.
|
|
307
|
+
|
|
308
|
+
### v0.3.0 — Destination weather
|
|
309
|
+
|
|
310
|
+
- Automatic weather forecast appended to `search_connections` results via [`swiss-weather-mcp`](https://www.npmjs.com/package/swiss-weather-mcp).
|
|
311
|
+
|
|
274
312
|
## License
|
|
275
313
|
|
|
276
314
|
[FSL-1.1-MIT](https://fsl.software/) -- Functional Source License. Free to use for any non-competing purpose. Converts to MIT after 2 years. See [LICENSE](LICENSE) for details.
|
package/dist/formatters.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { SmapiPlace, SmapiTrip, SmapiTripsCollection, SmapiPriceResult } from './transport/smapi-types.js';
|
|
2
|
-
|
|
3
|
-
export declare function
|
|
4
|
-
export declare function
|
|
5
|
-
export declare function
|
|
2
|
+
import type { Lang } from './i18n.js';
|
|
3
|
+
export declare function formatStations(stations: SmapiPlace[], lang?: Lang): string;
|
|
4
|
+
export declare function formatConnections(collection: SmapiTripsCollection, lang?: Lang): string;
|
|
5
|
+
export declare function formatTripDetails(trip: SmapiTrip, lang?: Lang): string;
|
|
6
|
+
export declare function formatPrices(results: SmapiPriceResult[], lang?: Lang): string;
|
|
6
7
|
/**
|
|
7
8
|
* Build an SBB.ch deep link URL with connection pre-filled.
|
|
8
|
-
*
|
|
9
|
-
* On mobile with SBB app installed, opens directly in the app (user already logged in).
|
|
9
|
+
* SBB.ch URLs support de/fr/it/en; other languages fall back to `en`.
|
|
10
10
|
*/
|
|
11
11
|
export declare function buildSbbDeepLink(params: {
|
|
12
12
|
fromName: string;
|
|
@@ -15,6 +15,8 @@ export declare function buildSbbDeepLink(params: {
|
|
|
15
15
|
toId: string;
|
|
16
16
|
date: string;
|
|
17
17
|
time: string;
|
|
18
|
-
lang?:
|
|
18
|
+
lang?: Lang;
|
|
19
19
|
}): string;
|
|
20
|
-
export declare function formatTicketLink(tripId: string, deepLink?: string, sbbLink?: string): string;
|
|
20
|
+
export declare function formatTicketLink(tripId: string, deepLink?: string, sbbLink?: string, lang?: Lang): string;
|
|
21
|
+
/** Append destination weather to formatted connections */
|
|
22
|
+
export declare function appendWeatherToConnections(formatted: string, destinationLat: number, destinationLon: number, date: string, destinationName: string): Promise<string>;
|
package/dist/formatters.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
import { getWeatherSummary } from 'swiss-weather-mcp';
|
|
2
|
+
import { toLocale, toSbbLinkLang, t } from './i18n.js';
|
|
3
|
+
function formatTime(iso, lang) {
|
|
2
4
|
const d = new Date(iso);
|
|
3
|
-
return d.toLocaleTimeString(
|
|
5
|
+
return d.toLocaleTimeString(toLocale(lang), {
|
|
4
6
|
hour: '2-digit',
|
|
5
7
|
minute: '2-digit',
|
|
6
8
|
timeZone: 'Europe/Zurich',
|
|
7
9
|
});
|
|
8
10
|
}
|
|
9
|
-
function formatDate(iso) {
|
|
11
|
+
function formatDate(iso, lang) {
|
|
10
12
|
const d = new Date(iso);
|
|
11
|
-
return d.toLocaleDateString(
|
|
13
|
+
return d.toLocaleDateString(toLocale(lang), {
|
|
12
14
|
weekday: 'short',
|
|
13
15
|
day: '2-digit',
|
|
14
16
|
month: '2-digit',
|
|
@@ -24,13 +26,15 @@ function parseDuration(iso) {
|
|
|
24
26
|
const m = match[2] ? `${match[2]}m` : '';
|
|
25
27
|
return `${h}${h && m ? ' ' : ''}${m}` || '0m';
|
|
26
28
|
}
|
|
27
|
-
function
|
|
28
|
-
const
|
|
29
|
-
if (
|
|
30
|
-
return
|
|
31
|
-
|
|
29
|
+
function transfersLabel(n, lang) {
|
|
30
|
+
const tr = t(lang);
|
|
31
|
+
if (n === 0)
|
|
32
|
+
return tr.direct;
|
|
33
|
+
if (n === 1)
|
|
34
|
+
return tr.oneChange;
|
|
35
|
+
return tr.nChanges(n);
|
|
32
36
|
}
|
|
33
|
-
export function formatStations(stations) {
|
|
37
|
+
export function formatStations(stations, lang = 'en') {
|
|
34
38
|
if (stations.length === 0) {
|
|
35
39
|
return 'No stations found.';
|
|
36
40
|
}
|
|
@@ -45,48 +49,50 @@ export function formatStations(stations) {
|
|
|
45
49
|
}
|
|
46
50
|
return lines.join('\n');
|
|
47
51
|
}
|
|
48
|
-
function formatLegSummary(leg) {
|
|
52
|
+
function formatLegSummary(leg, lang) {
|
|
49
53
|
if (leg.type === 'timed') {
|
|
50
54
|
const tl = leg;
|
|
51
55
|
const line = tl.service.publishedLineName || 'Train';
|
|
52
|
-
const platform = tl.board.platform ? `
|
|
56
|
+
const platform = tl.board.platform ? ` ${t(lang).pl}.${tl.board.platform}` : '';
|
|
53
57
|
return `${line}${platform}`;
|
|
54
58
|
}
|
|
55
59
|
if (leg.type === 'transfer') {
|
|
56
60
|
const tr = leg;
|
|
57
61
|
return `Walk ${parseDuration(tr.duration)}`;
|
|
58
62
|
}
|
|
59
|
-
return
|
|
63
|
+
return t(lang).transfer;
|
|
60
64
|
}
|
|
61
|
-
export function formatConnections(collection) {
|
|
65
|
+
export function formatConnections(collection, lang = 'en') {
|
|
62
66
|
const trips = collection.trips;
|
|
67
|
+
const tr = t(lang);
|
|
63
68
|
if (trips.length === 0) {
|
|
64
|
-
return
|
|
69
|
+
return tr.noConnections;
|
|
65
70
|
}
|
|
66
71
|
const first = trips[0];
|
|
67
|
-
const date = formatDate(first.startTime);
|
|
72
|
+
const date = formatDate(first.startTime, lang);
|
|
68
73
|
const lines = [
|
|
69
74
|
`**${first.origin.name} -> ${first.destination.name}** | ${date}`,
|
|
70
75
|
`Collection ID: \`${collection.id}\` (use with get_more_connections)`,
|
|
71
76
|
'',
|
|
72
|
-
|
|
77
|
+
`| ${tr.dep} | ${tr.arr} | ${tr.dur} | ${tr.changes} | Route | Trip ID |`,
|
|
73
78
|
'|-----|-----|----------|-----------|-------|---------|',
|
|
74
79
|
];
|
|
75
80
|
for (const trip of trips) {
|
|
76
|
-
const dep = formatTime(trip.startTime);
|
|
77
|
-
const arr = formatTime(trip.endTime);
|
|
81
|
+
const dep = formatTime(trip.startTime, lang);
|
|
82
|
+
const arr = formatTime(trip.endTime, lang);
|
|
78
83
|
const dur = parseDuration(trip.duration);
|
|
79
|
-
const route = trip.legs.map(formatLegSummary).join(' > ');
|
|
80
|
-
lines.push(`| ${dep} | ${arr} | ${dur} | ${trip.transfers} | ${route} | \`${trip.id}\` |`);
|
|
84
|
+
const route = trip.legs.map(l => formatLegSummary(l, lang)).join(' > ');
|
|
85
|
+
lines.push(`| ${dep} | ${arr} | ${dur} | ${transfersLabel(trip.transfers, lang)} | ${route} | \`${trip.id}\` |`);
|
|
81
86
|
}
|
|
82
87
|
lines.push('');
|
|
83
88
|
lines.push(`*Use \`get_prices\` with trip IDs to see ticket prices. Use \`get_more_connections\` to see earlier/later trains.*`);
|
|
84
89
|
return lines.join('\n');
|
|
85
90
|
}
|
|
86
|
-
export function formatTripDetails(trip) {
|
|
91
|
+
export function formatTripDetails(trip, lang = 'en') {
|
|
92
|
+
const tr = t(lang);
|
|
87
93
|
const lines = [
|
|
88
|
-
`**Trip Details** | ${formatDate(trip.startTime)}`,
|
|
89
|
-
`${trip.origin.name} -> ${trip.destination.name} | ${parseDuration(trip.duration)} | ${trip.transfers
|
|
94
|
+
`**Trip Details** | ${formatDate(trip.startTime, lang)}`,
|
|
95
|
+
`${trip.origin.name} -> ${trip.destination.name} | ${parseDuration(trip.duration)} | ${transfersLabel(trip.transfers, lang)}`,
|
|
90
96
|
`Status: ${trip.tripStatus}`,
|
|
91
97
|
'',
|
|
92
98
|
];
|
|
@@ -96,17 +102,17 @@ export function formatTripDetails(trip) {
|
|
|
96
102
|
const tl = leg;
|
|
97
103
|
const line = tl.service.publishedLineName || 'Train';
|
|
98
104
|
const operator = tl.service.operatorName || '';
|
|
99
|
-
const boardPlatform = tl.board.platform ? ` |
|
|
100
|
-
const alightPlatform = tl.alight.platform ? ` |
|
|
105
|
+
const boardPlatform = tl.board.platform ? ` | ${tr.platform} ${tl.board.platform}` : '';
|
|
106
|
+
const alightPlatform = tl.alight.platform ? ` | ${tr.platform} ${tl.alight.platform}` : '';
|
|
101
107
|
lines.push(`### Leg ${i + 1}: ${line} ${operator}`.trim());
|
|
102
|
-
lines.push(`- **${formatTime(tl.board.departureTime)}** ${tl.board.stopPlace.name}${boardPlatform}`);
|
|
108
|
+
lines.push(`- **${formatTime(tl.board.departureTime, lang)}** ${tl.board.stopPlace.name}${boardPlatform}`);
|
|
103
109
|
if (tl.intermediateStops?.length) {
|
|
104
110
|
for (const stop of tl.intermediateStops) {
|
|
105
|
-
const time = stop.arrivalTime ? formatTime(stop.arrivalTime) : '';
|
|
111
|
+
const time = stop.arrivalTime ? formatTime(stop.arrivalTime, lang) : '';
|
|
106
112
|
lines.push(` - ${time} ${stop.stopPlace.name}`);
|
|
107
113
|
}
|
|
108
114
|
}
|
|
109
|
-
lines.push(`- **${formatTime(tl.alight.arrivalTime)}** ${tl.alight.stopPlace.name}${alightPlatform}`);
|
|
115
|
+
lines.push(`- **${formatTime(tl.alight.arrivalTime, lang)}** ${tl.alight.stopPlace.name}${alightPlatform}`);
|
|
110
116
|
if (tl.occupancy) {
|
|
111
117
|
const occ = [];
|
|
112
118
|
if (tl.occupancy.firstClass)
|
|
@@ -116,23 +122,24 @@ export function formatTripDetails(trip) {
|
|
|
116
122
|
if (occ.length)
|
|
117
123
|
lines.push(` Occupancy: ${occ.join(', ')}`);
|
|
118
124
|
}
|
|
119
|
-
lines.push(`
|
|
125
|
+
lines.push(` ${tr.dur}: ${parseDuration(tl.duration)}`);
|
|
120
126
|
}
|
|
121
127
|
else if (leg.type === 'transfer') {
|
|
122
|
-
const
|
|
123
|
-
lines.push(`###
|
|
128
|
+
const tfer = leg;
|
|
129
|
+
lines.push(`### ${tr.transfer}: Walk ${parseDuration(tfer.duration)}`);
|
|
124
130
|
}
|
|
125
131
|
lines.push('');
|
|
126
132
|
}
|
|
127
133
|
lines.push(`*Use \`get_prices\` with trip ID \`${trip.id}\` to see ticket prices.*`);
|
|
128
134
|
return lines.join('\n');
|
|
129
135
|
}
|
|
130
|
-
export function formatPrices(results) {
|
|
136
|
+
export function formatPrices(results, lang = 'en') {
|
|
131
137
|
if (results.length === 0) {
|
|
132
138
|
return 'No price information available.';
|
|
133
139
|
}
|
|
134
|
-
const
|
|
135
|
-
lines
|
|
140
|
+
const tr = t(lang);
|
|
141
|
+
const lines = [`**${tr.prices}**`, ''];
|
|
142
|
+
lines.push(`| Trip ID | 2nd Class | 1st Class |`);
|
|
136
143
|
lines.push('|---------|-----------|-----------|');
|
|
137
144
|
for (const r of results) {
|
|
138
145
|
const second = r.prices.find(p => p.class === '2');
|
|
@@ -147,28 +154,28 @@ export function formatPrices(results) {
|
|
|
147
154
|
}
|
|
148
155
|
/**
|
|
149
156
|
* Build an SBB.ch deep link URL with connection pre-filled.
|
|
150
|
-
*
|
|
151
|
-
* On mobile with SBB app installed, opens directly in the app (user already logged in).
|
|
157
|
+
* SBB.ch URLs support de/fr/it/en; other languages fall back to `en`.
|
|
152
158
|
*/
|
|
153
159
|
export function buildSbbDeepLink(params) {
|
|
154
|
-
const { fromName, fromId, toName, toId, date, time
|
|
155
|
-
|
|
160
|
+
const { fromName, fromId, toName, toId, date, time } = params;
|
|
161
|
+
const linkLang = params.lang ? toSbbLinkLang(params.lang) : 'en';
|
|
156
162
|
const stops = JSON.stringify([
|
|
157
163
|
{ value: fromId, type: 'ID', label: fromName },
|
|
158
164
|
{ value: toId, type: 'ID', label: toName },
|
|
159
165
|
]);
|
|
160
|
-
const url = new URL(`https://www.sbb.ch/${
|
|
166
|
+
const url = new URL(`https://www.sbb.ch/${linkLang}`);
|
|
161
167
|
url.searchParams.set('stops', stops);
|
|
162
168
|
url.searchParams.set('date', `"${date}"`);
|
|
163
169
|
url.searchParams.set('time', `"${time}"`);
|
|
164
170
|
url.searchParams.set('moment', '"DEPARTURE"');
|
|
165
|
-
url.searchParams.set('selected_trip', '0');
|
|
171
|
+
url.searchParams.set('selected_trip', '0');
|
|
166
172
|
return url.toString();
|
|
167
173
|
}
|
|
168
|
-
export function formatTicketLink(tripId, deepLink, sbbLink) {
|
|
174
|
+
export function formatTicketLink(tripId, deepLink, sbbLink, lang = 'en') {
|
|
175
|
+
const tr = t(lang);
|
|
169
176
|
const links = [];
|
|
170
177
|
if (sbbLink) {
|
|
171
|
-
links.push(`[
|
|
178
|
+
links.push(`[${tr.buyTicket}](${sbbLink})`);
|
|
172
179
|
}
|
|
173
180
|
if (deepLink && deepLink !== sbbLink) {
|
|
174
181
|
links.push(`[Buy via affiliate](${deepLink})`);
|
|
@@ -177,13 +184,27 @@ export function formatTicketLink(tripId, deepLink, sbbLink) {
|
|
|
177
184
|
return `No ticket link available for trip \`${tripId}\`. The trip may have expired or is not bookable online.`;
|
|
178
185
|
}
|
|
179
186
|
return [
|
|
180
|
-
|
|
187
|
+
`**${tr.buyTicket}**`,
|
|
181
188
|
'',
|
|
182
189
|
`Trip: \`${tripId}\``,
|
|
183
190
|
'',
|
|
184
191
|
...links,
|
|
185
192
|
'',
|
|
186
|
-
|
|
193
|
+
`*${tr.opensInApp}*`,
|
|
187
194
|
].join('\n');
|
|
188
195
|
}
|
|
196
|
+
/** Append destination weather to formatted connections */
|
|
197
|
+
export async function appendWeatherToConnections(formatted, destinationLat, destinationLon, date, destinationName) {
|
|
198
|
+
// Weather stays English for now — swiss-weather-mcp getWeatherSummary() doesn't accept a language yet.
|
|
199
|
+
// TODO(v0.5.0): thread lang through once swiss-weather-mcp exposes it.
|
|
200
|
+
try {
|
|
201
|
+
const summary = await getWeatherSummary(destinationLat, destinationLon, date);
|
|
202
|
+
if (!summary)
|
|
203
|
+
return formatted;
|
|
204
|
+
return formatted + `\n\n**${destinationName} weather:** ${summary}`;
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return formatted;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
189
210
|
//# sourceMappingURL=formatters.js.map
|
package/dist/formatters.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"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"}
|
package/dist/i18n.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language helpers for sbb-mcp.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the shared `sbb-i18n` primitives and adds MCP-specific helpers:
|
|
5
|
+
*
|
|
6
|
+
* - `toLocale(lang)` — maps our 9 language codes to BCP-47 locale tags for
|
|
7
|
+
* `Intl.DateTimeFormat`. Swiss languages get `-CH` (so e.g. dates render as
|
|
8
|
+
* DD.MM.YYYY for de-CH, not DD/MM/YYYY); non-Swiss use their primary region.
|
|
9
|
+
* - `SBB_LINK_LANGS` — languages SBB.ch actually supports in URL paths. The
|
|
10
|
+
* rest fall back to English for deep links.
|
|
11
|
+
*/
|
|
12
|
+
import type { Lang } from 'sbb-i18n';
|
|
13
|
+
export type { Lang, Translations } from 'sbb-i18n';
|
|
14
|
+
export { resolveLang, t, SUPPORTED_LANGS, isLang } from 'sbb-i18n';
|
|
15
|
+
/** BCP-47 locale tag for `Intl.DateTimeFormat`. Swiss languages use -CH variants. */
|
|
16
|
+
export declare function toLocale(lang: Lang): string;
|
|
17
|
+
/**
|
|
18
|
+
* Languages SBB.ch supports in its public URLs (/de, /fr, /it, /en).
|
|
19
|
+
* Other input languages fall back to English when building deep links.
|
|
20
|
+
*/
|
|
21
|
+
export declare const SBB_LINK_LANGS: readonly Lang[];
|
|
22
|
+
export declare function toSbbLinkLang(lang: Lang): 'de' | 'fr' | 'it' | 'en';
|
package/dist/i18n.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Language helpers for sbb-mcp.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the shared `sbb-i18n` primitives and adds MCP-specific helpers:
|
|
5
|
+
*
|
|
6
|
+
* - `toLocale(lang)` — maps our 9 language codes to BCP-47 locale tags for
|
|
7
|
+
* `Intl.DateTimeFormat`. Swiss languages get `-CH` (so e.g. dates render as
|
|
8
|
+
* DD.MM.YYYY for de-CH, not DD/MM/YYYY); non-Swiss use their primary region.
|
|
9
|
+
* - `SBB_LINK_LANGS` — languages SBB.ch actually supports in URL paths. The
|
|
10
|
+
* rest fall back to English for deep links.
|
|
11
|
+
*/
|
|
12
|
+
export { resolveLang, t, SUPPORTED_LANGS, isLang } from 'sbb-i18n';
|
|
13
|
+
const LOCALE_MAP = {
|
|
14
|
+
de: 'de-CH',
|
|
15
|
+
fr: 'fr-CH',
|
|
16
|
+
it: 'it-CH',
|
|
17
|
+
en: 'en-CH',
|
|
18
|
+
es: 'es-ES',
|
|
19
|
+
pt: 'pt-PT',
|
|
20
|
+
ru: 'ru-RU',
|
|
21
|
+
ar: 'ar',
|
|
22
|
+
zh: 'zh-CN',
|
|
23
|
+
};
|
|
24
|
+
/** BCP-47 locale tag for `Intl.DateTimeFormat`. Swiss languages use -CH variants. */
|
|
25
|
+
export function toLocale(lang) {
|
|
26
|
+
return LOCALE_MAP[lang];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Languages SBB.ch supports in its public URLs (/de, /fr, /it, /en).
|
|
30
|
+
* Other input languages fall back to English when building deep links.
|
|
31
|
+
*/
|
|
32
|
+
export const SBB_LINK_LANGS = ['de', 'fr', 'it', 'en'];
|
|
33
|
+
export function toSbbLinkLang(lang) {
|
|
34
|
+
return SBB_LINK_LANGS.includes(lang) ? lang : 'en';
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=i18n.js.map
|
package/dist/i18n.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAElE,MAAM,UAAU,GAAyB;IACvC,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,OAAO;CACZ,CAAA;AAED,qFAAqF;AACrF,MAAM,UAAU,QAAQ,CAAC,IAAU;IACjC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAoB,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAA;AAEhF,MAAM,UAAU,aAAa,CAAC,IAAU;IACtC,OAAQ,cAAoC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAkC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1G,CAAC"}
|
package/dist/profile.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import type { Lang } from './i18n.js';
|
|
1
2
|
export type UserProfile = {
|
|
2
3
|
first_name?: string;
|
|
3
4
|
last_name?: string;
|
|
4
5
|
date_of_birth?: string;
|
|
5
6
|
reduction_card?: 'HALF_FARE' | 'GA' | 'NONE';
|
|
6
7
|
reduction_card_valid_until?: string;
|
|
8
|
+
language?: Lang;
|
|
7
9
|
created_at?: string;
|
|
8
10
|
updated_at?: string;
|
|
9
11
|
};
|
|
@@ -11,4 +13,4 @@ export declare function getProfilePath(): string;
|
|
|
11
13
|
export declare function loadProfile(): UserProfile | null;
|
|
12
14
|
export declare function saveProfile(profile: UserProfile): void;
|
|
13
15
|
export declare function isReductionCardExpired(profile: UserProfile): boolean;
|
|
14
|
-
export declare function formatProfileSummary(profile: UserProfile): string;
|
|
16
|
+
export declare function formatProfileSummary(profile: UserProfile, lang?: Lang): string;
|
package/dist/profile.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { homedir } from 'os';
|
|
4
|
+
import { toLocale, t } from './i18n.js';
|
|
4
5
|
const PROFILE_DIR = join(homedir(), '.sbb-mcp');
|
|
5
6
|
const PROFILE_PATH = join(PROFILE_DIR, 'profile.json');
|
|
6
|
-
// No longer using time-based expiry — we store the actual validity date
|
|
7
7
|
export function getProfilePath() {
|
|
8
8
|
return PROFILE_PATH;
|
|
9
9
|
}
|
|
@@ -37,7 +37,9 @@ export function isReductionCardExpired(profile) {
|
|
|
37
37
|
const validUntil = new Date(profile.reduction_card_valid_until).getTime();
|
|
38
38
|
return Date.now() > validUntil;
|
|
39
39
|
}
|
|
40
|
-
export function formatProfileSummary(profile) {
|
|
40
|
+
export function formatProfileSummary(profile, lang = 'en') {
|
|
41
|
+
const tr = t(lang);
|
|
42
|
+
const locale = toLocale(lang);
|
|
41
43
|
const lines = ['**Your Travel Profile**', ''];
|
|
42
44
|
if (profile.first_name || profile.last_name) {
|
|
43
45
|
lines.push(`Name: ${[profile.first_name, profile.last_name].filter(Boolean).join(' ')}`);
|
|
@@ -60,9 +62,14 @@ export function formatProfileSummary(profile) {
|
|
|
60
62
|
else {
|
|
61
63
|
lines.push('Reduction card: None');
|
|
62
64
|
}
|
|
65
|
+
if (profile.language) {
|
|
66
|
+
lines.push(`Language: ${profile.language}`);
|
|
67
|
+
}
|
|
63
68
|
if (profile.updated_at) {
|
|
64
|
-
lines.push(`Last updated: ${new Date(profile.updated_at).toLocaleDateString(
|
|
69
|
+
lines.push(`Last updated: ${new Date(profile.updated_at).toLocaleDateString(locale)}`);
|
|
65
70
|
}
|
|
71
|
+
// Suppress unused-var warning for tr until we translate the labels above
|
|
72
|
+
void tr;
|
|
66
73
|
lines.push('');
|
|
67
74
|
lines.push(`*Profile stored at \`${PROFILE_PATH}\`. Edit or delete anytime.*`);
|
|
68
75
|
return lines.join('\n');
|
package/dist/profile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
|
package/dist/tools.js
CHANGED
|
@@ -1,13 +1,24 @@
|
|
|
1
1
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { isSmapiConfigured, searchPlaces, searchTrips, getTrip, paginateTrips, getTripPrices, getTripOffers, mockSearchPlaces, mockSearchTrips, mockGetTripPrices, } from './transport/index.js';
|
|
4
|
-
import { formatStations, formatConnections, formatTripDetails, formatPrices, formatTicketLink, buildSbbDeepLink, } from './formatters.js';
|
|
4
|
+
import { formatStations, formatConnections, formatTripDetails, formatPrices, formatTicketLink, buildSbbDeepLink, appendWeatherToConnections, } from './formatters.js';
|
|
5
5
|
import { cacheGet, cacheSet, TTL } from './cache.js';
|
|
6
6
|
import { SmapiError } from './transport/smapi-client.js';
|
|
7
7
|
import { loadProfile, saveProfile, formatProfileSummary, isReductionCardExpired } from './profile.js';
|
|
8
8
|
import { isSwissTripConfigured, fetchProfile as fetchCloudProfile, fetchTravelers, toSmapiTraveler, formatTravelersList, formatCloudProfile, } from './swisstrip.js';
|
|
9
|
+
import { resolveLang } from './i18n.js';
|
|
9
10
|
const useMock = !isSmapiConfigured();
|
|
10
11
|
const useCloud = isSwissTripConfigured();
|
|
12
|
+
const LANG_ENUM = z.enum(['de', 'fr', 'it', 'en', 'es', 'pt', 'ru', 'ar', 'zh']);
|
|
13
|
+
const LANG_DESC = "Output language (de/fr/it/en/es/pt/ru/ar/zh). Defaults to the user's saved profile language or English.";
|
|
14
|
+
/** Pick the effective language: tool arg > saved profile > English. */
|
|
15
|
+
function effectiveLang(arg, profile) {
|
|
16
|
+
if (arg)
|
|
17
|
+
return resolveLang(arg);
|
|
18
|
+
if (profile?.language)
|
|
19
|
+
return resolveLang(profile.language);
|
|
20
|
+
return 'en';
|
|
21
|
+
}
|
|
11
22
|
/** Match SwissTrip travelers by first name (case-insensitive, fuzzy) */
|
|
12
23
|
function matchTravelersByName(all, names) {
|
|
13
24
|
const matched = [];
|
|
@@ -35,7 +46,7 @@ function errorResult(err) {
|
|
|
35
46
|
export function createSbbMcpServer() {
|
|
36
47
|
const server = new McpServer({
|
|
37
48
|
name: 'sbb-mcp',
|
|
38
|
-
version: '0.
|
|
49
|
+
version: '0.4.0',
|
|
39
50
|
description: 'Swiss Federal Railways (SBB/CFF/FFS) — real-time train schedules, prices, and ticket purchase links for Switzerland',
|
|
40
51
|
});
|
|
41
52
|
// ─── Prompts ───────────────────────────────────────────────────────────
|
|
@@ -103,7 +114,8 @@ export function createSbbMcpServer() {
|
|
|
103
114
|
date_of_birth: z.string().optional().describe('Date of birth YYYY-MM-DD (for age-based pricing)'),
|
|
104
115
|
reduction_card: z.enum(['HALF_FARE', 'GA', 'NONE']).optional().describe('Swiss reduction card: HALF_FARE (Halbtax), GA (General Abonnement), or NONE'),
|
|
105
116
|
reduction_card_valid_until: z.string().optional().describe('Reduction card expiry date YYYY-MM-DD (ask the user when their Halbtax/GA expires)'),
|
|
106
|
-
|
|
117
|
+
language: LANG_ENUM.optional().describe('Preferred output language — saved as the default for all future tool calls. ' + LANG_DESC),
|
|
118
|
+
}, { title: 'Save Travel Profile', readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async ({ first_name, last_name, date_of_birth, reduction_card, reduction_card_valid_until, language }) => {
|
|
107
119
|
try {
|
|
108
120
|
const updates = {};
|
|
109
121
|
if (first_name)
|
|
@@ -116,16 +128,21 @@ export function createSbbMcpServer() {
|
|
|
116
128
|
updates.reduction_card = reduction_card;
|
|
117
129
|
if (reduction_card_valid_until)
|
|
118
130
|
updates.reduction_card_valid_until = reduction_card_valid_until;
|
|
131
|
+
if (language)
|
|
132
|
+
updates.language = language;
|
|
119
133
|
saveProfile(updates);
|
|
120
134
|
const profile = loadProfile();
|
|
121
|
-
|
|
135
|
+
const lang = effectiveLang(language, profile);
|
|
136
|
+
return { content: [{ type: 'text', text: formatProfileSummary(profile, lang) }] };
|
|
122
137
|
}
|
|
123
138
|
catch (err) {
|
|
124
139
|
return errorResult(err);
|
|
125
140
|
}
|
|
126
141
|
});
|
|
127
142
|
// ─── Tool: get_profile ───────────────────────────────────────────────
|
|
128
|
-
server.tool('get_profile', 'Read the user\'s saved travel profile. Check this before showing prices to use correct reduction card. If no profile exists, ask the user for their details.', {
|
|
143
|
+
server.tool('get_profile', 'Read the user\'s saved travel profile. Check this before showing prices to use correct reduction card. If no profile exists, ask the user for their details.', {
|
|
144
|
+
language: LANG_ENUM.optional().describe(LANG_DESC),
|
|
145
|
+
}, { title: 'Get Travel Profile', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async ({ language }) => {
|
|
129
146
|
// Cloud profile takes precedence
|
|
130
147
|
if (useCloud) {
|
|
131
148
|
try {
|
|
@@ -140,7 +157,8 @@ export function createSbbMcpServer() {
|
|
|
140
157
|
if (!profile) {
|
|
141
158
|
return { content: [{ type: 'text', text: 'No travel profile saved. Ask the user: "Do you have a Halbtax or GA travelcard?" Then use save_profile to store their details for next time.' }] };
|
|
142
159
|
}
|
|
143
|
-
|
|
160
|
+
const lang = effectiveLang(language, profile);
|
|
161
|
+
return { content: [{ type: 'text', text: formatProfileSummary(profile, lang) }] };
|
|
144
162
|
});
|
|
145
163
|
// ─── Tool: list_travelers (SwissTrip cloud only) ─────────────────────
|
|
146
164
|
server.tool('list_travelers', 'List all travelers in the user\'s SwissTrip account (self, partner, kids). Each traveler has their own reduction card. Use their names with get_prices for family trip pricing. Requires SWISSTRIP_TOKEN.', {}, { title: 'List Travelers', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async () => {
|
|
@@ -165,16 +183,18 @@ export function createSbbMcpServer() {
|
|
|
165
183
|
server.tool('search_stations', 'Search for Swiss train stations, addresses, or points of interest by name. Returns station IDs needed for other tools.', {
|
|
166
184
|
query: z.string().describe('Station name to search for (e.g. "Zurich", "Bern", "Interlaken")'),
|
|
167
185
|
limit: z.number().min(1).max(20).default(10).describe('Maximum number of results'),
|
|
168
|
-
|
|
186
|
+
language: LANG_ENUM.optional().describe(LANG_DESC),
|
|
187
|
+
}, { title: 'Search Stations', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async ({ query, limit, language }) => {
|
|
169
188
|
try {
|
|
170
|
-
const
|
|
189
|
+
const lang = effectiveLang(language, loadProfile());
|
|
190
|
+
const cacheKey = `stations:${query.toLowerCase()}:${limit}:${lang}`;
|
|
171
191
|
const cached = cacheGet(cacheKey);
|
|
172
192
|
if (cached)
|
|
173
193
|
return { content: [{ type: 'text', text: cached }] };
|
|
174
194
|
const stations = useMock
|
|
175
195
|
? await mockSearchPlaces({ name: query })
|
|
176
|
-
: await searchPlaces({ name: query, type: 'STOP', numberOfResults: limit });
|
|
177
|
-
const text = formatStations(stations);
|
|
196
|
+
: await searchPlaces({ name: query, type: 'STOP', numberOfResults: limit, lang });
|
|
197
|
+
const text = formatStations(stations, lang);
|
|
178
198
|
cacheSet(cacheKey, text, TTL.STATIONS);
|
|
179
199
|
return { content: [{ type: 'text', text }] };
|
|
180
200
|
}
|
|
@@ -189,14 +209,16 @@ export function createSbbMcpServer() {
|
|
|
189
209
|
date: z.string().optional().describe('Travel date in YYYY-MM-DD format (default: today)'),
|
|
190
210
|
time: z.string().optional().describe('Departure time in HH:MM format (default: now)'),
|
|
191
211
|
arrival_time: z.boolean().optional().describe('If true, the time parameter is treated as desired arrival time'),
|
|
192
|
-
|
|
212
|
+
language: LANG_ENUM.optional().describe(LANG_DESC),
|
|
213
|
+
}, { title: 'Search Connections', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async ({ from, to, date, time, arrival_time, language }) => {
|
|
193
214
|
try {
|
|
215
|
+
const lang = effectiveLang(language, loadProfile());
|
|
194
216
|
let fromId = from;
|
|
195
217
|
let toId = to;
|
|
196
218
|
if (!/^\d{5,8}$/.test(from)) {
|
|
197
219
|
const stations = useMock
|
|
198
220
|
? await mockSearchPlaces({ name: from })
|
|
199
|
-
: await searchPlaces({ name: from, type: 'STOP', numberOfResults: 1 });
|
|
221
|
+
: await searchPlaces({ name: from, type: 'STOP', numberOfResults: 1, lang });
|
|
200
222
|
if (stations.length === 0) {
|
|
201
223
|
return { content: [{ type: 'text', text: `No station found matching "${from}". Try a different name.` }] };
|
|
202
224
|
}
|
|
@@ -205,7 +227,7 @@ export function createSbbMcpServer() {
|
|
|
205
227
|
if (!/^\d{5,8}$/.test(to)) {
|
|
206
228
|
const stations = useMock
|
|
207
229
|
? await mockSearchPlaces({ name: to })
|
|
208
|
-
: await searchPlaces({ name: to, type: 'STOP', numberOfResults: 1 });
|
|
230
|
+
: await searchPlaces({ name: to, type: 'STOP', numberOfResults: 1, lang });
|
|
209
231
|
if (stations.length === 0) {
|
|
210
232
|
return { content: [{ type: 'text', text: `No station found matching "${to}". Try a different name.` }] };
|
|
211
233
|
}
|
|
@@ -231,7 +253,7 @@ export function createSbbMcpServer() {
|
|
|
231
253
|
departureTime = dt;
|
|
232
254
|
}
|
|
233
255
|
}
|
|
234
|
-
const cacheKey = `connections:${fromId}:${toId}:${departureTime || ''}:${arrivalTime || ''}`;
|
|
256
|
+
const cacheKey = `connections:${fromId}:${toId}:${departureTime || ''}:${arrivalTime || ''}:${lang}`;
|
|
235
257
|
const cached = cacheGet(cacheKey);
|
|
236
258
|
if (cached)
|
|
237
259
|
return { content: [{ type: 'text', text: cached }] };
|
|
@@ -242,8 +264,17 @@ export function createSbbMcpServer() {
|
|
|
242
264
|
destination: toId,
|
|
243
265
|
...(departureTime && { departureTime }),
|
|
244
266
|
...(arrivalTime && { arrivalTime }),
|
|
267
|
+
lang,
|
|
245
268
|
});
|
|
246
|
-
|
|
269
|
+
let text = formatConnections(collection, lang);
|
|
270
|
+
// Append destination weather if coordinates available
|
|
271
|
+
if (collection.trips.length > 0) {
|
|
272
|
+
const dest = collection.trips[0].destination;
|
|
273
|
+
if (dest.geoPosition) {
|
|
274
|
+
const travelDate = date || new Date().toISOString().split('T')[0];
|
|
275
|
+
text = await appendWeatherToConnections(text, dest.geoPosition.latitude, dest.geoPosition.longitude, travelDate, dest.name || to);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
247
278
|
cacheSet(cacheKey, text, TTL.CONNECTIONS);
|
|
248
279
|
return { content: [{ type: 'text', text }] };
|
|
249
280
|
}
|
|
@@ -254,17 +285,19 @@ export function createSbbMcpServer() {
|
|
|
254
285
|
// ─── Tool 3: get_trip_details ─────────────────────────────────────────
|
|
255
286
|
server.tool('get_trip_details', 'Get detailed information about a specific train connection including all intermediate stops, platforms, and occupancy. Use a trip ID from search_connections results.', {
|
|
256
287
|
trip_id: z.string().describe('Trip ID from search_connections results'),
|
|
257
|
-
|
|
288
|
+
language: LANG_ENUM.optional().describe(LANG_DESC),
|
|
289
|
+
}, { title: 'Get Trip Details', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async ({ trip_id, language }) => {
|
|
258
290
|
try {
|
|
291
|
+
const lang = effectiveLang(language, loadProfile());
|
|
259
292
|
if (useMock) {
|
|
260
293
|
return { content: [{ type: 'text', text: 'Detailed trip information is available with live API access. In mock mode, use search_connections to see trip summaries.' }] };
|
|
261
294
|
}
|
|
262
|
-
const cacheKey = `trip:${trip_id}`;
|
|
295
|
+
const cacheKey = `trip:${trip_id}:${lang}`;
|
|
263
296
|
const cached = cacheGet(cacheKey);
|
|
264
297
|
if (cached)
|
|
265
298
|
return { content: [{ type: 'text', text: cached }] };
|
|
266
|
-
const trip = await getTrip(trip_id, 'REAL_BOARDING_ALIGHTING');
|
|
267
|
-
const text = formatTripDetails(trip);
|
|
299
|
+
const trip = await getTrip(trip_id, 'REAL_BOARDING_ALIGHTING', lang);
|
|
300
|
+
const text = formatTripDetails(trip, lang);
|
|
268
301
|
cacheSet(cacheKey, text, TTL.TRIP_DETAILS);
|
|
269
302
|
return { content: [{ type: 'text', text }] };
|
|
270
303
|
}
|
|
@@ -276,16 +309,18 @@ export function createSbbMcpServer() {
|
|
|
276
309
|
server.tool('get_more_connections', 'Load earlier or later train connections for a previous search. Use the collection ID from search_connections results.', {
|
|
277
310
|
collection_id: z.string().describe('Collection ID from search_connections results'),
|
|
278
311
|
direction: z.enum(['next', 'previous']).describe('"next" for later trains, "previous" for earlier trains'),
|
|
279
|
-
|
|
312
|
+
language: LANG_ENUM.optional().describe(LANG_DESC),
|
|
313
|
+
}, { title: 'Get More Connections', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async ({ collection_id, direction, language }) => {
|
|
280
314
|
try {
|
|
315
|
+
const lang = effectiveLang(language, loadProfile());
|
|
281
316
|
if (useMock) {
|
|
282
317
|
const offset = direction === 'next' ? 3 * 60 * 60 * 1000 : -3 * 60 * 60 * 1000;
|
|
283
318
|
const baseTime = new Date(Date.now() + offset).toISOString();
|
|
284
319
|
const collection = await mockSearchTrips({ origin: '8503000', destination: '8507000', departureTime: baseTime });
|
|
285
|
-
return { content: [{ type: 'text', text: formatConnections(collection) }] };
|
|
320
|
+
return { content: [{ type: 'text', text: formatConnections(collection, lang) }] };
|
|
286
321
|
}
|
|
287
|
-
const collection = await paginateTrips(collection_id, direction);
|
|
288
|
-
return { content: [{ type: 'text', text: formatConnections(collection) }] };
|
|
322
|
+
const collection = await paginateTrips(collection_id, direction, lang);
|
|
323
|
+
return { content: [{ type: 'text', text: formatConnections(collection, lang) }] };
|
|
289
324
|
}
|
|
290
325
|
catch (err) {
|
|
291
326
|
return errorResult(err);
|
|
@@ -297,8 +332,10 @@ export function createSbbMcpServer() {
|
|
|
297
332
|
traveler_type: z.enum(['ADULT', 'CHILD']).default('ADULT').describe('Traveler type (used when no traveler_names given)'),
|
|
298
333
|
reduction_card: z.enum(['HALF_FARE', 'GA', 'NONE']).default('HALF_FARE').describe('Swiss reduction card (used when no traveler_names given)'),
|
|
299
334
|
traveler_names: z.array(z.string()).optional().describe('Names of SwissTrip travelers to price for (e.g. ["Fabian", "Anna"]). Requires SWISSTRIP_TOKEN. Each traveler\'s reduction card is applied automatically.'),
|
|
300
|
-
|
|
335
|
+
language: LANG_ENUM.optional().describe(LANG_DESC),
|
|
336
|
+
}, { title: 'Get Prices', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async ({ trip_ids, traveler_type, reduction_card, traveler_names, language }) => {
|
|
301
337
|
try {
|
|
338
|
+
const lang = effectiveLang(language, loadProfile());
|
|
302
339
|
// Build travelers list — cloud multi-traveler or single manual
|
|
303
340
|
let travelers;
|
|
304
341
|
let cacheKey;
|
|
@@ -310,23 +347,23 @@ export function createSbbMcpServer() {
|
|
|
310
347
|
return { content: [{ type: 'text', text: `No matching travelers found. Available: ${allTravelers.map(t => t.first_name).filter(Boolean).join(', ')}. Use list_travelers to see all.` }] };
|
|
311
348
|
}
|
|
312
349
|
travelers = matched.map((t, i) => toSmapiTraveler(t, i));
|
|
313
|
-
cacheKey = `prices:${trip_ids.join(',')}:cloud:${matched.map(t => t.id).join(',')}`;
|
|
350
|
+
cacheKey = `prices:${trip_ids.join(',')}:cloud:${matched.map(t => t.id).join(',')}:${lang}`;
|
|
314
351
|
}
|
|
315
352
|
else {
|
|
316
353
|
travelers = [{ id: 'traveler-1', type: traveler_type, reductionCard: reduction_card }];
|
|
317
|
-
cacheKey = `prices:${trip_ids.join(',')}:${traveler_type}:${reduction_card}`;
|
|
354
|
+
cacheKey = `prices:${trip_ids.join(',')}:${traveler_type}:${reduction_card}:${lang}`;
|
|
318
355
|
}
|
|
319
356
|
const cached = cacheGet(cacheKey);
|
|
320
357
|
if (cached)
|
|
321
358
|
return { content: [{ type: 'text', text: cached }] };
|
|
322
359
|
if (useMock) {
|
|
323
360
|
const prices = await mockGetTripPrices(trip_ids);
|
|
324
|
-
const text = formatPrices(prices);
|
|
361
|
+
const text = formatPrices(prices, lang);
|
|
325
362
|
cacheSet(cacheKey, text, TTL.PRICES);
|
|
326
363
|
return { content: [{ type: 'text', text }] };
|
|
327
364
|
}
|
|
328
|
-
const prices = await getTripPrices(trip_ids, travelers);
|
|
329
|
-
const text = formatPrices(prices);
|
|
365
|
+
const prices = await getTripPrices(trip_ids, travelers, lang);
|
|
366
|
+
const text = formatPrices(prices, lang);
|
|
330
367
|
cacheSet(cacheKey, text, TTL.PRICES);
|
|
331
368
|
return { content: [{ type: 'text', text }] };
|
|
332
369
|
}
|
|
@@ -346,8 +383,10 @@ export function createSbbMcpServer() {
|
|
|
346
383
|
traveler_type: z.enum(['ADULT', 'CHILD']).default('ADULT').describe('Traveler type (used when no traveler_names given)'),
|
|
347
384
|
reduction_card: z.enum(['HALF_FARE', 'GA', 'NONE']).default('HALF_FARE').describe('Swiss reduction card (used when no traveler_names given)'),
|
|
348
385
|
traveler_names: z.array(z.string()).optional().describe('SwissTrip traveler names for family tickets. Requires SWISSTRIP_TOKEN.'),
|
|
349
|
-
|
|
386
|
+
language: LANG_ENUM.optional().describe(LANG_DESC),
|
|
387
|
+
}, { title: 'Get Ticket Link', readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: true }, async ({ trip_id, from_name, from_id, to_name, to_id, date, time, traveler_type, reduction_card, traveler_names, language }) => {
|
|
350
388
|
try {
|
|
389
|
+
const lang = effectiveLang(language, loadProfile());
|
|
351
390
|
const sbbLink = buildSbbDeepLink({
|
|
352
391
|
fromName: from_name,
|
|
353
392
|
fromId: from_id,
|
|
@@ -355,6 +394,7 @@ export function createSbbMcpServer() {
|
|
|
355
394
|
toId: to_id,
|
|
356
395
|
date,
|
|
357
396
|
time,
|
|
397
|
+
lang,
|
|
358
398
|
});
|
|
359
399
|
// Build travelers — cloud multi-traveler or single manual
|
|
360
400
|
let travelers;
|
|
@@ -372,14 +412,14 @@ export function createSbbMcpServer() {
|
|
|
372
412
|
let affiliateLink;
|
|
373
413
|
if (!useMock) {
|
|
374
414
|
try {
|
|
375
|
-
const result = await getTripOffers(trip_id, travelers);
|
|
415
|
+
const result = await getTripOffers(trip_id, travelers, lang);
|
|
376
416
|
affiliateLink = result.affiliateDeepLink;
|
|
377
417
|
}
|
|
378
418
|
catch {
|
|
379
419
|
// Affiliate link is optional — SBB direct link always works
|
|
380
420
|
}
|
|
381
421
|
}
|
|
382
|
-
return { content: [{ type: 'text', text: formatTicketLink(trip_id, affiliateLink, sbbLink) }] };
|
|
422
|
+
return { content: [{ type: 'text', text: formatTicketLink(trip_id, affiliateLink, sbbLink, lang) }] };
|
|
383
423
|
}
|
|
384
424
|
catch (err) {
|
|
385
425
|
return errorResult(err);
|
package/dist/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,6 +46,7 @@ export async function smapiRequest(baseUrl, path, options = {}) {
|
|
|
46
46
|
Accept: 'application/json',
|
|
47
47
|
'Accept-Language': acceptLanguage,
|
|
48
48
|
'Cache-Control': 'no-cache',
|
|
49
|
+
'User-Agent': 'SwissTrip/1.0 (https://swisstrip.app)',
|
|
49
50
|
};
|
|
50
51
|
if (body) {
|
|
51
52
|
headers['Content-Type'] = 'application/json';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smapi-client.js","sourceRoot":"","sources":["../../src/transport/smapi-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAGhD,4BAA4B;AAC5B,MAAM,YAAY,GAAG;IACnB,GAAG,EAAE,2CAA2C;IAChD,IAAI,EAAE,uCAAuC;CACrC,CAAA;AAEV,MAAM,cAAc,GAAG;IACrB,GAAG,EAAE,4BAA4B;IACjC,IAAI,EAAE,wBAAwB;CACtB,CAAA;AAIV,SAAS,MAAM;IACb,OAAQ,OAAO,CAAC,GAAG,CAAC,SAAsB,IAAI,KAAK,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,cAAc,CAAC,MAAM,EAAE,CAAC,CAAA;AACjC,CAAC;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC5B,OAAO,CAAe;IACtB,MAAM,CAAQ;IAErB,YAAY,OAAe,EAAE,MAAc,EAAE,OAAsB;QACjE,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,YAAY,CAAA;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,yEAAyE;IACzE,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,OAAO,EAAE,eAAe,IAAI,EAAE,CAAA;IAC5C,CAAC;CACF;AASD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,IAAY,EACZ,UAA+B,EAAE;IAEjC,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,EAAE,GAAG,OAAO,CAAA;IAE/E,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAA;IACpC,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAA;IAEtD,MAAM,OAAO,GAA2B;QACtC,aAAa,EAAE,UAAU,KAAK,EAAE;QAChC,eAAe,EAAE,UAAU;QAC3B,mBAAmB,EAAE,cAAc,IAAI,MAAM,CAAC,UAAU,EAAE;QAC1D,MAAM,EAAE,kBAAkB;QAC1B,iBAAiB,EAAE,cAAc;QACjC,eAAe,EAAE,UAAU;
|
|
1
|
+
{"version":3,"file":"smapi-client.js","sourceRoot":"","sources":["../../src/transport/smapi-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
1
|
import type { SmapiPlace, SmapiTrip, SmapiTripsCollection, SmapiTripSearchParams, SmapiPlaceSearchParams } from './smapi-types.js';
|
|
2
|
+
import type { Lang } from '../i18n.js';
|
|
2
3
|
/**
|
|
3
4
|
* Search for stations, addresses, or points of interest by name.
|
|
4
5
|
*/
|
|
5
|
-
export declare function searchPlaces(params: SmapiPlaceSearchParams
|
|
6
|
+
export declare function searchPlaces(params: SmapiPlaceSearchParams & {
|
|
7
|
+
lang?: Lang;
|
|
8
|
+
}): Promise<SmapiPlace[]>;
|
|
6
9
|
/**
|
|
7
10
|
* Search for trip connections between two stations.
|
|
8
11
|
* Returns a collection with tripIds needed for pricing/booking.
|
|
9
12
|
*/
|
|
10
|
-
export declare function searchTrips(params: SmapiTripSearchParams
|
|
13
|
+
export declare function searchTrips(params: SmapiTripSearchParams & {
|
|
14
|
+
lang?: Lang;
|
|
15
|
+
}): Promise<SmapiTripsCollection>;
|
|
11
16
|
/**
|
|
12
17
|
* Retrieve a previously found trip by its ID.
|
|
13
18
|
*/
|
|
14
|
-
export declare function getTrip(tripId: string, stopBehavior?: 'ORIGIN_DESTINATION_ONLY' | 'REAL_BOARDING_ALIGHTING'): Promise<SmapiTrip>;
|
|
19
|
+
export declare function getTrip(tripId: string, stopBehavior?: 'ORIGIN_DESTINATION_ONLY' | 'REAL_BOARDING_ALIGHTING', lang?: Lang): Promise<SmapiTrip>;
|
|
15
20
|
/**
|
|
16
21
|
* Paginate through a trips collection (next/previous departures).
|
|
17
22
|
*/
|
|
18
|
-
export declare function paginateTrips(collectionId: string, direction: 'next' | 'previous'): Promise<SmapiTripsCollection>;
|
|
23
|
+
export declare function paginateTrips(collectionId: string, direction: 'next' | 'previous', lang?: Lang): Promise<SmapiTripsCollection>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { smapiRequest, getJourneyBaseUrl } from './smapi-client.js';
|
|
2
|
+
import { toLocale } from '../i18n.js';
|
|
2
3
|
/**
|
|
3
4
|
* Search for stations, addresses, or points of interest by name.
|
|
4
5
|
*/
|
|
@@ -10,7 +11,7 @@ export async function searchPlaces(params) {
|
|
|
10
11
|
numberOfResults: params.numberOfResults ?? 10,
|
|
11
12
|
},
|
|
12
13
|
};
|
|
13
|
-
const result = await smapiRequest(getJourneyBaseUrl(), '/v1/places', { method: 'POST', body });
|
|
14
|
+
const result = await smapiRequest(getJourneyBaseUrl(), '/v1/places', { method: 'POST', body, acceptLanguage: params.lang ? toLocale(params.lang) : undefined });
|
|
14
15
|
return result.places ?? [];
|
|
15
16
|
}
|
|
16
17
|
/**
|
|
@@ -62,20 +63,20 @@ export async function searchTrips(params) {
|
|
|
62
63
|
};
|
|
63
64
|
body.parameters = parameters;
|
|
64
65
|
}
|
|
65
|
-
return smapiRequest(getJourneyBaseUrl(), '/v1/trips-collection', { method: 'POST', body });
|
|
66
|
+
return smapiRequest(getJourneyBaseUrl(), '/v1/trips-collection', { method: 'POST', body, acceptLanguage: params.lang ? toLocale(params.lang) : undefined });
|
|
66
67
|
}
|
|
67
68
|
/**
|
|
68
69
|
* Retrieve a previously found trip by its ID.
|
|
69
70
|
*/
|
|
70
|
-
export async function getTrip(tripId, stopBehavior = 'ORIGIN_DESTINATION_ONLY') {
|
|
71
|
+
export async function getTrip(tripId, stopBehavior = 'ORIGIN_DESTINATION_ONLY', lang) {
|
|
71
72
|
const params = new URLSearchParams({ stopBehavior });
|
|
72
|
-
return smapiRequest(getJourneyBaseUrl(), `/v1/trips/${encodeURIComponent(tripId)}?${params}
|
|
73
|
+
return smapiRequest(getJourneyBaseUrl(), `/v1/trips/${encodeURIComponent(tripId)}?${params}`, { acceptLanguage: lang ? toLocale(lang) : undefined });
|
|
73
74
|
}
|
|
74
75
|
/**
|
|
75
76
|
* Paginate through a trips collection (next/previous departures).
|
|
76
77
|
*/
|
|
77
|
-
export async function paginateTrips(collectionId, direction) {
|
|
78
|
+
export async function paginateTrips(collectionId, direction, lang) {
|
|
78
79
|
const params = new URLSearchParams({ page: direction });
|
|
79
|
-
return smapiRequest(getJourneyBaseUrl(), `/v1/trips-collections/${encodeURIComponent(collectionId)}?${params}
|
|
80
|
+
return smapiRequest(getJourneyBaseUrl(), `/v1/trips-collections/${encodeURIComponent(collectionId)}?${params}`, { acceptLanguage: lang ? toLocale(lang) : undefined });
|
|
80
81
|
}
|
|
81
82
|
//# sourceMappingURL=smapi-journey.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smapi-journey.js","sourceRoot":"","sources":["../../src/transport/smapi-journey.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AASnE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,
|
|
1
|
+
{"version":3,"file":"smapi-journey.js","sourceRoot":"","sources":["../../src/transport/smapi-journey.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { SmapiPlace, SmapiTripsCollection, SmapiTripSearchParams, SmapiPlaceSearchParams, SmapiPriceResult, SmapiOfferResult, SmapiTraveler } from './smapi-types.js';
|
|
2
|
-
export declare function mockSearchPlaces(params: SmapiPlaceSearchParams
|
|
3
|
-
|
|
2
|
+
export declare function mockSearchPlaces(params: SmapiPlaceSearchParams & {
|
|
3
|
+
lang?: string;
|
|
4
|
+
}): Promise<SmapiPlace[]>;
|
|
5
|
+
export declare function mockSearchTrips(params: SmapiTripSearchParams & {
|
|
6
|
+
lang?: string;
|
|
7
|
+
}): Promise<SmapiTripsCollection>;
|
|
4
8
|
export declare function mockGetTripPrices(tripIds: string[]): Promise<SmapiPriceResult[]>;
|
|
5
9
|
export declare function mockGetTripOffers(tripId: string, _travelers: SmapiTraveler[]): Promise<SmapiOfferResult>;
|
|
@@ -115,10 +115,17 @@ function buildMockTripsCollection(params) {
|
|
|
115
115
|
})),
|
|
116
116
|
};
|
|
117
117
|
}
|
|
118
|
+
/** Normalize Swiss chars for fuzzy matching: ü→u, ö→o, ä→a, è→e, é→e */
|
|
119
|
+
function normalize(str) {
|
|
120
|
+
return str
|
|
121
|
+
.toLowerCase()
|
|
122
|
+
.normalize('NFD')
|
|
123
|
+
.replace(/[\u0300-\u036f]/g, '');
|
|
124
|
+
}
|
|
118
125
|
// ─── Mock API functions ─────────────────────────────────────────────────────
|
|
119
126
|
export async function mockSearchPlaces(params) {
|
|
120
|
-
const query = params.name
|
|
121
|
-
return Object.values(MOCK_STATIONS).filter((s) => s.name
|
|
127
|
+
const query = normalize(params.name);
|
|
128
|
+
return Object.values(MOCK_STATIONS).filter((s) => normalize(s.name).includes(query));
|
|
122
129
|
}
|
|
123
130
|
export async function mockSearchTrips(params) {
|
|
124
131
|
return buildMockTripsCollection(params);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smapi-mock.js","sourceRoot":"","sources":["../../src/transport/smapi-mock.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"smapi-mock.js","sourceRoot":"","sources":["../../src/transport/smapi-mock.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import type { SmapiPriceResult, SmapiOfferResult, SmapiTraveler } from './smapi-types.js';
|
|
2
|
+
import type { Lang } from '../i18n.js';
|
|
2
3
|
/**
|
|
3
4
|
* Get non-bookable price estimates for one or more trips.
|
|
4
5
|
* Default: adult traveler with Halbtax (Half-Fare card).
|
|
5
6
|
* These prices are for display only — they cannot be used for prebooking.
|
|
6
7
|
*/
|
|
7
|
-
export declare function getTripPrices(tripIds: string[], travelers?: SmapiTraveler[]): Promise<SmapiPriceResult[]>;
|
|
8
|
+
export declare function getTripPrices(tripIds: string[], travelers?: SmapiTraveler[], lang?: Lang): Promise<SmapiPriceResult[]>;
|
|
8
9
|
/**
|
|
9
10
|
* Get trip offers including affiliate deep links to SBB webshop.
|
|
10
11
|
* Call this when the user clicks "Buy on SBB" to get the specific purchase link.
|
|
11
12
|
* Note: This counts toward the look2book ratio — only call when user intends to buy.
|
|
12
13
|
*/
|
|
13
|
-
export declare function getTripOffers(tripId: string, travelers: SmapiTraveler[]): Promise<SmapiOfferResult>;
|
|
14
|
+
export declare function getTripOffers(tripId: string, travelers: SmapiTraveler[], lang?: Lang): Promise<SmapiOfferResult>;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { smapiRequest, getTicketingBaseUrl } from './smapi-client.js';
|
|
2
|
+
import { toLocale } from '../i18n.js';
|
|
2
3
|
/**
|
|
3
4
|
* Get non-bookable price estimates for one or more trips.
|
|
4
5
|
* Default: adult traveler with Halbtax (Half-Fare card).
|
|
5
6
|
* These prices are for display only — they cannot be used for prebooking.
|
|
6
7
|
*/
|
|
7
|
-
export async function getTripPrices(tripIds, travelers) {
|
|
8
|
+
export async function getTripPrices(tripIds, travelers, lang) {
|
|
8
9
|
// The prices endpoint accepts tripId as query parameter
|
|
9
10
|
// For multiple trips, we make parallel requests
|
|
10
11
|
const results = await Promise.all(tripIds.map(async (tripId) => {
|
|
@@ -17,6 +18,7 @@ export async function getTripPrices(tripIds, travelers) {
|
|
|
17
18
|
const data = await smapiRequest(getTicketingBaseUrl(), path, {
|
|
18
19
|
method: travelers?.length ? 'POST' : 'GET',
|
|
19
20
|
...(travelers?.length && { body: { travelers } }),
|
|
21
|
+
acceptLanguage: lang ? toLocale(lang) : undefined,
|
|
20
22
|
});
|
|
21
23
|
// Normalize response to SmapiPriceResult
|
|
22
24
|
const prices = data.prices ?? (data.price ? [{
|
|
@@ -46,7 +48,7 @@ export async function getTripPrices(tripIds, travelers) {
|
|
|
46
48
|
* Call this when the user clicks "Buy on SBB" to get the specific purchase link.
|
|
47
49
|
* Note: This counts toward the look2book ratio — only call when user intends to buy.
|
|
48
50
|
*/
|
|
49
|
-
export async function getTripOffers(tripId, travelers) {
|
|
51
|
+
export async function getTripOffers(tripId, travelers, lang) {
|
|
50
52
|
const body = {
|
|
51
53
|
tripId,
|
|
52
54
|
travelers: travelers.map((t) => ({
|
|
@@ -58,7 +60,7 @@ export async function getTripOffers(tripId, travelers) {
|
|
|
58
60
|
}),
|
|
59
61
|
})),
|
|
60
62
|
};
|
|
61
|
-
const data = await smapiRequest(getTicketingBaseUrl(), '/api/trip-offers', { method: 'POST', body });
|
|
63
|
+
const data = await smapiRequest(getTicketingBaseUrl(), '/api/trip-offers', { method: 'POST', body, acceptLanguage: lang ? toLocale(lang) : undefined });
|
|
62
64
|
// Extract affiliate deep link from response links
|
|
63
65
|
const links = (data.links ?? []);
|
|
64
66
|
const affiliateLink = links.find((l) => l.rel === 'online-offers')?.href;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smapi-prices.js","sourceRoot":"","sources":["../../src/transport/smapi-prices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAOrE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAiB,EACjB,SAA2B;
|
|
1
|
+
{"version":3,"file":"smapi-prices.js","sourceRoot":"","sources":["../../src/transport/smapi-prices.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sbb-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"mcpName": "io.github.Fabsbags/sbb-mcp",
|
|
5
5
|
"description": "MCP server for Swiss Federal Railways (SBB/CFF/FFS) — real-time train schedules, prices, and ticket purchase links for any AI assistant",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/index.js",
|
|
10
|
+
"./transport": "./dist/transport/index.js"
|
|
11
|
+
},
|
|
8
12
|
"bin": {
|
|
9
13
|
"sbb-mcp": "dist/index.js"
|
|
10
14
|
},
|
|
@@ -53,6 +57,8 @@
|
|
|
53
57
|
"dependencies": {
|
|
54
58
|
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
55
59
|
"express": "^5.1.0",
|
|
60
|
+
"sbb-i18n": "^0.1.0",
|
|
61
|
+
"swiss-weather-mcp": "^0.1.0",
|
|
56
62
|
"zod": "^3.24.4"
|
|
57
63
|
},
|
|
58
64
|
"devDependencies": {
|