mcp-dashboards 2.2.0 → 2.4.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 CHANGED
@@ -1,284 +1,291 @@
1
- # MCP Dashboards
2
-
3
- <!-- mcp-name: io.github.KyuRish/mcp-dashboards -->
4
-
5
- ### Your AI can talk about data. Now it can show it.
6
-
7
- [![npm](https://img.shields.io/npm/v/mcp-dashboards)](https://www.npmjs.com/package/mcp-dashboards)
8
- [![Glama Quality](https://img.shields.io/badge/Glama_Quality-A-brightgreen)](https://glama.ai/mcp/servers/@KyuRish/mcp-dashboards)
9
- [![Glama Security](https://img.shields.io/badge/Glama_Security-A-brightgreen)](https://glama.ai/mcp/servers/@KyuRish/mcp-dashboards)
10
- [![License: FSL-1.1-MIT](https://img.shields.io/badge/License-FSL--1.1--MIT-blue.svg)](LICENSE)
11
- [![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-support-yellow?logo=buy-me-a-coffee&logoColor=white)](https://buymeacoffee.com/kyuish)
12
- [![GitHub Sponsors](https://img.shields.io/badge/Sponsor-GitHub-ea4aaa?logo=github)](https://github.com/sponsors/KyuRish)
13
-
14
- <p align="center">
15
- <img src="assets/demo.gif" width="400" alt="MCP Dashboards demo" />
16
- <br>
17
- <a href="assets/dashboard-example.png"><img src="assets/dashboard-example.png" width="115" height="220" alt="Infrastructure Command Center dashboard" /></a>&nbsp;
18
- <a href="assets/chart-catalog.png"><img src="assets/chart-catalog.png" width="115" height="220" alt="Chart Catalog - 31 chart tools" /></a>&nbsp;
19
- <a href="assets/theme-catalog.png"><img src="assets/theme-catalog.png" width="115" height="220" alt="Theme Catalog - 21 themes" /></a>
20
- <br><sub>Click any thumbnail to see full size</sub>
21
- </p>
22
-
23
- ## The problem
24
-
25
- We use AI for everything - analysis, reports, strategy. But when it comes to actually *seeing* the story in your data, you're stuck copying numbers into a spreadsheet and building charts yourself. The conversation has the insight. The visualization is somewhere else.
26
-
27
- ## The solution
28
-
29
- MCP Dashboards renders interactive charts, dashboards, and KPI widgets directly inside your AI conversation. 31 chart tools covering 44+ chart subtypes (bar has stacked/drilldown, hero has 11 variants, etc.), 21 themes, 4 visual discovery catalogs, live polling, PNG/PPT/A4 export - all from a single MCP server. No browser tabs, no copy-paste, no context switching.
30
-
31
- ## Quick Start
32
-
33
- ### Claude Desktop
34
-
35
- Add to your `claude_desktop_config.json`:
36
-
37
- - **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
38
- - **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
39
-
40
- ```json
41
- {
42
- "mcpServers": {
43
- "dashboard": {
44
- "command": "npx",
45
- "args": ["-y", "mcp-dashboards", "--stdio"]
46
- }
47
- }
48
- }
49
- ```
50
-
51
- ### Claude Code / VS Code
52
-
53
- ```bash
54
- claude mcp add dashboard -- npx -y mcp-dashboards --stdio
55
- ```
56
-
57
- ### Remote (Streamable HTTP)
58
-
59
- ```bash
60
- npx mcp-dashboards
61
- # Server starts on http://127.0.0.1:3001/mcp
62
- ```
63
-
64
- Bound to localhost by default. See [Configuration](#configuration) if you need to expose it on your network or allow browser access from a non-localhost origin.
65
-
66
- ### Supported clients
67
-
68
- Works in any MCP Apps-compatible client: **Claude Desktop**, **Claude Web**, **VS Code** (GitHub Copilot), **Goose**, **Postman**, **MCPJam**. ChatGPT support is rolling out.
69
-
70
- ## Just ask
71
-
72
- No API to learn. Describe what you want in plain English:
73
-
74
- - *"Compare Q1 vs Q2 revenue by region as a bar chart"*
75
- - *"Show my portfolio allocation as a donut chart with the boardroom theme"*
76
- - *"Build a dashboard with monthly sales KPIs and a trend line"*
77
- - *"Visualize website traffic by country on a world map"*
78
- - *"Track Bitcoin price live, updating every 30 seconds"*
79
- - *"Show the conversion funnel from signup to purchase"*
80
- - *"Rank the team by performance using a radar chart"*
81
-
82
- The AI picks the right tool, formats your data, and renders the chart inline. Click any data point to ask follow-up questions.
83
-
84
- **Don't know where to start?** Ask *"show me the catalog"* — opens a master dashboard with one live visual tile per customization dimension (a real bar chart for charts, a pie for themes, a progress ring for hero variants, a neon-glowing card for effects). Click any tile, hit Ask, and you'll drill into that sub-catalog.
85
-
86
- ## Interactive charts, not images
87
-
88
- Every chart is **interactive HTML** rendered directly in your conversation:
89
-
90
- - **Explore in-chat** - hover tooltips, click-to-select (feeds back to the AI), drill-down with breadcrumbs, scroll-zoom up to 12x on maps and heatmaps
91
- - **Live polling** - real-time charts that auto-update from any API on a timer
92
- - **Export anywhere** - PPT (16:9 slides), A4 (paginated with smart page breaks), PNG, CSV
93
-
94
- <details>
95
- <summary><strong>All Tools</strong></summary>
96
-
97
- | Tool | Type | Best For |
98
- |------|------|----------|
99
- | `render_pie_chart` | Pie/Donut | Composition - "what makes up the whole?" |
100
- | `render_bar_chart` | Bar | Comparison - vertical, horizontal, stacked, drill-down |
101
- | `render_line_chart` | Line/Area | Trends - smooth curves, gradient fills, time series |
102
- | `render_scatter_chart` | Scatter | Relationships - per-point labels, annotations, quadrants |
103
- | `render_candlestick_chart` | Candlestick | Finance - OHLC data with volume bars |
104
- | `render_radar_chart` | Radar | Multi-axis comparison - skills, scores, product attributes |
105
- | `render_treemap_chart` | Treemap | Hierarchy - nested rectangles sized by value |
106
- | `render_sankey_chart` | Sankey | Flow - money, users, or resources between stages |
107
- | `render_wordcloud_chart` | Word Cloud | Frequency - sized words from text analysis |
108
- | `render_boxplot_chart` | Boxplot/Violin | Distribution - quartiles, outliers, density shapes |
109
- | `render_live_chart` | Live | Real-time - auto-polls any MCP tool on a timer |
110
- | `poll_http` | Data proxy | Fetch JSON from any HTTP endpoint - secure presets or public URLs |
111
- | `render_bullet_chart` | Bullet | KPI vs target - 2-8 zone bands with labels |
112
- | `render_lollipop_chart` | Lollipop | Ranking - clean dots with optional target markers |
113
- | `render_dumbbell_chart` | Dumbbell | Gaps - before/after with scale labels and zone bands |
114
- | `render_variance_chart` | Variance | Budget - actual vs budget, color-coded over/under |
115
- | `render_funnel_chart` | Funnel | Conversion - staged drop-off with percentages |
116
- | `render_slope_chart` | Slope | Change - ranking shifts between two periods |
117
- | `render_waffle_chart` | Waffle | Proportion - 10x10 grid showing composition |
118
- | `render_sparkline_chart` | Sparkline | Compact trends - mini cards with change indicators |
119
- | `render_radial_cluster` | Radial | Health check - multi-metric ring gauges with status |
120
- | `render_waterfall_chart` | Waterfall | Cumulative - cascading bars showing impact |
121
- | `render_heatmap_chart` | Heatmap | Intensity - 2D grid with color mapping |
122
- | `render_geo_chart` | Geo/Map | Geography - color-coded countries by value (choropleth) |
123
- | `render_bubble_map` | Bubble Map | Pin map - sized circles at lat/lng coordinates |
124
- | `render_timeline_chart` | Timeline | Progress - milestone tracker with status indicators |
125
- | `render_hero_metric` | Hero | KPI widgets - 11 variants (progress ring, gem, orb, NPS, etc.) |
126
- | `render_dashboard` | Dashboard | Everything - KPI cards + multiple charts in responsive grid |
127
- | `render_table` | Table | Data - sortable columns, striped rows, CSV export |
128
- | `render_from_json` | Auto-detect | Any JSON data - picks the best chart automatically |
129
- | `render_from_url` | URL fetch | Fetches JSON from a URL and auto-visualizes |
130
-
131
- **Discovery / Catalogs** visual entry points for browsing what's available:
132
-
133
- | Tool | Shows | When to use |
134
- |------|-------|-------------|
135
- | `render_catalog` | Master catalog with 4 live preview tiles | Don't know where to start. Click any tile, hit Ask, drill in. |
136
- | `render_chart_catalog` | All 31 chart types with mini previews | Looking for the right chart for your data |
137
- | `render_theme_catalog` | All 21 themes with color/typography/effects | Picking a theme |
138
- | `render_hero_catalog` | All 11 hero metric variants | Picking a KPI widget style |
139
- | `render_effects_catalog` | All 5 effect presets, each applied to a real card | Picking an animation/glow style |
140
-
141
- Typography is still configurable on every chart via `typography=<name>` (8 options listed under [Themes](#themes)) it just doesn't have its own catalog because all 8 options were visually identical without per-card font loading, which wasn't worth the build for one preview tool.
142
-
143
- </details>
144
-
145
- <details>
146
- <summary><strong>Which chart should I use?</strong></summary>
147
-
148
- | Question | Best Chart | Also Works |
149
- |----------|-----------|------------|
150
- | "What makes up the whole?" | Pie/Waffle | Treemap, Stacked bar |
151
- | "How do values compare?" | Bar | Lollipop, Bullet, Radar |
152
- | "What's the trend over time?" | Line | Sparkline, Slope |
153
- | "Are we hitting targets?" | Bullet | Variance, Radial |
154
- | "Where's the gap?" | Dumbbell | Variance |
155
- | "How does X relate to Y?" | Scatter | Heatmap |
156
- | "What's the conversion rate?" | Funnel | Waterfall, Sankey |
157
- | "What changed between periods?" | Slope | Dumbbell |
158
- | "What's the financial picture?" | Candlestick | Line |
159
- | "Show me the KPI" | Hero metric | Dashboard |
160
- | "What's the distribution?" | Boxplot | Violin (same tool) |
161
- | "Where does money/traffic flow?" | Sankey | Treemap |
162
- | "How do options score across axes?" | Radar | Heatmap |
163
- | "What are the top keywords?" | Word Cloud | Bar, Treemap |
164
- | "Where are users/sales/revenue?" | Geo map | Bubble map, Heatmap |
165
- | "Monitor this in real-time" | Live chart | - |
166
-
167
- </details>
168
-
169
- ## Themes
170
-
171
- 21 built-in themes. Pass `theme` to any tool.
172
-
173
- | Family | Themes |
174
- |--------|--------|
175
- | **Classic** | `boardroom`, `corporate`, `sales-floor`, `golden-treasury`, `clinical`, `startup`, `ops-control`, `tokyo-midnight`, `zen-garden`, `consultant` |
176
- | **Black/AI** | `black-tron` (cyan neon), `black-elegance` (warm gold), `black-matrix` (green hacker) |
177
- | **Forest** | `forest-amber` (autumn), `forest-earth` (terracotta) |
178
- | **Sky** | `sky-light` (airy blue), `sky-ocean` (deep navy), `sky-twilight` (sunset) |
179
- | **Office** | `office-red` (corporate red, white bg - report-ready) |
180
- | **Gray/ML** | `gray-hf` (warm yellow accent), `gray-copilot` (teal on dark) |
181
-
182
- Mix-and-match with `palette`, `typography` (8 options: system, mono, professional, editorial, bold, techno, cyberpunk, luxury), and `effects` (5 presets: none, subtle, shimmer, neon, energetic).
183
-
184
- ## Live Polling
185
-
186
- Real-time charts that auto-update from any API. The live chart polls data via `poll_http`, which supports two modes:
187
-
188
- ### Secure presets (authenticated APIs)
189
-
190
- Configure presets via env vars. Credentials stay server-side and never appear in the conversation.
191
-
192
- ```json
193
- {
194
- "mcpServers": {
195
- "dashboard": {
196
- "command": "npx",
197
- "args": ["-y", "mcp-dashboards", "--stdio"],
198
- "env": {
199
- "POLL_PRESET_T212_CASH_URL": "https://live.trading212.com/api/v0/equity/account/cash",
200
- "POLL_PRESET_T212_CASH_HEADERS": "{\"Authorization\": \"Bearer YOUR_API_KEY\"}"
201
- }
202
- }
203
- }
204
- }
205
- ```
206
-
207
- Then ask: *"Monitor my portfolio total and P/L live"* - the AI uses `render_live_chart` with `pollArgs: { preset: "t212_cash" }`.
208
-
209
- **Naming:** `POLL_PRESET_<NAME>_URL` and `POLL_PRESET_<NAME>_HEADERS` (JSON object).
210
-
211
- ### Public URLs (no auth needed)
212
-
213
- For public APIs, use the URL directly:
214
-
215
- *"Show me Bitcoin price updating every 30 seconds"* - uses `pollArgs: { url: "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd" }`.
216
-
217
- ## How It Works
218
-
219
- Built on [MCP Apps](https://modelcontextprotocol.io/docs/extensions/apps). You ask the AI to visualize data, it calls the right tool, and the chart renders inline in your conversation. Self-contained - zero CDN, zero external requests.
220
-
221
- **MCP Apps supported** (inline rendering): Claude Desktop, VS Code Insiders + MCP Apps extension, Goose, Postman.
222
-
223
- **No MCP Apps support?** No problem. Every chart response also includes a clickable link to the same interactive chart in your browser:
224
- - `http://localhost:PORT/chart/{id}` - the clickable link in chat. Backed by a tiny same-machine HTTP server bound to 127.0.0.1, lazy-started on the first preview request.
225
- - `file:///.../chart-{id}.html` - the persistent shareable artifact. Same HTML bytes, written to disk so you can email, archive, or open it after the server has shut down.
226
-
227
- Why both: Claude Code (VS Code) strips `file://`, `vscode://`, and `command://` URL schemes from chat markdown, so only `http://` produces a working clickable link. The file:// path is provided for sharing and offline viewing. Tool annotations (`readOnlyHint`, `idempotentHint`, `openWorldHint`) help clients reason about tool behavior.
228
-
229
- ## Configuration
230
-
231
- All optional. Defaults are safe — set these only if you need to override.
232
-
233
- | Env var | Default | What it does |
234
- |---------|---------|--------------|
235
- | `MCP_DASHBOARDS_RETAIN_DAYS` | `7` | How long to keep chart preview HTML files on disk. `0` disables auto-cleanup. |
236
- | `MCP_DASHBOARDS_DISABLE_PREVIEW` | unset | Kill switch no HTML files written, no preview server started, no preview links. Inline rendering still works in MCP Apps clients. |
237
- | `MCP_HTTP_BIND_HOST` | `127.0.0.1` | HTTP-transport bind host. Stays on localhost by default. Set to `0.0.0.0` only if you trust your network. |
238
- | `MCP_CORS_ALLOWED_ORIGINS` | localhost only | Comma-separated origins allowed to call the HTTP endpoint from a browser. Set this to add a non-localhost origin (e.g. `https://your-app.com`). |
239
- | `MCP_URL_ALLOWLIST` | empty | Comma-separated hostnames that bypass the SSRF guard for `render_from_url` / `poll_http`. Use only for internal endpoints you fully trust. |
240
- | `MCP_OUTBOUND_RATE_PER_SEC` | `10` | Per-host throttle for outbound HTTP calls. |
241
- | `MCP_OUTBOUND_BURST` | `20` | How many initial requests can fire immediately before the rate kicks in. |
242
- | `POLL_PRESET_<NAME>_URL` | | Server-side preset URL for live polling. See [Live Polling](#live-polling). |
243
- | `POLL_PRESET_<NAME>_HEADERS` | | Auth headers (JSON object) for the matching preset URL. |
244
-
245
- ### What's on disk
246
-
247
- Chart HTML files are written to `<system temp>/mcp-dashboards/` and auto-deleted after 7 days. The chart's built-in download button (PNG / PPT / A4) is the recommended way to save anything permanently.
248
-
249
- Ask your AI to *"list chart files"* or *"delete chart files older than 1 day"* anytime — invokes `list_chart_files` / `delete_chart_files`.
250
-
251
- **Requirements:** Node.js 18+.
252
-
253
- <details>
254
- <summary><strong>Contributing</strong></summary>
255
-
256
- ```bash
257
- git clone https://github.com/KyuRish/mcp-dashboards.git
258
- cd mcp-dashboards
259
- npm install
260
- npm run build
261
- npm run serve # http://localhost:3001
262
- npm run dev # watch mode
263
- ```
264
-
265
- </details>
266
-
267
- ## Support
268
-
269
- If MCP Dashboards is useful to you:
270
-
271
- [![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-support-yellow?logo=buy-me-a-coffee&logoColor=white)](https://buymeacoffee.com/kyuish)
272
- [![GitHub Sponsors](https://img.shields.io/badge/Sponsor-GitHub-ea4aaa?logo=github)](https://github.com/sponsors/KyuRish)
273
-
274
- ## Privacy
275
-
276
- All processing happens locally. No data is collected, transmitted, or stored externally.
277
-
278
- External calls only happen when *you* explicitly ask — `render_from_url` and `poll_http` need a URL or preset you provide. Both refuse to fetch private, loopback, or link-local addresses (your `192.168.*` network, AWS metadata at `169.254.169.254`, etc.) so a prompt-injected AI can't quietly reach internal services. They also throttle per hostname so a runaway loop won't get your IP banned from a real API.
279
-
280
- Credentials in env var presets never leave your machine. The browser preview server and the optional HTTP transport both bind to `127.0.0.1` by default and are not reachable from other devices. Chart HTML files live in your system temp folder and auto-delete after 7 days. See [Configuration](#configuration) to change any of this.
281
-
282
- ## License
283
-
284
- [FSL-1.1-MIT](LICENSE) - Free to use for any purpose except building a competing commercial product. Each version converts to MIT two years after release. For commercial licensing, contact [contact@kyuish.com](mailto:contact@kyuish.com).
1
+ # MCP Dashboards
2
+
3
+ <!-- mcp-name: io.github.KyuRish/mcp-dashboards -->
4
+
5
+ ### Your AI can talk about data. Now it can show it.
6
+
7
+ [![npm](https://img.shields.io/npm/v/mcp-dashboards)](https://www.npmjs.com/package/mcp-dashboards)
8
+ [![Glama Quality](https://img.shields.io/badge/Glama_Quality-A-brightgreen)](https://glama.ai/mcp/servers/@KyuRish/mcp-dashboards)
9
+ [![Glama Security](https://img.shields.io/badge/Glama_Security-A-brightgreen)](https://glama.ai/mcp/servers/@KyuRish/mcp-dashboards)
10
+ [![License: FSL-1.1-MIT](https://img.shields.io/badge/License-FSL--1.1--MIT-blue.svg)](LICENSE)
11
+ [![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-support-yellow?logo=buy-me-a-coffee&logoColor=white)](https://buymeacoffee.com/kyuish)
12
+ [![GitHub Sponsors](https://img.shields.io/badge/Sponsor-GitHub-ea4aaa?logo=github)](https://github.com/sponsors/KyuRish)
13
+
14
+ <p align="center">
15
+ <img src="assets/demo.gif" width="400" alt="MCP Dashboards demo" />
16
+ <br>
17
+ <a href="assets/dashboard-example.png"><img src="assets/dashboard-example.png" width="115" height="220" alt="Infrastructure Command Center dashboard" /></a>&nbsp;
18
+ <a href="assets/chart-catalog.png"><img src="assets/chart-catalog.png" width="115" height="220" alt="Chart Catalog - 32 chart tools" /></a>&nbsp;
19
+ <a href="assets/theme-catalog.png"><img src="assets/theme-catalog.png" width="115" height="220" alt="Theme Catalog - 21 themes" /></a>
20
+ <br><sub>Click any thumbnail to see full size</sub>
21
+ </p>
22
+
23
+ ## The problem
24
+
25
+ We use AI for everything - analysis, reports, strategy. But when it comes to actually *seeing* the story in your data, you're stuck copying numbers into a spreadsheet and building charts yourself. The conversation has the insight. The visualization is somewhere else.
26
+
27
+ ## The solution
28
+
29
+ MCP Dashboards renders interactive charts, dashboards, and KPI widgets directly inside your AI conversation. 32 chart tools covering 45+ chart subtypes (bar has stacked/drilldown, hero has 11 variants, flowchart has 6 node kinds + 5 edge styles, etc.), 21 themes, 4 visual discovery catalogs, live polling, PNG/PPT/A4 export - all from a single MCP server. No browser tabs, no copy-paste, no context switching.
30
+
31
+ ## Quick Start
32
+
33
+ ### Claude Desktop
34
+
35
+ Add to your `claude_desktop_config.json`:
36
+
37
+ - **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
38
+ - **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
39
+
40
+ ```json
41
+ {
42
+ "mcpServers": {
43
+ "dashboard": {
44
+ "command": "npx",
45
+ "args": ["-y", "mcp-dashboards", "--stdio"]
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ ### Claude Code / VS Code
52
+
53
+ ```bash
54
+ claude mcp add dashboard -- npx -y mcp-dashboards --stdio
55
+ ```
56
+
57
+ ### Remote (Streamable HTTP)
58
+
59
+ ```bash
60
+ npx mcp-dashboards
61
+ # Server starts on http://127.0.0.1:3001/mcp
62
+ ```
63
+
64
+ Bound to localhost by default. See [Configuration](#configuration) if you need to expose it on your network or allow browser access from a non-localhost origin.
65
+
66
+ ### Supported clients
67
+
68
+ Works in any MCP Apps-compatible client: **Claude Desktop**, **Claude Web**, **VS Code** (GitHub Copilot), **Goose**, **Postman**, **MCPJam**. ChatGPT support is rolling out.
69
+
70
+ ## Just ask
71
+
72
+ No API to learn. Describe what you want in plain English:
73
+
74
+ - *"Compare Q1 vs Q2 revenue by region as a bar chart"*
75
+ - *"Show my portfolio allocation as a donut chart with the boardroom theme"*
76
+ - *"Build a dashboard with monthly sales KPIs and a trend line"*
77
+ - *"Visualize website traffic by country on a world map"*
78
+ - *"Track Bitcoin price live, updating every 30 seconds"*
79
+ - *"Show the conversion funnel from signup to purchase"*
80
+ - *"Rank the team by performance using a radar chart"*
81
+ - *"Diagram my multi-agent pipeline as a flowchart and let me step through it"*
82
+
83
+ The AI picks the right tool, formats your data, and renders the chart inline. Click any data point to ask follow-up questions.
84
+
85
+ **Don't know where to start?** Ask *"show me the catalog"* - opens a master dashboard with one live visual tile per customization dimension (a real bar chart for charts, a pie for themes, a progress ring for hero variants, a neon-glowing card for effects). Click any tile, hit Ask, and you'll drill into that sub-catalog.
86
+
87
+ ## Interactive charts, not images
88
+
89
+ Every chart is **interactive HTML** rendered directly in your conversation:
90
+
91
+ - **Explore in-chat** - hover tooltips, click-to-select (feeds back to the AI), drill-down with breadcrumbs, scroll-zoom up to 12x on maps and heatmaps
92
+ - **Editable flowcharts** - drag nodes, multi-select, rename via right-click, minimap + node list to navigate, step-through playback of the flow, then sync your layout back to the AI to save it
93
+ - **Live polling** - real-time charts that auto-update from any API on a timer
94
+ - **Export anywhere** - PPT (16:9 slides), A4 (paginated with smart page breaks), PNG, CSV
95
+
96
+ <details>
97
+ <summary><strong>All Tools</strong></summary>
98
+
99
+ | Tool | Type | Best For |
100
+ |------|------|----------|
101
+ | `render_pie_chart` | Pie/Donut | Composition - "what makes up the whole?" |
102
+ | `render_bar_chart` | Bar | Comparison - vertical, horizontal, stacked, drill-down |
103
+ | `render_line_chart` | Line/Area | Trends - smooth curves, gradient fills, time series |
104
+ | `render_scatter_chart` | Scatter | Relationships - per-point labels, annotations, quadrants |
105
+ | `render_candlestick_chart` | Candlestick | Finance - OHLC data with volume bars |
106
+ | `render_radar_chart` | Radar | Multi-axis comparison - skills, scores, product attributes |
107
+ | `render_treemap_chart` | Treemap | Hierarchy - nested rectangles sized by value |
108
+ | `render_sankey_chart` | Sankey | Flow - money, users, or resources between stages |
109
+ | `render_wordcloud_chart` | Word Cloud | Frequency - sized words from text analysis |
110
+ | `render_boxplot_chart` | Boxplot/Violin | Distribution - quartiles, outliers, density shapes |
111
+ | `render_live_chart` | Live | Real-time - auto-polls any MCP tool on a timer |
112
+ | `poll_http` | Data proxy | Fetch JSON from any HTTP endpoint - secure presets or public URLs |
113
+ | `render_bullet_chart` | Bullet | KPI vs target - 2-8 zone bands with labels |
114
+ | `render_lollipop_chart` | Lollipop | Ranking - clean dots with optional target markers |
115
+ | `render_dumbbell_chart` | Dumbbell | Gaps - before/after with scale labels and zone bands |
116
+ | `render_variance_chart` | Variance | Budget - actual vs budget, color-coded over/under |
117
+ | `render_funnel_chart` | Funnel | Conversion - staged drop-off with percentages |
118
+ | `render_slope_chart` | Slope | Change - ranking shifts between two periods |
119
+ | `render_waffle_chart` | Waffle | Proportion - 10x10 grid showing composition |
120
+ | `render_sparkline_chart` | Sparkline | Compact trends - mini cards with change indicators |
121
+ | `render_radial_cluster` | Radial | Health check - multi-metric ring gauges with status |
122
+ | `render_waterfall_chart` | Waterfall | Cumulative - cascading bars showing impact |
123
+ | `render_heatmap_chart` | Heatmap | Intensity - 2D grid with color mapping |
124
+ | `render_geo_chart` | Geo/Map | Geography - color-coded countries by value (choropleth) |
125
+ | `render_bubble_map` | Bubble Map | Pin map - sized circles at lat/lng coordinates |
126
+ | `render_timeline_chart` | Timeline | Progress - milestone tracker with status indicators |
127
+ | `render_flowchart` | Flowchart | Workflows, pipelines, architectures, agent flows - rich card-based DAG with status states, drag, zoom, live polling |
128
+ | `render_hero_metric` | Hero | KPI widgets - 11 variants (progress ring, gem, orb, NPS, etc.) |
129
+ | `render_dashboard` | Dashboard | Everything - KPI cards + multiple charts in responsive grid |
130
+ | `render_table` | Table | Data - sortable columns, striped rows, CSV export |
131
+ | `render_from_json` | Auto-detect | Any JSON data - picks the best chart automatically |
132
+ | `render_from_url` | URL fetch | Fetches JSON from a URL and auto-visualizes |
133
+
134
+ **Discovery / Catalogs** - visual entry points for browsing what's available:
135
+
136
+ | Tool | Shows | When to use |
137
+ |------|-------|-------------|
138
+ | `render_catalog` | Master catalog with 4 live preview tiles | Don't know where to start. Click any tile, hit Ask, drill in. |
139
+ | `render_chart_catalog` | All 32 chart types with mini previews | Looking for the right chart for your data |
140
+ | `render_theme_catalog` | All 21 themes with color/typography/effects | Picking a theme |
141
+ | `render_hero_catalog` | All 11 hero metric variants | Picking a KPI widget style |
142
+ | `render_effects_catalog` | All 5 effect presets, each applied to a real card | Picking an animation/glow style |
143
+
144
+ Typography is still configurable on every chart via `typography=<name>` (8 options listed under [Themes](#themes)) - it just doesn't have its own catalog because all 8 options were visually identical without per-card font loading, which wasn't worth the build for one preview tool.
145
+
146
+ </details>
147
+
148
+ <details>
149
+ <summary><strong>Which chart should I use?</strong></summary>
150
+
151
+ | Question | Best Chart | Also Works |
152
+ |----------|-----------|------------|
153
+ | "What makes up the whole?" | Pie/Waffle | Treemap, Stacked bar |
154
+ | "How do values compare?" | Bar | Lollipop, Bullet, Radar |
155
+ | "What's the trend over time?" | Line | Sparkline, Slope |
156
+ | "Are we hitting targets?" | Bullet | Variance, Radial |
157
+ | "Where's the gap?" | Dumbbell | Variance |
158
+ | "How does X relate to Y?" | Scatter | Heatmap |
159
+ | "What's the conversion rate?" | Funnel | Waterfall, Sankey |
160
+ | "What changed between periods?" | Slope | Dumbbell |
161
+ | "What's the financial picture?" | Candlestick | Line |
162
+ | "Show me the KPI" | Hero metric | Dashboard |
163
+ | "What's the distribution?" | Boxplot | Violin (same tool) |
164
+ | "Where does money/traffic flow?" | Sankey | Treemap |
165
+ | "How do options score across axes?" | Radar | Heatmap |
166
+ | "What are the top keywords?" | Word Cloud | Bar, Treemap |
167
+ | "Where are users/sales/revenue?" | Geo map | Bubble map, Heatmap |
168
+ | "Monitor this in real-time" | Live chart | - |
169
+
170
+ </details>
171
+
172
+ ## Themes
173
+
174
+ 21 built-in themes. Pass `theme` to any tool.
175
+
176
+ | Family | Themes |
177
+ |--------|--------|
178
+ | **Classic** | `boardroom`, `corporate`, `sales-floor`, `golden-treasury`, `clinical`, `startup`, `ops-control`, `tokyo-midnight`, `zen-garden`, `consultant` |
179
+ | **Black/AI** | `black-tron` (cyan neon), `black-elegance` (warm gold), `black-matrix` (green hacker) |
180
+ | **Forest** | `forest-amber` (autumn), `forest-earth` (terracotta) |
181
+ | **Sky** | `sky-light` (airy blue), `sky-ocean` (deep navy), `sky-twilight` (sunset) |
182
+ | **Office** | `office-red` (corporate red, white bg - report-ready) |
183
+ | **Gray/ML** | `gray-hf` (warm yellow accent), `gray-copilot` (teal on dark) |
184
+
185
+ Mix-and-match with `palette`, `typography` (8 options: system, mono, professional, editorial, bold, techno, cyberpunk, luxury), and `effects` (5 presets: none, subtle, shimmer, neon, energetic).
186
+
187
+ ## Live Polling
188
+
189
+ Real-time charts that auto-update from any API. The live chart polls data via `poll_http`, which supports two modes:
190
+
191
+ ### Secure presets (authenticated APIs)
192
+
193
+ Configure presets via env vars. Credentials stay server-side and never appear in the conversation.
194
+
195
+ ```json
196
+ {
197
+ "mcpServers": {
198
+ "dashboard": {
199
+ "command": "npx",
200
+ "args": ["-y", "mcp-dashboards", "--stdio"],
201
+ "env": {
202
+ "POLL_PRESET_T212_CASH_URL": "https://live.trading212.com/api/v0/equity/account/cash",
203
+ "POLL_PRESET_T212_CASH_HEADERS": "{\"Authorization\": \"Bearer YOUR_API_KEY\"}"
204
+ }
205
+ }
206
+ }
207
+ }
208
+ ```
209
+
210
+ Then ask: *"Monitor my portfolio total and P/L live"* - the AI uses `render_live_chart` with `pollArgs: { preset: "t212_cash" }`.
211
+
212
+ **Naming:** `POLL_PRESET_<NAME>_URL` and `POLL_PRESET_<NAME>_HEADERS` (JSON object).
213
+
214
+ ### Public URLs (no auth needed)
215
+
216
+ For public APIs, use the URL directly:
217
+
218
+ *"Show me Bitcoin price updating every 30 seconds"* - uses `pollArgs: { url: "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd" }`.
219
+
220
+ ## How It Works
221
+
222
+ Built on [MCP Apps](https://modelcontextprotocol.io/docs/extensions/apps). You ask the AI to visualize data, it calls the right tool, and the chart renders inline in your conversation. Self-contained - zero CDN, zero external requests.
223
+
224
+ **MCP Apps supported** (inline rendering): Claude Desktop, VS Code Insiders + MCP Apps extension, Goose, Postman.
225
+
226
+ **No MCP Apps support?** No problem. Every chart response also includes a clickable link to the same interactive chart in your browser:
227
+ - `http://localhost:PORT/chart/{id}` - the clickable link in chat. Backed by a tiny same-machine HTTP server bound to 127.0.0.1, lazy-started on the first preview request.
228
+ - `file:///.../chart-{id}.html` - the persistent shareable artifact. Same HTML bytes, written to disk so you can email, archive, or open it after the server has shut down.
229
+
230
+ Why both: Claude Code (VS Code) strips `file://`, `vscode://`, and `command://` URL schemes from chat markdown, so only `http://` produces a working clickable link. The file:// path is provided for sharing and offline viewing. Tool annotations (`readOnlyHint`, `idempotentHint`, `openWorldHint`) help clients reason about tool behavior.
231
+
232
+ ## Configuration
233
+
234
+ All optional. Defaults are safe - set these only if you need to override.
235
+
236
+ | Env var | Default | What it does |
237
+ |---------|---------|--------------|
238
+ | `MCP_DASHBOARDS_RETAIN_DAYS` | `7` | How long to keep chart preview HTML files on disk. `0` disables auto-cleanup. |
239
+ | `MCP_DASHBOARDS_DISABLE_PREVIEW` | unset | Kill switch - no HTML files written, no preview server started, no preview links. Inline rendering still works in MCP Apps clients. |
240
+ | `MCP_HTTP_BIND_HOST` | `127.0.0.1` | HTTP-transport bind host. Stays on localhost by default. Set to `0.0.0.0` only if you trust your network. |
241
+ | `MCP_CORS_ALLOWED_ORIGINS` | localhost only | Comma-separated origins allowed to call the HTTP endpoint from a browser. Set this to add a non-localhost origin (e.g. `https://your-app.com`). |
242
+ | `MCP_URL_ALLOWLIST` | empty | Comma-separated hostnames that bypass the SSRF guard for `render_from_url` / `poll_http`. Use only for internal endpoints you fully trust. |
243
+ | `MCP_OUTBOUND_RATE_PER_SEC` | `10` | Per-host throttle for outbound HTTP calls. |
244
+ | `MCP_OUTBOUND_BURST` | `20` | How many initial requests can fire immediately before the rate kicks in. |
245
+ | `POLL_PRESET_<NAME>_URL` | - | Server-side preset URL for live polling. See [Live Polling](#live-polling). |
246
+ | `POLL_PRESET_<NAME>_HEADERS` | - | Auth headers (JSON object) for the matching preset URL. |
247
+
248
+ ### What's on disk
249
+
250
+ Chart HTML files are written to `<system temp>/mcp-dashboards/` and auto-deleted after 7 days. The chart's built-in download button (PNG / PPT / A4) is the recommended way to save anything permanently.
251
+
252
+ Ask your AI to *"list chart files"* or *"delete chart files older than 1 day"* anytime - invokes `list_chart_files` / `delete_chart_files`.
253
+
254
+ **Requirements:** Node.js 18+.
255
+
256
+ <details>
257
+ <summary><strong>Contributing</strong></summary>
258
+
259
+ ```bash
260
+ git clone https://github.com/KyuRish/mcp-dashboards.git
261
+ cd mcp-dashboards
262
+ npm install
263
+ npm run build
264
+ npm run serve # http://localhost:3001
265
+ npm run dev # watch mode
266
+ ```
267
+
268
+ </details>
269
+
270
+ ## Support
271
+
272
+ If MCP Dashboards is useful to you:
273
+
274
+ [![Buy Me A Coffee](https://img.shields.io/badge/Buy%20Me%20A%20Coffee-support-yellow?logo=buy-me-a-coffee&logoColor=white)](https://buymeacoffee.com/kyuish)
275
+ [![GitHub Sponsors](https://img.shields.io/badge/Sponsor-GitHub-ea4aaa?logo=github)](https://github.com/sponsors/KyuRish)
276
+
277
+ ## Privacy
278
+
279
+ All processing happens locally. No data is collected, transmitted, or stored externally.
280
+
281
+ External calls only happen when *you* explicitly ask - `render_from_url` and `poll_http` need a URL or preset you provide. Both refuse to fetch private, loopback, or link-local addresses (your `192.168.*` network, AWS metadata at `169.254.169.254`, etc.) so a prompt-injected AI can't quietly reach internal services. They also throttle per hostname so a runaway loop won't get your IP banned from a real API.
282
+
283
+ Credentials in env var presets never leave your machine. The browser preview server and the optional HTTP transport both bind to `127.0.0.1` by default and are not reachable from other devices. Chart HTML files live in your system temp folder and auto-delete after 7 days. See [Configuration](#configuration) to change any of this.
284
+
285
+ ## License
286
+
287
+ [FSL-1.1-MIT](LICENSE) - Free to use for any purpose except building a competing commercial product. Each version converts to MIT two years after release. For commercial licensing, contact [contact@kyuish.com](mailto:contact@kyuish.com).
288
+
289
+ ### Third-party software
290
+
291
+ The bundled UI artifact (`dist/mcp-app.html`) embeds open-source libraries from the Chart.js, html2canvas-pro, Luxon, TopoJSON, and Dagre projects, distributed under MIT or ISC licenses. Full attribution and license texts are reproduced in [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md).