go-transit-mcp 0.0.0

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 (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +68 -0
  3. package/dist/entry/http.js +78 -0
  4. package/dist/entry/http.js.map +1 -0
  5. package/dist/entry/stdio.js +16 -0
  6. package/dist/entry/stdio.js.map +1 -0
  7. package/dist/errors.js +30 -0
  8. package/dist/errors.js.map +1 -0
  9. package/dist/metrolinx/cache.js +29 -0
  10. package/dist/metrolinx/cache.js.map +1 -0
  11. package/dist/metrolinx/client.js +180 -0
  12. package/dist/metrolinx/client.js.map +1 -0
  13. package/dist/metrolinx/types.js +5 -0
  14. package/dist/metrolinx/types.js.map +1 -0
  15. package/dist/normalize/fares.js +44 -0
  16. package/dist/normalize/fares.js.map +1 -0
  17. package/dist/normalize/fleet-consist.js +31 -0
  18. package/dist/normalize/fleet-consist.js.map +1 -0
  19. package/dist/normalize/journey.js +184 -0
  20. package/dist/normalize/journey.js.map +1 -0
  21. package/dist/normalize/line-schedule.js +56 -0
  22. package/dist/normalize/line-schedule.js.map +1 -0
  23. package/dist/normalize/list-lines.js +29 -0
  24. package/dist/normalize/list-lines.js.map +1 -0
  25. package/dist/normalize/next-service.js +59 -0
  26. package/dist/normalize/next-service.js.map +1 -0
  27. package/dist/normalize/search-stops.js +113 -0
  28. package/dist/normalize/search-stops.js.map +1 -0
  29. package/dist/normalize/service-alerts.js +61 -0
  30. package/dist/normalize/service-alerts.js.map +1 -0
  31. package/dist/normalize/service-exceptions.js +51 -0
  32. package/dist/normalize/service-exceptions.js.map +1 -0
  33. package/dist/normalize/service-guarantee.js +23 -0
  34. package/dist/normalize/service-guarantee.js.map +1 -0
  35. package/dist/normalize/stop-destinations.js +54 -0
  36. package/dist/normalize/stop-destinations.js.map +1 -0
  37. package/dist/normalize/stop-details.js +44 -0
  38. package/dist/normalize/stop-details.js.map +1 -0
  39. package/dist/normalize/trip-status.js +88 -0
  40. package/dist/normalize/trip-status.js.map +1 -0
  41. package/dist/normalize/trip-updates.js +113 -0
  42. package/dist/normalize/trip-updates.js.map +1 -0
  43. package/dist/normalize/union-departures.js +52 -0
  44. package/dist/normalize/union-departures.js.map +1 -0
  45. package/dist/normalize/vehicle-positions.js +67 -0
  46. package/dist/normalize/vehicle-positions.js.map +1 -0
  47. package/dist/prompts.js +96 -0
  48. package/dist/prompts.js.map +1 -0
  49. package/dist/resources.js +61 -0
  50. package/dist/resources.js.map +1 -0
  51. package/dist/schemas/fares.js +30 -0
  52. package/dist/schemas/fares.js.map +1 -0
  53. package/dist/schemas/fleet-consist.js +32 -0
  54. package/dist/schemas/fleet-consist.js.map +1 -0
  55. package/dist/schemas/journey.js +127 -0
  56. package/dist/schemas/journey.js.map +1 -0
  57. package/dist/schemas/line-schedule.js +43 -0
  58. package/dist/schemas/line-schedule.js.map +1 -0
  59. package/dist/schemas/list-lines.js +29 -0
  60. package/dist/schemas/list-lines.js.map +1 -0
  61. package/dist/schemas/next-service.js +29 -0
  62. package/dist/schemas/next-service.js.map +1 -0
  63. package/dist/schemas/search-stops.js +35 -0
  64. package/dist/schemas/search-stops.js.map +1 -0
  65. package/dist/schemas/service-alerts.js +55 -0
  66. package/dist/schemas/service-alerts.js.map +1 -0
  67. package/dist/schemas/service-exceptions.js +27 -0
  68. package/dist/schemas/service-exceptions.js.map +1 -0
  69. package/dist/schemas/service-guarantee.js +32 -0
  70. package/dist/schemas/service-guarantee.js.map +1 -0
  71. package/dist/schemas/stop-destinations.js +32 -0
  72. package/dist/schemas/stop-destinations.js.map +1 -0
  73. package/dist/schemas/stop-details.js +27 -0
  74. package/dist/schemas/stop-details.js.map +1 -0
  75. package/dist/schemas/trip-status.js +39 -0
  76. package/dist/schemas/trip-status.js.map +1 -0
  77. package/dist/schemas/trip-updates.js +51 -0
  78. package/dist/schemas/trip-updates.js.map +1 -0
  79. package/dist/schemas/union-departures.js +26 -0
  80. package/dist/schemas/union-departures.js.map +1 -0
  81. package/dist/schemas/vehicle-positions.js +48 -0
  82. package/dist/schemas/vehicle-positions.js.map +1 -0
  83. package/dist/server.js +58 -0
  84. package/dist/server.js.map +1 -0
  85. package/dist/time.js +159 -0
  86. package/dist/time.js.map +1 -0
  87. package/dist/tools/get-fares.js +26 -0
  88. package/dist/tools/get-fares.js.map +1 -0
  89. package/dist/tools/get-fleet-consist.js +34 -0
  90. package/dist/tools/get-fleet-consist.js.map +1 -0
  91. package/dist/tools/get-line-schedule.js +27 -0
  92. package/dist/tools/get-line-schedule.js.map +1 -0
  93. package/dist/tools/get-next-service.js +25 -0
  94. package/dist/tools/get-next-service.js.map +1 -0
  95. package/dist/tools/get-service-alerts.js +45 -0
  96. package/dist/tools/get-service-alerts.js.map +1 -0
  97. package/dist/tools/get-service-exceptions.js +25 -0
  98. package/dist/tools/get-service-exceptions.js.map +1 -0
  99. package/dist/tools/get-service-guarantee.js +26 -0
  100. package/dist/tools/get-service-guarantee.js.map +1 -0
  101. package/dist/tools/get-stop-destinations.js +28 -0
  102. package/dist/tools/get-stop-destinations.js.map +1 -0
  103. package/dist/tools/get-stop-details.js +25 -0
  104. package/dist/tools/get-stop-details.js.map +1 -0
  105. package/dist/tools/get-trip-status.js +31 -0
  106. package/dist/tools/get-trip-status.js.map +1 -0
  107. package/dist/tools/get-trip-updates.js +26 -0
  108. package/dist/tools/get-trip-updates.js.map +1 -0
  109. package/dist/tools/get-union-departures.js +29 -0
  110. package/dist/tools/get-union-departures.js.map +1 -0
  111. package/dist/tools/get-vehicle-positions.js +30 -0
  112. package/dist/tools/get-vehicle-positions.js.map +1 -0
  113. package/dist/tools/list-lines.js +27 -0
  114. package/dist/tools/list-lines.js.map +1 -0
  115. package/dist/tools/plan-journey.js +46 -0
  116. package/dist/tools/plan-journey.js.map +1 -0
  117. package/dist/tools/plan-trip.js +81 -0
  118. package/dist/tools/plan-trip.js.map +1 -0
  119. package/dist/tools/search-stops.js +25 -0
  120. package/dist/tools/search-stops.js.map +1 -0
  121. package/dist/tools/test-support.js +93 -0
  122. package/dist/tools/test-support.js.map +1 -0
  123. package/package.json +57 -0
@@ -0,0 +1,51 @@
1
+ import { z } from "zod";
2
+ export const getTripUpdatesInputShape = {
3
+ line_code: z
4
+ .string()
5
+ .min(1)
6
+ .optional()
7
+ .describe("Filter to one line, e.g. 'LW' (Lakeshore West). Valid values from list_lines."),
8
+ trip_number: z
9
+ .string()
10
+ .min(1)
11
+ .optional()
12
+ .describe("Filter to one trip number, e.g. '1026'."),
13
+ stop_code: z
14
+ .string()
15
+ .min(1)
16
+ .optional()
17
+ .describe("Filter to trips with an update at this stop. Obtain via search_stops — do not guess."),
18
+ limit: z
19
+ .number()
20
+ .int()
21
+ .min(1)
22
+ .max(50)
23
+ .optional()
24
+ .describe("Maximum updates to return; defaults to 20, max 50."),
25
+ };
26
+ export const stopUpdateSchema = z.object({
27
+ stop_code: z.string(),
28
+ scheduled_arrival: z.string().optional(),
29
+ expected_arrival: z.string().optional(),
30
+ scheduled_departure: z.string().optional(),
31
+ expected_departure: z.string().optional(),
32
+ status: z.string(),
33
+ });
34
+ export const tripUpdateSchema = z.object({
35
+ trip_number: z.string(),
36
+ line_code: z.string(),
37
+ direction: z.string().optional(),
38
+ status: z.enum(["on_time", "delayed", "cancelled", "modified"]),
39
+ delay_minutes: z.number(),
40
+ stop_updates: z.array(stopUpdateSchema),
41
+ updated_at: z.string(),
42
+ });
43
+ export const tripUpdatesOutputSchema = z.object({
44
+ updates: z.array(tripUpdateSchema),
45
+ truncated: z
46
+ .boolean()
47
+ .describe("True when more updates matched than fit under limit — narrow the filter, don't request more."),
48
+ total_matched: z.number().optional(),
49
+ });
50
+ export const tripUpdatesOutputShape = tripUpdatesOutputSchema.shape;
51
+ //# sourceMappingURL=trip-updates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trip-updates.js","sourceRoot":"","sources":["../../src/schemas/trip-updates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CACP,+EAA+E,CAChF;IACH,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,yCAAyC,CAAC;IACtD,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CACP,sFAAsF,CACvF;IACH,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CAAC,oDAAoD,CAAC;CAClE,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACxC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACvC,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1C,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;CACnB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;IAC/D,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACvC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;IAClC,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,QAAQ,CACP,8FAA8F,CAC/F;IACH,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAMH,MAAM,CAAC,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,KAAK,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ export const getUnionDeparturesInputShape = {
3
+ mode: z
4
+ .enum(["train", "bus", "any"])
5
+ .optional()
6
+ .describe("Filter by service type; defaults to any."),
7
+ };
8
+ export const unionStopSchema = z.object({
9
+ stop_code: z.string(),
10
+ stop_name: z.string(),
11
+ });
12
+ export const unionDepartureSchema = z.object({
13
+ trip_number: z.string(),
14
+ mode: z.enum(["train", "bus"]),
15
+ service: z.string(),
16
+ time: z.string(),
17
+ platform: z.string().optional(),
18
+ stops_served: z.array(unionStopSchema),
19
+ });
20
+ export const unionDeparturesOutputSchema = z.object({
21
+ departures: z.array(unionDepartureSchema),
22
+ truncated: z.boolean(),
23
+ total_matched: z.number().optional(),
24
+ });
25
+ export const unionDeparturesOutputShape = unionDeparturesOutputSchema.shape;
26
+ //# sourceMappingURL=union-departures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"union-departures.js","sourceRoot":"","sources":["../../src/schemas/union-departures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC7B,QAAQ,EAAE;SACV,QAAQ,CAAC,0CAA0C,CAAC;CACxD,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC;IACzC,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAKH,MAAM,CAAC,MAAM,0BAA0B,GAAG,2BAA2B,CAAC,KAAK,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { z } from "zod";
2
+ export const getVehiclePositionsInputShape = {
3
+ mode: z
4
+ .enum(["train", "bus", "upx"])
5
+ .describe("Vehicle mode to query — train, bus, or UPX."),
6
+ line_code: z
7
+ .string()
8
+ .min(1)
9
+ .optional()
10
+ .describe("Filter to one line, e.g. 'LW' (Lakeshore West). Valid values from list_lines."),
11
+ trip_number: z
12
+ .string()
13
+ .min(1)
14
+ .optional()
15
+ .describe("Filter to one trip number, e.g. '1026'."),
16
+ limit: z
17
+ .number()
18
+ .int()
19
+ .min(1)
20
+ .max(50)
21
+ .optional()
22
+ .describe("Maximum vehicles to return; defaults to 20, max 50."),
23
+ };
24
+ export const vehiclePositionSchema = z.object({
25
+ trip_number: z.string(),
26
+ line_code: z.string(),
27
+ mode: z.enum(["train", "bus", "upx"]),
28
+ position: z.object({ lat: z.number(), lon: z.number() }),
29
+ delay_minutes: z.number(),
30
+ occupancy_percent: z
31
+ .number()
32
+ .optional()
33
+ .describe("Populated only when the upstream GTFS-RT feed reports it."),
34
+ next_stop: z
35
+ .object({ stop_code: z.string(), stop_name: z.string() })
36
+ .optional(),
37
+ in_motion: z.boolean(),
38
+ updated_at: z.string(),
39
+ });
40
+ export const vehiclePositionsOutputSchema = z.object({
41
+ vehicles: z.array(vehiclePositionSchema),
42
+ truncated: z
43
+ .boolean()
44
+ .describe("True when more vehicles matched than fit under limit — narrow the filter, don't request more."),
45
+ total_matched: z.number().optional(),
46
+ });
47
+ export const vehiclePositionsOutputShape = vehiclePositionsOutputSchema.shape;
48
+ //# sourceMappingURL=vehicle-positions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vehicle-positions.js","sourceRoot":"","sources":["../../src/schemas/vehicle-positions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,IAAI,EAAE,CAAC;SACJ,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;SAC7B,QAAQ,CAAC,6CAA6C,CAAC;IAC1D,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CACP,+EAA+E,CAChF;IACH,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,QAAQ,CAAC,yCAAyC,CAAC;IACtD,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;SACV,QAAQ,CAAC,qDAAqD,CAAC;CACnE,CAAC;AAEF,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;IACxD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE;IACzB,iBAAiB,EAAE,CAAC;SACjB,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,2DAA2D,CAAC;IACxE,SAAS,EAAE,CAAC;SACT,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;SACxD,QAAQ,EAAE;IACb,SAAS,EAAE,CAAC,CAAC,OAAO,EAAE;IACtB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC;IACxC,SAAS,EAAE,CAAC;SACT,OAAO,EAAE;SACT,QAAQ,CACP,+FAA+F,CAChG;IACH,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACrC,CAAC,CAAC;AAOH,MAAM,CAAC,MAAM,2BAA2B,GAAG,4BAA4B,CAAC,KAAK,CAAC"}
package/dist/server.js ADDED
@@ -0,0 +1,58 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { registerPrompts } from "./prompts.js";
3
+ import { registerResources } from "./resources.js";
4
+ import { registerGetFares } from "./tools/get-fares.js";
5
+ import { registerGetFleetConsist } from "./tools/get-fleet-consist.js";
6
+ import { registerGetLineSchedule } from "./tools/get-line-schedule.js";
7
+ import { registerGetNextService } from "./tools/get-next-service.js";
8
+ import { registerGetServiceAlerts } from "./tools/get-service-alerts.js";
9
+ import { registerGetServiceExceptions } from "./tools/get-service-exceptions.js";
10
+ import { registerGetServiceGuarantee } from "./tools/get-service-guarantee.js";
11
+ import { registerGetStopDestinations } from "./tools/get-stop-destinations.js";
12
+ import { registerGetStopDetails } from "./tools/get-stop-details.js";
13
+ import { registerGetTripStatus } from "./tools/get-trip-status.js";
14
+ import { registerGetTripUpdates } from "./tools/get-trip-updates.js";
15
+ import { registerGetUnionDepartures } from "./tools/get-union-departures.js";
16
+ import { registerGetVehiclePositions } from "./tools/get-vehicle-positions.js";
17
+ import { registerListLines } from "./tools/list-lines.js";
18
+ import { registerPlanJourney } from "./tools/plan-journey.js";
19
+ import { registerPlanTrip } from "./tools/plan-trip.js";
20
+ import { registerSearchStops } from "./tools/search-stops.js";
21
+ export const SERVER_INFO = { name: "go-transit-mcp", version: "0.0.0" };
22
+ /**
23
+ * Registers every tool/resource/prompt onto a server instance. Shared by
24
+ * `buildServer()` and the Vercel adapter (`api/mcp.ts`), which must register
25
+ * onto an `McpServer` that `mcp-handler` constructs itself rather than
26
+ * calling `buildServer()` directly (project-architecture spec §3).
27
+ */
28
+ export function registerTools(server, client) {
29
+ registerGetStopDetails(server, client);
30
+ registerSearchStops(server, client);
31
+ registerGetNextService(server, client);
32
+ registerGetStopDestinations(server, client);
33
+ registerGetFares(server, client);
34
+ registerGetFleetConsist(server, client);
35
+ registerGetServiceAlerts(server, client);
36
+ registerGetServiceExceptions(server, client);
37
+ registerGetServiceGuarantee(server, client);
38
+ registerGetUnionDepartures(server, client);
39
+ registerListLines(server, client);
40
+ registerGetLineSchedule(server, client);
41
+ registerGetTripStatus(server, client);
42
+ registerResources(server, client);
43
+ registerPrompts(server);
44
+ registerGetVehiclePositions(server, client);
45
+ registerGetTripUpdates(server, client);
46
+ registerPlanTrip(server, client);
47
+ registerPlanJourney(server, client);
48
+ }
49
+ /**
50
+ * Transport-agnostic server assembly: the stdio and standalone HTTP entry
51
+ * surfaces call this and only this (project-architecture spec §3).
52
+ */
53
+ export function buildServer(client) {
54
+ const server = new McpServer(SERVER_INFO);
55
+ registerTools(server, client);
56
+ return server;
57
+ }
58
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/dist/time.js ADDED
@@ -0,0 +1,159 @@
1
+ // Toronto clock helpers: Metrolinx sends naive "YYYY-MM-DD HH:MM:SS" strings
2
+ // with no timezone info (confirmed live, tool-schemas spec §5) — treated as
3
+ // America/Toronto wall-clock time throughout the server.
4
+ const TORONTO_TZ = "America/Toronto";
5
+ function pad2(n) {
6
+ return String(n).padStart(2, "0");
7
+ }
8
+ function parseNaiveParts(naive) {
9
+ const match = /^(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/.exec(naive);
10
+ if (!match)
11
+ throw new Error(`Unrecognized Metrolinx timestamp: ${naive}`);
12
+ const [, y, mo, d, h, mi, s] = match;
13
+ return {
14
+ y: Number(y),
15
+ mo: Number(mo),
16
+ d: Number(d),
17
+ h: Number(h),
18
+ mi: Number(mi),
19
+ s: Number(s),
20
+ };
21
+ }
22
+ function offsetMinutesAt(instant, timeZone) {
23
+ const dtf = new Intl.DateTimeFormat("en-US", {
24
+ timeZone,
25
+ hour12: false,
26
+ year: "numeric",
27
+ month: "2-digit",
28
+ day: "2-digit",
29
+ hour: "2-digit",
30
+ minute: "2-digit",
31
+ second: "2-digit",
32
+ });
33
+ const parts = Object.fromEntries(dtf.formatToParts(instant).map((p) => [p.type, p.value]));
34
+ // Some locales render midnight as "24" for 2-digit hour12:false formats.
35
+ const hour = parts.hour === "24" ? "00" : parts.hour;
36
+ const asUtc = Date.UTC(Number(parts.year), Number(parts.month) - 1, Number(parts.day), Number(hour), Number(parts.minute), Number(parts.second));
37
+ return (asUtc - instant.getTime()) / 60_000;
38
+ }
39
+ function formatOffset(minutes) {
40
+ const sign = minutes < 0 ? "-" : "+";
41
+ const abs = Math.abs(minutes);
42
+ return `${sign}${pad2(Math.floor(abs / 60))}:${pad2(abs % 60)}`;
43
+ }
44
+ /**
45
+ * Converts a naive Metrolinx "YYYY-MM-DD HH:MM:SS" Toronto wall-clock string
46
+ * into full ISO 8601 with the DST-aware offset attached.
47
+ *
48
+ * The offset is resolved by treating the naive components as a UTC instant
49
+ * guess and reading Toronto's actual offset near that instant — correct
50
+ * except inside the ~1h DST-transition window itself, an accepted starting
51
+ * heuristic (same spirit as the arrive_by heuristic, tool-schemas spec §5).
52
+ */
53
+ export function toIsoWithTorontoOffset(naive) {
54
+ const { y, mo, d, h, mi, s } = parseNaiveParts(naive);
55
+ const guessUtc = new Date(Date.UTC(y, mo - 1, d, h, mi, s));
56
+ const offset = offsetMinutesAt(guessUtc, TORONTO_TZ);
57
+ return `${String(y).padStart(4, "0")}-${pad2(mo)}-${pad2(d)}T${pad2(h)}:${pad2(mi)}:${pad2(s)}${formatOffset(offset)}`;
58
+ }
59
+ /**
60
+ * Converts a GTFS-RT Unix epoch (seconds) into full ISO 8601 with the
61
+ * DST-aware Toronto offset attached (tool-schemas spec §1.3: "GTFS-RT Unix
62
+ * epochs are converted").
63
+ */
64
+ export function toIsoFromEpochSeconds(epochSeconds) {
65
+ const instant = new Date(epochSeconds * 1000);
66
+ const dtf = new Intl.DateTimeFormat("en-US", {
67
+ timeZone: TORONTO_TZ,
68
+ hour12: false,
69
+ year: "numeric",
70
+ month: "2-digit",
71
+ day: "2-digit",
72
+ hour: "2-digit",
73
+ minute: "2-digit",
74
+ second: "2-digit",
75
+ });
76
+ const parts = Object.fromEntries(dtf.formatToParts(instant).map((p) => [p.type, p.value]));
77
+ const hour = parts.hour === "24" ? "00" : parts.hour;
78
+ const offset = offsetMinutesAt(instant, TORONTO_TZ);
79
+ return `${parts.year}-${parts.month}-${parts.day}T${hour}:${parts.minute}:${parts.second}${formatOffset(offset)}`;
80
+ }
81
+ /** Minutes between two naive same-timezone Metrolinx timestamps (later − earlier). */
82
+ export function diffMinutes(laterNaive, earlierNaive) {
83
+ const a = parseNaiveParts(laterNaive);
84
+ const b = parseNaiveParts(earlierNaive);
85
+ const aMs = Date.UTC(a.y, a.mo - 1, a.d, a.h, a.mi, a.s);
86
+ const bMs = Date.UTC(b.y, b.mo - 1, b.d, b.h, b.mi, b.s);
87
+ return Math.round((aMs - bMs) / 60_000);
88
+ }
89
+ /** Current Toronto-local date and time, for input parameters that default to "now". */
90
+ export function nowInToronto() {
91
+ const dtf = new Intl.DateTimeFormat("en-CA", {
92
+ timeZone: TORONTO_TZ,
93
+ hour12: false,
94
+ year: "numeric",
95
+ month: "2-digit",
96
+ day: "2-digit",
97
+ hour: "2-digit",
98
+ minute: "2-digit",
99
+ });
100
+ const parts = Object.fromEntries(dtf.formatToParts(new Date()).map((p) => [p.type, p.value]));
101
+ const hour = parts.hour === "24" ? "00" : parts.hour;
102
+ return {
103
+ date: `${parts.year}-${parts.month}-${parts.day}`,
104
+ time: `${hour}:${parts.minute}`,
105
+ };
106
+ }
107
+ /** Adds (or subtracts) hours to an "HH:MM" time, wrapping within a 24h day. */
108
+ export function addHoursToTime(time, hours) {
109
+ const match = /^(\d{2}):(\d{2})$/.exec(time);
110
+ if (!match)
111
+ throw new Error(`Unrecognized HH:MM time: ${time}`);
112
+ const [, hh, mm] = match;
113
+ const minutesInDay = 24 * 60;
114
+ const total = (Number(hh) * 60 + Number(mm) + hours * 60 + minutesInDay * 100) %
115
+ minutesInDay;
116
+ return `${pad2(Math.floor(total / 60))}:${pad2(total % 60)}`;
117
+ }
118
+ /** "HH:MM" -> Metrolinx's "HHmm" wire format. */
119
+ export function hhmmToWire(time) {
120
+ return time.replace(":", "");
121
+ }
122
+ /** "YYYY-MM-DD" -> Metrolinx's "yyyymmdd" wire format. */
123
+ export function dateToWire(date) {
124
+ return date.replaceAll("-", "");
125
+ }
126
+ /**
127
+ * Combines an operational-day date with a bare "HH:MM" wall-clock time
128
+ * (Schedule/Trip sends times with no date component at all — confirmed
129
+ * live, unlike Schedule/Line's full naive datetimes) into full ISO 8601
130
+ * with the Toronto offset. HH may exceed 23 for a stop past midnight on
131
+ * the same service day (e.g. "24:27" = 00:27 the next calendar day) — the
132
+ * same past-midnight convention documented for Schedule/Line, just without
133
+ * a date pre-attached for us.
134
+ *
135
+ * Confirmed live (issue #8 follow-up): Metrolinx doesn't apply this
136
+ * wraparound consistently — on one captured overnight trip, most
137
+ * past-midnight stops were still sent as "00:MM" rather than "24:MM"+, and
138
+ * only the very last stop used the wraparound. There is no reliable signal
139
+ * in the payload to distinguish an under-wrapped post-midnight stop from a
140
+ * stop genuinely early on the requested day, so this function takes HH
141
+ * literally (only >=24 rolls forward) — a known upstream data quirk, not
142
+ * something correctable from the fields alone.
143
+ */
144
+ export function combineDateAndHhmm(date, hhmm) {
145
+ const match = /^(\d{1,2}):(\d{2})$/.exec(hhmm);
146
+ if (!match)
147
+ throw new Error(`Unrecognized Metrolinx HH:MM time: ${hhmm}`);
148
+ const [, hh, mm] = match;
149
+ const totalMinutes = Number(hh) * 60 + Number(mm);
150
+ const minutesInDay = 24 * 60;
151
+ const dayOffset = Math.floor(totalMinutes / minutesInDay);
152
+ const hour = Math.floor((totalMinutes % minutesInDay) / 60);
153
+ const minute = totalMinutes % 60;
154
+ const [y, mo, d] = date.split("-").map(Number);
155
+ const rolled = new Date(Date.UTC(y ?? 0, (mo ?? 1) - 1, (d ?? 1) + dayOffset));
156
+ const rolledDate = `${String(rolled.getUTCFullYear()).padStart(4, "0")}-${pad2(rolled.getUTCMonth() + 1)}-${pad2(rolled.getUTCDate())}`;
157
+ return toIsoWithTorontoOffset(`${rolledDate} ${pad2(hour)}:${pad2(minute)}:00`);
158
+ }
159
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { MetrolinxError, toToolErrorResult } from "../errors.js";
2
+ import { normalizeFares } from "../normalize/fares.js";
3
+ import { faresOutputShape, getFaresInputShape } from "../schemas/fares.js";
4
+ import { dateToWire } from "../time.js";
5
+ export function registerGetFares(server, client) {
6
+ server.registerTool("get_fares", {
7
+ title: "Get fares",
8
+ description: "Fare rows (rider type, payment method, amount) between two GO Transit stops, flattened from Metrolinx's category/ticket nesting.",
9
+ inputSchema: getFaresInputShape,
10
+ outputSchema: faresOutputShape,
11
+ }, async ({ from_stop_code, to_stop_code, date }) => {
12
+ try {
13
+ const dto = normalizeFares(await client.getFares(from_stop_code, to_stop_code, date ? dateToWire(date) : undefined));
14
+ return {
15
+ content: [{ type: "text", text: JSON.stringify(dto) }],
16
+ structuredContent: dto,
17
+ };
18
+ }
19
+ catch (error) {
20
+ if (error instanceof MetrolinxError)
21
+ return toToolErrorResult(error);
22
+ throw error;
23
+ }
24
+ });
25
+ }
26
+ //# sourceMappingURL=get-fares.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-fares.js","sourceRoot":"","sources":["../../src/tools/get-fares.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,gBAAgB,CAC9B,MAAiB,EACjB,MAAuB;IAEvB,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,kIAAkI;QACpI,WAAW,EAAE,kBAAkB;QAC/B,YAAY,EAAE,gBAAgB;KAC/B,EACD,KAAK,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE,EAA2B,EAAE;QACxE,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,cAAc,CACxB,MAAM,MAAM,CAAC,QAAQ,CACnB,cAAc,EACd,YAAY,EACZ,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CACpC,CACF,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,iBAAiB,EAAE,GAAG;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,cAAc;gBAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACrE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,34 @@
1
+ import { MetrolinxError, toToolErrorResult } from "../errors.js";
2
+ import { findConsistByTrip, firstConsist, normalizeFleetConsist, } from "../normalize/fleet-consist.js";
3
+ import { fleetConsistOutputShape, getFleetConsistInputShape, } from "../schemas/fleet-consist.js";
4
+ export function registerGetFleetConsist(server, client) {
5
+ server.registerTool("get_fleet_consist", {
6
+ title: "Get fleet consist",
7
+ description: "The physical car makeup of a GO train, looked up by trip number (via the fleet feed's remaining-trip data) or engine number.",
8
+ inputSchema: getFleetConsistInputShape,
9
+ outputSchema: fleetConsistOutputShape,
10
+ }, async ({ trip_number, engine_number }) => {
11
+ try {
12
+ if (Boolean(trip_number) === Boolean(engine_number)) {
13
+ throw new MetrolinxError("invalid_input", "Provide exactly one of trip_number or engine_number, not both or neither.", false);
14
+ }
15
+ const consist = engine_number
16
+ ? firstConsist(await client.getFleetConsistByEngine(engine_number))
17
+ : findConsistByTrip(await client.getFleetConsistAll(), trip_number);
18
+ if (!consist) {
19
+ throw new MetrolinxError("not_found", "No consist found for that trip/engine number. Verify via get_trip_status or get_vehicle_positions.", false);
20
+ }
21
+ const dto = normalizeFleetConsist(consist);
22
+ return {
23
+ content: [{ type: "text", text: JSON.stringify(dto) }],
24
+ structuredContent: dto,
25
+ };
26
+ }
27
+ catch (error) {
28
+ if (error instanceof MetrolinxError)
29
+ return toToolErrorResult(error);
30
+ throw error;
31
+ }
32
+ });
33
+ }
34
+ //# sourceMappingURL=get-fleet-consist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-fleet-consist.js","sourceRoot":"","sources":["../../src/tools/get-fleet-consist.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,6BAA6B,CAAC;AAErC,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,MAAuB;IAEvB,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,8HAA8H;QAChI,WAAW,EAAE,yBAAyB;QACtC,YAAY,EAAE,uBAAuB;KACtC,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,aAAa,EAAE,EAA2B,EAAE;QAChE,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;gBACpD,MAAM,IAAI,cAAc,CACtB,eAAe,EACf,2EAA2E,EAC3E,KAAK,CACN,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,aAAa;gBAC3B,CAAC,CAAC,YAAY,CAAC,MAAM,MAAM,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;gBACnE,CAAC,CAAC,iBAAiB,CAAC,MAAM,MAAM,CAAC,kBAAkB,EAAE,EAAE,WAAY,CAAC,CAAC;YAEvE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,cAAc,CACtB,WAAW,EACX,oGAAoG,EACpG,KAAK,CACN,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,iBAAiB,EAAE,GAAG;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,cAAc;gBAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACrE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { MetrolinxError, toToolErrorResult } from "../errors.js";
2
+ import { normalizeLineSchedule } from "../normalize/line-schedule.js";
3
+ import { getLineScheduleInputShape, lineScheduleOutputShape, } from "../schemas/line-schedule.js";
4
+ import { dateToWire, nowInToronto } from "../time.js";
5
+ export function registerGetLineSchedule(server, client) {
6
+ server.registerTool("get_line_schedule", {
7
+ title: "Get line schedule",
8
+ description: "A GO Transit line's published schedule for a service day. Without stop_code, trip summaries only (first/last stop) to avoid dumping every stop of every trip; with stop_code, times at that stop.",
9
+ inputSchema: getLineScheduleInputShape,
10
+ outputSchema: lineScheduleOutputShape,
11
+ }, async ({ line_code, direction, date, stop_code, }) => {
12
+ try {
13
+ const dateWire = dateToWire(date ?? nowInToronto().date);
14
+ const dto = normalizeLineSchedule(await client.getLineSchedule(dateWire, line_code, direction), stop_code);
15
+ return {
16
+ content: [{ type: "text", text: JSON.stringify(dto) }],
17
+ structuredContent: dto,
18
+ };
19
+ }
20
+ catch (error) {
21
+ if (error instanceof MetrolinxError)
22
+ return toToolErrorResult(error);
23
+ throw error;
24
+ }
25
+ });
26
+ }
27
+ //# sourceMappingURL=get-line-schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-line-schedule.js","sourceRoot":"","sources":["../../src/tools/get-line-schedule.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,MAAuB;IAEvB,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,mMAAmM;QACrM,WAAW,EAAE,yBAAyB;QACtC,YAAY,EAAE,uBAAuB;KACtC,EACD,KAAK,EAAE,EACL,SAAS,EACT,SAAS,EACT,IAAI,EACJ,SAAS,GACV,EAA2B,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,IAAI,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,GAAG,GAAG,qBAAqB,CAC/B,MAAM,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC,EAC5D,SAAS,CACV,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,iBAAiB,EAAE,GAAG;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,cAAc;gBAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACrE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { MetrolinxError, toToolErrorResult } from "../errors.js";
2
+ import { normalizeNextService } from "../normalize/next-service.js";
3
+ import { getNextServiceInputShape, nextServiceOutputShape, } from "../schemas/next-service.js";
4
+ export function registerGetNextService(server, client) {
5
+ server.registerTool("get_next_service", {
6
+ title: "Get next service",
7
+ description: "Live upcoming departures for one GO Transit stop, with delay and status.",
8
+ inputSchema: getNextServiceInputShape,
9
+ outputSchema: nextServiceOutputShape,
10
+ }, async ({ stop_code }) => {
11
+ try {
12
+ const dto = normalizeNextService(await client.getNextService(stop_code));
13
+ return {
14
+ content: [{ type: "text", text: JSON.stringify(dto) }],
15
+ structuredContent: dto,
16
+ };
17
+ }
18
+ catch (error) {
19
+ if (error instanceof MetrolinxError)
20
+ return toToolErrorResult(error);
21
+ throw error;
22
+ }
23
+ });
24
+ }
25
+ //# sourceMappingURL=get-next-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-next-service.js","sourceRoot":"","sources":["../../src/tools/get-next-service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EACL,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,UAAU,sBAAsB,CACpC,MAAiB,EACjB,MAAuB;IAEvB,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,KAAK,EAAE,kBAAkB;QACzB,WAAW,EACT,0EAA0E;QAC5E,WAAW,EAAE,wBAAwB;QACrC,YAAY,EAAE,sBAAsB;KACrC,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,EAA2B,EAAE;QAC/C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,oBAAoB,CAC9B,MAAM,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CACvC,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,iBAAiB,EAAE,GAAG;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,cAAc;gBAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACrE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { MetrolinxError, toToolErrorResult } from "../errors.js";
2
+ import { normalizeServiceAlerts } from "../normalize/service-alerts.js";
3
+ import { getServiceAlertsInputShape, serviceAlertsOutputShape, } from "../schemas/service-alerts.js";
4
+ async function fetchFeed(client, category) {
5
+ const raw = category === "service"
6
+ ? await client.getServiceAlerts()
7
+ : category === "information"
8
+ ? await client.getInformationAlerts()
9
+ : await client.getMarketingAlerts();
10
+ return { category, raw };
11
+ }
12
+ export function registerGetServiceAlerts(server, client) {
13
+ server.registerTool("get_service_alerts", {
14
+ title: "Get service alerts",
15
+ description: "Folded GO Transit service/information/marketing alerts. Defaults to service + information; pass category: 'marketing' to opt into promos.",
16
+ inputSchema: getServiceAlertsInputShape,
17
+ outputSchema: serviceAlertsOutputShape,
18
+ }, async ({ line, stop, category, lang, limit }) => {
19
+ try {
20
+ // Default when category is omitted: service + information —
21
+ // marketing is opt-in only (tool-schemas spec §2.8). Only fetch the
22
+ // upstream feed(s) actually in scope.
23
+ const categories = category
24
+ ? [category]
25
+ : ["service", "information"];
26
+ const feeds = await Promise.all(categories.map((c) => fetchFeed(client, c)));
27
+ const dto = normalizeServiceAlerts(feeds, {
28
+ ...(line !== undefined ? { line } : {}),
29
+ ...(stop !== undefined ? { stop } : {}),
30
+ ...(limit !== undefined ? { limit } : {}),
31
+ ...(lang !== undefined ? { lang } : {}),
32
+ });
33
+ return {
34
+ content: [{ type: "text", text: JSON.stringify(dto) }],
35
+ structuredContent: dto,
36
+ };
37
+ }
38
+ catch (error) {
39
+ if (error instanceof MetrolinxError)
40
+ return toToolErrorResult(error);
41
+ throw error;
42
+ }
43
+ });
44
+ }
45
+ //# sourceMappingURL=get-service-alerts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-service-alerts.js","sourceRoot":"","sources":["../../src/tools/get-service-alerts.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,8BAA8B,CAAC;AAEtC,KAAK,UAAU,SAAS,CACtB,MAAuB,EACvB,QAA2B;IAE3B,MAAM,GAAG,GACP,QAAQ,KAAK,SAAS;QACpB,CAAC,CAAC,MAAM,MAAM,CAAC,gBAAgB,EAAE;QACjC,CAAC,CAAC,QAAQ,KAAK,aAAa;YAC1B,CAAC,CAAC,MAAM,MAAM,CAAC,oBAAoB,EAAE;YACrC,CAAC,CAAC,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;IAC1C,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,MAAiB,EACjB,MAAuB;IAEvB,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACT,2IAA2I;QAC7I,WAAW,EAAE,0BAA0B;QACvC,YAAY,EAAE,wBAAwB;KACvC,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,EAA2B,EAAE;QACvE,IAAI,CAAC;YACH,4DAA4D;YAC5D,oEAAoE;YACpE,sCAAsC;YACtC,MAAM,UAAU,GAAwB,QAAQ;gBAC9C,CAAC,CAAC,CAAC,QAAQ,CAAC;gBACZ,CAAC,CAAC,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAC/B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAC5C,CAAC;YACF,MAAM,GAAG,GAAG,sBAAsB,CAAC,KAAK,EAAE;gBACxC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACxC,CAAC,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,iBAAiB,EAAE,GAAG;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,cAAc;gBAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACrE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { MetrolinxError, toToolErrorResult } from "../errors.js";
2
+ import { normalizeServiceExceptions } from "../normalize/service-exceptions.js";
3
+ import { getServiceExceptionsInputShape, serviceExceptionsOutputShape, } from "../schemas/service-exceptions.js";
4
+ export function registerGetServiceExceptions(server, client) {
5
+ server.registerTool("get_service_exceptions", {
6
+ title: "Get service exceptions",
7
+ description: "Today's schedule exceptions — cancelled trips and stops — for GO Transit.",
8
+ inputSchema: getServiceExceptionsInputShape,
9
+ outputSchema: serviceExceptionsOutputShape,
10
+ }, async ({ mode }) => {
11
+ try {
12
+ const dto = normalizeServiceExceptions(await client.getServiceExceptions(mode ?? "any"));
13
+ return {
14
+ content: [{ type: "text", text: JSON.stringify(dto) }],
15
+ structuredContent: dto,
16
+ };
17
+ }
18
+ catch (error) {
19
+ if (error instanceof MetrolinxError)
20
+ return toToolErrorResult(error);
21
+ throw error;
22
+ }
23
+ });
24
+ }
25
+ //# sourceMappingURL=get-service-exceptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-service-exceptions.js","sourceRoot":"","sources":["../../src/tools/get-service-exceptions.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oCAAoC,CAAC;AAChF,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,GAC7B,MAAM,kCAAkC,CAAC;AAE1C,MAAM,UAAU,4BAA4B,CAC1C,MAAiB,EACjB,MAAuB;IAEvB,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,KAAK,EAAE,wBAAwB;QAC/B,WAAW,EACT,2EAA2E;QAC7E,WAAW,EAAE,8BAA8B;QAC3C,YAAY,EAAE,4BAA4B;KAC3C,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,EAA2B,EAAE;QAC1C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,0BAA0B,CACpC,MAAM,MAAM,CAAC,oBAAoB,CAAC,IAAI,IAAI,KAAK,CAAC,CACjD,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,iBAAiB,EAAE,GAAG;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,cAAc;gBAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACrE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { MetrolinxError, toToolErrorResult } from "../errors.js";
2
+ import { normalizeServiceGuarantee } from "../normalize/service-guarantee.js";
3
+ import { getServiceGuaranteeInputShape, serviceGuaranteeOutputShape, } from "../schemas/service-guarantee.js";
4
+ import { dateToWire } from "../time.js";
5
+ export function registerGetServiceGuarantee(server, client) {
6
+ server.registerTool("get_service_guarantee", {
7
+ title: "Get service guarantee",
8
+ description: "Service guarantee eligibility for a past GO Transit trip.",
9
+ inputSchema: getServiceGuaranteeInputShape,
10
+ outputSchema: serviceGuaranteeOutputShape,
11
+ }, async ({ trip_number, date, lang }) => {
12
+ try {
13
+ const dto = normalizeServiceGuarantee(await client.getServiceGuarantee(trip_number, dateToWire(date)), lang ?? "en");
14
+ return {
15
+ content: [{ type: "text", text: JSON.stringify(dto) }],
16
+ structuredContent: dto,
17
+ };
18
+ }
19
+ catch (error) {
20
+ if (error instanceof MetrolinxError)
21
+ return toToolErrorResult(error);
22
+ throw error;
23
+ }
24
+ });
25
+ }
26
+ //# sourceMappingURL=get-service-guarantee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-service-guarantee.js","sourceRoot":"","sources":["../../src/tools/get-service-guarantee.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EACL,6BAA6B,EAC7B,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,UAAU,2BAA2B,CACzC,MAAiB,EACjB,MAAuB;IAEvB,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,2DAA2D;QACxE,WAAW,EAAE,6BAA6B;QAC1C,YAAY,EAAE,2BAA2B;KAC1C,EACD,KAAK,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,EAA2B,EAAE;QAC7D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,yBAAyB,CACnC,MAAM,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,EAC/D,IAAI,IAAI,IAAI,CACb,CAAC;YACF,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtD,iBAAiB,EAAE,GAAG;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,cAAc;gBAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACrE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}