Requires the
MCP server. This skill issues no network calls of its own.
Setup (once per machine)
Without the MCP server registered this skill is inert — it tells you to call
and no such tool exists.
only copies files, so run:
bash
bash install.sh # add --dry-run first to see what it would change
It registers the hosted server (
https://mcp.price.win/mcp
, Streamable HTTP, no
credentials) with every agent it finds — Claude Code, Cursor, Windsurf, Gemini CLI, VS Code,
Codex — writing a
before touching any file and skipping configs it cannot parse.
Re-running it changes nothing.
Restart the agent afterwards.
Flight Search (Live)
MCP server: . Tool
starts an async crawl across Agoda,
Trip.com and Traveloka;
returns the merged, cheapest-per-flight fares.
CRITICAL: IATA codes only
Both airports MUST be 3-letter IATA codes.
There is no airport-lookup tool on this server —
resolve the city yourself:
,
,
,
(main international),
,
.
When a city has several airports and the user did not say which, ask one short question —
never pick silently. Never invent a code.
CRITICAL: Polling pattern (differs from hotel search)
returns IMMEDIATELY with a
and zero flights.
- Call with origin, destination, departureDate (YYYY-MM-DD), and
only for a round trip. Add , , as needed.
- Call
poll_flight_results(sessionId)
. This tool blocks internally up to ~30s and
returns as soon as the first fares land — do NOT sleep before calling it.
- is | | | . If it comes back
with few or no flights, call again — up to 4 more times.
- Present results as soon as flights arrive; keep polling only if the user wants more.
The session expires
15 minutes after the last poll. After that, start a new search —
the old
is dead.
is registered app-visible for the flight widget. If your host does not
expose it to the model, let the widget do the polling and do not fabricate fares.
CRITICAL: is the party total, in USD
is the
total for all — not per-person, and not the two legs combined.
Divide by
yourself for a per-person figure.
is
. Do not convert it. It falls back to
only when the live FX
rate was unavailable — so
read and label the figure with it rather than assuming
either one.
Response format (MUST follow exactly)
Present the TOP 5-7 flights per leg ONLY. For EACH flight:
✈️ *<airline> <flightNumber>* ← bold via markdown
🕐 <dep.time> <origin> → <arr.time> <destination> · <Xh Ym> · <bay thẳng | N điểm dừng>
💰 $<price> tổng cho <adults> khách (~$<price/adults>/khách)
🔗 <bookingUrl>
Line break between flights, no bullet markers.
Cheapest flight gets 🏆. is in
minutes — format it as
. Flag an overnight arrival when
differs
from
.
Round trips
and
are
two independent one-way searches. List them under
separate headings. You may state a combined estimate as
cheapest outbound + cheapest return
, but label it as
two separate one-way tickets — it is
not a quoted round-trip fare and the two legs are booked separately.
Booking URLs — use verbatim
is the deep link of the cheapest agent, with dates and passengers already baked in.
Never append, rewrite, or construct params (unlike the hotel skill). A
of exactly
means no agent deep link was captured — say the fare must be re-checked
on the provider's site instead of presenting it as a click-to-book link.
Attribute the source only from the URL host (
,
,
) — the
result carries no explicit source field, so do not guess one.
Fields that look useful but are not
- — always empty; describe stops by count only
- / — repeat the IATA code, not a real city name
- — usually absent on list results; don't promise a segment breakdown
Ranking
Sort by
. Cheapest first, but surface a non-stop or much shorter option when it costs
only marginally more — say so in one line rather than reordering silently.