npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@dotzero.ai/export-mcp

v1.2.4

Published

MCP server for chart generation and data export - PNG/JPG charts, CSV/XLSX exports

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/setup

Or 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/performance fields → 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_type to 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_path parameter 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 build

License

MIT