mcp-swiss 0.1.0 → 0.1.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.
@@ -79,12 +79,42 @@ async function handleWeather(name, args) {
79
79
  version: "0.1.0",
80
80
  });
81
81
  const data = await (0, http_js_1.fetchJSON)(url);
82
+ const payload = data?.payload;
83
+ if (Array.isArray(payload)) {
84
+ const PARAM_NAMES = {
85
+ tt: "temperature_c", rr: "precipitation_mm", ss: "sunshine_min",
86
+ rad: "radiation_w_m2", rh: "humidity_pct", td: "dewpoint_c",
87
+ dd: "wind_direction_deg", ff: "wind_speed_m_s", fx: "wind_gust_m_s",
88
+ qfe: "pressure_station_hpa", qff: "pressure_sea_hpa", qnh: "pressure_qnh_hpa",
89
+ };
90
+ const ts = payload[0]?.timestamp;
91
+ const readings = {};
92
+ for (const p of payload) {
93
+ const key = PARAM_NAMES[p.par] ?? p.par;
94
+ readings[key] = p.val;
95
+ }
96
+ return JSON.stringify({
97
+ station: args.station,
98
+ timestamp: ts ? new Date(ts * 1000).toISOString() : undefined,
99
+ ...readings,
100
+ source: "MeteoSwiss via SwissMetNet",
101
+ });
102
+ }
82
103
  return JSON.stringify(data, null, 2);
83
104
  }
84
105
  case "list_weather_stations": {
85
106
  const url = (0, http_js_1.buildUrl)(`${BASE}/smn/locations`, { app: "mcp-swiss" });
86
107
  const data = await (0, http_js_1.fetchJSON)(url);
87
- return JSON.stringify(data, null, 2);
108
+ const payload = data?.payload ?? {};
109
+ const stations = Object.values(payload).map((s) => ({
110
+ code: s.details?.id ?? s.name,
111
+ name: s.details?.name ?? s.name,
112
+ canton: s.details?.canton,
113
+ alt: s.details?.alt,
114
+ lat: s.details?.lat,
115
+ lon: s.details?.lon,
116
+ }));
117
+ return JSON.stringify({ count: stations.length, stations });
88
118
  }
89
119
  case "get_weather_history": {
90
120
  const url = (0, http_js_1.buildUrl)(`${BASE}/smn/daterange`, {
@@ -95,6 +125,15 @@ async function handleWeather(name, args) {
95
125
  version: "0.1.0",
96
126
  });
97
127
  const data = await (0, http_js_1.fetchJSON)(url);
128
+ const payload = data?.payload;
129
+ if (Array.isArray(payload)) {
130
+ const records = payload.map((p) => ({
131
+ time: p.timestamp ? new Date(p.timestamp * 1000).toISOString() : p.timestamp,
132
+ param: p.par,
133
+ value: p.val,
134
+ }));
135
+ return JSON.stringify({ station: args.station, count: records.length, data: records });
136
+ }
98
137
  return JSON.stringify(data, null, 2);
99
138
  }
100
139
  case "get_water_level": {
@@ -104,12 +143,30 @@ async function handleWeather(name, args) {
104
143
  version: "0.1.0",
105
144
  });
106
145
  const data = await (0, http_js_1.fetchJSON)(url);
146
+ const payload = data?.payload;
147
+ if (Array.isArray(payload)) {
148
+ const readings = payload.map((p) => ({
149
+ time: p.timestamp ? new Date(p.timestamp * 1000).toISOString() : p.timestamp,
150
+ param: p.par,
151
+ value: p.val,
152
+ }));
153
+ return JSON.stringify({ station: args.station, readings });
154
+ }
107
155
  return JSON.stringify(data, null, 2);
108
156
  }
109
157
  case "list_hydro_stations": {
110
158
  const url = (0, http_js_1.buildUrl)(`${BASE}/hydro/locations`, { app: "mcp-swiss" });
111
159
  const data = await (0, http_js_1.fetchJSON)(url);
112
- return JSON.stringify(data, null, 2);
160
+ const payload = data?.payload ?? {};
161
+ const stations = Object.values(payload).map((s) => ({
162
+ id: s.details?.id ?? s.name,
163
+ name: s.details?.name,
164
+ waterBody: s.details?.["water-body-name"],
165
+ type: s.details?.["water-body-type"],
166
+ lat: s.details?.lat,
167
+ lon: s.details?.lon,
168
+ }));
169
+ return JSON.stringify({ count: stations.length, stations });
113
170
  }
114
171
  case "get_water_history": {
115
172
  const url = (0, http_js_1.buildUrl)(`${BASE}/hydro/daterange`, {
@@ -120,6 +177,15 @@ async function handleWeather(name, args) {
120
177
  version: "0.1.0",
121
178
  });
122
179
  const data = await (0, http_js_1.fetchJSON)(url);
180
+ const payload = data?.payload;
181
+ if (Array.isArray(payload)) {
182
+ const records = payload.map((p) => ({
183
+ time: p.timestamp ? new Date(p.timestamp * 1000).toISOString() : p.timestamp,
184
+ param: p.par,
185
+ value: p.val,
186
+ }));
187
+ return JSON.stringify({ station: args.station, count: records.length, data: records });
188
+ }
123
189
  return JSON.stringify(data, null, 2);
124
190
  }
125
191
  default:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mcp-swiss",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Swiss open data MCP server — transport, weather, geodata, companies. Zero API keys.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -77,14 +77,44 @@ export async function handleWeather(name: string, args: Record<string, unknown>)
77
77
  app: "mcp-swiss",
78
78
  version: "0.1.0",
79
79
  });
80
- const data = await fetchJSON<unknown>(url);
80
+ const data = await fetchJSON<Record<string, unknown>>(url);
81
+ const payload = (data as any)?.payload;
82
+ if (Array.isArray(payload)) {
83
+ const PARAM_NAMES: Record<string, string> = {
84
+ tt: "temperature_c", rr: "precipitation_mm", ss: "sunshine_min",
85
+ rad: "radiation_w_m2", rh: "humidity_pct", td: "dewpoint_c",
86
+ dd: "wind_direction_deg", ff: "wind_speed_m_s", fx: "wind_gust_m_s",
87
+ qfe: "pressure_station_hpa", qff: "pressure_sea_hpa", qnh: "pressure_qnh_hpa",
88
+ };
89
+ const ts = payload[0]?.timestamp;
90
+ const readings: Record<string, number> = {};
91
+ for (const p of payload) {
92
+ const key = PARAM_NAMES[p.par] ?? p.par;
93
+ readings[key] = p.val;
94
+ }
95
+ return JSON.stringify({
96
+ station: args.station,
97
+ timestamp: ts ? new Date(ts * 1000).toISOString() : undefined,
98
+ ...readings,
99
+ source: "MeteoSwiss via SwissMetNet",
100
+ });
101
+ }
81
102
  return JSON.stringify(data, null, 2);
82
103
  }
83
104
 
84
105
  case "list_weather_stations": {
85
106
  const url = buildUrl(`${BASE}/smn/locations`, { app: "mcp-swiss" });
86
- const data = await fetchJSON<unknown>(url);
87
- return JSON.stringify(data, null, 2);
107
+ const data = await fetchJSON<Record<string, unknown>>(url);
108
+ const payload = (data as any)?.payload ?? {};
109
+ const stations = Object.values(payload).map((s: any) => ({
110
+ code: s.details?.id ?? s.name,
111
+ name: s.details?.name ?? s.name,
112
+ canton: s.details?.canton,
113
+ alt: s.details?.alt,
114
+ lat: s.details?.lat,
115
+ lon: s.details?.lon,
116
+ }));
117
+ return JSON.stringify({ count: stations.length, stations });
88
118
  }
89
119
 
90
120
  case "get_weather_history": {
@@ -95,7 +125,16 @@ export async function handleWeather(name: string, args: Record<string, unknown>)
95
125
  app: "mcp-swiss",
96
126
  version: "0.1.0",
97
127
  });
98
- const data = await fetchJSON<unknown>(url);
128
+ const data = await fetchJSON<Record<string, unknown>>(url);
129
+ const payload = (data as any)?.payload;
130
+ if (Array.isArray(payload)) {
131
+ const records = payload.map((p: any) => ({
132
+ time: p.timestamp ? new Date(p.timestamp * 1000).toISOString() : p.timestamp,
133
+ param: p.par,
134
+ value: p.val,
135
+ }));
136
+ return JSON.stringify({ station: args.station, count: records.length, data: records });
137
+ }
99
138
  return JSON.stringify(data, null, 2);
100
139
  }
101
140
 
@@ -105,14 +144,32 @@ export async function handleWeather(name: string, args: Record<string, unknown>)
105
144
  app: "mcp-swiss",
106
145
  version: "0.1.0",
107
146
  });
108
- const data = await fetchJSON<unknown>(url);
147
+ const data = await fetchJSON<Record<string, unknown>>(url);
148
+ const payload = (data as any)?.payload;
149
+ if (Array.isArray(payload)) {
150
+ const readings = payload.map((p: any) => ({
151
+ time: p.timestamp ? new Date(p.timestamp * 1000).toISOString() : p.timestamp,
152
+ param: p.par,
153
+ value: p.val,
154
+ }));
155
+ return JSON.stringify({ station: args.station, readings });
156
+ }
109
157
  return JSON.stringify(data, null, 2);
110
158
  }
111
159
 
112
160
  case "list_hydro_stations": {
113
161
  const url = buildUrl(`${BASE}/hydro/locations`, { app: "mcp-swiss" });
114
- const data = await fetchJSON<unknown>(url);
115
- return JSON.stringify(data, null, 2);
162
+ const data = await fetchJSON<Record<string, unknown>>(url);
163
+ const payload = (data as any)?.payload ?? {};
164
+ const stations = Object.values(payload).map((s: any) => ({
165
+ id: s.details?.id ?? s.name,
166
+ name: s.details?.name,
167
+ waterBody: s.details?.["water-body-name"],
168
+ type: s.details?.["water-body-type"],
169
+ lat: s.details?.lat,
170
+ lon: s.details?.lon,
171
+ }));
172
+ return JSON.stringify({ count: stations.length, stations });
116
173
  }
117
174
 
118
175
  case "get_water_history": {
@@ -123,7 +180,16 @@ export async function handleWeather(name: string, args: Record<string, unknown>)
123
180
  app: "mcp-swiss",
124
181
  version: "0.1.0",
125
182
  });
126
- const data = await fetchJSON<unknown>(url);
183
+ const data = await fetchJSON<Record<string, unknown>>(url);
184
+ const payload = (data as any)?.payload;
185
+ if (Array.isArray(payload)) {
186
+ const records = payload.map((p: any) => ({
187
+ time: p.timestamp ? new Date(p.timestamp * 1000).toISOString() : p.timestamp,
188
+ param: p.par,
189
+ value: p.val,
190
+ }));
191
+ return JSON.stringify({ station: args.station, count: records.length, data: records });
192
+ }
127
193
  return JSON.stringify(data, null, 2);
128
194
  }
129
195