@dotzero.ai/export-mcp
v1.2.4
Published
MCP server for chart generation and data export - PNG/JPG charts, CSV/XLSX exports
Maintainers
Readme
@dotzero.ai/export-mcp
MCP server for chart generation and data export — PNG/JPG charts, CSV/XLSX files.
Overview
A pure rendering engine that generates charts and exports data files. No authentication required, no external API calls. Designed to work alongside other DotZero MCP servers: fetch data with existing tools, then visualize or export with this package.
Architecture: User → AI Agent → 1. Fetch data (existing MCP tools) → 2. Render/Export (export-mcp)
Installation
npx @dotzero.ai/setupOr manually:
claude mcp add dotzero-export --command "npx" --args "@dotzero.ai/export-mcp"Tools (14)
Generic Charts (5)
| Tool | Description | Key Parameters |
|------|-------------|----------------|
| chart_bar | Bar chart (vertical/horizontal/stacked) | title, labels[], datasets[], options? |
| chart_line | Line chart (multi-series, area fill) | title, labels[], datasets[], options? |
| chart_pie | Pie or doughnut chart | title, labels[], values[], chart_type? |
| chart_scatter | Scatter plot | title, datasets[{data: [{x,y}]}] |
| chart_gauge | Gauge/dial for single KPI | value, label?, min?, max?, thresholds? |
DotZero-Specific Charts (4)
| Tool | Description | Data Source |
|------|-------------|-------------|
| chart_oee_breakdown | OEE A/Q/P breakdown chart | oee_device, oee_devices, oee_line, oee_factory |
| chart_control | SPC control chart (UCL/CL/LCL) | spc_measure_history_* + spc_statistics_capability |
| chart_timeline | Device state timeline | equip_machine_status_history |
| chart_multi | Multi-chart dashboard (max 9) | Multiple chart configs |
Export (2)
| Tool | Description | Key Parameters |
|------|-------------|----------------|
| export_csv | Export to CSV file | headers[], rows[][], filename? |
| export_xlsx | Export to Excel XLSX (multi-sheet) | sheets[{name, headers, rows}], filename? |
Smart Tools (2)
| Tool | Description |
|------|-------------|
| chart_from_json | Auto-detect JSON data shape and pick best chart type |
| export_table_from_json | Auto-convert JSON to CSV/XLSX (extracts headers from keys) |
Shared Parameters
All chart tools share these base parameters:
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| output_path | string | auto | Custom output file path |
| width | int | 800 | Image width in pixels (200-3000) |
| height | int | 500 | Image height in pixels (200-3000) |
| format | enum | "png" | "png" or "jpg" |
All export tools share:
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| output_path | string | auto | Custom output file path |
| filename | string | auto | Output filename (without extension) |
Chart Options
Bar, line, and scatter charts accept an options object:
| Option | Type | Default | Description |
|--------|------|---------|-------------|
| stacked | boolean | false | Enable stacking |
| horizontal | boolean | false | Horizontal orientation (bar charts only) |
| show_legend | boolean | true | Show legend |
| show_grid | boolean | true | Show grid lines |
| x_label | string | - | X-axis label |
| y_label | string | - | Y-axis label |
| min_y | number | - | Y-axis minimum |
| max_y | number | - | Y-axis maximum |
Tool Reference
chart_bar
chart_bar(
title: "Production by Line",
labels: ["Line A", "Line B", "Line C"],
datasets: [
{ label: "Good", data: [1200, 980, 1150] },
{ label: "Defect", data: [23, 15, 31] }
],
options: { stacked: true, y_label: "Quantity" }
)chart_line
chart_line(
title: "Weekly Production Trend",
labels: ["Mon", "Tue", "Wed", "Thu", "Fri"],
datasets: [
{ label: "Output", data: [450, 520, 480, 510, 530], fill: true }
],
options: { y_label: "Units" }
)chart_pie
chart_pie(
title: "Defect Distribution",
labels: ["Scratch", "Dent", "Crack", "Other"],
values: [45, 28, 15, 12],
chart_type: "doughnut"
)chart_scatter
chart_scatter(
title: "Cycle Time vs Output",
datasets: [{
label: "Devices",
data: [
{ x: 30, y: 120 },
{ x: 45, y: 95 },
{ x: 25, y: 140 }
]
}],
options: { x_label: "Cycle Time (s)", y_label: "Output" }
)chart_gauge
chart_gauge(
value: 85.2,
label: "OEE",
min: 0,
max: 100,
thresholds: [
{ value: 60, color: "#F44336" },
{ value: 80, color: "#FFC107" },
{ value: 100, color: "#4CAF50" }
]
)chart_oee_breakdown
Single device:
chart_oee_breakdown(
title: "CNC-001 OEE",
availability: 92.5,
quality: 98.1,
performance: 87.3
)Multi-device comparison:
chart_oee_breakdown(
title: "Line A OEE Comparison",
availability: 0, quality: 0, performance: 0,
devices: [
{ name: "CNC-001", availability: 92.5, quality: 98.1, performance: 87.3 },
{ name: "CNC-002", availability: 88.0, quality: 96.5, performance: 91.2 },
{ name: "CNC-003", availability: 95.1, quality: 97.8, performance: 84.6 }
]
)chart_control
chart_control(
title: "Diameter Control Chart",
values: [10.02, 10.05, 9.98, 10.01, 10.12, 9.95, 10.03, 10.08],
labels: ["S1", "S2", "S3", "S4", "S5", "S6", "S7", "S8"],
ucl: 10.10,
cl: 10.00,
lcl: 9.90,
usl: 10.15,
lsl: 9.85
)Points exceeding UCL/LCL are highlighted in red. USL/LSL specification limits are shown as orange dashed lines.
chart_timeline
chart_timeline(
title: "CNC-001 State History",
device_name: "CNC-001",
segments: [
{ start: "2026-02-08T08:00:00Z", end: "2026-02-08T10:30:00Z", state: "running" },
{ start: "2026-02-08T10:30:00Z", end: "2026-02-08T11:00:00Z", state: "idle" },
{ start: "2026-02-08T11:00:00Z", end: "2026-02-08T11:45:00Z", state: "down" },
{ start: "2026-02-08T11:45:00Z", end: "2026-02-08T17:00:00Z", state: "running" }
]
)Default state colors: running=green, idle=yellow, down=red, off=grey. Override with the color field per segment.
chart_multi
chart_multi(
title: "Production Dashboard",
layout: "grid",
charts: [
{
type: "bar",
title: "Output by Line",
labels: ["Line A", "Line B"],
datasets: [{ label: "Output", data: [1200, 980] }]
},
{
type: "gauge",
title: "OEE",
value: 85.2,
label: "OEE"
},
{
type: "pie",
title: "Defects",
labels: ["Scratch", "Dent"],
values: [65, 35]
}
]
)Layout options: grid (auto rows/cols), vertical (1 column), horizontal (1 row). Max 9 sub-charts.
export_csv
export_csv(
headers: ["Work Order", "Product", "Qty", "Status"],
rows: [
["WO-001", "Widget A", 100, "Completed"],
["WO-002", "Widget B", 250, "In Progress"],
["WO-003", "Widget A", 75, "Not Started"]
],
filename: "work-orders"
)export_xlsx
export_xlsx(
sheets: [
{
name: "Work Orders",
headers: ["ID", "Product", "Qty", "Status"],
rows: [
["WO-001", "Widget A", 100, "Completed"],
["WO-002", "Widget B", 250, "In Progress"]
]
},
{
name: "Summary",
headers: ["Metric", "Value"],
rows: [
["Total Orders", 2],
["Total Qty", 350]
]
}
],
filename: "production-report"
)Headers are bold, column widths are auto-fit.
chart_from_json
chart_from_json(
title: "Auto Chart",
data: <raw JSON from any DotZero tool>,
chart_type: "auto"
)Auto-detection rules:
- Objects with
availability/quality/performancefields → OEE breakdown chart - Array of OEE objects → Multi-device OEE comparison
- Single number → Gauge chart
- Array of objects with name + numeric fields → Bar chart
- Force
chart_typeto override:"bar","line","pie","gauge","oee"
export_table_from_json
export_table_from_json(
data: <raw JSON from any DotZero tool>,
format: "xlsx",
filename: "export",
sheet_name: "Data"
)Accepts arrays of objects, single objects, or paginated responses ({ data: [...] }). Automatically extracts column headers from object keys.
Workflow Examples
1. OEE Breakdown Chart (OEE 分解圖)
Step 1: oee_device(device_uuid: "...", start_time: "...", end_time: "...", response_format: "json")
Step 2: chart_oee_breakdown(title: "CNC-001 OEE", availability: 92.5, quality: 98.1, performance: 87.3)Or use the smart tool:
Step 1: oee_devices(line_uuid: "...", response_format: "json")
Step 2: chart_from_json(title: "Line A OEE", data: <result from step 1>)2. SPC Control Chart (SPC 管制圖)
Step 1: spc_measure_history_manufacture(config_uuid: "...", response_format: "json")
Step 2: spc_statistics_capability(config_uuid: "...", response_format: "json")
Step 3: chart_control(
title: "Diameter Control",
values: [extracted from step 1],
ucl: [from step 2],
cl: [from step 2],
lcl: [from step 2]
)3. Production Report Excel Export (生產報表匯出)
Step 1: workorder_list(status: 3, response_format: "json")
Step 2: export_table_from_json(data: <result>, format: "xlsx", filename: "completed-orders")Or with custom formatting:
Step 1: production_summary(response_format: "json")
Step 2: export_xlsx(
sheets: [
{ name: "Summary", headers: [...], rows: [...] },
{ name: "Details", headers: [...], rows: [...] }
],
filename: "production-report"
)4. Worker Efficiency Ranking (作業員效率排名)
Step 1: worker_efficiency_ranking(response_format: "json")
Step 2: chart_bar(
title: "Worker Efficiency",
labels: [worker names],
datasets: [{ label: "Efficiency %", data: [values] }],
options: { horizontal: true, y_label: "Worker" }
)5. Device State Distribution (設備狀態分佈)
Step 1: equip_state_counts_factory(factory_uuid: "...", response_format: "json")
Step 2: chart_pie(
title: "Device States",
labels: ["Running", "Idle", "Down", "Off"],
values: [running_count, idle_count, down_count, off_count],
colors: ["#4CAF50", "#FFC107", "#F44336", "#9E9E9E"]
)6. Multi-Chart Dashboard (多圖表儀表板)
Step 1: Fetch OEE, production summary, and defect data
Step 2: chart_multi(
title: "Daily Dashboard",
layout: "grid",
charts: [
{ type: "gauge", title: "OEE", value: 85.2, label: "OEE" },
{ type: "bar", title: "Output", labels: [...], datasets: [...] },
{ type: "pie", title: "Defects", labels: [...], values: [...] },
{ type: "line", title: "Trend", labels: [...], datasets: [...] }
]
)File Output
- Default path:
.dotzero/exports/<type>-<name>-<timestamp>.<ext> .dotzero/is in.gitignore— files won't be committed- Override with
output_pathparameter on any tool
Output Format
Chart tools return:
{
"content": [
{ "type": "text", "text": "Chart saved to: .dotzero/exports/chart-bar-2026-02-08T14-30-00.png (800x500)" },
{ "type": "image", "data": "<base64>", "mimeType": "image/png" }
]
}Export tools return:
{
"content": [
{ "type": "text", "text": "Exported 42 rows to: .dotzero/exports/export-2026-02-08.csv\n\nPreview (first 5 rows):\n| Col1 | Col2 |\n|---|---|\n| ... | ... |" }
]
}DotZero Color Palette
| Name | Color | Hex | Usage |
|------|-------|-----|-------|
| availability | Green | #4CAF50 | OEE Availability |
| quality | Blue | #2196F3 | OEE Quality |
| performance | Orange | #FF9800 | OEE Performance |
| oee | Purple | #9C27B0 | Combined OEE |
| good/running | Green | #4CAF50 | Good parts, running state |
| defect/down | Red | #F44336 | Defects, down state |
| idle | Yellow | #FFC107 | Idle state |
| off | Grey | #9E9E9E | Off state |
Dependencies
| Library | Purpose |
|---------|---------|
| chartjs-node-canvas + chart.js v4 | Server-side chart rendering |
| @napi-rs/canvas | Native canvas backend (no cairo/pango) |
| chartjs-plugin-annotation | UCL/CL/LCL horizontal lines |
| exceljs | Excel XLSX generation |
| zod | Input schema validation |
Build
cd packages/export-mcp
pnpm install
pnpm buildLicense
MIT
