From f95b13be107153ca663980ae4ac85dc0099a3a24 Mon Sep 17 00:00:00 2001 From: Klappy Date: Wed, 15 Apr 2026 01:45:08 +0000 Subject: [PATCH] feat: add ?consumer= query param as highest-priority consumer identification --- workers/src/telemetry.ts | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/workers/src/telemetry.ts b/workers/src/telemetry.ts index 9c4534e..f3b6192 100644 --- a/workers/src/telemetry.ts +++ b/workers/src/telemetry.ts @@ -77,27 +77,36 @@ function parseClientInfoName(payload: unknown): string | null { /** * Consumer label resolution chain: - * 1. x-oddkit-client header (explicit, highest priority) - * 2. MCP initialize → clientInfo.name (protocol-native) - * 3. User-Agent header (fallback) - * 4. "unknown" (default) + * 1. ?consumer= query parameter (URL-level, highest priority) + * 2. x-oddkit-client header (explicit) + * 3. MCP initialize → clientInfo.name (protocol-native) + * 4. User-Agent header (fallback) + * 5. "unknown" (default) */ export function parseConsumerLabel( request: Request, payload: unknown, ): { label: string; source: string } { - // 1. Explicit header + // 1. URL query parameter — lets platforms that block custom headers self-identify + const url = new URL(request.url); + const consumer = url.searchParams.get("consumer"); + if (consumer) { + const label = sanitize(consumer); + if (label) return { label, source: "query-param" }; + } + + // 2. Explicit header const explicit = request.headers.get("x-oddkit-client"); if (explicit) { const label = sanitize(explicit); if (label) return { label, source: "x-oddkit-client" }; } - // 2. MCP initialize clientInfo.name + // 3. MCP initialize clientInfo.name const fromInit = parseClientInfoName(payload); if (fromInit) return { label: fromInit, source: "initialize.clientInfo.name" }; - // 3. User-Agent + // 4. User-Agent const ua = request.headers.get("user-agent"); if (ua) { const first = ua.split(/\s+/)[0] ?? "";