AI-agent-native document engine: generate and chat-edit DOCX, XLSX and PPTX as a Python library, agent tool set, MCP server or hosted service. English-first with first-class Korean support.
edit2docs provides 18 tools with mostly complete schemas and descriptions. Naming is verb-forward (doc_guide, analyze_doc, render_doc, set_doc_text, arrange_doc, read_doc_xml, set_doc_xml, build_doc, generate_doc, edit_doc, hello, list_templates, list_voices, upload_source, request_upload_url, get_asset, generate_deck, download_url). Descriptions are present and moderately detailed (avg ~150 chars), though some lack actionable guidance on when to use them vs. similar tools. Input schemas are visible and typed for all tools. However, output schemas are NOT documented, critical for agent planning. Parameter descriptions are present but inconsistent in depth. Error handling guidance is minimal. Tool composition is reasonable (single responsibility mostly observed), but some tools like generate_doc and edit_doc require external API keys passed as parameters, violating secret-injection pattern.
Outline + edit addresses + charts list for a document. Deterministic, no key. Run FIRST before any edit. Guide: doc_guide('edit').
Deterministic STRUCTURAL edits: duplicate / move / delete whole slides (.pptx) or sheets (.xlsx); rename sheets. No key; byte-preserving. ops apply in order — target = slide index or sheet name/index, to = position. Guide: doc_guide('arrange').
GENERATE (deterministic): build a NEW document from YOUR spec — .docx←markdown, .xlsx←{sheets}, .pptx←{slides} + optional `theme` (bg/accent colors, rail, page numbers → a DESIGNED deck in one call, incl. stat/quote/comparison layouts). Instant, no key. Spec shapes: doc_guide('build').
START HERE for .docx/.xlsx/.pptx work — the document skill. No topic: the GENERATE|EDIT|INSPECT map. topic: deep guide (build, generate, edit, edit.text, edit.chart, edit.xml, render, recipes.slides, recipes.colors). Free, instant.
Produce a signed download URL for an asset (PPTX, source, etc.). The URL is valid for 1 hour by default.
API keys exposed as tool parameters (generate_doc, edit_doc, generate_deck accept api_key/anthropic_api_key). Credentials must never appear in tool parameters, use server-side secret injection via environment variables or vault. Agent traces log every parameter, leaking secrets into logs and prompt history.
Output schemas are not documented for any tool. LLMs cannot plan downstream calls or extract required fields without knowing what each tool returns. Document return types and field structures for all 18 tools.
Error handling guidance is absent. Tools do not describe what errors can occur, whether they are retryable, or what the LLM should do next. E.g., generate_doc/edit_doc may fail if the Anthropic API is unreachable or the key is invalid, no recovery guidance provided.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
EDIT (LLM): chat-edit an existing document with a one-line instruction (Anthropic key). Deterministic alternatives: set_doc_text / set_doc_xml / arrange_doc.
Generate an editable PPTX from previously uploaded sources. Returns `{ pptx_asset_id, page_count, spec_lock, detected_langs, design_spec }` on success. Pass the resulting pptx_asset_id to `download_url` to get a signed download link. Progress is streamed back to the agent as MCP progress notifications (stage + percent complete). Requires BYOK: provide your Anthropic API key in `anthropic_api_key`; we use it for this call only and never persist it. English (en-US) is the default language; pass `lang` to switch (e.g. ko-KR). Pass `image_api_keys={"OPENAI_API_KEY":...}` to enable AI-image generation for hero / chart slides. Pass `narrate=True` to embed Korean speaker-notes narration (Edge-TTS) into the resulting PPTX so PowerPoint auto-plays it on slide entry. To reuse a user's own PPTX design, upload the .pptx with upload_source, then pass its id as `template_asset_id` with `deck_mode='template_restyle'` (fresh deck on the template's masters/theme) or `deck_mode='template_extend'` (append the new slides after the template's existing slides).
GENERATE (LLM): a complete designed document from a one-line intent (Anthropic key; .pptx is slow — minutes). Options: doc_guide('generate'). Keyless alternative: build_doc.
Look up an asset's metadata by `asset_id`. Returns kind, size, mime, original_filename (Korean preserved), storage_key (ASCII), sha256, and timestamps. Use this to confirm an upload landed.
Health check. Returns service identity and the list of MCP tools. Use this first to verify a remote edit2docs server is reachable.
List the layout templates on this server. Use a returned `name` as `template_name` later in generate_deck.
List curated Edge-TTS voices, optionally filtered by `lang` (e.g. 'ko-KR' or 'ko'). Use a returned `voice_id` in the narration step.
Documents are zips of XML. No part: the part map. With part: that part's exact XML text. Pair with set_doc_xml for ANY edit (colors, fonts, slides). Guide: doc_guide('edit.xml').
Render a document: to=md (read the content) | svg | png | pdf. Deterministic, no key. Guide: doc_guide('render').
Allocate a presigned PUT URL for a large source upload. Returns `{ asset_id, upload_url, storage_key, expires_in_seconds }`. The caller PUTs the file bytes directly to `upload_url` within the TTL. Korean filenames are preserved in the registered asset row.
Deterministic structured edits at analyze_doc addresses — text/table/cell values AND chart title/data ({chart: i, ...}). No key; byte-preserves the rest. Shapes: doc_guide('edit.text'), doc_guide('edit.chart').
Patch (find/replace), CREATE (xml + content_type) or DELETE one XML part. Well-formed-or-nothing; byte-preserving. The universal edit — recolor, fonts, add/remove slides. Recipes: doc_guide('recipes.slides'), doc_guide('recipes.colors').
Upload a small source file (PDF / DOCX / PPTX / XLSX / image) inline as base64-encoded bytes. Korean filenames are preserved end-to-end (stored on the asset row as `original_filename`; the object storage key is always ASCII). For files larger than ~10MB, prefer `request_upload_url` and PUT directly to the presigned URL instead.
Parameter descriptions lack actionable constraints. E.g., 'dpi' in render_doc has no min/max; 'pages' in generate_doc has a default range but no validation guidance. Unbounded numeric parameters let LLMs pass absurd values.
Tool composition: generate_doc and edit_doc both require external API keys and perform LLM-driven operations. Unclear when to use generate_doc vs build_doc (deterministic alternative) or edit_doc vs set_doc_text. Descriptions should explicitly state 'Deterministic alternative: build_doc' and 'Deterministic alternative: set_doc_text' to guide agent selection.