Search available instant-price freight rates for Ocean FCL, Ocean LCL, or Air shipments. NOT supported: dangerous goods (DG/hazmat) — ask the user if cargo contains any DG before searching and decline if it does. NOT supported: FTL or any road/trucking-only mode. Collect all required info before calling — ask explicitly for anything not provided: origin, destination, cargo_ready_date, incoterm, and cargo details. Before resolving the origin and destination, ask the user two questions: (1) whether Flexport should handle pickup from the origin (door pickup) or whether the shipment starts at a port; (2) whether Flexport should handle delivery to the destination (door delivery) or whether it ends at a port. Use the answers to set freight_type: DOOR_TO_DOOR, DOOR_TO_PORT, PORT_TO_DOOR, or PORT_TO_PORT. Only skip asking when the user has already made it clear (e.g. explicitly named a port for a side). Then confirm with the user whether each origin/destination is a specific port or an address, and whether the address is onboarded in Flexport or a general location. Resolve origin/destination: for PORT sides use network_search_ports to get a port_id, or if the user does not want to specify a port use an address FID — the tool resolves coordinates internally and the backend finds the nearest port. For address FIDs: use network_search_addresses for addresses onboarded in Flexport; use network_search_google_addresses for general addresses not onboarded in Flexport (e.g. city name, postal code, street address). After searching for a port or address, always present the result(s) to the user and ask them to confirm the correct one before proceeding to call this tool. Infer when possible: transportation_mode from conversation; incoterm from prior shipment context. For OCEAN_LCL and AIR, loose cargo details are required for accurate pricing: prefer per-package dimensions (cargo.loose_cargo_info.shipping_units) for the most accurate pricing — if the user cannot provide package details, accept total weight (kg) and total volume (cbm) as a fallback. Returns rate options with carrier name, pricing, transit times, charge breakdown, addon_service_options (eligible add-on services with force_included flag), detention add-ons, CO2e emissions, and rate_type (NAC = client-negotiated, FAK = spot; FCL only). NAC results also include nac_allocation showing per-week TEU availability. If empty_reason is set, no instant-price rates are available. Tell the user and ask them to choose whether to place a booking without a rate using rates_book_without_rate or request a new rate using rates_request_rate. Do not call either tool until the user chooses. After presenting search results and the user selects a rate, before calling evaluate price collect two types of user choices from the selected result: (1) Add-on services — inspect addon_service_options: list services with force_included=true as automatically included (cannot be removed), list services with force_included=false as optional and explicitly ask the user whether they want each one. (2) Detention free days — if detention_addon_options is non-empty, show the user the available tiers (each tier shows total_free_days and addon_price) alongside the base detention_base_free_days, and ask whether they want to upgrade; if yes, record the chosen tier's add-on days (total_free_days minus detention_base_free_days). Once both choices are confirmed, call rates_evaluate_total_price_from_instant_price_search with: the snapshot IDs, wants_* flags per the user's add-on choices (force_included services must also have their wants_* flag set to true), and detention_addon_free_days set to the chosen add-on days (omit if the user declined the upgrade). Present the evaluated total price and full charge breakdown, then ask for explicit confirmation. Pass the same wants_* flags and detention_addon_free_days to rates_instant_book unchanged, along with the price_confirmation_token this evaluate call returns. rates_instant_book recomputes the same selection fingerprint and returns REQUIRES_PRICE_CONFIRMATION if it is missing or does not match. This workflow guard is intended for cooperative MCP clients; it is not proof that an arbitrary caller ran the evaluate tool. Only call rates_instant_book after the user confirms the evaluated price.
rates_search_instant_price