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 无关联;它抓取该网站需会话的接口,网站变动可能导致失效,请求也做了限速。价格仅供参考,无法下单预订。服务器为只读,不需要登录或凭据。

安装

在 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 分