Tool reference
All seven MCP tools — parameters, scopes, behaviors, and example prompts.
The MCP server exposes seven tools. Each enforces the scopes listed below; if a tool call returns 401 Unauthorized, the token is missing the relevant scope (see Setup).
All write tools accept structured input only — they never parse natural language directly. The client (Claude, Codex, etc.) is responsible for translating the user's prompt into the parameters documented here.
list_projects
List presentation projects in your workspace. Paginated; pass the returned cursor to fetch the next page.
- Scope:
project:read - Behavior: read-only, idempotent
Parameters
| Name | Type | Required | Constraints | Default |
|---|---|---|---|---|
cursor | string | no | opaque, returned by a prior call | — |
limit | number | no | 1–100 | 20 |
Returns — { projects, nextCursor, hasMore }. Each project summary includes id, pid, name, theme, page-layout settings, publish state, members (with roles), createdAt / updatedAt, pinnedAt, and firstPageId. nextCursor is opaque (pass it as cursor on the next call) or null when there are no more pages.
Example prompt
"List my Encelade projects and show me the most recent five."
get_project
Get a single project by its public ID (pid).
- Scope:
project:read - Behavior: read-only, idempotent
Parameters
| Name | Type | Required | Constraints |
|---|---|---|---|
pid | string | yes | non-empty |
Returns — Full project record: pid, name, theme, branding, page-layout/grid settings, publish state, the pages array, members (each with a role — the owner is the member with role: "owner"), createdAt / updatedAt, and your pinnedAt for the project (or null).
Example prompt
"Show me the details of the deck with pid
abc123, including its pages and collaborators."
update_project
Update an existing project's name or theme.
- Scope:
project:write - Behavior: write, idempotent
Parameters
| Name | Type | Required | Constraints |
|---|---|---|---|
pid | string | yes | non-empty |
name | string | no | 1–255 characters |
theme | string | no | valid theme slug |
You must pass at least one of name or theme. Tenant admins and project owners/editors/content editors can update; viewers cannot.
Returns — The updated project record.
Example prompt
"Rename my 'Q3 Report' deck to 'Q3 2026 Quarterly Review' and switch its theme to obsidian."
delete_project
Permanently delete a project. This cannot be undone.
- Scope:
project:delete - Behavior: destructive, non-idempotent
MCP clients annotate this tool as destructive — Claude Desktop and Claude Code will ask for confirmation before invoking it.
Parameters
| Name | Type | Required | Constraints |
|---|---|---|---|
pid | string | yes | non-empty |
Returns — { deleted: true, pid: "<the pid>" } on success.
Example prompt
"Delete the deck named 'Untitled Draft' from my workspace."
plan_project
Generate an outline for a presentation without producing slides. Useful when you want to review and tweak the structure before paying the cost of a full generation.
- Scope:
project:plan - Behavior: write, non-idempotent
- Duration: typically 30–90 seconds; do not flag a session as stuck before 5 minutes from
startedAt.
Parameters
| Name | Type | Required | Constraints |
|---|---|---|---|
outlineHints | string[] | yes | 1–200 items, each 1–20,000 chars |
topic | string | no | ≤ 512 chars |
audience | string | no | 1–256 chars |
tone | string | no | 1–128 chars |
pageCount | number | no | 1–200 |
theme | string | no | valid theme slug |
model | enum | no | see model selection |
Returns — A session record. Poll with get_generation_session to track progress. When phase === "planning" completes, the response includes the normalized plan.
Example prompt
"Draft an outline for a 12-slide presentation about post-quantum cryptography for a developer audience. Don't generate the slides yet."
generate_project
Generate a full presentation from a topic and outline hints. Returns a session ID immediately; the slides are produced asynchronously.
- Scopes:
project:planandproject:generate - Behavior: write, non-idempotent
- Rate limit: 10 calls per window (
api-generatekey prefix) - Duration: planning 30–90s + generating 60–180s depending on slide count; do not flag a session as stuck before 5 minutes from
startedAt.
Parameters
| Name | Type | Required | Constraints |
|---|---|---|---|
outlineHints | string[] | yes | 1–200 items, each 1–20,000 chars |
topic | string | no | ≤ 512 chars |
audience | string | no | 1–256 chars |
tone | string | no | 1–128 chars |
pageCount | number | no | 1–200 |
theme | string | no | valid theme slug |
deepResearch | boolean | no | when true, runs deep research before planning |
model | enum | no | see model selection |
Returns — A session record. Poll with get_generation_session until phase === "done"; the final response includes a link to the completed deck.
Free-tier limits. Workspaces on the starter plan have a monthly deck cap. When exhausted, generate_project returns a structured error:
{
"code": "PRO_REQUIRED",
"required_plan": "pro_v1",
"message": "...",
"limit": { "key": "presentations_created", "value": N, "used": M },
"upgrade_url": "https://www.encelade.ai/pricing"
}Branch on code === "PRO_REQUIRED" in your tooling rather than string-matching.
Example prompt
"Create a 10-slide presentation about the impact of AI on healthcare. Use a professional tone aimed at hospital executives."
get_generation_session
Poll the status of a plan_project or generate_project session.
- Scope:
session:readorproject:generate(either satisfies) - Behavior: read-only, idempotent
Parameters
| Name | Type | Required | Constraints |
|---|---|---|---|
sessionId | string | yes | non-empty |
Returns — Session record with:
| Field | Type | Notes |
|---|---|---|
sessionId | string | Echoes the value you polled with. |
phase | "planning" | "generating" | "done" | "failed" | Source of truth for progress — do not rely on timestamps. |
status | string | Lower-level run status from the worker. |
events | Event[] | Chronological progress events. |
plan | Plan | null | Set once planning completes; same shape as the plan_project result. |
request | object | The original request parameters (topic, outlineHints, etc.). |
formState | object | null | Worker-internal state; opaque to clients. |
reviewConfirmed | boolean | true once planning has been accepted and generation has started. |
projectPid | string | null | Set once the deck row is created. |
link | string | null | Public URL to the completed deck; populated alongside projectPid. |
queuedAt | ISO 8601 string | When the session was enqueued. |
startedAt | ISO 8601 string | null | Use this as the reference point for the 5-minute "stuck" floor. |
completedAt | ISO 8601 string | null | Set on done or failed. |
createdAt | ISO 8601 string | Row creation timestamp. |
updatedAt | ISO 8601 string | Stamped at response time, not last DB write — see note below. |
updatedAt reflects the response time, not the last database write. The
planner can run for ~60 seconds between writes, and a real updatedAt would
make sessions look stale to polling clients. Watch phase and events for
real progress; use completedAt for the true completion moment.
Example prompt
"Check the status of generation session
sess_abc123and tell me when it's done."
Model selection
plan_project and generate_project accept an optional model parameter to override the default LLM. Allowed values:
Anthropic Claude
| Model ID | Notes |
|---|---|
claude-sonnet-4-5-20250929 | Default. Balanced quality/speed. |
claude-opus-4-5-20251101 | Highest quality; slower. |
claude-haiku-4-5-20251001 | Fastest Claude tier. |
OpenAI GPT
| Model ID | Notes |
|---|---|
gpt-5.5 | Highest quality. |
gpt-5.4 | High quality. |
gpt-5-mini | Faster, smaller. |
Google Gemini
| Model ID | Notes |
|---|---|
gemini-2.5-pro | Long-context. |
gemini-2.5-flash | Fastest tier. |
If omitted, the default applies. Unknown model IDs return a validation error.