Skip to main content
Glama
AkekaratP

Flight + Stay Search MCP

by AkekaratP

get_stay_reviews

Retrieve guest reviews for a specific hotel stay to assess accommodation quality before booking. Supports pagination for browsing multiple reviews.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
stay_idYesDuffel stay/hotel ID (e.g., acc_0000AWr2VsUNIF1Vl91xg0)
afterNoPagination cursor: after
beforeNoPagination cursor: before
limitNoMax reviews to return (1-200)

Implementation Reference

  • The inline MCP tool handler function for 'get_stay_reviews'. It receives the input parameters, calls the DuffelStaysClient's getStayReviews method, formats the response as an MCP content block containing the JSON-stringified reviews data, and handles errors.
    async (params: StayReviewRequest) => {
      try {
        const response = await staysClient.getStayReviews(params);
        return {
          content: [
            {
              type: 'text',
              text: JSON.stringify(response, null, 2)
            }
          ]
        };
      } catch (error) {
        console.error(`Error fetching stay reviews: ${error}`);
        throw error;
      }
    }
  • Zod schema defining the input parameters for the 'get_stay_reviews' tool, including stay_id (required), and optional pagination parameters.
    export const stayReviewSchema = z.object({
      stay_id: z.string().describe('Duffel stay/hotel ID (e.g., acc_0000AWr2VsUNIF1Vl91xg0)'),
      after: z.string().optional().describe('Pagination cursor: after'),
      before: z.string().optional().describe('Pagination cursor: before'),
      limit: z.number().int().min(1).max(200).optional().describe('Max reviews to return (1-200)'),
    });
  • Helper method in DuffelStaysClient that performs the actual API request to Duffel's stays reviews endpoint, processes the response data into the expected StayReviewResponse format.
    async getStayReviews(params: StayReviewRequest): Promise<StayReviewResponse> {
      const { stay_id, after, before, limit } = params;
      const query: Record<string, string | number> = {};
      if (after) query.after = after;
      if (before) query.before = before;
      if (limit) query.limit = limit;
      const response = await this.client.get(`/accommodation/${stay_id}/reviews`, { params: query, headers: { 'Duffel-Version': 'v2' } });
      const meta = response.data.meta || {};
      const reviews = (response.data.data?.reviews || []).map((r: any) => ({
        text: r.text,
        score: r.score,
        reviewer_name: r.reviewer_name,
        created_at: r.created_at,
      }));
      return { meta, reviews };
    }
  • src/server.ts:205-224 (registration)
    Registration of the 'get_stay_reviews' MCP tool on the server, specifying the tool name, input schema, and handler function.
    server.tool(
      'get_stay_reviews',
      stayReviewSchema.shape,
      async (params: StayReviewRequest) => {
        try {
          const response = await staysClient.getStayReviews(params);
          return {
            content: [
              {
                type: 'text',
                text: JSON.stringify(response, null, 2)
              }
            ]
          };
        } catch (error) {
          console.error(`Error fetching stay reviews: ${error}`);
          throw error;
        }
      }
    );

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/AkekaratP/flights-mcp-ts'

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