mcpField
S
scandinavia-transit

scandinavia-transit

github.com/borskiその他78069 回インストール2 日前に更新
リポジトリ

scandinavia-transit について

scandinavia-transit は、旅行計画向けにノルウェー、スウェーデン、デンマークの地上交通を検索するスキルです。各国の交通 API を利用して経路や時刻を調べられ、デンマークでは運賃情報も確認できます。

主な機能

  1. 01ノルウェーの経路・時刻検索
  2. 02スウェーデンの経路・時刻検索
  3. 03デンマークの経路・時刻検索
  4. 04停留所・場所の検索
  5. 05デンマークの運賃・ゾーン情報

活用シーン

  1. 01オスロからベルゲンへの移動計画
  2. 02スウェーデンの都市間列車の検索
  3. 03デンマークの駅の出発便確認
  4. 04デンマークの経路と運賃ゾーンの確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/borski/travel-hacking-toolkit --skill scandinavia-transit

インストール後、Claude Code で/scandinavia-transitを入力して読み込まれたか確認します。

詳細

スカンジナビア交通機関スキル

ノルウェー、スウェーデン、デンマークの国内交通機関 API を使用して、鉄道、バス、フェリーを検索します。

データソース:

ノルウェー:Entur(Journey Planner v3)

オープンな GraphQL API です。キーは不要ですが、クライアント名ヘッダーが必要です。ノルウェー全土の交通機関(Vy の列車、バス、フェリー、路面電車、地下鉄)を網羅しています。事業者は 60 社以上です。

経路検索(オスロからベルゲンの例)
curl -s -X POST "https://api.entur.io/journey-planner/v3/graphql" \
  -H "Content-Type: application/json" \
  -H "ET-Client-Name: $ENTUR_CLIENT_NAME" \
  -d '{"query": "{ trip(from: {place: \"NSR:StopPlace:59872\"}, to: {place: \"NSR:StopPlace:548\"}, numTripPatterns: 5) { tripPatterns { startTime duration legs { mode expectedStartTime expectedEndTime fromPlace { name } toPlace { name } line { publicCode name authority { name } } } } } }"}' | jq '.data.trip.tripPatterns[] | {start: .startTime, duration_min: (.duration / 60), legs: [.legs[] | {mode: .mode, from: .fromPlace.name, to: .toPlace.name, line: .line.publicCode, operator: .line.authority.name, depart: .expectedStartTime, arrive: .expectedEndTime}]}'
停留所 ID の検索

停留所 ID の形式は NSR:StopPlace:XXXXX です。ジオコーダーで検索できます。

curl -s "https://api.entur.io/geocoder/v1/autocomplete?text=Oslo%20S&size=3" \
  -H "ET-Client-Name: $ENTUR_CLIENT_NAME" | jq '[.features[] | {name: .properties.name, id: .properties.id, type: .properties.layer}]'
主な停留所 ID
都市停留所 ID名称
Oslo SNSR:StopPlace:59872Oslo S
BergenNSR:StopPlace:548Bergen stasjon
StavangerNSR:StopPlace:4130Stavanger
TrondheimNSR:StopPlace:41742Trondheim S
BodoNSR:StopPlace:49484Bodo stasjon

ジオコーダーを使えば、任意の停留所を検索できます。空港、フェリーターミナル、バス停にも対応しています。

発車案内
curl -s -X POST "https://api.entur.io/journey-planner/v3/graphql" \
  -H "Content-Type: application/json" \
  -H "ET-Client-Name: $ENTUR_CLIENT_NAME" \
  -d '{"query": "{ stopPlace(id: \"NSR:StopPlace:59872\") { name estimatedCalls(numberOfDepartures: 10) { expectedDepartureTime destinationDisplay { frontText } serviceJourney { journeyPattern { line { publicCode name transportMode } } } } } }"}' | jq '.data.stopPlace | {name: .name, departures: [.estimatedCalls[] | {time: .expectedDepartureTime, destination: .destinationDisplay.frontText, line: .serviceJourney.journeyPattern.line.publicCode, mode: .serviceJourney.journeyPattern.line.transportMode}]}'
注意事項
  • GraphQL API です。POST のみ対応しています。エンドポイントは https://api.entur.io/journey-planner/v3/graphql です。
  • すべてのリクエストに ET-Client-Name ヘッダーを設定してください。
  • レート制限キーはありませんが、節度ある利用が求められます。
  • スキーマエクスプローラー:https://api.entur.io/graphql-explorer/journey-planner-v3
  • Vy および SJ Nord 経由で、スウェーデンへの一部の国境越え路線にも対応しています。

スウェーデン:ResRobot v2.1

Trafiklab 経由の REST API です。スウェーデン全土の交通機関(SJ の列車、地域バス、フェリー、地下鉄、通勤鉄道)を網羅しています。

認証

.env に RESROBOT_API_KEY を設定します。クエリパラメーター accessId を使用してください。trafiklab.se で無料のキーを取得できます。月間 30,000 回まで呼び出せます。

経路検索(ストックホルムからヨーテボリ)
curl -s "https://api.resrobot.se/v2.1/trip?originId=740000001&destId=740000002&format=json&accessId=$RESROBOT_API_KEY" | jq '[.Trip[] | {start: .LegList.Leg[0].Origin.time, date: .LegList.Leg[0].Origin.date, duration: .duration, legs: [.LegList.Leg[] | {mode: .type, name: .name, from: .Origin.name, to: .Destination.name, depart: .Origin.time, arrive: .Destination.time}]}] | .[0:5]'
停留所 ID の検索
curl -s "https://api.resrobot.se/v2.1/location.name?input=Stockholm&format=json&accessId=$RESROBOT_API_KEY" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId}] | .[0:5]'
主な停留所 ID
都市停留所 ID名称
Stockholm C740000001Stockholm Centralstation
Gothenburg C740000002Goteborg Centralstation
Malmo C740000003Malmo Centralstation
Uppsala740000025Uppsala Centralstation
Linkoping740000009Linkoping Centralstation
経路検索パラメーター
パラメーター必須説明
originIdはい出発停留所 ID
destIdはい到着停留所 ID
dateいいえYYYY-MM-DD(デフォルトは今日)
timeいいえHH:MM(デフォルトは現在時刻)
formatいいえjson または xml
numTripsいいえ検索結果の件数(デフォルトは 5)
productsいいえ交通機関の種類を指定するビットマスク
注意事項
  • REST API です。ベース URL は https://api.resrobot.se/v2.1/ です。
  • コペンハーゲン行きのオーレスン国境越え列車が含まれます。
  • 料金情報はありません。時刻表と経路のみです。

デンマーク:Rejseplanen API 2.0

REST API(HAFAS v2.50.4.1)です。デンマーク全土の交通機関(DSB InterCity/InterCityLyn、S-Tog、地下鉄、地域列車、バス、高速バス、深夜バス、フェリー、Flextur)を網羅しています。特長:運賃とゾーンの料金情報を含みます。

ドキュメント:https://labs.rejseplanen.dk(ログインが必要です)。XSD スキーマ:https://www.rejseplanen.dk/api/xsd

認証

.env に REJSEPLANEN_API_KEY を設定します。クエリパラメーター accessId として渡してください。labs.rejseplanen.dk から申請できます。商用以外の利用は月間 50,000 回まで無料です。

共通パラメーター
パラメーター説明
accessId必須。 API キーです。
formatjson または xml。常に format=json を使用してください。
langデフォルトは da です。英語にするには lang=en を使用してください。
製品ビットマスク
値製品説明
1IC都市間列車
2ICLInterCityLyn(急行)
4Re地域列車
8その他ECE、Eurostar、RailJet、Togbus、DSB Udland
16S-Togコペンハーゲンの通勤鉄道
32バス路線バス
64ExpressBus急行バス(250S、X-bus)
128NightBus夜行バス
256Flexturデマンド型交通
1024メトロコペンハーゲンメトロ

列車のみの場合は products=31 です。すべての交通機関を対象にする場合は、パラメーターを省略します。

主な停留所 ID
停留所extId名前
København H8600626København H
CPH Lufthavn8600858CPH Lufthavn
Odense St.8600512Odense St.
Aarhus H8600053Aarhus H
Aalborg St.8600020Aalborg St.
Svendborg St.8600551Svendborg St.
Svendborg Færgehavn100200261Svendborg Færgehavn
Ærøskøbing Havn (færge)100200222Ærøskøbing Havn (færge)

場所エンドポイント
location.name(名前で検索)
curl -s "https://www.rejseplanen.dk/api/location.name?accessId=$REJSEPLANEN_API_KEY&input=København&format=json&type=S" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId, lat: .lat, lon: .lon}] | .[0:10]'
パラメーター必須説明
inputはい検索クエリ
typeいいえS(停留所)、A(住所)、P(POI)、または組み合わせ
maxNoいいえ最大結果数(デフォルトは10、最大1000)
productsいいえ製品ビットマスクフィルター
r, refCoordLat, refCoordLongいいえ距離順のランキングに使う半径と基準座標
location.nearbystops(座標付近の停留所)
curl -s "https://www.rejseplanen.dk/api/location.nearbystops?accessId=$REJSEPLANEN_API_KEY&originCoordLat=55.672793&originCoordLong=12.564590&r=500&format=json" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId, dist: .dist}] | .[0:10]'

originCoordLat/originCoordLong が必要です。省略可能なパラメーター:r(半径、デフォルトは1000m)、maxNo、type、products。

location.details

完全な HAFAS ID を指定して、単一の場所の詳細を取得します(URL エンコードが必要です)。

location.data

数値 ID の範囲(llId から urId)内の場所を取得します。

location.search

フィルター付きの場所検索です。location.name と同じパラメーターに加え、追加のフィルターを指定できます。

location.boundingbox

地理的な範囲(llLat/llLon から urLat/urLon)内のすべての停留所を取得します。

addresslookup

座標付近の住所を取得します。逆ジオコーディングを行います。originCoordLat/originCoordLong が必要です。


経路検索エンドポイント
trip(経路検索)
curl -s "https://www.rejseplanen.dk/api/trip?accessId=$REJSEPLANEN_API_KEY&originId=8600626&destId=8600551&date=2026-08-28&time=08:00&format=json&lang=en" | jq '[.TripList.Trip[] | {duration: .duration, legs: [.LegList.Leg[] | {name: .name, type: .type, from: .Origin.name, to: .Destination.name, depTime: .Origin.time, arrTime: .Destination.time, track: .Origin.track}]}] | .[0:3]'
パラメーター必須説明
originIdはい*出発停留所の extId
destIdはい*到着停留所の extId
originCoordLat/Longはい*座標による出発地の指定(originId の代替)
destCoordLat/Longはい*座標による到着地の指定(destId の代替)
dateいいえYYYY-MM-DD
timeいいえHH:MM
searchForArrivalいいえ1 = 到着時刻で検索
numFいいえ前方の検索結果(1-6)
numBいいえ後方の検索結果(0-3)
maxChangeいいえ最大乗り換え回数(0-11)
productsいいえ製品ビットマスク
operatorsいいえカンマ区切りの運行会社コード
linesいいえ路線フィルター
viaいいえ経由する停留所 ID
avoidいいえ回避する停留所 ID
passlistいいえ1 = 中間停留所を含める
tariffいいえ1 = 運賃/ゾーン料金を含める
polyいいえ1 = ポリラインを含める
contextいいえページ送り用スクロールトークン
originWalk/Bike/Carいいえアクセス手段の距離
destWalk/Bike/Carいいえ出口手段の距離
rtModeいいえFULL、INFOS、OFF、REALTIME、SERVER_DEFAULT
interval(時間帯別の経路検索)

時間帯内のすべての出発便を取得します。trip と同じパラメーターを使用します。

recon(経路の再構築)

ctxRecon トークンから経路を再構築します。パラメーター:ctx(必須)、poly、passlist、tariff。

reachability(到達可能なすべての停留所)

時間/乗り換えの上限内で到達可能なすべての停留所を取得します。パラメーター:originId または座標、duration(1~1439 分)、maxChange(0~11)、forward、products。


出発・到着案内

デフォルトの時間は60分です。

departureBoard / arrivalBoard
curl -s "https://www.rejseplanen.dk/api/departureBoard?accessId=$REJSEPLANEN_API_KEY&id=8600626&date=2026-08-28&time=08:00&format=json&lang=en" | jq '[.DepartureBoard.Departure[] | {name: .name, time: .time, direction: .direction, track: .track, rtTime: .rtTime}] | .[0:10]'

パラメーター:id(必須)、date、time、duration(0~1439)、maxJourneys、products、operators、passlist。

multiDepartureBoard / multiArrivalBoard

1回の呼び出しで複数の駅を指定します。複数の id パラメーターを渡します。

nearbyDepartureBoard / nearbyArrivalBoard

座標付近の駅です。パラメーター:originCoordLat/Long、r(デフォルトは1000m)、maxStops(デフォルトは30)。


路線と旅程のエンドポイント
lineinfo

指定日の路線詳細です。lineId、dateが必要です。

linesched

指定日の路線全体の時刻表です。lineId、dateが必要です。

linesearch

事業者別の全路線です。operators(datainfoから取得した、カンマ区切りの値)が必要です。

linematch

パターン文字列で路線を照合します。

trainSearch

列車名で旅程を検索します。最初と最後の停車駅のみを返します。

journeyDetail

旅程の全停車駅一覧です。id(trip/boardから取得した旅程参照)が必要です。fromId/toId、poly、rtModeは省略可能です。

journeyMatch

trainSearchと同様ですが、最初に一致した結果のみ全詳細を返します。

journeypos

境界ボックス内のリアルタイム車両位置です。llLat/llLon/urLat/urLonが必要です。


運賃/料金のエンドポイント

デンマークでは、Rejsekortを通じたゾーン制運賃が採用されています。スカンジナビアでは独自の方式です。

エンドポイント用途
trip with tariff=1tripの結果に料金を含めます
spPrice出発地/目的地別の定期券料金
spPriceForZones運賃セット内のゾーン数に応じた1日あたりの料金
spDailyZonalPrices全乗客タイプを対象とした、ゾーン料金の完全なマトリックス
spPriceReconstruction旅程再構成コンテキストに基づく料金
spRefund定期券の払い戻し計算
spCheck定期券の検証(SELFシステム)
spZoneCheckゾーンの接続状況と地下鉄ゾーンの確認
stRoutes出発地/目的地間の運賃ルート
stRoutesAddon単一の出発地からの運賃ルート
stStops運賃ゾーンと停留所(mode=DSB)
trfStopゾーンのデフォルト停留所
convertZonesコンテキストの運賃詳細
zoneFromCoordinate緯度/経度からゾーンを検索

移動詳細のエンドポイント
gisroute

tripの結果から徒歩/自転車ルートの詳細を取得します。ctx(GIS参照)が必要です。

himsearch

リアルタイムの運行障害メッセージです。交通手段、事業者、路線、日付、停留所で絞り込めます。


システム情報
datainfo

全事業者、交通手段、カテゴリです。事業者コードの確認に使用します。

curl -s "https://www.rejseplanen.dk/api/datainfo?accessId=$REJSEPLANEN_API_KEY&format=json" | jq '[.DataInfo.operators.Operator[] | {name: .name, id: .id}] | .[0:20]'
tti

時刻表データプールの情報:ID、作成日、タイプ(ST/ADR/POI)、有効期間です。


レスポンスの構造
  • extId:停留所の数値ID(クエリに使用します)。idはHAFASの完全な文字列です。
  • rtTime/rtDate:リアルタイムの実績/予測時刻(予定時刻のtime/dateと異なる場合)。
  • 区間のtype:JNY(旅程)、WALK(徒歩)、TRSF(乗り換え)。
  • JourneyDetailRef:旅程の全停車駅一覧を取得するには、journeyDetailと併用します。

国境を越えるルート

ルート対応APIメモ
オスロからストックホルムEntur + ResRobotSJの列車、約6時間
マルメからコペンハーゲンResRobot + RejseplanenØresundの列車、35分
ヨーテボリからオスロEntur + ResRobotVy/SJ、約4時間
ストックホルムからコペンハーゲンResRobotSJ/DSB、マルメ経由で約5時間
コペンハーゲンからマルメRejseplanenデンマーク側から乗車するØresundの列車

使用する場面

次の場合にこのスキルを読み込みます。

  • スカンジナビアの都市間を移動する列車/バス/フェリーのルートを計画する
  • 地上交通機関の時刻表や所要時間を確認する
  • 旅程計画用の停留所IDを調べる
  • スカンジナビア域内の移動で、列車と飛行機を比較する
  • デンマークの公共交通機関の運賃/ゾーンを調べる
  • リアルタイムの運行障害を確認する(himsearch)
  • 車両の現在位置を追跡する(journeypos)

次の用途には使用しないでください。

  • 予約(検索/時刻表の確認のみ)
  • 航空便(Seats.aero、SerpAPI、またはDuffelを使用してください)
  • EnturまたはResRobotからの料金取得(料金を提供しているのはRejseplanenのみです)

検索ワークフロー

1. 「AからBへはどう行けばよいですか?」

ステップ1: 国に応じてAPIを選びます(ノルウェー=Entur、スウェーデン=ResRobot、デンマーク=Rejseplanen、国境を越える移動=両方)。

ステップ2: 停留所IDを調べます。

# Norway
curl -s "https://api.entur.io/geocoder/v1/autocomplete?text=Flåm&size=3" \
  -H "ET-Client-Name: $ENTUR_CLIENT_NAME" | jq '[.features[] | {name: .properties.name, id: .properties.id}]'

# Sweden
curl -s "https://api.resrobot.se/v2.1/location.name?input=Malmö&format=json&accessId=$RESROBOT_API_KEY" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId}] | .[0:5]'

# Denmark
curl -s "https://www.rejseplanen.dk/api/location.name?accessId=$REJSEPLANEN_API_KEY&input=Svendborg&format=json&type=S&lang=en" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId}] | .[0:5]'

ステップ3: dateとtimeを指定して旅程を検索します。ステップ4(デンマーク): 料金を取得するにはtariff=1を追加します。

2. 「Xから出発する列車は何ですか?」
curl -s "https://www.rejseplanen.dk/api/departureBoard?accessId=$REJSEPLANEN_API_KEY&id=8600626&duration=120&products=31&format=json&lang=en" | jq '[.DepartureBoard.Departure[] | {time: .time, name: .name, direction: .direction, track: .track}]'
3. 「近くには何がありますか?」
curl -s "https://www.rejseplanen.dk/api/location.nearbystops?accessId=$REJSEPLANEN_API_KEY&originCoordLat=55.6736&originCoordLong=12.5681&r=500&format=json&lang=en" | jq '[.stopLocationOrCoordLocation[] | .StopLocation | {name: .name, id: .extId, dist: .dist}]'

停留所の検索を省略するには、nearbyDepartureBoard を使用します。

4. 「Ærø行きのフェリーはありますか?」
curl -s "https://www.rejseplanen.dk/api/trip?accessId=$REJSEPLANEN_API_KEY&originId=100200261&destId=100200222&date=2026-08-28&time=08:00&format=json&lang=en" | jq '[.TripList.Trip[] | {legs: [.LegList.Leg[] | {name: .name, from: .Origin.name, to: .Destination.name, depTime: .Origin.time, arrTime: .Destination.time}]}] | .[0:5]'
5. 「列車番号は分かっています。」

trainSearch で列車を検索し、その参照情報を使って journeyDetail を実行すると、全停車駅を確認できます。

6. 「2時間でどこまで行けますか?」
curl -s "https://www.rejseplanen.dk/api/reachability?accessId=$REJSEPLANEN_API_KEY&originId=8600626&duration=120&maxChange=2&format=json" | jq '.'
7. 「運行の乱れはありますか?」
curl -s "https://www.rejseplanen.dk/api/himsearch?accessId=$REJSEPLANEN_API_KEY&format=json&lang=en" | jq '.'
8. 複数の国をまたぐ移動

両端の出発地と目的地から検索します。Øresund列車は、ResRobotとRejseplanenの両方に表示されます。

ヒント
  • 常に format=json を指定します。Rejseplanenでは常に lang=en を指定します。
  • クエリには、長いHAFASの id 文字列ではなく、数値の extId を使用します。
  • 遅延を確認するには、rtTime/rtDate を確認します。
  • passlist=1 を指定すると、途中停車駅が表示されます。
  • 直通便のみを表示するには、maxChange=0 を指定します。
  • numF/numB または context のスクロールトークンを使ってページを切り替えます。
  • プロダクトのビットマスクは加算式です。すべての種類を対象にする場合は省略します。

コメント