Skip to main content
Glama

airbnb_listing_details

Retrieve comprehensive Airbnb listing details including availability, pricing, and direct booking links by providing listing ID and optional stay parameters.

Instructions

Get detailed information about a specific Airbnb listing. Provide direct links to the user

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
idYesThe Airbnb listing ID
checkinNoCheck-in date (YYYY-MM-DD)
checkoutNoCheck-out date (YYYY-MM-DD)
adultsNoNumber of adults
childrenNoNumber of children
infantsNoNumber of infants
petsNoNumber of pets
ignoreRobotsTextNoIgnore robots.txt rules for this request

Implementation Reference

  • The handler function that constructs the listing URL, checks robots.txt, fetches the page, parses JSON data from script tag using cheerio, extracts allowed sections, and returns structured details.
    async function handleAirbnbListingDetails(params: any) { const { id, checkin, checkout, adults = 1, children = 0, infants = 0, pets = 0, ignoreRobotsText = false, } = params; // Build listing URL const listingUrl = new URL(`${BASE_URL}/rooms/${id}`); // Add query parameters if (checkin) listingUrl.searchParams.append("check_in", checkin); if (checkout) listingUrl.searchParams.append("check_out", checkout); // Add guests const adults_int = parseInt(adults.toString()); const children_int = parseInt(children.toString()); const infants_int = parseInt(infants.toString()); const pets_int = parseInt(pets.toString()); const totalGuests = adults_int + children_int; if (totalGuests > 0) { listingUrl.searchParams.append("adults", adults_int.toString()); listingUrl.searchParams.append("children", children_int.toString()); listingUrl.searchParams.append("infants", infants_int.toString()); listingUrl.searchParams.append("pets", pets_int.toString()); } // Check if path is allowed by robots.txt const path = listingUrl.pathname + listingUrl.search; if (!ignoreRobotsText && !isPathAllowed(path)) { return { content: [{ type: "text", text: JSON.stringify({ error: robotsErrorMessage, url: listingUrl.toString() }, null, 2) }], isError: true }; } const allowSectionSchema: Record<string, any> = { "LOCATION_DEFAULT": { lat: true, lng: true, subtitle: true, title: true }, "POLICIES_DEFAULT": { title: true, houseRulesSections: { title: true, items : { title: true } } }, "HIGHLIGHTS_DEFAULT": { highlights: { title: true } }, "DESCRIPTION_DEFAULT": { htmlDescription: { htmlText: true } }, "AMENITIES_DEFAULT": { title: true, seeAllAmenitiesGroups: { title: true, amenities: { title: true } } }, //"AVAILABLITY_CALENDAR_DEFAULT": true, }; try { const response = await fetchWithUserAgent(listingUrl.toString()); const html = await response.text(); const $ = cheerio.load(html); let details = {}; try { const scriptElement = $("#data-deferred-state-0").first(); const clientData = JSON.parse($(scriptElement).text()).niobeMinimalClientData[0][1]; const sections = clientData.data.presentation.stayProductDetailPage.sections.sections; sections.forEach((section: any) => cleanObject(section)); details = sections .filter((section: any) => allowSectionSchema.hasOwnProperty(section.sectionId)) .map((section: any) => { return { id: section.sectionId, ...flattenArraysInObject(pickBySchema(section.section, allowSectionSchema[section.sectionId])) } }); } catch (e) { console.error(e); } return { content: [{ type: "text", text: JSON.stringify({ listingUrl: listingUrl.toString(), url: listingUrl.toString(), details: details }, null, 2) }], isError: false }; } catch (error) { return { content: [{ type: "text", text: JSON.stringify({ error: error instanceof Error ? error.message : String(error), listingUrl: listingUrl.toString() }, null, 2) }], isError: true }; } }
  • Tool definition including name, description, and input schema for parameters like listing ID, dates, and guest counts.
    const AIRBNB_LISTING_DETAILS_TOOL: Tool = { name: "airbnb_listing_details", description: "Get detailed information about a specific Airbnb listing. Provide direct links to the user", inputSchema: { type: "object", properties: { id: { type: "string", description: "The Airbnb listing ID" }, checkin: { type: "string", description: "Check-in date (YYYY-MM-DD)" }, checkout: { type: "string", description: "Check-out date (YYYY-MM-DD)" }, adults: { type: "number", description: "Number of adults" }, children: { type: "number", description: "Number of children" }, infants: { type: "number", description: "Number of infants" }, pets: { type: "number", description: "Number of pets" }, ignoreRobotsText: { type: "boolean", description: "Ignore robots.txt rules for this request" } }, required: ["id"] } };
  • index.ts:120-123 (registration)
    The tool is registered in the AIRBNB_TOOLS array, which is returned by the ListToolsRequestSchema handler.
    const AIRBNB_TOOLS = [ AIRBNB_SEARCH_TOOL, AIRBNB_LISTING_DETAILS_TOOL, ] as const;
  • index.ts:504-506 (registration)
    Tool dispatch in the CallToolRequestSchema switch statement, calling the handler function.
    case "airbnb_listing_details": { return await handleAirbnbListingDetails(request.params.arguments); }

Other Tools

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/Domoteek/mcp-server-airbnb'

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