log10x-mcp 1.0.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +148 -0
  3. package/build/index.d.ts +8 -0
  4. package/build/index.js +150 -0
  5. package/build/index.js.map +1 -0
  6. package/build/lib/api.d.ts +31 -0
  7. package/build/lib/api.js +89 -0
  8. package/build/lib/api.js.map +1 -0
  9. package/build/lib/cost.d.ts +14 -0
  10. package/build/lib/cost.js +23 -0
  11. package/build/lib/cost.js.map +1 -0
  12. package/build/lib/environments.d.ts +24 -0
  13. package/build/lib/environments.js +51 -0
  14. package/build/lib/environments.js.map +1 -0
  15. package/build/lib/format.d.ts +29 -0
  16. package/build/lib/format.js +90 -0
  17. package/build/lib/format.js.map +1 -0
  18. package/build/lib/gates.d.ts +23 -0
  19. package/build/lib/gates.js +29 -0
  20. package/build/lib/gates.js.map +1 -0
  21. package/build/lib/promql.d.ts +43 -0
  22. package/build/lib/promql.js +99 -0
  23. package/build/lib/promql.js.map +1 -0
  24. package/build/lib/resolve-env.d.ts +11 -0
  25. package/build/lib/resolve-env.js +35 -0
  26. package/build/lib/resolve-env.js.map +1 -0
  27. package/build/resources/status.d.ts +7 -0
  28. package/build/resources/status.js +37 -0
  29. package/build/resources/status.js.map +1 -0
  30. package/build/tools/cost-drivers.d.ts +28 -0
  31. package/build/tools/cost-drivers.js +142 -0
  32. package/build/tools/cost-drivers.js.map +1 -0
  33. package/build/tools/dependency-check.d.ts +22 -0
  34. package/build/tools/dependency-check.js +80 -0
  35. package/build/tools/dependency-check.js.map +1 -0
  36. package/build/tools/event-lookup.d.ts +23 -0
  37. package/build/tools/event-lookup.js +131 -0
  38. package/build/tools/event-lookup.js.map +1 -0
  39. package/build/tools/exclusion-filter.d.ts +21 -0
  40. package/build/tools/exclusion-filter.js +246 -0
  41. package/build/tools/exclusion-filter.js.map +1 -0
  42. package/build/tools/savings.d.ts +17 -0
  43. package/build/tools/savings.js +75 -0
  44. package/build/tools/savings.js.map +1 -0
  45. package/build/tools/services.d.ts +14 -0
  46. package/build/tools/services.js +53 -0
  47. package/build/tools/services.js.map +1 -0
  48. package/build/tools/trend.d.ts +20 -0
  49. package/build/tools/trend.js +122 -0
  50. package/build/tools/trend.js.map +1 -0
  51. package/package.json +56 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"savings.js","sourceRoot":"","sources":["../../src/tools/savings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAa,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExF,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;IAC3E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;IAC3E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;CACpE,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAiD,EACjD,GAAc;IAEd,MAAM,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC;IACpC,MAAM,MAAM,GAAG,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IAExC,wCAAwC;IACxC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC/F,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QACjE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QAClE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QACjE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QAClE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QAClE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;QACrD,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;KACpE,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,MAAM,KAAK,GAAG,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,MAAM,WAAW,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtG,MAAM,SAAS,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,QAAQ,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7F,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;IAElD,MAAM,YAAY,GAAG,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,WAAW,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,WAAW,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAEvD,MAAM,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC;IAC5D,MAAM,gBAAgB,GAAG,UAAU,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAEtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,KAAK,QAAQ,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,iBAAiB,SAAS,CAAC,YAAY,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC;IAC3H,CAAC;IACD,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,iBAAiB,SAAS,CAAC,YAAY,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC;IAC3H,CAAC;IACD,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,iBAAiB,SAAS,CAAC,UAAU,CAAC,GAAG,MAAM,QAAQ,CAAC,CAAC;IACvH,CAAC;IAED,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;IAClG,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,YAAY,SAAS,CAAC,UAAU,CAAC,GAAG,MAAM,MAAM,SAAS,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,SAAS,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzG,IAAI,QAAQ,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;QACtG,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * log10x_services — list all monitored services with volume summary.
3
+ */
4
+ import { z } from 'zod';
5
+ import type { EnvConfig } from '../lib/environments.js';
6
+ export declare const servicesSchema: {
7
+ timeRange: z.ZodDefault<z.ZodEnum<["1d", "7d"]>>;
8
+ analyzerCost: z.ZodOptional<z.ZodNumber>;
9
+ environment: z.ZodOptional<z.ZodString>;
10
+ };
11
+ export declare function executeServices(args: {
12
+ timeRange: string;
13
+ analyzerCost: number;
14
+ }, env: EnvConfig): Promise<string>;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * log10x_services — list all monitored services with volume summary.
3
+ */
4
+ import { z } from 'zod';
5
+ import { queryInstant } from '../lib/api.js';
6
+ import * as pql from '../lib/promql.js';
7
+ import { LABELS } from '../lib/promql.js';
8
+ import { bytesToCost, parsePrometheusValue } from '../lib/cost.js';
9
+ import { resolveMetricsEnv } from '../lib/resolve-env.js';
10
+ import { fmtDollar, fmtBytes, fmtPct, parseTimeframe, costPeriodLabel } from '../lib/format.js';
11
+ export const servicesSchema = {
12
+ timeRange: z.enum(['1d', '7d']).default('7d').describe('Time range'),
13
+ analyzerCost: z.number().optional().describe('SIEM ingestion cost in $/GB'),
14
+ environment: z.string().optional().describe('Environment nickname'),
15
+ };
16
+ export async function executeServices(args, env) {
17
+ const tf = parseTimeframe(args.timeRange);
18
+ const costPerGb = args.analyzerCost;
19
+ const period = costPeriodLabel(tf.days);
20
+ const metricsEnv = await resolveMetricsEnv(env);
21
+ const res = await queryInstant(env, pql.bytesPerService(metricsEnv, tf.range));
22
+ if (res.status !== 'success' || res.data.result.length === 0) {
23
+ return 'No service data available. Data appears after the first 24h of collection.';
24
+ }
25
+ const rows = [];
26
+ let totalBytes = 0;
27
+ for (const r of res.data.result) {
28
+ const name = r.metric[LABELS.service] || '(unknown)';
29
+ const bytes = parsePrometheusValue(r);
30
+ totalBytes += bytes;
31
+ rows.push({ name, bytes, cost: bytesToCost(bytes, costPerGb), pct: 0 });
32
+ }
33
+ // Calculate percentages
34
+ for (const r of rows) {
35
+ r.pct = totalBytes > 0 ? (r.bytes / totalBytes) * 100 : 0;
36
+ }
37
+ rows.sort((a, b) => b.bytes - a.bytes);
38
+ const lines = [];
39
+ lines.push(`Monitored Services (${tf.label})`);
40
+ lines.push('');
41
+ for (const r of rows) {
42
+ const name = r.name.padEnd(20);
43
+ const vol = fmtBytes(r.bytes).padEnd(10);
44
+ const pct = fmtPct(r.pct).padStart(4);
45
+ const cost = `${fmtDollar(r.cost)}${period}`;
46
+ lines.push(` ${name} ${vol} ${pct} ${cost}`);
47
+ }
48
+ const totalCost = bytesToCost(totalBytes, costPerGb);
49
+ lines.push('');
50
+ lines.push(` ${rows.length} service${rows.length !== 1 ? 's' : ''} · ${fmtBytes(totalBytes)} total · ${fmtDollar(totalCost)}${period} at ${fmtDollar(costPerGb)}/GB`);
51
+ return lines.join('\n');
52
+ }
53
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/tools/services.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * log10x_pattern_trend — volume trend for a specific pattern over time.
3
+ *
4
+ * Shows time series data with spike detection.
5
+ */
6
+ import { z } from 'zod';
7
+ import type { EnvConfig } from '../lib/environments.js';
8
+ export declare const trendSchema: {
9
+ pattern: z.ZodString;
10
+ timeRange: z.ZodDefault<z.ZodEnum<["1d", "7d", "30d"]>>;
11
+ step: z.ZodDefault<z.ZodEnum<["5m", "1h", "6h", "1d"]>>;
12
+ analyzerCost: z.ZodOptional<z.ZodNumber>;
13
+ environment: z.ZodOptional<z.ZodString>;
14
+ };
15
+ export declare function executeTrend(args: {
16
+ pattern: string;
17
+ timeRange: string;
18
+ step: string;
19
+ analyzerCost: number;
20
+ }, env: EnvConfig): Promise<string>;
@@ -0,0 +1,122 @@
1
+ /**
2
+ * log10x_pattern_trend — volume trend for a specific pattern over time.
3
+ *
4
+ * Shows time series data with spike detection.
5
+ */
6
+ import { z } from 'zod';
7
+ import { queryRange } from '../lib/api.js';
8
+ import * as pql from '../lib/promql.js';
9
+ import { bytesToCost } from '../lib/cost.js';
10
+ import { resolveMetricsEnv } from '../lib/resolve-env.js';
11
+ import { fmtDollar, fmtPattern, fmtBytes, parseTimeframe, costPeriodLabel } from '../lib/format.js';
12
+ export const trendSchema = {
13
+ pattern: z.string().describe('Pattern name (e.g., "Payment_Gateway_Timeout")'),
14
+ timeRange: z.enum(['1d', '7d', '30d']).default('7d').describe('Time range'),
15
+ step: z.enum(['5m', '1h', '6h', '1d']).default('1h').describe('Data point interval'),
16
+ analyzerCost: z.number().optional().describe('SIEM ingestion cost in $/GB'),
17
+ environment: z.string().optional().describe('Environment nickname'),
18
+ };
19
+ export async function executeTrend(args, env) {
20
+ const tf = parseTimeframe(args.timeRange);
21
+ const costPerGb = args.analyzerCost;
22
+ const period = costPeriodLabel(tf.days);
23
+ const metricsEnv = await resolveMetricsEnv(env);
24
+ const now = Math.floor(Date.now() / 1000);
25
+ const start = now - tf.days * 86400;
26
+ const stepSeconds = parseStep(args.step);
27
+ const query = pql.patternBytesOverTime(args.pattern, metricsEnv, args.step);
28
+ const res = await queryRange(env, query, start, now, stepSeconds);
29
+ if (res.status !== 'success' || res.data.result.length === 0) {
30
+ return `No trend data for pattern "${args.pattern}" in the ${tf.label}.`;
31
+ }
32
+ // Extract time series
33
+ const series = res.data.result[0];
34
+ const points = [];
35
+ for (const [ts, val] of (series.values || [])) {
36
+ points.push({ ts, bytes: parseFloat(val) || 0 });
37
+ }
38
+ if (points.length === 0) {
39
+ return `No data points for pattern "${args.pattern}".`;
40
+ }
41
+ // Compute stats
42
+ const totalBytes = points.reduce((s, p) => s + p.bytes, 0);
43
+ const totalCost = bytesToCost(totalBytes, costPerGb);
44
+ const avgBytes = totalBytes / points.length;
45
+ const maxPoint = points.reduce((max, p) => p.bytes > max.bytes ? p : max, points[0]);
46
+ const minPoint = points.reduce((min, p) => p.bytes < min.bytes ? p : min, points[0]);
47
+ // Detect spike: find first point that exceeds 3x average
48
+ const spikeThreshold = avgBytes * 3;
49
+ const spikePoint = points.find(p => p.bytes > spikeThreshold);
50
+ // Baseline: first quarter of points
51
+ const baselineSlice = points.slice(0, Math.max(1, Math.floor(points.length / 4)));
52
+ const baselineAvg = baselineSlice.reduce((s, p) => s + p.bytes, 0) / baselineSlice.length;
53
+ const baselineCost = bytesToCost(baselineAvg * (tf.days * 86400 / stepSeconds), costPerGb);
54
+ // Current: last quarter of points
55
+ const recentSlice = points.slice(-Math.max(1, Math.floor(points.length / 4)));
56
+ const recentAvg = recentSlice.reduce((s, p) => s + p.bytes, 0) / recentSlice.length;
57
+ const recentCost = bytesToCost(recentAvg * (tf.days * 86400 / stepSeconds), costPerGb);
58
+ // Format
59
+ const lines = [];
60
+ lines.push(`${fmtPattern(args.pattern)} — ${tf.label} trend`);
61
+ lines.push('');
62
+ lines.push(` Baseline (first quarter): ~${fmtDollar(baselineCost)}${period}`);
63
+ lines.push(` Current (last quarter): ${fmtDollar(recentCost)}${period}`);
64
+ if (baselineCost > 0 && recentCost > baselineCost * 1.5) {
65
+ const pctChange = Math.round(((recentCost - baselineCost) / baselineCost) * 100);
66
+ lines.push(` Change: +${pctChange}% increase`);
67
+ }
68
+ else if (baselineCost > 0 && recentCost < baselineCost * 0.7) {
69
+ const pctChange = Math.round(((baselineCost - recentCost) / baselineCost) * 100);
70
+ lines.push(` Change: -${pctChange}% decrease`);
71
+ }
72
+ else {
73
+ lines.push(` Change: stable`);
74
+ }
75
+ if (spikePoint) {
76
+ lines.push(` Spike detected: ${formatTimestamp(spikePoint.ts)}`);
77
+ }
78
+ lines.push('');
79
+ lines.push(` Peak: ${fmtBytes(maxPoint.bytes)} at ${formatTimestamp(maxPoint.ts)}`);
80
+ lines.push(` Low: ${fmtBytes(minPoint.bytes)} at ${formatTimestamp(minPoint.ts)}`);
81
+ lines.push(` Total: ${fmtDollar(totalCost)}${period} across ${points.length} data points`);
82
+ // Mini sparkline
83
+ if (points.length >= 4) {
84
+ lines.push('');
85
+ lines.push(` ${renderSparkline(points)}`);
86
+ }
87
+ return lines.join('\n');
88
+ }
89
+ function parseStep(step) {
90
+ const match = step.match(/^(\d+)(m|h|d)$/);
91
+ if (!match)
92
+ return 3600;
93
+ const val = parseInt(match[1], 10);
94
+ switch (match[2]) {
95
+ case 'm': return val * 60;
96
+ case 'h': return val * 3600;
97
+ case 'd': return val * 86400;
98
+ default: return 3600;
99
+ }
100
+ }
101
+ function formatTimestamp(ts) {
102
+ return new Date(ts * 1000).toISOString().replace('T', ' ').replace(/\.\d+Z$/, ' UTC');
103
+ }
104
+ function renderSparkline(points) {
105
+ const blocks = ['░', '▒', '▓', '█'];
106
+ const max = Math.max(...points.map(p => p.bytes));
107
+ if (max === 0)
108
+ return points.map(() => blocks[0]).join('');
109
+ // Downsample to ~40 chars
110
+ const targetLen = 40;
111
+ const step = Math.max(1, Math.floor(points.length / targetLen));
112
+ const sampled = [];
113
+ for (let i = 0; i < points.length; i += step) {
114
+ const slice = points.slice(i, i + step);
115
+ sampled.push(slice.reduce((s, p) => s + p.bytes, 0) / slice.length);
116
+ }
117
+ return sampled.map(v => {
118
+ const level = Math.floor((v / max) * (blocks.length - 1));
119
+ return blocks[Math.min(level, blocks.length - 1)];
120
+ }).join('');
121
+ }
122
+ //# sourceMappingURL=trend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trend.js","sourceRoot":"","sources":["../../src/tools/trend.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "log10x-mcp",
3
+ "version": "1.0.0",
4
+ "description": "Log10x MCP Server — per-pattern log cost attribution for AI assistants (Claude, Cursor, Claude Desktop)",
5
+ "type": "module",
6
+ "main": "build/index.js",
7
+ "bin": {
8
+ "log10x-mcp": "build/index.js"
9
+ },
10
+ "files": [
11
+ "build",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc && chmod +x build/index.js",
17
+ "start": "node build/index.js",
18
+ "dev": "tsc --watch",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "mcp",
23
+ "model-context-protocol",
24
+ "log10x",
25
+ "observability",
26
+ "cost-attribution",
27
+ "logs",
28
+ "claude",
29
+ "anthropic",
30
+ "ai-tools"
31
+ ],
32
+ "author": "Log10x",
33
+ "license": "MIT",
34
+ "homepage": "https://log10x.com",
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/log-10x/log10x-mcp.git"
38
+ },
39
+ "bugs": {
40
+ "url": "https://github.com/log-10x/log10x-mcp/issues"
41
+ },
42
+ "dependencies": {
43
+ "@modelcontextprotocol/sdk": "^1.12.1",
44
+ "zod": "^3.24.4"
45
+ },
46
+ "devDependencies": {
47
+ "@types/node": "^22.15.17",
48
+ "typescript": "^5.8.3"
49
+ },
50
+ "engines": {
51
+ "node": ">=18"
52
+ },
53
+ "publishConfig": {
54
+ "access": "public"
55
+ }
56
+ }