@cyanheads/wsdot-mcp-server 0.1.13 → 0.1.15

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 (74) hide show
  1. package/AGENTS.md +39 -28
  2. package/CLAUDE.md +39 -28
  3. package/Dockerfile +1 -1
  4. package/LICENSE +1 -1
  5. package/README.md +5 -3
  6. package/changelog/0.1.x/0.1.14.md +29 -0
  7. package/changelog/0.1.x/0.1.15.md +18 -0
  8. package/dist/mcp-server/tools/definitions/get-border-waits.tool.d.ts +6 -0
  9. package/dist/mcp-server/tools/definitions/get-border-waits.tool.d.ts.map +1 -1
  10. package/dist/mcp-server/tools/definitions/get-border-waits.tool.js +7 -0
  11. package/dist/mcp-server/tools/definitions/get-border-waits.tool.js.map +1 -1
  12. package/dist/mcp-server/tools/definitions/get-ferry-alerts.tool.d.ts +6 -0
  13. package/dist/mcp-server/tools/definitions/get-ferry-alerts.tool.d.ts.map +1 -1
  14. package/dist/mcp-server/tools/definitions/get-ferry-alerts.tool.js +7 -0
  15. package/dist/mcp-server/tools/definitions/get-ferry-alerts.tool.js.map +1 -1
  16. package/dist/mcp-server/tools/definitions/get-ferry-routes.tool.d.ts +6 -0
  17. package/dist/mcp-server/tools/definitions/get-ferry-routes.tool.d.ts.map +1 -1
  18. package/dist/mcp-server/tools/definitions/get-ferry-routes.tool.js +7 -0
  19. package/dist/mcp-server/tools/definitions/get-ferry-routes.tool.js.map +1 -1
  20. package/dist/mcp-server/tools/definitions/get-ferry-schedule.tool.d.ts +6 -0
  21. package/dist/mcp-server/tools/definitions/get-ferry-schedule.tool.d.ts.map +1 -1
  22. package/dist/mcp-server/tools/definitions/get-ferry-schedule.tool.js +21 -10
  23. package/dist/mcp-server/tools/definitions/get-ferry-schedule.tool.js.map +1 -1
  24. package/dist/mcp-server/tools/definitions/get-ferry-terminals.tool.d.ts +6 -0
  25. package/dist/mcp-server/tools/definitions/get-ferry-terminals.tool.d.ts.map +1 -1
  26. package/dist/mcp-server/tools/definitions/get-ferry-terminals.tool.js +7 -0
  27. package/dist/mcp-server/tools/definitions/get-ferry-terminals.tool.js.map +1 -1
  28. package/dist/mcp-server/tools/definitions/get-mountain-passes.tool.d.ts +6 -0
  29. package/dist/mcp-server/tools/definitions/get-mountain-passes.tool.d.ts.map +1 -1
  30. package/dist/mcp-server/tools/definitions/get-mountain-passes.tool.js +7 -0
  31. package/dist/mcp-server/tools/definitions/get-mountain-passes.tool.js.map +1 -1
  32. package/dist/mcp-server/tools/definitions/get-terminal-space.tool.d.ts +6 -0
  33. package/dist/mcp-server/tools/definitions/get-terminal-space.tool.d.ts.map +1 -1
  34. package/dist/mcp-server/tools/definitions/get-terminal-space.tool.js +7 -0
  35. package/dist/mcp-server/tools/definitions/get-terminal-space.tool.js.map +1 -1
  36. package/dist/mcp-server/tools/definitions/get-toll-rates.tool.d.ts +6 -0
  37. package/dist/mcp-server/tools/definitions/get-toll-rates.tool.d.ts.map +1 -1
  38. package/dist/mcp-server/tools/definitions/get-toll-rates.tool.js +7 -0
  39. package/dist/mcp-server/tools/definitions/get-toll-rates.tool.js.map +1 -1
  40. package/dist/mcp-server/tools/definitions/get-travel-times.tool.d.ts +6 -0
  41. package/dist/mcp-server/tools/definitions/get-travel-times.tool.d.ts.map +1 -1
  42. package/dist/mcp-server/tools/definitions/get-travel-times.tool.js +28 -9
  43. package/dist/mcp-server/tools/definitions/get-travel-times.tool.js.map +1 -1
  44. package/dist/mcp-server/tools/definitions/get-vessel-locations.tool.d.ts +6 -0
  45. package/dist/mcp-server/tools/definitions/get-vessel-locations.tool.d.ts.map +1 -1
  46. package/dist/mcp-server/tools/definitions/get-vessel-locations.tool.js +7 -0
  47. package/dist/mcp-server/tools/definitions/get-vessel-locations.tool.js.map +1 -1
  48. package/dist/mcp-server/tools/definitions/search-alerts.tool.d.ts +6 -0
  49. package/dist/mcp-server/tools/definitions/search-alerts.tool.d.ts.map +1 -1
  50. package/dist/mcp-server/tools/definitions/search-alerts.tool.js +18 -4
  51. package/dist/mcp-server/tools/definitions/search-alerts.tool.js.map +1 -1
  52. package/dist/mcp-server/tools/definitions/search-cameras.tool.d.ts +6 -0
  53. package/dist/mcp-server/tools/definitions/search-cameras.tool.d.ts.map +1 -1
  54. package/dist/mcp-server/tools/definitions/search-cameras.tool.js +8 -1
  55. package/dist/mcp-server/tools/definitions/search-cameras.tool.js.map +1 -1
  56. package/dist/services/ferry/ferry-service.d.ts.map +1 -1
  57. package/dist/services/ferry/ferry-service.js +11 -26
  58. package/dist/services/ferry/ferry-service.js.map +1 -1
  59. package/dist/services/traffic/route-match.d.ts +18 -0
  60. package/dist/services/traffic/route-match.d.ts.map +1 -0
  61. package/dist/services/traffic/route-match.js +51 -0
  62. package/dist/services/traffic/route-match.js.map +1 -0
  63. package/dist/services/traffic/traffic-service.d.ts +0 -11
  64. package/dist/services/traffic/traffic-service.d.ts.map +1 -1
  65. package/dist/services/traffic/traffic-service.js +61 -84
  66. package/dist/services/traffic/traffic-service.js.map +1 -1
  67. package/dist/services/traffic/types.d.ts +8 -1
  68. package/dist/services/traffic/types.d.ts.map +1 -1
  69. package/dist/services/wsdot-http.d.ts +47 -0
  70. package/dist/services/wsdot-http.d.ts.map +1 -0
  71. package/dist/services/wsdot-http.js +145 -0
  72. package/dist/services/wsdot-http.js.map +1 -0
  73. package/package.json +8 -8
  74. package/server.json +3 -3
@@ -3,12 +3,14 @@
3
3
  * toll rates, border crossings, and cameras.
4
4
  * @module services/traffic/traffic-service
5
5
  */
6
- import { serviceUnavailable } from '@cyanheads/mcp-ts-core/errors';
7
6
  import { withRetry } from '@cyanheads/mcp-ts-core/utils';
8
7
  import { getServerConfig } from '../../config/server-config.js';
9
8
  import { wcfDateField } from '../../services/wcf-date.js';
9
+ import { assertUpstreamJson, fetchUpstream, redactUrl } from '../../services/wsdot-http.js';
10
+ import { routeMatches } from './route-match.js';
10
11
  const BASE_URL = 'https://www.wsdot.wa.gov/Traffic/api';
11
12
  const TIMEOUT_MS = 15_000;
13
+ const SERVICE = 'WSDOT Traffic API';
12
14
  export class TrafficApiService {
13
15
  constructor(_config, _storage) { }
14
16
  accessCode() {
@@ -16,32 +18,14 @@ export class TrafficApiService {
16
18
  }
17
19
  fetchJson(path, ctx) {
18
20
  const url = `${BASE_URL}/${path}${path.includes('?') ? '&' : '?'}AccessCode=${this.accessCode()}`;
21
+ const endpoint = redactUrl(url);
19
22
  return withRetry(async () => {
20
- const timeoutSignal = AbortSignal.timeout(TIMEOUT_MS);
21
- const signal = ctx.signal.aborted
22
- ? ctx.signal
23
- : AbortSignal.any([ctx.signal, timeoutSignal]);
24
- const response = await fetch(url, { signal });
25
- if (!response.ok) {
26
- // 4xx is a client error that won't succeed on retry — mark non-retryable so withRetry
27
- // fails fast instead of burning all attempts (the data.retryable === false opt-out).
28
- const isClientError = response.status >= 400 && response.status < 500;
29
- throw serviceUnavailable(`WSDOT Traffic API returned HTTP ${response.status}.`, {
30
- url,
31
- status: response.status,
32
- ...(isClientError && { retryable: false }),
33
- });
34
- }
35
- // Auth failure returns HTML, not JSON — detect by Content-Type
36
- const contentType = response.headers.get('content-type') ?? '';
37
- if (contentType.includes('text/html')) {
38
- throw serviceUnavailable('WSDOT Traffic API returned an HTML page instead of JSON. Verify that WSDOT_ACCESS_CODE is set to a valid access code.', { url });
39
- }
40
- const text = await response.text();
41
- if (/^\s*<(!DOCTYPE\s+html|html[\s>])/i.test(text)) {
42
- throw serviceUnavailable('WSDOT Traffic API returned HTML content. Verify that WSDOT_ACCESS_CODE is set to a valid access code.', { url });
43
- }
44
- return JSON.parse(text);
23
+ const response = await fetchUpstream(url, endpoint, SERVICE, TIMEOUT_MS, ctx);
24
+ // The body is read before any status check: an unregistered access code comes back as a
25
+ // 400 whose body carries WSDOT's own explanation, which a status-first throw discards.
26
+ const body = await response.text();
27
+ assertUpstreamJson({ body, endpoint, response, service: SERVICE }, ctx);
28
+ return JSON.parse(body);
45
29
  }, {
46
30
  operation: 'TrafficApiService.fetchJson',
47
31
  baseDelayMs: 1000,
@@ -96,27 +80,32 @@ export class TrafficApiService {
96
80
  const result = await this.fetchJson('HighwayAlerts/HighwayAlertsREST.svc/GetAlertsAsJson', ctx);
97
81
  let alerts = result.map(normalizeAlert);
98
82
  if (params.stateRoute) {
99
- // Compare canonical route numbers (not a roadName substring) so "90" matches
100
- // I-90 without also matching SR 290, and natural forms ("I-90") resolve too.
101
- const target = normalizeRoute(params.stateRoute);
83
+ // Compare route designations (not a roadName substring) so "90" matches I-90 without also
84
+ // matching SR 290, natural forms ("I-90") resolve against the feed's bare "090", and a
85
+ // prefixed filter such as "SR 26" does not pull in US 26.
86
+ const target = params.stateRoute;
102
87
  alerts = alerts.filter((a) => {
103
88
  const start = a.startRoadwayLocation?.roadName;
104
89
  const end = a.endRoadwayLocation?.roadName;
105
- return ((start != null && normalizeRoute(start) === target) ||
106
- (end != null && normalizeRoute(end) === target));
90
+ return ((start != null && routeMatches(target, start)) ||
91
+ (end != null && routeMatches(target, end)));
107
92
  });
108
93
  }
109
94
  if (params.region) {
110
95
  const region = params.region.toLowerCase();
111
96
  alerts = alerts.filter((a) => a.region?.toLowerCase() === region);
112
97
  }
113
- if (params.startMilepost != null) {
114
- const minMp = params.startMilepost;
115
- alerts = alerts.filter((a) => a.startRoadwayLocation?.milePost == null || a.startRoadwayLocation.milePost >= minMp);
116
- }
117
- if (params.endMilepost != null) {
118
- const maxMp = params.endMilepost;
119
- alerts = alerts.filter((a) => a.startRoadwayLocation?.milePost == null || a.startRoadwayLocation.milePost <= maxMp);
98
+ if (params.startMilepost != null || params.endMilepost != null) {
99
+ // An alert is an extent, so the requested range is tested for overlap against the span
100
+ // between the mileposts the alert reports — a closure running from MP 10 to MP 30 covers a
101
+ // request for MP 20. Mileposts descend on a decreasing-direction record, so the span is
102
+ // taken as min/max rather than assuming start <= end. An alert with no milepost is kept.
103
+ const min = params.startMilepost ?? Number.NEGATIVE_INFINITY;
104
+ const max = params.endMilepost ?? Number.POSITIVE_INFINITY;
105
+ alerts = alerts.filter((a) => {
106
+ const posts = [a.startRoadwayLocation?.milePost, a.endRoadwayLocation?.milePost].filter((mp) => mp != null);
107
+ return posts.length === 0 || (Math.min(...posts) <= max && Math.max(...posts) >= min);
108
+ });
120
109
  }
121
110
  return alerts;
122
111
  }
@@ -127,8 +116,8 @@ export class TrafficApiService {
127
116
  ...(t.TravelTimeID != null && { travelTimeId: t.TravelTimeID }),
128
117
  ...(t.Name != null && { name: t.Name }),
129
118
  ...(t.Description != null && { description: t.Description }),
130
- ...(t.CurrentTime != null && { currentTimeInMinutes: t.CurrentTime }),
131
- ...(t.AverageTime != null && { averageTimeInMinutes: t.AverageTime }),
119
+ ...(isMeasuredDuration(t.CurrentTime, t.Distance) && { currentTimeInMinutes: t.CurrentTime }),
120
+ ...(isMeasuredDuration(t.AverageTime, t.Distance) && { averageTimeInMinutes: t.AverageTime }),
132
121
  ...wcfDateField('timeUpdated', t.TimeUpdated),
133
122
  ...(t.Distance != null && { distanceInMiles: t.Distance }),
134
123
  ...(t.StartPoint != null && {
@@ -203,11 +192,11 @@ export class TrafficApiService {
203
192
  const result = await this.fetchJson('HighwayCameras/HighwayCamerasREST.svc/GetCamerasAsJson', ctx);
204
193
  let cameras = result.map(normalizeCamera);
205
194
  if (params.stateRoute) {
206
- // Match on the canonical route number so natural forms ("I-90", "SR 520") and
207
- // padded/bare numbers ("090", "90") all resolve to the same value — and "90"
208
- // can't substring-match a different route such as "SR 290".
209
- const target = normalizeRoute(params.stateRoute);
210
- cameras = cameras.filter((c) => c.roadName != null && normalizeRoute(c.roadName) === target);
195
+ // Match on the route designation so natural forms ("I-90", "SR 520") and padded/bare numbers
196
+ // ("090", "90") all resolve to the same route, "90" can't substring-match a different route
197
+ // such as "SR 290", and the prefixed camera road names stay distinct: "SR 26" is not US 26.
198
+ const target = params.stateRoute;
199
+ cameras = cameras.filter((c) => c.roadName != null && routeMatches(target, c.roadName));
211
200
  }
212
201
  if (params.region) {
213
202
  const region = params.region.toUpperCase();
@@ -226,18 +215,32 @@ export class TrafficApiService {
226
215
  }
227
216
  // --- Normalization helpers ---
228
217
  /**
229
- * Canonicalizes a route designation to its bare WSDOT route number for filtering.
230
- * Accepts natural forms ("I-90", "SR 520", "US 2"), zero-padded ("090"), and bare
231
- * numbers ("90"), case- and space-insensitively — all reduce to the route number
232
- * ("90", "520", "5"). Strips any route-type prefix and leading zeros. Comparing two
233
- * normalized values for exact equality avoids the substring false positives of a raw
234
- * `roadName.includes()` match (so "90" no longer matches "SR 290"). Falls back to the
235
- * lowercased, trimmed input when it has no digits, so a non-route string still
236
- * compares deterministically without matching a numbered road.
218
+ * Reports whether a travel-time figure is a measurement. WSDOT emits 0 rather than null for a
219
+ * corridor it is not currently measuring — the reversible express lanes report 0 while closed in
220
+ * the queried direction — and a corridor with distance cannot be a zero-minute trip. Keyed on the
221
+ * value, not the corridor name: the opposite-direction express lanes carry real measurements under
222
+ * the same naming. A 0 stands when the feed reports no distance, since nothing contradicts it.
223
+ */
224
+ function isMeasuredDuration(minutes, distanceInMiles) {
225
+ if (minutes == null)
226
+ return false;
227
+ return minutes !== 0 || distanceInMiles == null || distanceInMiles === 0;
228
+ }
229
+ /**
230
+ * WSDOT fills an *unpopulated* roadway location with zeros rather than omitting it — a point alert
231
+ * carries an end location whose MilePost, Latitude, and Longitude are all 0. Those are placeholders,
232
+ * not a position at MP 0 in the Gulf of Guinea, so they are dropped; the road name and direction
233
+ * the record does carry are kept.
237
234
  */
238
- export function normalizeRoute(route) {
239
- const digits = route.replace(/\D/g, '').replace(/^0+/, '');
240
- return digits || route.trim().toLowerCase();
235
+ function normalizeRoadwayLocation(loc) {
236
+ const unpopulated = loc.MilePost === 0 && loc.Latitude === 0 && loc.Longitude === 0;
237
+ return {
238
+ ...(loc.RoadName != null && { roadName: loc.RoadName }),
239
+ ...(loc.Direction != null && { direction: loc.Direction }),
240
+ ...(!unpopulated && loc.MilePost != null && { milePost: loc.MilePost }),
241
+ ...(!unpopulated && loc.Latitude != null && { latitude: loc.Latitude }),
242
+ ...(!unpopulated && loc.Longitude != null && { longitude: loc.Longitude }),
243
+ };
241
244
  }
242
245
  function normalizeAlert(a) {
243
246
  return {
@@ -250,36 +253,10 @@ function normalizeAlert(a) {
250
253
  ...(a.Region != null && { region: a.Region }),
251
254
  ...(a.County != null && { county: a.County }),
252
255
  ...(a.StartRoadwayLocation != null && {
253
- startRoadwayLocation: {
254
- ...(a.StartRoadwayLocation.RoadName != null && {
255
- roadName: a.StartRoadwayLocation.RoadName,
256
- }),
257
- ...(a.StartRoadwayLocation.Direction != null && {
258
- direction: a.StartRoadwayLocation.Direction,
259
- }),
260
- ...(a.StartRoadwayLocation.MilePost != null && {
261
- milePost: a.StartRoadwayLocation.MilePost,
262
- }),
263
- ...(a.StartRoadwayLocation.Latitude != null && {
264
- latitude: a.StartRoadwayLocation.Latitude,
265
- }),
266
- ...(a.StartRoadwayLocation.Longitude != null && {
267
- longitude: a.StartRoadwayLocation.Longitude,
268
- }),
269
- },
256
+ startRoadwayLocation: normalizeRoadwayLocation(a.StartRoadwayLocation),
270
257
  }),
271
258
  ...(a.EndRoadwayLocation != null && {
272
- endRoadwayLocation: {
273
- ...(a.EndRoadwayLocation.RoadName != null && { roadName: a.EndRoadwayLocation.RoadName }),
274
- ...(a.EndRoadwayLocation.Direction != null && {
275
- direction: a.EndRoadwayLocation.Direction,
276
- }),
277
- ...(a.EndRoadwayLocation.MilePost != null && { milePost: a.EndRoadwayLocation.MilePost }),
278
- ...(a.EndRoadwayLocation.Latitude != null && { latitude: a.EndRoadwayLocation.Latitude }),
279
- ...(a.EndRoadwayLocation.Longitude != null && {
280
- longitude: a.EndRoadwayLocation.Longitude,
281
- }),
282
- },
259
+ endRoadwayLocation: normalizeRoadwayLocation(a.EndRoadwayLocation),
283
260
  }),
284
261
  ...wcfDateField('startTime', a.StartTime),
285
262
  ...wcfDateField('endTime', a.EndTime),
@@ -1 +1 @@
1
- {"version":3,"file":"traffic-service.js","sourceRoot":"","sources":["../../../src/services/traffic/traffic-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"traffic-service.js","sourceRoot":"","sources":["../../../src/services/traffic/traffic-service.ts"],"names":[],"mappings":"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"}
@@ -43,7 +43,10 @@ export interface MountainPass {
43
43
  travelAdvisoryActive?: boolean;
44
44
  weatherCondition?: string;
45
45
  }
46
- /** Raw roadway location from upstream API. */
46
+ /**
47
+ * Raw roadway location from upstream API. An unpopulated location (the end point of a point alert)
48
+ * arrives with MilePost, Latitude, and Longitude all 0 — placeholders dropped during normalization.
49
+ */
47
50
  export interface RawRoadwayLocation {
48
51
  Direction?: string | null;
49
52
  Latitude?: number | null;
@@ -99,7 +102,9 @@ export interface RawRoadTimePoint {
99
102
  }
100
103
  /** Raw travel time entry from upstream API. */
101
104
  export interface RawTravelTime {
105
+ /** Minutes; WSDOT emits 0 for a corridor it is not measuring (dropped during normalization). */
102
106
  AverageTime?: number | null;
107
+ /** Minutes; WSDOT emits 0 for a corridor it is not measuring (dropped during normalization). */
103
108
  CurrentTime?: number | null;
104
109
  Description?: string | null;
105
110
  Distance?: number | null;
@@ -117,7 +122,9 @@ export interface RoadTimePoint {
117
122
  }
118
123
  /** Normalized travel time corridor. */
119
124
  export interface TravelTime {
125
+ /** Absent when WSDOT reports no measurement — e.g. a reversible express lane closed this way. */
120
126
  averageTimeInMinutes?: number;
127
+ /** Absent when WSDOT reports no measurement — e.g. a reversible express lane closed this way. */
121
128
  currentTimeInMinutes?: number;
122
129
  description?: string;
123
130
  distanceInMiles?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/traffic/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/traffic/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,qDAAqD;AACrD,MAAM,WAAW,eAAe;IAC9B,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC7C,cAAc,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC7C,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,oBAAoB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC;AAED,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,0CAA0C;AAC1C,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,2CAA2C;AAC3C,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,kBAAkB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,oBAAoB,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,gCAAgC;AAChC,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,eAAe,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oBAAoB,CAAC,EAAE,eAAe,CAAC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,6CAA6C;AAC7C,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC5B,gGAAgG;IAChG,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,gGAAgG;IAChG,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,kCAAkC;AAClC,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,uCAAuC;AACvC,MAAM,WAAW,UAAU;IACzB,iGAAiG;IACjG,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iGAAiG;IACjG,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,4BAA4B;AAC5B,MAAM,WAAW,QAAQ;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,sDAAsD;AACtD,MAAM,WAAW,yBAAyB;IACxC,iFAAiF;IACjF,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,6CAA6C;AAC7C,MAAM,WAAW,iBAAiB;IAChC,sBAAsB,CAAC,EAAE,yBAAyB,GAAG,IAAI,CAAC;IAC1D,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,wGAAwG;IACxG,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE;QACT,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,2DAA2D;AAC3D,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,oCAAoC;AACpC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,yBAAyB;AACzB,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @fileoverview Shared upstream-HTTP handling for the WSDOT Traffic and WSF Ferry services.
3
+ * Owns the three things both services must get identically right: keeping the access code out
4
+ * of every error payload, classifying network/timeout failures, and turning a non-2xx (or an
5
+ * HTML/auth-shaped) response into the `invalid_access_code` / `api_unavailable` contract the
6
+ * tools declare.
7
+ * @module services/wsdot-http
8
+ */
9
+ import type { Context } from '@cyanheads/mcp-ts-core';
10
+ /** Options for {@link assertUpstreamJson}. */
11
+ export interface UpstreamCheck {
12
+ /** Response body, already read as text. */
13
+ body: string;
14
+ /** Request URL with the credential-bearing query string removed. */
15
+ endpoint: string;
16
+ /** The upstream response whose body was read into `body`. */
17
+ response: Response;
18
+ /** Display name of the upstream API, used in error messages. */
19
+ service: string;
20
+ }
21
+ /**
22
+ * Drop the query string — it carries `AccessCode` / `apiaccesscode`. Error payloads, messages,
23
+ * and log fields use this form so the credential never leaves the process.
24
+ */
25
+ export declare function redactUrl(url: string): string;
26
+ /**
27
+ * Fetch `url`, cancelling on `ctx.signal` or after `timeoutMs`.
28
+ *
29
+ * Network rejections are re-thrown as classified `McpError`s carrying only `endpoint`: Bun and
30
+ * Node attach the requested URL — access code and all — to network errors as `error.path`, so the
31
+ * raw rejection is never re-thrown, chained as `cause`, or logged. Only its message survives,
32
+ * scrubbed.
33
+ *
34
+ * @param url - Full request URL including the access code.
35
+ * @param endpoint - The same URL with its query string removed ({@link redactUrl}).
36
+ */
37
+ export declare function fetchUpstream(url: string, endpoint: string, service: string, timeoutMs: number, ctx: Context): Promise<Response>;
38
+ /**
39
+ * Throw unless the response is a JSON success.
40
+ *
41
+ * The body is inspected *before* any status check, because both APIs explain an unregistered
42
+ * access code in the body of a 400: WSDOT Traffic answers `Content-Type: text/html` with
43
+ * `Bad Request`, WSF answers JSON naming the access code. Those become `invalid_access_code`
44
+ * (a server configuration fault, non-retryable); every other non-2xx becomes `api_unavailable`.
45
+ */
46
+ export declare function assertUpstreamJson({ body, endpoint, response, service }: UpstreamCheck, ctx: Context): void;
47
+ //# sourceMappingURL=wsdot-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsdot-http.d.ts","sourceRoot":"","sources":["../../src/services/wsdot-http.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AA6BtD,8CAA8C;AAC9C,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,6DAA6D;IAC7D,QAAQ,EAAE,QAAQ,CAAC;IACnB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG7C;AA0BD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,QAAQ,CAAC,CAwBnB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,aAAa,EACpD,GAAG,EAAE,OAAO,GACX,IAAI,CA8CN"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * @fileoverview Shared upstream-HTTP handling for the WSDOT Traffic and WSF Ferry services.
3
+ * Owns the three things both services must get identically right: keeping the access code out
4
+ * of every error payload, classifying network/timeout failures, and turning a non-2xx (or an
5
+ * HTML/auth-shaped) response into the `invalid_access_code` / `api_unavailable` contract the
6
+ * tools declare.
7
+ * @module services/wsdot-http
8
+ */
9
+ import { configurationError, serviceUnavailable, timeout } from '@cyanheads/mcp-ts-core/errors';
10
+ /** Env var holding the credential both APIs authenticate with. Named in every access-code error. */
11
+ const ACCESS_CODE_ENV = 'WSDOT_ACCESS_CODE';
12
+ /** Where an operator registers for a code. */
13
+ const REGISTRATION_URL = 'https://wsdot.wa.gov/traffic/api/';
14
+ /** Maximum characters of an upstream error body carried into `error.data.body`. */
15
+ const BODY_LIMIT = 300;
16
+ /** Body that opens as an HTML document. */
17
+ const HTML_DOCUMENT = /^\s*<(!DOCTYPE\s+html|html[\s>])/i;
18
+ /** WSF names the credential in its rejection body ("…for a developer Access Code…"). */
19
+ const NAMES_ACCESS_CODE = /access\s*code/i;
20
+ /**
21
+ * `AccessCode=` / `apiaccesscode=` and their value, anywhere in a text blob. Upstream error
22
+ * pages echo the request query string, so any text copied into an error must be scrubbed.
23
+ * The parameter name goes with the value — otherwise an echoed query string reads as the
24
+ * upstream naming the credential as the fault.
25
+ */
26
+ const CREDENTIAL_ASSIGNMENT = /\S*access_?code=[^&\s"'<]*/gi;
27
+ /** Stand-in left where a credential assignment was removed. */
28
+ const REDACTED = '[credential redacted]';
29
+ /**
30
+ * Drop the query string — it carries `AccessCode` / `apiaccesscode`. Error payloads, messages,
31
+ * and log fields use this form so the credential never leaves the process.
32
+ */
33
+ export function redactUrl(url) {
34
+ const query = url.indexOf('?');
35
+ return query === -1 ? url : url.slice(0, query);
36
+ }
37
+ /** Replace any credential assignment inside free text with a placeholder. */
38
+ function scrub(text) {
39
+ return text.replace(CREDENTIAL_ASSIGNMENT, REDACTED);
40
+ }
41
+ /** Cap a scrubbed string. Scrubbing runs first so a truncation can never leave a partial
42
+ * credential behind. */
43
+ function cap(text) {
44
+ return text.length > BODY_LIMIT ? `${text.slice(0, BODY_LIMIT)}…` : text;
45
+ }
46
+ /**
47
+ * Both APIs authenticate solely with the access code, so a 4xx whose body names the access code —
48
+ * how WSF answers an unregistered one — is a credential problem rather than a bad request, as is
49
+ * any 401/403.
50
+ *
51
+ * @param body - The *scrubbed* body: an echoed request query string must not read as the upstream
52
+ * naming the credential as the fault.
53
+ */
54
+ function rejectsAccessCode(status, body) {
55
+ if (status === 401 || status === 403)
56
+ return true;
57
+ return status >= 400 && status < 500 && NAMES_ACCESS_CODE.test(body);
58
+ }
59
+ /**
60
+ * Fetch `url`, cancelling on `ctx.signal` or after `timeoutMs`.
61
+ *
62
+ * Network rejections are re-thrown as classified `McpError`s carrying only `endpoint`: Bun and
63
+ * Node attach the requested URL — access code and all — to network errors as `error.path`, so the
64
+ * raw rejection is never re-thrown, chained as `cause`, or logged. Only its message survives,
65
+ * scrubbed.
66
+ *
67
+ * @param url - Full request URL including the access code.
68
+ * @param endpoint - The same URL with its query string removed ({@link redactUrl}).
69
+ */
70
+ export async function fetchUpstream(url, endpoint, service, timeoutMs, ctx) {
71
+ const signal = ctx.signal.aborted
72
+ ? ctx.signal
73
+ : AbortSignal.any([ctx.signal, AbortSignal.timeout(timeoutMs)]);
74
+ try {
75
+ return await fetch(url, { signal });
76
+ }
77
+ catch (cause) {
78
+ if (ctx.signal.aborted) {
79
+ throw timeout(`${service} request cancelled.`, { url: endpoint });
80
+ }
81
+ const name = cause instanceof Error ? cause.name : '';
82
+ if (name === 'TimeoutError' || name === 'AbortError') {
83
+ throw timeout(`${service} request timed out after ${timeoutMs}ms.`, {
84
+ url: endpoint,
85
+ timeoutMs,
86
+ });
87
+ }
88
+ const detail = scrub(cause instanceof Error ? cause.message : String(cause));
89
+ throw serviceUnavailable(`${service} request failed: ${detail}`, {
90
+ url: endpoint,
91
+ reason: 'api_unavailable',
92
+ ...ctx.recoveryFor('api_unavailable'),
93
+ });
94
+ }
95
+ }
96
+ /**
97
+ * Throw unless the response is a JSON success.
98
+ *
99
+ * The body is inspected *before* any status check, because both APIs explain an unregistered
100
+ * access code in the body of a 400: WSDOT Traffic answers `Content-Type: text/html` with
101
+ * `Bad Request`, WSF answers JSON naming the access code. Those become `invalid_access_code`
102
+ * (a server configuration fault, non-retryable); every other non-2xx becomes `api_unavailable`.
103
+ */
104
+ export function assertUpstreamJson({ body, endpoint, response, service }, ctx) {
105
+ const contentType = response.headers.get('content-type') ?? '';
106
+ const htmlPage = contentType.includes('text/html');
107
+ const htmlBody = HTML_DOCUMENT.test(body);
108
+ // Success bodies are the hot path and can be large — nothing below touches them.
109
+ if (response.ok && !htmlPage && !htmlBody)
110
+ return;
111
+ const scrubbed = scrub(body).trim();
112
+ const snippet = cap(scrubbed);
113
+ const upstream = htmlBody || snippet === '' ? '' : ` Upstream: "${snippet}".`;
114
+ // HTML is how both APIs answer an unregistered access code — WSDOT Traffic pairs it with a 400,
115
+ // and a 2xx login page carries the same meaning. A 5xx HTML page is an outage page: reporting it
116
+ // as a credential fault would blame the operator's config and skip the retry it deserves.
117
+ const htmlAuthPage = response.status < 500 && (htmlPage || htmlBody);
118
+ if (htmlAuthPage || rejectsAccessCode(response.status, scrubbed)) {
119
+ const detail = htmlPage
120
+ ? 'returned an HTML page instead of JSON'
121
+ : htmlBody
122
+ ? 'returned HTML content instead of JSON'
123
+ : `rejected the request with HTTP ${response.status}`;
124
+ throw configurationError(`${service} ${detail} — ${ACCESS_CODE_ENV} is missing, invalid, or not registered.${upstream} Register an access code at ${REGISTRATION_URL} and set ${ACCESS_CODE_ENV}.`, {
125
+ url: endpoint,
126
+ status: response.status,
127
+ body: snippet,
128
+ reason: 'invalid_access_code',
129
+ ...ctx.recoveryFor('invalid_access_code'),
130
+ });
131
+ }
132
+ if (!response.ok) {
133
+ throw serviceUnavailable(`${service} returned HTTP ${response.status}.${upstream}`, {
134
+ url: endpoint,
135
+ status: response.status,
136
+ body: snippet,
137
+ reason: 'api_unavailable',
138
+ ...ctx.recoveryFor('api_unavailable'),
139
+ // 4xx is a client error that won't succeed on retry — mark non-retryable so withRetry
140
+ // fails fast instead of burning all attempts (the data.retryable === false opt-out).
141
+ ...(response.status >= 400 && response.status < 500 && { retryable: false }),
142
+ });
143
+ }
144
+ }
145
+ //# sourceMappingURL=wsdot-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wsdot-http.js","sourceRoot":"","sources":["../../src/services/wsdot-http.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/wsdot-mcp-server",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "Query WA highway conditions, ferry schedules, vessel locations, toll rates, border waits, and alerts via MCP. STDIO or Streamable HTTP.",
5
5
  "mcpName": "io.github.cyanheads/wsdot-mcp-server",
6
6
  "type": "module",
@@ -82,18 +82,18 @@
82
82
  "access": "public"
83
83
  },
84
84
  "dependencies": {
85
- "@cyanheads/mcp-ts-core": "^0.10.14",
85
+ "@cyanheads/mcp-ts-core": "^0.11.0",
86
86
  "pino-pretty": "^13.1.3",
87
87
  "zod": "^4.4.3"
88
88
  },
89
89
  "devDependencies": {
90
- "@biomejs/biome": "^2.5.0",
90
+ "@biomejs/biome": "^2.5.5",
91
91
  "@socketsecurity/bun-security-scanner": "^1.1.2",
92
- "@types/node": "^26.1.1",
92
+ "@types/node": "^26.1.2",
93
93
  "depcheck": "^1.4.7",
94
- "ignore": "^7.0.5",
95
- "tsc-alias": "^1.8.17",
96
- "typescript": "^6.0.3",
97
- "vitest": "^4.1.9"
94
+ "ignore": "^7.0.6",
95
+ "tsc-alias": "^1.9.1",
96
+ "typescript": "^7.0.2",
97
+ "vitest": "^4.1.10"
98
98
  }
99
99
  }
package/server.json CHANGED
@@ -12,14 +12,14 @@
12
12
  "url": "https://wsdot.caseyjhand.com/mcp"
13
13
  }
14
14
  ],
15
- "version": "0.1.13",
15
+ "version": "0.1.15",
16
16
  "packages": [
17
17
  {
18
18
  "registryType": "npm",
19
19
  "registryBaseUrl": "https://registry.npmjs.org",
20
20
  "identifier": "@cyanheads/wsdot-mcp-server",
21
21
  "runtimeHint": "node",
22
- "version": "0.1.13",
22
+ "version": "0.1.15",
23
23
  "packageArguments": [
24
24
  {
25
25
  "type": "positional",
@@ -54,7 +54,7 @@
54
54
  "registryBaseUrl": "https://registry.npmjs.org",
55
55
  "identifier": "@cyanheads/wsdot-mcp-server",
56
56
  "runtimeHint": "node",
57
- "version": "0.1.13",
57
+ "version": "0.1.15",
58
58
  "packageArguments": [
59
59
  {
60
60
  "type": "positional",