obilet.com Bus & Flight Tickets

io.github.mohammad-abbasi-sh由 GitHub 帳號 mohammad-abbasi-sh 發布v0.1.0更新於 Nov 7, 2026

Unofficial read-only MCP server for obilet.com bus & flight tickets: journeys, prices.

概覽

AI 產生的概覽

非官方唯讀 MCP 伺服器,讓助理查詢 obilet.com 上土耳其的巴士與航班班次、價格和時刻。

可以做什麼
  • 依名稱搜尋巴士或航班地點並回傳其 ID
  • 依路線和日期列出巴士班次,含承運商、車型、座位、時間、時長、TRY 價格和評分
  • 讀取單一班次的完整詳情,包括每個停靠站及時間
  • 取得某路線某日期的價格統計(最低、中位、平均、最高)
  • 取得航班摘要,含航班數、價格區間、時長、是否有直飛及航空公司
適用情境
適合在規劃或比較土耳其境內交通時使用:讓助理查詢巴士發車時間、票價和停靠站詳情,或快速了解某城市對某日期的航班價格與航空公司概況。
執行需求
以 Python 套件形式透過 stdio 在本機執行(uvx obilet-mcp 或 pip install obilet-mcp);需要 Python 環境及 mcp<2、curl-cffi,並能連線至 obilet.com。不需帳號、API 金鑰或環境變數。
安裝前請注意
非官方專案,與 obilet.com 無關聯;它擷取該網站需工作階段(session)的介面,網站變動可能導致失效,請求也做了限速。價格僅供參考,無法下單訂票。伺服器為唯讀,不需登入或憑證。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 obilet.com Bus & Flight Tickets,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

obilet-mcp 🇹🇷

mcp-name: io.github.mohammad-abbasi-sh/obilet-mcp

Unofficial read-only MCP server for obilet.com**, Türkiye's bus & flight ticket search — search bus locations, list all bus journeys for a route + date (partner, bus type, seats, departure/arrival, duration, price in TRY, partner rating, stops), read full journey details, get price statistics, and read the flight summary (flight count, min/max price, airlines) for the same city pair.

Built by Mohammad Abbasi as part of the "Turkey MCP factory" (Sepehr-style pipeline). Not affiliated with obilet.com.

For AI agents

Add to your MCP client config (stdio):

json
{  "mcpServers": {    "obilet": {      "command": "uvx",      "args": ["obilet-mcp"]    }  }}

Or run locally: python -m obilet_mcp.server (needs mcp<2, curl-cffi).

Tools

ToolDescription
obilet_search_locationsSearch locations by name — query ("Ankara", "İstanbul"), kind ("bus" / "flight"); returns id, name, display name, city id per match (bus ids are ints, flight ids are strings like "250_0")
obilet_search_bus_journeysBus journeys for a route + date — origin_id / destination_id (bus location ids, e.g. 349 İstanbul Avrupa -> 356 Ankara), date "YYYY-MM-DD", sort ("price_asc" / "departure" / "duration"), limit 1..24; returns journey id, partner, bus type, seats, stations, departure/arrival, duration, price in TRY, partner rating (0-10), stops, plus the total count
obilet_journey_detailFull detail of one journey (journey_id): partner, bus type, seats, stations, departure/arrival, duration, internet & original price in TRY, service fee, partner rating, bus name, platform, description, every stop with its time
obilet_price_statsPrice statistics for a route + date: journey count, min / median / mean / max ticket price in TRY
obilet_flight_summaryFlight summary for a route + date: flight count, min/max price in TRY, min/max duration, first/last departure, direct-flight flag, airlines with IATA codes (individual flight listings are NOT in v1)

Example output (obilet_search_bus_journeys / İstanbul Avrupa -> Ankara, 2026-11-07):

json
{"origin_id": 349, "destination_id": 356, "date": "2026-11-07", "sort": "price_asc", "total": 421, "count": 2, "journeys": [  {"journey_id": 1432053091, "partner": "Yükseller Aksaray Birlik",   "bus_type": "2+1", "total_seats": 41, "available_seats": 36,   "origin": "Esenler Otogarı", "destination": "Ankara (Aşti) Otogarı",   "departure": "2026-11-07T07:30:00", "arrival": "2026-11-07T15:30:00",   "duration": "08:00:00", "price_try": 539.0, "original_price_try": 700.0,   "price_currency": "TRY", "partner_rating": 8.64, …}, …]}

Example output (obilet_flight_summary / same route & date):

json
{"origin_id": 349, "destination_id": 356, "date": "2026-11-07", "flight_count": 26, "has_direct": true, "min_price_try": 1461.99, "max_price_try": 7399.34, "min_duration": "01:00:00", "max_duration": "12:05:00", "first_departure": "00:05:00", "last_departure": "23:30:00", "airlines": [{"name": "Pegasus", "iata": "PC"}, {"name": "AJet", "iata": "VF"},              {"name": "THY", "iata": "TK"}]}

Example output (obilet_price_stats / same route & date):

json
{"origin_id": 349, "destination_id": 356, "date": "2026-11-07", "count": 421, "min_try": 539.0, "median_try": 800.0, "mean_try": 852.38, "max_try": 1150.0}

How it works

obilet.com exposes a JSON API, but it is session-gated: an HTML page is fetched first (it sets cookies incl. ob_Session and __cf_bm), then POSTs carry X-Requested-With: XMLHttpRequest with that page as Referer. Locations: POST /json/duraklar (bus) or /json/ucak-duraklari (flight). Journeys: POST /json/journeys/{origin}-{destination}/{date} with {} — one response holds every journey for the route. Detail: POST /json/sefer-tam/{journeyId}. The same journeys response carries the flightSummary. Sorting is client-side (price / departure / duration). The async flights endpoint is broken on the site side (404/500), so individual flight listings are out of scope for v1. Transport uses a persistent curl-cffi chrome120 session; requests are spaced ~0.8s apart; everything is read-only, no login, no API key.

Install

bash
uvx obilet-mcp        # run directly (needs uv)# orpip install obilet-mcpobilet-mcp         # starts the MCP server on stdio

Tests

bash
python -m venv .venv && .venv/bin/pip install -e ..venv/bin/python -m unittest discover -s tests -v

Offline tests run on recorded fixtures (real pages fetched 2026-11-06); live tests hit obilet.com.

Roadmap

  • Individual flight listings (if the async flights endpoint is fixed)
  • Round-trip search (outbound + return in one call)
  • Seat-map / available-seat detail per journey

License

MIT — see LICENSE.

來源:README.md,提交 3ca4f5d

工具

0
SourceWeft 尚未在沙箱中啟動過該軟體包,因此其工具未知。

版本歷史

1
  1. v0.1.0最新Nov 7, 2026

評分

已滿足適用檢查項的 50%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分

    請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。

  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具15 分

    請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。

  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分