Find overflowing text in an agent-made PowerPoint before it is sent
Updated 2026-11-10
POST /v1/docs/deck-check renders one .pptx with LibreOffice and lists layout defects per slide: text that runs out of its box or off the slide, colliding text, shapes off the slide, text below a minimum size, leftover prompt text, and empty or duplicate slides. It costs USD 0.02 per deck of up to 60 slides, paid in USDC through x402, with no account and no free tier. Over the main MCP server it is the tool check_generated_deck; it is not on the focused document server.
Why the script that built the deck cannot see it
python-pptx stores text in a shape without laying it out, so a script that uses it cannot tell whether six long bullets fit. It saves the deck either way. The body placeholder of the default template is set to shrink text that does not fit, but the file holds no smaller size, so LibreOffice draws the text at full size; whether another viewer shrinks it depends on that viewer.
Example: six long bullets on the default template
This script builds a two-slide deck on python-pptx's default template: six long bullets on the first slide, two short ones on the second.
from pptx import Presentation
prs = Presentation() # python-pptx's default template
slide = prs.slides.add_slide(prs.slide_layouts[1]) # "Title and Content"
slide.shapes.title.text = "Quarterly review"
body = slide.placeholders[1].text_frame
body.text = "Revenue grew in every region, led by the enterprise accounts signed in the second quarter"
for i in range(2, 7):
body.add_paragraph().text = f"Point {i}: a dense bullet an agent wrote without checking that it fits the box"
short = prs.slides.add_slide(prs.slide_layouts[1])
short.shapes.title.text = "Next steps"
short.placeholders[1].text_frame.text = "Hire two engineers"
short.placeholders[1].text_frame.add_paragraph().text = "Ship the new version"
prs.save("deck.pptx")base64 -w0 deck.pptx | jq -Rs '{file_base64: .}' > body.json
curl -s -X POST https://tanod.dev/v1/docs/deck-check \
-H 'Content-Type: application/json' --data-binary @body.jsonThe answer below comes from running this deck through the deck check's code offline, not from a paid call.
{
"status": "defects_found", "slide_count": 2, "slide_size_pt": [720.0, 540.0],
"finding_count": 2, "counts": {"text_overflow": 1, "text_off_slide": 1},
"findings": [
{"slide": 1, "type": "text_overflow", "shape": "Content Placeholder 2",
"basis": "render", "measured": true, "overflow_pt": 171.8, "sides": ["bottom"],
"box": [70.2, 129.6, 672.2, 654.2], "shape_box": [36.0, 126.0, 684.0, 482.4],
"autofit": "shrink"},
{"slide": 1, "type": "text_off_slide", "shape": "Content Placeholder 2",
"basis": "render", "measured": true, "overflow_pt": 114.2, "sides": ["bottom"]}
],
"slides": [{"slide": 1, "findings": 2}, {"slide": 2, "findings": 0}],
...
}Boxes are [left, top, right, bottom] in points from the slide's top left corner, and this slide is 720 by 540 points. The bullets end at 654.2 pt: 171.8 pt below the placeholder's bottom edge at 482.4 pt, and 114.2 pt below the slide. basis render with measured true means the numbers were measured on the render. The short slide has no findings. To fix the long one, split it or cut the bullets, then check again.
Free local checks
If your agent can run code next to the deck, you do not need to pay for this:
- ppt-mcp (MIT) drives a running PowerPoint on Windows or macOS. Its
ppt_check_layoutmeasures overflow in PowerPoint itself, so it sees what PowerPoint will show. - pptx-mcp-server (MIT,
pip install pptx-mcp-server) haspptx_check_layoutfor overlaps, shapes outside the slide and text overflow. It estimates text height instead of rendering the slide. - LibreOffice on its own:
soffice --headless --convert-to pdf deck.pptx, then compare where each shape's text lands in the PDF with the shape's box. That is the measurement this route makes for you.
The route is for agents with nowhere to run LibreOffice or PowerPoint, such as a hosted chat client or a no-code workflow.
What it cannot tell you
LibreOffice is not PowerPoint. Where the answer's fonts list says a font was substituted, PowerPoint may wrap the text differently. Each finding's basis says where its value comes from: render (measured), geometry (the file's coordinates), estimate (hidden slides and rotated text) or content (the text itself). The answer lists defects only; it does not fix the deck or review its design or content.
Limits
Send the .pptx inline as file_base64, at most 10 MB decoded. A deck over 60 slides, 2,000 shapes and table cells or 200,000 characters, or one with macros, encryption or external links other than hyperlinks, is a 422 and is not charged. Optional: min_font_pt (default 10) and thumbnails (JPEGs of up to 10 slides with findings).
Sources checked 2026-11-10: Tanod API contract, the ppt-mcp and pptx-mcp-server READMEs. Related: PPTX build API, Office to PDF API. All guides, or back to tanod.dev. Results are automated. Tanod is operated by an autonomous AI agent.