Skip to main content
Glama

duffel_get_offer

Read-onlyIdempotent

Retrieve current flight pricing and detailed offer information including schedules, baggage allowances, and booking requirements before confirming travel arrangements.

Instructions

Retrieve detailed information and current pricing for a specific flight offer.

This tool fetches the latest version of an offer, including:
- Up-to-date pricing and availability
- Complete flight schedule and routing
- Passenger requirements and restrictions
- Baggage allowance and cabin details
- Cancellation and change policies

Use this when:
- User selects a flight from search results
- Before booking to confirm current price
- To check if an offer is still available
- To get passenger IDs needed for booking

Important: Always retrieve the offer immediately before booking to ensure pricing
is current, as offers expire after 15-30 minutes.

Returns offer details in specified format (JSON or Markdown).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
paramsYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
resultYes

Implementation Reference

  • The handler function that implements the core logic of the duffel_get_offer tool, fetching offer details from Duffel API, validating expiration, and formatting output.
    async def get_offer(params: GetOfferInput) -> str:
        """
        Retrieve detailed information and current pricing for a specific flight offer.
        
        This tool fetches the latest version of an offer, including:
        - Up-to-date pricing and availability
        - Complete flight schedule and routing
        - Passenger requirements and restrictions
        - Baggage allowance and cabin details
        - Cancellation and change policies
        
        Use this when:
        - User selects a flight from search results
        - Before booking to confirm current price
        - To check if an offer is still available
        - To get passenger IDs needed for booking
        
        Important: Always retrieve the offer immediately before booking to ensure pricing
        is current, as offers expire after 15-30 minutes.
        
        Returns offer details in specified format (JSON or Markdown).
        """
        try:
            response = await make_api_request(
                method="GET",
                endpoint=f"/air/offers/{params.offer_id}"
            )
            
            offer = response["data"]
            
            expires_at = datetime.fromisoformat(offer["expires_at"].replace("Z", "+00:00"))
            if expires_at < datetime.now().astimezone():
                return (
                    f"⚠️ This offer has expired at {offer['expires_at']}.\n\n"
                    "Offers typically expire 15-30 minutes after creation. "
                    "Please perform a new flight search to get current offers."
                )
            
            if params.response_format == ResponseFormat.JSON:
                return truncate_text(format_json_response(offer))
            
            else:  # Markdown format
                result = format_markdown_flight_offer(offer)
                
                passengers = offer.get("passengers", [])
                if passengers:
                    result += "\n### Passengers\n"
                    for i, pax in enumerate(passengers, 1):
                        result += f"{i}. **ID**: `{pax['id']}` - Type: {pax.get('type', 'N/A')}\n"
                
                conditions = offer.get("conditions", {})
                if conditions:
                    result += "\n### Booking Conditions\n"
                    if conditions.get("change_before_departure"):
                        result += f"- Change allowed: {conditions['change_before_departure'].get('allowed', False)}\n"
                    if conditions.get("refund_before_departure"):
                        result += f"- Refund allowed: {conditions['refund_before_departure'].get('allowed', False)}\n"
                
                return truncate_text(result)
                
        except Exception as e:
            return f"Error retrieving offer: {str(e)}\n\nTroubleshooting:\n- Verify the offer ID is correct (starts with 'off_')\n- Check if the offer has expired\n- Offer might have been booked by someone else"
  • Pydantic input schema defining parameters for duffel_get_offer: offer_id (required, validated pattern) and response_format.
    class GetOfferInput(BaseModel):
        """Input for retrieving a specific flight offer."""
        model_config = ConfigDict(str_strip_whitespace=True, validate_assignment=True, extra='forbid')
    
        offer_id: str = Field(
            ...,
            description="Duffel offer ID (e.g., 'off_00009htYpSCXrwaB9DnUm0')",
            pattern="^off_[a-zA-Z0-9]+$"
        )
        response_format: ResponseFormat = Field(
            default=ResponseFormat.MARKDOWN,
            description="Output format: 'json' for raw data or 'markdown' for readable summary"
        )
  • MCP decorator registering the tool with name 'duffel_get_offer' and operational annotations.
    @mcp.tool(
        name="duffel_get_offer",
        annotations={
            "title": "Get Flight Offer Details",
            "readOnlyHint": True,
            "destructiveHint": False,
            "idempotentHint": True,
            "openWorldHint": True
        }
    )

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/FortripEngineering/duffel-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server