Skip to main content
Glama
alcylu

Nightlife Search

get_guest_list_entry_status

Retrieve the current status of a guest list entry. Provide the entry ID, or the event ID and customer email, to access confirmation, waitlist, or other status details for nightlife events.

Instructions

Check the status of a guest list entry. Provide either entry_id or event_id + customer_email.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
entry_idNo
event_idNo
customer_emailNo

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
entry_idYes
statusYes
customer_nameYes
event_nameYes
event_dateYes
created_atYes
guest_list_benefitYes
door_instructionsYes

Implementation Reference

  • Core handler that looks up a guest list entry by entry_id or event_id+customer_email, retrieves event name/date and guest list settings, and returns status (confirmed/cancelled), customer details, and door instructions.
    export async function getGuestListEntryStatus(
      supabase: SupabaseClient,
      input: StatusInput,
    ): Promise<StatusOutput> {
      if (!input.entry_id && !(input.event_id && input.customer_email)) {
        throw new NightlifeError(
          "INVALID_REQUEST",
          "Must provide either entry_id or event_id + customer_email",
        );
      }
    
      let entryData: any = null;
    
      if (input.entry_id) {
        const { data, error } = await supabase
          .from("event_guest_list_entries")
          .select("id, email, name, created_at, event_day_id, venue_id, service_date")
          .eq("id", input.entry_id)
          .maybeSingle();
    
        if (error) {
          throw new NightlifeError("DB_QUERY_FAILED", `Failed to look up entry: ${error.message}`);
        }
        entryData = data;
      } else if (input.event_id && input.customer_email) {
        // Resolve event_id to event_day_id(s)
        const { data: eventDays } = await supabase
          .from("event_occurrence_days")
          .select("id")
          .eq("event_occurrence_id", input.event_id);
    
        const dayIds = eventDays?.map((d: any) => d.id) ?? [];
    
        if (dayIds.length > 0) {
          const { data, error } = await supabase
            .from("event_guest_list_entries")
            .select("id, email, name, created_at, event_day_id, venue_id, service_date")
            .eq("email", input.customer_email.toLowerCase())
            .in("event_day_id", dayIds)
            .order("created_at", { ascending: false })
            .limit(1)
            .maybeSingle();
    
          if (error) {
            throw new NightlifeError("DB_QUERY_FAILED", `Failed to look up entry: ${error.message}`);
          }
          entryData = data;
        }
      }
    
      if (!entryData) {
        throw new NightlifeError(
          "GUEST_LIST_ENTRY_NOT_FOUND",
          "Guest list entry not found",
        );
      }
    
      // Get event name if we have event_day_id
      let eventName: string | null = null;
      let eventDate: string | null = entryData.service_date;
    
      if (entryData.event_day_id) {
        const { data: eventDay } = await supabase
          .from("event_occurrence_days")
          .select(`
            service_date,
            event_occurrences!inner (
              events!inner (
                name_en
              )
            )
          `)
          .eq("id", entryData.event_day_id)
          .maybeSingle();
    
        if (eventDay) {
          eventName = (eventDay as any).event_occurrences?.events?.name_en ?? null;
          eventDate = eventDay.service_date;
        }
      }
    
      // Get guest list settings for benefit/instructions
      const settings = await loadGuestListSettings(
        supabase,
        entryData.event_day_id,
        entryData.venue_id,
      );
    
      return {
        entry_id: entryData.id,
        status: "confirmed",
        customer_name: entryData.name,
        event_name: eventName,
        event_date: eventDate,
        created_at: entryData.created_at,
        guest_list_benefit: settings?.benefit_en ?? null,
        door_instructions: settings?.door_instructions_en ?? null,
      };
    }
  • Input and output Zod schemas for the get_guest_list_entry_status tool. Input: entry_id, event_id, or customer_email. Output: entry_id, status, customer_name, event_name, event_date, created_at, guest_list_benefit, door_instructions.
    export const getGuestListEntryStatusInputSchema = {
      entry_id: z.string().optional(),
      event_id: z.string().optional(),
      customer_email: z.string().optional(),
    };
    
    export const getGuestListEntryStatusOutputSchema = z.object({
      entry_id: z.string(),
      status: z.enum(["confirmed", "cancelled"]),
      customer_name: z.string(),
      event_name: z.string().nullable(),
      event_date: z.string().nullable(),
      created_at: z.string(),
      guest_list_benefit: z.string().nullable(),
      door_instructions: z.string().nullable(),
    });
  • Registration of the 'get_guest_list_entry_status' tool via server.registerTool() with input/output schemas, delegating to the service handler.
    server.registerTool(
      "get_guest_list_entry_status",
      {
        description:
          "Check the status of a guest list entry. Provide either entry_id or event_id + customer_email.",
        inputSchema: getGuestListEntryStatusInputSchema,
        outputSchema: getGuestListEntryStatusOutputSchema,
      },
      async (args) => runTool(
        "get_guest_list_entry_status",
        getGuestListEntryStatusOutputSchema,
        async () => getGuestListEntryStatus(deps.supabase, args),
      ),
    );
  • src/server.ts:37-44 (registration)
    Top-level call to registerGuestListTools() in the MCP server setup, which registers all guest list tools including get_guest_list_entry_status.
      registerGuestListTools(server, { supabase });
      if (options.includeOpsTools) {
        registerVipAgentOpsTools(server, { supabase, config });
        registerVipTableOpsTools(server, { supabase });
        registerDepositOpsTools(server, { supabase, config });
      }
      return server;
    }
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

In the absence of annotations, the description carries the full burden but only conveys a read operation ('Check'). It does not detail error cases or behavior when both lookup methods are provided, but for a simple check operation this is mostly sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: the first states the purpose, the second provides exact usage instructions. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool has an output schema (handling return values) and is a simple read operation, the description covers the main invocation logic. It could mention idempotency or lack of side effects, but the 'Check' verb implies read-only.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description adds critical relational context between parameters ('either ... or ...'), which is not present in the schema. However, it does not describe individual parameter formats or constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Check') and resource ('status of a guest list entry'), clearly distinguishing it from sibling tools like 'submit_to_guest_list' (creation) and 'cancel_vip_booking_request' (cancellation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the two valid parameter combinations ('Provide either entry_id or event_id + customer_email'), guiding the agent on how to invoke the tool correctly without ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

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/alcylu/nightlife-mcp'

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