Official MCP server for ToseaAI document-to-presentation workflows.
This server wraps the production ToseaAI HTTP contract at /api/mcp/v1 and exposes a stable MCP tool surface for Claude Code, Cursor, Codex, and other MCP clients.
- API keys stay server-side and are never echoed back to the agent.
- Long-running operations use
presentation_idplus polling, not raw SSE. - Mutating tools support explicit idempotency keys where the backend supports them.
- Export-capable tools accept an optional
export_filenameso downstream clients can receive a friendly attachment name. - File uploads stay local until the MCP server streams them to ToseaAI over HTTPS.
This repository should stay independent from the main application repository.
- Release cadence is different from the backend.
- Breaking changes to tool names and prompts must be versioned separately.
- Nested git repos or submodules add unnecessary operational friction for MCP users.
npm install
npm run buildTOSEA_API_KEY=sk_...
TOSEA_API_BASE_URL=https://tosea.aiOptional:
TOSEA_TIMEOUT_MSTOSEA_MAX_RETRIESTOSEA_MAX_TOOL_CONCURRENCYTOSEA_MAX_MUTATING_CONCURRENCYTOSEA_MAX_PENDING_TOOL_REQUESTSTOSEA_POLL_INTERVAL_MSTOSEA_MAX_POLL_MSTOSEA_LOG_LEVEL
{
"mcpServers": {
"tosea": {
"command": "node",
"args": ["C:/new/mcp-ToseaAI/dist/src/index.js"],
"env": {
"TOSEA_API_KEY": "sk_...",
"TOSEA_API_BASE_URL": "https://tosea.ai"
}
}
}
}Client-specific examples live in examples/README.md.
Use examples/cursor.mcp.json as the starting point for your local mcp.json.
OpenAI's Agents SDK supports stdio MCP servers, so this repo can be used directly as a local subprocess MCP without needing a hosted HTTP wrapper. See examples/openai-agents-typescript.ts.
If you later need OpenAI Responses API hosted remote MCP mode, add a separate Streamable HTTP transport wrapper instead of changing this stdio package in place.
tosea_healthtosea_get_permissions_summarytosea_get_quota_statustosea_list_presentationstosea_get_presentation_full_datatosea_switch_templatetosea_create_document_parsetosea_get_document_parsetosea_wait_for_document_parsetosea_get_document_parse_resulttosea_parse_pdftosea_generate_outlinetosea_edit_outline_pagetosea_render_slidestosea_edit_slide_pagetosea_export_presentationtosea_pdf_to_presentationtosea_wait_for_jobtosea_list_exportstosea_list_export_filestosea_redownload_export
GETrequests use bounded retries with backoff and jitter.- Read-only tools use
singleflightcoalescing for identical in-flight requests, so repeated concurrent calls like the samelist_presentationsquery are collapsed into one upstream request. - All tools use bounded local concurrency inside one MCP server process; once the local queue is full, the MCP server returns a retryable backpressure error instead of letting requests pile up until transport-level failure.
- Mutating tools are locally gated with bounded concurrency, and writes for the same
presentation_idare serialized inside one MCP server process. - Upload-creating endpoints (
pdf-parse,pdf-to-presentation) acceptidempotency_key, but the MCP server still avoids silent auto-retries for large uploads by default. outline edit,slide edit, andexportsupportidempotency_key; reuse the same value only when retrying the same logical action.tosea_export_presentationandtosea_pdf_to_presentationaccept optionalexport_filenamewhen the visible exported attachment name matters.tosea_create_document_parseis the standalone Markdown/asset extraction facade. It returnsdocument_parse_idand still uses the backend's existing auth, quota, and billing rules.tosea_parse_pdfremains the staged presentation parse step for workflows that continue into outline generation and slide rendering.wait_for_jobfollows nesteddata.job.statuswhen the backend reports a separate export/full job, and falls back to top-level presentation status when no nested job exists.html_zipexport is supported for HTML-mode decks and remains a free export on the backend.- Stdio lifecycle is tied to the host process: the server shuts down on
stdinclose,SIGINT, andSIGTERM, and unexpected transport failures are surfaced as retryable host-transport errors instead of opaque raw exceptions.
If an MCP client downloads a finished export and then relays it through OpenClaw, WeChat, email, or another chat surface:
- pass
export_filenamewhen the user cares about the final visible attachment name - preserve filename, extension, and
Content-Typewhen re-uploading the artifact - do not repackage the file as an anonymous binary attachment, or downstream clients may show only a generic attachment label
logo_file_idis thefile_idof a previously confirmed uploaded logo asset. It is not a local path.template_file_idis thefile_idof a previously confirmed uploaded PPTX/PDF custom-template asset. It is not a source document path.template_file_idis valid only withslide_mode="image".- When
template_file_idis present, the backend treats the request ascustom_templateautomatically. - This MCP package does not mint those asset IDs itself yet. Reuse IDs created through the scripts-first skill or another upload-capable product flow.
page_count_rangemust be one of4-8,8-12,12-16,16-20,20-30,30-40,40-50, or50-100.- Source-file count and total source-page limits are enforced by backend tier policy.
- The current default/free backend policy is
1source file and60total source pages unless the server-side policy overrides it.
- keep
slide_mode="html"by default - use
slide_mode="image"only when the user explicitly wants image-mode rendering or image-first slide composition - when using image mode, pass
image_modelif the user cares about image quality or regeneration consistency - use
output_format="pptx_image"when the user wants a pure image-based PPTX export - use
output_format="pdf"for image-mode review handoff - do not use
output_format="html_zip"for image-mode decks
- API keys must start with
sk_. - The server redacts bearer secrets from surfaced errors.
- The MCP tool layer does not expose JWT-only account operations.
- Export history only exposes user-visible files returned by the backend.
This repository includes a non-billing smoke test that checks auth, health, permissions, and list access without creating presentations:
npm run smokeOptional flags:
--feature-key outline_generate--expect-tier pro--list-limit 5