mcpField
F
Flyan

Flyan

ローカル
github.com/victorlane地図・旅行12 日前に更新

Flyan について

Flyanは、Ryanairの非公式オープンソース航空券データラッパーで、任意でMCPサーバーとしても利用できます。APIキーやアカウントなしで、自然言語検索、就航先の探索、運賃の絞り込みを行いたい旅行者やエージェント向けです。

主な機能

  1. 01Ryanairの片道便検索
  2. 02目的地と価格による絞り込み
  3. 03就航先の探索
  4. 04運賃上限内の行き先検索
  5. 05日別の最安運賃比較

活用シーン

  1. 01日付と空港を指定した便の検索
  2. 02出発空港から低価格の行き先探し
  3. 03就航先の国や都市の確認
  4. 04路線の最安日を特定

MCP 対応

任意のMCPサーバーは、フライト検索、価格上限内の行き先検索、路線探索、最安日の検索に使う4種類のツールを提供します。キーやアカウントを必要とせず、Ryanairの匿名APIを利用します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"victorlane-flyan": {
"command": "uvx",
"args": [
"Flyan"
]
}
}
}
起動コマンドuvx Flyan

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypiFlyan0.4.4

ツール

4

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
to_datestringはい
from_datestringはい
max_priceanyいいえ
to_airportanyいいえ
from_airportstringはい
destination_countryanyいいえ

詳細

Flyan SDK

PyPI version Python versions CI CodeQL PyPI downloads License

Ryanair のフライトデータを取得する、オープンソースの非公式 API ラッパーです。

ヒント

新機能:AI エージェント向け MCP サーバー。 Flyan を Claude Desktop、 Claude Code、または Cursor に接続して、自然言語で Ryanair のフライトを検索できます。 MCP クイックスタートに移動してください。

目次

インストール

pip install Flyan

または uv を使用します。

uv add Flyan

クイックスタート

from datetime import datetime
from flyan import RyanAir, FlightSearchParams

# Initialize the client
client = RyanAir(currency="EUR")

# Set up search parameters
search_params = FlightSearchParams(
    from_airport="DUB",  # Dublin
    to_airport="BCN",    # Barcelona
    from_date=datetime(2025, 8, 15),
    to_date=datetime(2025, 8, 20),
    max_price=200
)

# Search for one-way flights
flights = client.get_oneways(search_params)

# Display results
for flight in flights:
    print(f"Flight {flight.flight_number}: {flight.departure_airport.name} → {flight.arrival_airport.name}")
    print(f"Departure: {flight.departure_date}")
    print(f"Price: {flight.price} {flight.currency}")
    print("---")

API リファレンス

RyanAir クラス
コンストラクター
RyanAir(currency: str = "EUR")

新しい RyanAir クライアントインスタンスを作成します。

パラメーター:

  • currency (str, optional):料金に使用する通貨です。デフォルトは "EUR" です。対応通貨一覧にある有効な通貨コードを指定する必要があります。

例:

# Default EUR currency
client = RyanAir()

# Specific currency
client = RyanAir(currency="USD")
メソッド
get_oneways(params: FlightSearchParams) -> list[Flight]

片道フライトを検索します。

パラメーター:

  • params (FlightSearchParams):検索パラメーター

戻り値:

  • list[Flight]:利用可能なフライトのリスト
FlightSearchParams クラス

フライト検索用のパラメーターです。

FlightSearchParams(
    from_airport: str,
    from_date: datetime,
    to_date: datetime,
    destination_country: Optional[str] = None,
    max_price: Optional[int] = None,
    to_airport: Optional[str] = None,
    departure_time_from: Optional[str] = "00:00",
    departure_time_to: Optional[str] = "23:59"
)

パラメーター:

  • from_airport (str):出発空港の IATA コード(例:"DUB")
  • from_date (datetime):出発日の最早日
  • to_date (datetime):出発日の最遅日
  • destination_country (str, optional):目的地の国コード
  • max_price (int, optional):最高価格のフィルター
  • to_airport (str, optional):到着空港の IATA コード
  • departure_time_from (str, optional):最も早い出発時刻(HH:MM 形式)
  • departure_time_to (str, optional):最も遅い出発時刻(HH:MM 形式)

例:

from datetime import datetime

params = FlightSearchParams(
    from_airport="DUB",
    from_date=datetime(2025, 8, 15),
    to_date=datetime(2025, 8, 20),
    to_airport="BCN",
    max_price=150,
    departure_time_from="08:00",
    departure_time_to="18:00"
)
ReturnFlightSearchParams クラス

往復フライト検索用の拡張パラメーターです。

ReturnFlightSearchParams(
    # All FlightSearchParams fields plus:
    return_date_from: datetime,
    return_date_to: datetime,
    inbound_departure_time_from: Optional[str] = "00:00",
    inbound_departure_time_to: Optional[str] = "23:59"
)

データモデル

Flight

単一のフライトを表します。

属性:

  • departure_airport (Airport):出発空港の情報
  • arrival_airport (Airport):到着空港の情報
  • departure_date (datetime):出発日時
  • arrival_date (datetime):到着日時
  • price (float):フライト料金
  • currency (str):料金の通貨
  • flight_key (str):一意のフライト識別子
  • flight_number (str):フライト番号
  • previous_price (Optional[str | float]):利用可能な場合、以前の料金
Airport

空港情報を表します。

属性:

  • country_name (str):国名
  • iata_code (str):IATA 空港コード
  • name (str):空港名
  • seo_name (str):SEO に適した名前
  • city_name (str):市名
  • city_code (str):市コード
  • city_country_code (str):国コード
ReturnFlight

往復航空券の予約を表します。

属性:

  • outbound (Flight):往路のフライト
  • inbound (Flight):復路のフライト
  • summary_price (float):両方のフライトの合計金額
  • summary_currency (str):合計金額の通貨
  • previous_price (str | float):利用可能な場合の以前の合計金額
NetworkAirport

Ryanairの運航中のネットワークにある空港を表します。探索メソッドから返されます。

属性:

  • iata_code (str):IATA空港コード
  • name (str):空港名
  • seo_name (str):SEOに適した名前
  • country_code (str):小文字のISO2国コード(例:"ie"、"es")
  • city_code (str):都市コード(例:"LONDON"、"DUBLIN")
  • region_code (Optional[str]):地域コード(例:"SCOTLAND"、"ANDALUSIA")
  • currency_code (str):現地通貨コード
  • time_zone (str):IANAタイムゾーン(例:"Europe/Dublin")
  • base (bool):Ryanairの拠点空港の場合はTrue
  • latitude (float)、longitude (float):座標
  • routes (list[str]):生の路線文字列(通年運航)
  • seasonal_routes (list[str]):生の路線文字列(季節限定)
  • categories (list[str]):Ryanairが割り当てたマーケティングカテゴリ
  • aliases (list[str]):別名

ヘルパー:airport_routes()、country_routes()、seasonal_airport_routes()、 typed_routes()、typed_seasonal_routes()。

DestinationFare

explore_with_fares()から返されます。到達可能な目的地と、価格照会で返された場合は、サンプリングされた最安運賃を組み合わせたものです。

属性:

  • airport (NetworkAirport):目的地の空港
  • fare (Optional[Flight]):期間内でサンプリングされた最安運賃。ネットワーク上に路線はあるものの、価格情報のある便が返されなかった場合(期間内に便がない、売り切れなど)はNone

例

国で検索
# Search flights to any airport in Spain
params = FlightSearchParams(
    from_airport="DUB",
    destination_country="ES",
    from_date=datetime(2025, 9, 1),
    to_date=datetime(2025, 9, 7)
)

flights = client.get_oneways(params)
時刻と価格で絞り込む
# Morning flights under €100
params = FlightSearchParams(
    from_airport="STN",  # London Stansted
    to_airport="DUB",    # Dublin
    from_date=datetime(2025, 8, 1),
    to_date=datetime(2025, 8, 5),
    max_price=100,
    departure_time_from="06:00",
    departure_time_to="12:00"
)

flights = client.get_oneways(params)
エラー処理
from flyan import RyanairException

try:
    flights = client.get_oneways(params)
    if not flights:
        print("No flights found for the given criteria")
except RyanairException as e:
    print(f"Ryanair API error: {e}")
except Exception as e:
    print(f"Unexpected error: {e}")

Exploreモード

Exploreモードでは、「ここから実際にどこへ飛べるのか?」という問いに答えます。Ryanairの運航中のネットワークメタデータを一度読み込み、任意の空港から到達可能な目的地を公開します。必要に応じてグループ化、絞り込み、または期間内の最安運賃との結合も行えます。

以下のすべてのメソッドは、RyanAirとAsyncRyanAirの両方で利用できます。

すべての目的地を一覧表示する
destinations = client.get_destinations("DUB")

for airport in destinations:
    print(f"{airport.iata_code} {airport.name} ({airport.country_code})")
国、地域、または都市で絞り込む
# All Scottish airports DUB flies to
in_scotland = client.get_destinations_in_region("DUB", "SCOTLAND")

# All London airports DUB flies to (LGW, LTN, STN)
in_london = client.get_destinations_in_city("DUB", "LONDON")

# All Spanish airports DUB flies to
in_spain = client.get_destinations_in_country("DUB", "es")

国コードは小文字のISO2です。地域コードと都市コードは運航中のネットワークから取得されます(大文字。例:SCOTLAND、ANDALUSIA、COSTA_DE_SOL、LONDON、MILAN)。

目的地をグループ化する
# {country_code: [airports]}
by_country = client.explore_by_country("DUB")

print(f"DUB flies to {len(by_country)} countries")
for country, airports in sorted(by_country.items()):
    codes = ", ".join(a.iata_code for a in airports)
    print(f"  {country}: {codes}")
# {region_code: [airports]}
by_region = client.explore_by_region("DUB")

region_codeがない空港は空文字列のキーにまとめられるため、呼び出し側で表示するか除外するかを決められます。

季節限定の目的地
seasonal = client.get_seasonal_destinations("DUB")

RyanairのseasonalRoutesリストは上流での登録がまばらなため、夏季・冬季スケジュールの切り替え時期以外は、[]が返されることがよくあります。このメソッドを使えば、生の路線文字列を確認する必要はありません。

最安運賃付きの目的地

explore_with_fares()は、ネットワーク上の目的地をoneWayFaresの照会結果と結合するため、各目的地について、サンプリングされた最安のFlightが返されます(期間内にその路線の運賃が返されなかった場合はNone)。ネットワークへの呼び出し1回と運賃への呼び出し1回が必要です。

from datetime import datetime, timedelta

start = datetime.now() + timedelta(days=14)
end = start + timedelta(days=7)

results = client.explore_with_fares("DUB", start, end, max_price=100)

priced = [d for d in results if d.fare is not None]
cheapest_first = sorted(priced, key=lambda d: d.fare.price)

for d in cheapest_first[:10]:
    print(f"{d.airport.iata_code} {d.airport.name}: "
          f"{d.fare.price} {d.fare.currency}")
非同期での使用

AsyncRyanAirには、すべての探索メソッドに対応するメソッドがあります。

import asyncio
from flyan import AsyncRyanAir

async def main():
    async with AsyncRyanAir() as client:
        by_country = await client.explore_by_country("DUB")
        print(f"{len(by_country)} countries reachable from DUB")

asyncio.run(main())

探索メソッドを複数続けて呼び出す場合は、トランスポートをCachingTransportでラップすると、ネットワークメタデータが一度だけ取得され、再利用されます。

Claude、Cursor、その他のMCPクライアントでの使用

重要

2つのコマンドを実行すれば完了です。

uv tool install "Flyan[mcp]"
claude mcp add flyan flyan-mcp

これでエージェントが自然言語でRyanairのフライトを検索できます。APIキーもアカウントも必要ありません。

Flyanには、エージェントが「ダブリン発スペイン行きで、8月に150ユーロ以下の安いフライトを探して」や「DUBからBCNへ飛ぶなら、7月の何曜日が最安?」のような自然言語のプロンプトでRyanairの運賃を検索できる、オプションのModel Context Protocolサーバーが付属しています。

クイックスタート

1. MCP 拡張機能付きで Flyan をインストールします:

uv tool install "Flyan[mcp]"

または、pip を使用します:

pipx install "Flyan[mcp]"

これにより、PATH 上に flyan-mcp コンソールスクリプトがインストールされます。

2. エージェントに追加します:

Claude Code(ワンライナー):

claude mcp add flyan flyan-mcp

Claude Desktop:macOS では ~/Library/Application Support/Claude/claude_desktop_config.json(Windows では %APPDATA%\Claude\claude_desktop_config.json)を開き、次を追加します:

{
  "mcpServers": {
    "flyan": {
      "command": "flyan-mcp"
    }
  }
}

その後、Claude Desktop を再起動します。

Cursor:Settings → MCP → Add new server を開き、名前に flyan、コマンドに flyan-mcp を指定します。

通貨

サーバーはデフォルトで EUR 建ての価格を返します。別の通貨で取得するには、flyan-mcp の起動前に FLYAN_CURRENCY 環境変数を、サポート対象の ISO 4217 コードのいずれかに設定します:

FLYAN_CURRENCY=GBP flyan-mcp

または、エージェントの MCP 設定を通して渡します:

{
  "mcpServers": {
    "flyan": {
      "command": "flyan-mcp",
      "env": { "FLYAN_CURRENCY": "GBP" }
    }
  }
}

不明なコードやサポート対象外のコードは、通知なしで EUR にフォールバックします。

3. 試してみましょう。 エージェントに次のように尋ねます:

「ダブリンからスペイン国内のどこへでも行ける、8 月第 1 週の片道航空券を €150 未満で探してください。」

エージェントは destination_country="es" を指定して find_flights を呼び出し、最も安い選択肢を要約します。

公開されるツール

サーバーは、エージェントが確実に選択できるよう、厳選された 4 つのツールを公開します:

  • find_flights は、国、IATA コード、または価格のフィルターを任意で指定した片道検索に使用します
  • find_anywhere_under は、「£X 未満でどこへ行けますか」というプロンプトに使用します
  • explore_destinations は、「X からどの国に行けますか」というプロンプトに使用します
  • cheapest_per_day は、「今月、X から Y へ飛ぶのに最も安い日はいつですか」というプロンプトに使用します

API キー、アカウント、レート制限の設定は不要です。Ryanair の API は匿名で利用でき、サーバーは呼び出し間で単一の RyanAir クライアントを再利用します。

サポート対象の空港

SDK は Ryanair のネットワーク内のすべての空港をサポートします。空港コードには、有効な 3 文字の IATA コードを指定する必要があります。最新の一覧は、client.get_network() を通じて Ryanair の集約エンドポイントから取得されます。全空港の一覧を確認するには、network.airports を反復処理してください。

主な空港は次のとおりです:

  • DUB - ダブリン
  • STN - ロンドン・スタンステッド
  • BCN - バルセロナ
  • MAD - マドリード
  • FCO - ローマ・フィウミチーノ
  • BRU - ブリュッセル
  • AMS - アムステルダム

サポート対象の通貨

SDK は複数の通貨をサポートします。主な通貨は次のとおりです:

  • EUR - ユーロ
  • USD - 米ドル
  • GBP - 英ポンド
  • CHF - スイスフラン

完全な一覧については、currencies.json を参照してください。

レート制限

SDK には、レート制限や一時的な API の問題に対処するため、指数バックオフを使った自動再試行ロジックが含まれています。リクエストが失敗した場合、最大 5 回まで再試行してから処理を中断します。

コントリビューション

これはオープンソースプロジェクトです。コントリビューションを歓迎します!

免責事項

これは非公式の API ラッパーであり、Ryanair とは提携していません。自己責任で使用し、Ryanair の利用規約を遵守してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。