ga4_channel_performance
Retrieve performance metrics by channel group: sessions, users, conversions, and revenue for Organic Search, Paid Search, Email, Direct, Referral, and more. Specify date range and property.
Instructions
Default channel group rollup: sessions/users/conversions/revenue for Organic Search, Paid Search, Email, Direct, Referral, etc.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| start_date | No | Start date: YYYY-MM-DD, NdaysAgo, yesterday, or today | 28daysAgo |
| end_date | No | End date: YYYY-MM-DD, NdaysAgo, yesterday, or today | yesterday |
| property_id | No | Override GA4_PROPERTY_ID env var for this call | |
| limit | No | Max rows to return |
Implementation Reference
- src/tools/reports.ts:103-121 (handler)The channelPerformance function queries GA4 for channel group rollup data (sessions, users, conversions, revenue) grouped by sessionDefaultChannelGroup.
export async function channelPerformance(args: z.infer<z.ZodObject<typeof channelPerfSchema>>) { const [res] = await getClient().runReport({ property: getProperty(args.property_id), dateRanges: toDateRange(args.start_date, args.end_date), dimensions: [{ name: "sessionDefaultChannelGroup" }], metrics: [ { name: "sessions" }, { name: "totalUsers" }, { name: "newUsers" }, { name: "engagementRate" }, { name: "conversions" }, { name: "keyEvents" }, { name: "totalRevenue" }, ], orderBys: [{ metric: { metricName: "sessions" }, desc: true }], limit: args.limit as unknown as number, }); return formatReport(res); } - src/tools/reports.ts:101-101 (schema)The channelPerfSchema defines input validation for channel performance: start_date, end_date, property_id, and limit.
export const channelPerfSchema = { ...dateRange }; - src/index.ts:100-107 (registration)Registration of the 'ga4_channel_performance' tool on the MCP server with its schema and handler binding.
server.tool( "ga4_channel_performance", "Default channel group rollup: sessions/users/conversions/revenue for Organic Search, Paid Search, Email, Direct, Referral, etc.", channelPerfSchema, async (args) => { try { return ok(await channelPerformance(args)); } catch (e) { return err(e); } } ); - src/tools/reports.ts:15-29 (helper)The formatReport helper transforms raw GA4 API responses into structured row objects.
function formatReport(res: any) { const rows = (res.rows ?? []).map((r: any) => { const out: Record<string, string | number> = {}; (res.dimensionHeaders ?? []).forEach((h: any, i: number) => { out[h.name] = r.dimensionValues?.[i]?.value ?? ""; }); (res.metricHeaders ?? []).forEach((h: any, i: number) => { const v = r.metricValues?.[i]?.value ?? "0"; const n = Number(v); out[h.name] = Number.isFinite(n) ? n : v; }); return out; }); return { rowCount: res.rowCount ?? rows.length, rows }; }