MCP server for interactive data visualisation — bar, pie, line, doughnut, radar, polar, and area charts
Project description
Chuk MCP Chart
Interactive data visualisation via MCP — paste a CSV, describe your data, ask for a chart. Bar, pie, line, doughnut, radar, polar, and area charts rendered instantly.
This is a demonstration project provided as-is for learning and testing purposes.
Features
Three tools that turn raw data into beautiful charts:
1. Show Chart (show_chart)
Create a chart from explicit data. Provide labels, one or more datasets, and optional configuration:
- Chart types: bar, line, pie, doughnut, radar, polar, area
- Axis labels, legend position, stacked mode
- Custom colours per dataset
- Auto-assigned colour-blind-friendly palette
2. Chart from CSV (chart_from_csv)
Paste raw CSV text and get a chart — zero configuration required:
- First non-numeric column becomes category labels
- Every numeric column becomes a dataset (series)
- If all columns are numeric, row numbers are used as labels
- Perfect for spreadsheet data
3. Chart from JSON (chart_from_json)
Pass a JSON array of objects and get a chart automatically:
- First string field becomes category labels
- Every numeric field becomes a dataset
- Great for API responses or structured data
Installation
Using uvx (Recommended - No Installation Required!)
uvx chuk-mcp-chart
This automatically downloads and runs the latest version. Perfect for Claude Desktop!
Using uv (Recommended for Development)
# Install from PyPI
uv pip install chuk-mcp-chart
# Or clone and install from source
git clone https://github.com/chrishayuk/chuk-mcp-chart.git
cd chuk-mcp-chart
uv sync --dev
Using pip (Traditional)
pip install chuk-mcp-chart
Usage
With Claude Desktop
Option 1: Use the Public Server (Easiest)
Connect to the hosted public server at chart.chukai.io:
MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%/Claude/claude_desktop_config.json
{
"mcpServers": {
"chart": {
"url": "https://chart.chukai.io/mcp"
}
}
}
Option 2: Run Locally with uvx
{
"mcpServers": {
"chart": {
"command": "uvx",
"args": ["chuk-mcp-chart"]
}
}
}
Option 3: Run Locally with pip
{
"mcpServers": {
"chart": {
"command": "chuk-mcp-chart"
}
}
}
Standalone
# With uvx (recommended - always latest version)
uvx chuk-mcp-chart
# With uvx in HTTP mode
uvx chuk-mcp-chart http
# Or if installed locally
chuk-mcp-chart
chuk-mcp-chart http
Or with uv/Python:
# STDIO mode (default, for MCP clients)
uv run chuk-mcp-chart
# or: python -m chuk_mcp_chart.server
# HTTP mode (for web access)
uv run chuk-mcp-chart http
# or: python -m chuk_mcp_chart.server http
STDIO mode is for MCP clients like Claude Desktop and mcp-cli. HTTP mode runs a web server on http://localhost:8000 for HTTP-based MCP clients.
Example Prompts
Once configured, try asking:
- "Chart my monthly expenses" (then paste your data)
- "Show Python vs JavaScript popularity as a pie chart"
- "Turn this CSV into a line chart showing trends over time"
- "Create a bar chart of Q1-Q4 revenue: 42000, 51000, 48000, 55000"
- "Show a radar chart comparing three products across speed, quality, and price"
- "Make a doughnut chart of browser market share"
Tool Reference
show_chart
Create a chart from explicit labels and datasets.
Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
chart_type |
string | "bar" |
One of: bar, line, pie, doughnut, radar, polar, area |
title |
string | "Chart" |
Chart title |
labels |
string | — | Comma-separated category labels (e.g. "Jan,Feb,Mar") |
datasets |
string | — | JSON array of dataset objects (see below) |
x_axis_label |
string | — | X axis label |
y_axis_label |
string | — | Y axis label |
legend_position |
string | — | Legend position: top, bottom, left, right, none |
stacked |
bool | false |
Stack bar/area datasets |
Dataset format (JSON string):
[
{"label": "Revenue", "values": [12, 19, 3, 5, 2, 3]},
{"label": "Expenses", "values": [8, 14, 2, 4, 1, 2], "color": "#ef4444"}
]
chart_from_csv
Parse CSV text into a chart automatically.
Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
csv_data |
string | — | Raw CSV text with header row |
chart_type |
string | "bar" |
Chart type |
title |
string | "Chart" |
Chart title |
Example input:
Month,Revenue,Expenses
Jan,4200,3800
Feb,5100,4200
Mar,4800,4100
chart_from_json
Parse a JSON array into a chart automatically.
Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
json_data |
string | — | JSON array of objects |
chart_type |
string | "bar" |
Chart type |
title |
string | "Chart" |
Chart title |
Example input:
[
{"language": "Python", "popularity": 28.1},
{"language": "JavaScript", "popularity": 21.3},
{"language": "TypeScript", "popularity": 12.7}
]
Development
Setup
# Clone the repository
git clone https://github.com/chrishayuk/chuk-mcp-chart.git
cd chuk-mcp-chart
# Install with uv (recommended)
uv sync --dev
# Or with pip
pip install -e ".[dev]"
Running Tests
make test # Run tests
make test-cov # Run tests with coverage
make coverage-report # Show coverage report
Code Quality
make lint # Run linters
make format # Auto-format code
make typecheck # Run type checking
make security # Run security checks
make check # Run all checks
Building
make build # Build package
make docker-build # Build Docker image
Deployment
Fly.io
Deploy to Fly.io with a single command:
# First time setup
fly launch
# Deploy updates
fly deploy
The server will be available via HTTP at your Fly.io URL.
Docker
# Build the image
docker build -t chuk-mcp-chart .
# Run the container
docker run -p 8000:8000 chuk-mcp-chart
Architecture
Built on top of chuk-mcp-server with chart rendering via chuk-view-schemas:
- Decorator-driven: Tools defined with
@chart_tool— handles view metadata, structured content, and text fallback automatically - Type-safe: All chart data uses Pydantic v2 models (
ChartContent,ChartDataset,AxisConfig,LegendConfig) - Smart parsing: CSV and JSON tools auto-detect labels vs data columns
- Async native: All tools are async for optimal performance
- Dual transport: STDIO for MCP clients, HTTP for web access
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
License
Apache License 2.0 - See LICENSE file for details.
Acknowledgments
- Chart.js for the chart rendering engine
- chuk-mcp-server for the MCP framework
- Model Context Protocol for the MCP specification
- Anthropic for Claude and MCP support
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chuk_mcp_chart-1.0.9.tar.gz.
File metadata
- Download URL: chuk_mcp_chart-1.0.9.tar.gz
- Upload date:
- Size: 15.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
08553bc47c7b75d372f272b83213686a775f19eab8e710888f8704ba6e4a1dca
|
|
| MD5 |
49b6964c56cf6ebd495497603023d015
|
|
| BLAKE2b-256 |
03338ed1446795106ae1b9005010a2fdfbecc5924498c85bb48370c9c7f9ad1c
|
File details
Details for the file chuk_mcp_chart-1.0.9-py3-none-any.whl.
File metadata
- Download URL: chuk_mcp_chart-1.0.9-py3-none-any.whl
- Upload date:
- Size: 10.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.12.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
572e6bfed8726a266b64b23c2fa6a736f4fcf403a06801a522377053ca43a2bb
|
|
| MD5 |
7a7ea14e35f1be8b7bbb7e3935876ea3
|
|
| BLAKE2b-256 |
f02fd22bf970628e91f40ff8666fae3cb99b5efcb9a3b46371473fc724e8bedf
|