@heyseo/mcp-server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +284 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +258 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/index.d.ts +22 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +267 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/resources/index.d.ts +38 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +247 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/tools/comparison.d.ts +159 -0
- package/dist/tools/comparison.d.ts.map +1 -0
- package/dist/tools/comparison.js +482 -0
- package/dist/tools/comparison.js.map +1 -0
- package/dist/tools/ga4.d.ts +182 -0
- package/dist/tools/ga4.d.ts.map +1 -0
- package/dist/tools/ga4.js +429 -0
- package/dist/tools/ga4.js.map +1 -0
- package/dist/tools/gsc.d.ts +194 -0
- package/dist/tools/gsc.d.ts.map +1 -0
- package/dist/tools/gsc.js +348 -0
- package/dist/tools/gsc.js.map +1 -0
- package/dist/tools/index.d.ts +392 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +59 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/pagespeed.d.ts +88 -0
- package/dist/tools/pagespeed.d.ts.map +1 -0
- package/dist/tools/pagespeed.js +285 -0
- package/dist/tools/pagespeed.js.map +1 -0
- package/dist/tools/tasks.d.ts +71 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +116 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/types.d.ts +151 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/api-client.d.ts +69 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +202 -0
- package/dist/utils/api-client.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Analytics 4 Tools
|
|
3
|
+
* Tools for querying GA4 analytics data
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import type { HeySeoApiClient } from '../utils/api-client.js';
|
|
7
|
+
export declare const queryGA4Schema: z.ZodObject<{
|
|
8
|
+
siteId: z.ZodString;
|
|
9
|
+
startDate: z.ZodString;
|
|
10
|
+
endDate: z.ZodString;
|
|
11
|
+
metrics: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodEnum<["sessions", "activeUsers", "newUsers", "engagementRate", "bounceRate", "averageSessionDuration", "screenPageViews", "conversions", "eventCount"]>, "many">>>;
|
|
12
|
+
dimensions: z.ZodOptional<z.ZodArray<z.ZodEnum<["date", "landingPage", "pagePath", "sessionSource", "sessionMedium", "deviceCategory", "country", "city"]>, "many">>;
|
|
13
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
14
|
+
}, "strip", z.ZodTypeAny, {
|
|
15
|
+
siteId: string;
|
|
16
|
+
limit: number;
|
|
17
|
+
startDate: string;
|
|
18
|
+
endDate: string;
|
|
19
|
+
metrics: ("sessions" | "activeUsers" | "newUsers" | "engagementRate" | "bounceRate" | "averageSessionDuration" | "screenPageViews" | "conversions" | "eventCount")[];
|
|
20
|
+
dimensions?: ("country" | "date" | "landingPage" | "pagePath" | "sessionSource" | "sessionMedium" | "deviceCategory" | "city")[] | undefined;
|
|
21
|
+
}, {
|
|
22
|
+
siteId: string;
|
|
23
|
+
startDate: string;
|
|
24
|
+
endDate: string;
|
|
25
|
+
limit?: number | undefined;
|
|
26
|
+
dimensions?: ("country" | "date" | "landingPage" | "pagePath" | "sessionSource" | "sessionMedium" | "deviceCategory" | "city")[] | undefined;
|
|
27
|
+
metrics?: ("sessions" | "activeUsers" | "newUsers" | "engagementRate" | "bounceRate" | "averageSessionDuration" | "screenPageViews" | "conversions" | "eventCount")[] | undefined;
|
|
28
|
+
}>;
|
|
29
|
+
export type QueryGA4Input = z.infer<typeof queryGA4Schema>;
|
|
30
|
+
export declare const landingPagesSchema: z.ZodObject<{
|
|
31
|
+
siteId: z.ZodString;
|
|
32
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
33
|
+
startDate: z.ZodOptional<z.ZodString>;
|
|
34
|
+
endDate: z.ZodOptional<z.ZodString>;
|
|
35
|
+
}, "strip", z.ZodTypeAny, {
|
|
36
|
+
siteId: string;
|
|
37
|
+
limit: number;
|
|
38
|
+
startDate?: string | undefined;
|
|
39
|
+
endDate?: string | undefined;
|
|
40
|
+
}, {
|
|
41
|
+
siteId: string;
|
|
42
|
+
limit?: number | undefined;
|
|
43
|
+
startDate?: string | undefined;
|
|
44
|
+
endDate?: string | undefined;
|
|
45
|
+
}>;
|
|
46
|
+
export type LandingPagesInput = z.infer<typeof landingPagesSchema>;
|
|
47
|
+
export declare const trafficSourcesSchema: z.ZodObject<{
|
|
48
|
+
siteId: z.ZodString;
|
|
49
|
+
startDate: z.ZodOptional<z.ZodString>;
|
|
50
|
+
endDate: z.ZodOptional<z.ZodString>;
|
|
51
|
+
}, "strip", z.ZodTypeAny, {
|
|
52
|
+
siteId: string;
|
|
53
|
+
startDate?: string | undefined;
|
|
54
|
+
endDate?: string | undefined;
|
|
55
|
+
}, {
|
|
56
|
+
siteId: string;
|
|
57
|
+
startDate?: string | undefined;
|
|
58
|
+
endDate?: string | undefined;
|
|
59
|
+
}>;
|
|
60
|
+
export type TrafficSourcesInput = z.infer<typeof trafficSourcesSchema>;
|
|
61
|
+
/**
|
|
62
|
+
* Execute GA4 query tool
|
|
63
|
+
*/
|
|
64
|
+
export declare function executeQueryGA4(client: HeySeoApiClient, input: QueryGA4Input): Promise<string>;
|
|
65
|
+
/**
|
|
66
|
+
* Execute landing pages tool
|
|
67
|
+
*/
|
|
68
|
+
export declare function executeLandingPages(client: HeySeoApiClient, input: LandingPagesInput): Promise<string>;
|
|
69
|
+
/**
|
|
70
|
+
* Execute traffic sources tool
|
|
71
|
+
*/
|
|
72
|
+
export declare function executeTrafficSources(client: HeySeoApiClient, input: TrafficSourcesInput): Promise<string>;
|
|
73
|
+
/**
|
|
74
|
+
* GA4 tool definitions for MCP
|
|
75
|
+
*/
|
|
76
|
+
export declare const ga4Tools: ({
|
|
77
|
+
name: string;
|
|
78
|
+
description: string;
|
|
79
|
+
inputSchema: {
|
|
80
|
+
type: string;
|
|
81
|
+
properties: {
|
|
82
|
+
siteId: {
|
|
83
|
+
type: string;
|
|
84
|
+
description: string;
|
|
85
|
+
};
|
|
86
|
+
startDate: {
|
|
87
|
+
type: string;
|
|
88
|
+
pattern: string;
|
|
89
|
+
description: string;
|
|
90
|
+
};
|
|
91
|
+
endDate: {
|
|
92
|
+
type: string;
|
|
93
|
+
pattern: string;
|
|
94
|
+
description: string;
|
|
95
|
+
};
|
|
96
|
+
metrics: {
|
|
97
|
+
type: string;
|
|
98
|
+
items: {
|
|
99
|
+
type: string;
|
|
100
|
+
enum: string[];
|
|
101
|
+
};
|
|
102
|
+
default: string[];
|
|
103
|
+
description: string;
|
|
104
|
+
};
|
|
105
|
+
dimensions: {
|
|
106
|
+
type: string;
|
|
107
|
+
items: {
|
|
108
|
+
type: string;
|
|
109
|
+
enum: string[];
|
|
110
|
+
};
|
|
111
|
+
description: string;
|
|
112
|
+
};
|
|
113
|
+
limit: {
|
|
114
|
+
type: string;
|
|
115
|
+
minimum: number;
|
|
116
|
+
maximum: number;
|
|
117
|
+
default: number;
|
|
118
|
+
description: string;
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
required: string[];
|
|
122
|
+
};
|
|
123
|
+
} | {
|
|
124
|
+
name: string;
|
|
125
|
+
description: string;
|
|
126
|
+
inputSchema: {
|
|
127
|
+
type: string;
|
|
128
|
+
properties: {
|
|
129
|
+
siteId: {
|
|
130
|
+
type: string;
|
|
131
|
+
description: string;
|
|
132
|
+
};
|
|
133
|
+
limit: {
|
|
134
|
+
type: string;
|
|
135
|
+
minimum: number;
|
|
136
|
+
maximum: number;
|
|
137
|
+
default: number;
|
|
138
|
+
description: string;
|
|
139
|
+
};
|
|
140
|
+
startDate: {
|
|
141
|
+
type: string;
|
|
142
|
+
pattern: string;
|
|
143
|
+
description: string;
|
|
144
|
+
};
|
|
145
|
+
endDate: {
|
|
146
|
+
type: string;
|
|
147
|
+
pattern: string;
|
|
148
|
+
description: string;
|
|
149
|
+
};
|
|
150
|
+
metrics?: undefined;
|
|
151
|
+
dimensions?: undefined;
|
|
152
|
+
};
|
|
153
|
+
required: string[];
|
|
154
|
+
};
|
|
155
|
+
} | {
|
|
156
|
+
name: string;
|
|
157
|
+
description: string;
|
|
158
|
+
inputSchema: {
|
|
159
|
+
type: string;
|
|
160
|
+
properties: {
|
|
161
|
+
siteId: {
|
|
162
|
+
type: string;
|
|
163
|
+
description: string;
|
|
164
|
+
};
|
|
165
|
+
startDate: {
|
|
166
|
+
type: string;
|
|
167
|
+
pattern: string;
|
|
168
|
+
description: string;
|
|
169
|
+
};
|
|
170
|
+
endDate: {
|
|
171
|
+
type: string;
|
|
172
|
+
pattern: string;
|
|
173
|
+
description: string;
|
|
174
|
+
};
|
|
175
|
+
metrics?: undefined;
|
|
176
|
+
dimensions?: undefined;
|
|
177
|
+
limit?: undefined;
|
|
178
|
+
};
|
|
179
|
+
required: string[];
|
|
180
|
+
};
|
|
181
|
+
})[];
|
|
182
|
+
//# sourceMappingURL=ga4.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ga4.d.ts","sourceRoot":"","sources":["../../src/tools/ga4.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAG9D,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;EAiDzB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAG3D,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;EAmB7B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAGnE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;EAY/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAEvE;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,MAAM,CAAC,CAwDjB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,MAAM,CAAC,CAkEjB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,MAAM,CAAC,CAsDjB;AA8BD;;GAEG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAoJpB,CAAC"}
|
|
@@ -0,0 +1,429 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Google Analytics 4 Tools
|
|
3
|
+
* Tools for querying GA4 analytics data
|
|
4
|
+
*/
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
// Schema for GA4 query tool
|
|
7
|
+
export const queryGA4Schema = z.object({
|
|
8
|
+
siteId: z.string().describe('The ID of the site to query'),
|
|
9
|
+
startDate: z
|
|
10
|
+
.string()
|
|
11
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
12
|
+
.describe('Start date in YYYY-MM-DD format'),
|
|
13
|
+
endDate: z
|
|
14
|
+
.string()
|
|
15
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
16
|
+
.describe('End date in YYYY-MM-DD format'),
|
|
17
|
+
metrics: z
|
|
18
|
+
.array(z.enum([
|
|
19
|
+
'sessions',
|
|
20
|
+
'activeUsers',
|
|
21
|
+
'newUsers',
|
|
22
|
+
'engagementRate',
|
|
23
|
+
'bounceRate',
|
|
24
|
+
'averageSessionDuration',
|
|
25
|
+
'screenPageViews',
|
|
26
|
+
'conversions',
|
|
27
|
+
'eventCount',
|
|
28
|
+
]))
|
|
29
|
+
.optional()
|
|
30
|
+
.default(['sessions', 'activeUsers', 'bounceRate', 'engagementRate'])
|
|
31
|
+
.describe('Metrics to retrieve'),
|
|
32
|
+
dimensions: z
|
|
33
|
+
.array(z.enum([
|
|
34
|
+
'date',
|
|
35
|
+
'landingPage',
|
|
36
|
+
'pagePath',
|
|
37
|
+
'sessionSource',
|
|
38
|
+
'sessionMedium',
|
|
39
|
+
'deviceCategory',
|
|
40
|
+
'country',
|
|
41
|
+
'city',
|
|
42
|
+
]))
|
|
43
|
+
.optional()
|
|
44
|
+
.describe('Dimensions to group by'),
|
|
45
|
+
limit: z
|
|
46
|
+
.number()
|
|
47
|
+
.min(1)
|
|
48
|
+
.max(10000)
|
|
49
|
+
.optional()
|
|
50
|
+
.default(1000)
|
|
51
|
+
.describe('Maximum number of rows to return'),
|
|
52
|
+
});
|
|
53
|
+
// Schema for landing pages tool
|
|
54
|
+
export const landingPagesSchema = z.object({
|
|
55
|
+
siteId: z.string().describe('The ID of the site to query'),
|
|
56
|
+
limit: z
|
|
57
|
+
.number()
|
|
58
|
+
.min(1)
|
|
59
|
+
.max(500)
|
|
60
|
+
.optional()
|
|
61
|
+
.default(50)
|
|
62
|
+
.describe('Number of landing pages to return'),
|
|
63
|
+
startDate: z
|
|
64
|
+
.string()
|
|
65
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
66
|
+
.optional()
|
|
67
|
+
.describe('Start date (defaults to 28 days ago)'),
|
|
68
|
+
endDate: z
|
|
69
|
+
.string()
|
|
70
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
71
|
+
.optional()
|
|
72
|
+
.describe('End date (defaults to today)'),
|
|
73
|
+
});
|
|
74
|
+
// Schema for traffic sources tool
|
|
75
|
+
export const trafficSourcesSchema = z.object({
|
|
76
|
+
siteId: z.string().describe('The ID of the site to query'),
|
|
77
|
+
startDate: z
|
|
78
|
+
.string()
|
|
79
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
80
|
+
.optional()
|
|
81
|
+
.describe('Start date (defaults to 28 days ago)'),
|
|
82
|
+
endDate: z
|
|
83
|
+
.string()
|
|
84
|
+
.regex(/^\d{4}-\d{2}-\d{2}$/)
|
|
85
|
+
.optional()
|
|
86
|
+
.describe('End date (defaults to today)'),
|
|
87
|
+
});
|
|
88
|
+
/**
|
|
89
|
+
* Execute GA4 query tool
|
|
90
|
+
*/
|
|
91
|
+
export async function executeQueryGA4(client, input) {
|
|
92
|
+
try {
|
|
93
|
+
const result = await client.queryGA4({
|
|
94
|
+
siteId: input.siteId,
|
|
95
|
+
startDate: input.startDate,
|
|
96
|
+
endDate: input.endDate,
|
|
97
|
+
metrics: input.metrics,
|
|
98
|
+
dimensions: input.dimensions,
|
|
99
|
+
limit: input.limit,
|
|
100
|
+
});
|
|
101
|
+
// Format results
|
|
102
|
+
const formattedRows = result.map((row) => {
|
|
103
|
+
const formatted = {};
|
|
104
|
+
// Add dimensions
|
|
105
|
+
if (row.dimensions) {
|
|
106
|
+
Object.entries(row.dimensions).forEach(([key, value]) => {
|
|
107
|
+
formatted[key] = value;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Add metrics with formatting
|
|
111
|
+
if (row.metrics) {
|
|
112
|
+
Object.entries(row.metrics).forEach(([key, value]) => {
|
|
113
|
+
if (key === 'engagementRate' || key === 'bounceRate') {
|
|
114
|
+
formatted[key] = `${(value * 100).toFixed(2)}%`;
|
|
115
|
+
}
|
|
116
|
+
else if (key === 'averageSessionDuration') {
|
|
117
|
+
formatted[key] = `${Math.round(value)}s`;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
formatted[key] = value;
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return formatted;
|
|
125
|
+
});
|
|
126
|
+
return JSON.stringify({
|
|
127
|
+
success: true,
|
|
128
|
+
period: { startDate: input.startDate, endDate: input.endDate },
|
|
129
|
+
metrics: input.metrics,
|
|
130
|
+
dimensions: input.dimensions,
|
|
131
|
+
totalRows: result.length,
|
|
132
|
+
data: formattedRows,
|
|
133
|
+
}, null, 2);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
return JSON.stringify({
|
|
137
|
+
success: false,
|
|
138
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Execute landing pages tool
|
|
144
|
+
*/
|
|
145
|
+
export async function executeLandingPages(client, input) {
|
|
146
|
+
try {
|
|
147
|
+
const endDate = input.endDate || new Date().toISOString().split('T')[0];
|
|
148
|
+
const startDate = input.startDate ||
|
|
149
|
+
new Date(Date.now() - 28 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
|
|
150
|
+
const result = await client.queryGA4({
|
|
151
|
+
siteId: input.siteId,
|
|
152
|
+
startDate,
|
|
153
|
+
endDate,
|
|
154
|
+
dimensions: ['landingPage'],
|
|
155
|
+
metrics: [
|
|
156
|
+
'sessions',
|
|
157
|
+
'activeUsers',
|
|
158
|
+
'bounceRate',
|
|
159
|
+
'engagementRate',
|
|
160
|
+
'averageSessionDuration',
|
|
161
|
+
'conversions',
|
|
162
|
+
],
|
|
163
|
+
limit: input.limit,
|
|
164
|
+
});
|
|
165
|
+
const landingPages = result.map((row, index) => ({
|
|
166
|
+
rank: index + 1,
|
|
167
|
+
landingPage: row.dimensions?.landingPage || 'unknown',
|
|
168
|
+
sessions: row.metrics?.sessions || 0,
|
|
169
|
+
users: row.metrics?.activeUsers || 0,
|
|
170
|
+
bounceRate: row.metrics?.bounceRate
|
|
171
|
+
? `${(row.metrics.bounceRate * 100).toFixed(1)}%`
|
|
172
|
+
: 'N/A',
|
|
173
|
+
engagementRate: row.metrics?.engagementRate
|
|
174
|
+
? `${(row.metrics.engagementRate * 100).toFixed(1)}%`
|
|
175
|
+
: 'N/A',
|
|
176
|
+
avgDuration: row.metrics?.avgSessionDuration
|
|
177
|
+
? `${Math.round(row.metrics.avgSessionDuration)}s`
|
|
178
|
+
: 'N/A',
|
|
179
|
+
conversions: row.metrics?.conversions || 0,
|
|
180
|
+
}));
|
|
181
|
+
// Calculate totals
|
|
182
|
+
const totals = result.reduce((acc, row) => ({
|
|
183
|
+
sessions: acc.sessions + (row.metrics?.sessions || 0),
|
|
184
|
+
users: acc.users + (row.metrics?.activeUsers || 0),
|
|
185
|
+
conversions: acc.conversions + (row.metrics?.conversions || 0),
|
|
186
|
+
}), { sessions: 0, users: 0, conversions: 0 });
|
|
187
|
+
return JSON.stringify({
|
|
188
|
+
success: true,
|
|
189
|
+
totalLandingPages: landingPages.length,
|
|
190
|
+
totals,
|
|
191
|
+
landingPages,
|
|
192
|
+
}, null, 2);
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
return JSON.stringify({
|
|
196
|
+
success: false,
|
|
197
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Execute traffic sources tool
|
|
203
|
+
*/
|
|
204
|
+
export async function executeTrafficSources(client, input) {
|
|
205
|
+
try {
|
|
206
|
+
const endDate = input.endDate || new Date().toISOString().split('T')[0];
|
|
207
|
+
const startDate = input.startDate ||
|
|
208
|
+
new Date(Date.now() - 28 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
|
|
209
|
+
const result = await client.queryGA4({
|
|
210
|
+
siteId: input.siteId,
|
|
211
|
+
startDate,
|
|
212
|
+
endDate,
|
|
213
|
+
dimensions: ['sessionSource', 'sessionMedium'],
|
|
214
|
+
metrics: ['sessions', 'activeUsers', 'engagementRate', 'conversions'],
|
|
215
|
+
limit: 100,
|
|
216
|
+
});
|
|
217
|
+
const sources = result.map((row) => ({
|
|
218
|
+
source: row.dimensions?.sessionSource || 'unknown',
|
|
219
|
+
medium: row.dimensions?.sessionMedium || 'unknown',
|
|
220
|
+
sessions: row.metrics?.sessions || 0,
|
|
221
|
+
users: row.metrics?.activeUsers || 0,
|
|
222
|
+
engagementRate: row.metrics?.engagementRate
|
|
223
|
+
? `${(row.metrics.engagementRate * 100).toFixed(1)}%`
|
|
224
|
+
: 'N/A',
|
|
225
|
+
conversions: row.metrics?.conversions || 0,
|
|
226
|
+
}));
|
|
227
|
+
// Group by channel
|
|
228
|
+
const channels = {};
|
|
229
|
+
sources.forEach((source) => {
|
|
230
|
+
const channel = categorizeChannel(source.source, source.medium);
|
|
231
|
+
if (!channels[channel]) {
|
|
232
|
+
channels[channel] = { sessions: 0, users: 0, conversions: 0 };
|
|
233
|
+
}
|
|
234
|
+
channels[channel].sessions += source.sessions;
|
|
235
|
+
channels[channel].users += source.users;
|
|
236
|
+
channels[channel].conversions += source.conversions;
|
|
237
|
+
});
|
|
238
|
+
return JSON.stringify({
|
|
239
|
+
success: true,
|
|
240
|
+
byChannel: channels,
|
|
241
|
+
bySource: sources,
|
|
242
|
+
}, null, 2);
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
return JSON.stringify({
|
|
246
|
+
success: false,
|
|
247
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Categorize traffic source into channel
|
|
253
|
+
*/
|
|
254
|
+
function categorizeChannel(source, medium) {
|
|
255
|
+
const src = source.toLowerCase();
|
|
256
|
+
const med = medium.toLowerCase();
|
|
257
|
+
if (med === 'organic' || src === 'google' || src === 'bing' || src === 'duckduckgo') {
|
|
258
|
+
return 'Organic Search';
|
|
259
|
+
}
|
|
260
|
+
if (med === 'cpc' || med === 'ppc' || med === 'paid') {
|
|
261
|
+
return 'Paid Search';
|
|
262
|
+
}
|
|
263
|
+
if (med === 'referral') {
|
|
264
|
+
return 'Referral';
|
|
265
|
+
}
|
|
266
|
+
if (med === 'email') {
|
|
267
|
+
return 'Email';
|
|
268
|
+
}
|
|
269
|
+
if (med === 'social' || src.includes('facebook') || src.includes('twitter') || src.includes('linkedin')) {
|
|
270
|
+
return 'Social';
|
|
271
|
+
}
|
|
272
|
+
if (src === '(direct)' || med === '(none)') {
|
|
273
|
+
return 'Direct';
|
|
274
|
+
}
|
|
275
|
+
return 'Other';
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* GA4 tool definitions for MCP
|
|
279
|
+
*/
|
|
280
|
+
export const ga4Tools = [
|
|
281
|
+
{
|
|
282
|
+
name: 'heyseo_query_ga4',
|
|
283
|
+
description: `Query Google Analytics 4 data for a connected site.
|
|
284
|
+
|
|
285
|
+
Returns user engagement and behavior metrics including:
|
|
286
|
+
- Sessions: Total number of sessions
|
|
287
|
+
- Active Users: Unique users who engaged
|
|
288
|
+
- Bounce Rate: Percentage of single-page sessions
|
|
289
|
+
- Engagement Rate: Percentage of engaged sessions
|
|
290
|
+
- Avg Session Duration: Average time on site
|
|
291
|
+
- Page Views: Total page views
|
|
292
|
+
- Conversions: Conversion events
|
|
293
|
+
|
|
294
|
+
You can group results by landing page, traffic source, device, country, etc.`,
|
|
295
|
+
inputSchema: {
|
|
296
|
+
type: 'object',
|
|
297
|
+
properties: {
|
|
298
|
+
siteId: {
|
|
299
|
+
type: 'string',
|
|
300
|
+
description: 'The ID of the site to query',
|
|
301
|
+
},
|
|
302
|
+
startDate: {
|
|
303
|
+
type: 'string',
|
|
304
|
+
pattern: '^\\d{4}-\\d{2}-\\d{2}$',
|
|
305
|
+
description: 'Start date in YYYY-MM-DD format',
|
|
306
|
+
},
|
|
307
|
+
endDate: {
|
|
308
|
+
type: 'string',
|
|
309
|
+
pattern: '^\\d{4}-\\d{2}-\\d{2}$',
|
|
310
|
+
description: 'End date in YYYY-MM-DD format',
|
|
311
|
+
},
|
|
312
|
+
metrics: {
|
|
313
|
+
type: 'array',
|
|
314
|
+
items: {
|
|
315
|
+
type: 'string',
|
|
316
|
+
enum: [
|
|
317
|
+
'sessions',
|
|
318
|
+
'activeUsers',
|
|
319
|
+
'newUsers',
|
|
320
|
+
'engagementRate',
|
|
321
|
+
'bounceRate',
|
|
322
|
+
'averageSessionDuration',
|
|
323
|
+
'screenPageViews',
|
|
324
|
+
'conversions',
|
|
325
|
+
'eventCount',
|
|
326
|
+
],
|
|
327
|
+
},
|
|
328
|
+
default: ['sessions', 'activeUsers', 'bounceRate', 'engagementRate'],
|
|
329
|
+
description: 'Metrics to retrieve',
|
|
330
|
+
},
|
|
331
|
+
dimensions: {
|
|
332
|
+
type: 'array',
|
|
333
|
+
items: {
|
|
334
|
+
type: 'string',
|
|
335
|
+
enum: [
|
|
336
|
+
'date',
|
|
337
|
+
'landingPage',
|
|
338
|
+
'pagePath',
|
|
339
|
+
'sessionSource',
|
|
340
|
+
'sessionMedium',
|
|
341
|
+
'deviceCategory',
|
|
342
|
+
'country',
|
|
343
|
+
'city',
|
|
344
|
+
],
|
|
345
|
+
},
|
|
346
|
+
description: 'Dimensions to group by',
|
|
347
|
+
},
|
|
348
|
+
limit: {
|
|
349
|
+
type: 'number',
|
|
350
|
+
minimum: 1,
|
|
351
|
+
maximum: 10000,
|
|
352
|
+
default: 1000,
|
|
353
|
+
description: 'Maximum rows to return',
|
|
354
|
+
},
|
|
355
|
+
},
|
|
356
|
+
required: ['siteId', 'startDate', 'endDate'],
|
|
357
|
+
},
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
name: 'heyseo_landing_pages',
|
|
361
|
+
description: `Get top landing pages with engagement metrics.
|
|
362
|
+
|
|
363
|
+
Returns landing pages ranked by sessions, including bounce rate,
|
|
364
|
+
engagement rate, average session duration, and conversions.
|
|
365
|
+
Useful for understanding which pages users enter your site from.`,
|
|
366
|
+
inputSchema: {
|
|
367
|
+
type: 'object',
|
|
368
|
+
properties: {
|
|
369
|
+
siteId: {
|
|
370
|
+
type: 'string',
|
|
371
|
+
description: 'The ID of the site to query',
|
|
372
|
+
},
|
|
373
|
+
limit: {
|
|
374
|
+
type: 'number',
|
|
375
|
+
minimum: 1,
|
|
376
|
+
maximum: 500,
|
|
377
|
+
default: 50,
|
|
378
|
+
description: 'Number of landing pages to return',
|
|
379
|
+
},
|
|
380
|
+
startDate: {
|
|
381
|
+
type: 'string',
|
|
382
|
+
pattern: '^\\d{4}-\\d{2}-\\d{2}$',
|
|
383
|
+
description: 'Start date (defaults to 28 days ago)',
|
|
384
|
+
},
|
|
385
|
+
endDate: {
|
|
386
|
+
type: 'string',
|
|
387
|
+
pattern: '^\\d{4}-\\d{2}-\\d{2}$',
|
|
388
|
+
description: 'End date (defaults to today)',
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
required: ['siteId'],
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
name: 'heyseo_traffic_sources',
|
|
396
|
+
description: `Get traffic sources breakdown.
|
|
397
|
+
|
|
398
|
+
Returns traffic grouped by source/medium and categorized into channels:
|
|
399
|
+
- Organic Search (Google, Bing, etc.)
|
|
400
|
+
- Paid Search (CPC, PPC)
|
|
401
|
+
- Direct
|
|
402
|
+
- Referral
|
|
403
|
+
- Social
|
|
404
|
+
- Email
|
|
405
|
+
|
|
406
|
+
Useful for understanding where your traffic comes from.`,
|
|
407
|
+
inputSchema: {
|
|
408
|
+
type: 'object',
|
|
409
|
+
properties: {
|
|
410
|
+
siteId: {
|
|
411
|
+
type: 'string',
|
|
412
|
+
description: 'The ID of the site to query',
|
|
413
|
+
},
|
|
414
|
+
startDate: {
|
|
415
|
+
type: 'string',
|
|
416
|
+
pattern: '^\\d{4}-\\d{2}-\\d{2}$',
|
|
417
|
+
description: 'Start date (defaults to 28 days ago)',
|
|
418
|
+
},
|
|
419
|
+
endDate: {
|
|
420
|
+
type: 'string',
|
|
421
|
+
pattern: '^\\d{4}-\\d{2}-\\d{2}$',
|
|
422
|
+
description: 'End date (defaults to today)',
|
|
423
|
+
},
|
|
424
|
+
},
|
|
425
|
+
required: ['siteId'],
|
|
426
|
+
},
|
|
427
|
+
},
|
|
428
|
+
];
|
|
429
|
+
//# sourceMappingURL=ga4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ga4.js","sourceRoot":"","sources":["../../src/tools/ga4.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,4BAA4B;AAC5B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC1D,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,KAAK,CAAC,qBAAqB,CAAC;SAC5B,QAAQ,CAAC,iCAAiC,CAAC;IAC9C,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,KAAK,CAAC,qBAAqB,CAAC;SAC5B,QAAQ,CAAC,+BAA+B,CAAC;IAC5C,OAAO,EAAE,CAAC;SACP,KAAK,CACJ,CAAC,CAAC,IAAI,CAAC;QACL,UAAU;QACV,aAAa;QACb,UAAU;QACV,gBAAgB;QAChB,YAAY;QACZ,wBAAwB;QACxB,iBAAiB;QACjB,aAAa;QACb,YAAY;KACb,CAAC,CACH;SACA,QAAQ,EAAE;SACV,OAAO,CAAC,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;SACpE,QAAQ,CAAC,qBAAqB,CAAC;IAClC,UAAU,EAAE,CAAC;SACV,KAAK,CACJ,CAAC,CAAC,IAAI,CAAC;QACL,MAAM;QACN,aAAa;QACb,UAAU;QACV,eAAe;QACf,eAAe;QACf,gBAAgB;QAChB,SAAS;QACT,MAAM;KACP,CAAC,CACH;SACA,QAAQ,EAAE;SACV,QAAQ,CAAC,wBAAwB,CAAC;IACrC,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,KAAK,CAAC;SACV,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,CAAC;SACb,QAAQ,CAAC,kCAAkC,CAAC;CAChD,CAAC,CAAC;AAIH,gCAAgC;AAChC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC1D,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,mCAAmC,CAAC;IAChD,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,KAAK,CAAC,qBAAqB,CAAC;SAC5B,QAAQ,EAAE;SACV,QAAQ,CAAC,sCAAsC,CAAC;IACnD,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,KAAK,CAAC,qBAAqB,CAAC;SAC5B,QAAQ,EAAE;SACV,QAAQ,CAAC,8BAA8B,CAAC;CAC5C,CAAC,CAAC;AAIH,kCAAkC;AAClC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC1D,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,KAAK,CAAC,qBAAqB,CAAC;SAC5B,QAAQ,EAAE;SACV,QAAQ,CAAC,sCAAsC,CAAC;IACnD,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,KAAK,CAAC,qBAAqB,CAAC;SAC5B,QAAQ,EAAE;SACV,QAAQ,CAAC,8BAA8B,CAAC;CAC5C,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAuB,EACvB,KAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;QAEH,iBAAiB;QACjB,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACvC,MAAM,SAAS,GAAoC,EAAE,CAAC;YAEtD,iBAAiB;YACjB,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;gBACnB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;oBACtD,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACzB,CAAC,CAAC,CAAC;YACL,CAAC;YAED,8BAA8B;YAC9B,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;gBAChB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;oBACnD,IAAI,GAAG,KAAK,gBAAgB,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;wBACrD,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,CAAE,KAAgB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;oBAC9D,CAAC;yBAAM,IAAI,GAAG,KAAK,wBAAwB,EAAE,CAAC;wBAC5C,SAAS,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAe,CAAC,GAAG,CAAC;oBACrD,CAAC;yBAAM,CAAC;wBACN,SAAS,CAAC,GAAG,CAAC,GAAG,KAAe,CAAC;oBACnC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;YAED,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE;YAC9D,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,SAAS,EAAE,MAAM,CAAC,MAAM;YACxB,IAAI,EAAE,aAAa;SACpB,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAuB,EACvB,KAAwB;IAExB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,SAAS,GACb,KAAK,CAAC,SAAS;YACf,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS;YACT,OAAO;YACP,UAAU,EAAE,CAAC,aAAa,CAAC;YAC3B,OAAO,EAAE;gBACP,UAAU;gBACV,aAAa;gBACb,YAAY;gBACZ,gBAAgB;gBAChB,wBAAwB;gBACxB,aAAa;aACd;YACD,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;QAEH,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC/C,IAAI,EAAE,KAAK,GAAG,CAAC;YACf,WAAW,EAAE,GAAG,CAAC,UAAU,EAAE,WAAW,IAAI,SAAS;YACrD,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,CAAC;YACpC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC;YACpC,UAAU,EAAE,GAAG,CAAC,OAAO,EAAE,UAAU;gBACjC,CAAC,CAAC,GAAG,CAAE,GAAG,CAAC,OAAO,CAAC,UAAqB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;gBAC7D,CAAC,CAAC,KAAK;YACT,cAAc,EAAE,GAAG,CAAC,OAAO,EAAE,cAAc;gBACzC,CAAC,CAAC,GAAG,CAAE,GAAG,CAAC,OAAO,CAAC,cAAyB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;gBACjE,CAAC,CAAC,KAAK;YACT,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,kBAAkB;gBAC1C,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,kBAA4B,CAAC,GAAG;gBAC5D,CAAC,CAAC,KAAK;YACT,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC;SAC3C,CAAC,CAAC,CAAC;QAEJ,mBAAmB;QACnB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAC1B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;YACb,QAAQ,EAAE,GAAG,CAAC,QAAQ,GAAG,CAAE,GAAG,CAAC,OAAO,EAAE,QAAmB,IAAI,CAAC,CAAC;YACjE,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,CAAE,GAAG,CAAC,OAAO,EAAE,WAAsB,IAAI,CAAC,CAAC;YAC9D,WAAW,EAAE,GAAG,CAAC,WAAW,GAAG,CAAE,GAAG,CAAC,OAAO,EAAE,WAAsB,IAAI,CAAC,CAAC;SAC3E,CAAC,EACF,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAC1C,CAAC;QAEF,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,OAAO,EAAE,IAAI;YACb,iBAAiB,EAAE,YAAY,CAAC,MAAM;YACtC,MAAM;YACN,YAAY;SACb,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAuB,EACvB,KAA0B;IAE1B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,SAAS,GACb,KAAK,CAAC,SAAS;YACf,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS;YACT,OAAO;YACP,UAAU,EAAE,CAAC,eAAe,EAAE,eAAe,CAAC;YAC9C,OAAO,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,aAAa,CAAC;YACrE,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACnC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,aAAa,IAAI,SAAS;YAClD,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,aAAa,IAAI,SAAS;YAClD,QAAQ,EAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,IAAI,CAAC;YACpC,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC;YACpC,cAAc,EAAE,GAAG,CAAC,OAAO,EAAE,cAAc;gBACzC,CAAC,CAAC,GAAG,CAAE,GAAG,CAAC,OAAO,CAAC,cAAyB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;gBACjE,CAAC,CAAC,KAAK;YACT,WAAW,EAAE,GAAG,CAAC,OAAO,EAAE,WAAW,IAAI,CAAC;SAC3C,CAAC,CAAC,CAAC;QAEJ,mBAAmB;QACnB,MAAM,QAAQ,GAA6E,EAAE,CAAC;QAC9F,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACzB,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAChE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvB,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;YAChE,CAAC;YACD,QAAQ,CAAC,OAAO,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAkB,CAAC;YACxD,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,KAAe,CAAC;YAClD,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,WAAqB,CAAC;QAChE,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,SAAS,CACnB;YACE,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,QAAQ;YACnB,QAAQ,EAAE,OAAO;SAClB,EACD,IAAI,EACJ,CAAC,CACF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,MAAc,EAAE,MAAc;IACvD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEjC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;QACpF,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACrD,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;QACvB,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACxG,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,IAAI,GAAG,KAAK,UAAU,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE;;;;;;;;;;;6EAW4D;QACzE,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6BAA6B;iBAC3C;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,wBAAwB;oBACjC,WAAW,EAAE,iCAAiC;iBAC/C;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,wBAAwB;oBACjC,WAAW,EAAE,+BAA+B;iBAC7C;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE;4BACJ,UAAU;4BACV,aAAa;4BACb,UAAU;4BACV,gBAAgB;4BAChB,YAAY;4BACZ,wBAAwB;4BACxB,iBAAiB;4BACjB,aAAa;4BACb,YAAY;yBACb;qBACF;oBACD,OAAO,EAAE,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,CAAC;oBACpE,WAAW,EAAE,qBAAqB;iBACnC;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE;4BACJ,MAAM;4BACN,aAAa;4BACb,UAAU;4BACV,eAAe;4BACf,eAAe;4BACf,gBAAgB;4BAChB,SAAS;4BACT,MAAM;yBACP;qBACF;oBACD,WAAW,EAAE,wBAAwB;iBACtC;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,IAAI;oBACb,WAAW,EAAE,wBAAwB;iBACtC;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC;SAC7C;KACF;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EAAE;;;;iEAIgD;QAC7D,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6BAA6B;iBAC3C;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,CAAC;oBACV,OAAO,EAAE,GAAG;oBACZ,OAAO,EAAE,EAAE;oBACX,WAAW,EAAE,mCAAmC;iBACjD;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,wBAAwB;oBACjC,WAAW,EAAE,sCAAsC;iBACpD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,wBAAwB;oBACjC,WAAW,EAAE,8BAA8B;iBAC5C;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EAAE;;;;;;;;;;wDAUuC;QACpD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,6BAA6B;iBAC3C;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,wBAAwB;oBACjC,WAAW,EAAE,sCAAsC;iBACpD;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,wBAAwB;oBACjC,WAAW,EAAE,8BAA8B;iBAC5C;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;SACrB;KACF;CACF,CAAC"}
|