sbb-mcp 0.4.3 → 0.5.1

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.
Files changed (83) hide show
  1. package/LICENSE +50 -57
  2. package/README.md +25 -214
  3. package/dist/index.js +47 -19
  4. package/package.json +10 -33
  5. package/dist/auth.d.ts +0 -2
  6. package/dist/auth.js +0 -44
  7. package/dist/auth.js.map +0 -1
  8. package/dist/cache.d.ts +0 -14
  9. package/dist/cache.js +0 -62
  10. package/dist/cache.js.map +0 -1
  11. package/dist/client.d.ts +0 -17
  12. package/dist/client.js +0 -70
  13. package/dist/client.js.map +0 -1
  14. package/dist/formatters.d.ts +0 -35
  15. package/dist/formatters.js +0 -285
  16. package/dist/formatters.js.map +0 -1
  17. package/dist/http.d.ts +0 -2
  18. package/dist/http.js +0 -117
  19. package/dist/http.js.map +0 -1
  20. package/dist/i18n.d.ts +0 -22
  21. package/dist/i18n.js +0 -36
  22. package/dist/i18n.js.map +0 -1
  23. package/dist/index.d.ts +0 -2
  24. package/dist/index.js.map +0 -1
  25. package/dist/journey.d.ts +0 -5
  26. package/dist/journey.js +0 -67
  27. package/dist/journey.js.map +0 -1
  28. package/dist/look2book.d.ts +0 -98
  29. package/dist/look2book.js +0 -212
  30. package/dist/look2book.js.map +0 -1
  31. package/dist/prices.d.ts +0 -3
  32. package/dist/prices.js +0 -51
  33. package/dist/prices.js.map +0 -1
  34. package/dist/profile.d.ts +0 -16
  35. package/dist/profile.js +0 -84
  36. package/dist/profile.js.map +0 -1
  37. package/dist/rate-limit.d.ts +0 -5
  38. package/dist/rate-limit.js +0 -44
  39. package/dist/rate-limit.js.map +0 -1
  40. package/dist/shortlink.d.ts +0 -60
  41. package/dist/shortlink.js +0 -122
  42. package/dist/shortlink.js.map +0 -1
  43. package/dist/structured.d.ts +0 -125
  44. package/dist/structured.js +0 -134
  45. package/dist/structured.js.map +0 -1
  46. package/dist/swisstrip.d.ts +0 -41
  47. package/dist/swisstrip.js +0 -135
  48. package/dist/swisstrip.js.map +0 -1
  49. package/dist/tools.d.ts +0 -40
  50. package/dist/tools.js +0 -509
  51. package/dist/tools.js.map +0 -1
  52. package/dist/transport/index.d.ts +0 -10
  53. package/dist/transport/index.js +0 -13
  54. package/dist/transport/index.js.map +0 -1
  55. package/dist/transport/setup.d.ts +0 -1
  56. package/dist/transport/setup.js +0 -59
  57. package/dist/transport/setup.js.map +0 -1
  58. package/dist/transport/smapi-auth.d.ts +0 -14
  59. package/dist/transport/smapi-auth.js +0 -89
  60. package/dist/transport/smapi-auth.js.map +0 -1
  61. package/dist/transport/smapi-client.d.ts +0 -46
  62. package/dist/transport/smapi-client.js +0 -186
  63. package/dist/transport/smapi-client.js.map +0 -1
  64. package/dist/transport/smapi-journey.d.ts +0 -29
  65. package/dist/transport/smapi-journey.js +0 -91
  66. package/dist/transport/smapi-journey.js.map +0 -1
  67. package/dist/transport/smapi-mock.d.ts +0 -9
  68. package/dist/transport/smapi-mock.js +0 -151
  69. package/dist/transport/smapi-mock.js.map +0 -1
  70. package/dist/transport/smapi-prices.d.ts +0 -48
  71. package/dist/transport/smapi-prices.js +0 -144
  72. package/dist/transport/smapi-prices.js.map +0 -1
  73. package/dist/transport/smapi-types.d.ts +0 -181
  74. package/dist/transport/smapi-types.js +0 -2
  75. package/dist/transport/smapi-types.js.map +0 -1
  76. package/dist/types.d.ts +0 -139
  77. package/dist/types.js +0 -3
  78. package/dist/types.js.map +0 -1
  79. package/dist/widgets.d.ts +0 -60
  80. package/dist/widgets.js +0 -184
  81. package/dist/widgets.js.map +0 -1
  82. package/web/dist/widgets.css +0 -1
  83. package/web/dist/widgets.js +0 -1
package/dist/swisstrip.js DELETED
@@ -1,135 +0,0 @@
1
- /**
2
- * SwissTrip API client for sbb-mcp (Layer 3)
3
- *
4
- * When SWISSTRIP_TOKEN is set, sbb-mcp fetches traveler profiles from the
5
- * SwissTrip cloud API instead of (or in addition to) the local file.
6
- * This enables cloud-synced profiles and multi-traveler support (partner, kids).
7
- */
8
- // ─── Config ─────────────────────────────────────────────────────────────────
9
- //
10
- // Env vars are read lazily (per call) rather than cached at module load so
11
- // tests can toggle `SWISSTRIP_TOKEN` between cases without reimporting the
12
- // module. In production the cost is one extra property read per call —
13
- // negligible — and the invariant it protects (anonymous path always works)
14
- // is load-bearing for the no-login-required product design.
15
- function getToken() {
16
- return process.env.SWISSTRIP_TOKEN;
17
- }
18
- function getBaseUrl() {
19
- return process.env.SWISSTRIP_URL || 'https://swisstrip.ch';
20
- }
21
- export function isSwissTripConfigured() {
22
- return !!getToken();
23
- }
24
- // ─── API calls ──────────────────────────────────────────────────────────────
25
- async function fetchSwissTrip(path) {
26
- const token = getToken();
27
- if (!token) {
28
- // Caller should have gated on `isSwissTripConfigured()`. Throwing here
29
- // rather than sending an unauthenticated request catches misuse early.
30
- throw new Error('SwissTrip API called without SWISSTRIP_TOKEN — check isSwissTripConfigured() first');
31
- }
32
- const url = `${getBaseUrl()}${path}`;
33
- const res = await fetch(url, {
34
- headers: {
35
- 'Authorization': `Bearer ${token}`,
36
- 'Accept': 'application/json',
37
- },
38
- });
39
- if (!res.ok) {
40
- const body = await res.text().catch(() => '');
41
- throw new Error(`SwissTrip API error: ${res.status} ${res.statusText}${body ? ` — ${body}` : ''}`);
42
- }
43
- return res.json();
44
- }
45
- export async function fetchProfile() {
46
- return fetchSwissTrip('/api/mcp/profile');
47
- }
48
- export async function fetchTravelers() {
49
- return fetchSwissTrip('/api/travelers');
50
- }
51
- // ─── Conversion helpers ─────────────────────────────────────────────────────
52
- function parseReductionCard(card) {
53
- if (!card)
54
- return 'NONE';
55
- const upper = card.toUpperCase();
56
- if (upper === 'HALF_FARE' || upper === 'HALBTAX')
57
- return 'HALF_FARE';
58
- if (upper === 'GA')
59
- return 'GA';
60
- return 'NONE';
61
- }
62
- function isChild(dob) {
63
- if (!dob)
64
- return false;
65
- const birth = new Date(dob);
66
- const age = (Date.now() - birth.getTime()) / (365.25 * 24 * 60 * 60 * 1000);
67
- return age < 16;
68
- }
69
- /** Convert a SwissTrip traveler to an SMAPI traveler for pricing/offers */
70
- export function toSmapiTraveler(t, index) {
71
- return {
72
- id: `traveler-${index + 1}`,
73
- type: isChild(t.date_of_birth) ? 'CHILD' : 'ADULT',
74
- ...(t.date_of_birth && { dateOfBirth: t.date_of_birth }),
75
- reductionCard: parseReductionCard(t.reduction_card),
76
- ...(t.first_name && { firstName: t.first_name.slice(0, 30) }),
77
- ...(t.last_name && { lastName: t.last_name.slice(0, 30) }),
78
- };
79
- }
80
- /** Convert the primary profile (from /api/mcp/profile) to an SMAPI traveler */
81
- export function profileToSmapiTraveler(p) {
82
- return {
83
- id: 'traveler-1',
84
- type: isChild(p.travel_date_of_birth) ? 'CHILD' : 'ADULT',
85
- ...(p.travel_date_of_birth && { dateOfBirth: p.travel_date_of_birth }),
86
- reductionCard: parseReductionCard(p.travel_reduction_card),
87
- ...(p.travel_first_name && { firstName: p.travel_first_name.slice(0, 30) }),
88
- ...(p.travel_last_name && { lastName: p.travel_last_name.slice(0, 30) }),
89
- };
90
- }
91
- // ─── Formatting ─────────────────────────────────────────────────────────────
92
- export function formatTravelersList(travelers) {
93
- if (travelers.length === 0) {
94
- return 'No travelers found in your SwissTrip account. Add travelers at swisstrip.ch/settings.';
95
- }
96
- const lines = [`**Your Travelers** (${travelers.length})`, ''];
97
- for (const t of travelers) {
98
- const name = [t.first_name, t.last_name].filter(Boolean).join(' ') || 'Unnamed';
99
- const label = t.label ? ` (${t.label})` : '';
100
- const primary = t.is_primary ? ' ★' : '';
101
- const card = parseReductionCard(t.reduction_card);
102
- const cardStr = card === 'HALF_FARE' ? 'Halbtax' : card === 'GA' ? 'GA' : 'No card';
103
- const type = isChild(t.date_of_birth) ? 'Child' : 'Adult';
104
- lines.push(`- **${name}**${label}${primary} — ${type}, ${cardStr}`);
105
- }
106
- lines.push('');
107
- lines.push('★ = primary traveler. Use traveler names with `get_prices` for family pricing.');
108
- return lines.join('\n');
109
- }
110
- export function formatCloudProfile(profile) {
111
- const lines = ['**Your Travel Profile** (synced from SwissTrip)', ''];
112
- const name = [profile.travel_first_name, profile.travel_last_name].filter(Boolean).join(' ');
113
- if (name)
114
- lines.push(`Name: ${name}`);
115
- if (profile.travel_date_of_birth)
116
- lines.push(`Date of birth: ${profile.travel_date_of_birth}`);
117
- const card = parseReductionCard(profile.travel_reduction_card);
118
- if (card !== 'NONE') {
119
- const cardName = card === 'HALF_FARE' ? 'Halbtax (Half-Fare)' : 'GA Travelcard';
120
- let cardLine = `Reduction card: ${cardName}`;
121
- if (profile.travel_reduction_card_valid_until) {
122
- cardLine += ` (valid until ${profile.travel_reduction_card_valid_until})`;
123
- }
124
- lines.push(cardLine);
125
- }
126
- else {
127
- lines.push('Reduction card: None');
128
- }
129
- if (profile.locale)
130
- lines.push(`Locale: ${profile.locale}`);
131
- lines.push('');
132
- lines.push('*Profile managed at swisstrip.ch/settings.*');
133
- return lines.join('\n');
134
- }
135
- //# sourceMappingURL=swisstrip.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"swisstrip.js","sourceRoot":"","sources":["../src/swisstrip.ts"],"names":[],"mappings":"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"}
package/dist/tools.d.ts DELETED
@@ -1,40 +0,0 @@
1
- import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- /** Shape of save_profile tool input. Kept in sync with the z-schema below. */
3
- export interface SaveProfileInput {
4
- first_name?: string;
5
- last_name?: string;
6
- date_of_birth?: string;
7
- reduction_card?: 'HALF_FARE' | 'GA' | 'NONE';
8
- reduction_card_valid_until?: string;
9
- }
10
- export declare function handleSaveProfile(input: SaveProfileInput): Promise<{
11
- content: {
12
- type: "text";
13
- text: string;
14
- }[];
15
- isError: true;
16
- } | {
17
- content: {
18
- type: "text";
19
- text: string;
20
- }[];
21
- }>;
22
- export declare function handleGetProfile(): Promise<{
23
- content: {
24
- type: "text";
25
- text: string;
26
- }[];
27
- }>;
28
- export declare function handleListTravelers(): Promise<{
29
- content: {
30
- type: "text";
31
- text: string;
32
- }[];
33
- isError: true;
34
- } | {
35
- content: {
36
- type: "text";
37
- text: string;
38
- }[];
39
- }>;
40
- export declare function createSbbMcpServer(): McpServer;