[{"slug":"ZV-2026-0192","server_name":"mcp.carbone.io","severity":"breaking","title":"mcp.carbone.io: batchOutput on render_document narrowed to a closed enum (zip, pdf); previously valid values may now be rejected.","summary":"[safe] Description of convert_document changed (22% word delta). [risky] Optional field hardRefresh was added to convert_document; may shift model behaviour. [risky] Optional field reportName was added to convert_document; may shift model behaviour. [risky] Enum value I added to converter on convert_document. [safe] Description of download_template changed (21% word delta). [risky] Optional field sample was added to download_template; may shift model behaviour. [risky] Optional field keepTags was added to render_document; may shift model behaviour. [risky] Enum value I added to converter on render_document. [breaking] batchOutput on render_document narrowed to a closed enum (zip, pdf); previously valid values may now be rejected. [risky] Optional field id was added to update_template_metadata; may shift model behaviour.","changes":[{"kind":"description_changed","tool":"convert_document","after":"Convert any document to another format without storing a template. Supports 100+ input/output format combinations: Office documents, PDFs, images, web pages, spreadsheets, and more. The source file can be a local path, a URL, or a base64 string. Carbone tags are PRESERVED, not resolved: converting a template keeps every {d.field} intact, so this is also how you proof a template in another format (DOCX template → PDF, or DOCX → ODT while it stays a template). Use render_document instead when you need data injection ({d.field} tags resolved), translations, or batch generation. Common conversions: DOCX → PDF (file: \"report.docx\", convertTo: \"pdf\"; add converter: \"I\" for the fastest DOCX→PDF path), XLSX → PDF (file: \"data.xlsx\", convertTo: \"pdf\"), PPTX → PDF (file: \"slides.pptx\", convertTo: \"pdf\", converter: \"O\" for best fidelity), HTML → PDF (file: \"page.html\", convertTo: \"pdf\", converter: \"C\" for full CSS/JS rendering), DOCX → HTML (file: \"doc.docx\", convertTo: \"html\"), XLSX → CSV (file: \"sheet.xlsx\", convertTo: \"csv\"), PDF → PNG (file: \"doc.pdf\", convertTo: \"png\"), PPTX → PNG (first slide as image), MD → PDF (file: \"readme.md\", convertTo: \"pdf\").","before":"Convert any document to another format without storing a template. Supports 100+ input/output format combinations: Office documents, PDFs, images, web pages, spreadsheets, and more. The source file can be a local path, a URL, or a base64 string. Use render_document instead when you need data injection ({d.field} tags), translations, or batch generation. Common conversions: DOCX → PDF (file: \"report.docx\", convertTo: \"pdf\"), XLSX → PDF (file: \"data.xlsx\", convertTo: \"pdf\"), PPTX → PDF (file: \"slides.pptx\", convertTo: \"pdf\", converter: \"O\" for best fidelity), HTML → PDF (file: \"page.html\", convertTo: \"pdf\", converter: \"C\" for full CSS/JS rendering), DOCX → HTML (file: \"doc.docx\", convertTo: \"html\"), XLSX → CSV (file: \"sheet.xlsx\", convertTo: \"csv\"), PDF → PNG (file: \"doc.pdf\", convertTo: \"png\"), PPTX → PNG (first slide as image), MD → PDF (file: \"readme.md\", convertTo: \"pdf\").","detail":"Description of `convert_document` changed (22% word delta).","severity":"safe","descriptionDelta":0.22330097087378642},{"kind":"input_property_added","path":"inputSchema.properties.hardRefresh","tool":"convert_document","after":{"type":"boolean","description":"Forces Carbone to run the converter even when the output format already matches the input format. Only useful for PDF: converting PDF → PDF to APPLY formatOptions (watermark, password, PDF/A, page range). Without it Carbone may pass the file straight through and none of those options take effect. Leave unset for any format-changing conversion (DOCX → PDF, XLSX → CSV, …), where the converter runs anyway."},"detail":"Optional field `hardRefresh` was added to `convert_document`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.reportName","tool":"convert_document","after":{"type":"string","description":"Filename (WITHOUT extension) for the converted document, returned in the Content-Disposition header. Carbone appends the extension matching convertTo, so do not include one — \"report.pdf\" yields \"report.pdf.pdf\". Examples: \"contract\", \"2026-invoice\". Unlike render_document, Carbone tags are NOT resolved here (conversion does not run templating), so pass a literal name rather than a pattern like \"{d.id}\" — a pattern would come back verbatim. Ignored when returnLink is set, which returns a download URL rather than a named file."},"detail":"Optional field `reportName` was added to `convert_document`; may shift model behaviour.","severity":"risky"},{"kind":"enum_value_added","path":"inputSchema.properties.converter","tool":"convert_document","after":"I","detail":"Enum value `I` added to `converter` on `convert_document`.","severity":"risky"},{"kind":"description_changed","tool":"download_template","after":"Download the original source file of a stored Carbone template (e.g. the DOCX, XLSX, PPTX, or HTML file that was uploaded). Use this to inspect, edit, or back up a template. Pass a Template ID to download the currently deployed version, or a Version ID to download a specific version. Set sample:true to fetch the JSON sample dataset stored with the template instead of the template file itself.","before":"Download the original source file of a stored Carbone template (e.g. the DOCX, XLSX, PPTX, or HTML file that was uploaded). Use this to inspect, edit, or back up a template. Pass a Template ID to download the currently deployed version, or a Version ID to download a specific version.","detail":"Description of `download_template` changed (21% word delta).","severity":"safe","descriptionDelta":0.2142857142857143},{"kind":"input_property_added","path":"inputSchema.properties.sample","tool":"download_template","after":{"type":"boolean","description":"If true, download the JSON SAMPLE DATASET saved with the template (the \"sample\" array passed to upload_template) instead of the template file. Returns JSON of the form [{ \"data\": {...}, \"complement\": {...}, \"translations\": {...}, \"enum\": {...} }]. Use it to recover the example data a template expects — handy before calling render_document against an unfamiliar template. Errors if the template was uploaded without a sample."},"detail":"Optional field `sample` was added to `download_template`; may shift model behaviour.","severity":"risky"},{"kind":"input_property_added","path":"inputSchema.properties.keepTags","tool":"render_document","after":{"type":"boolean","description":"If true, SKIP templating entirely and leave every Carbone tag in the document exactly as written — {d.customer} comes out as the literal text \"{d.customer}\", formatters included. Use it to proof a stored template in another format (e.g. render templateId to PDF to check the tag layout), or to convert a template between formats while it stays a template. Mutually exclusive with data — passing both is rejected, because data would have nothing to fill. Note the difference from omitting data: no data renders the template with an EMPTY dataset, so every tag resolves to an empty string; keepTags leaves the tags themselves in place. Requires Carbone 5.9.0+ (carbone-version: 5)."},"detail":"Optional field `keepTags` was added to `render_document`; may shift model behaviour.","severity":"risky"},{"kind":"enum_value_added","path":"inputSchema.properties.converter","tool":"render_document","after":"I","detail":"Enum value `I` added to `converter` on `render_document`.","severity":"risky"},{"kind":"enum_narrowed","path":"inputSchema.properties.batchOutput","tool":"render_document","after":"enum[zip,pdf]","before":"open","detail":"`batchOutput` on `render_document` narrowed to a closed enum (zip, pdf); previously valid values may now be rejected.","severity":"breaking"},{"kind":"input_property_added","path":"inputSchema.properties.id","tool":"update_template_metadata","after":{"type":"string","description":"Move this version under a DIFFERENT Template ID, re-parenting it so both share a version history. Pass the destination Template ID (64-bit). Leave unset to keep the version where it is — this does not rename anything, use name for that."},"detail":"Optional field `id` was added to `update_template_metadata`; may shift model behaviour.","severity":"risky"}],"published_at":"2026-08-19T10:04:43.863Z"}]