auxoppttest / tools /chart_tools.py
BruceWayne1's picture
hiii
4ad5bf3
"""
Chart data management tools for PowerPoint MCP Server.
Implements advanced chart data manipulation capabilities.
"""
from typing import Dict, List, Optional, Any
from pptx.chart.data import ChartData
def register_chart_tools(app, presentations, get_current_presentation_id, validate_parameters,
is_positive, is_non_negative, is_in_range, is_valid_rgb):
"""Register chart data management tools with the FastMCP app."""
@app.tool()
def update_chart_data(
slide_index: int,
shape_index: int,
categories: List[str],
series_data: List[Dict],
presentation_id: str = None
) -> Dict:
"""
Replace existing chart data with new categories and series.
Args:
slide_index: Index of the slide (0-based)
shape_index: Index of the chart shape (0-based)
categories: List of category names
series_data: List of dictionaries with 'name' and 'values' keys
presentation_id: Optional presentation ID (uses current if not provided)
Returns:
Dictionary with operation results
"""
try:
# Get presentation
pres_id = presentation_id or get_current_presentation_id()
if pres_id not in presentations:
return {"error": "Presentation not found"}
pres = presentations[pres_id]
# Validate slide index
if not (0 <= slide_index < len(pres.slides)):
return {"error": f"Slide index {slide_index} out of range"}
slide = pres.slides[slide_index]
# Validate shape index
if not (0 <= shape_index < len(slide.shapes)):
return {"error": f"Shape index {shape_index} out of range"}
shape = slide.shapes[shape_index]
# Check if shape is a chart
if not hasattr(shape, 'has_chart') or not shape.has_chart:
return {"error": "Shape is not a chart"}
chart = shape.chart
# Create new ChartData
chart_data = ChartData()
chart_data.categories = categories
# Add series data
for series in series_data:
if 'name' not in series or 'values' not in series:
return {"error": "Each series must have 'name' and 'values' keys"}
chart_data.add_series(series['name'], series['values'])
# Replace chart data
chart.replace_data(chart_data)
return {
"message": f"Updated chart data on slide {slide_index}, shape {shape_index}",
"categories": categories,
"series_count": len(series_data),
"series_names": [s['name'] for s in series_data]
}
except Exception as e:
return {"error": f"Failed to update chart data: {str(e)}"}