Plotly Server
Overview
The Plotly MCP Server provides advanced data visualization capabilities using Plotly for creating interactive charts and graphs. It supports multiple chart types, interactive HTML output, static export options, and flexible data input formats. The server is powered by FastMCP for enhanced type safety and automatic validation.
Key Features
- Multiple Chart Types: Scatter, line, bar, histogram, box, violin, pie, heatmap
- Interactive Output: HTML with full Plotly interactivity
- Static Export: PNG, SVG, PDF export capabilities
- Flexible Data Input: Support for various data formats and structures
- Customizable Themes: Multiple built-in themes and styling options
- FastMCP Implementation: Modern decorator-based tools with automatic validation
Quick Start
Prerequisites
Plotly and dependencies:
pip install plotly pandas numpy
# For static image export (optional)
pip install kaleido
Installation
# Install in development mode with Plotly dependencies
make dev-install
# Or install normally and add dependencies
make install
pip install plotly pandas numpy kaleido
Running the Server
# Start the FastMCP server
make dev
# Or directly
python -m plotly_server.server_fastmcp
# HTTP bridge for REST API access
make serve-http
Available Tools
create_chart
Create charts with flexible configuration.
Parameters:
chart_type (required): Chart type ("scatter", "line", "bar", "histogram", "box", "violin", "pie", "heatmap")
data (required): Chart data (dictionary with x, y, etc.)
title: Chart title
x_title: X-axis title
y_title: Y-axis title
output_format: Output format ("html", "png", "svg", "pdf", "json") - default: "html"
output_file: Path for output file
theme: Plotly theme - default: "plotly"
width: Chart width in pixels (100-2000, default: 800)
height: Chart height in pixels (100-2000, default: 600)
create_scatter_plot
Specialized scatter plot creation.
Parameters:
x_data (required): X-axis data points
y_data (required): Y-axis data points
labels: Point labels
colors: Color values for points
sizes: Size values for points
title: Plot title
x_title: X-axis title
y_title: Y-axis title
output_format: Output format - default: "html"
output_file: Path for output file
create_bar_chart
Bar chart for categorical data.
Parameters:
categories (required): Category names
values (required): Values for each category
orientation: Bar orientation ("vertical" or "horizontal") - default: "vertical"
title: Chart title
output_format: Output format - default: "html"
output_file: Path for output file
create_line_chart
Line chart for time series data.
Parameters:
x_data (required): X-axis data (typically dates/times)
y_data (required): Y-axis data points
line_name: Name for the line series
title: Chart title
x_title: X-axis title
y_title: Y-axis title
output_format: Output format - default: "html"
output_file: Path for output file
get_supported_charts
List supported chart types and features.
Returns:
- Available chart types
- Supported output formats
- Theme options
- Feature capabilities
Configuration
MCP Client Configuration
{
"mcpServers": {
"plotly-server": {
"command": "python",
"args": ["-m", "plotly_server.server_fastmcp"],
"cwd": "/path/to/plotly_server"
}
}
}
Examples
Create Custom Scatter Plot
{
"chart_type": "scatter",
"data": {
"x": [1, 2, 3, 4, 5],
"y": [2, 4, 3, 5, 6]
},
"title": "Sample Scatter Plot",
"x_title": "X Axis",
"y_title": "Y Axis",
"output_format": "html",
"theme": "plotly_dark"
}
Create Advanced Scatter Plot
{
"x_data": [1.5, 2.3, 3.7, 4.1, 5.9],
"y_data": [2.1, 4.5, 3.2, 5.8, 6.3],
"labels": ["Point A", "Point B", "Point C", "Point D", "Point E"],
"colors": [1, 2, 3, 4, 5],
"sizes": [10, 15, 20, 25, 30],
"title": "Correlation Analysis",
"output_format": "png",
"output_file": "scatter.png"
}
Create Bar Chart
{
"categories": ["Q1", "Q2", "Q3", "Q4"],
"values": [45.2, 38.7, 52.1, 61.4],
"orientation": "vertical",
"title": "Quarterly Revenue",
"output_format": "svg"
}
Create Line Chart
{
"x_data": ["2024-01", "2024-02", "2024-03", "2024-04", "2024-05"],
"y_data": [100, 110, 105, 120, 115],
"line_name": "Monthly Sales",
"title": "Sales Trend",
"output_format": "html"
}
Create Pie Chart
{
"chart_type": "pie",
"data": {
"labels": ["Product A", "Product B", "Product C", "Product D"],
"values": [30, 25, 20, 25]
},
"title": "Market Share Distribution",
"output_format": "pdf"
}
Create Heatmap
{
"chart_type": "heatmap",
"data": {
"z": [[1, 20, 30], [20, 1, 60], [30, 60, 1]],
"x": ["Variable 1", "Variable 2", "Variable 3"],
"y": ["Variable 1", "Variable 2", "Variable 3"]
},
"title": "Correlation Matrix",
"output_format": "html"
}
Integration
With ContextForge
# Start the Plotly server via HTTP
make serve-http
# Register with ContextForge
curl -X POST http://localhost:8000/gateways \
-H "Content-Type: application/json" \
-d '{
"name": "plotly-server",
"url": "http://localhost:9000",
"description": "Interactive data visualization server using Plotly"
}'
Programmatic Usage
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
async def create_visualization():
server_params = StdioServerParameters(
command="python",
args=["-m", "plotly_server.server_fastmcp"]
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
# Create a line chart
result = await session.call_tool("create_line_chart", {
"x_data": ["Jan", "Feb", "Mar", "Apr", "May"],
"y_data": [100, 120, 110, 140, 135],
"title": "Monthly Performance",
"line_name": "Sales"
})
# Create a scatter plot
scatter_result = await session.call_tool("create_scatter_plot", {
"x_data": [1, 2, 3, 4, 5],
"y_data": [2, 4, 3, 5, 6],
"title": "Data Points"
})
asyncio.run(create_visualization())
Chart Types and Use Cases
Scatter Plots
- Purpose: Correlation analysis, distribution patterns, outlier detection
- Best for: Continuous data relationships, regression analysis
- Features: Color coding, size mapping, trend lines
Line Charts
- Purpose: Time series data, trends over time, comparative analysis
- Best for: Sequential data, performance tracking, forecasting
- Features: Multiple series, annotations, hover information
Bar Charts
- Purpose: Categorical comparisons, ranking, distribution
- Best for: Discrete categories, survey results, performance metrics
- Features: Horizontal/vertical orientation, grouped bars, stacked bars
Histograms
- Purpose: Distribution analysis, frequency patterns, data exploration
- Best for: Understanding data spread, identifying patterns
- Features: Configurable bins, overlay distributions
Box Plots
- Purpose: Statistical distribution, outlier detection, comparative analysis
- Best for: Understanding quartiles, comparing groups
- Features: Quartile display, outlier identification, group comparisons
Violin Plots
- Purpose: Distribution shape, density visualization
- Best for: Detailed distribution analysis, comparing densities
- Features: Kernel density estimation, quartile overlays
Pie Charts
- Purpose: Part-to-whole relationships, percentage breakdowns
- Best for: Composition analysis, market share visualization
- Features: Interactive slicing, percentage labels
Heatmaps
- Purpose: Correlation matrices, 2D data visualization, pattern recognition
- Best for: Large datasets, correlation analysis, intensity mapping
- Features: Color scales, annotations, hierarchical clustering
Output Formats
Interactive HTML
- Features: Full Plotly interactivity, zoom, pan, hover
- Use cases: Web embedding, interactive reports, data exploration
- Benefits: No additional software required, responsive design
Static Images (PNG)
- Features: High-quality raster images
- Use cases: Documents, presentations, print materials
- Requirements: Kaleido package for export
Vector Graphics (SVG)
- Features: Scalable vector format, crisp at any size
- Use cases: Publication-quality graphics, web graphics
- Benefits: Small file size, infinite scalability
PDF Documents
- Features: Publication-ready format
- Use cases: Reports, academic papers, professional documents
- Benefits: Universal compatibility, print-ready
JSON Data
- Features: Plotly figure specification
- Use cases: Data interchange, custom processing, archival
- Benefits: Full configuration preservation, programmatic access
Themes and Styling
Available Themes
- plotly: Default Plotly theme
- plotly_white: Clean white background
- plotly_dark: Dark mode theme
- ggplot2: R ggplot2-inspired theme
- seaborn: Seaborn-inspired theme
- simple_white: Minimal white theme
Custom Styling
{
"chart_type": "scatter",
"data": {"x": [1, 2, 3], "y": [1, 4, 9]},
"title": "Custom Styled Chart",
"theme": "plotly_dark",
"width": 1200,
"height": 800
}
Advanced Features
Multi-Series Charts
# Create complex multi-series line chart
await session.call_tool("create_chart", {
"chart_type": "line",
"data": {
"x": ["Jan", "Feb", "Mar", "Apr", "May"],
"y1": [100, 120, 110, 140, 135], # Series 1
"y2": [80, 90, 95, 100, 105], # Series 2
"y3": [60, 70, 65, 80, 85] # Series 3
},
"title": "Multi-Series Performance Comparison"
})
Dashboard Creation
# Create multiple related charts for a dashboard
charts = [
{
"type": "bar",
"data": {"categories": ["A", "B", "C"], "values": [10, 20, 15]},
"title": "Category Performance"
},
{
"type": "pie",
"data": {"labels": ["X", "Y", "Z"], "values": [30, 40, 30]},
"title": "Distribution"
},
{
"type": "line",
"data": {"x": [1, 2, 3, 4], "y": [1, 4, 2, 5]},
"title": "Trend Analysis"
}
]
for i, chart_config in enumerate(charts):
await session.call_tool("create_chart", {
**chart_config,
"output_file": f"dashboard_chart_{i}.html"
})
Statistical Visualizations
# Create box plot for statistical analysis
await session.call_tool("create_chart", {
"chart_type": "box",
"data": {
"y": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15], # Data with outlier
"name": "Dataset A"
},
"title": "Statistical Distribution Analysis"
})
# Create violin plot for distribution comparison
await session.call_tool("create_chart", {
"chart_type": "violin",
"data": {
"y": [1, 2, 2, 3, 3, 3, 4, 4, 5],
"name": "Distribution Shape"
},
"title": "Distribution Density Analysis"
})
Use Cases
Business Intelligence
- Sales performance dashboards
- Financial reporting charts
- KPI tracking visualizations
Scientific Research
- Experimental data analysis
- Statistical distributions
- Correlation studies
Data Exploration
- Dataset profiling
- Outlier detection
- Pattern recognition
Reporting and Presentations
- Executive summaries
- Progress reports
- Comparative analysis
Web Applications
- Interactive dashboards
- Real-time monitoring
- User analytics
Performance Considerations
- Plotly must be installed for chart generation
- Kaleido is required for static image export (PNG, SVG, PDF)
- HTML output includes the full Plotly library for offline viewing
- Large datasets may impact performance for complex chart types
- Interactive features work best in HTML format
Error Handling
The server provides comprehensive error handling for:
- Missing Dependencies: Clear guidance for installing Plotly and Kaleido
- Data Format Errors: Validation of input data structures
- Chart Type Validation: Ensuring valid chart type and parameter combinations
- Export Failures: Handling issues with static image generation
- Resource Limits: Managing large datasets and memory constraints
1---2name: plotly-server3description: The Plotly MCP Server provides advanced data visualization capabilities using Plotly for creating interactive charts and graphs.4---5# Plotly Server67## Overview89The Plotly MCP Server provides advanced data visualization capabilities using Plotly for creating interactive charts and graphs. It supports multiple chart types, interactive HTML output, static export options, and flexible data input formats. The server is powered by FastMCP for enhanced type safety and automatic validation.1011### Key Features1213- **Multiple Chart Types**: Scatter, line, bar, histogram, box, violin, pie, heatmap14- **Interactive Output**: HTML with full Plotly interactivity15- **Static Export**: PNG, SVG, PDF export capabilities16- **Flexible Data Input**: Support for various data formats and structures17- **Customizable Themes**: Multiple built-in themes and styling options18- **FastMCP Implementation**: Modern decorator-based tools with automatic validation1920## Quick Start2122### Prerequisites2324**Plotly and dependencies:**2526```bash27pip install plotly pandas numpy2829# For static image export (optional)30pip install kaleido31```3233### Installation3435```bash36# Install in development mode with Plotly dependencies37make dev-install3839# Or install normally and add dependencies40make install41pip install plotly pandas numpy kaleido42```4344### Running the Server4546```bash47# Start the FastMCP server48make dev4950# Or directly51python -m plotly_server.server_fastmcp5253# HTTP bridge for REST API access54make serve-http55```5657## Available Tools5859### create_chart60Create charts with flexible configuration.6162**Parameters:**6364- `chart_type` (required): Chart type ("scatter", "line", "bar", "histogram", "box", "violin", "pie", "heatmap")65- `data` (required): Chart data (dictionary with x, y, etc.)66- `title`: Chart title67- `x_title`: X-axis title68- `y_title`: Y-axis title69- `output_format`: Output format ("html", "png", "svg", "pdf", "json") - default: "html"70- `output_file`: Path for output file71- `theme`: Plotly theme - default: "plotly"72- `width`: Chart width in pixels (100-2000, default: 800)73- `height`: Chart height in pixels (100-2000, default: 600)7475### create_scatter_plot76Specialized scatter plot creation.7778**Parameters:**7980- `x_data` (required): X-axis data points81- `y_data` (required): Y-axis data points82- `labels`: Point labels83- `colors`: Color values for points84- `sizes`: Size values for points85- `title`: Plot title86- `x_title`: X-axis title87- `y_title`: Y-axis title88- `output_format`: Output format - default: "html"89- `output_file`: Path for output file9091### create_bar_chart92Bar chart for categorical data.9394**Parameters:**9596- `categories` (required): Category names97- `values` (required): Values for each category98- `orientation`: Bar orientation ("vertical" or "horizontal") - default: "vertical"99- `title`: Chart title100- `output_format`: Output format - default: "html"101- `output_file`: Path for output file102103### create_line_chart104Line chart for time series data.105106**Parameters:**107108- `x_data` (required): X-axis data (typically dates/times)109- `y_data` (required): Y-axis data points110- `line_name`: Name for the line series111- `title`: Chart title112- `x_title`: X-axis title113- `y_title`: Y-axis title114- `output_format`: Output format - default: "html"115- `output_file`: Path for output file116117### get_supported_charts118List supported chart types and features.119120**Returns:**121122- Available chart types123- Supported output formats124- Theme options125- Feature capabilities126127## Configuration128129### MCP Client Configuration130131```json132{133 "mcpServers": {134 "plotly-server": {135 "command": "python",136 "args": ["-m", "plotly_server.server_fastmcp"],137 "cwd": "/path/to/plotly_server"138 }139 }140}141```142143## Examples144145### Create Custom Scatter Plot146147```json148{149 "chart_type": "scatter",150 "data": {151 "x": [1, 2, 3, 4, 5],152 "y": [2, 4, 3, 5, 6]153 },154 "title": "Sample Scatter Plot",155 "x_title": "X Axis",156 "y_title": "Y Axis",157 "output_format": "html",158 "theme": "plotly_dark"159}160```161162### Create Advanced Scatter Plot163164```json165{166 "x_data": [1.5, 2.3, 3.7, 4.1, 5.9],167 "y_data": [2.1, 4.5, 3.2, 5.8, 6.3],168 "labels": ["Point A", "Point B", "Point C", "Point D", "Point E"],169 "colors": [1, 2, 3, 4, 5],170 "sizes": [10, 15, 20, 25, 30],171 "title": "Correlation Analysis",172 "output_format": "png",173 "output_file": "scatter.png"174}175```176177### Create Bar Chart178179```json180{181 "categories": ["Q1", "Q2", "Q3", "Q4"],182 "values": [45.2, 38.7, 52.1, 61.4],183 "orientation": "vertical",184 "title": "Quarterly Revenue",185 "output_format": "svg"186}187```188189### Create Line Chart190191```json192{193 "x_data": ["2024-01", "2024-02", "2024-03", "2024-04", "2024-05"],194 "y_data": [100, 110, 105, 120, 115],195 "line_name": "Monthly Sales",196 "title": "Sales Trend",197 "output_format": "html"198}199```200201### Create Pie Chart202203```json204{205 "chart_type": "pie",206 "data": {207 "labels": ["Product A", "Product B", "Product C", "Product D"],208 "values": [30, 25, 20, 25]209 },210 "title": "Market Share Distribution",211 "output_format": "pdf"212}213```214215### Create Heatmap216217```json218{219 "chart_type": "heatmap",220 "data": {221 "z": [[1, 20, 30], [20, 1, 60], [30, 60, 1]],222 "x": ["Variable 1", "Variable 2", "Variable 3"],223 "y": ["Variable 1", "Variable 2", "Variable 3"]224 },225 "title": "Correlation Matrix",226 "output_format": "html"227}228```229230## Integration231232### With ContextForge233234```bash235# Start the Plotly server via HTTP236make serve-http237238# Register with ContextForge239curl -X POST http://localhost:8000/gateways \240 -H "Content-Type: application/json" \241 -d '{242 "name": "plotly-server",243 "url": "http://localhost:9000",244 "description": "Interactive data visualization server using Plotly"245 }'246```247248### Programmatic Usage249250```python251import asyncio252from mcp import ClientSession, StdioServerParameters253from mcp.client.stdio import stdio_client254255async def create_visualization():256 server_params = StdioServerParameters(257 command="python",258 args=["-m", "plotly_server.server_fastmcp"]259 )260261 async with stdio_client(server_params) as (read, write):262 async with ClientSession(read, write) as session:263 await session.initialize()264265 # Create a line chart266 result = await session.call_tool("create_line_chart", {267 "x_data": ["Jan", "Feb", "Mar", "Apr", "May"],268 "y_data": [100, 120, 110, 140, 135],269 "title": "Monthly Performance",270 "line_name": "Sales"271 })272273 # Create a scatter plot274 scatter_result = await session.call_tool("create_scatter_plot", {275 "x_data": [1, 2, 3, 4, 5],276 "y_data": [2, 4, 3, 5, 6],277 "title": "Data Points"278 })279280asyncio.run(create_visualization())281```282283## Chart Types and Use Cases284285### Scatter Plots286- **Purpose**: Correlation analysis, distribution patterns, outlier detection287- **Best for**: Continuous data relationships, regression analysis288- **Features**: Color coding, size mapping, trend lines289290### Line Charts291- **Purpose**: Time series data, trends over time, comparative analysis292- **Best for**: Sequential data, performance tracking, forecasting293- **Features**: Multiple series, annotations, hover information294295### Bar Charts296- **Purpose**: Categorical comparisons, ranking, distribution297- **Best for**: Discrete categories, survey results, performance metrics298- **Features**: Horizontal/vertical orientation, grouped bars, stacked bars299300### Histograms301- **Purpose**: Distribution analysis, frequency patterns, data exploration302- **Best for**: Understanding data spread, identifying patterns303- **Features**: Configurable bins, overlay distributions304305### Box Plots306- **Purpose**: Statistical distribution, outlier detection, comparative analysis307- **Best for**: Understanding quartiles, comparing groups308- **Features**: Quartile display, outlier identification, group comparisons309310### Violin Plots311- **Purpose**: Distribution shape, density visualization312- **Best for**: Detailed distribution analysis, comparing densities313- **Features**: Kernel density estimation, quartile overlays314315### Pie Charts316- **Purpose**: Part-to-whole relationships, percentage breakdowns317- **Best for**: Composition analysis, market share visualization318- **Features**: Interactive slicing, percentage labels319320### Heatmaps321- **Purpose**: Correlation matrices, 2D data visualization, pattern recognition322- **Best for**: Large datasets, correlation analysis, intensity mapping323- **Features**: Color scales, annotations, hierarchical clustering324325## Output Formats326327### Interactive HTML328- **Features**: Full Plotly interactivity, zoom, pan, hover329- **Use cases**: Web embedding, interactive reports, data exploration330- **Benefits**: No additional software required, responsive design331332### Static Images (PNG)333- **Features**: High-quality raster images334- **Use cases**: Documents, presentations, print materials335- **Requirements**: Kaleido package for export336337### Vector Graphics (SVG)338- **Features**: Scalable vector format, crisp at any size339- **Use cases**: Publication-quality graphics, web graphics340- **Benefits**: Small file size, infinite scalability341342### PDF Documents343- **Features**: Publication-ready format344- **Use cases**: Reports, academic papers, professional documents345- **Benefits**: Universal compatibility, print-ready346347### JSON Data348- **Features**: Plotly figure specification349- **Use cases**: Data interchange, custom processing, archival350- **Benefits**: Full configuration preservation, programmatic access351352## Themes and Styling353354### Available Themes355356- **plotly**: Default Plotly theme357- **plotly_white**: Clean white background358- **plotly_dark**: Dark mode theme359- **ggplot2**: R ggplot2-inspired theme360- **seaborn**: Seaborn-inspired theme361- **simple_white**: Minimal white theme362363### Custom Styling364365```json366{367 "chart_type": "scatter",368 "data": {"x": [1, 2, 3], "y": [1, 4, 9]},369 "title": "Custom Styled Chart",370 "theme": "plotly_dark",371 "width": 1200,372 "height": 800373}374```375376## Advanced Features377378### Multi-Series Charts379380```python381# Create complex multi-series line chart382await session.call_tool("create_chart", {383 "chart_type": "line",384 "data": {385 "x": ["Jan", "Feb", "Mar", "Apr", "May"],386 "y1": [100, 120, 110, 140, 135], # Series 1387 "y2": [80, 90, 95, 100, 105], # Series 2388 "y3": [60, 70, 65, 80, 85] # Series 3389 },390 "title": "Multi-Series Performance Comparison"391})392```393394### Dashboard Creation395396```python397# Create multiple related charts for a dashboard398charts = [399 {400 "type": "bar",401 "data": {"categories": ["A", "B", "C"], "values": [10, 20, 15]},402 "title": "Category Performance"403 },404 {405 "type": "pie",406 "data": {"labels": ["X", "Y", "Z"], "values": [30, 40, 30]},407 "title": "Distribution"408 },409 {410 "type": "line",411 "data": {"x": [1, 2, 3, 4], "y": [1, 4, 2, 5]},412 "title": "Trend Analysis"413 }414]415416for i, chart_config in enumerate(charts):417 await session.call_tool("create_chart", {418 **chart_config,419 "output_file": f"dashboard_chart_{i}.html"420 })421```422423### Statistical Visualizations424425```python426# Create box plot for statistical analysis427await session.call_tool("create_chart", {428 "chart_type": "box",429 "data": {430 "y": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15], # Data with outlier431 "name": "Dataset A"432 },433 "title": "Statistical Distribution Analysis"434})435436# Create violin plot for distribution comparison437await session.call_tool("create_chart", {438 "chart_type": "violin",439 "data": {440 "y": [1, 2, 2, 3, 3, 3, 4, 4, 5],441 "name": "Distribution Shape"442 },443 "title": "Distribution Density Analysis"444})445```446447## Use Cases448449### Business Intelligence450- Sales performance dashboards451- Financial reporting charts452- KPI tracking visualizations453454### Scientific Research455- Experimental data analysis456- Statistical distributions457- Correlation studies458459### Data Exploration460- Dataset profiling461- Outlier detection462- Pattern recognition463464### Reporting and Presentations465- Executive summaries466- Progress reports467- Comparative analysis468469### Web Applications470- Interactive dashboards471- Real-time monitoring472- User analytics473474## Performance Considerations475476- Plotly must be installed for chart generation477- Kaleido is required for static image export (PNG, SVG, PDF)478- HTML output includes the full Plotly library for offline viewing479- Large datasets may impact performance for complex chart types480- Interactive features work best in HTML format481482## Error Handling483484The server provides comprehensive error handling for:485486- **Missing Dependencies**: Clear guidance for installing Plotly and Kaleido487- **Data Format Errors**: Validation of input data structures488- **Chart Type Validation**: Ensuring valid chart type and parameter combinations489- **Export Failures**: Handling issues with static image generation490- **Resource Limits**: Managing large datasets and memory constraints