chartforge-report-mcp 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # chartforge-report-mcp
2
+
3
+ Multi-chart data report generator for business intelligence. Creates executive dashboards, trend analyses, comparative reports, KPI scorecards, and data narratives — all through the Model Context Protocol.
4
+
5
+ ## Tools
6
+
7
+ ### generate_executive_dashboard
8
+ Generate a multi-chart executive dashboard from revenue, cost, and customer data. Includes KPIs with targets, trend detection, margin analysis, segment breakdowns, and anomaly alerts.
9
+
10
+ ### generate_trend_report
11
+ Create a trend analysis report with growth calculations, CAGR, volatility measurement, linear projections, and anomaly detection across multiple metrics.
12
+
13
+ ### generate_comparison_report
14
+ Build comparative reports with side-by-side charts, radar overlays, variance analysis, and automated rankings across entities (products, regions, teams, competitors).
15
+
16
+ ### generate_kpi_scorecard
17
+ Create a KPI scorecard with gauge charts, target vs actual tracking, achievement percentages, category breakdowns, and prioritized action items for underperforming metrics.
18
+
19
+ ### generate_data_narrative
20
+ Produce a complete data narrative combining multiple chart types with written analysis, cross-dataset correlations, and actionable recommendations tailored to your audience (executive, technical, investor, operations).
21
+
22
+ ## Installation
23
+
24
+ ```bash
25
+ npx chartforge-report-mcp
26
+ ```
27
+
28
+ ### Claude Desktop
29
+
30
+ Add to `claude_desktop_config.json`:
31
+
32
+ ```json
33
+ {
34
+ "mcpServers": {
35
+ "chartforge-report": {
36
+ "command": "npx",
37
+ "args": ["-y", "chartforge-report-mcp"]
38
+ }
39
+ }
40
+ }
41
+ ```
42
+
43
+ ## Example Usage
44
+
45
+ **Generate an executive dashboard:**
46
+ ```
47
+ Use generate_executive_dashboard with company_name "Acme Corp", period "quarterly", revenue_values [1200000, 1350000, 1500000, 1680000], cost_values [800000, 870000, 950000, 1020000], revenue_by_segment {"Enterprise": 900000, "SMB": 480000, "Consumer": 300000}
48
+ ```
49
+
50
+ **Run a trend analysis:**
51
+ ```
52
+ Use generate_trend_report with metrics [{"name": "MRR", "values": [50000, 55000, 58000, 63000, 71000], "unit": "$"}, {"name": "Churn Rate", "values": [5.2, 4.8, 4.5, 4.1, 3.8], "unit": "%"}], granularity "monthly"
53
+ ```
54
+
55
+ **Compare product lines:**
56
+ ```
57
+ Use generate_comparison_report with entities [{"name": "Product A", "metrics": {"Revenue": 500000, "Margin": 45, "NPS": 72}}, {"name": "Product B", "metrics": {"Revenue": 320000, "Margin": 62, "NPS": 85}}], sort_by "Revenue"
58
+ ```
59
+
60
+ ## Analysis Capabilities
61
+
62
+ - **Trend Detection** — automatic up/down/flat/volatile classification
63
+ - **CAGR Calculation** — compound annual growth rate for multi-period data
64
+ - **Anomaly Detection** — identifies values >2 standard deviations from trend
65
+ - **Correlation Analysis** — cross-dataset Pearson correlation
66
+ - **Projections** — linear projection for upcoming periods
67
+ - **Volatility Measurement** — coefficient of variation scoring
68
+
69
+ ## Part of ChartForge
70
+
71
+ This MCP server is part of [ChartForge](https://chartforgeai.com) — prompt-to-chart data visualization platform.
72
+
73
+ ## License
74
+
75
+ MIT
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,764 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { z } from "zod";
5
+ // ── Chart Color Palettes ──────────────────────────────────────────────
6
+ const PALETTES = {
7
+ professional: ["#2563EB", "#10B981", "#F59E0B", "#EF4444", "#8B5CF6", "#EC4899", "#06B6D4", "#84CC16"],
8
+ dark: ["#3B82F6", "#22C55E", "#EAB308", "#F43F5E", "#A78BFA", "#FB7185", "#22D3EE", "#A3E635"],
9
+ warm: ["#DC2626", "#EA580C", "#D97706", "#CA8A04", "#65A30D", "#059669", "#0891B2", "#7C3AED"],
10
+ cool: ["#1D4ED8", "#0369A1", "#0E7490", "#047857", "#4338CA", "#6D28D9", "#9333EA", "#C026D3"],
11
+ };
12
+ // ── Analysis Functions ────────────────────────────────────────────────
13
+ function analyzeTrend(values) {
14
+ if (values.length < 2) {
15
+ return { direction: "flat", changePercent: 0, volatility: 0, projectedNext: values[0] ?? 0, anomalies: [] };
16
+ }
17
+ const first = values[0];
18
+ const last = values[values.length - 1];
19
+ const changePercent = first !== 0 ? ((last - first) / Math.abs(first)) * 100 : 0;
20
+ // CAGR for yearly data
21
+ const periods = values.length - 1;
22
+ const cagr = first > 0 && last > 0 ? (Math.pow(last / first, 1 / periods) - 1) * 100 : undefined;
23
+ // Volatility (coefficient of variation)
24
+ const mean = values.reduce((a, b) => a + b, 0) / values.length;
25
+ const variance = values.reduce((a, b) => a + Math.pow(b - mean, 2), 0) / values.length;
26
+ const stdDev = Math.sqrt(variance);
27
+ const volatility = mean !== 0 ? (stdDev / Math.abs(mean)) * 100 : 0;
28
+ // Direction
29
+ let direction;
30
+ if (volatility > 30)
31
+ direction = "volatile";
32
+ else if (changePercent > 5)
33
+ direction = "up";
34
+ else if (changePercent < -5)
35
+ direction = "down";
36
+ else
37
+ direction = "flat";
38
+ // Simple linear projection
39
+ const n = values.length;
40
+ const xMean = (n - 1) / 2;
41
+ const slope = values.reduce((acc, v, i) => acc + (i - xMean) * (v - mean), 0) / values.reduce((acc, _, i) => acc + Math.pow(i - xMean, 2), 0);
42
+ const projectedNext = mean + slope * ((n - 1) / 2 + 1);
43
+ // Anomaly detection (>2 std deviations)
44
+ const anomalies = values
45
+ .map((v, i) => {
46
+ const expected = mean + slope * (i - xMean);
47
+ const deviation = Math.abs(v - expected);
48
+ if (deviation > 2 * stdDev && stdDev > 0) {
49
+ return { index: i, value: v, expected: Math.round(expected * 100) / 100, deviation: v > expected ? "above" : "below" };
50
+ }
51
+ return null;
52
+ })
53
+ .filter((a) => a !== null);
54
+ return { direction, changePercent: Math.round(changePercent * 100) / 100, cagr: cagr ? Math.round(cagr * 100) / 100 : undefined, volatility: Math.round(volatility * 100) / 100, projectedNext: Math.round(projectedNext * 100) / 100, anomalies };
55
+ }
56
+ function calculateKPIStatus(value, target, previousPeriod) {
57
+ if (target === undefined)
58
+ return "no_target";
59
+ const pctOfTarget = (value / target) * 100;
60
+ if (pctOfTarget >= 100)
61
+ return "above_target";
62
+ if (pctOfTarget >= 90)
63
+ return "on_target";
64
+ if (pctOfTarget >= 70)
65
+ return "below_target";
66
+ return "critical";
67
+ }
68
+ function formatNumber(n, unit) {
69
+ if (unit === "$" || unit === "USD" || unit === "revenue") {
70
+ if (Math.abs(n) >= 1_000_000_000)
71
+ return `$${(n / 1_000_000_000).toFixed(1)}B`;
72
+ if (Math.abs(n) >= 1_000_000)
73
+ return `$${(n / 1_000_000).toFixed(1)}M`;
74
+ if (Math.abs(n) >= 1_000)
75
+ return `$${(n / 1_000).toFixed(1)}K`;
76
+ return `$${n.toFixed(2)}`;
77
+ }
78
+ if (unit === "%")
79
+ return `${n.toFixed(1)}%`;
80
+ if (Math.abs(n) >= 1_000_000)
81
+ return `${(n / 1_000_000).toFixed(1)}M`;
82
+ if (Math.abs(n) >= 1_000)
83
+ return `${(n / 1_000).toFixed(1)}K`;
84
+ return n.toFixed(1);
85
+ }
86
+ function generatePeriodLabels(periods, granularity) {
87
+ const now = new Date();
88
+ const labels = [];
89
+ for (let i = periods - 1; i >= 0; i--) {
90
+ const d = new Date(now);
91
+ switch (granularity) {
92
+ case "daily":
93
+ d.setDate(d.getDate() - i);
94
+ labels.push(d.toISOString().split("T")[0]);
95
+ break;
96
+ case "weekly":
97
+ d.setDate(d.getDate() - i * 7);
98
+ labels.push(`W${Math.ceil(d.getDate() / 7)} ${d.toLocaleString("en", { month: "short" })}`);
99
+ break;
100
+ case "monthly":
101
+ d.setMonth(d.getMonth() - i);
102
+ labels.push(d.toLocaleString("en", { month: "short", year: "2-digit" }));
103
+ break;
104
+ case "quarterly":
105
+ d.setMonth(d.getMonth() - i * 3);
106
+ labels.push(`Q${Math.ceil((d.getMonth() + 1) / 3)} ${d.getFullYear()}`);
107
+ break;
108
+ case "yearly":
109
+ d.setFullYear(d.getFullYear() - i);
110
+ labels.push(d.getFullYear().toString());
111
+ break;
112
+ }
113
+ }
114
+ return labels;
115
+ }
116
+ // ── Server Setup ──────────────────────────────────────────────────────
117
+ const server = new McpServer({
118
+ name: "chartforge-report-mcp",
119
+ version: "0.2.0",
120
+ });
121
+ // ── Tool: Executive Dashboard ─────────────────────────────────────────
122
+ server.tool("generate_executive_dashboard", "Generate a multi-chart executive dashboard with KPIs, trend lines, and distribution breakdowns from business metrics", {
123
+ company_name: z.string().describe("Company or project name"),
124
+ period: z.enum(["monthly", "quarterly", "yearly"]).describe("Reporting period granularity"),
125
+ revenue_values: z.array(z.number()).min(2).describe("Revenue values for each period (most recent last)"),
126
+ cost_values: z.array(z.number()).min(2).describe("Cost/expense values for each period"),
127
+ customer_counts: z.array(z.number()).min(2).optional().describe("Customer/user counts per period"),
128
+ revenue_by_segment: z.record(z.string(), z.number()).optional().describe("Revenue breakdown by segment/product/region"),
129
+ custom_kpis: z.array(z.object({
130
+ name: z.string(),
131
+ value: z.number(),
132
+ unit: z.string(),
133
+ target: z.number().optional(),
134
+ previous: z.number().optional(),
135
+ })).optional().describe("Additional KPIs to display"),
136
+ palette: z.enum(["professional", "dark", "warm", "cool"]).default("professional").describe("Color palette"),
137
+ }, async ({ company_name, period, revenue_values, cost_values, customer_counts, revenue_by_segment, custom_kpis, palette }) => {
138
+ const colors = PALETTES[palette];
139
+ const labels = generatePeriodLabels(revenue_values.length, period);
140
+ // Calculate derived metrics
141
+ const margins = revenue_values.map((r, i) => r > 0 ? ((r - cost_values[i]) / r) * 100 : 0);
142
+ const revenueTrend = analyzeTrend(revenue_values);
143
+ const marginTrend = analyzeTrend(margins);
144
+ // Build KPIs
145
+ const kpis = [
146
+ {
147
+ name: "Total Revenue",
148
+ value: revenue_values[revenue_values.length - 1],
149
+ unit: "$",
150
+ previousPeriod: revenue_values[revenue_values.length - 2],
151
+ changePercent: revenue_values.length >= 2 ? ((revenue_values[revenue_values.length - 1] - revenue_values[revenue_values.length - 2]) / Math.abs(revenue_values[revenue_values.length - 2])) * 100 : 0,
152
+ status: revenueTrend.direction === "up" ? "above_target" : revenueTrend.direction === "down" ? "below_target" : "on_target",
153
+ },
154
+ {
155
+ name: "Gross Margin",
156
+ value: margins[margins.length - 1],
157
+ unit: "%",
158
+ previousPeriod: margins[margins.length - 2],
159
+ changePercent: margins.length >= 2 ? margins[margins.length - 1] - margins[margins.length - 2] : 0,
160
+ status: margins[margins.length - 1] > 50 ? "above_target" : margins[margins.length - 1] > 30 ? "on_target" : "below_target",
161
+ },
162
+ ];
163
+ if (customer_counts && customer_counts.length >= 2) {
164
+ const custTrend = analyzeTrend(customer_counts);
165
+ kpis.push({
166
+ name: "Customers",
167
+ value: customer_counts[customer_counts.length - 1],
168
+ unit: "count",
169
+ previousPeriod: customer_counts[customer_counts.length - 2],
170
+ changePercent: custTrend.changePercent,
171
+ status: custTrend.direction === "up" ? "above_target" : "below_target",
172
+ });
173
+ }
174
+ if (custom_kpis) {
175
+ for (const k of custom_kpis) {
176
+ kpis.push({
177
+ name: k.name,
178
+ value: k.value,
179
+ unit: k.unit,
180
+ target: k.target,
181
+ previousPeriod: k.previous,
182
+ changePercent: k.previous ? ((k.value - k.previous) / Math.abs(k.previous)) * 100 : undefined,
183
+ status: calculateKPIStatus(k.value, k.target),
184
+ });
185
+ }
186
+ }
187
+ // Build charts
188
+ const charts = [];
189
+ // Revenue + Cost trend
190
+ charts.push({
191
+ chartType: "area",
192
+ title: "Revenue & Costs Over Time",
193
+ description: `${period} revenue and cost trend showing ${revenueTrend.direction} trajectory with ${Math.abs(revenueTrend.changePercent).toFixed(1)}% overall change`,
194
+ xAxis: { label: "Period", values: labels },
195
+ yAxis: { label: "Amount", unit: "$" },
196
+ series: [
197
+ { name: "Revenue", values: revenue_values, color: colors[0] },
198
+ { name: "Costs", values: cost_values, color: colors[3] },
199
+ ],
200
+ annotations: revenueTrend.anomalies.map(a => `Anomaly in ${labels[a.index]}: ${formatNumber(a.value, "$")} (expected ${formatNumber(a.expected, "$")})`),
201
+ });
202
+ // Margin trend
203
+ charts.push({
204
+ chartType: "line",
205
+ title: "Gross Margin Trend",
206
+ description: `Margin trending ${marginTrend.direction} — current ${margins[margins.length - 1].toFixed(1)}%, projected ${marginTrend.projectedNext.toFixed(1)}%`,
207
+ xAxis: { label: "Period", values: labels },
208
+ yAxis: { label: "Margin", unit: "%" },
209
+ series: [{ name: "Gross Margin %", values: margins.map(m => Math.round(m * 100) / 100), color: colors[1] }],
210
+ });
211
+ // Revenue by segment
212
+ if (revenue_by_segment && Object.keys(revenue_by_segment).length > 0) {
213
+ const segments = Object.entries(revenue_by_segment).sort((a, b) => b[1] - a[1]);
214
+ charts.push({
215
+ chartType: "donut",
216
+ title: "Revenue by Segment",
217
+ description: `Top segment: ${segments[0][0]} at ${formatNumber(segments[0][1], "$")} (${((segments[0][1] / segments.reduce((a, s) => a + s[1], 0)) * 100).toFixed(1)}%)`,
218
+ series: segments.map(([name, value], i) => ({ name, values: [value], color: colors[i % colors.length] })),
219
+ });
220
+ }
221
+ // Customer growth (if provided)
222
+ if (customer_counts && customer_counts.length >= 2) {
223
+ charts.push({
224
+ chartType: "bar",
225
+ title: "Customer Growth",
226
+ description: `Customer base: ${customer_counts[customer_counts.length - 1]} (${analyzeTrend(customer_counts).changePercent > 0 ? "+" : ""}${analyzeTrend(customer_counts).changePercent.toFixed(1)}% overall)`,
227
+ xAxis: { label: "Period", values: labels.slice(-customer_counts.length) },
228
+ yAxis: { label: "Customers", unit: "count" },
229
+ series: [{ name: "Customers", values: customer_counts, color: colors[4] }],
230
+ });
231
+ }
232
+ // Build output
233
+ let output = `# ${company_name} — Executive Dashboard\n\n`;
234
+ output += `**Reporting Period:** ${period} | **Data Points:** ${revenue_values.length} periods\n\n`;
235
+ // KPI section
236
+ output += `## Key Performance Indicators\n\n`;
237
+ output += `| KPI | Current | vs Previous | Status |\n`;
238
+ output += `|-----|---------|-------------|--------|\n`;
239
+ for (const kpi of kpis) {
240
+ const change = kpi.changePercent !== undefined ? `${kpi.changePercent > 0 ? "+" : ""}${kpi.changePercent.toFixed(1)}%` : "—";
241
+ const statusIcon = { above_target: "Above Target", on_target: "On Target", below_target: "Below Target", critical: "CRITICAL", no_target: "—" }[kpi.status];
242
+ output += `| ${kpi.name} | ${formatNumber(kpi.value, kpi.unit)} | ${change} | ${statusIcon} |\n`;
243
+ }
244
+ // Chart specs
245
+ output += `\n## Charts\n\n`;
246
+ for (let i = 0; i < charts.length; i++) {
247
+ const c = charts[i];
248
+ output += `### ${i + 1}. ${c.title}\n`;
249
+ output += `**Type:** ${c.chartType} | ${c.description}\n\n`;
250
+ if (c.xAxis) {
251
+ output += `**X-Axis:** ${c.xAxis.label}\n`;
252
+ }
253
+ if (c.yAxis) {
254
+ output += `**Y-Axis:** ${c.yAxis.label} (${c.yAxis.unit})\n`;
255
+ }
256
+ output += `**Series:**\n`;
257
+ for (const s of c.series) {
258
+ output += `- ${s.name}: [${s.values.map(v => formatNumber(v, c.yAxis?.unit ?? "")).join(", ")}]${s.color ? ` (${s.color})` : ""}\n`;
259
+ }
260
+ if (c.annotations && c.annotations.length > 0) {
261
+ output += `**Annotations:** ${c.annotations.join("; ")}\n`;
262
+ }
263
+ output += `\n`;
264
+ }
265
+ // Insights
266
+ output += `## Key Insights\n\n`;
267
+ if (revenueTrend.direction === "up") {
268
+ output += `- Revenue is trending upward with ${revenueTrend.changePercent.toFixed(1)}% growth${revenueTrend.cagr ? ` (${revenueTrend.cagr.toFixed(1)}% CAGR)` : ""}.\n`;
269
+ }
270
+ else if (revenueTrend.direction === "down") {
271
+ output += `- **Warning:** Revenue declining ${Math.abs(revenueTrend.changePercent).toFixed(1)}% — investigate root cause.\n`;
272
+ }
273
+ if (margins[margins.length - 1] < 20) {
274
+ output += `- **Alert:** Gross margin at ${margins[margins.length - 1].toFixed(1)}% is critically low. Review cost structure.\n`;
275
+ }
276
+ if (revenueTrend.volatility > 25) {
277
+ output += `- Revenue volatility is high (${revenueTrend.volatility.toFixed(1)}% CV). Consider strategies to stabilize.\n`;
278
+ }
279
+ if (revenueTrend.anomalies.length > 0) {
280
+ output += `- ${revenueTrend.anomalies.length} anomal${revenueTrend.anomalies.length === 1 ? "y" : "ies"} detected in revenue data — investigate unusual periods.\n`;
281
+ }
282
+ output += `\n---\n*Generated by ChartForge Report MCP — https://chartforgeai.com*`;
283
+ return { content: [{ type: "text", text: output }] };
284
+ });
285
+ // ── Tool: Trend Report ────────────────────────────────────────────────
286
+ server.tool("generate_trend_report", "Create a trend analysis report with time-series charts, growth calculations, projections, and anomaly detection", {
287
+ title: z.string().describe("Report title"),
288
+ metrics: z.array(z.object({
289
+ name: z.string().describe("Metric name"),
290
+ values: z.array(z.number()).min(2).describe("Values per period (oldest first)"),
291
+ unit: z.string().describe("Unit of measurement ($, %, count, etc)"),
292
+ target_growth: z.number().optional().describe("Target growth rate in percent"),
293
+ })).min(1).describe("Metrics to analyze"),
294
+ granularity: z.enum(["daily", "weekly", "monthly", "quarterly", "yearly"]).describe("Time granularity"),
295
+ include_projections: z.boolean().default(true).describe("Include forward projections"),
296
+ projection_periods: z.number().min(1).max(12).default(3).describe("Number of periods to project forward"),
297
+ }, async ({ title, metrics, granularity, include_projections, projection_periods }) => {
298
+ const colors = PALETTES.professional;
299
+ const maxPeriods = Math.max(...metrics.map(m => m.values.length));
300
+ const labels = generatePeriodLabels(maxPeriods, granularity);
301
+ let output = `# ${title} — Trend Analysis\n\n`;
302
+ output += `**Granularity:** ${granularity} | **Periods Analyzed:** ${maxPeriods}\n\n`;
303
+ // Summary table
304
+ output += `## Trend Summary\n\n`;
305
+ output += `| Metric | Latest | Change | Direction | Volatility | Projected Next |\n`;
306
+ output += `|--------|--------|--------|-----------|------------|----------------|\n`;
307
+ const charts = [];
308
+ for (let mi = 0; mi < metrics.length; mi++) {
309
+ const m = metrics[mi];
310
+ const trend = analyzeTrend(m.values);
311
+ const latest = m.values[m.values.length - 1];
312
+ output += `| ${m.name} | ${formatNumber(latest, m.unit)} | ${trend.changePercent > 0 ? "+" : ""}${trend.changePercent.toFixed(1)}% | ${trend.direction} | ${trend.volatility.toFixed(1)}% | ${formatNumber(trend.projectedNext, m.unit)} |\n`;
313
+ // Build chart for each metric
314
+ const seriesValues = [...m.values];
315
+ const chartLabels = [...labels.slice(-m.values.length)];
316
+ if (include_projections) {
317
+ let lastVal = seriesValues[seriesValues.length - 1];
318
+ const avgGrowthRate = seriesValues.length >= 2 ? (seriesValues[seriesValues.length - 1] - seriesValues[0]) / (seriesValues.length - 1) : 0;
319
+ for (let p = 0; p < projection_periods; p++) {
320
+ lastVal += avgGrowthRate;
321
+ seriesValues.push(Math.round(lastVal * 100) / 100);
322
+ chartLabels.push(`P+${p + 1}`);
323
+ }
324
+ }
325
+ charts.push({
326
+ chartType: "line",
327
+ title: `${m.name} Trend`,
328
+ description: `${trend.direction} trend with ${trend.changePercent.toFixed(1)}% change${trend.cagr ? `, ${trend.cagr.toFixed(1)}% CAGR` : ""}`,
329
+ xAxis: { label: "Period", values: chartLabels },
330
+ yAxis: { label: m.name, unit: m.unit },
331
+ series: [
332
+ { name: m.name, values: m.values, color: colors[mi % colors.length] },
333
+ ...(include_projections ? [{ name: `${m.name} (Projected)`, values: [...Array(m.values.length - 1).fill(null), m.values[m.values.length - 1], ...seriesValues.slice(m.values.length)], color: colors[(mi + 4) % colors.length] }] : []),
334
+ ],
335
+ });
336
+ }
337
+ // Multi-metric overlay chart
338
+ if (metrics.length > 1) {
339
+ output += `\n## Combined Trend Chart\n\n`;
340
+ charts.push({
341
+ chartType: "line",
342
+ title: "All Metrics Combined",
343
+ description: "Overlay of all tracked metrics (normalized for comparison)",
344
+ xAxis: { label: "Period", values: labels },
345
+ yAxis: { label: "Normalized Value", unit: "index" },
346
+ series: metrics.map((m, i) => {
347
+ const baseVal = m.values[0] || 1;
348
+ return {
349
+ name: m.name,
350
+ values: m.values.map(v => Math.round((v / baseVal) * 100)),
351
+ color: colors[i % colors.length],
352
+ };
353
+ }),
354
+ });
355
+ }
356
+ // Chart details
357
+ output += `\n## Charts\n\n`;
358
+ for (let i = 0; i < charts.length; i++) {
359
+ const c = charts[i];
360
+ output += `### ${i + 1}. ${c.title}\n`;
361
+ output += `**Type:** ${c.chartType} | ${c.description}\n`;
362
+ for (const s of c.series) {
363
+ const validVals = s.values.filter(v => v !== null && !isNaN(v));
364
+ output += `- ${s.name}: [${validVals.map(v => formatNumber(v, c.yAxis?.unit ?? "")).join(", ")}]\n`;
365
+ }
366
+ output += `\n`;
367
+ }
368
+ // Anomalies section
369
+ const allAnomalies = metrics.flatMap(m => {
370
+ const trend = analyzeTrend(m.values);
371
+ return trend.anomalies.map(a => ({ metric: m.name, ...a, label: labels[a.index] || `Period ${a.index}` }));
372
+ });
373
+ if (allAnomalies.length > 0) {
374
+ output += `## Anomalies Detected\n\n`;
375
+ output += `| Metric | Period | Actual | Expected | Deviation |\n`;
376
+ output += `|--------|--------|--------|----------|----------|\n`;
377
+ for (const a of allAnomalies) {
378
+ output += `| ${a.metric} | ${a.label} | ${a.value} | ${a.expected} | ${a.deviation} |\n`;
379
+ }
380
+ output += `\n`;
381
+ }
382
+ // Growth analysis
383
+ output += `## Growth Analysis\n\n`;
384
+ for (const m of metrics) {
385
+ const trend = analyzeTrend(m.values);
386
+ output += `### ${m.name}\n`;
387
+ output += `- Overall change: ${trend.changePercent > 0 ? "+" : ""}${trend.changePercent.toFixed(1)}%\n`;
388
+ if (trend.cagr !== undefined)
389
+ output += `- CAGR: ${trend.cagr.toFixed(1)}%\n`;
390
+ output += `- Volatility: ${trend.volatility.toFixed(1)}% (${trend.volatility < 10 ? "stable" : trend.volatility < 25 ? "moderate" : "high"})\n`;
391
+ if (include_projections)
392
+ output += `- Projected next period: ${formatNumber(trend.projectedNext, m.unit)}\n`;
393
+ if (m.target_growth !== undefined) {
394
+ const actualGrowth = trend.cagr ?? trend.changePercent;
395
+ output += `- Target growth: ${m.target_growth}% — ${actualGrowth >= m.target_growth ? "ON TRACK" : "BEHIND TARGET"}\n`;
396
+ }
397
+ output += `\n`;
398
+ }
399
+ output += `---\n*Generated by ChartForge Report MCP — https://chartforgeai.com*`;
400
+ return { content: [{ type: "text", text: output }] };
401
+ });
402
+ // ── Tool: Comparison Report ───────────────────────────────────────────
403
+ server.tool("generate_comparison_report", "Build a comparative report with side-by-side charts, variance analysis, and ranking visualizations", {
404
+ title: z.string().describe("Report title"),
405
+ entities: z.array(z.object({
406
+ name: z.string().describe("Entity name (product, region, team, etc)"),
407
+ metrics: z.record(z.string(), z.number()).describe("Metric name → value pairs"),
408
+ })).min(2).max(20).describe("Entities to compare"),
409
+ highlight_best: z.boolean().default(true).describe("Highlight top performers"),
410
+ sort_by: z.string().optional().describe("Metric name to sort/rank by"),
411
+ higher_is_better: z.boolean().default(true).describe("Whether higher values are better for ranking"),
412
+ }, async ({ title, entities, highlight_best, sort_by, higher_is_better }) => {
413
+ const colors = PALETTES.professional;
414
+ const allMetrics = Array.from(new Set(entities.flatMap(e => Object.keys(e.metrics))));
415
+ // Sort entities
416
+ if (sort_by && allMetrics.includes(sort_by)) {
417
+ entities.sort((a, b) => higher_is_better ? (b.metrics[sort_by] ?? 0) - (a.metrics[sort_by] ?? 0) : (a.metrics[sort_by] ?? 0) - (b.metrics[sort_by] ?? 0));
418
+ }
419
+ let output = `# ${title} — Comparative Analysis\n\n`;
420
+ output += `**Entities Compared:** ${entities.length} | **Metrics:** ${allMetrics.length}\n\n`;
421
+ // Comparison table
422
+ output += `## Comparison Matrix\n\n`;
423
+ output += `| Entity | ${allMetrics.join(" | ")} |\n`;
424
+ output += `|--------|${allMetrics.map(() => "--------").join("|")}|\n`;
425
+ for (const e of entities) {
426
+ const vals = allMetrics.map(m => {
427
+ const v = e.metrics[m];
428
+ return v !== undefined ? v.toLocaleString() : "—";
429
+ });
430
+ output += `| ${e.name} | ${vals.join(" | ")} |\n`;
431
+ }
432
+ // Charts
433
+ const charts = [];
434
+ // Grouped bar chart for all metrics
435
+ charts.push({
436
+ chartType: "grouped_bar",
437
+ title: "Side-by-Side Comparison",
438
+ description: `${entities.length} entities across ${allMetrics.length} metrics`,
439
+ xAxis: { label: "Entity", values: entities.map(e => e.name) },
440
+ yAxis: { label: "Value", unit: "" },
441
+ series: allMetrics.map((m, i) => ({
442
+ name: m,
443
+ values: entities.map(e => e.metrics[m] ?? 0),
444
+ color: colors[i % colors.length],
445
+ })),
446
+ });
447
+ // Radar chart for multi-metric comparison (if 3+ metrics)
448
+ if (allMetrics.length >= 3) {
449
+ // Normalize values to 0-100 for radar
450
+ const maxPerMetric = {};
451
+ for (const m of allMetrics) {
452
+ maxPerMetric[m] = Math.max(...entities.map(e => e.metrics[m] ?? 0));
453
+ }
454
+ charts.push({
455
+ chartType: "radar",
456
+ title: "Multi-Dimensional Comparison",
457
+ description: "Normalized radar chart showing relative strengths across all metrics",
458
+ series: entities.map((e, i) => ({
459
+ name: e.name,
460
+ values: allMetrics.map(m => maxPerMetric[m] > 0 ? Math.round(((e.metrics[m] ?? 0) / maxPerMetric[m]) * 100) : 0),
461
+ color: colors[i % colors.length],
462
+ })),
463
+ });
464
+ }
465
+ // Ranking charts per metric
466
+ for (const m of allMetrics) {
467
+ const ranked = [...entities].sort((a, b) => higher_is_better ? (b.metrics[m] ?? 0) - (a.metrics[m] ?? 0) : (a.metrics[m] ?? 0) - (b.metrics[m] ?? 0));
468
+ charts.push({
469
+ chartType: "bar",
470
+ title: `${m} — Ranking`,
471
+ description: `${higher_is_better ? "Highest" : "Lowest"} is best. Leader: ${ranked[0].name}`,
472
+ xAxis: { label: "Entity", values: ranked.map(e => e.name) },
473
+ yAxis: { label: m, unit: "" },
474
+ series: [{ name: m, values: ranked.map(e => e.metrics[m] ?? 0), color: colors[0] }],
475
+ });
476
+ }
477
+ output += `\n## Charts\n\n`;
478
+ for (let i = 0; i < charts.length; i++) {
479
+ const c = charts[i];
480
+ output += `### ${i + 1}. ${c.title}\n`;
481
+ output += `**Type:** ${c.chartType} | ${c.description}\n`;
482
+ for (const s of c.series) {
483
+ output += `- ${s.name}: [${s.values.join(", ")}]\n`;
484
+ }
485
+ output += `\n`;
486
+ }
487
+ // Variance analysis
488
+ output += `## Variance Analysis\n\n`;
489
+ for (const m of allMetrics) {
490
+ const vals = entities.map(e => e.metrics[m] ?? 0).filter(v => v > 0);
491
+ if (vals.length < 2)
492
+ continue;
493
+ const avg = vals.reduce((a, b) => a + b, 0) / vals.length;
494
+ const max = Math.max(...vals);
495
+ const min = Math.min(...vals);
496
+ const spread = avg > 0 ? ((max - min) / avg) * 100 : 0;
497
+ output += `### ${m}\n`;
498
+ output += `- Average: ${avg.toFixed(1)} | Range: ${min.toFixed(1)} – ${max.toFixed(1)} | Spread: ${spread.toFixed(1)}%\n`;
499
+ if (highlight_best) {
500
+ const best = entities.reduce((a, b) => higher_is_better ? ((b.metrics[m] ?? 0) > (a.metrics[m] ?? 0) ? b : a) : ((b.metrics[m] ?? 0) < (a.metrics[m] ?? 0) ? b : a));
501
+ const worst = entities.reduce((a, b) => higher_is_better ? ((b.metrics[m] ?? 0) < (a.metrics[m] ?? 0) ? b : a) : ((b.metrics[m] ?? 0) > (a.metrics[m] ?? 0) ? b : a));
502
+ output += `- Best: **${best.name}** (${best.metrics[m]}) | Worst: ${worst.name} (${worst.metrics[m]})\n`;
503
+ }
504
+ output += `\n`;
505
+ }
506
+ output += `---\n*Generated by ChartForge Report MCP — https://chartforgeai.com*`;
507
+ return { content: [{ type: "text", text: output }] };
508
+ });
509
+ // ── Tool: KPI Scorecard ───────────────────────────────────────────────
510
+ server.tool("generate_kpi_scorecard", "Create a KPI scorecard with gauge charts, target vs actual tracking, and performance indicators", {
511
+ title: z.string().describe("Scorecard title"),
512
+ period_label: z.string().describe("Period label (e.g., 'Q1 2026', 'May 2026')"),
513
+ kpis: z.array(z.object({
514
+ name: z.string().describe("KPI name"),
515
+ value: z.number().describe("Current value"),
516
+ unit: z.string().describe("Unit ($, %, count, hours, etc)"),
517
+ target: z.number().describe("Target value"),
518
+ previous_period: z.number().optional().describe("Previous period value"),
519
+ min_acceptable: z.number().optional().describe("Minimum acceptable value (red zone threshold)"),
520
+ category: z.string().optional().describe("Category grouping (e.g., Financial, Operational, Customer)"),
521
+ })).min(1).describe("KPIs to score"),
522
+ }, async ({ title, period_label, kpis }) => {
523
+ let output = `# ${title}\n**Period:** ${period_label}\n\n`;
524
+ // Group by category
525
+ const categories = new Map();
526
+ for (const k of kpis) {
527
+ const cat = k.category || "General";
528
+ if (!categories.has(cat))
529
+ categories.set(cat, []);
530
+ categories.get(cat).push(k);
531
+ }
532
+ // Overall score
533
+ const scores = kpis.map(k => Math.min((k.value / k.target) * 100, 150));
534
+ const overallScore = Math.round(scores.reduce((a, b) => a + b, 0) / scores.length);
535
+ output += `## Overall Performance Score: ${overallScore}%\n\n`;
536
+ output += `${overallScore >= 100 ? "Exceeding targets" : overallScore >= 90 ? "On track" : overallScore >= 70 ? "Needs attention" : "Critical — action required"}\n\n`;
537
+ // Summary table
538
+ output += `## KPI Summary\n\n`;
539
+ output += `| KPI | Actual | Target | Achievement | vs Previous | Status |\n`;
540
+ output += `|-----|--------|--------|-------------|-------------|--------|\n`;
541
+ const charts = [];
542
+ for (const k of kpis) {
543
+ const achievement = Math.round((k.value / k.target) * 100);
544
+ const status = achievement >= 100 ? "Above Target" : achievement >= 90 ? "On Target" : achievement >= 70 ? "Below Target" : "CRITICAL";
545
+ const vsPrevious = k.previous_period !== undefined
546
+ ? `${((k.value - k.previous_period) / Math.abs(k.previous_period) * 100) > 0 ? "+" : ""}${((k.value - k.previous_period) / Math.abs(k.previous_period) * 100).toFixed(1)}%`
547
+ : "—";
548
+ output += `| ${k.name} | ${formatNumber(k.value, k.unit)} | ${formatNumber(k.target, k.unit)} | ${achievement}% | ${vsPrevious} | ${status} |\n`;
549
+ // Gauge chart per KPI
550
+ charts.push({
551
+ chartType: "gauge",
552
+ title: k.name,
553
+ description: `${achievement}% of target — ${status}`,
554
+ series: [{
555
+ name: k.name,
556
+ values: [k.value, k.target, k.min_acceptable ?? k.target * 0.7],
557
+ color: achievement >= 100 ? "#10B981" : achievement >= 90 ? "#F59E0B" : "#EF4444",
558
+ }],
559
+ });
560
+ }
561
+ // Category breakdown
562
+ if (categories.size > 1) {
563
+ output += `\n## Performance by Category\n\n`;
564
+ for (const [cat, catKpis] of categories) {
565
+ const catScores = catKpis.map(k => Math.min((k.value / k.target) * 100, 150));
566
+ const catAvg = Math.round(catScores.reduce((a, b) => a + b, 0) / catScores.length);
567
+ output += `### ${cat} — ${catAvg}%\n`;
568
+ for (const k of catKpis) {
569
+ const ach = Math.round((k.value / k.target) * 100);
570
+ output += `- ${k.name}: ${formatNumber(k.value, k.unit)} / ${formatNumber(k.target, k.unit)} (${ach}%)\n`;
571
+ }
572
+ output += `\n`;
573
+ }
574
+ }
575
+ // Charts section
576
+ output += `## Gauge Charts\n\n`;
577
+ for (let i = 0; i < charts.length; i++) {
578
+ const c = charts[i];
579
+ output += `### ${c.title}\n`;
580
+ output += `${c.description}\n`;
581
+ output += `- Current: ${c.series[0].values[0]} | Target: ${c.series[0].values[1]} | Min: ${c.series[0].values[2]}\n\n`;
582
+ }
583
+ // Action items
584
+ const criticalKpis = kpis.filter(k => (k.value / k.target) * 100 < 70);
585
+ const belowTarget = kpis.filter(k => { const a = (k.value / k.target) * 100; return a >= 70 && a < 100; });
586
+ if (criticalKpis.length > 0 || belowTarget.length > 0) {
587
+ output += `## Action Items\n\n`;
588
+ for (const k of criticalKpis) {
589
+ const gap = k.target - k.value;
590
+ output += `- **CRITICAL: ${k.name}** — ${formatNumber(gap, k.unit)} gap to target. Immediate intervention required.\n`;
591
+ }
592
+ for (const k of belowTarget) {
593
+ const gap = k.target - k.value;
594
+ output += `- ${k.name} — ${formatNumber(gap, k.unit)} below target. Monitor and adjust.\n`;
595
+ }
596
+ }
597
+ output += `\n---\n*Generated by ChartForge Report MCP — https://chartforgeai.com*`;
598
+ return { content: [{ type: "text", text: output }] };
599
+ });
600
+ // ── Tool: Data Narrative ──────────────────────────────────────────────
601
+ server.tool("generate_data_narrative", "Produce a complete data narrative combining multiple chart types with written analysis, insights, and recommendations", {
602
+ title: z.string().describe("Narrative title"),
603
+ context: z.string().describe("Business context — what question is this report answering?"),
604
+ datasets: z.array(z.object({
605
+ name: z.string().describe("Dataset name"),
606
+ labels: z.array(z.string()).describe("Category or time labels"),
607
+ values: z.array(z.number()).describe("Values corresponding to labels"),
608
+ unit: z.string().describe("Unit of measurement"),
609
+ chart_type: z.enum(["line", "bar", "pie", "area", "scatter", "waterfall", "funnel"]).describe("Preferred chart type"),
610
+ })).min(1).describe("Datasets to include in the narrative"),
611
+ audience: z.enum(["executive", "technical", "investor", "operations"]).default("executive").describe("Target audience for tone and detail level"),
612
+ include_recommendations: z.boolean().default(true).describe("Include actionable recommendations"),
613
+ }, async ({ title, context, datasets, audience, include_recommendations }) => {
614
+ const colors = PALETTES.professional;
615
+ let output = `# ${title}\n\n`;
616
+ // Audience-specific framing
617
+ const audienceFrame = {
618
+ executive: "This report provides a high-level overview with key takeaways and strategic implications.",
619
+ technical: "This report includes detailed metrics, methodology notes, and granular analysis.",
620
+ investor: "This report focuses on growth trajectory, unit economics, and market positioning.",
621
+ operations: "This report highlights operational metrics, efficiency indicators, and process improvements.",
622
+ };
623
+ output += `> ${audienceFrame[audience]}\n\n`;
624
+ output += `**Context:** ${context}\n\n`;
625
+ // Executive summary
626
+ output += `## Executive Summary\n\n`;
627
+ const summaryPoints = [];
628
+ for (const ds of datasets) {
629
+ const trend = analyzeTrend(ds.values);
630
+ const total = ds.values.reduce((a, b) => a + b, 0);
631
+ const latest = ds.values[ds.values.length - 1];
632
+ const max = Math.max(...ds.values);
633
+ const maxLabel = ds.labels[ds.values.indexOf(max)];
634
+ summaryPoints.push(`**${ds.name}**: Latest value ${formatNumber(latest, ds.unit)}, trending ${trend.direction} (${trend.changePercent > 0 ? "+" : ""}${trend.changePercent.toFixed(1)}%). Peak at ${maxLabel} (${formatNumber(max, ds.unit)}).`);
635
+ if (trend.anomalies.length > 0) {
636
+ summaryPoints.push(`${ds.name} has ${trend.anomalies.length} anomal${trend.anomalies.length === 1 ? "y" : "ies"} requiring investigation.`);
637
+ }
638
+ }
639
+ for (const p of summaryPoints) {
640
+ output += `- ${p}\n`;
641
+ }
642
+ // Detailed analysis per dataset
643
+ output += `\n## Detailed Analysis\n\n`;
644
+ const charts = [];
645
+ for (let di = 0; di < datasets.length; di++) {
646
+ const ds = datasets[di];
647
+ const trend = analyzeTrend(ds.values);
648
+ const total = ds.values.reduce((a, b) => a + b, 0);
649
+ const avg = total / ds.values.length;
650
+ const max = Math.max(...ds.values);
651
+ const min = Math.min(...ds.values);
652
+ output += `### ${ds.name}\n\n`;
653
+ // Narrative paragraph
654
+ if (audience === "executive" || audience === "investor") {
655
+ output += `${ds.name} shows a ${trend.direction} trend over the analyzed period, with an overall change of ${trend.changePercent > 0 ? "+" : ""}${trend.changePercent.toFixed(1)}%. `;
656
+ output += `The average value is ${formatNumber(avg, ds.unit)}, ranging from ${formatNumber(min, ds.unit)} to ${formatNumber(max, ds.unit)}. `;
657
+ if (trend.volatility > 25) {
658
+ output += `Volatility is notably high at ${trend.volatility.toFixed(1)}%, suggesting significant period-to-period variation that warrants further investigation. `;
659
+ }
660
+ output += `\n\n`;
661
+ }
662
+ else {
663
+ output += `| Statistic | Value |\n|-----------|-------|\n`;
664
+ output += `| Latest | ${formatNumber(ds.values[ds.values.length - 1], ds.unit)} |\n`;
665
+ output += `| Average | ${formatNumber(avg, ds.unit)} |\n`;
666
+ output += `| Min | ${formatNumber(min, ds.unit)} (${ds.labels[ds.values.indexOf(min)]}) |\n`;
667
+ output += `| Max | ${formatNumber(max, ds.unit)} (${ds.labels[ds.values.indexOf(max)]}) |\n`;
668
+ output += `| Change | ${trend.changePercent > 0 ? "+" : ""}${trend.changePercent.toFixed(1)}% |\n`;
669
+ output += `| Volatility | ${trend.volatility.toFixed(1)}% |\n`;
670
+ if (trend.cagr !== undefined)
671
+ output += `| CAGR | ${trend.cagr.toFixed(1)}% |\n`;
672
+ output += `\n`;
673
+ }
674
+ // Chart
675
+ charts.push({
676
+ chartType: ds.chart_type,
677
+ title: ds.name,
678
+ description: `${trend.direction} trend, ${trend.changePercent > 0 ? "+" : ""}${trend.changePercent.toFixed(1)}% change`,
679
+ xAxis: { label: "Category", values: ds.labels },
680
+ yAxis: { label: ds.name, unit: ds.unit },
681
+ series: [{ name: ds.name, values: ds.values, color: colors[di % colors.length] }],
682
+ annotations: trend.anomalies.map(a => `Anomaly at ${ds.labels[a.index]}: ${a.value} (expected ~${a.expected})`),
683
+ });
684
+ }
685
+ // Charts section
686
+ output += `## Visualizations\n\n`;
687
+ for (let i = 0; i < charts.length; i++) {
688
+ const c = charts[i];
689
+ output += `### ${i + 1}. ${c.title} (${c.chartType})\n`;
690
+ output += `${c.description}\n`;
691
+ output += `- Labels: [${c.xAxis?.values.join(", ")}]\n`;
692
+ for (const s of c.series) {
693
+ output += `- ${s.name}: [${s.values.join(", ")}]\n`;
694
+ }
695
+ if (c.annotations && c.annotations.length > 0) {
696
+ output += `- Annotations: ${c.annotations.join("; ")}\n`;
697
+ }
698
+ output += `\n`;
699
+ }
700
+ // Cross-dataset correlations
701
+ if (datasets.length >= 2) {
702
+ output += `## Cross-Dataset Observations\n\n`;
703
+ for (let i = 0; i < datasets.length - 1; i++) {
704
+ for (let j = i + 1; j < datasets.length; j++) {
705
+ const a = datasets[i];
706
+ const b = datasets[j];
707
+ const minLen = Math.min(a.values.length, b.values.length);
708
+ if (minLen < 3)
709
+ continue;
710
+ // Simple correlation
711
+ const aSlice = a.values.slice(-minLen);
712
+ const bSlice = b.values.slice(-minLen);
713
+ const aMean = aSlice.reduce((s, v) => s + v, 0) / minLen;
714
+ const bMean = bSlice.reduce((s, v) => s + v, 0) / minLen;
715
+ const cov = aSlice.reduce((s, v, k) => s + (v - aMean) * (bSlice[k] - bMean), 0) / minLen;
716
+ const aStd = Math.sqrt(aSlice.reduce((s, v) => s + Math.pow(v - aMean, 2), 0) / minLen);
717
+ const bStd = Math.sqrt(bSlice.reduce((s, v) => s + Math.pow(v - bMean, 2), 0) / minLen);
718
+ const corr = (aStd > 0 && bStd > 0) ? cov / (aStd * bStd) : 0;
719
+ if (Math.abs(corr) > 0.5) {
720
+ const strength = Math.abs(corr) > 0.8 ? "strong" : "moderate";
721
+ const direction = corr > 0 ? "positive" : "negative";
722
+ output += `- **${a.name}** and **${b.name}** show a ${strength} ${direction} correlation (r=${corr.toFixed(2)}).\n`;
723
+ }
724
+ }
725
+ }
726
+ output += `\n`;
727
+ }
728
+ // Recommendations
729
+ if (include_recommendations) {
730
+ output += `## Recommendations\n\n`;
731
+ let recNum = 1;
732
+ for (const ds of datasets) {
733
+ const trend = analyzeTrend(ds.values);
734
+ if (trend.direction === "down") {
735
+ output += `${recNum}. **Investigate ${ds.name} decline** — ${Math.abs(trend.changePercent).toFixed(1)}% decrease requires root cause analysis and corrective action.\n`;
736
+ recNum++;
737
+ }
738
+ if (trend.volatility > 30) {
739
+ output += `${recNum}. **Stabilize ${ds.name}** — ${trend.volatility.toFixed(1)}% volatility indicates unpredictable performance. Implement smoothing strategies.\n`;
740
+ recNum++;
741
+ }
742
+ if (trend.anomalies.length > 0) {
743
+ output += `${recNum}. **Review ${ds.name} anomalies** — ${trend.anomalies.length} outlier${trend.anomalies.length === 1 ? "" : "s"} detected. Determine if these are data errors or genuine events.\n`;
744
+ recNum++;
745
+ }
746
+ if (trend.direction === "up" && trend.changePercent > 20) {
747
+ output += `${recNum}. **Capitalize on ${ds.name} momentum** — ${trend.changePercent.toFixed(1)}% growth trajectory. Consider investing more resources to accelerate.\n`;
748
+ recNum++;
749
+ }
750
+ }
751
+ if (recNum === 1) {
752
+ output += `All metrics are within expected ranges. Continue monitoring and maintain current strategies.\n`;
753
+ }
754
+ }
755
+ output += `\n---\n*Generated by ChartForge Report MCP — https://chartforgeai.com*`;
756
+ return { content: [{ type: "text", text: output }] };
757
+ });
758
+ // ── Start Server ──────────────────────────────────────────────────────
759
+ async function main() {
760
+ const transport = new StdioServerTransport();
761
+ await server.connect(transport);
762
+ }
763
+ main().catch(console.error);
764
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "chartforge-report-mcp",
3
+ "version": "0.2.0",
4
+ "description": "MCP server for multi-chart data reports — generates executive dashboards, trend analyses, comparative reports, and data narratives with chart specifications ready for rendering",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "chartforge-report-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "start": "node dist/index.js",
17
+ "prepublishOnly": "npm run build"
18
+ },
19
+ "keywords": [
20
+ "mcp",
21
+ "model-context-protocol",
22
+ "chart",
23
+ "report",
24
+ "dashboard",
25
+ "data-visualization",
26
+ "executive-summary",
27
+ "trend-analysis",
28
+ "comparative-report",
29
+ "chartforge",
30
+ "business-intelligence",
31
+ "kpi-dashboard",
32
+ "data-narrative",
33
+ "chart-generation",
34
+ "analytics-report"
35
+ ],
36
+ "author": "Crawde",
37
+ "license": "MIT",
38
+ "dependencies": {
39
+ "@modelcontextprotocol/sdk": "^1.12.1",
40
+ "zod": "^3.24.4"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^25.6.2",
44
+ "typescript": "^5.8.3"
45
+ }
46
+ }