Encelade Documentation

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

NameTypeRequiredConstraintsDefault
cursorstringnoopaque, returned by a prior call
limitnumberno1–10020

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

NameTypeRequiredConstraints
pidstringyesnon-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

NameTypeRequiredConstraints
pidstringyesnon-empty
namestringno1–255 characters
themestringnovalid 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

NameTypeRequiredConstraints
pidstringyesnon-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

NameTypeRequiredConstraints
outlineHintsstring[]yes1–200 items, each 1–20,000 chars
topicstringno≤ 512 chars
audiencestringno1–256 chars
tonestringno1–128 chars
pageCountnumberno1–200
themestringnovalid theme slug
modelenumnosee 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:plan and project:generate
  • Behavior: write, non-idempotent
  • Rate limit: 10 calls per window (api-generate key 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

NameTypeRequiredConstraints
outlineHintsstring[]yes1–200 items, each 1–20,000 chars
topicstringno≤ 512 chars
audiencestringno1–256 chars
tonestringno1–128 chars
pageCountnumberno1–200
themestringnovalid theme slug
deepResearchbooleannowhen true, runs deep research before planning
modelenumnosee 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:read or project:generate (either satisfies)
  • Behavior: read-only, idempotent

Parameters

NameTypeRequiredConstraints
sessionIdstringyesnon-empty

Returns — Session record with:

FieldTypeNotes
sessionIdstringEchoes the value you polled with.
phase"planning" | "generating" | "done" | "failed"Source of truth for progress — do not rely on timestamps.
statusstringLower-level run status from the worker.
eventsEvent[]Chronological progress events.
planPlan | nullSet once planning completes; same shape as the plan_project result.
requestobjectThe original request parameters (topic, outlineHints, etc.).
formStateobject | nullWorker-internal state; opaque to clients.
reviewConfirmedbooleantrue once planning has been accepted and generation has started.
projectPidstring | nullSet once the deck row is created.
linkstring | nullPublic URL to the completed deck; populated alongside projectPid.
queuedAtISO 8601 stringWhen the session was enqueued.
startedAtISO 8601 string | nullUse this as the reference point for the 5-minute "stuck" floor.
completedAtISO 8601 string | nullSet on done or failed.
createdAtISO 8601 stringRow creation timestamp.
updatedAtISO 8601 stringStamped 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_abc123 and 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 IDNotes
claude-sonnet-4-5-20250929Default. Balanced quality/speed.
claude-opus-4-5-20251101Highest quality; slower.
claude-haiku-4-5-20251001Fastest Claude tier.

OpenAI GPT

Model IDNotes
gpt-5.5Highest quality.
gpt-5.4High quality.
gpt-5-miniFaster, smaller.

Google Gemini

Model IDNotes
gemini-2.5-proLong-context.
gemini-2.5-flashFastest tier.

If omitted, the default applies. Unknown model IDs return a validation error.