- name
- hk-bus-eta
- description
- Query Hong Kong bus ETA/stop data and MTR heavy rail ETA from natural-language transport questions using official KMB/LWB, Citybus, and MTR open-data endpoints. Use when the user asks in Cantonese, Chinese, or English things like「74X 幾多分鐘後喺九龍灣有車」「A41 去機場而家幾時到青衣站」「城巴 20 喺啟德幾耐到」「火炭站去金鐘方向幾點有車」「金鐘去北角下一班港島線幾時」or any message that combines a bus route with a stop/place, or an MTR station with a destination/direction/ETA intent.
HK Bus ETA / MTR ETA
Use the bundled script to answer Hong Kong bus route + stop queries and MTR heavy rail station + direction queries quickly and consistently.
Quick start
Run the bundled script from the skill directory:
Bus
Legacy bus invocation still works:
python3 scripts/hk_bus_eta.py <route> <stop-keyword>Equivalent explicit subcommand:
python3 scripts/hk_bus_eta.py bus <route> <stop-keyword>Examples:
python3 scripts/hk_bus_eta.py 74X 九龍灣
python3 scripts/hk_bus_eta.py bus A41 青衣 --operator lwb
python3 scripts/hk_bus_eta.py bus 20 啟德 --operator citybus
python3 scripts/hk_bus_eta.py bus 20 "Kai Tak" --operator citybus --direction outbound
python3 scripts/hk_bus_eta.py bus 74X 九龍灣 --direction outbound
python3 scripts/hk_bus_eta.py bus 74X 九龍灣 --jsonMTR heavy rail
Structured station-to-station query:
python3 scripts/hk_bus_eta.py mtr <origin-station> <destination-station>Natural-language prompt parsing:
python3 scripts/hk_bus_eta.py mtr-text "火炭站去金鐘方向幾點有車"Examples:
python3 scripts/hk_bus_eta.py mtr 火炭 金鐘
python3 scripts/hk_bus_eta.py mtr 火炭 金鐘 --line EAL
python3 scripts/hk_bus_eta.py mtr-text "火炭站去金鐘方向幾點有車"
python3 scripts/hk_bus_eta.py mtr-text "金鐘去北角下一班港島線幾時"
python3 scripts/hk_bus_eta.py mtr-text "荃灣站往中環方向有冇車" --jsonOr use an absolute path rooted at the installed skill folder if needed.
Extraction workflow
A. Bus queries
- Extract the route first.
- Examples: 74X, A41, 20, NA31.
- Extract the stop or area keyword next.
- Accept stop names, stations, estates, landmarks, districts, malls, piers, airports, hospitals, or short area names. - Treat messages like 74X 九龍灣幾耐到, A41 青衣站有冇車, 城巴20啟德幾時到 as route + place queries.
- Infer operator if the user says it explicitly.
- 九巴 → --operator kmb - 龍運 / Long Win → --operator lwb - 城巴 / Citybus → --operator citybus - If the user does not say, default to KMB. If the route obviously looks like a Citybus-only route or the first attempt fails, retry with --operator citybus.
- If the user hints at direction or destination, pass it through.
- 去機場, 往尖沙咀, outbound, 返去 often imply direction disambiguation. - Use --direction outbound or --direction inbound when the user's wording clearly prefers one side.
- Run the bus query.
- If multiple stop matches appear, summarize each clearly with operator, direction, stop name, sequence, and destination.
- Report ETA in natural language, usually in minutes first.
- If no match appears, say so and ask for a more specific stop name, estate, station, or direction.
B. MTR heavy rail queries
- Detect that the prompt is station + destination/direction based, not bus-route based.
- Strong triggers: X站去Y方向, X去Y下一班, 往Y有冇車, X站到Y幾點有車.
- Extract the origin station and target station/direction anchor.
- Examples: - 火炭站去金鐘方向幾點有車 → origin 火炭, target 金鐘 - 金鐘去北角下一班港島線幾時 → origin 金鐘, target 北角, line hint ISL - 荃灣站往中環方向有冇車 → origin 荃灣, target 中環
- If the message names a line, pass it as
--line.
- Common mappings: - 東鐵線 → EAL - 港島線 → ISL - 荃灣線 → TWL - 觀塘線 → KTL - 將軍澳線 → TKL - 屯馬線 → TML - 東涌線 → TCL - 機場快綫 / Airport Express → AEL - 南港島線 → SIL - 迪士尼線 → DRL
- Prefer
mtr-textwhen the user phrased the request naturally and it fits the built-in patterns. - If parsing feels ambiguous, use
mtr <origin> <destination>directly instead of guessing from a messy sentence. - The script resolves line/station mapping from the official MTR lines-and-stations CSV, then filters trains from the official MTR schedule endpoint that actually pass the requested target station.
- If multiple line candidates remain, list them instead of pretending certainty.
Reporting guidance
- Prefer a concise answer like
74X 喺九龍灣下一班大約 3 分鐘後到。or火炭去金鐘方向下一班東鐵線大約 2 分鐘後到,4 號月台。 - If there are multiple likely matches, list them instead of guessing.
- If there is no ETA, say that clearly rather than implying no service.
- Use
--jsononly when structured output is easier for follow-up processing.
Operator / data-source notes
kmb: officialdata.etabus.gov.hkKMB endpoints.lwb: handled through the same KMB-family endpoint structure used by Long Win routes in the KMB dataset.citybus: officialrt.data.gov.hk/v2/transport/citybusendpoints.mtr: officialrt.data.gov.hk/v1/transport/mtr/getSchedule.phpendpoint plus the official MTR lines/stations CSV fromopendata.mtr.com.hk.
Matching behavior
- Bus stop matching is flexible substring/token matching against Traditional Chinese, Simplified Chinese, and English stop names.
- MTR station matching is flexible against Chinese name, English name, and station code.
- For MTR, destination matching is by path logic, not just terminal-code equality: trains are kept only if their displayed destination would carry the passenger past the requested target station on that line.
- If the user gives only a broad area or a very ambiguous station name, refine from the returned candidates.
Scope and limitations
- Bus coverage here remains KMB, Long Win, and Citybus only.
- MTR coverage added here is heavy rail only. Light Rail, buses branded under MTR, and airport/feeder bus services are out of scope.
mtr-texthandles common natural-language forms likeX站去Y方向幾點有車,X去Y下一班, andX往Y有冇車; unusual phrasings may need manual extraction withmtr <origin> <destination>.- Very ambiguous interchange stations or cross-line phrasing may return multiple candidates and need clarification.
- The script does not plan multi-leg journeys; it answers next-train ETA for a specific origin station toward a target station on a line that passes both.
scripts/
scripts/hk_bus_eta.py— query KMB/LWB/Citybus bus ETA, and MTR heavy rail ETA using either structured station arguments or a short natural-language MTR prompt.