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.
- package/dist/modules/weather.js +68 -2
- package/package.json +1 -1
- package/src/modules/weather.ts +74 -8
package/dist/modules/weather.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
package/src/modules/weather.ts
CHANGED
|
@@ -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
|
|
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
|
|
87
|
-
|
|
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
|
|
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
|
|
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
|
|
115
|
-
|
|
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
|
|
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
|
|