@sealmetrics/mcp 0.1.0 → 1.3.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.
Files changed (103) hide show
  1. package/README.md +173 -0
  2. package/dist/client.d.ts +68 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +225 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/embedded.d.ts +29 -0
  7. package/dist/embedded.d.ts.map +1 -0
  8. package/dist/embedded.js +37 -0
  9. package/dist/embedded.js.map +1 -0
  10. package/dist/errors.d.ts +10 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +55 -0
  13. package/dist/errors.js.map +1 -0
  14. package/dist/index.d.ts +1 -6
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +3809 -780
  17. package/dist/index.js.map +1 -0
  18. package/dist/resources/tracking-guide.d.ts +13 -0
  19. package/dist/resources/tracking-guide.d.ts.map +1 -0
  20. package/dist/resources/tracking-guide.js +479 -0
  21. package/dist/resources/tracking-guide.js.map +1 -0
  22. package/dist/sealmetrics.mcpb +0 -0
  23. package/dist/server.d.ts +38 -0
  24. package/dist/server.d.ts.map +1 -0
  25. package/dist/server.js +132 -0
  26. package/dist/server.js.map +1 -0
  27. package/dist/tools/alerts.d.ts +5 -0
  28. package/dist/tools/alerts.d.ts.map +1 -0
  29. package/dist/tools/alerts.js +80 -0
  30. package/dist/tools/alerts.js.map +1 -0
  31. package/dist/tools/audience.d.ts +7 -0
  32. package/dist/tools/audience.d.ts.map +1 -0
  33. package/dist/tools/audience.js +146 -0
  34. package/dist/tools/audience.js.map +1 -0
  35. package/dist/tools/bots.d.ts +4 -0
  36. package/dist/tools/bots.d.ts.map +1 -0
  37. package/dist/tools/bots.js +52 -0
  38. package/dist/tools/bots.js.map +1 -0
  39. package/dist/tools/channels.d.ts +5 -0
  40. package/dist/tools/channels.d.ts.map +1 -0
  41. package/dist/tools/channels.js +88 -0
  42. package/dist/tools/channels.js.map +1 -0
  43. package/dist/tools/content.d.ts +3 -0
  44. package/dist/tools/content.d.ts.map +1 -0
  45. package/dist/tools/content.js +47 -0
  46. package/dist/tools/content.js.map +1 -0
  47. package/dist/tools/conversions.d.ts +9 -0
  48. package/dist/tools/conversions.d.ts.map +1 -0
  49. package/dist/tools/conversions.js +427 -0
  50. package/dist/tools/conversions.js.map +1 -0
  51. package/dist/tools/funnel.d.ts +3 -0
  52. package/dist/tools/funnel.d.ts.map +1 -0
  53. package/dist/tools/funnel.js +27 -0
  54. package/dist/tools/funnel.js.map +1 -0
  55. package/dist/tools/index.d.ts +16 -0
  56. package/dist/tools/index.d.ts.map +1 -0
  57. package/dist/tools/index.js +83 -0
  58. package/dist/tools/index.js.map +1 -0
  59. package/dist/tools/overview.d.ts +3 -0
  60. package/dist/tools/overview.d.ts.map +1 -0
  61. package/dist/tools/overview.js +26 -0
  62. package/dist/tools/overview.js.map +1 -0
  63. package/dist/tools/pages.d.ts +7 -0
  64. package/dist/tools/pages.d.ts.map +1 -0
  65. package/dist/tools/pages.js +307 -0
  66. package/dist/tools/pages.js.map +1 -0
  67. package/dist/tools/properties.d.ts +5 -0
  68. package/dist/tools/properties.d.ts.map +1 -0
  69. package/dist/tools/properties.js +107 -0
  70. package/dist/tools/properties.js.map +1 -0
  71. package/dist/tools/segments.d.ts +4 -0
  72. package/dist/tools/segments.d.ts.map +1 -0
  73. package/dist/tools/segments.js +49 -0
  74. package/dist/tools/segments.js.map +1 -0
  75. package/dist/tools/setup.d.ts +49 -0
  76. package/dist/tools/setup.d.ts.map +1 -0
  77. package/dist/tools/setup.js +347 -0
  78. package/dist/tools/setup.js.map +1 -0
  79. package/dist/tools/shared.d.ts +33 -0
  80. package/dist/tools/shared.d.ts.map +1 -0
  81. package/dist/tools/shared.js +40 -0
  82. package/dist/tools/shared.js.map +1 -0
  83. package/dist/tools/sites.d.ts +4 -0
  84. package/dist/tools/sites.d.ts.map +1 -0
  85. package/dist/tools/sites.js +36 -0
  86. package/dist/tools/sites.js.map +1 -0
  87. package/dist/tools/tracking.d.ts +3 -0
  88. package/dist/tools/tracking.d.ts.map +1 -0
  89. package/dist/tools/tracking.js +220 -0
  90. package/dist/tools/tracking.js.map +1 -0
  91. package/dist/tools/traffic.d.ts +10 -0
  92. package/dist/tools/traffic.d.ts.map +1 -0
  93. package/dist/tools/traffic.js +273 -0
  94. package/dist/tools/traffic.js.map +1 -0
  95. package/dist/tools/webhooks.d.ts +5 -0
  96. package/dist/tools/webhooks.d.ts.map +1 -0
  97. package/dist/tools/webhooks.js +101 -0
  98. package/dist/tools/webhooks.js.map +1 -0
  99. package/dist/types.d.ts +118 -0
  100. package/dist/types.d.ts.map +1 -0
  101. package/dist/types.js +22 -0
  102. package/dist/types.js.map +1 -0
  103. package/package.json +44 -27
@@ -0,0 +1,220 @@
1
+ import { resolveSiteId } from "./shared.js";
2
+ const JS_API_REFERENCE = {
3
+ pageview: {
4
+ description: "Tracked automatically on load and SPA navigation. Manual call rarely needed.",
5
+ signatures: [
6
+ { call: "sealmetrics()", description: "Manual pageview" },
7
+ {
8
+ call: "sealmetrics({ group: 'blog' })",
9
+ description: "Pageview with content grouping",
10
+ },
11
+ ],
12
+ },
13
+ conversion: {
14
+ description: "Track conversions with monetary value. Use for purchases, signups, leads.",
15
+ signatures: [
16
+ {
17
+ call: "sealmetrics.conv('purchase', 99.99)",
18
+ description: "Basic conversion",
19
+ },
20
+ {
21
+ call: "sealmetrics.conv('purchase', 149.99, { currency: 'EUR' })",
22
+ description: "Conversion with properties",
23
+ },
24
+ {
25
+ call: "sealmetrics.conv('lead', 0, { source: 'contact_form' })",
26
+ description: "Lead without monetary value",
27
+ },
28
+ ],
29
+ },
30
+ microconversion: {
31
+ description: "Track funnel steps and engagement events. Use for add_to_cart, scroll milestones, video plays, newsletter signups.",
32
+ signatures: [
33
+ {
34
+ call: "sealmetrics.micro('add_to_cart')",
35
+ description: "Basic microconversion",
36
+ },
37
+ {
38
+ call: "sealmetrics.micro('add_to_cart', { product_id: 'SKU-123', price: 49.99 })",
39
+ description: "Microconversion with properties",
40
+ },
41
+ ],
42
+ },
43
+ };
44
+ const IMPLEMENTATION_GUIDE = {
45
+ installation: [
46
+ "Add the <script> tag in the <head> of every page, before </head>.",
47
+ "Use the 'defer' attribute — the script loads async and never blocks rendering.",
48
+ "Pageviews are tracked automatically on load and SPA navigation (pushState, replaceState, popstate).",
49
+ "No cookies, no localStorage, no consent banner needed (GDPR-friendly).",
50
+ ],
51
+ content_grouping: {
52
+ description: "Categorize pages into sections for better analysis. Add via URL param or JS call.",
53
+ via_url_param: '<script src="https://t.sealmetrics.com/t.js?id=SITE_ID&group=blog" defer></script>',
54
+ via_js: "sealmetrics({ group: 'blog' })",
55
+ recommended_groups: [
56
+ "blog",
57
+ "product",
58
+ "category",
59
+ "checkout",
60
+ "docs",
61
+ "app",
62
+ "landing",
63
+ "support",
64
+ ],
65
+ },
66
+ naming_conventions: [
67
+ "Use snake_case for conversion and microconversion types: 'add_to_cart', not 'addToCart'.",
68
+ "Use descriptive names: 'begin_checkout', not 'step2'.",
69
+ "Do NOT include order IDs or user IDs in the type name — use properties instead.",
70
+ "Keep types stable — changing names breaks historical data continuity.",
71
+ ],
72
+ spa_support: "Automatic. Works with React Router, Vue Router, Next.js, Nuxt, Angular, and any History API-based routing. No extra config.",
73
+ debugging: "Add ?debug=1 to any page URL to enable console logging of all tracking events.",
74
+ };
75
+ const EXAMPLES = {
76
+ ecommerce: {
77
+ description: "E-commerce site with product pages, cart, and checkout",
78
+ code: `<!-- In <head> of all pages -->
79
+ <script src="https://t.sealmetrics.com/t.js?id=SITE_ID&group=product" defer></script>
80
+
81
+ <script>
82
+ // Add to cart button
83
+ document.querySelector('.add-to-cart').addEventListener('click', function() {
84
+ sealmetrics.micro('add_to_cart', {
85
+ product_id: this.dataset.productId,
86
+ price: parseFloat(this.dataset.price)
87
+ });
88
+ });
89
+
90
+ // Begin checkout
91
+ document.querySelector('.checkout-btn').addEventListener('click', function() {
92
+ sealmetrics.micro('begin_checkout', { cart_value: getCartTotal() });
93
+ });
94
+ </script>
95
+
96
+ <!-- On thank-you page (group=checkout) -->
97
+ <script src="https://t.sealmetrics.com/t.js?id=SITE_ID&group=checkout" defer></script>
98
+ <script>
99
+ sealmetrics.conv('purchase', 189.99, {
100
+ currency: 'EUR',
101
+ payment_method: 'credit_card'
102
+ });
103
+ </script>`,
104
+ },
105
+ saas: {
106
+ description: "SaaS / lead generation site",
107
+ code: `<!-- In <head> -->
108
+ <script src="https://t.sealmetrics.com/t.js?id=SITE_ID&group=marketing" defer></script>
109
+
110
+ <script>
111
+ // Demo request form
112
+ document.querySelector('#demo-form').addEventListener('submit', function() {
113
+ sealmetrics.conv('lead', 0, { form_name: 'demo_request' });
114
+ });
115
+
116
+ // Newsletter signup
117
+ document.querySelector('#newsletter').addEventListener('submit', function() {
118
+ sealmetrics.micro('newsletter_signup', { position: 'footer' });
119
+ });
120
+ </script>
121
+
122
+ <!-- On signup success page -->
123
+ <script>
124
+ sealmetrics.conv('signup', 0, { plan: 'trial' });
125
+ </script>
126
+
127
+ <!-- On upgrade/payment -->
128
+ <script>
129
+ sealmetrics.conv('purchase', 49, { plan: 'pro_monthly', currency: 'USD' });
130
+ </script>`,
131
+ },
132
+ blog_media: {
133
+ description: "Blog or media site with content engagement tracking",
134
+ code: `<!-- In <head> -->
135
+ <script src="https://t.sealmetrics.com/t.js?id=SITE_ID&group=blog" defer></script>
136
+
137
+ <script>
138
+ // Video engagement
139
+ document.querySelector('video')?.addEventListener('play', function() {
140
+ sealmetrics.micro('video_play', { video_id: this.dataset.videoId });
141
+ });
142
+ document.querySelector('video')?.addEventListener('ended', function() {
143
+ sealmetrics.micro('video_complete', { video_id: this.dataset.videoId });
144
+ });
145
+
146
+ // Scroll depth milestones
147
+ var tracked = {};
148
+ window.addEventListener('scroll', function() {
149
+ var pct = Math.round(window.scrollY / (document.body.scrollHeight - window.innerHeight) * 100);
150
+ [25, 50, 75, 100].forEach(function(m) {
151
+ if (pct >= m && !tracked[m]) {
152
+ tracked[m] = true;
153
+ sealmetrics.micro('scroll_' + m);
154
+ }
155
+ });
156
+ });
157
+ </script>`,
158
+ },
159
+ react_nextjs: {
160
+ description: "React / Next.js application",
161
+ code: `// In layout.tsx or _app.tsx — add the script tag
162
+ import Script from 'next/script';
163
+
164
+ export default function RootLayout({ children }) {
165
+ return (
166
+ <html>
167
+ <head>
168
+ <Script
169
+ src="https://t.sealmetrics.com/t.js?id=SITE_ID"
170
+ strategy="afterInteractive"
171
+ />
172
+ </head>
173
+ <body>{children}</body>
174
+ </html>
175
+ );
176
+ }
177
+
178
+ // In any component — track conversions/microconversions
179
+ function CheckoutButton({ total, currency }) {
180
+ const handlePurchase = () => {
181
+ window.sealmetrics?.conv('purchase', total, { currency });
182
+ };
183
+ return <button onClick={handlePurchase}>Complete Purchase</button>;
184
+ }
185
+
186
+ // Track microconversions
187
+ function AddToCartButton({ productId, price }) {
188
+ const handleClick = () => {
189
+ window.sealmetrics?.micro('add_to_cart', { product_id: productId, price });
190
+ };
191
+ return <button onClick={handleClick}>Add to Cart</button>;
192
+ }`,
193
+ },
194
+ };
195
+ export const getTrackingCodeTool = {
196
+ name: "get_tracking_code",
197
+ description: "Get the tracking pixel code for a site and the full JavaScript API reference for implementing pageviews, conversions, microconversions, and content grouping. Returns the site-specific <script> tag plus implementation guide with examples for e-commerce, SaaS, blog, and React/Next.js.",
198
+ inputSchema: {
199
+ type: "object",
200
+ properties: {
201
+ site_id: {
202
+ type: "string",
203
+ description: "Site ID. Optional if SEALMETRICS_SITE_ID env var is set.",
204
+ },
205
+ },
206
+ },
207
+ handler: async (client, args) => {
208
+ const siteId = resolveSiteId(args);
209
+ const pixel = await client.request(`/sites/${encodeURIComponent(siteId)}/pixel`);
210
+ return {
211
+ site_id: pixel.site_id ?? pixel.account_id,
212
+ script_tag: pixel.script_tag,
213
+ tracker_url: pixel.tracker_url,
214
+ js_api: JS_API_REFERENCE,
215
+ implementation_guide: IMPLEMENTATION_GUIDE,
216
+ examples: EXAMPLES,
217
+ };
218
+ },
219
+ };
220
+ //# sourceMappingURL=tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracking.js","sourceRoot":"","sources":["../../src/tools/tracking.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ToolDef } from "./index.js";
2
+ export declare const getTrafficSourcesTool: ToolDef;
3
+ export declare const getTrafficMediumsTool: ToolDef;
4
+ export declare const getCampaignsTool: ToolDef;
5
+ export declare const getTermsTool: ToolDef;
6
+ export declare const getTopSourcesTool: ToolDef;
7
+ export declare const getTopCampaignsTool: ToolDef;
8
+ export declare const getTopTermsTool: ToolDef;
9
+ export declare const getTopReferrersTool: ToolDef;
10
+ //# sourceMappingURL=traffic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traffic.d.ts","sourceRoot":"","sources":["../../src/tools/traffic.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAqB1C,eAAO,MAAM,qBAAqB,EAAE,OAsBnC,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,OAsBnC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,OAiC9B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,OA2C1B,CAAC;AAYF,eAAO,MAAM,iBAAiB,EAAE,OA6B/B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,OAkCjC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,OAuC7B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,OAwBjC,CAAC"}
@@ -0,0 +1,273 @@
1
+ import { PERIOD_SCHEMA, COMPARE_SCHEMA, LIMIT_SCHEMA, SORT_ORDER_SCHEMA, PAGE_SCHEMA, resolveSiteId, } from "./shared.js";
2
+ const TRAFFIC_SORT_BY = {
3
+ type: "string",
4
+ description: "Field to sort by.",
5
+ enum: ["entrances", "engaged_entrances", "page_views", "conversions", "revenue", "bounce_rate"],
6
+ default: "entrances",
7
+ };
8
+ function trafficParams(args) {
9
+ return {
10
+ site_id: resolveSiteId(args),
11
+ period: args.period ?? "30d",
12
+ compare: args.compare,
13
+ page_size: String(args.limit ?? 20),
14
+ page: args.page != null ? String(args.page) : undefined,
15
+ sort_by: args.sort_by ?? "entrances",
16
+ sort_order: args.sort_order ?? "desc",
17
+ };
18
+ }
19
+ export const getTrafficSourcesTool = {
20
+ name: "get_traffic_sources",
21
+ description: "Get traffic broken down by source (utm_source): google, facebook, twitter, direct, etc. Shows entrances, pageviews, conversions, and revenue per source.",
22
+ inputSchema: {
23
+ type: "object",
24
+ properties: {
25
+ site_id: {
26
+ type: "string",
27
+ description: "Site ID. Optional if SEALMETRICS_SITE_ID env var is set.",
28
+ },
29
+ period: PERIOD_SCHEMA,
30
+ compare: COMPARE_SCHEMA,
31
+ limit: LIMIT_SCHEMA,
32
+ page: PAGE_SCHEMA,
33
+ sort_by: TRAFFIC_SORT_BY,
34
+ sort_order: SORT_ORDER_SCHEMA,
35
+ },
36
+ },
37
+ handler: async (client, args) => {
38
+ return client.requestPaginated("/stats/sources", trafficParams(args));
39
+ },
40
+ };
41
+ export const getTrafficMediumsTool = {
42
+ name: "get_traffic_mediums",
43
+ description: "Get traffic broken down by medium (utm_medium): organic, cpc, email, referral, social, etc. Useful for understanding which marketing channels drive traffic.",
44
+ inputSchema: {
45
+ type: "object",
46
+ properties: {
47
+ site_id: {
48
+ type: "string",
49
+ description: "Site ID. Optional if SEALMETRICS_SITE_ID env var is set.",
50
+ },
51
+ period: PERIOD_SCHEMA,
52
+ compare: COMPARE_SCHEMA,
53
+ limit: LIMIT_SCHEMA,
54
+ page: PAGE_SCHEMA,
55
+ sort_by: TRAFFIC_SORT_BY,
56
+ sort_order: SORT_ORDER_SCHEMA,
57
+ },
58
+ },
59
+ handler: async (client, args) => {
60
+ return client.requestPaginated("/stats/mediums", trafficParams(args));
61
+ },
62
+ };
63
+ export const getCampaignsTool = {
64
+ name: "get_campaigns",
65
+ description: "Get traffic and conversions broken down by campaign (utm_campaign). Shows performance of individual marketing campaigns including entrances, conversions, and revenue.",
66
+ inputSchema: {
67
+ type: "object",
68
+ properties: {
69
+ site_id: {
70
+ type: "string",
71
+ description: "Site ID. Optional if SEALMETRICS_SITE_ID env var is set.",
72
+ },
73
+ period: PERIOD_SCHEMA,
74
+ compare: COMPARE_SCHEMA,
75
+ limit: LIMIT_SCHEMA,
76
+ page: PAGE_SCHEMA,
77
+ sort_by: TRAFFIC_SORT_BY,
78
+ sort_order: SORT_ORDER_SCHEMA,
79
+ utm_source: {
80
+ type: "string",
81
+ description: "Filter by source (e.g. 'google').",
82
+ },
83
+ utm_medium: {
84
+ type: "string",
85
+ description: "Filter by medium (e.g. 'cpc').",
86
+ },
87
+ },
88
+ },
89
+ handler: async (client, args) => {
90
+ const params = trafficParams(args);
91
+ params.utm_source = args.utm_source;
92
+ params.utm_medium = args.utm_medium;
93
+ return client.requestPaginated("/stats/campaigns", params);
94
+ },
95
+ };
96
+ export const getTermsTool = {
97
+ name: "get_terms",
98
+ description: "Get traffic and conversions broken down by UTM term (keyword). Shows which search keywords or ad terms drive the most traffic. Supports filtering by source, medium, and campaign.",
99
+ inputSchema: {
100
+ type: "object",
101
+ properties: {
102
+ site_id: {
103
+ type: "string",
104
+ description: "Site ID. Optional if SEALMETRICS_SITE_ID env var is set.",
105
+ },
106
+ period: PERIOD_SCHEMA,
107
+ compare: COMPARE_SCHEMA,
108
+ limit: LIMIT_SCHEMA,
109
+ page: PAGE_SCHEMA,
110
+ sort_by: TRAFFIC_SORT_BY,
111
+ sort_order: SORT_ORDER_SCHEMA,
112
+ utm_source: {
113
+ type: "string",
114
+ description: "Filter by source (e.g. 'google').",
115
+ },
116
+ utm_medium: {
117
+ type: "string",
118
+ description: "Filter by medium (e.g. 'cpc').",
119
+ },
120
+ utm_campaign: {
121
+ type: "string",
122
+ description: "Filter by campaign name.",
123
+ },
124
+ country: {
125
+ type: "string",
126
+ description: "Filter by country code (e.g. 'ES', 'US').",
127
+ },
128
+ },
129
+ },
130
+ handler: async (client, args) => {
131
+ const params = trafficParams(args);
132
+ params.utm_source = args.utm_source;
133
+ params.utm_medium = args.utm_medium;
134
+ params.utm_campaign = args.utm_campaign;
135
+ params.country = args.country;
136
+ return client.requestPaginated("/stats/terms", params);
137
+ },
138
+ };
139
+ // --- Top N tools (non-paginated, client.request) ---
140
+ function topNParams(args) {
141
+ return {
142
+ site_id: resolveSiteId(args),
143
+ period: args.period ?? "30d",
144
+ limit: String(args.limit ?? 10),
145
+ };
146
+ }
147
+ export const getTopSourcesTool = {
148
+ name: "get_top_sources",
149
+ description: "Get top traffic sources ranked by entrances. Returns a compact list of the top N sources (utm_source) without pagination — ideal for quick rankings and summaries.",
150
+ inputSchema: {
151
+ type: "object",
152
+ properties: {
153
+ site_id: {
154
+ type: "string",
155
+ description: "Site ID. Optional if SEALMETRICS_SITE_ID env var is set.",
156
+ },
157
+ period: PERIOD_SCHEMA,
158
+ limit: LIMIT_SCHEMA,
159
+ utm_medium: {
160
+ type: "string",
161
+ description: "Filter by medium (e.g. 'cpc').",
162
+ },
163
+ country: {
164
+ type: "string",
165
+ description: "Filter by country code (e.g. 'ES', 'US').",
166
+ },
167
+ },
168
+ },
169
+ handler: async (client, args) => {
170
+ const params = topNParams(args);
171
+ params.utm_medium = args.utm_medium;
172
+ params.country = args.country;
173
+ return client.request("/stats/sources/top", params);
174
+ },
175
+ };
176
+ export const getTopCampaignsTool = {
177
+ name: "get_top_campaigns",
178
+ description: "Get top campaigns ranked by entrances. Returns a compact list of the top N campaigns (utm_campaign) — ideal for quick rankings.",
179
+ inputSchema: {
180
+ type: "object",
181
+ properties: {
182
+ site_id: {
183
+ type: "string",
184
+ description: "Site ID. Optional if SEALMETRICS_SITE_ID env var is set.",
185
+ },
186
+ period: PERIOD_SCHEMA,
187
+ limit: LIMIT_SCHEMA,
188
+ utm_source: {
189
+ type: "string",
190
+ description: "Filter by source (e.g. 'google').",
191
+ },
192
+ utm_medium: {
193
+ type: "string",
194
+ description: "Filter by medium (e.g. 'cpc').",
195
+ },
196
+ country: {
197
+ type: "string",
198
+ description: "Filter by country code (e.g. 'ES', 'US').",
199
+ },
200
+ },
201
+ },
202
+ handler: async (client, args) => {
203
+ const params = topNParams(args);
204
+ params.utm_source = args.utm_source;
205
+ params.utm_medium = args.utm_medium;
206
+ params.country = args.country;
207
+ return client.request("/stats/campaigns/top", params);
208
+ },
209
+ };
210
+ export const getTopTermsTool = {
211
+ name: "get_top_terms",
212
+ description: "Get top UTM terms (keywords) ranked by entrances. Returns a compact list of the top N terms — ideal for quick keyword rankings.",
213
+ inputSchema: {
214
+ type: "object",
215
+ properties: {
216
+ site_id: {
217
+ type: "string",
218
+ description: "Site ID. Optional if SEALMETRICS_SITE_ID env var is set.",
219
+ },
220
+ period: PERIOD_SCHEMA,
221
+ limit: LIMIT_SCHEMA,
222
+ utm_source: {
223
+ type: "string",
224
+ description: "Filter by source (e.g. 'google').",
225
+ },
226
+ utm_medium: {
227
+ type: "string",
228
+ description: "Filter by medium (e.g. 'cpc').",
229
+ },
230
+ utm_campaign: {
231
+ type: "string",
232
+ description: "Filter by campaign name.",
233
+ },
234
+ country: {
235
+ type: "string",
236
+ description: "Filter by country code (e.g. 'ES', 'US').",
237
+ },
238
+ },
239
+ },
240
+ handler: async (client, args) => {
241
+ const params = topNParams(args);
242
+ params.utm_source = args.utm_source;
243
+ params.utm_medium = args.utm_medium;
244
+ params.utm_campaign = args.utm_campaign;
245
+ params.country = args.country;
246
+ return client.request("/stats/terms/top", params);
247
+ },
248
+ };
249
+ export const getTopReferrersTool = {
250
+ name: "get_top_referrers",
251
+ description: "Get top referrer domains ranked by entrances. Shows which external sites send the most traffic.",
252
+ inputSchema: {
253
+ type: "object",
254
+ properties: {
255
+ site_id: {
256
+ type: "string",
257
+ description: "Site ID. Optional if SEALMETRICS_SITE_ID env var is set.",
258
+ },
259
+ period: PERIOD_SCHEMA,
260
+ limit: LIMIT_SCHEMA,
261
+ country: {
262
+ type: "string",
263
+ description: "Filter by country code (e.g. 'ES', 'US').",
264
+ },
265
+ },
266
+ },
267
+ handler: async (client, args) => {
268
+ const params = topNParams(args);
269
+ params.country = args.country;
270
+ return client.request("/stats/referrers/top", params);
271
+ },
272
+ };
273
+ //# sourceMappingURL=traffic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traffic.js","sourceRoot":"","sources":["../../src/tools/traffic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ToolDef } from "./index.js";
2
+ export declare const listWebhooksTool: ToolDef;
3
+ export declare const listWebhookDeliveriesTool: ToolDef;
4
+ export declare const getWebhookStatsTool: ToolDef;
5
+ //# sourceMappingURL=webhooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,eAAO,MAAM,gBAAgB,EAAE,OA+B9B,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,OAsCvC,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,OA8BjC,CAAC"}
@@ -0,0 +1,101 @@
1
+ import { LIMIT_SCHEMA, resolveSiteId } from "./shared.js";
2
+ export const listWebhooksTool = {
3
+ name: "list_webhooks",
4
+ description: "List webhook endpoints configured for a site. Shows endpoint URL, subscribed event types, and active status. Webhooks send real-time HTTP notifications when events occur.",
5
+ inputSchema: {
6
+ type: "object",
7
+ properties: {
8
+ site_id: {
9
+ type: "string",
10
+ description: "Site ID (account_id). Optional if SEALMETRICS_SITE_ID env var is set.",
11
+ },
12
+ include_inactive: {
13
+ type: "boolean",
14
+ description: "Include inactive webhook endpoints (default: false).",
15
+ },
16
+ limit: LIMIT_SCHEMA,
17
+ offset: {
18
+ type: "number",
19
+ description: "Offset for pagination (default: 0).",
20
+ default: 0,
21
+ },
22
+ },
23
+ },
24
+ handler: async (client, args) => {
25
+ return client.requestDirect("/webhooks", {
26
+ account_id: resolveSiteId(args),
27
+ include_inactive: args.include_inactive != null ? String(args.include_inactive) : undefined,
28
+ limit: String(args.limit ?? 50),
29
+ offset: args.offset != null ? String(args.offset) : undefined,
30
+ });
31
+ },
32
+ };
33
+ export const listWebhookDeliveriesTool = {
34
+ name: "list_webhook_deliveries",
35
+ description: "List delivery attempts for a specific webhook endpoint. Shows HTTP status, response time, and success/failure for each delivery. Useful for debugging webhook integration issues.",
36
+ inputSchema: {
37
+ type: "object",
38
+ properties: {
39
+ site_id: {
40
+ type: "string",
41
+ description: "Site ID (account_id). Optional if SEALMETRICS_SITE_ID env var is set.",
42
+ },
43
+ endpoint_id: {
44
+ type: "string",
45
+ description: "Webhook endpoint UUID.",
46
+ },
47
+ status: {
48
+ type: "string",
49
+ description: "Filter by delivery status.",
50
+ enum: ["pending", "success", "failed"],
51
+ },
52
+ limit: LIMIT_SCHEMA,
53
+ offset: {
54
+ type: "number",
55
+ description: "Offset for pagination (default: 0).",
56
+ default: 0,
57
+ },
58
+ },
59
+ required: ["endpoint_id"],
60
+ },
61
+ handler: async (client, args) => {
62
+ const endpointId = args.endpoint_id;
63
+ return client.requestDirect(`/webhooks/${encodeURIComponent(endpointId)}/deliveries`, {
64
+ account_id: resolveSiteId(args),
65
+ status: args.status,
66
+ limit: String(args.limit ?? 50),
67
+ offset: args.offset != null ? String(args.offset) : undefined,
68
+ });
69
+ },
70
+ };
71
+ export const getWebhookStatsTool = {
72
+ name: "get_webhook_stats",
73
+ description: "Get delivery statistics for a specific webhook endpoint: total deliveries, success rate, average response time, and failure breakdown. Useful for monitoring webhook reliability.",
74
+ inputSchema: {
75
+ type: "object",
76
+ properties: {
77
+ site_id: {
78
+ type: "string",
79
+ description: "Site ID (account_id). Optional if SEALMETRICS_SITE_ID env var is set.",
80
+ },
81
+ endpoint_id: {
82
+ type: "string",
83
+ description: "Webhook endpoint UUID.",
84
+ },
85
+ hours: {
86
+ type: "number",
87
+ description: "Hours to look back for statistics (1-720, default: 24).",
88
+ default: 24,
89
+ },
90
+ },
91
+ required: ["endpoint_id"],
92
+ },
93
+ handler: async (client, args) => {
94
+ const endpointId = args.endpoint_id;
95
+ return client.requestDirect(`/webhooks/${encodeURIComponent(endpointId)}/stats`, {
96
+ account_id: resolveSiteId(args),
97
+ hours: String(args.hours ?? 24),
98
+ });
99
+ },
100
+ };
101
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/tools/webhooks.ts"],"names":[],"mappings":"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"}