@cyanheads/wsdot-mcp-server 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.
Files changed (85) hide show
  1. package/CLAUDE.md +343 -0
  2. package/Dockerfile +99 -0
  3. package/LICENSE +201 -0
  4. package/README.md +364 -0
  5. package/changelog/0.1.x/0.1.0.md +24 -0
  6. package/changelog/0.1.x/0.1.1.md +26 -0
  7. package/changelog/template.md +119 -0
  8. package/dist/config/server-config.d.ts +12 -0
  9. package/dist/config/server-config.d.ts.map +1 -0
  10. package/dist/config/server-config.js +19 -0
  11. package/dist/config/server-config.js.map +1 -0
  12. package/dist/index.d.ts +7 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +33 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/mcp-server/tools/definitions/get-border-waits.tool.d.ts +28 -0
  17. package/dist/mcp-server/tools/definitions/get-border-waits.tool.d.ts.map +1 -0
  18. package/dist/mcp-server/tools/definitions/get-border-waits.tool.js +83 -0
  19. package/dist/mcp-server/tools/definitions/get-border-waits.tool.js.map +1 -0
  20. package/dist/mcp-server/tools/definitions/get-ferry-alerts.tool.d.ts +22 -0
  21. package/dist/mcp-server/tools/definitions/get-ferry-alerts.tool.d.ts.map +1 -0
  22. package/dist/mcp-server/tools/definitions/get-ferry-alerts.tool.js +67 -0
  23. package/dist/mcp-server/tools/definitions/get-ferry-alerts.tool.js.map +1 -0
  24. package/dist/mcp-server/tools/definitions/get-ferry-routes.tool.d.ts +33 -0
  25. package/dist/mcp-server/tools/definitions/get-ferry-routes.tool.d.ts.map +1 -0
  26. package/dist/mcp-server/tools/definitions/get-ferry-routes.tool.js +95 -0
  27. package/dist/mcp-server/tools/definitions/get-ferry-routes.tool.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/get-ferry-schedule.tool.d.ts +41 -0
  29. package/dist/mcp-server/tools/definitions/get-ferry-schedule.tool.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/get-ferry-schedule.tool.js +117 -0
  31. package/dist/mcp-server/tools/definitions/get-ferry-schedule.tool.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/get-ferry-terminals.tool.d.ts +23 -0
  33. package/dist/mcp-server/tools/definitions/get-ferry-terminals.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/get-ferry-terminals.tool.js +56 -0
  35. package/dist/mcp-server/tools/definitions/get-ferry-terminals.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/get-mountain-passes.tool.d.ts +35 -0
  37. package/dist/mcp-server/tools/definitions/get-mountain-passes.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/get-mountain-passes.tool.js +116 -0
  39. package/dist/mcp-server/tools/definitions/get-mountain-passes.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/get-terminal-space.tool.d.ts +32 -0
  41. package/dist/mcp-server/tools/definitions/get-terminal-space.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/get-terminal-space.tool.js +118 -0
  43. package/dist/mcp-server/tools/definitions/get-terminal-space.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/get-toll-rates.tool.d.ts +29 -0
  45. package/dist/mcp-server/tools/definitions/get-toll-rates.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/get-toll-rates.tool.js +85 -0
  47. package/dist/mcp-server/tools/definitions/get-toll-rates.tool.js.map +1 -0
  48. package/dist/mcp-server/tools/definitions/get-travel-times.tool.d.ts +38 -0
  49. package/dist/mcp-server/tools/definitions/get-travel-times.tool.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/definitions/get-travel-times.tool.js +141 -0
  51. package/dist/mcp-server/tools/definitions/get-travel-times.tool.js.map +1 -0
  52. package/dist/mcp-server/tools/definitions/get-vessel-locations.tool.d.ts +35 -0
  53. package/dist/mcp-server/tools/definitions/get-vessel-locations.tool.d.ts.map +1 -0
  54. package/dist/mcp-server/tools/definitions/get-vessel-locations.tool.js +120 -0
  55. package/dist/mcp-server/tools/definitions/get-vessel-locations.tool.js.map +1 -0
  56. package/dist/mcp-server/tools/definitions/index.d.ts +17 -0
  57. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  58. package/dist/mcp-server/tools/definitions/index.js +17 -0
  59. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  60. package/dist/mcp-server/tools/definitions/search-alerts.tool.d.ts +48 -0
  61. package/dist/mcp-server/tools/definitions/search-alerts.tool.d.ts.map +1 -0
  62. package/dist/mcp-server/tools/definitions/search-alerts.tool.js +155 -0
  63. package/dist/mcp-server/tools/definitions/search-alerts.tool.js.map +1 -0
  64. package/dist/mcp-server/tools/definitions/search-cameras.tool.d.ts +36 -0
  65. package/dist/mcp-server/tools/definitions/search-cameras.tool.d.ts.map +1 -0
  66. package/dist/mcp-server/tools/definitions/search-cameras.tool.js +116 -0
  67. package/dist/mcp-server/tools/definitions/search-cameras.tool.js.map +1 -0
  68. package/dist/services/ferry/ferry-service.d.ts +28 -0
  69. package/dist/services/ferry/ferry-service.d.ts.map +1 -0
  70. package/dist/services/ferry/ferry-service.js +222 -0
  71. package/dist/services/ferry/ferry-service.js.map +1 -0
  72. package/dist/services/ferry/types.d.ts +183 -0
  73. package/dist/services/ferry/types.d.ts.map +1 -0
  74. package/dist/services/ferry/types.js +6 -0
  75. package/dist/services/ferry/types.js.map +1 -0
  76. package/dist/services/traffic/traffic-service.d.ts +37 -0
  77. package/dist/services/traffic/traffic-service.d.ts.map +1 -0
  78. package/dist/services/traffic/traffic-service.js +290 -0
  79. package/dist/services/traffic/traffic-service.js.map +1 -0
  80. package/dist/services/traffic/types.d.ts +247 -0
  81. package/dist/services/traffic/types.d.ts.map +1 -0
  82. package/dist/services/traffic/types.js +6 -0
  83. package/dist/services/traffic/types.js.map +1 -0
  84. package/package.json +89 -0
  85. package/server.json +111 -0
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @fileoverview Tool to fetch Canada border crossing wait times from the WSDOT Traffic API.
3
+ * @module mcp-server/tools/definitions/get-border-waits.tool
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ import { getTrafficApiService } from '../../../services/traffic/traffic-service.js';
8
+ export const getBorderWaits = tool('wsdot_get_border_waits', {
9
+ title: 'Get Border Wait Times',
10
+ description: 'Returns current vehicle wait times at all WA/Canada land border crossings: ' +
11
+ 'Peace Arch (Blaine), Pacific Highway (Blaine), Sumas, Lynden, Oroville, and others. ' +
12
+ 'Wait times are in minutes. Use for "how long is the border wait?" questions.',
13
+ annotations: { readOnlyHint: true },
14
+ input: z.object({}),
15
+ output: z.object({
16
+ crossings: z
17
+ .array(z
18
+ .object({
19
+ crossingName: z.string().optional().describe('Name of the border crossing.'),
20
+ waitTimeInMinutes: z
21
+ .number()
22
+ .optional()
23
+ .describe('Current vehicle wait time in minutes.'),
24
+ updateTime: z.string().optional().describe('When this wait time was last updated.'),
25
+ location: z
26
+ .object({
27
+ roadName: z.string().optional().describe('Road serving the crossing.'),
28
+ direction: z.string().optional().describe('Travel direction.'),
29
+ milePost: z.number().optional().describe('Milepost of the crossing.'),
30
+ latitude: z.number().optional().describe('Latitude of the crossing.'),
31
+ longitude: z.number().optional().describe('Longitude of the crossing.'),
32
+ })
33
+ .optional()
34
+ .describe('Geographic location of the crossing.'),
35
+ })
36
+ .describe('Wait time data for one border crossing.'))
37
+ .describe('All WA/Canada border crossing wait times.'),
38
+ totalCount: z.number().describe('Total number of crossings returned.'),
39
+ }),
40
+ errors: [
41
+ {
42
+ reason: 'api_unavailable',
43
+ code: JsonRpcErrorCode.ServiceUnavailable,
44
+ when: 'WSDOT Traffic API is unreachable or returns a non-2xx response after retries.',
45
+ retryable: true,
46
+ recovery: 'Retry in 30 seconds. If the issue persists, check wsdot.wa.gov for service status.',
47
+ },
48
+ ],
49
+ async handler(_input, ctx) {
50
+ const crossings = await getTrafficApiService().getBorderCrossings(ctx);
51
+ ctx.log.info('Border crossings fetched', { count: crossings.length });
52
+ return { crossings, totalCount: crossings.length };
53
+ },
54
+ format: (result) => {
55
+ if (result.crossings.length === 0) {
56
+ return [{ type: 'text', text: 'No border crossing data available. **Total:** 0' }];
57
+ }
58
+ const lines = [`## WA/Canada Border Wait Times (${result.totalCount} crossings)\n`];
59
+ for (const c of result.crossings) {
60
+ lines.push(`### ${c.crossingName ?? 'Border Crossing'}`);
61
+ if (c.waitTimeInMinutes != null) {
62
+ lines.push(`**Wait:** ${c.waitTimeInMinutes} min`);
63
+ }
64
+ else {
65
+ lines.push('**Wait:** Not available');
66
+ }
67
+ if (c.location?.roadName)
68
+ lines.push(`**Road:** ${c.location.roadName}`);
69
+ if (c.location?.direction)
70
+ lines.push(`**Direction:** ${c.location.direction}`);
71
+ if (c.location?.milePost != null)
72
+ lines.push(`**Milepost:** ${c.location.milePost}`);
73
+ if (c.location?.latitude != null && c.location.longitude != null) {
74
+ lines.push(`**Coords:** ${c.location.latitude}, ${c.location.longitude}`);
75
+ }
76
+ if (c.updateTime)
77
+ lines.push(`**Updated:** ${c.updateTime}`);
78
+ lines.push('');
79
+ }
80
+ return [{ type: 'text', text: lines.join('\n') }];
81
+ },
82
+ });
83
+ //# sourceMappingURL=get-border-waits.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-border-waits.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-border-waits.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @fileoverview Tool to fetch active WSF ferry service alerts and disruptions.
3
+ * @module mcp-server/tools/definitions/get-ferry-alerts.tool
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ export declare const getFerryAlerts: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
8
+ alerts: z.ZodArray<z.ZodObject<{
9
+ alertId: z.ZodOptional<z.ZodNumber>;
10
+ alertDescription: z.ZodOptional<z.ZodString>;
11
+ impactedRouteIds: z.ZodArray<z.ZodNumber>;
12
+ publishDate: z.ZodOptional<z.ZodString>;
13
+ }, z.core.$strip>>;
14
+ totalCount: z.ZodNumber;
15
+ }, z.core.$strip>, readonly [{
16
+ readonly reason: "api_unavailable";
17
+ readonly code: JsonRpcErrorCode.ServiceUnavailable;
18
+ readonly when: "WSF Ferry API is unreachable or returns a non-2xx response after retries.";
19
+ readonly retryable: true;
20
+ readonly recovery: "Retry in 30 seconds. If the issue persists, check wsdot.wa.gov/ferries for service status.";
21
+ }]>;
22
+ //# sourceMappingURL=get-ferry-alerts.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-ferry-alerts.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-ferry-alerts.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;GAmEzB,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @fileoverview Tool to fetch active WSF ferry service alerts and disruptions.
3
+ * @module mcp-server/tools/definitions/get-ferry-alerts.tool
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ import { getFerryApiService } from '../../../services/ferry/ferry-service.js';
8
+ export const getFerryAlerts = tool('wsdot_get_ferry_alerts', {
9
+ title: 'Get Ferry Alerts',
10
+ description: 'Returns active WSF ferry service disruptions, delays, and bulletins. ' +
11
+ 'Each alert includes impacted route IDs — cross-reference with wsdot_get_ferry_routes ' +
12
+ 'to resolve route IDs to human-readable route names.',
13
+ annotations: { readOnlyHint: true },
14
+ input: z.object({}),
15
+ output: z.object({
16
+ alerts: z
17
+ .array(z
18
+ .object({
19
+ alertId: z.number().optional().describe('Unique alert identifier.'),
20
+ alertDescription: z
21
+ .string()
22
+ .optional()
23
+ .describe('Description of the alert or disruption.'),
24
+ impactedRouteIds: z
25
+ .array(z.number())
26
+ .describe('Route IDs affected by this alert. Cross-reference with wsdot_get_ferry_routes to get route names.'),
27
+ publishDate: z.string().optional().describe('When the alert was published (ISO 8601).'),
28
+ })
29
+ .describe('A WSF ferry service alert or disruption.'))
30
+ .describe('Active ferry service alerts and disruptions.'),
31
+ totalCount: z.number().describe('Total number of active alerts.'),
32
+ }),
33
+ errors: [
34
+ {
35
+ reason: 'api_unavailable',
36
+ code: JsonRpcErrorCode.ServiceUnavailable,
37
+ when: 'WSF Ferry API is unreachable or returns a non-2xx response after retries.',
38
+ retryable: true,
39
+ recovery: 'Retry in 30 seconds. If the issue persists, check wsdot.wa.gov/ferries for service status.',
40
+ },
41
+ ],
42
+ async handler(_input, ctx) {
43
+ const alerts = await getFerryApiService().getAlerts(ctx);
44
+ ctx.log.info('Ferry alerts fetched', { count: alerts.length });
45
+ return { alerts, totalCount: alerts.length };
46
+ },
47
+ format: (result) => {
48
+ if (result.alerts.length === 0) {
49
+ return [{ type: 'text', text: 'No active ferry alerts. **Total:** 0' }];
50
+ }
51
+ const lines = [`## Active Ferry Alerts (${result.totalCount})\n`];
52
+ for (const a of result.alerts) {
53
+ const id = a.alertId != null ? ` #${a.alertId}` : '';
54
+ lines.push(`### Alert${id}`);
55
+ if (a.alertDescription)
56
+ lines.push(a.alertDescription);
57
+ if (a.impactedRouteIds.length > 0) {
58
+ lines.push(`**Impacted Route IDs:** ${a.impactedRouteIds.join(', ')} (use wsdot_get_ferry_routes to look up names)`);
59
+ }
60
+ if (a.publishDate)
61
+ lines.push(`**Published:** ${a.publishDate}`);
62
+ lines.push('');
63
+ }
64
+ return [{ type: 'text', text: lines.join('\n') }];
65
+ },
66
+ });
67
+ //# sourceMappingURL=get-ferry-alerts.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-ferry-alerts.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-ferry-alerts.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * @fileoverview Tool to list all WSF ferry routes operating on a given date.
3
+ * @module mcp-server/tools/definitions/get-ferry-routes.tool
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ export declare const getFerryRoutes: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
8
+ tripDate: z.ZodOptional<z.ZodString>;
9
+ }, z.core.$strip>, z.ZodObject<{
10
+ routes: z.ZodArray<z.ZodObject<{
11
+ routeId: z.ZodOptional<z.ZodNumber>;
12
+ routeName: z.ZodOptional<z.ZodString>;
13
+ crossingTimeInMinutes: z.ZodOptional<z.ZodNumber>;
14
+ departingTerminalId: z.ZodOptional<z.ZodNumber>;
15
+ departingTerminalName: z.ZodOptional<z.ZodString>;
16
+ arrivingTerminalId: z.ZodOptional<z.ZodNumber>;
17
+ arrivingTerminalName: z.ZodOptional<z.ZodString>;
18
+ }, z.core.$strip>>;
19
+ tripDate: z.ZodString;
20
+ totalCount: z.ZodNumber;
21
+ }, z.core.$strip>, readonly [{
22
+ readonly reason: "api_unavailable";
23
+ readonly code: JsonRpcErrorCode.ServiceUnavailable;
24
+ readonly when: "WSF Ferry API is unreachable or returns a non-2xx response after retries.";
25
+ readonly retryable: true;
26
+ readonly recovery: "Retry in 30 seconds. If the issue persists, check wsdot.wa.gov/ferries for service status.";
27
+ }, {
28
+ readonly reason: "invalid_date";
29
+ readonly code: JsonRpcErrorCode.InvalidParams;
30
+ readonly when: "The provided tripDate is not a valid ISO 8601 date.";
31
+ readonly recovery: "Provide a valid date in YYYY-MM-DD format, such as 2026-05-23.";
32
+ }]>;
33
+ //# sourceMappingURL=get-ferry-routes.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-ferry-routes.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-ferry-routes.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;GAmGzB,CAAC"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * @fileoverview Tool to list all WSF ferry routes operating on a given date.
3
+ * @module mcp-server/tools/definitions/get-ferry-routes.tool
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ import { FerryApiService, getFerryApiService } from '../../../services/ferry/ferry-service.js';
8
+ export const getFerryRoutes = tool('wsdot_get_ferry_routes', {
9
+ title: 'Get Ferry Routes',
10
+ description: 'Returns all WSF ferry routes operating on a given date, including terminal ID pairs and crossing times. ' +
11
+ 'Use this to discover which routes are running and to get the terminal IDs needed for ' +
12
+ 'wsdot_get_ferry_schedule and wsdot_get_terminal_space. Route IDs also correspond to ' +
13
+ 'impactedRouteIds in ferry alerts from wsdot_get_ferry_alerts.',
14
+ annotations: { readOnlyHint: true },
15
+ input: z.object({
16
+ tripDate: z
17
+ .string()
18
+ .optional()
19
+ .describe('Date for which to list routes, in ISO 8601 format (YYYY-MM-DD). ' +
20
+ 'Defaults to today if omitted.'),
21
+ }),
22
+ output: z.object({
23
+ routes: z
24
+ .array(z
25
+ .object({
26
+ routeId: z
27
+ .number()
28
+ .optional()
29
+ .describe('Numeric route identifier. Corresponds to impactedRouteIds in ferry alerts.'),
30
+ routeName: z
31
+ .string()
32
+ .optional()
33
+ .describe('Route name (e.g. "Seattle/Bainbridge Island").'),
34
+ crossingTimeInMinutes: z
35
+ .number()
36
+ .optional()
37
+ .describe('Typical crossing time in minutes.'),
38
+ departingTerminalId: z
39
+ .number()
40
+ .optional()
41
+ .describe('Departing terminal ID for use in schedule and space lookups.'),
42
+ departingTerminalName: z.string().optional().describe('Departing terminal name.'),
43
+ arrivingTerminalId: z.number().optional().describe('Arriving terminal ID.'),
44
+ arrivingTerminalName: z.string().optional().describe('Arriving terminal name.'),
45
+ })
46
+ .describe('A WSF ferry route operating on the requested date.'))
47
+ .describe('Ferry routes operating on the requested date.'),
48
+ tripDate: z.string().describe('Date for which routes were retrieved (ISO 8601).'),
49
+ totalCount: z.number().describe('Total number of routes returned.'),
50
+ }),
51
+ errors: [
52
+ {
53
+ reason: 'api_unavailable',
54
+ code: JsonRpcErrorCode.ServiceUnavailable,
55
+ when: 'WSF Ferry API is unreachable or returns a non-2xx response after retries.',
56
+ retryable: true,
57
+ recovery: 'Retry in 30 seconds. If the issue persists, check wsdot.wa.gov/ferries for service status.',
58
+ },
59
+ {
60
+ reason: 'invalid_date',
61
+ code: JsonRpcErrorCode.InvalidParams,
62
+ when: 'The provided tripDate is not a valid ISO 8601 date.',
63
+ recovery: 'Provide a valid date in YYYY-MM-DD format, such as 2026-05-23.',
64
+ },
65
+ ],
66
+ async handler(input, ctx) {
67
+ const tripDate = input.tripDate?.trim()
68
+ ? FerryApiService.toFerryDate(input.tripDate.trim())
69
+ : FerryApiService.todayFerryDate();
70
+ const routes = await getFerryApiService().getRoutes(tripDate, ctx);
71
+ ctx.log.info('Ferry routes fetched', { tripDate, count: routes.length });
72
+ return { routes, tripDate, totalCount: routes.length };
73
+ },
74
+ format: (result) => {
75
+ const lines = [
76
+ `## WSF Ferry Routes — ${result.tripDate} (${result.totalCount} routes)\n`,
77
+ ];
78
+ for (const r of result.routes) {
79
+ const name = r.routeName ?? 'Unknown route';
80
+ const crossing = r.crossingTimeInMinutes != null ? ` | ~${r.crossingTimeInMinutes} min` : '';
81
+ lines.push(`### ${name}${crossing}`);
82
+ if (r.departingTerminalId != null) {
83
+ lines.push(`**Departing:** ${r.departingTerminalName ?? ''} (ID: ${r.departingTerminalId})`);
84
+ }
85
+ if (r.arrivingTerminalId != null) {
86
+ lines.push(`**Arriving:** ${r.arrivingTerminalName ?? ''} (ID: ${r.arrivingTerminalId})`);
87
+ }
88
+ if (r.routeId != null)
89
+ lines.push(`**Route ID:** ${r.routeId}`);
90
+ lines.push('');
91
+ }
92
+ return [{ type: 'text', text: lines.join('\n') }];
93
+ },
94
+ });
95
+ //# sourceMappingURL=get-ferry-routes.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-ferry-routes.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-ferry-routes.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @fileoverview Tool to fetch departure times for a specific WSF ferry route.
3
+ * @module mcp-server/tools/definitions/get-ferry-schedule.tool
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ export declare const getFerrySchedule: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
8
+ departingTerminalId: z.ZodNumber;
9
+ arrivingTerminalId: z.ZodNumber;
10
+ tripDate: z.ZodOptional<z.ZodString>;
11
+ remainingOnly: z.ZodOptional<z.ZodBoolean>;
12
+ }, z.core.$strip>, z.ZodObject<{
13
+ departingTerminalName: z.ZodOptional<z.ZodString>;
14
+ arrivingTerminalName: z.ZodOptional<z.ZodString>;
15
+ tripDate: z.ZodString;
16
+ remainingOnly: z.ZodBoolean;
17
+ sailings: z.ZodArray<z.ZodObject<{
18
+ departureTime: z.ZodOptional<z.ZodString>;
19
+ arrivalTime: z.ZodOptional<z.ZodString>;
20
+ isCancelled: z.ZodOptional<z.ZodBoolean>;
21
+ vesselName: z.ZodOptional<z.ZodString>;
22
+ }, z.core.$strip>>;
23
+ totalSailings: z.ZodNumber;
24
+ }, z.core.$strip>, readonly [{
25
+ readonly reason: "api_unavailable";
26
+ readonly code: JsonRpcErrorCode.ServiceUnavailable;
27
+ readonly when: "WSF Ferry API is unreachable or returns a non-2xx response after retries.";
28
+ readonly retryable: true;
29
+ readonly recovery: "Retry in 30 seconds. If the issue persists, check wsdot.wa.gov/ferries for service status.";
30
+ }, {
31
+ readonly reason: "invalid_terminal_pair";
32
+ readonly code: JsonRpcErrorCode.InvalidParams;
33
+ readonly when: "The terminal ID pair is invalid or does not form a valid ferry route.";
34
+ readonly recovery: "Use wsdot_get_ferry_terminals to list valid terminal IDs and wsdot_get_ferry_routes to find valid pairs.";
35
+ }, {
36
+ readonly reason: "invalid_date";
37
+ readonly code: JsonRpcErrorCode.InvalidParams;
38
+ readonly when: "The provided tripDate is not a valid ISO 8601 date.";
39
+ readonly recovery: "Provide a valid date in YYYY-MM-DD format, such as 2026-05-23.";
40
+ }]>;
41
+ //# sourceMappingURL=get-ferry-schedule.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-ferry-schedule.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-ferry-schedule.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgI3B,CAAC"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * @fileoverview Tool to fetch departure times for a specific WSF ferry route.
3
+ * @module mcp-server/tools/definitions/get-ferry-schedule.tool
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ import { FerryApiService, getFerryApiService } from '../../../services/ferry/ferry-service.js';
8
+ export const getFerrySchedule = tool('wsdot_get_ferry_schedule', {
9
+ title: 'Get Ferry Schedule',
10
+ description: 'Returns departure times for a specific WSF ferry route on a given date. ' +
11
+ 'Requires numeric terminal IDs — use wsdot_get_ferry_terminals to resolve terminal names to IDs. ' +
12
+ 'Set remainingOnly to true to show only future departures for today (useful for "next ferry" queries). ' +
13
+ 'For future dates, all sailings for that day are returned.',
14
+ annotations: { readOnlyHint: true },
15
+ input: z.object({
16
+ departingTerminalId: z
17
+ .number()
18
+ .describe('Numeric ID of the departing terminal. Use wsdot_get_ferry_terminals to look up terminal IDs.'),
19
+ arrivingTerminalId: z.number().describe('Numeric ID of the arriving terminal.'),
20
+ tripDate: z
21
+ .string()
22
+ .optional()
23
+ .describe('Date in ISO 8601 format (YYYY-MM-DD). Defaults to today if omitted.'),
24
+ remainingOnly: z
25
+ .boolean()
26
+ .optional()
27
+ .describe('When true, returns only future sailings for today. Ignored for future dates. Default: false.'),
28
+ }),
29
+ output: z.object({
30
+ departingTerminalName: z.string().optional().describe('Departing terminal name.'),
31
+ arrivingTerminalName: z.string().optional().describe('Arriving terminal name.'),
32
+ tripDate: z.string().describe('Date of the schedule (ISO 8601).'),
33
+ remainingOnly: z.boolean().describe('Whether the result shows only remaining sailings.'),
34
+ sailings: z
35
+ .array(z
36
+ .object({
37
+ departureTime: z.string().optional().describe('Scheduled departure time.'),
38
+ arrivalTime: z.string().optional().describe('Scheduled arrival time.'),
39
+ isCancelled: z.boolean().optional().describe('Whether this sailing is cancelled.'),
40
+ vesselName: z.string().optional().describe('Vessel assigned to this sailing.'),
41
+ })
42
+ .describe('One scheduled sailing with departure time and vessel assignment.'))
43
+ .describe('Scheduled sailings for this route and date.'),
44
+ totalSailings: z.number().describe('Total number of sailings returned.'),
45
+ }),
46
+ errors: [
47
+ {
48
+ reason: 'api_unavailable',
49
+ code: JsonRpcErrorCode.ServiceUnavailable,
50
+ when: 'WSF Ferry API is unreachable or returns a non-2xx response after retries.',
51
+ retryable: true,
52
+ recovery: 'Retry in 30 seconds. If the issue persists, check wsdot.wa.gov/ferries for service status.',
53
+ },
54
+ {
55
+ reason: 'invalid_terminal_pair',
56
+ code: JsonRpcErrorCode.InvalidParams,
57
+ when: 'The terminal ID pair is invalid or does not form a valid ferry route.',
58
+ recovery: 'Use wsdot_get_ferry_terminals to list valid terminal IDs and wsdot_get_ferry_routes to find valid pairs.',
59
+ },
60
+ {
61
+ reason: 'invalid_date',
62
+ code: JsonRpcErrorCode.InvalidParams,
63
+ when: 'The provided tripDate is not a valid ISO 8601 date.',
64
+ recovery: 'Provide a valid date in YYYY-MM-DD format, such as 2026-05-23.',
65
+ },
66
+ ],
67
+ async handler(input, ctx) {
68
+ const tripDate = input.tripDate?.trim()
69
+ ? FerryApiService.toFerryDate(input.tripDate.trim())
70
+ : FerryApiService.todayFerryDate();
71
+ const remainingOnly = input.remainingOnly ?? false;
72
+ const schedule = await getFerryApiService().getSchedule(input.departingTerminalId, input.arrivingTerminalId, tripDate, remainingOnly, ctx);
73
+ ctx.log.info('Ferry schedule fetched', {
74
+ departingTerminalId: input.departingTerminalId,
75
+ arrivingTerminalId: input.arrivingTerminalId,
76
+ tripDate,
77
+ sailingsCount: schedule.sailings.length,
78
+ });
79
+ return {
80
+ departingTerminalName: schedule.departingTerminalName,
81
+ arrivingTerminalName: schedule.arrivingTerminalName,
82
+ tripDate,
83
+ remainingOnly,
84
+ sailings: schedule.sailings,
85
+ totalSailings: schedule.sailings.length,
86
+ };
87
+ },
88
+ format: (result) => {
89
+ const route = result.departingTerminalName && result.arrivingTerminalName
90
+ ? `${result.departingTerminalName} → ${result.arrivingTerminalName}`
91
+ : 'Ferry Schedule';
92
+ const remainingNote = result.remainingOnly ? ' (remaining today)' : '';
93
+ const lines = [
94
+ `## Ferry Schedule — ${route}`,
95
+ `**Date:** ${result.tripDate}${remainingNote} | **Sailings:** ${result.totalSailings}`,
96
+ ];
97
+ if (result.departingTerminalName)
98
+ lines.push(`**From:** ${result.departingTerminalName}`);
99
+ if (result.arrivingTerminalName)
100
+ lines.push(`**To:** ${result.arrivingTerminalName}`);
101
+ lines.push('');
102
+ if (result.sailings.length === 0) {
103
+ lines.push('No sailings found for this route and date.');
104
+ }
105
+ else {
106
+ for (const s of result.sailings) {
107
+ const cancelled = s.isCancelled ? ' ~~CANCELLED~~' : '';
108
+ const dep = s.departureTime ?? 'Unknown';
109
+ const arr = s.arrivalTime ? ` → ${s.arrivalTime}` : '';
110
+ const vessel = s.vesselName ? ` | ${s.vesselName}` : '';
111
+ lines.push(`- ${dep}${arr}${vessel}${cancelled}`);
112
+ }
113
+ }
114
+ return [{ type: 'text', text: lines.join('\n') }];
115
+ },
116
+ });
117
+ //# sourceMappingURL=get-ferry-schedule.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-ferry-schedule.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-ferry-schedule.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @fileoverview Tool to list all WSF ferry terminals with their numeric IDs.
3
+ * @module mcp-server/tools/definitions/get-ferry-terminals.tool
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ export declare const getFerryTerminals: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
8
+ terminals: z.ZodArray<z.ZodObject<{
9
+ terminalId: z.ZodNumber;
10
+ terminalName: z.ZodString;
11
+ terminalAbbrev: z.ZodOptional<z.ZodString>;
12
+ latitude: z.ZodOptional<z.ZodNumber>;
13
+ longitude: z.ZodOptional<z.ZodNumber>;
14
+ }, z.core.$strip>>;
15
+ totalCount: z.ZodNumber;
16
+ }, z.core.$strip>, readonly [{
17
+ readonly reason: "api_unavailable";
18
+ readonly code: JsonRpcErrorCode.ServiceUnavailable;
19
+ readonly when: "WSF Ferry API is unreachable or returns a non-2xx response after retries.";
20
+ readonly retryable: true;
21
+ readonly recovery: "Retry in 30 seconds. If the issue persists, check wsdot.wa.gov/ferries for service status.";
22
+ }]>;
23
+ //# sourceMappingURL=get-ferry-terminals.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-ferry-terminals.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-ferry-terminals.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;GAuD5B,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @fileoverview Tool to list all WSF ferry terminals with their numeric IDs.
3
+ * @module mcp-server/tools/definitions/get-ferry-terminals.tool
4
+ */
5
+ import { tool, z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ import { getFerryApiService } from '../../../services/ferry/ferry-service.js';
8
+ export const getFerryTerminals = tool('wsdot_get_ferry_terminals', {
9
+ title: 'Get Ferry Terminals',
10
+ description: 'Returns all WSF ferry terminals with their numeric IDs, names, and abbreviations. ' +
11
+ 'Call this first to resolve human-readable terminal names (e.g. "Bainbridge Island", ' +
12
+ '"Seattle", "Kingston") to the numeric terminal IDs required by the schedule and space tools. ' +
13
+ 'The terminal list is small (~22 terminals) and rarely changes.',
14
+ annotations: { readOnlyHint: true },
15
+ input: z.object({}),
16
+ output: z.object({
17
+ terminals: z
18
+ .array(z
19
+ .object({
20
+ terminalId: z
21
+ .number()
22
+ .describe('Numeric terminal ID used in schedule and space API calls.'),
23
+ terminalName: z.string().describe('Full terminal name (e.g. "Bainbridge Island").'),
24
+ terminalAbbrev: z.string().optional().describe('Short abbreviation (e.g. "BI").'),
25
+ latitude: z.number().optional().describe('Terminal latitude.'),
26
+ longitude: z.number().optional().describe('Terminal longitude.'),
27
+ })
28
+ .describe('A WSF ferry terminal with its ID and location.'))
29
+ .describe('All WSF ferry terminals.'),
30
+ totalCount: z.number().describe('Total number of terminals.'),
31
+ }),
32
+ errors: [
33
+ {
34
+ reason: 'api_unavailable',
35
+ code: JsonRpcErrorCode.ServiceUnavailable,
36
+ when: 'WSF Ferry API is unreachable or returns a non-2xx response after retries.',
37
+ retryable: true,
38
+ recovery: 'Retry in 30 seconds. If the issue persists, check wsdot.wa.gov/ferries for service status.',
39
+ },
40
+ ],
41
+ async handler(_input, ctx) {
42
+ const terminals = await getFerryApiService().getTerminals(ctx);
43
+ ctx.log.info('Ferry terminals fetched', { count: terminals.length });
44
+ return { terminals, totalCount: terminals.length };
45
+ },
46
+ format: (result) => {
47
+ const lines = [`## WSF Ferry Terminals (${result.totalCount})\n`];
48
+ for (const t of result.terminals) {
49
+ const abbrev = t.terminalAbbrev ? ` (${t.terminalAbbrev})` : '';
50
+ const coords = t.latitude != null && t.longitude != null ? ` | ${t.latitude}, ${t.longitude}` : '';
51
+ lines.push(`- **${t.terminalName}**${abbrev} — ID: ${t.terminalId}${coords}`);
52
+ }
53
+ return [{ type: 'text', text: lines.join('\n') }];
54
+ },
55
+ });
56
+ //# sourceMappingURL=get-ferry-terminals.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-ferry-terminals.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-ferry-terminals.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @fileoverview Tool to fetch all WA mountain pass conditions from the WSDOT Traffic API.
3
+ * @module mcp-server/tools/definitions/get-mountain-passes.tool
4
+ */
5
+ import { z } from '@cyanheads/mcp-ts-core';
6
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
7
+ export declare const getMountainPasses: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{}, z.core.$strip>, z.ZodObject<{
8
+ passes: z.ZodArray<z.ZodObject<{
9
+ mountainPassId: z.ZodNumber;
10
+ mountainPassName: z.ZodString;
11
+ elevation: z.ZodOptional<z.ZodNumber>;
12
+ temperatureInFahrenheit: z.ZodOptional<z.ZodNumber>;
13
+ weatherCondition: z.ZodOptional<z.ZodString>;
14
+ roadCondition: z.ZodOptional<z.ZodString>;
15
+ travelAdvisoryActive: z.ZodOptional<z.ZodBoolean>;
16
+ restrictionOne: z.ZodOptional<z.ZodObject<{
17
+ comment: z.ZodOptional<z.ZodString>;
18
+ type: z.ZodOptional<z.ZodString>;
19
+ }, z.core.$strip>>;
20
+ restrictionTwo: z.ZodOptional<z.ZodObject<{
21
+ comment: z.ZodOptional<z.ZodString>;
22
+ type: z.ZodOptional<z.ZodString>;
23
+ }, z.core.$strip>>;
24
+ dateUpdated: z.ZodOptional<z.ZodString>;
25
+ latitude: z.ZodOptional<z.ZodNumber>;
26
+ longitude: z.ZodOptional<z.ZodNumber>;
27
+ }, z.core.$strip>>;
28
+ }, z.core.$strip>, readonly [{
29
+ readonly reason: "api_unavailable";
30
+ readonly code: JsonRpcErrorCode.ServiceUnavailable;
31
+ readonly when: "WSDOT Traffic API is unreachable or returns a non-2xx response after retries.";
32
+ readonly retryable: true;
33
+ readonly recovery: "Retry in 30 seconds. If the issue persists, check wsdot.wa.gov for service status.";
34
+ }]>;
35
+ //# sourceMappingURL=get-mountain-passes.tool.d.ts.map