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.
- package/LICENSE +21 -0
- package/README.md +68 -0
- package/dist/entry/http.js +78 -0
- package/dist/entry/http.js.map +1 -0
- package/dist/entry/stdio.js +16 -0
- package/dist/entry/stdio.js.map +1 -0
- package/dist/errors.js +30 -0
- package/dist/errors.js.map +1 -0
- package/dist/metrolinx/cache.js +29 -0
- package/dist/metrolinx/cache.js.map +1 -0
- package/dist/metrolinx/client.js +180 -0
- package/dist/metrolinx/client.js.map +1 -0
- package/dist/metrolinx/types.js +5 -0
- package/dist/metrolinx/types.js.map +1 -0
- package/dist/normalize/fares.js +44 -0
- package/dist/normalize/fares.js.map +1 -0
- package/dist/normalize/fleet-consist.js +31 -0
- package/dist/normalize/fleet-consist.js.map +1 -0
- package/dist/normalize/journey.js +184 -0
- package/dist/normalize/journey.js.map +1 -0
- package/dist/normalize/line-schedule.js +56 -0
- package/dist/normalize/line-schedule.js.map +1 -0
- package/dist/normalize/list-lines.js +29 -0
- package/dist/normalize/list-lines.js.map +1 -0
- package/dist/normalize/next-service.js +59 -0
- package/dist/normalize/next-service.js.map +1 -0
- package/dist/normalize/search-stops.js +113 -0
- package/dist/normalize/search-stops.js.map +1 -0
- package/dist/normalize/service-alerts.js +61 -0
- package/dist/normalize/service-alerts.js.map +1 -0
- package/dist/normalize/service-exceptions.js +51 -0
- package/dist/normalize/service-exceptions.js.map +1 -0
- package/dist/normalize/service-guarantee.js +23 -0
- package/dist/normalize/service-guarantee.js.map +1 -0
- package/dist/normalize/stop-destinations.js +54 -0
- package/dist/normalize/stop-destinations.js.map +1 -0
- package/dist/normalize/stop-details.js +44 -0
- package/dist/normalize/stop-details.js.map +1 -0
- package/dist/normalize/trip-status.js +88 -0
- package/dist/normalize/trip-status.js.map +1 -0
- package/dist/normalize/trip-updates.js +113 -0
- package/dist/normalize/trip-updates.js.map +1 -0
- package/dist/normalize/union-departures.js +52 -0
- package/dist/normalize/union-departures.js.map +1 -0
- package/dist/normalize/vehicle-positions.js +67 -0
- package/dist/normalize/vehicle-positions.js.map +1 -0
- package/dist/prompts.js +96 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.js +61 -0
- package/dist/resources.js.map +1 -0
- package/dist/schemas/fares.js +30 -0
- package/dist/schemas/fares.js.map +1 -0
- package/dist/schemas/fleet-consist.js +32 -0
- package/dist/schemas/fleet-consist.js.map +1 -0
- package/dist/schemas/journey.js +127 -0
- package/dist/schemas/journey.js.map +1 -0
- package/dist/schemas/line-schedule.js +43 -0
- package/dist/schemas/line-schedule.js.map +1 -0
- package/dist/schemas/list-lines.js +29 -0
- package/dist/schemas/list-lines.js.map +1 -0
- package/dist/schemas/next-service.js +29 -0
- package/dist/schemas/next-service.js.map +1 -0
- package/dist/schemas/search-stops.js +35 -0
- package/dist/schemas/search-stops.js.map +1 -0
- package/dist/schemas/service-alerts.js +55 -0
- package/dist/schemas/service-alerts.js.map +1 -0
- package/dist/schemas/service-exceptions.js +27 -0
- package/dist/schemas/service-exceptions.js.map +1 -0
- package/dist/schemas/service-guarantee.js +32 -0
- package/dist/schemas/service-guarantee.js.map +1 -0
- package/dist/schemas/stop-destinations.js +32 -0
- package/dist/schemas/stop-destinations.js.map +1 -0
- package/dist/schemas/stop-details.js +27 -0
- package/dist/schemas/stop-details.js.map +1 -0
- package/dist/schemas/trip-status.js +39 -0
- package/dist/schemas/trip-status.js.map +1 -0
- package/dist/schemas/trip-updates.js +51 -0
- package/dist/schemas/trip-updates.js.map +1 -0
- package/dist/schemas/union-departures.js +26 -0
- package/dist/schemas/union-departures.js.map +1 -0
- package/dist/schemas/vehicle-positions.js +48 -0
- package/dist/schemas/vehicle-positions.js.map +1 -0
- package/dist/server.js +58 -0
- package/dist/server.js.map +1 -0
- package/dist/time.js +159 -0
- package/dist/time.js.map +1 -0
- package/dist/tools/get-fares.js +26 -0
- package/dist/tools/get-fares.js.map +1 -0
- package/dist/tools/get-fleet-consist.js +34 -0
- package/dist/tools/get-fleet-consist.js.map +1 -0
- package/dist/tools/get-line-schedule.js +27 -0
- package/dist/tools/get-line-schedule.js.map +1 -0
- package/dist/tools/get-next-service.js +25 -0
- package/dist/tools/get-next-service.js.map +1 -0
- package/dist/tools/get-service-alerts.js +45 -0
- package/dist/tools/get-service-alerts.js.map +1 -0
- package/dist/tools/get-service-exceptions.js +25 -0
- package/dist/tools/get-service-exceptions.js.map +1 -0
- package/dist/tools/get-service-guarantee.js +26 -0
- package/dist/tools/get-service-guarantee.js.map +1 -0
- package/dist/tools/get-stop-destinations.js +28 -0
- package/dist/tools/get-stop-destinations.js.map +1 -0
- package/dist/tools/get-stop-details.js +25 -0
- package/dist/tools/get-stop-details.js.map +1 -0
- package/dist/tools/get-trip-status.js +31 -0
- package/dist/tools/get-trip-status.js.map +1 -0
- package/dist/tools/get-trip-updates.js +26 -0
- package/dist/tools/get-trip-updates.js.map +1 -0
- package/dist/tools/get-union-departures.js +29 -0
- package/dist/tools/get-union-departures.js.map +1 -0
- package/dist/tools/get-vehicle-positions.js +30 -0
- package/dist/tools/get-vehicle-positions.js.map +1 -0
- package/dist/tools/list-lines.js +27 -0
- package/dist/tools/list-lines.js.map +1 -0
- package/dist/tools/plan-journey.js +46 -0
- package/dist/tools/plan-journey.js.map +1 -0
- package/dist/tools/plan-trip.js +81 -0
- package/dist/tools/plan-trip.js.map +1 -0
- package/dist/tools/search-stops.js +25 -0
- package/dist/tools/search-stops.js.map +1 -0
- package/dist/tools/test-support.js +93 -0
- package/dist/tools/test-support.js.map +1 -0
- 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
|
package/dist/time.js.map
ADDED
|
@@ -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"}
|