studio.dodraft/getdeck
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
160+ finished slide layouts and 41 themes your agent can search, fetch and build a deck from
| Author | studio.dodraft |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 1793 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"getdeck": {
"url": "https://getdeck.co/api/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (15)
list_layoutsSearch or filter the layout catalog to find a specific layout. Returns metadata only, no HTML. Also the tool for "what is new", "any new layouts?", "what got added since last month" - pass `since` and it returns only what landed after that date. If the user asked for a whole deck rather than one slide, call suggest_deck first instead of this.
Parameters:
limit— integerquery— stringsince— string — ISO date (YYYY-MM-DD). Only layouts added after it. Use for "what is new" questions; if the user gave no date, a month back is a sensible default.category— string
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
list_themesSearch or filter the theme catalog. Returns metadata and key colors only, not the full CSS. With an API key, the user's own saved themes (My Themes, id "custom:...") come last with custom: true; their ids work anywhere a theme id does.
Parameters:
mood— stringscheme— string
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_layoutReturn one layout as a ready-to-use, self-contained document: HTML, theme CSS, and its slot definitions. Call this once the user knows which layout they want, or with ids returned by suggest_deck.
Parameters:
id(required) — stringlang— string — Language for slot hints and usage notes. Pass the language the user is writing in.theme_id— string
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_themeReturn one theme in full: its complete CSS and design tokens.
Parameters:
id(required) — string
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_starter_kitCall this when joining several fetched layouts into one deck file. Requests like "merge these into one file", "bundle it as a deck", or "make it one HTML" mean this tool. Returns the base CSS, assembly rules, spacing tokens, and a viewport snippet for standalone viewing.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
suggest_deckCompose a deck and return a preview link the user can open in the browser right away. The user sees what the finished deck looks like without a single file being generated. Use this for requests like "make me a pitch deck", "I need a sales deck", "10 slides for an investor update", "put together a product overview", or "show me a deck outline" - anything where the user has a topic but has not picked layouts yet. ALSO use it when the user already has layouts in hand - "이 레이아웃들 모아서 프리뷰 만들어줘", "combine these layouts into a preview", "추천 프리뷰 만들어줘", "show these together as a deck" - pass them as layout_ids and it returns ONE deck preview link for the whole set. Never answer that kind of request with a list of individual layout links: one deck preview is the deliverable. Returns one theme + a slide order + the preview link, plus a `clarify` question to put to the user so the composition and theme are their call, not a guess. Always pass the preview link through to the user verbatim, ask clarify.question with its options, and wait for the answer - then call this tool again with deck_id / theme_id as clarify.answer_with says. Do not start generating files while a clarify question is unanswered. Once it is settled, fetch each layout id with get_layout, then call get_starter_kit to join them into one deck.
Parameters:
purpose(required) — string — The user's topic or goal, in their own words. e.g. "startup pitch deck", "quarterly business review"tone— string — Desired mood. e.g. "minimal", "bold", "warm". Omit if the user did not mention one.deck_id— string — The composition the user picked from a previous call's clarify.options. Skips topic matching.theme_id— string — The theme the user picked from a previous call's clarify.options. Pass deck_id along with it.layout_ids— array — Layout ids the user or you already picked, in slide order. Skips topic matching and slide_count: the preview link is built from exactly these layouts.slide_count— integer — How many slides. If the user did not say, use the default of 10 rather than asking.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
export_pptxTurn a deck into a downloadable .pptx file. Requests like "make it a PowerPoint", "PPT로 뽑아줘", or "export this deck" mean this tool. Takes the layout ids and the text for each slot, and returns a signed download link. Coordinates come from our measurements, so the file matches what the gallery shows, but the boxes are fixed, so text longer than slots[].max_chars will be clipped.
Parameters:
theme— string — Theme id. Only measured themes work; omit to use the default. A My Theme id ("custom:...") from list_themes also works: its base theme's layout with the user's colors.slides— array — Up to 25 slides, in order. Required unless template_id is given.embed_fonts— boolean — Put the fonts inside the file so it looks the same where they are not installed. On by default; pass false to leave them out. The result lists fonts that could not be embedded.template_id— string — A saved template id from list_templates. Exports that template with its own theme and slides; theme and slides are then ignored. Errors for it: not_found, template_lookup_failed.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
save_templateSave a deck as a named template in the user's My Templates so it can be reused later. Requires a Pro account; without one the call fails and nothing is saved. Use it after you have built a deck the user wants to keep, for example from suggest_deck. Input: name, optional theme_id (a catalog theme id or custom:<uuid>), and slides as [{layout, slots}], the same shape export_pptx takes. A template holds 1 to 25 slides. Returns template_id, url (the template's page), slide_count, version (use it as expected_version in update_template), overflow[] (slots whose text is longer than max_chars) and unknown_layouts[]. Deleting is not available here, only on the web. Errors: pro_required, slide_limit, template_limit (the account already has the most templates it can hold), unknown_theme, invalid_input.
Parameters:
name(required) — stringslides(required) — arraytheme_id— string
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
list_templatesList the templates the user saved in My Templates: id, name, slide_count, theme_id, source, updated_at and version. Use it to find a template the user refers to, and to read slide_count before appending with update_template. Needs an API key; works on any plan.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
get_templateReturn one saved template: name, theme_id and slides as [{id, layout, slots, objects, overrides?}], plus each slide's slot definitions with max_chars. Use it to fill the same structure with new text, then save with update_template or export with export_pptx(template_id), both of which need Pro. To place or change only the objects of one slide, use add_objects, update_objects and remove_objects. Needs an API key; reading works on any plan.
Parameters:
id(required) — string
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
update_templateChange a template the user already saved. Requires a Pro account; without one the call fails and nothing is changed. Pass the template id and any of: name, theme_id, slides (replaces all slides), or append_slides (adds slides to the end). A template holds at most 25 slides. If the result would be more than 25, nothing is changed and the response is a slide_limit error that includes how many slides still fit. Call list_templates first to read slide_count when you plan to append. The response has the same fields as save_template. Deleting is not available here, only on the web. Errors: pro_required, not_found, slide_limit, conflict (the template changed since expected_version, or kept changing during an append; nothing was saved), unknown_theme, invalid_input.
Parameters:
id(required) — stringname— stringslides— arraytheme_id— stringappend_slides— arrayexpected_version— integer — The version from get_template or a previous save. Given, the call fails with conflict if the template changed since.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
list_mediaList the images the user uploaded to their media library on the web: id, name, width, height, aspect_ratio (width/height), bytes, mime and created_at, newest first, plus used_bytes. Pass an id to add_objects to place the picture on a slide. You cannot upload an image or fetch one from a web address; if the picture you need is missing, ask the user to upload it to their media library on the web. Needs an API key; works on any plan.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
add_objectsAdd text boxes and images on top of one slide of a saved template, up to 50 per call and 50 per slide. Requires a Pro account. Use this instead of update_template to place objects: it never touches slots, other slides or other objects. Each item is {type:"text", text, ...} or {type:"image", asset, ...}; position and size are optional (a text box lands near the middle, an image is centered and fitted). Coordinates are pixels on a 1920x1080 slide and are kept inside it. Colors are theme tokens, not hex. Images come only from list_media ids. Set behind:true to put an object under the layout's own title and text (a background picture behind the default title); it is hidden wherever a layout card or panel has a solid fill. All items are added or none. Returns the slide's objects with their ids and the new version. Errors: pro_required, not_found, conflict (read again with get_template and retry), invalid_input.
Parameters:
template_id(required) — string — From list_templates.slide_id(required) — string — The slide's id from get_template.objects(required) — arrayexpected_version— integer — The version from get_template. Given, the call fails with conflict if the template changed since.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
update_objectsChange objects already on a slide, by id: position, size, rotation, text, text style, the image's alt text or picture, stacking order, and behind (true sends it behind the layout's own elements, false brings it back in front). Requires a Pro account. Send only the fields to change; the style is merged. An image keeps its proportions (send w alone). Up to 50 changes per call, all applied or none. Read ids and the current version with get_template. Returns the slide's objects and the new version. Errors: pro_required, not_found, conflict (read again with get_template and retry), invalid_input.
Parameters:
template_id(required) — string — From list_templates.slide_id(required) — string — The slide's id from get_template.changes(required) — arrayexpected_version— integer — The version from get_template. Given, the call fails with conflict if the template changed since.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
remove_objectsRemove objects from a slide by id. Requires a Pro account. The slide, its slots and the other objects stay. Only objects can be removed here; slides and templates are deleted on the web. If any id is not on the slide, nothing is removed. Returns the objects that remain and the new version. Errors: pro_required, not_found, conflict (read again with get_template and retry), invalid_input.
Parameters:
template_id(required) — string — From list_templates.slide_id(required) — string — The slide's id from get_template.ids(required) — arrayexpected_version— integer — The version from get_template. Given, the call fails with conflict if the template changed since.
Hints: read-only not declared · destructive not declared · idempotent not declared · open-world not declared
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.