log_unmet_request
Records user nightlife queries when no suitable events or venues are found, enabling follow-up analysis to improve search results.
Instructions
Log unmet user intent when no good nightlife answer is available, for product follow-up.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| channel | No | ||
| language | No | ||
| city | No | ||
| raw_query | Yes | ||
| intent | No | ||
| suggested_filters | No | ||
| user_hash | No |
Implementation Reference
- src/services/requests.ts:70-107 (handler)The core implementation of the log_unmet_request tool, which validates input and inserts the unmet request record into Supabase.
export async function logUnmetRequest( supabase: SupabaseClient, input: LogUnmetRequestInput, ): Promise<UnmetRequestResult> { const rawQuery = String(input.raw_query || "").trim(); if (!rawQuery) { throw new NightlifeError("INVALID_REQUEST", "raw_query cannot be blank."); } const payload = { channel: normalizeChannel(input.channel), language: normalizeLanguage(input.language), city: normalizeCity(input.city), raw_query: rawQuery.slice(0, 4000), normalized_intent: normalizeIntent(input.intent), suggested_filters: normalizeSuggestedFilters(input.suggested_filters), user_hash: normalizeUserHash(input.user_hash), status: "open", }; const { data, error } = await supabase .from("concierge_unmet_requests") .insert(payload) .select("id,status,created_at") .single<UnmetRequestRow>(); if (error || !data) { throw new NightlifeError("REQUEST_WRITE_FAILED", "Failed to log unmet request.", { cause: error?.message || "Unknown insert error", }); } return { request_id: data.id, status: data.status, created_at: data.created_at, }; } - src/tools/requests.ts:79-102 (registration)Registration of the log_unmet_request tool with the MCP server, including input/output schema validation and wrapping in the runTool handler.
export function registerRequestTools(server: McpServer, deps: ToolDeps): void { server.registerTool( "log_unmet_request", { description: "Log unmet user intent when no good nightlife answer is available, for product follow-up.", inputSchema: { channel: z.string().optional(), language: z.string().optional(), city: z.string().optional(), raw_query: z.string().min(1), intent: z.string().optional(), suggested_filters: z.record(z.string(), z.unknown()).optional(), user_hash: z.string().optional(), }, outputSchema: unmetRequestOutputSchema, }, async (args) => runTool( "log_unmet_request", unmetRequestOutputSchema, async () => logUnmetRequest(deps.supabase, args), ), ); }