apphud-mcp 0.1.2 → 0.1.3

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 CHANGED
@@ -46,26 +46,26 @@ Zero-config MCP server for Apphud Dashboard Analytics.
46
46
 
47
47
  Ask MCP to call:
48
48
 
49
- 1. `apphud.apps.list`
50
- 2. `apphud.analytics.capabilities.get` (with `app_id` from step 1)
51
- 3. `apphud.analytics.revenue.summary` (for a date range)
49
+ 1. `apphud_apps_list`
50
+ 2. `apphud_analytics_capabilities_get` (with `app_id` from step 1)
51
+ 3. `apphud_analytics_revenue_summary` (for a date range)
52
52
 
53
53
  ## Available Tools
54
54
 
55
- - `apphud.apps.list`
56
- - `apphud.analytics.events.list`
57
- - `apphud.analytics.active_subscriptions`
58
- - `apphud.analytics.capabilities.get`
59
- - `apphud.analytics.metrics.list`
60
- - `apphud.analytics.metric.value`
61
- - `apphud.analytics.metric.timeseries`
62
- - `apphud.analytics.metric.breakdown`
63
- - `apphud.analytics.revenue.summary`
64
- - `apphud.analytics.subscriptions.summary`
65
- - `apphud.analytics.conversion.trial_to_paid`
66
- - `apphud.analytics.cohorts.retention`
67
- - `apphud.analytics.cohorts.ltv`
68
- - `apphud.analytics.query.raw`
55
+ - `apphud_apps_list`
56
+ - `apphud_analytics_events_list`
57
+ - `apphud_analytics_active_subscriptions`
58
+ - `apphud_analytics_capabilities_get`
59
+ - `apphud_analytics_metrics_list`
60
+ - `apphud_analytics_metric_value`
61
+ - `apphud_analytics_metric_timeseries`
62
+ - `apphud_analytics_metric_breakdown`
63
+ - `apphud_analytics_revenue_summary`
64
+ - `apphud_analytics_subscriptions_summary`
65
+ - `apphud_analytics_conversion_trial_to_paid`
66
+ - `apphud_analytics_cohorts_retention`
67
+ - `apphud_analytics_cohorts_ltv`
68
+ - `apphud_analytics_query_raw`
69
69
 
70
70
  ## Development
71
71
 
@@ -1,51 +1,51 @@
1
1
  export const TOOL_PERMISSIONS = {
2
2
  analyst: new Set([
3
- "apphud.apps.list",
4
- "apphud.analytics.events.list",
5
- "apphud.analytics.active_subscriptions",
6
- "apphud.analytics.capabilities.get",
7
- "apphud.analytics.metrics.list",
8
- "apphud.analytics.metric.value",
9
- "apphud.analytics.metric.timeseries",
10
- "apphud.analytics.metric.breakdown",
11
- "apphud.analytics.revenue.summary",
12
- "apphud.analytics.subscriptions.summary",
13
- "apphud.analytics.conversion.trial_to_paid",
14
- "apphud.analytics.cohorts.retention",
15
- "apphud.analytics.cohorts.ltv",
16
- "apphud.analytics.query.raw",
3
+ "apphud_apps_list",
4
+ "apphud_analytics_events_list",
5
+ "apphud_analytics_active_subscriptions",
6
+ "apphud_analytics_capabilities_get",
7
+ "apphud_analytics_metrics_list",
8
+ "apphud_analytics_metric_value",
9
+ "apphud_analytics_metric_timeseries",
10
+ "apphud_analytics_metric_breakdown",
11
+ "apphud_analytics_revenue_summary",
12
+ "apphud_analytics_subscriptions_summary",
13
+ "apphud_analytics_conversion_trial_to_paid",
14
+ "apphud_analytics_cohorts_retention",
15
+ "apphud_analytics_cohorts_ltv",
16
+ "apphud_analytics_query_raw",
17
17
  ]),
18
18
  support: new Set([
19
- "apphud.apps.list",
20
- "apphud.analytics.events.list",
21
- "apphud.analytics.active_subscriptions",
22
- "apphud.analytics.capabilities.get",
23
- "apphud.analytics.metrics.list",
24
- "apphud.analytics.metric.value",
25
- "apphud.analytics.metric.timeseries",
26
- "apphud.analytics.metric.breakdown",
27
- "apphud.analytics.revenue.summary",
28
- "apphud.analytics.subscriptions.summary",
29
- "apphud.analytics.conversion.trial_to_paid",
30
- "apphud.analytics.cohorts.retention",
31
- "apphud.analytics.cohorts.ltv",
32
- "apphud.analytics.query.raw",
19
+ "apphud_apps_list",
20
+ "apphud_analytics_events_list",
21
+ "apphud_analytics_active_subscriptions",
22
+ "apphud_analytics_capabilities_get",
23
+ "apphud_analytics_metrics_list",
24
+ "apphud_analytics_metric_value",
25
+ "apphud_analytics_metric_timeseries",
26
+ "apphud_analytics_metric_breakdown",
27
+ "apphud_analytics_revenue_summary",
28
+ "apphud_analytics_subscriptions_summary",
29
+ "apphud_analytics_conversion_trial_to_paid",
30
+ "apphud_analytics_cohorts_retention",
31
+ "apphud_analytics_cohorts_ltv",
32
+ "apphud_analytics_query_raw",
33
33
  ]),
34
34
  admin: new Set([
35
- "apphud.apps.list",
36
- "apphud.analytics.events.list",
37
- "apphud.analytics.active_subscriptions",
38
- "apphud.analytics.capabilities.get",
39
- "apphud.analytics.metrics.list",
40
- "apphud.analytics.metric.value",
41
- "apphud.analytics.metric.timeseries",
42
- "apphud.analytics.metric.breakdown",
43
- "apphud.analytics.revenue.summary",
44
- "apphud.analytics.subscriptions.summary",
45
- "apphud.analytics.conversion.trial_to_paid",
46
- "apphud.analytics.cohorts.retention",
47
- "apphud.analytics.cohorts.ltv",
48
- "apphud.analytics.query.raw",
35
+ "apphud_apps_list",
36
+ "apphud_analytics_events_list",
37
+ "apphud_analytics_active_subscriptions",
38
+ "apphud_analytics_capabilities_get",
39
+ "apphud_analytics_metrics_list",
40
+ "apphud_analytics_metric_value",
41
+ "apphud_analytics_metric_timeseries",
42
+ "apphud_analytics_metric_breakdown",
43
+ "apphud_analytics_revenue_summary",
44
+ "apphud_analytics_subscriptions_summary",
45
+ "apphud_analytics_conversion_trial_to_paid",
46
+ "apphud_analytics_cohorts_retention",
47
+ "apphud_analytics_cohorts_ltv",
48
+ "apphud_analytics_query_raw",
49
49
  ]),
50
50
  };
51
51
  export const METRIC_REVENUE_EVENT_TYPES = [
@@ -34,14 +34,14 @@ export function createMcpServer(container) {
34
34
  name: "apphud-mcp",
35
35
  version: "0.2.0",
36
36
  });
37
- server.tool("apphud.apps.list", "List apps available in authenticated Apphud dashboard account", {
37
+ server.tool("apphud_apps_list", "List apps available in authenticated Apphud dashboard account", {
38
38
  tenant_id: z.string().optional(),
39
39
  auth: authSchema,
40
40
  include_raw: z.boolean().optional(),
41
41
  }, async (input) => {
42
42
  const auth = resolveAuth(input, container.config);
43
43
  try {
44
- const result = await container.toolGuard.run(auth, "apphud.apps.list", async () => container.analyticsService.appsList(auth, {
44
+ const result = await container.toolGuard.run(auth, "apphud_apps_list", async () => container.analyticsService.appsList(auth, {
45
45
  include_raw: input.include_raw,
46
46
  }));
47
47
  return jsonResult(result);
@@ -50,7 +50,7 @@ export function createMcpServer(container) {
50
50
  return jsonResult(toToolError(error), true);
51
51
  }
52
52
  });
53
- server.tool("apphud.analytics.events.list", "List raw subscription events from Apphud dashboard event feed", {
53
+ server.tool("apphud_analytics_events_list", "List raw subscription events from Apphud dashboard event feed", {
54
54
  tenant_id: z.string().optional(),
55
55
  auth: authSchema,
56
56
  app_id: z.string().min(1).optional(),
@@ -64,7 +64,7 @@ export function createMcpServer(container) {
64
64
  }, async (input) => {
65
65
  const auth = resolveAuth(input, container.config);
66
66
  try {
67
- const result = await container.toolGuard.run(auth, "apphud.analytics.events.list", async () => container.analyticsService.eventsList(auth, {
67
+ const result = await container.toolGuard.run(auth, "apphud_analytics_events_list", async () => container.analyticsService.eventsList(auth, {
68
68
  app_id: input.app_id,
69
69
  apphud_app_id: input.apphud_app_id,
70
70
  from: input.from,
@@ -80,7 +80,7 @@ export function createMcpServer(container) {
80
80
  return jsonResult(toToolError(error), true);
81
81
  }
82
82
  });
83
- server.tool("apphud.analytics.active_subscriptions", "Fetch active paid subscriptions directly from Apphud analytics endpoint", {
83
+ server.tool("apphud_analytics_active_subscriptions", "Fetch active paid subscriptions directly from Apphud analytics endpoint", {
84
84
  tenant_id: z.string().optional(),
85
85
  auth: authSchema,
86
86
  app_id: z.string().min(1).optional(),
@@ -90,7 +90,7 @@ export function createMcpServer(container) {
90
90
  }, async (input) => {
91
91
  const auth = resolveAuth(input, container.config);
92
92
  try {
93
- const result = await container.toolGuard.run(auth, "apphud.analytics.active_subscriptions", async () => container.analyticsService.activeSubscriptions(auth, {
93
+ const result = await container.toolGuard.run(auth, "apphud_analytics_active_subscriptions", async () => container.analyticsService.activeSubscriptions(auth, {
94
94
  app_id: input.app_id,
95
95
  apphud_app_id: input.apphud_app_id,
96
96
  platform: input.platform,
@@ -102,7 +102,7 @@ export function createMcpServer(container) {
102
102
  return jsonResult(toToolError(error), true);
103
103
  }
104
104
  });
105
- server.tool("apphud.analytics.capabilities.get", "Get analytics capabilities and available metrics", {
105
+ server.tool("apphud_analytics_capabilities_get", "Get analytics capabilities and available metrics", {
106
106
  tenant_id: z.string().optional(),
107
107
  auth: authSchema,
108
108
  app_id: z.string().min(1).optional(),
@@ -111,7 +111,7 @@ export function createMcpServer(container) {
111
111
  }, async (input) => {
112
112
  const auth = resolveAuth(input, container.config);
113
113
  try {
114
- const result = await container.toolGuard.run(auth, "apphud.analytics.capabilities.get", async () => container.analyticsService.capabilities(auth, {
114
+ const result = await container.toolGuard.run(auth, "apphud_analytics_capabilities_get", async () => container.analyticsService.capabilities(auth, {
115
115
  app_id: input.app_id,
116
116
  apphud_app_id: input.apphud_app_id,
117
117
  include_raw: input.include_raw,
@@ -122,7 +122,7 @@ export function createMcpServer(container) {
122
122
  return jsonResult(toToolError(error), true);
123
123
  }
124
124
  });
125
- server.tool("apphud.analytics.metrics.list", "List analytics metric keys", {
125
+ server.tool("apphud_analytics_metrics_list", "List analytics metric keys", {
126
126
  tenant_id: z.string().optional(),
127
127
  auth: authSchema,
128
128
  app_id: z.string().min(1).optional(),
@@ -131,7 +131,7 @@ export function createMcpServer(container) {
131
131
  }, async (input) => {
132
132
  const auth = resolveAuth(input, container.config);
133
133
  try {
134
- const result = await container.toolGuard.run(auth, "apphud.analytics.metrics.list", async () => container.analyticsService.metricsList(auth, {
134
+ const result = await container.toolGuard.run(auth, "apphud_analytics_metrics_list", async () => container.analyticsService.metricsList(auth, {
135
135
  app_id: input.app_id,
136
136
  apphud_app_id: input.apphud_app_id,
137
137
  include_raw: input.include_raw,
@@ -142,7 +142,7 @@ export function createMcpServer(container) {
142
142
  return jsonResult(toToolError(error), true);
143
143
  }
144
144
  });
145
- server.tool("apphud.analytics.metric.value", "Get single metric value for period/snapshot", {
145
+ server.tool("apphud_analytics_metric_value", "Get single metric value for period/snapshot", {
146
146
  tenant_id: z.string().optional(),
147
147
  auth: authSchema,
148
148
  app_id: z.string().min(1).optional(),
@@ -156,7 +156,7 @@ export function createMcpServer(container) {
156
156
  }, async (input) => {
157
157
  const auth = resolveAuth(input, container.config);
158
158
  try {
159
- const result = await container.toolGuard.run(auth, "apphud.analytics.metric.value", async () => container.analyticsService.metricValue(auth, {
159
+ const result = await container.toolGuard.run(auth, "apphud_analytics_metric_value", async () => container.analyticsService.metricValue(auth, {
160
160
  app_id: input.app_id,
161
161
  apphud_app_id: input.apphud_app_id,
162
162
  metric_key: input.metric_key,
@@ -172,7 +172,7 @@ export function createMcpServer(container) {
172
172
  return jsonResult(toToolError(error), true);
173
173
  }
174
174
  });
175
- server.tool("apphud.analytics.metric.timeseries", "Get metric timeseries by date range", {
175
+ server.tool("apphud_analytics_metric_timeseries", "Get metric timeseries by date range", {
176
176
  tenant_id: z.string().optional(),
177
177
  auth: authSchema,
178
178
  app_id: z.string().min(1).optional(),
@@ -187,7 +187,7 @@ export function createMcpServer(container) {
187
187
  }, async (input) => {
188
188
  const auth = resolveAuth(input, container.config);
189
189
  try {
190
- const result = await container.toolGuard.run(auth, "apphud.analytics.metric.timeseries", async () => container.analyticsService.metricTimeseries(auth, {
190
+ const result = await container.toolGuard.run(auth, "apphud_analytics_metric_timeseries", async () => container.analyticsService.metricTimeseries(auth, {
191
191
  app_id: input.app_id,
192
192
  apphud_app_id: input.apphud_app_id,
193
193
  metric_key: input.metric_key,
@@ -204,7 +204,7 @@ export function createMcpServer(container) {
204
204
  return jsonResult(toToolError(error), true);
205
205
  }
206
206
  });
207
- server.tool("apphud.analytics.metric.breakdown", "Get metric breakdown by dimension", {
207
+ server.tool("apphud_analytics_metric_breakdown", "Get metric breakdown by dimension", {
208
208
  tenant_id: z.string().optional(),
209
209
  auth: authSchema,
210
210
  app_id: z.string().min(1).optional(),
@@ -221,7 +221,7 @@ export function createMcpServer(container) {
221
221
  }, async (input) => {
222
222
  const auth = resolveAuth(input, container.config);
223
223
  try {
224
- const result = await container.toolGuard.run(auth, "apphud.analytics.metric.breakdown", async () => container.analyticsService.metricBreakdown(auth, {
224
+ const result = await container.toolGuard.run(auth, "apphud_analytics_metric_breakdown", async () => container.analyticsService.metricBreakdown(auth, {
225
225
  app_id: input.app_id,
226
226
  apphud_app_id: input.apphud_app_id,
227
227
  metric_key: input.metric_key,
@@ -240,7 +240,7 @@ export function createMcpServer(container) {
240
240
  return jsonResult(toToolError(error), true);
241
241
  }
242
242
  });
243
- server.tool("apphud.analytics.revenue.summary", "Get revenue summary for date range", {
243
+ server.tool("apphud_analytics_revenue_summary", "Get revenue summary for date range", {
244
244
  tenant_id: z.string().optional(),
245
245
  auth: authSchema,
246
246
  app_id: z.string().min(1).optional(),
@@ -254,7 +254,7 @@ export function createMcpServer(container) {
254
254
  }, async (input) => {
255
255
  const auth = resolveAuth(input, container.config);
256
256
  try {
257
- const result = await container.toolGuard.run(auth, "apphud.analytics.revenue.summary", async () => container.analyticsService.revenueSummary(auth, {
257
+ const result = await container.toolGuard.run(auth, "apphud_analytics_revenue_summary", async () => container.analyticsService.revenueSummary(auth, {
258
258
  app_id: input.app_id,
259
259
  apphud_app_id: input.apphud_app_id,
260
260
  from: input.from,
@@ -270,7 +270,7 @@ export function createMcpServer(container) {
270
270
  return jsonResult(toToolError(error), true);
271
271
  }
272
272
  });
273
- server.tool("apphud.analytics.subscriptions.summary", "Get subscriptions KPI summary", {
273
+ server.tool("apphud_analytics_subscriptions_summary", "Get subscriptions KPI summary", {
274
274
  tenant_id: z.string().optional(),
275
275
  auth: authSchema,
276
276
  app_id: z.string().min(1).optional(),
@@ -283,7 +283,7 @@ export function createMcpServer(container) {
283
283
  }, async (input) => {
284
284
  const auth = resolveAuth(input, container.config);
285
285
  try {
286
- const result = await container.toolGuard.run(auth, "apphud.analytics.subscriptions.summary", async () => container.analyticsService.subscriptionsSummary(auth, {
286
+ const result = await container.toolGuard.run(auth, "apphud_analytics_subscriptions_summary", async () => container.analyticsService.subscriptionsSummary(auth, {
287
287
  app_id: input.app_id,
288
288
  apphud_app_id: input.apphud_app_id,
289
289
  from: input.from,
@@ -298,7 +298,7 @@ export function createMcpServer(container) {
298
298
  return jsonResult(toToolError(error), true);
299
299
  }
300
300
  });
301
- server.tool("apphud.analytics.conversion.trial_to_paid", "Get trial to paid conversion summary", {
301
+ server.tool("apphud_analytics_conversion_trial_to_paid", "Get trial to paid conversion summary", {
302
302
  tenant_id: z.string().optional(),
303
303
  auth: authSchema,
304
304
  app_id: z.string().min(1).optional(),
@@ -311,7 +311,7 @@ export function createMcpServer(container) {
311
311
  }, async (input) => {
312
312
  const auth = resolveAuth(input, container.config);
313
313
  try {
314
- const result = await container.toolGuard.run(auth, "apphud.analytics.conversion.trial_to_paid", async () => container.analyticsService.conversionTrialToPaid(auth, {
314
+ const result = await container.toolGuard.run(auth, "apphud_analytics_conversion_trial_to_paid", async () => container.analyticsService.conversionTrialToPaid(auth, {
315
315
  app_id: input.app_id,
316
316
  apphud_app_id: input.apphud_app_id,
317
317
  from: input.from,
@@ -326,7 +326,7 @@ export function createMcpServer(container) {
326
326
  return jsonResult(toToolError(error), true);
327
327
  }
328
328
  });
329
- server.tool("apphud.analytics.cohorts.retention", "Get cohorts retention from analytics", {
329
+ server.tool("apphud_analytics_cohorts_retention", "Get cohorts retention from analytics", {
330
330
  tenant_id: z.string().optional(),
331
331
  auth: authSchema,
332
332
  app_id: z.string().min(1).optional(),
@@ -341,7 +341,7 @@ export function createMcpServer(container) {
341
341
  }, async (input) => {
342
342
  const auth = resolveAuth(input, container.config);
343
343
  try {
344
- const result = await container.toolGuard.run(auth, "apphud.analytics.cohorts.retention", async () => container.analyticsService.cohortsRetention(auth, {
344
+ const result = await container.toolGuard.run(auth, "apphud_analytics_cohorts_retention", async () => container.analyticsService.cohortsRetention(auth, {
345
345
  app_id: input.app_id,
346
346
  apphud_app_id: input.apphud_app_id,
347
347
  from: input.from,
@@ -358,7 +358,7 @@ export function createMcpServer(container) {
358
358
  return jsonResult(toToolError(error), true);
359
359
  }
360
360
  });
361
- server.tool("apphud.analytics.cohorts.ltv", "Get cohorts cumulative LTV from analytics", {
361
+ server.tool("apphud_analytics_cohorts_ltv", "Get cohorts cumulative LTV from analytics", {
362
362
  tenant_id: z.string().optional(),
363
363
  auth: authSchema,
364
364
  app_id: z.string().min(1).optional(),
@@ -373,7 +373,7 @@ export function createMcpServer(container) {
373
373
  }, async (input) => {
374
374
  const auth = resolveAuth(input, container.config);
375
375
  try {
376
- const result = await container.toolGuard.run(auth, "apphud.analytics.cohorts.ltv", async () => container.analyticsService.cohortsLtv(auth, {
376
+ const result = await container.toolGuard.run(auth, "apphud_analytics_cohorts_ltv", async () => container.analyticsService.cohortsLtv(auth, {
377
377
  app_id: input.app_id,
378
378
  apphud_app_id: input.apphud_app_id,
379
379
  from: input.from,
@@ -390,7 +390,7 @@ export function createMcpServer(container) {
390
390
  return jsonResult(toToolError(error), true);
391
391
  }
392
392
  });
393
- server.tool("apphud.analytics.query.raw", "Low-level analytics query tool (value/timeseries/breakdown/raw)", {
393
+ server.tool("apphud_analytics_query_raw", "Low-level analytics query tool (value/timeseries/breakdown/raw)", {
394
394
  tenant_id: z.string().optional(),
395
395
  auth: authSchema,
396
396
  app_id: z.string().min(1).optional(),
@@ -414,7 +414,7 @@ export function createMcpServer(container) {
414
414
  }, async (input) => {
415
415
  const auth = resolveAuth(input, container.config);
416
416
  try {
417
- const result = await container.toolGuard.run(auth, "apphud.analytics.query.raw", async () => container.analyticsService.queryRaw(auth, {
417
+ const result = await container.toolGuard.run(auth, "apphud_analytics_query_raw", async () => container.analyticsService.queryRaw(auth, {
418
418
  app_id: input.app_id,
419
419
  apphud_app_id: input.apphud_app_id,
420
420
  query: input.query,
@@ -137,7 +137,7 @@ export class AnalyticsService {
137
137
  const hasMore = response.hasMore ?? (response.nextCursor ? true : undefined);
138
138
  const warnings = [];
139
139
  if (events.length === 0) {
140
- warnings.push("No events extracted from Apphud dashboard response. Try apphud.analytics.query.raw with include_raw=true to inspect endpoint payload.");
140
+ warnings.push("No events extracted from Apphud dashboard response. Try apphud_analytics_query_raw with include_raw=true to inspect endpoint payload.");
141
141
  }
142
142
  return {
143
143
  app_id: app.appId,
@@ -196,17 +196,17 @@ export class AnalyticsService {
196
196
  analytics_available: true,
197
197
  source: "apphud_analytics_api",
198
198
  supported_tools: [
199
- "apphud.analytics.events.list",
200
- "apphud.analytics.metrics.list",
201
- "apphud.analytics.metric.value",
202
- "apphud.analytics.metric.timeseries",
203
- "apphud.analytics.metric.breakdown",
204
- "apphud.analytics.revenue.summary",
205
- "apphud.analytics.subscriptions.summary",
206
- "apphud.analytics.conversion.trial_to_paid",
207
- "apphud.analytics.cohorts.retention",
208
- "apphud.analytics.cohorts.ltv",
209
- "apphud.analytics.query.raw",
199
+ "apphud_analytics_events_list",
200
+ "apphud_analytics_metrics_list",
201
+ "apphud_analytics_metric_value",
202
+ "apphud_analytics_metric_timeseries",
203
+ "apphud_analytics_metric_breakdown",
204
+ "apphud_analytics_revenue_summary",
205
+ "apphud_analytics_subscriptions_summary",
206
+ "apphud_analytics_conversion_trial_to_paid",
207
+ "apphud_analytics_cohorts_retention",
208
+ "apphud_analytics_cohorts_ltv",
209
+ "apphud_analytics_query_raw",
210
210
  ],
211
211
  supported_shapes: ["value", "timeseries", "breakdown", "raw"],
212
212
  metrics_count: metrics.metrics.length,
@@ -770,7 +770,7 @@ export class AnalyticsService {
770
770
  }
771
771
  throw new ApphudMcpError("INVALID_PAYLOAD", "app_id is required when account has multiple apps", {
772
772
  statusCode: 400,
773
- actionHint: "Call apphud.apps.list and pass app_id from returned list",
773
+ actionHint: "Call apphud_apps_list and pass app_id from returned list",
774
774
  details: {
775
775
  app_ids: discovered.apps.slice(0, 50).map((app) => app.app_id),
776
776
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apphud-mcp",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "description": "MCP server for Apphud dashboard analytics",
6
6
  "license": "MIT",