A Model Context Protocol (MCP) server for data visualization. It exposes tools to render charts (line, bar, pie, scatter, heatmap, etc.) from data and returns the plot as image/base64 text/mermaid diagram.
Why MCP Plots?
- Instant, visual-first charts using Mermaid (renders directly in MCP clients like Cursor)
- Simple prompts to generate charts from plain data
- Zero-setup options via uvx, or install from PyPI/Docker
- Flexible output formats: mermaid (default), PNG image, or text
Quick Usage
- Ask your MCP client: "Create a bar chart showing sales: A=100, B=150, C=80"
- Default output is Mermaid, so diagrams render instantly in Cursor
Quick Start
PyPI Installation (Recommended)
pip install mcp-plots
mcp-plots # Start the server
For Cursor Users
- Install the package:
pip install mcp-plots
- Add to your Cursor MCP config (
~/.cursor/mcp.json):
{
"mcpServers": {
"plots": {
"command": "mcp-plots",
"args": ["--transport", "stdio"]
}
}
}
Alternative (zero-install via uvx + PyPI):
{
"mcpServers": {
"plots": {
"command": "uvx",
"args": ["mcp-plots", "--transport", "stdio"]
}
}
}
- Restart Cursor
- Ask: "Create a bar chart showing sales: A=100, B=150, C=80"
Development Installation
uvx --from git+https://github.com/mr901/mcp-plots.git run-server.py
Documentation โ | Quick Start โ | API Reference โ
MCP Registry
This server is published under the MCP registry identifier io.github.MR901/mcp-plots. You can discover/verify it via the official registry API:
curl "https://registry.modelcontextprotocol.io/v0/servers?search=io.github.MR901/mcp-plots"
Registry metadata for this project is tracked in server.json.
Install with Smithery
This repository includes a smithery.yaml for easy setup with Smithery.
Example install using the Smithery CLI (adjust --client as needed, e.g. cursor, claude):
npx -y @smithery/cli install \
https://raw.githubusercontent.com/mr901/mcp-plots/main/smithery.yaml \
--client cursor
After installation, your MCP client should be able to start the server over stdio using the command defined in smithery.yaml.
Project layout
src/
app/ # Server construction and runtime
server.py
capabilities/ # MCP tools and prompts
tools.py
prompts.py
visualization/ # Plotting engines and configurations
chart_config.py
generator.py
Requirements
- Python 3.10+
- See
requirements.txt
Setup Routes
uvx (Recommended)
The easiest way to run the MCP server without managing Python environments:
# Run directly with uvx (no installation needed)
uvx --from git+https://github.com/mr901/mcp-plots.git run-server.py
# Or install and run the command
uvx --from git+https://github.com/mr901/mcp-plots.git mcp-plots
# With custom options
uvx --from git+https://github.com/mr901/mcp-plots.git mcp-plots --port 8080 --log-level DEBUG
Why uvx?
- No Environment Management: Automatically handles Python dependencies
- Isolated Execution: Runs in its own virtual environment
- Always Latest: Pulls fresh code from repository
- Zero Setup: Works immediately without pip install
- Cross-Platform: Same command works on Windows, macOS, Linux
PyPI (Traditional Installation)
- Install dependencies
pip install -r requirements.txt
- Run the server (HTTP transport, default port 8000)
python -m src --transport streamable-http --host 0.0.0.0 --port 8000 --log-level INFO
- Run with stdio (for MCP clients that spawn processes)
python -m src --transport stdio
Local Development (from source)
git clone https://github.com/mr901/mcp-plots.git
cd mcp-plots
pip install -e .
python -m src --transport stdio --log-level DEBUG
Docker
docker build -t mcp-plots .
docker run -p 8000:8000 mcp-plots
Environment variables (optional):
MCP_TRANSPORT (streamable-http|stdio)
MCP_HOST (default 0.0.0.0)
MCP_PORT (default 8000)
LOG_LEVEL (default INFO)
Tools
list_chart_types() โ returns available chart types
list_themes() โ returns available themes
suggest_fields(sample_rows) โ suggests field roles based on data samples
render_chart(chart_type, data, field_map, config_overrides?, options?, output_format?) โ returns MCP content
generate_test_image() โ generates a test image (red circle) to verify MCP image support
Cursor Integration
This MCP server is fully compatible with Cursor's image support! When you use the render_chart tool:
- Charts appear directly in chat - No need to save files or open separate windows
- AI can analyze your charts - Vision-enabled models can discuss and interpret your visualizations
- Perfect MCP format - Uses the exact base64 PNG format that Cursor expects
The server returns images in the MCP format Cursor requires:
{
"content": [
{
"type": "image",
"data": "<base64-encoded-png>",
"mimeType": "image/png"
}
]
}
Example call (pseudo):
render_chart(
chart_type="bar",
data=[{"category":"A","value":10},{"category":"B","value":20}],
field_map={"category_field":"category","value_field":"value"},
config_overrides={"title":"Example Bar","width":800,"height":600,"output_format":"MCP_IMAGE"}
)
Return shape (PNG):
{
"status": "success",
"content": [{"type":"image","data":"<base64>","mimeType":"image/png"}]
}
Configuration
The server can be configured via environment variables or command line arguments:
Server Settings
MCP_TRANSPORT - Transport type: streamable-http or stdio (default: streamable-http)
MCP_HOST - Host address (default: 0.0.0.0)
MCP_PORT - Port number (default: 8000)
LOG_LEVEL - Logging level: DEBUG, INFO, WARNING, ERROR, CRITICAL (default: INFO)
MCP_DEBUG - Enable debug mode: true or false (default: false)
Chart Settings
CHART_DEFAULT_WIDTH - Default chart width in pixels (default: 800)
CHART_DEFAULT_HEIGHT - Default chart height in pixels (default: 600)
CHART_DEFAULT_DPI - Default chart DPI (default: 100)
CHART_MAX_DATA_POINTS - Maximum data points per chart (default: 10000)
Command Line Usage
With uvx (recommended):
uvx --from git+https://github.com/mr901/mcp-plots.git mcp-plots --help
# Examples:
uvx --from git+https://github.com/mr901/mcp-plots.git mcp-plots --port 8080 --log-level DEBUG
uvx --from git+https://github.com/mr901/mcp-plots.git mcp-plots --chart-width 1200 --chart-height 800
Traditional Python:
python -m src --help
# Examples:
python -m src --transport streamable-http --host 0.0.0.0 --port 8000
python -m src --log-level DEBUG --chart-width 1200 --chart-height 800
Docker
Build image:
docker build -t mcp-plots .
Run container with custom configuration:
docker run --rm -p 8000:8000 \
-e MCP_TRANSPORT=streamable-http \
-e MCP_HOST=0.0.0.0 \
-e MCP_PORT=8000 \
-e LOG_LEVEL=INFO \
-e CHART_DEFAULT_WIDTH=1000 \
-e CHART_DEFAULT_HEIGHT=700 \
-e CHART_DEFAULT_DPI=150 \
-e CHART_MAX_DATA_POINTS=5000 \
mcp-plots
Cursor MCP Integration
Quick Setup for Cursor
The Plots MCP Server is designed to work seamlessly with Cursor's MCP support. Here's how to integrate it:
1. Add to Cursor's MCP Configuration
Add this to your Cursor MCP configuration file (~/.cursor/mcp.json or similar):
{
"mcpServers": {
"plots": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/mr901/mcp-plots.git@main",
"mcp-plots",
"--transport",
"stdio"
],
"env": {
"LOG_LEVEL": "INFO",
"CHART_DEFAULT_WIDTH": "800",
"CHART_DEFAULT_HEIGHT": "600"
}
}
}
}
2. Alternative: HTTP Transport
For HTTP-based integration:
{
"mcpServers": {
"plots-http": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/mr901/mcp-plots.git@main",
"mcp-plots",
"--transport",
"streamable-http",
"--host",
"127.0.0.1",
"--port",
"8000"
]
}
}
}
3. Local Development Setup
For local development (if you have the code cloned):
{
"mcpServers": {
"plots-dev": {
"command": "python",
"args": ["-m", "src", "--transport", "stdio"],
"cwd": "/path/to/mcp-plots",
"env": {
"LOG_LEVEL": "DEBUG"
}
}
}
}
4. Verify Integration