elasticsearch-mcp-vsee-stage 0.5.13

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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +304 -0
  3. package/build/config.d.ts +76 -0
  4. package/build/config.d.ts.map +1 -0
  5. package/build/config.js +63 -0
  6. package/build/config.js.map +1 -0
  7. package/build/elasticsearch/client.d.ts +26 -0
  8. package/build/elasticsearch/client.d.ts.map +1 -0
  9. package/build/elasticsearch/client.js +131 -0
  10. package/build/elasticsearch/client.js.map +1 -0
  11. package/build/errors/handlers.d.ts +44 -0
  12. package/build/errors/handlers.d.ts.map +1 -0
  13. package/build/errors/handlers.js +231 -0
  14. package/build/errors/handlers.js.map +1 -0
  15. package/build/index.d.ts +9 -0
  16. package/build/index.d.ts.map +1 -0
  17. package/build/index.js +28 -0
  18. package/build/index.js.map +1 -0
  19. package/build/logger.d.ts +31 -0
  20. package/build/logger.d.ts.map +1 -0
  21. package/build/logger.js +81 -0
  22. package/build/logger.js.map +1 -0
  23. package/build/server.d.ts +23 -0
  24. package/build/server.d.ts.map +1 -0
  25. package/build/server.js +571 -0
  26. package/build/server.js.map +1 -0
  27. package/build/tools/find-entities-by-metric.d.ts +51 -0
  28. package/build/tools/find-entities-by-metric.d.ts.map +1 -0
  29. package/build/tools/find-entities-by-metric.js +375 -0
  30. package/build/tools/find-entities-by-metric.js.map +1 -0
  31. package/build/tools/get-index-fields.d.ts +26 -0
  32. package/build/tools/get-index-fields.d.ts.map +1 -0
  33. package/build/tools/get-index-fields.js +94 -0
  34. package/build/tools/get-index-fields.js.map +1 -0
  35. package/build/tools/get-platform-breakdown.d.ts +42 -0
  36. package/build/tools/get-platform-breakdown.d.ts.map +1 -0
  37. package/build/tools/get-platform-breakdown.js +305 -0
  38. package/build/tools/get-platform-breakdown.js.map +1 -0
  39. package/build/tools/get-rating-distribution.d.ts +48 -0
  40. package/build/tools/get-rating-distribution.d.ts.map +1 -0
  41. package/build/tools/get-rating-distribution.js +283 -0
  42. package/build/tools/get-rating-distribution.js.map +1 -0
  43. package/build/tools/get-subscription-breakdown.d.ts +34 -0
  44. package/build/tools/get-subscription-breakdown.d.ts.map +1 -0
  45. package/build/tools/get-subscription-breakdown.js +179 -0
  46. package/build/tools/get-subscription-breakdown.js.map +1 -0
  47. package/build/tools/get-usage-leaderboard.d.ts +38 -0
  48. package/build/tools/get-usage-leaderboard.d.ts.map +1 -0
  49. package/build/tools/get-usage-leaderboard.js +177 -0
  50. package/build/tools/get-usage-leaderboard.js.map +1 -0
  51. package/build/tools/get-usage-profile.d.ts +52 -0
  52. package/build/tools/get-usage-profile.d.ts.map +1 -0
  53. package/build/tools/get-usage-profile.js +273 -0
  54. package/build/tools/get-usage-profile.js.map +1 -0
  55. package/build/tools/get-visit-trends.d.ts +37 -0
  56. package/build/tools/get-visit-trends.d.ts.map +1 -0
  57. package/build/tools/get-visit-trends.js +289 -0
  58. package/build/tools/get-visit-trends.js.map +1 -0
  59. package/build/tools/index.d.ts +19 -0
  60. package/build/tools/index.d.ts.map +1 -0
  61. package/build/tools/index.js +22 -0
  62. package/build/tools/index.js.map +1 -0
  63. package/build/tools/top-change.d.ts +34 -0
  64. package/build/tools/top-change.d.ts.map +1 -0
  65. package/build/tools/top-change.js +262 -0
  66. package/build/tools/top-change.js.map +1 -0
  67. package/build/utils/aggregation-limits.d.ts +23 -0
  68. package/build/utils/aggregation-limits.d.ts.map +1 -0
  69. package/build/utils/aggregation-limits.js +32 -0
  70. package/build/utils/aggregation-limits.js.map +1 -0
  71. package/build/utils/date-math.d.ts +31 -0
  72. package/build/utils/date-math.d.ts.map +1 -0
  73. package/build/utils/date-math.js +116 -0
  74. package/build/utils/date-math.js.map +1 -0
  75. package/build/utils/field-constants.d.ts +23 -0
  76. package/build/utils/field-constants.d.ts.map +1 -0
  77. package/build/utils/field-constants.js +26 -0
  78. package/build/utils/field-constants.js.map +1 -0
  79. package/build/validation/schemas.d.ts +243 -0
  80. package/build/validation/schemas.d.ts.map +1 -0
  81. package/build/validation/schemas.js +151 -0
  82. package/build/validation/schemas.js.map +1 -0
  83. package/package.json +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-entities-by-metric.d.ts","sourceRoot":"","sources":["../../src/tools/find-entities-by-metric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAgFtC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,eAAe,GAAG,aAAa,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,uBAAuB,GAAG,sBAAsB,CAAC;IACjM,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,wBAAwB;IACvC,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,MAAM,CAAC,EAAE,eAAe,GAAG,aAAa,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,uBAAuB,GAAG,sBAAsB,CAAC;IAClM,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,MAAM,CAAS;gBAEX,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM;IAKzD,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,0BAA0B,CAAC;CA0UlE"}
@@ -0,0 +1,375 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FindEntitiesByMetricTool = void 0;
4
+ const zod_1 = require("zod");
5
+ const handlers_js_1 = require("../errors/handlers.js");
6
+ const aggregation_limits_js_1 = require("../utils/aggregation-limits.js");
7
+ const field_constants_js_1 = require("../utils/field-constants.js");
8
+ const MetricFilterSchema = zod_1.z.object({
9
+ metric: zod_1.z.enum(['account_count', 'visit_count', 'provider_rating', 'patient_rating', 'avg_call_duration', 'unique_providers', 'unique_patients', 'provider_rating_count', 'patient_rating_count']),
10
+ min: zod_1.z.number().optional(),
11
+ max: zod_1.z.number().optional(),
12
+ }).refine((data) => {
13
+ return data.min !== undefined || data.max !== undefined;
14
+ }, {
15
+ message: 'At least one of min or max must be specified for each metric filter',
16
+ });
17
+ const FindEntitiesByMetricArgsSchema = zod_1.z.object({
18
+ entityType: zod_1.z.enum(['group', 'account']).describe('Type of entity to find: "group" to find groups, "account" to find accounts'),
19
+ metric: zod_1.z.enum(['account_count', 'visit_count', 'provider_rating', 'patient_rating', 'avg_call_duration', 'unique_providers', 'unique_patients', 'provider_rating_count', 'patient_rating_count']).optional().describe('Single metric to filter by (deprecated: use metrics array for multiple filters). Supported: account_count (groups only), visit_count, provider_rating, patient_rating, avg_call_duration, unique_providers, unique_patients, provider_rating_count, patient_rating_count'),
20
+ min: zod_1.z.number().optional().describe('Minimum value for the metric when using single metric (deprecated: use metrics array)'),
21
+ max: zod_1.z.number().optional().describe('Maximum value for the metric when using single metric (deprecated: use metrics array)'),
22
+ metrics: zod_1.z.array(MetricFilterSchema).optional().describe('Array of metric filters. Use this for filtering by multiple metrics simultaneously. Each filter can have min and/or max values.'),
23
+ startDate: zod_1.z.string().optional().describe('Start date in ISO format (YYYY-MM-DD) or date math (e.g., "now-30d", "now-1y"). Defaults to "now-1y"'),
24
+ endDate: zod_1.z.string().optional().describe('End date in ISO format (YYYY-MM-DD) or date math (e.g., "now"). Defaults to "now"'),
25
+ subscription: zod_1.z.enum(['Enterprise', 'Premium', 'FVC', 'BVC', 'Plus']).optional().describe('Optional subscription tier to filter by'),
26
+ group: zod_1.z.string().optional().describe('Optional group name to filter by (only valid when entityType="account")'),
27
+ limit: zod_1.z.number().int().min(1).max(500).optional().default(10).describe('Maximum number of results to return (default: 10, max: 500)'),
28
+ }).strict().refine((data) => {
29
+ // Either use single metric (for backward compatibility) or metrics array, but not both
30
+ const hasSingleMetric = data.metric !== undefined;
31
+ const hasMetricsArray = data.metrics !== undefined && data.metrics.length > 0;
32
+ if (!hasSingleMetric && !hasMetricsArray) {
33
+ return false;
34
+ }
35
+ if (hasSingleMetric && hasMetricsArray) {
36
+ return false;
37
+ }
38
+ return true;
39
+ }, {
40
+ message: 'Must specify either metric (single) or metrics (array), but not both',
41
+ }).refine((data) => {
42
+ // If using single metric, at least one of min/max must be specified
43
+ if (data.metric !== undefined) {
44
+ return data.min !== undefined || data.max !== undefined;
45
+ }
46
+ return true; // Metrics array validation is handled by MetricFilterSchema
47
+ }, {
48
+ message: 'When using single metric, at least one of min or max must be specified',
49
+ }).refine((data) => {
50
+ // Validate entityType and metrics compatibility
51
+ const metricsToCheck = data.metrics || (data.metric ? [{ metric: data.metric }] : []);
52
+ for (const metricFilter of metricsToCheck) {
53
+ const metric = metricFilter.metric;
54
+ if (data.entityType === 'group' && metric === 'account_count') {
55
+ continue; // Groups can use account_count
56
+ }
57
+ if (data.entityType === 'account' && metric === 'account_count') {
58
+ return false; // Accounts cannot use account_count
59
+ }
60
+ // All other metrics work for both entityTypes
61
+ }
62
+ return true;
63
+ }, {
64
+ message: 'Invalid metric for entityType: account_count can only be used with entityType="group". All other metrics work for both entityTypes.',
65
+ });
66
+ class FindEntitiesByMetricTool {
67
+ elasticsearch;
68
+ logger;
69
+ constructor(elasticsearch, logger) {
70
+ this.elasticsearch = elasticsearch;
71
+ this.logger = logger.child({ tool: 'find-entities-by-metric' });
72
+ }
73
+ async execute(args) {
74
+ try {
75
+ const validatedArgs = FindEntitiesByMetricArgsSchema.parse(args);
76
+ let startDate = validatedArgs.startDate || 'now-1y';
77
+ let endDate = validatedArgs.endDate || 'now';
78
+ // Safeguard: cap limit at 500
79
+ const limit = Math.min(validatedArgs.limit || 500);
80
+ // Normalize to metrics array (for backward compatibility with single metric)
81
+ const metricsToCompute = validatedArgs.metrics || (validatedArgs.metric ? [{
82
+ metric: validatedArgs.metric,
83
+ min: validatedArgs.min,
84
+ max: validatedArgs.max,
85
+ }] : []);
86
+ this.logger.info('Finding entities by metric', {
87
+ entityType: validatedArgs.entityType,
88
+ metricsCount: metricsToCompute.length,
89
+ metrics: metricsToCompute.map(m => m.metric),
90
+ startDate,
91
+ endDate,
92
+ subscription: validatedArgs.subscription,
93
+ group: validatedArgs.group,
94
+ limit,
95
+ originalLimit: validatedArgs.limit,
96
+ });
97
+ const client = this.elasticsearch.getClient();
98
+ const index = field_constants_js_1.FIELD_CONSTANTS.index;
99
+ const timeField = field_constants_js_1.FIELD_CONSTANTS.timeField;
100
+ const testVisitField = field_constants_js_1.FIELD_CONSTANTS.testVisitField;
101
+ const accountField = field_constants_js_1.FIELD_CONSTANTS.accountField;
102
+ const groupField = field_constants_js_1.FIELD_CONSTANTS.groupField;
103
+ const subscriptionField = field_constants_js_1.FIELD_CONSTANTS.subscriptionField;
104
+ const providerField = field_constants_js_1.FIELD_CONSTANTS.providerField;
105
+ const patientField = field_constants_js_1.FIELD_CONSTANTS.patientField;
106
+ const providerRatingField = field_constants_js_1.FIELD_CONSTANTS.providerRatingField;
107
+ const patientRatingField = field_constants_js_1.FIELD_CONSTANTS.patientRatingField;
108
+ const callDurationField = field_constants_js_1.FIELD_CONSTANTS.callDurationField;
109
+ const meetingBasedField = field_constants_js_1.FIELD_CONSTANTS.meetingBasedField;
110
+ const filters = [
111
+ {
112
+ range: {
113
+ [timeField]: {
114
+ gte: startDate,
115
+ lt: endDate,
116
+ },
117
+ },
118
+ },
119
+ {
120
+ term: {
121
+ [testVisitField]: 'No',
122
+ },
123
+ },
124
+ {
125
+ bool: {
126
+ should: [
127
+ { exists: { field: callDurationField } },
128
+ { term: { [meetingBasedField]: false } },
129
+ ],
130
+ minimum_should_match: 1,
131
+ },
132
+ },
133
+ ];
134
+ if (validatedArgs.subscription) {
135
+ filters.push({
136
+ term: {
137
+ [subscriptionField]: validatedArgs.subscription,
138
+ },
139
+ });
140
+ }
141
+ if (validatedArgs.group) {
142
+ if (validatedArgs.entityType !== 'account') {
143
+ throw new handlers_js_1.ValidationError('group filter can only be used when entityType="account"');
144
+ }
145
+ filters.push({
146
+ term: {
147
+ [groupField]: validatedArgs.group,
148
+ },
149
+ });
150
+ }
151
+ const groupingField = validatedArgs.entityType === 'group' ? groupField : accountField;
152
+ const aggregationName = validatedArgs.entityType === 'group' ? 'by_group' : 'by_account';
153
+ const metricAggs = {};
154
+ for (const metricFilter of metricsToCompute) {
155
+ const metric = metricFilter.metric;
156
+ if (metric === 'account_count') {
157
+ metricAggs.unique_accounts = {
158
+ cardinality: { field: accountField },
159
+ };
160
+ }
161
+ else if (metric === 'visit_count') {
162
+ metricAggs.visit_count = {
163
+ value_count: { field: timeField },
164
+ };
165
+ }
166
+ else if (metric === 'provider_rating') {
167
+ metricAggs.avg_provider_rating = {
168
+ avg: { field: providerRatingField },
169
+ };
170
+ }
171
+ else if (metric === 'patient_rating') {
172
+ metricAggs.avg_patient_rating = {
173
+ avg: { field: patientRatingField },
174
+ };
175
+ }
176
+ else if (metric === 'avg_call_duration') {
177
+ metricAggs.avg_call_duration = {
178
+ avg: { field: callDurationField },
179
+ };
180
+ }
181
+ else if (metric === 'unique_providers') {
182
+ metricAggs.unique_providers = {
183
+ cardinality: { field: providerField },
184
+ };
185
+ }
186
+ else if (metric === 'unique_patients') {
187
+ metricAggs.unique_patients = {
188
+ cardinality: { field: patientField },
189
+ };
190
+ }
191
+ else if (metric === 'provider_rating_count') {
192
+ metricAggs.provider_rating_count = {
193
+ value_count: { field: providerRatingField },
194
+ };
195
+ }
196
+ else if (metric === 'patient_rating_count') {
197
+ metricAggs.patient_rating_count = {
198
+ value_count: { field: patientRatingField },
199
+ };
200
+ }
201
+ }
202
+ if (!metricAggs.visit_count) {
203
+ metricAggs.visit_count = {
204
+ value_count: { field: timeField },
205
+ };
206
+ }
207
+ const aggs = {
208
+ [aggregationName]: {
209
+ terms: {
210
+ field: groupingField,
211
+ size: (0, aggregation_limits_js_1.calculateTermsSize)(limit, 3, aggregation_limits_js_1.AGGREGATION_LIMITS.MAX), // Safeguard: Get more to account for filtering
212
+ },
213
+ aggs: metricAggs,
214
+ },
215
+ };
216
+ const query = {
217
+ index,
218
+ size: 0,
219
+ body: {
220
+ track_total_hits: false,
221
+ query: {
222
+ bool: {
223
+ filter: filters,
224
+ },
225
+ },
226
+ aggs,
227
+ },
228
+ };
229
+ this.logger.debug('Executing query', { query: JSON.stringify(query, null, 2) });
230
+ const response = await client.search(query);
231
+ const responseAggs = response.aggregations;
232
+ const buckets = responseAggs?.[aggregationName]?.buckets || [];
233
+ const getMetricValueFromBucket = (bucket, metric) => {
234
+ switch (metric) {
235
+ case 'account_count':
236
+ return bucket.unique_accounts?.value ?? null;
237
+ case 'visit_count':
238
+ return bucket.visit_count?.value ?? null;
239
+ case 'provider_rating':
240
+ return bucket.avg_provider_rating?.value ?? null;
241
+ case 'patient_rating':
242
+ return bucket.avg_patient_rating?.value ?? null;
243
+ case 'avg_call_duration':
244
+ return bucket.avg_call_duration?.value ?? null;
245
+ case 'unique_providers':
246
+ return bucket.unique_providers?.value ?? null;
247
+ case 'unique_patients':
248
+ return bucket.unique_patients?.value ?? null;
249
+ case 'provider_rating_count':
250
+ return bucket.provider_rating_count?.value ?? null;
251
+ case 'patient_rating_count':
252
+ return bucket.patient_rating_count?.value ?? null;
253
+ default:
254
+ return null;
255
+ }
256
+ };
257
+ const results = buckets
258
+ .map((bucket) => {
259
+ const entity = bucket.key;
260
+ const metricValues = {};
261
+ for (const metricFilter of metricsToCompute) {
262
+ const value = getMetricValueFromBucket(bucket, metricFilter.metric);
263
+ metricValues[metricFilter.metric] = value;
264
+ }
265
+ const visitCount = bucket.visit_count?.value || 0;
266
+ const result = {
267
+ entity,
268
+ metric_value: 0, // Will be set based on first metric
269
+ visit_count: Math.round(visitCount),
270
+ };
271
+ if (metricValues.account_count !== null) {
272
+ result.account_count = Math.round(metricValues.account_count);
273
+ }
274
+ if (metricValues.provider_rating !== null) {
275
+ result.provider_rating = Math.round(metricValues.provider_rating * 100) / 100;
276
+ }
277
+ if (metricValues.patient_rating !== null) {
278
+ result.patient_rating = Math.round(metricValues.patient_rating * 100) / 100;
279
+ }
280
+ if (metricValues.avg_call_duration !== null) {
281
+ result.avg_call_duration = Math.round(metricValues.avg_call_duration * 100) / 100;
282
+ }
283
+ if (metricValues.unique_providers !== null) {
284
+ result.unique_providers = Math.round(metricValues.unique_providers);
285
+ }
286
+ if (metricValues.unique_patients !== null) {
287
+ result.unique_patients = Math.round(metricValues.unique_patients);
288
+ }
289
+ if (metricValues.provider_rating_count !== null) {
290
+ result.provider_rating_count = Math.round(metricValues.provider_rating_count);
291
+ }
292
+ if (metricValues.patient_rating_count !== null) {
293
+ result.patient_rating_count = Math.round(metricValues.patient_rating_count);
294
+ }
295
+ const firstMetric = metricsToCompute[0]?.metric;
296
+ if (firstMetric && metricValues[firstMetric] !== null) {
297
+ const value = metricValues[firstMetric];
298
+ result.metric_value = (firstMetric === 'visit_count' || firstMetric === 'account_count' ||
299
+ firstMetric === 'unique_providers' || firstMetric === 'unique_patients' ||
300
+ firstMetric === 'provider_rating_count' || firstMetric === 'patient_rating_count')
301
+ ? Math.round(value)
302
+ : Math.round(value * 100) / 100;
303
+ }
304
+ else {
305
+ result.metric_value = visitCount;
306
+ }
307
+ return { result, metricValues };
308
+ })
309
+ .filter(({ metricValues }) => {
310
+ for (const metricFilter of metricsToCompute) {
311
+ const value = metricValues[metricFilter.metric];
312
+ if (value === null || value === undefined) {
313
+ return false; // Skip if metric value is missing
314
+ }
315
+ if (metricFilter.min !== undefined && value < metricFilter.min) {
316
+ return false;
317
+ }
318
+ if (metricFilter.max !== undefined && value > metricFilter.max) {
319
+ return false;
320
+ }
321
+ }
322
+ return true;
323
+ })
324
+ .map(({ result }) => result);
325
+ const firstMetric = metricsToCompute[0]?.metric;
326
+ const isCountMetric = firstMetric === 'account_count' || firstMetric === 'visit_count' ||
327
+ firstMetric === 'unique_providers' || firstMetric === 'unique_patients' ||
328
+ firstMetric === 'provider_rating_count' || firstMetric === 'patient_rating_count';
329
+ results.sort((a, b) => {
330
+ if (isCountMetric) {
331
+ return b.metric_value - a.metric_value; // Descending for counts (highest first)
332
+ }
333
+ else {
334
+ return a.metric_value - b.metric_value; // Ascending for ratings (lowest/worst first)
335
+ }
336
+ });
337
+ const limitedResults = results.slice(0, limit);
338
+ this.logger.info('Successfully found entities by metric', {
339
+ entityType: validatedArgs.entityType,
340
+ metricsCount: metricsToCompute.length,
341
+ totalFound: limitedResults.length,
342
+ });
343
+ return {
344
+ startDate,
345
+ endDate,
346
+ entityType: validatedArgs.entityType,
347
+ metric: validatedArgs.metric || metricsToCompute.map(m => m.metric).join(','), // For backward compatibility
348
+ min: validatedArgs.min,
349
+ max: validatedArgs.max,
350
+ metrics: metricsToCompute, // Include metrics array in response
351
+ period: `${startDate} to ${endDate}`,
352
+ total_found: limitedResults.length,
353
+ results: limitedResults,
354
+ };
355
+ }
356
+ catch (error) {
357
+ if (error instanceof Error && error.name === 'ZodError') {
358
+ throw new handlers_js_1.ValidationError('Invalid arguments for find_entities_by_metric', {
359
+ details: error.message,
360
+ });
361
+ }
362
+ if (error instanceof handlers_js_1.ValidationError) {
363
+ throw error;
364
+ }
365
+ this.logger.error('Failed to find entities by metric', {}, error);
366
+ // Check if this is a ResponseError from Elasticsearch client
367
+ if (error && typeof error === 'object' && 'body' in error) {
368
+ throw handlers_js_1.ElasticsearchError.fromResponseError(error, 'find_entities_by_metric', args);
369
+ }
370
+ throw new handlers_js_1.ElasticsearchError('Failed to find entities by metric in Elasticsearch', error, { args });
371
+ }
372
+ }
373
+ }
374
+ exports.FindEntitiesByMetricTool = FindEntitiesByMetricTool;
375
+ //# sourceMappingURL=find-entities-by-metric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find-entities-by-metric.js","sourceRoot":"","sources":["../../src/tools/find-entities-by-metric.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { ElasticsearchManager } from '../elasticsearch/client.js';
2
+ import { Logger } from '../logger.js';
3
+ export interface GetIndexFieldsArgs {
4
+ index?: string;
5
+ fieldFilter?: string;
6
+ typeFilter?: string;
7
+ includeNested?: boolean;
8
+ }
9
+ export interface FieldInfo {
10
+ name: string;
11
+ type: string;
12
+ path: string;
13
+ }
14
+ export interface GetIndexFieldsResult {
15
+ index: string;
16
+ fields: FieldInfo[];
17
+ total: number;
18
+ }
19
+ export declare class GetIndexFieldsTool {
20
+ private elasticsearch;
21
+ private logger;
22
+ constructor(elasticsearch: ElasticsearchManager, logger: Logger);
23
+ execute(args: unknown): Promise<GetIndexFieldsResult>;
24
+ private extractFields;
25
+ }
26
+ //# sourceMappingURL=get-index-fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-index-fields.d.ts","sourceRoot":"","sources":["../../src/tools/get-index-fields.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAWtC,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,MAAM,CAAS;gBAEX,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM;IAKzD,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmE3D,OAAO,CAAC,aAAa;CA4DtB"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GetIndexFieldsTool = void 0;
4
+ const zod_1 = require("zod");
5
+ const handlers_js_1 = require("../errors/handlers.js");
6
+ const GetIndexFieldsArgsSchema = zod_1.z.object({
7
+ index: zod_1.z.string().min(1).default('stats-*').describe('Index name or pattern (supports wildcards like stats-*). Defaults to "stats-*" if not specified. Only specify if you need fields from a different index.'),
8
+ fieldFilter: zod_1.z.string().optional().describe('Filter fields by name (case-insensitive partial match)'),
9
+ typeFilter: zod_1.z.string().optional().describe('Filter fields by type (e.g., "text", "keyword", "long", "date")'),
10
+ includeNested: zod_1.z.boolean().default(true).describe('Include nested fields in the results'),
11
+ }).strict();
12
+ class GetIndexFieldsTool {
13
+ elasticsearch;
14
+ logger;
15
+ constructor(elasticsearch, logger) {
16
+ this.elasticsearch = elasticsearch;
17
+ this.logger = logger.child({ tool: 'get-index-fields' });
18
+ }
19
+ async execute(args) {
20
+ try {
21
+ const validatedArgs = GetIndexFieldsArgsSchema.parse(args);
22
+ const index = validatedArgs.index || 'stats-*';
23
+ this.logger.info('Getting index fields', {
24
+ index,
25
+ fieldFilter: validatedArgs.fieldFilter,
26
+ typeFilter: validatedArgs.typeFilter,
27
+ includeNested: validatedArgs.includeNested,
28
+ });
29
+ const client = this.elasticsearch.getClient();
30
+ const response = await client.indices.getMapping({
31
+ index,
32
+ });
33
+ const fields = [];
34
+ const fieldFilterLower = validatedArgs.fieldFilter?.toLowerCase();
35
+ const typeFilterLower = validatedArgs.typeFilter?.toLowerCase();
36
+ for (const [, indexMapping] of Object.entries(response)) {
37
+ const properties = indexMapping.mappings?.properties || {};
38
+ this.extractFields(properties, fields, '', validatedArgs.includeNested ?? true, fieldFilterLower, typeFilterLower);
39
+ }
40
+ fields.sort((a, b) => a.path.localeCompare(b.path));
41
+ this.logger.info('Successfully retrieved index fields', {
42
+ index,
43
+ count: fields.length,
44
+ });
45
+ return {
46
+ index,
47
+ fields,
48
+ total: fields.length,
49
+ };
50
+ }
51
+ catch (error) {
52
+ if (error instanceof Error && error.name === 'ZodError') {
53
+ throw new handlers_js_1.ValidationError('Invalid arguments for get_index_fields', {
54
+ details: error.message,
55
+ });
56
+ }
57
+ if (error instanceof handlers_js_1.ValidationError) {
58
+ throw error;
59
+ }
60
+ this.logger.error('Failed to get index fields', {}, error);
61
+ throw new handlers_js_1.ElasticsearchError('Failed to get index fields from Elasticsearch', error, { args });
62
+ }
63
+ }
64
+ extractFields(properties, fields, prefix, includeNested, fieldFilter, typeFilter) {
65
+ for (const [fieldName, fieldMapping] of Object.entries(properties)) {
66
+ const fullPath = prefix ? `${prefix}.${fieldName}` : fieldName;
67
+ const fieldType = fieldMapping.type || 'object';
68
+ if (fieldFilter && !fullPath.toLowerCase().includes(fieldFilter)) {
69
+ if (fieldMapping.properties && includeNested) {
70
+ this.extractFields(fieldMapping.properties, fields, fullPath, includeNested, fieldFilter, typeFilter);
71
+ }
72
+ continue;
73
+ }
74
+ if (typeFilter && fieldType.toLowerCase() !== typeFilter) {
75
+ if (fieldMapping.properties && includeNested) {
76
+ this.extractFields(fieldMapping.properties, fields, fullPath, includeNested, fieldFilter, typeFilter);
77
+ }
78
+ continue;
79
+ }
80
+ if (fieldType && fieldType !== 'object' && fieldType !== 'nested') {
81
+ fields.push({
82
+ name: fieldName,
83
+ type: fieldType,
84
+ path: fullPath,
85
+ });
86
+ }
87
+ if (fieldMapping.properties && includeNested) {
88
+ this.extractFields(fieldMapping.properties, fields, fullPath, includeNested, fieldFilter, typeFilter);
89
+ }
90
+ }
91
+ }
92
+ }
93
+ exports.GetIndexFieldsTool = GetIndexFieldsTool;
94
+ //# sourceMappingURL=get-index-fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-index-fields.js","sourceRoot":"","sources":["../../src/tools/get-index-fields.ts"],"names":[],"mappings":";;;AAEA,6BAAwB;AACxB,uDAA4E;AAE5E,MAAM,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,0JAA0J,CAAC;IAChN,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;IACrG,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iEAAiE,CAAC;IAC7G,aAAa,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;CAC1F,CAAC,CAAC,MAAM,EAAE,CAAC;AAqBZ,MAAa,kBAAkB;IACrB,aAAa,CAAuB;IACpC,MAAM,CAAS;IAEvB,YAAY,aAAmC,EAAE,MAAc;QAC7D,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAa;QACzB,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAE3D,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,IAAI,SAAS,CAAC;YAE/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE;gBACvC,KAAK;gBACL,WAAW,EAAE,aAAa,CAAC,WAAW;gBACtC,UAAU,EAAE,aAAa,CAAC,UAAU;gBACpC,aAAa,EAAE,aAAa,CAAC,aAAa;aAC3C,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAE9C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;gBAC/C,KAAK;aACN,CAAC,CAAC;YAEH,MAAM,MAAM,GAAgB,EAAE,CAAC;YAC/B,MAAM,gBAAgB,GAAG,aAAa,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC;YAClE,MAAM,eAAe,GAAG,aAAa,CAAC,UAAU,EAAE,WAAW,EAAE,CAAC;YAEhE,KAAK,MAAM,CAAC,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxD,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC;gBAC3D,IAAI,CAAC,aAAa,CAChB,UAAU,EACV,MAAM,EACN,EAAE,EACF,aAAa,CAAC,aAAa,IAAI,IAAI,EACnC,gBAAgB,EAChB,eAAe,CAChB,CAAC;YACJ,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAEpD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;gBACtD,KAAK;gBACL,KAAK,EAAE,MAAM,CAAC,MAAM;aACrB,CAAC,CAAC;YAEH,OAAO;gBACL,KAAK;gBACL,MAAM;gBACN,KAAK,EAAE,MAAM,CAAC,MAAM;aACrB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACxD,MAAM,IAAI,6BAAe,CAAC,wCAAwC,EAAE;oBAClE,OAAO,EAAE,KAAK,CAAC,OAAO;iBACvB,CAAC,CAAC;YACL,CAAC;YAED,IAAI,KAAK,YAAY,6BAAe,EAAE,CAAC;gBACrC,MAAM,KAAK,CAAC;YACd,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,EAAE,EAAE,EAAE,KAAc,CAAC,CAAC;YACpE,MAAM,IAAI,gCAAkB,CAC1B,+CAA+C,EAC/C,KAAc,EACd,EAAE,IAAI,EAAE,CACT,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,aAAa,CACnB,UAA+B,EAC/B,MAAmB,EACnB,MAAc,EACd,aAAsB,EACtB,WAAoB,EACpB,UAAmB;QAEnB,KAAK,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACnE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/D,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,IAAI,QAAQ,CAAC;YAEhD,IAAI,WAAW,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACjE,IAAI,YAAY,CAAC,UAAU,IAAI,aAAa,EAAE,CAAC;oBAC7C,IAAI,CAAC,aAAa,CAChB,YAAY,CAAC,UAAU,EACvB,MAAM,EACN,QAAQ,EACR,aAAa,EACb,WAAW,EACX,UAAU,CACX,CAAC;gBACJ,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,UAAU,IAAI,SAAS,CAAC,WAAW,EAAE,KAAK,UAAU,EAAE,CAAC;gBACzD,IAAI,YAAY,CAAC,UAAU,IAAI,aAAa,EAAE,CAAC;oBAC7C,IAAI,CAAC,aAAa,CAChB,YAAY,CAAC,UAAU,EACvB,MAAM,EACN,QAAQ,EACR,aAAa,EACb,WAAW,EACX,UAAU,CACX,CAAC;gBACJ,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,SAAS,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;gBAClE,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,QAAQ;iBACf,CAAC,CAAC;YACL,CAAC;YAED,IAAI,YAAY,CAAC,UAAU,IAAI,aAAa,EAAE,CAAC;gBAC7C,IAAI,CAAC,aAAa,CAChB,YAAY,CAAC,UAAU,EACvB,MAAM,EACN,QAAQ,EACR,aAAa,EACb,WAAW,EACX,UAAU,CACX,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAxID,gDAwIC"}
@@ -0,0 +1,42 @@
1
+ import { ElasticsearchManager } from '../elasticsearch/client.js';
2
+ import { Logger } from '../logger.js';
3
+ export interface GetPlatformBreakdownArgs {
4
+ role: 'provider' | 'patient';
5
+ breakdownType: 'platform' | 'version';
6
+ topN?: number;
7
+ startDate?: string;
8
+ endDate?: string;
9
+ account?: string;
10
+ group?: string;
11
+ }
12
+ export interface PlatformMetrics {
13
+ platform: string;
14
+ count_records: number;
15
+ unique_accounts: number;
16
+ unique_providers: number;
17
+ unique_patients: number;
18
+ avg_call_duration: number | null;
19
+ provider_rating_count: number;
20
+ avg_provider_rating: number | null;
21
+ patient_rating_count: number;
22
+ avg_patient_rating: number | null;
23
+ subscription_distribution: Array<{
24
+ subscription: string;
25
+ count: number;
26
+ }>;
27
+ }
28
+ export interface PlatformBreakdownResult {
29
+ startDate: string;
30
+ endDate: string;
31
+ role: 'provider' | 'patient';
32
+ breakdownType: 'platform' | 'version';
33
+ top_items: PlatformMetrics[];
34
+ other_items: PlatformMetrics | null;
35
+ }
36
+ export declare class GetPlatformBreakdownTool {
37
+ private elasticsearch;
38
+ private logger;
39
+ constructor(elasticsearch: ElasticsearchManager, logger: Logger);
40
+ execute(args: unknown): Promise<PlatformBreakdownResult>;
41
+ }
42
+ //# sourceMappingURL=get-platform-breakdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-platform-breakdown.d.ts","sourceRoot":"","sources":["../../src/tools/get-platform-breakdown.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAiBtC,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,aAAa,EAAE,UAAU,GAAG,SAAS,CAAC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,qBAAqB,EAAE,MAAM,CAAC;IAC9B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,yBAAyB,EAAE,KAAK,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC3E;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;IAC7B,aAAa,EAAE,UAAU,GAAG,SAAS,CAAC;IACtC,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,EAAE,eAAe,GAAG,IAAI,CAAC;CACrC;AAED,qBAAa,wBAAwB;IACnC,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,MAAM,CAAS;gBAEX,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM;IAKzD,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAmT/D"}