add-slide-picture-with-caption
Add a slide with an image and caption to a PowerPoint presentation. Insert pictures with descriptive text to enhance visual content in existing presentations.
Instructions
Add a new slide with a picture and caption to an existing presentation
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| presentation_name | Yes | Name of the presentation to add the slide to | |
| title | Yes | Title of the slide | |
| caption | Yes | Caption text to appear below the picture | |
| image_path | Yes | Path to the image file to insert |
Implementation Reference
- Core implementation of the tool logic: adds a new slide using picture-with-caption layout, inserts image while preserving aspect ratio and centering it, sets title and caption.def add_picture_with_caption_slide(self, presentation_name: str, title: str, image_path: str, caption_text: str) -> Slide: """ For the given presentation builds a slide with the picture with caption template. Maintains the image's aspect ratio by adjusting the picture object after insertion. Args: presentation_name: The presentation to add the slide to title: The title of the slide image_path: The path to the image to insert caption_text: The caption content """ try: prs = self.presentations[presentation_name] except KeyError as e: raise ValueError(f"Presentation '{presentation_name}' not found") # Add a new slide with layout 8 (Picture with Caption) try: slide_layout = prs.slide_layouts[self.SLIDE_LAYOUT_PICTURE_WITH_CAPTION] slide = prs.slides.add_slide(slide_layout) except IndexError as e: error_message = f"Slide Index does not exist. Error: {str(e)}" raise ValueError(error_message) # Set the title title_shape = slide.shapes.title title_shape.text = title # Get the image placeholder try: placeholder = slide.placeholders[1] except IndexError as e: error_message = f"Placeholder index does not exist. Error {str(e)}" raise ValueError(error_message) # Insert the picture into the placeholder if not os.path.exists(image_path): raise FileNotFoundError(f"Image not found: {image_path}") try: picture = placeholder.insert_picture(image_path) except FileNotFoundError as e: error_message = f"Image not found during insertion: {str(e)}" raise except UnidentifiedImageError as e: error_message = f"Image file {image_path} is not a valid image: {str(e)}" raise ValueError(error_message) except Exception as e: error_message = f"An unexpected error occured during picture insertion: {str(e)}" raise # Get placeholder dimensions after picture insertion available_width = picture.width available_height = picture.height # Get original image dimensions directly from the picture object image_width, image_height = picture.image.size # Calculate aspect ratios placeholder_aspect_ratio = float(available_width) / float(available_height) image_aspect_ratio = float(image_width) / float(image_height) # Store initial position pos_left, pos_top = picture.left, picture.top # Remove any cropping picture.crop_top = 0 picture.crop_left = 0 picture.crop_bottom = 0 picture.crop_right = 0 # Adjust picture dimensions based on aspect ratio comparison if placeholder_aspect_ratio > image_aspect_ratio: # Placeholder is wider than image - adjust width down while maintaining height picture.width = int(image_aspect_ratio * available_height) picture.height = available_height else: # Placeholder is taller than image - adjust height down while maintaining width picture.height = int(available_width / image_aspect_ratio) picture.width = available_width # Center the image within the available space picture.left = pos_left + int((available_width - picture.width) / 2) picture.top = pos_top + int((available_height - picture.height) / 2) # Set the caption caption = slide.placeholders[2] caption.text = caption_text return slide
- src/powerpoint/server.py:461-489 (handler)MCP server dispatch handler: validates arguments, sanitizes image path, calls PresentationManager.add_picture_with_caption_slide, returns success message.elif name == "add-slide-picture-with-caption": # Get arguments presentation_name = arguments["presentation_name"] title = arguments["title"] caption = arguments["caption"] file_name = arguments["image_path"] if not all([presentation_name, title, caption, file_name]): raise ValueError("Missing required arguments") if presentation_name not in presentation_manager.presentations: raise ValueError(f"Presentation not found: {presentation_name}") try: safe_file_path = sanitize_path(folder_path, file_name) except ValueError as e: raise ValueError(f"Invalid file path: {str(e)}") try: slide = presentation_manager.add_picture_with_caption_slide(presentation_name, title, str(safe_file_path), caption) except Exception as e: raise ValueError(f"Unable to add slide with caption and picture layout to {presentation_name}.pptx. Error: {str(e)}") return [types.TextContent( type="text", text=f"Successfully added slide with caption and picture layout to {presentation_name}.pptx" )]
- src/powerpoint/server.py:298-323 (schema)Tool schema definition specifying input parameters and validation for the add-slide-picture-with-caption tool.types.Tool( name="add-slide-picture-with-caption", description="Add a new slide with a picture and caption to an existing presentation", inputSchema={ "type": "object", "properties": { "presentation_name": { "type": "string", "description": "Name of the presentation to add the slide to", }, "title": { "type": "string", "description": "Title of the slide", }, "caption": { "type": "string", "description": "Caption text to appear below the picture" }, "image_path": { "type": "string", "description": "Path to the image file to insert" } }, "required": ["presentation_name", "title", "caption", "image_path"], }, ),
- src/powerpoint/server.py:42-362 (registration)Registration of all tools including 'add-slide-picture-with-caption' via the MCP list_tools handler.@server.list_tools() async def handle_list_tools() -> list[types.Tool]: """List available PowerPoint tools.""" return [ types.Tool( name="create-presentation", description="This tool starts the process of generating a new powerpoint presentation with the name given " "by the user. Use this tool when the user requests to create or generate a new presentation.", inputSchema={ "type": "object", "properties": { "name": { "type": "string", "description": "Name of the presentation (without .pptx extension)", }, }, "required": ["name"], }, ), types.Tool( name="generate-and-save-image", description="Generates an image using a FLUX model and save the image to the specified path. The tool " "will return a PNG file path. It should be used when the user asks to generate or create an " "image or a picture.", inputSchema={ "type": "object", "properties": { "prompt": { "type": "string", "description": "Description of the image to generate in the form of a prompt.", }, "file_name": { "type": "string", "description": "Filename of the image. Include the extension of .png", }, }, "required": ["prompt", "file_name"], }, ), types.Tool( name="add-slide-title-only", description="This tool adds a new title slide to the presentation you are working on. The tool doesn't " "return anything. It requires the presentation_name to work on.", inputSchema={ "type": "object", "properties": { "presentation_name": { "type": "string", "description": "Name of the presentation to add the slide to", }, "title": { "type": "string", "description": "Title of the slide", } }, "required": ["presentation_name", "title"], }, ), types.Tool( name="add-slide-section-header", description="This tool adds a section header (a.k.a segue) slide to the presentation you are working on. The tool doesn't " "return anything. It requires the presentation_name to work on.", inputSchema={ "type": "object", "properties": { "presentation_name": { "type": "string", "description": "Name of the presentation to add the slide to", }, "header": { "type": "string", "description": "Section header title", }, "subtitle": { "type": "string", "description": "Section header subtitle", } }, "required": ["presentation_name", "header"], }, ), types.Tool( name="add-slide-title-content", description="Add a new slide with a title and content to an existing presentation", inputSchema={ "type": "object", "properties": { "presentation_name": { "type": "string", "description": "Name of the presentation to add the slide to", }, "title": { "type": "string", "description": "Title of the slide", }, "content": { "type": "string", "description": "Content/body text of the slide. " "Separate main points with a single carriage return character." "Make sub-points with tab character." "Do not use bullet points, asterisks or dashes for points." "Max main points is 4" }, }, "required": ["presentation_name", "title", "content"], }, ), types.Tool( name="add-slide-comparison", description="Add a new a comparison slide with title and comparison content. Use when you wish to " "compare two concepts", inputSchema={ "type": "object", "properties": { "presentation_name": { "type": "string", "description": "Name of the presentation to add the slide to", }, "title": { "type": "string", "description": "Title of the slide", }, "left_side_title": { "type": "string", "description": "Title of the left concept", }, "left_side_content": { "type": "string", "description": "Content/body text of left concept. " "Separate main points with a single carriage return character." "Make sub-points with tab character." "Do not use bullet points, asterisks or dashes for points." "Max main points is 4" }, "right_side_title": { "type": "string", "description": "Title of the right concept", }, "right_side_content": { "type": "string", "description": "Content/body text of right concept. " "Separate main points with a single carriage return character." "Make sub-points with tab character." "Do not use bullet points, asterisks or dashes for points." "Max main points is 4" }, }, "required": ["presentation_name", "title", "left_side_title", "left_side_content", "right_side_title", "right_side_content"], }, ), types.Tool( name="add-slide-title-with-table", description="Add a new slide with a title and table containing the provided data", inputSchema={ "type": "object", "properties": { "presentation_name": { "type": "string", "description": "Name of the presentation to add the slide to", }, "title": { "type": "string", "description": "Title of the slide", }, "data": { "type": "object", "description": "Table data object with headers and rows", "properties": { "headers": { "type": "array", "items": {"type": "string"}, "description": "Array of column headers" }, "rows": { "type": "array", "items": { "type": "array", "items": {"type": ["string", "number"]}, }, "description": "Array of row data arrays" } }, "required": ["headers", "rows"] } }, "required": ["presentation_name", "title", "data"], }, ), types.Tool( name="add-slide-title-with-chart", description="Add a new slide with a title and chart. The chart type will be automatically selected based on the data structure.", inputSchema={ "type": "object", "properties": { "presentation_name": { "type": "string", "description": "Name of the presentation to add the slide to", }, "title": { "type": "string", "description": "Title of the slide", }, "data": { "type": "object", "description": "Chart data structure", "properties": { "categories": { "type": "array", "items": {"type": ["string", "number"]}, "description": "X-axis categories or labels (optional)" }, "series": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string", "description": "Name of the data series" }, "values": { "type": "array", "items": { "oneOf": [ {"type": "number"}, { "type": "array", "items": {"type": "number"}, "minItems": 2, "maxItems": 2 } ] }, "description": "Values for the series. Can be simple numbers or [x,y] pairs for scatter plots" } }, "required": ["name", "values"] } }, "x_axis": { "type": "string", "description": "X-axis title (optional)" }, "y_axis": { "type": "string", "description": "Y-axis title (optional)" } }, "required": ["series"] } }, "required": ["presentation_name", "title", "data"], }, ), types.Tool( name="add-slide-picture-with-caption", description="Add a new slide with a picture and caption to an existing presentation", inputSchema={ "type": "object", "properties": { "presentation_name": { "type": "string", "description": "Name of the presentation to add the slide to", }, "title": { "type": "string", "description": "Title of the slide", }, "caption": { "type": "string", "description": "Caption text to appear below the picture" }, "image_path": { "type": "string", "description": "Path to the image file to insert" } }, "required": ["presentation_name", "title", "caption", "image_path"], }, ), types.Tool( name="open-presentation", description="Opens an existing presentation and saves a copy to a new file for backup. Use this tool when " "the user requests to open a presentation that has already been created.", inputSchema={ "type": "object", "properties": { "presentation_name": { "type": "string", "description": "Name of the presentation to open", }, "output_path": { "type": "string", "description": "Path where to save the presentation (optional)", }, }, "required": ["presentation_name"], }, ), types.Tool( name="save-presentation", description="Save the presentation to a file. Always use this tool at the end of any process that has " "added slides to a presentation.", inputSchema={ "type": "object", "properties": { "presentation_name": { "type": "string", "description": "Name of the presentation to save", }, "output_path": { "type": "string", "description": "Path where to save the presentation (optional)", }, }, "required": ["presentation_name"], }, ), ]