Carbone MCP
OfficialCarbone MCP generates, converts, and manages production-ready documents (PDF, Word, Excel, PowerPoint, HTML, images and more) from templates and JSON data, straight from an MCP client.
Render documents with
render_document: merge a Carbone template (stored by ID/Version ID, or an inline file path, URL, or base64) with JSON data, with output format conversion, translations, time zones, currency conversion, aliases, and enums.Convert files with
convert_document: 100+ format conversions (DOCX/XLSX/PPTX/HTML/MD/PDF → PDF, images, CSV, ODT, etc.) using the LibreOffice, OnlyOffice, Chromium, or Carbone ICE converter — tags stay as written.Polish PDFs: passwords and permissions, watermarks (up to 4), PDF/A, tagged/PDF-UA accessibility, page ranges, pagination/TOC refresh (
hardRefresh).Batch and localize: one document per array item (up to 100) delivered as a ZIP or merged PDF, plus i18n translations and currency rates.
Inspect templates with
inspect_template: list the tags a template uses and get a matching sample dataset (counts as one generation).Manage a template library:
upload_template(versions, categories, tags, comments, deployment, expiry, samples),list_templates(filter/search/paginate),list_categories,list_tags,update_template_metadata(rename, categorize, tag, deploy, schedule deletion, move version),delete_template,download_template(file or sample JSON).Async and webhooks: render asynchronously via
webhookUrl(5-minute timeout) with custom headers; fetch results later withget_render_result.Deliver results inline (text/images), as one-time short-lived download links (
returnLink), as attachments (asAttachment), or saved to a local path (outputPath).Diagnostics:
get_api_statusfor API health/version andget_capabilitiesfor a summary of formats, features, and usage examples.Deploy anywhere: hosted server (mcp.carbone.io, OAuth sign-in), local
npx carbone-mcpstdio package (reads/writes local files), or self-hosted Docker HTTP; also works with an on-premise Carbone instance viaCARBONE_BASE_URL.
Supports converting Markdown documents into professional formats like PDF using the Carbone conversion engine.
Utilizes OnlyOffice as a specialized conversion engine to ensure high-fidelity transformations for complex document formats.
This server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
Carbone MCP Server
Automate production-ready PDF, Word, Excel and PowerPoint documents from templates and JSON data, and convert files with 100+ conversions, from Claude, ChatGPT, Cursor, VS Code or any MCP client. The official server for the Carbone document generation API.
Convert files: DOCX, XLSX, PPTX, HTML, SVG, Markdown or PDF to PDF, images, CSV, ODT and the other output formats.
Fill templates with JSON: design them in Word, Excel, PowerPoint, LibreOffice, HTML or Markdown with
{d.field}tags, or fill an existing PDF form.Finish your PDFs: passwords, watermarks, PDF/A, page ranges, and a choice of converter (LibreOffice, OnlyOffice, Chromium or Carbone ICE).
Batch and localize: up to 100 documents per request, collected by the assistant on the hosted server or delivered to your own webhook; translations, time zones, and currency conversion at the rates you give.
Keep a template library: upload, version, categorize, deploy and download templates, and ask which data a template expects.
What you can ask
Carbone turns data into finished documents, including data another MCP server fetches (Salesforce, HubSpot, Stripe, Notion, Google Sheets…) in the same conversation:
"Get the Acme Corp opportunity and its products from Salesforce, fill my 'Sales quote' template, and give me a PDF with a DRAFT watermark."
"Which data does my 'Service agreement' template expect? Map its fields to the HubSpot deal 'Acme renewal' and show me the JSON before you render it."
"Create one certificate per attendee in the 'Workshop' Google Sheet with my 'Certificate' template, as a ZIP of PDFs named certificate-{d.lastName}."
"Generate this invoice in French, German and Spanish, with prices converted from EUR to USD at 1.08 and dates in New York time."
"Build a monthly report from last month's paid Stripe invoices with the 'Statement' template. Render it as a PNG first so you can check the layout, then give me the PDF."
"Turn this Word quote into a Carbone template: add tags for the customer, a loop on the line items and the total, then upload it as 'Quote v2' in the 'sales' category."
"Make a PDF/A copy of pages 1 to 5 of this contract for archiving, and a password-protected PDF with a CONFIDENTIAL watermark to send to the client."
"Deploy the newest version of my 'Invoice' template, and schedule the old one for deletion in 30 days."
Related MCP server: doc-ops-mcp
Account and pricing
You sign in with a Carbone account, free to create. Without a plan, you get unlimited watermarked PDFs. The Free plan adds every output format without a watermark, with 100 documents per month (pricing).
Quick start
Setup | Runs | Clients | Files |
Hosted server (recommended) |
| Claude, ChatGPT, Claude Code, VS Code, Cursor, …: sign in with your Carbone account | URLs, base64, ChatGPT attachments, upload URLs |
| Claude Desktop, Claude Code, VS Code, Cursor, and any client that starts local servers | Also reads local paths and saves documents to disk | |
Your own server | Clients that can send an | URLs and base64 |
Hosted server (mcp.carbone.io)
The Carbone agent plugin installs this server and the Carbone Skill together, in Claude, ChatGPT, Codex, Cursor, GitHub Copilot, Gemini CLI and more. To add the server alone:
Claude (claude.ai and Claude Desktop)
Open Carbone in the Claude directory and click Connect.
Sign in with your Carbone account and approve.
If your organization does not offer directory connectors, add a custom connector with the URL https://mcp.carbone.io instead, leaving the OAuth client ID and secret empty. In an organization, each member connects with their own Carbone account, and their documents count against it.
ChatGPT
Open the Carbone plugin in ChatGPT, click Add, then sign in with your Carbone account. The plugin also includes the Carbone Skill.
Without the plugin: open Plugins, click Add, then Add custom MCP server. Enter the name Carbone and the URL https://mcp.carbone.io, choose OAuth, tick I understand and want to continue, click Create as a plugin, and sign in.
Claude Code, VS Code, Cursor
Claude Code: add the server, then run /mcp, select carbone and choose Authenticate.
claude mcp add --transport http carbone https://mcp.carbone.ioVS Code (.vscode/mcp.json), which asks you to sign in when it starts the server:
{
"servers": {
"carbone": { "type": "http", "url": "https://mcp.carbone.io" }
}
}Cursor (~/.cursor/mcp.json or .cursor/mcp.json), then sign in from Cursor's MCP settings:
{
"mcpServers": {
"carbone": { "url": "https://mcp.carbone.io" }
}
}Local package (stdio)
Use it to read and save files on your computer. It needs Node.js 20.3 or later (node --version) and a Carbone API key from account.carbone.io: the test key makes unlimited watermarked PDFs (templates stored with it are kept 30 days), the production key every format (details).
Most clients use this config:
{
"mcpServers": {
"carbone": {
"command": "npx",
"args": ["-y", "carbone-mcp"],
"env": {
"CARBONE_API_KEY": "your_api_key_here"
}
}
}
}Client | Where to put it |
Claude Desktop | Settings → Developer → Edit Config opens |
Cursor |
|
Claude Code:
claude mcp add --env CARBONE_API_KEY=your_api_key_here --transport stdio carbone -- npx -y carbone-mcpVS Code: .vscode/mcp.json uses servers, not mcpServers. With an input variable, VS Code asks for the key once and stores it securely:
{
"inputs": [
{ "type": "promptString", "id": "carbone-api-key", "description": "Carbone API key", "password": true }
],
"servers": {
"carbone": {
"type": "stdio",
"command": "npx",
"args": ["-y", "carbone-mcp"],
"env": { "CARBONE_API_KEY": "${input:carbone-api-key}" }
}
}
}Then try: "What can Carbone do?"
Client docs: Claude Desktop · Claude Code · VS Code · Cursor
Files in and out
Hosted server: give files as HTTPS URLs or base64, or attach them in ChatGPT. A large template goes through an upload URL, for assistants that can run commands, such as Claude Code.
Local package: absolute paths too (
/Users/me/invoice.docx,~/invoice.docx). A bare name such asinvoice.docxis read as base64 and fails.Results: text and images come back in the conversation. PDF and Office files come back as a one-time download link (hosted, valid 1 hour) or a saved file (local).
Details: file inputs and output delivery.
Tools
Tool | What it does |
| Converts a file to another format; Carbone tags stay as written |
| Fills a template with JSON data, and can convert the result (to PDF, for example) |
| Returns the download link of a render started with |
| Lists a template's tags and returns a matching sample dataset. Runs one render on your account (counts as one document generation) |
| Lists stored templates, filtered by category, name or ID |
| Lists the template categories in your account |
| Lists the tags used across your templates |
| Stores a reusable template, with versions, category and tags; can return an upload URL for a large file |
| Renames, categorizes, tags, deploys or schedules the deletion of a template version |
| Deletes a template or one of its versions, immediately |
| Downloads a template's original file, or the sample data stored with it |
| Checks the Carbone API's health and version |
| Summarizes the formats, features and usage examples |
Every parameter, with examples: docs/API.md.
Writing templates
Design a template in Word, Excel, PowerPoint, LibreOffice, HTML or Markdown, and put tags where the data goes:
Dear {d.customer.name},
Your invoice total is {d.total:formatC()}.
Items:
{d.items[i].description} {d.items[i].quantity}x {d.items[i].price:formatC()}
{d.items[i+1]}{d.items[i]} … {d.items[i+1]} repeats a line for each item. Start with the basics, or give your AI assistant the Carbone Skill, a template syntax reference for AI tools (download .skill · GitHub).
Troubleshooting
Symptom | Cause and fix |
Carbone is connected, but a Claude chat does not use it | Turn it on for the chat: the + button, then Connectors, then Carbone. |
mcp.carbone.io asks you to sign in again, or sign-in fails | Reconnect: in Claude, Disconnect then Connect the connector; in Claude Code, |
Watermark on every PDF, or only PDF works | Your account has no plan (test key): it produces watermarked PDFs only. On mcp.carbone.io, start a plan at account.carbone.io (the Free plan is enough): the server switches to your production key by itself. Locally, use the production key. |
Tags such as |
|
A file given by name ( | A bare name is read as base64. Pass an absolute path (local package), a URL, or base64. |
| A file passed as base64 is too large (60 MB by default). Pass it by URL or local path; for a template, ask for an upload URL. |
Rendering by Template ID still uses the old version after an upload | Renders by Template ID use the deployed version (most recent |
Password, watermark or PDF/A missing from a PDF | PDF/A, page ranges and accessibility need the default converter |
| The Carbone API answered |
Local package: | Set |
Claude Desktop shows no Carbone tools, or the local server disconnects | Read |
You want to test the server without an AI client | Run the MCP Inspector (Node.js 22.19+): |
Security
Tool approval. Keep your client's approval prompts on for actions that change your account:
delete_templatedeletes immediately, andupdate_template_metadatacan schedule a deletion.Prompt injection. A document or template can contain instructions that trick the AI into unintended actions, such as sending data elsewhere or deleting templates. Review what your client is about to do before you confirm a tool call.
Disconnecting. Disconnect the connector (in Claude Code,
/mcp→ Clear authentication) to stop the assistant from using your account.URL inputs and local files. URLs that resolve to a private or internal address (
localhost, RFC 1918, cloud metadata) are refused unlessCARBONE_ALLOW_PRIVATE_NETWORK=true(details). Local paths are read by the local package only, where the server runs as you.Shared server key (self-hosted HTTP). With
CARBONE_API_KEYset on an HTTP server andCARBONE_REQUIRE_CLIENT_AUTH_HEADER=false(the default), every request without a Bearer key spends that key: anyone who can reach the port uses that Carbone account. The server prints a warning at startup. Never publish such a port on a network you don't fully trust, or setCARBONE_REQUIRE_CLIENT_AUTH_HEADER=trueso each client must bring its own key.Browser origins (self-hosted HTTP). A request whose
Originheader is present but not allowed gets403, so a malicious web page cannot reach a locally running server (DNS rebinding) and spend its key. List the browser-based clients you trust inMCP_ALLOWED_ORIGINS.API keys. Keep them out of version control, pass them through your client's secret input or environment, and rotate them at account.carbone.io.
Your data. Carbone stores the templates and samples you upload, and keeps a document delivered as a download link or to a webhook until it is downloaded, for 1 hour at most. For an async render, the server keeps an encrypted reference to the document for 1 hour. See the privacy policy, or run Carbone on-premise for full control.
Self-hosting
Docker
The image serves Streamable HTTP on port 3000. This quick start sets no server key: each client sends its own key in Authorization: Bearer <key> (signing in with a Carbone account is for mcp.carbone.io only), and the port is reachable from your machine only.
docker run -d --name carbone-mcp -p 127.0.0.1:3000:3000 carbone/carbone-mcp
curl http://localhost:3000/healthConnect your client with your key in the Authorization header. Claude Code:
claude mcp add --transport http carbone http://localhost:3000 --header "Authorization: Bearer your_api_key_here"VS Code (.vscode/mcp.json, which asks for the key once and stores it):
{
"inputs": [
{ "type": "promptString", "id": "carbone-api-key", "description": "Carbone API key", "password": true }
],
"servers": {
"carbone": {
"type": "http",
"url": "http://localhost:3000",
"headers": { "Authorization": "Bearer ${input:carbone-api-key}" }
}
}
}Cursor (~/.cursor/mcp.json), reading the key from your environment:
{
"mcpServers": {
"carbone": {
"url": "http://localhost:3000",
"headers": { "Authorization": "Bearer ${env:CARBONE_API_KEY}" }
}
}
}To serve other machines, publish the port behind a TLS reverse proxy, keep the server without CARBONE_API_KEY (or set CARBONE_REQUIRE_CLIENT_AUTH_HEADER=true), and list the hostnames of browser-based clients in MCP_ALLOWED_ORIGINS.
Shared-key variant, for one user on one machine. A server-level key lets clients connect without sending one. Read the shared-key warning first.
docker run -d --name carbone-mcp -p 127.0.0.1:3000:3000 -e CARBONE_API_KEY=your_api_key_here carbone/carbone-mcpDocker Compose: compose.yml builds the image from this repository, binds 127.0.0.1 only, sets no server key, and passes through every variable of .env.example. Start it with docker compose up -d. Compose also reads CARBONE_API_KEY from your shell or a .env file: if it is set there, you get the shared-key variant.
To run the image as a stdio server for Claude Desktop, see the Docker Hub page.
On-premise Carbone
If you run Carbone on-premise, point the server at your instance with CARBONE_BASE_URL; no API key is needed. For example CARBONE_BASE_URL=https://your-carbone-server.com npx carbone-mcp, or add -e CARBONE_BASE_URL=https://your-carbone-server.com to docker run.
Configuration
Variable | Default | Purpose |
| none | Your Carbone API key: required in stdio for Carbone Cloud, optional over HTTP (Security) |
|
| Carbone API URL; set it to an on-premise instance (no key needed) |
|
| Carbone API request timeout in ms; Carbone Cloud's own limit is 60 s |
|
| Largest input file read from a path, URL or base64 |
|
|
|
|
| HTTP port |
|
| HTTP endpoint path; cannot be |
|
| Largest MCP message: an HTTP body ( |
| none (localhost is always allowed) | HTTP: browser |
|
| HTTP: |
|
|
|
| none | HTTP: turns on upload URLs for large templates (details); generate with |
| none | HTTP, with |
| none | HTTP, with |
| none | Instead of |
Full descriptions: Configuration in docs/API.md.
Self-hosting troubleshooting
Symptom | Cause and fix |
Tool error | Send |
HTTP | A browser-based client served from a host other than |
HTTP | Expected: the endpoint only answers MCP |
HTTP | One MCP message is over |
| The S3 access key needs to read, write and list the bucket, or |
Upgrading from 1.x
HTTP deployments should upgrade now (security fixes): read the upgrade notes.
Contributing
Bug reports, fixes and documentation improvements are welcome. CONTRIBUTING.md covers the development setup, tests, debugging and the pull request process.
Support
Documentation: MCP server · HTTP API · Template design · OpenAPI specification
Bugs and feature requests: GitHub Issues
Questions: live chat on carbone.io (bottom-right widget) · Enterprise: contact@carbone.io
License
Apache 2.0, see LICENSE.
Available Tools
12 toolsconvert_documentConvert DocumentAInspect
Convert a file to another format, e.g. DOCX, XLSX, PPTX, HTML or Markdown to PDF, or any document to PNG. No data is merged: Carbone tags such as {d.name} stay as written (use render_document to fill them). Example: { "file": "/Users/me/report.docx", "convertTo": "pdf" }. To check a layout, convert to png: the image is returned inline (for HTML or SVG, converter "C" with formatOptions { "Scale": 2 }). Returns text and images (png, jpg, gif, webp) inline; other formats are saved to a temp file whose path is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| file | Yes | The file to convert. An absolute local path ("/Users/me/report.docx", "~/report.docx"; a bare name like "report.docx" is read as base64), an HTTPS URL, or the file as base64. Formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF; not the legacy binary DOC, XLS or PPT (re-save them as DOCX, XLSX, PPTX). | |
| failOn | No | ["IMAGE_URL_ERROR"] with converter "C": fail when an image of the HTML or SVG cannot be downloaded. | |
| convertTo | Yes | Output format, e.g. "pdf". Valid outputs depend on the input format (HTML converts to pdf or png, not xlsx; doc, xls and ppt are output only). With options: { "formatName": "pdf", "formatOptions": { ... } }. | |
| converter | No | Converter, used whenever the format changes. "L" LibreOffice (default): every format, and the only one with PDF/A, page ranges and accessibility. "I" Carbone ICE: DOCX and ODT to PDF, the fastest (keep "L" for SmartArt, complex charts, comments, form fields, equations). "O" OnlyOffice: DOCX, XLSX, PPTX to PDF. "C" Chromium: HTML and SVG to PDF, PNG, JPG, WEBP. Details: get_capabilities. | |
| outputPath | No | Local path to save the converted document to, e.g. "~/out.pdf"; returns the path and size. Never overwrites a file. | |
| reportName | No | File name without extension, taken literally (no tags), e.g. "contract". | |
| returnLink | No | If true, return a one-time download link instead of the file, for the user to open (never fetch it yourself). Exclusive with outputPath and asAttachment. | |
| hardRefresh | No | If true, run the converter even for the same format, and recompute pagination. Set automatically for PDF to PDF with formatOptions (password, watermark, PDF/A), which otherwise come back unchanged. | |
| asAttachment | No | If true, return the file itself as a base64 attachment, for any format, instead of the default (temp file or inline). | |
| egressAuthorization | No | Authorization header value Carbone sends when it fetches images or styles of the file, e.g. "Bearer abc". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, destructiveHint=false and openWorldHint=true, so the safety envelope is partly covered. The description adds genuinely useful behavior beyond that: text and png/jpg/gif/webp are returned inline while other formats go to a temp file whose path is returned, and it names egress auth for fetching images. It does not cover pagination, size limits, or failure modes for large files, so it is good but not exhaustive for an open-world conversion tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and the render_document exclusion, then output behavior, which is the right order. It is dense with parenthetical asides (the inline example JSON, the converter note) that make it slightly run-on, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Ten parameters, no output schema, and the description compensates by explaining the return contract in detail (inline vs temp file path, returnLink, asAttachment). For a conversion tool of this complexity, an agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented, which sets the baseline at 3. The description does add real value by tying parameters together — convertTo=pdf via converter C with Scale 2 for HTML, and formatOptions implying hardRefresh for PDF-to-PDF — but these cross-parameter interactions are only partially spelled out rather than systematically.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Convert a file to another format") and immediately bounds scope by naming the sibling it is not: tags such as {d.name} stay as written and "use render_document to fill them." An agent can distinguish this from render_document without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit alternatives and the conditions that select them: render_document for merging data, get_capabilities for full option lists, png conversion "to check a layout." It also specifies converter "C" with formatOptions {"Scale": 2} for HTML/SVG, which is exactly the routing decision an agent would otherwise get wrong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_templateDelete TemplateADestructiveIdempotentInspect
Delete a stored template now: a Template ID removes every version, a Version ID only that one. Confirm with the user first: it cannot be undone. To schedule a deletion instead, use update_template_metadata with expireAt.
| Name | Required | Description | Default |
|---|---|---|---|
| templateId | Yes | Template ID (every version) or Version ID (that version only), from list_templates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the description is not carrying the safety profile alone. It still adds genuinely new operational content: the confirmation requirement and the differing blast radius of the two ID kinds. It does not describe the response or error behavior, so it falls just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and its scope, then the safety precondition, then the alternate route. No filler and no repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter destructive tool with an output-free surface, the description covers effect, irreversibility, confirmation, and the alternative tool. An agent has everything needed to call it correctly and safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already documents both accepted ID kinds and the source (list_templates). The description restates the same every-version vs one-version distinction rather than adding format, validation, or lookup guidance beyond it. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (delete a stored template) and immediately disambiguates the two ID semantics: a Template ID removes every version, a Version ID only that one. This lets an agent distinguish the effect of the call without opening the schema, and the sibling pointer to update_template_metadata makes the intent contrast even sharper.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly covers when-to-use (immediate deletion), a precondition (confirm with the user first), a warning condition (cannot be undone), and a named alternative for the different case (schedule deletion via update_template_metadata with expireAt). Very little is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_templateDownload TemplateAInspect
Download a stored template's original file (DOCX, XLSX, HTML...), or with sample: true the sample dataset stored with it. Text and images come back inline; other files are saved to a temp file whose path is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| sample | No | If true, return the sample dataset stored at upload, as JSON, instead of the file; an error if there is none. | |
| outputPath | No | Local path to save the template file to, e.g. "~/out.pdf"; returns the path and size. Never overwrites a file. | |
| templateId | Yes | Template ID (its deployed version) or Version ID, from list_templates. | |
| asAttachment | No | If true, return a text or image file as a base64 attachment too. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false and destructiveHint=false, but the description adds real behavioral context beyond them: text and images are returned inline while other formats are written to a temp file whose path is returned. That return-shape disclosure is exactly what an agent needs and is not derivable from the annotations or schema. It could go further on failure modes (e.g., missing template) for a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, with the primary behavior front-loaded and the conditional sample behavior and return format following in logical order. Every clause conveys information an agent needs to choose parameters.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining returns and does so well by describing inline versus temp-file results. It leaves out error conditions and the source of templateId, but those are largely covered by the schema descriptions, so the definition is complete enough to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: it explains the default return path behavior when outputPath is absent and how the sample flag replaces the file entirely. This clarifies the interaction between outputPath, asAttachment, and the file type rather than restating field text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("Download a stored template's original file") plus the sample-dataset variant, which clearly separates it from siblings like inspect_template or list_templates. It stops short of naming a sibling or an explicit contrast case, so it sits just below the top tier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage context is limited to the sample:true variant; there is no statement of when to prefer this tool over convert_document or render_document, nor any prerequisite guidance (e.g., needing a valid templateId from list_templates). The usage that is implied is correct but inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_api_statusAPI StatusARead-onlyIdempotentInspect
Check Carbone API health and version. Returns the current API version and a status message. Useful for verifying connectivity and confirming which Carbone version is active.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| message | Yes | Status message returned by the API. |
| version | Yes | The running Carbone API version. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and a closed-world scope, so the safety profile is fully covered by structured data. The description adds only that it returns version and status, which the output schema already carries, so it contributes little beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action, then the return values, then the use case. No filler or redundancy; each sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a trivial diagnostic tool with no parameters, full annotation coverage, and a dedicated output schema, the description supplies everything an agent needs — what it checks, what it returns, and why to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The empty schema is consistent with the description, which implies a no-argument call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource combination ('Check Carbone API health and version') that is unambiguously distinct from every sibling, all of which operate on templates, categories, tags, or documents. An agent can route to it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage contexts — verifying connectivity and confirming the active Carbone version — which is clear guidance for when to call it. No alternatives or exclusions are named, but for a no-arg health check none are plausibly needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_capabilitiesCapabilitiesARead-onlyIdempotentInspect
Returns a summary of all Carbone capabilities: supported formats, features, tool usage examples, and links to full documentation. Call this first if you are unsure what Carbone can do.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, and destructiveHint=false, so the safety profile is fully covered. The description adds the orientation role ('call first') but nothing about response size, caching, or side effects beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, and the orientation cue is placed last as a directive. Every clause adds information about the return contents or the calling condition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, but the description compensates by naming the categories of content returned (formats, features, examples, doc links), which is enough for an agent to decide whether to call it. A note on response format or size would push this to a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there is no parameter semantics to document or miss. The description also does not introduce any phantom arguments.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (Returns) plus resource (Carbone capabilities) with an enumeration of what the payload contains: formats, features, usage examples, and documentation links. It is clearly a discovery tool, distinguishing it from action siblings like convert_document or render_document, though it does not name any sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the trigger: 'Call this first if you are unsure what Carbone can do.' That is a clear when-to-use condition. There is no when-not or named alternative (e.g., 'skip if you already know the format'), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_templateInspect TemplateARead-onlyIdempotentInspect
List the Carbone tags a template uses and return a sample JSON dataset matching its structure. Call it before render_document when you do not know which data a template expects. Pass templateId (a stored template) or template (local path, HTTPS URL or base64). It counts as one render on the account; {t()} tags are not listed.
| Name | Required | Description | Default |
|---|---|---|---|
| template | No | A template to inspect, not stored. An absolute local path ("/Users/me/report.docx", "~/report.docx"; a bare name like "report.docx" is read as base64), an HTTPS URL, or the file as base64. Formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF; not the legacy binary DOC, XLS or PPT (re-save them as DOCX, XLSX, PPTX). Exclusive with templateId. | |
| templateId | No | Template ID (its deployed version) or Version ID, from list_templates. Exclusive with template. |
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | Yes | The Carbone tags of the template, as written, e.g. "{d.customer.name}", "{d.items[i].label}", "{c.company}". {t()} translation tags are not listed. |
| error | No | Error reported by Carbone while inspecting; only present when there is one. |
| sample | Yes | A sample dataset matching the template structure, with placeholder values: { "data": {...}, "complement": {...} }. Pass sample.data as render_document data, and sample.complement as complement. |
| signatures | No | Signature fields found in the template; only present when there are any. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that the call counts as one render against the account's quota and that {t()} tags are excluded from the output — both are non-obvious traits that affect whether an agent should call it casually. Annotations already cover safety (readOnly, idempotent), so this added cost/limitation context is the right kind of contribution; only paging or output size behavior is left unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with what it returns and when to call it, followed by input mode and the quota caveat. No filler or restated title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description need not explain return values, and the two-parameter schema is fully documented. The remaining agent-facing concerns — when to reach for it, what it costs, and what it omits — are all covered.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the detailed format list, base64 bare-name rule, and exclusivity are already fully documented in the schema. The description's summary of templateId vs template is a useful orientation but repeats structured data rather than adding new semantics, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and two concrete outputs: lists Carbone tags used by a template and returns a sample JSON dataset matching its structure. This clearly separates it from list_tags (account-level tag listing) and render_document (actual rendering).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call it before render_document when the expected data shape is unknown, which gives both the trigger condition and the sibling it precedes. It also gives the selection rule between the two mutually exclusive input modes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesList CategoriesARead-onlyIdempotentInspect
List the template categories in use, for the category filter of list_templates or upload_template.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| categories | Yes | Template category names in use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, idempotent, non-destructive, closed-world behavior, so the safety profile is fully covered. The phrase "in use" is the only extra behavioral detail, hinting that only categories currently applied are returned rather than all defined ones. Nothing is said about ordering, counts, or what an empty result means.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the action front-loaded and the downstream purpose trailing. No filler, no restatement of the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with a full output schema and complete annotations, the description covers what it returns and why it exists. The only gap is the absence of any note on result ordering or how categories are derived, which is minor at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4 and there is nothing for the description to disambiguate. The mention of consumers relates to how the result is used, not to inputs, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List the template categories in use") and pins down what the resource is by tying it to the category filter. It is distinguishable from siblings like list_templates and list_tags, though it never explicitly contrasts with list_tags, which is the nearest lookalike.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear context of use: call this to discover valid values for the category filter of list_templates or upload_template. That is a concrete when-to-use signal, but there are no exclusions or ordering advice (e.g., whether to call this before or after list_tags).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tagsList TagsARead-onlyIdempotentInspect
List the tags in use across templates. To find the templates with a tag, call list_templates and keep the results whose tags include it.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| tags | Yes | Template tag names in use. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully covered. The description adds real context beyond them: the list reflects tags actually in use across templates rather than an exhaustive tag registry, which changes how an agent should interpret an empty result. It says nothing about ordering or pagination, but an output schema is present to cover returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both load-bearing: the first states what the tool returns, the second prevents a foreseeable misuse by naming the alternative. The primary purpose is front-loaded and there is no redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema, rich annotations and no parameters, the definition covers everything needed to invoke the tool correctly and to interpret the narrow scope of the result. The only unstated detail is whether tags are scoped per workspace/account, a minor gap given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline of 4 applies; there is no argument whose meaning needs explaining. The description correctly implies a single unfiltered call rather than suggesting any scoping inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("List the tags") plus a scope qualifier ("in use across templates") that separates it from a static tag dictionary and from the sibling list_categories. An agent can identify the resource without opening the schema, which is empty anyway.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence explicitly routes the reverse-lookup case to list_templates and explains how to post-filter its results, which is concrete when-to-use-other-tool guidance. It stops short of stating preconditions or when-not-to-use cases, but for a zero-argument reader tool the routing is the only decision that matters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesList TemplatesARead-onlyIdempotentInspect
List stored templates, with filters and pagination. Each result has an id (Template ID; null for a template uploaded with versioning: false) and a versionId: pass either as templateId to render_document, download_template or delete_template. Each result lists its tags: to find templates by tag, keep the results whose tags include it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Filter by Template ID (64-bit format, digits only). Cannot be a Version ID. | |
| limit | No | 1 to 100 results (default 100); use cursor for more. | |
| cursor | No | The nextCursor of the previous response. | |
| origin | No | Upload origin: 0 API (this server), 1 Carbone Studio, 2 Salesforce, 3 Odoo, 4 HubSpot. | |
| search | No | Fuzzy search in template names, or exact match on Template ID / Version ID. | |
| category | No | Filter by category (e.g. "invoices", "legal"). | |
| versionId | No | Filter by Version ID (SHA-256 format). | |
| includeVersions | No | If true, returns all versions for each template. Default: false (only deployed version). |
Output Schema
| Name | Required | Description |
|---|---|---|
| hasMore | Yes | Whether more results are available via the cursor. |
| templates | Yes | The matching templates (all fields). |
| nextCursor | No | Cursor to pass to the next list_templates call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover readOnly, idempotent, non-destructive, and closed-world, so the bar is lower, and the description still adds real behavior: an id can be null when a template was uploaded with versioning: false, forcing the agent to fall back to versionId. It also flags that tags are returned per result and must be filtered by the caller, which is genuinely useful non-obvious behavior. Default-to-deployed-version behavior is only in the schema, not the description.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose and then chaining advice, with no filler. Density is slightly high in the second sentence, where 'id' and 'versionId' versus the downstream 'templateId' argument require careful reading, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, yet the description still highlights the two result fields that matter operationally (id can be null, tags must be filtered locally). Pagination is covered by the schema's cursor/limit descriptions, so the definition is complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already fully documented and the baseline 3 applies. The description clarifies how the returned id/versionId map onto the templateId argument of sibling tools, which is a useful cross-tool clarification, but it says nothing about origin, category, search, or includeVersions beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific verb and resource (list stored templates) plus the two axes it supports (filters, pagination). It does not distinguish itself from the sibling list tools (list_categories, list_tags) or state when to prefer inspect_template, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete downstream routing: whatever id or versionId comes back should be passed as templateId to render_document, download_template, or delete_template, and it explains the tag-filtering workaround (filter client-side, since no tag parameter exists). It never states when to use this versus inspect_template or the other list endpoints, so usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_documentGenerate DocumentAInspect
Generate a document (PDF, DOCX, XLSX, PPTX, ...) by merging JSON data into a Carbone template. Pass templateId for a stored template, or template (local path, HTTPS URL or base64) for a one-off render. To change the format of a file without data, use convert_document; unsure which data a template expects, call inspect_template first. Returns text and images (png, jpg, gif, webp) inline; other formats are saved to a temp file whose path is returned. Batches need a webhookUrl the user provides; otherwise render one document per call.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | JSON for the {d.…} tags: an object, a top-level array, or a reference to a JSON file (local path, HTTPS URL or base64). Omitted: every tag renders empty; to keep tags as written, use keepTags. Tag syntax: the Carbone Skill. | |
| enum | No | Labels for :convEnum(TYPE), e.g. { "STATUS": { "1": "Active" } }, or a reference to a JSON file. | |
| lang | No | Locale for {t()} translations, :formatN and :formatC, e.g. "fr-fr", "en-us". | |
| failOn | No | ["IMAGE_URL_ERROR"]: fail when an image URL cannot be downloaded, instead of showing a placeholder. | |
| keepTags | No | If true, skip templating: tags stay as written, to proof a template's layout. Exclusive with data. | |
| template | No | A one-off template, not stored. An absolute local path ("/Users/me/report.docx", "~/report.docx"; a bare name like "report.docx" is read as base64), an HTTPS URL, or the file as base64. Formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF; not the legacy binary DOC, XLS or PPT (re-save them as DOCX, XLSX, PPTX). To reuse one, upload_template then pass templateId. Exclusive with templateId. | |
| timezone | No | IANA time zone for :formatD dates, e.g. "America/New_York". Default "Europe/Paris". | |
| convertTo | No | Output format, e.g. "pdf". Omitted: the template's own format. Valid outputs depend on the input format (HTML converts to pdf or png, not xlsx; doc, xls and ppt are output only). With options: { "formatName": "pdf", "formatOptions": { ... } }. | |
| converter | No | Converter, used whenever the format changes. "L" LibreOffice (default): every format, and the only one with PDF/A, page ranges and accessibility. "I" Carbone ICE: DOCX and ODT to PDF, the fastest (keep "L" for SmartArt, complex charts, comments, form fields, equations). "O" OnlyOffice: DOCX, XLSX, PPTX to PDF. "C" Chromium: HTML and SVG to PDF, PNG, JPG, WEBP. Details: get_capabilities. | |
| complement | No | Extra data for {c.…} tags (company details, constants), or a reference to a JSON file. | |
| outputPath | No | Local path to save the generated document to, e.g. "~/out.pdf"; returns the path and size. Never overwrites a file. | |
| reportName | No | File name without extension; may use tags, e.g. "invoice-{d.id}" (taken literally with keepTags). | |
| returnLink | No | If true, return a one-time download link instead of the file, for the user to open (never fetch it yourself). Exclusive with outputPath and asAttachment. | |
| templateId | No | A stored template, from list_templates or upload_template (never guess one): its Template ID (digits, renders the deployed version) or a Version ID (64 hex characters, pins that version). Exclusive with template. | |
| webhookUrl | No | Only an endpoint the user owns and gives you: Carbone POSTs { "success": true, "data": { "renderId" } } to it when the document is ready, and that server downloads it once. This call then returns no document. | |
| batchOutput | No | Batch result: "zip" (default, named after reportName, or batch.zip without one) or "pdf", one concatenated PDF (needs convertTo "pdf"). | |
| hardRefresh | No | If true, recompute pagination and the table of contents after rendering. Needs convertTo. | |
| variableStr | No | Aliases for the whole template, e.g. "{#buyer = d.order.customer}", then {$buyer.name} in it. | |
| asAttachment | No | If true, return the file itself as a base64 attachment, for any format, instead of the default (temp file or inline). | |
| batchSplitBy | No | One document per item of an array: "d" when data is the array, "d.items" for a child array; at most 100. Needs a webhookUrl the user provides. | |
| translations | No | Strings for {t(key)}, selected by lang: { "fr-fr": { "hello": "Bonjour" } }, or a reference to a JSON file. | |
| currencyRates | No | Rates per currency, base 1: { "EUR": 1, "USD": 1.08 }, or a reference to a JSON file. | |
| currencySource | No | ISO 4217 currency of the amounts in data, for :formatC. Set with currencyTarget and currencyRates. | |
| currencyTarget | No | ISO 4217 currency to convert the amounts to. | |
| webhookHeaders | No | Headers Carbone sends to webhookUrl, e.g. { "authorization": "secret" }. | |
| batchReportName | No | Name of each file in the batch ZIP, without extension; tags resolve per item, e.g. "invoice-{d.id}". | |
| egressAuthorization | No | Authorization header value Carbone sends when it fetches images, PDFs or the webhook while rendering. | |
| preReleaseFeatureIn | No | Turn on Carbone pre-release features up to this version tag, e.g. 5000000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, destructiveHint=false and idempotentHint=false, so the safety profile is covered. The description still adds real value with non-obvious behavior: text and images (png/jpg/gif/webp) return inline while other formats land in a temp file, and webhook batches return no document. That said, the "never overwrites" and "never fetch the link yourself" safeguards live in the schema, so the description's independent contribution is moderate rather than rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Five dense sentences with zero filler, front-loading purpose, then the template-selection rule, then sibling disambiguation, then return behavior, then the batch constraint. Each sentence carries a distinct decision the caller needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 28 parameters, nested objects and no output schema, the description fills the most important gap by explaining what comes back (inline media vs. temp file path, webhook batches returning nothing). It stops short of covering failure modes or the auth/timeout implications of egressAuthorization and preReleaseFeatureIn, but for a render tool whose parameter documentation is complete, this is close to sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each of the 28 parameters carries a detailed description, so the baseline is 3. The prose restates the template/templateId exclusivity already documented in the schema and does not explain the many rendering parameters (convertTo, converter, keepTags, batchSplitBy, currency*, egressAuthorization), leaving that meaning entirely to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource plus the mechanism: "Generate a document (PDF, DOCX, XLSX, PPTX, ...) by merging JSON data into a Carbone template." It then immediately separates the two mutually exclusive entry paths (templateId vs. template), so an agent can distinguish this from siblings like convert_document or inspect_template without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use convert_document to change a file's format without data, call inspect_template first when the expected data shape is unknown, and upload_template to reuse a one-off template. It also states a hard precondition for batching ("Batches need a webhookUrl the user provides; otherwise render one document per call"), which prevents a common misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_template_metadataUpdate Template MetadataADestructiveIdempotentInspect
Change ONE template version: name, comment, category, tags, deployment (deployedAt), scheduled deletion (expireAt), or the Template ID it belongs to (moveToTemplateId). A Template ID patches its deployed version; a Version ID, that exact version. To delete now, use delete_template.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name (max 200 characters). | |
| tags | No | New tags, replacing the current ones: sorted, deduplicated, 100 characters in all. | |
| comment | No | New comment (max 200 characters). | |
| category | No | New category (max 200 characters). | |
| expireAt | No | Delete this version at this UTC Unix time (seconds); 0 cancels a scheduled deletion. | |
| deployedAt | No | 42000000000 deploys this version now: renders by Template ID use the most recently deployed version. | |
| templateId | Yes | The version to change: a Version ID, or a Template ID for its deployed version. | |
| moveToTemplateId | No | Only when the user asks to move a version: moves it to this other Template ID (digits). Not the template to change (that is templateId). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Template ID the version now belongs to (returned when moveToTemplateId was used). |
| name | No | Name, returned if updated. |
| tags | No | Tags, returned if updated. |
| comment | No | Comment, returned if updated. |
| category | No | Category, returned if updated. |
| expireAt | No | Deletion timestamp (0 = never expires), returned if updated. |
| versionId | Yes | Version ID of the patched version. |
| deployedAt | No | Deployment timestamp, returned if updated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and readOnlyHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the scope limit of one version per call, the deployedAt semantics that renders by Template ID pick the most recently deployed version, and that expireAt=0 cancels a scheduled deletion. It does not state partial-update semantics (are omitted fields left untouched?) or that moving a version into another template is a structural, non-trivial change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the enumerable field list comes first, then the identifier resolution rule and the deletion alternative. The capitalized 'ONE' and the parenthetical hints do real routing work rather than padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter mutation tool with full schema coverage, full annotations and an output schema (so return values needn't be described), the description is nearly complete. The main remaining gap is whether unspecified fields stay unchanged and any conflict behavior between moveToTemplateId and the other metadata edits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented, including the templateId overload and the moveToTemplateId caveat. The description largely restates that mapping rather than adding new semantics (no format, no conflict/precedence rules when both a move and a rename are supplied), so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Change ONE template version') and enumerates exactly which fields it can change (name, comment, category, tags, deployedAt, expireAt, moveToTemplateId). The sibling delete_template is named as the alternative, so the agent can distinguish mutation-of-metadata from deletion without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit routing rule for the ambiguous identifier: a Template ID patches its deployed version, a Version ID patches that exact version. It also explicitly excludes the destructive case ('To delete now, use delete_template') and warns that moveToTemplateId is not the template being changed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_templateUpload TemplateAInspect
Store a reusable template, then render it with render_document and its Template ID. Returns id (Template ID) and versionId. A new version of an existing template (id) is used by renders only once deployed (deployedAt).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Template ID (digits) to add this upload to as a new version; omitted: a new template. Never a Version ID. | |
| name | No | Display name, shown and searched by list_templates (max 200 characters). | |
| tags | No | Labels, e.g. ["sales", "billing"]: sorted, deduplicated, 100 characters in all. | |
| sample | No | A sample dataset stored with the template, at most one: [{ "data": { "name": "Acme" } }]. | |
| comment | No | Comment on this version (max 200 characters). | |
| category | No | Category, e.g. "invoices" (max 200 characters). | |
| expireAt | No | Delete the template at this UTC Unix time (seconds); 0 (default) never. To delete now, use delete_template. | |
| template | Yes | The template file. An absolute local path ("/Users/me/report.docx", "~/report.docx"; a bare name like "report.docx" is read as base64), an HTTPS URL, or the file as base64. Formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF; not the legacy binary DOC, XLS or PPT (re-save them as DOCX, XLSX, PPTX). | |
| deployedAt | No | 42000000000 deploys this version now: renders by Template ID use the most recently deployed version. | |
| versioning | No | Leave true (default). false is legacy: no Template ID, only a SHA-256 templateId. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Stable Template ID (when versioning is enabled). |
| name | No | Template display name, when one was given. |
| size | No | Template size in bytes. |
| type | No | Detected template file type. |
| headers | No | requestUploadUrl only: the headers to send with the file. |
| createdAt | No | UTC Unix timestamp (seconds) of the upload. |
| expiresAt | No | requestUploadUrl only: UTC Unix timestamp after which the URL is refused. |
| uploadUrl | No | requestUploadUrl only: where to POST the file. The template does not exist yet. |
| versionId | No | Version ID (SHA-256) of this uploaded version. |
| deployedAt | No | UTC Unix timestamp of deployment; 0 means this version is not explicitly deployed. |
| templateId | No | versioning: false only: the Version ID (SHA-256) of the upload, not a Template ID. |
| templateExtension | No | Detected file extension, e.g. "docx" (legacy/non-versioned mode). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare non-read-only, open-world, non-idempotent, and non-destructive behavior. The description adds meaningful behavioral context by noting that a new version is not used by renders until deployed via deployedAt, though it omits permission and error details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences are front-loaded with the primary action and downstream use, with no obvious padding. The return-value sentence is slightly redundant given the output schema, but the description remains compact and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a ten-parameter upload tool with full schema coverage and an output schema, the description covers the core create/version/deploy workflow. Details such as required template format and omit-id behavior are left appropriately to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all ten parameters are already well documented, including id, deployedAt, and versioning. The description reinforces the id/deployedAt relationship and Template ID return value but adds little parameter meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: "Store a reusable template," and connects it to render_document via Template ID. It clearly distinguishes upload_template from render_document and list_templates, though it does not explicitly contrast with update_template_metadata.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names render_document as the downstream step and explains using id to add a new version, which gives useful context. However, it does not explicitly say when to choose upload_template over update_template_metadata or convert_document, so usage is mostly implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v2.2.0- Changed
convert_document11 fields changed- changed
Input schema / properties / asAttachment / descriptionPrevious value: -"If true, return the document as a downloadable file attachment (a base64 EmbeddedResource), for any format. Default delivery: text and png/jpg/gif/webp are returned inline; other binary outputs (PDF, Office, …) are saved to a temp file (path returned). Ignored when outputPath or returnLink is set."New value: +"If true, return the file itself as a base64 attachment, for any format, instead of the default (temp file or inline)." - changed
Input schema / properties / convertTo / anyOfPrevious value: -[ - { - "enum": [ - "pdf", - "docx", - "doc", - "odt", - "ott", - "rtf", - "epub", - "xlsx", - "xls", - "ods", - "ots", - "csv", - "dbf", - "dif", - "pptx", - "ppt", - "odp", - "otp", - "odg", - "html", - "xhtml", - "txt", - "md", - "xml", - "idml", - "png", - "jpg", - "jpeg", - "webp", - "gif", - "tiff", - "bmp", - "svg", - "emf", - "wmf", - "eps" - ], - "type": "string" - }, - { - "properties": { - "formatName": { - "description": "Target format name.", - "enum": [ - "pdf", - "docx", - "doc", - "odt", - "ott", - "rtf", - "epub", - "xlsx", - "xls", - "ods", - "ots", - "csv", - "dbf", - "dif", - "pptx", - "ppt", - "odp", - "otp", - "odg", - "html", - "xhtml", - "txt", - "md", - "xml", - "idml", - "png", - "jpg", - "jpeg", - "webp", - "gif", - "tiff", - "bmp", - "svg", - "emf", - "wmf", - "eps" - ], - "type": "string" - }, - "formatOptions": { - "additionalProperties": {}, - "description": "Format-specific options. Examples: PDF password: { \"EncryptFile\": true, \"DocumentOpenPassword\": \"s3cr3t\" }; PDF permissions: { \"RestrictPermissions\": true, \"PermissionPassword\": \"owner\" }; PDF watermarks (max 4): { \"Watermarks\": [{ \"text\": \"DRAFT\", \"size\": 60, \"opacity\": 0.2, \"rotation\": -45 }] }; PDF/A (L only): { \"SelectPdfVersion\": 2 } (2 = PDF/A-2b, 3 = PDF/A-3b, 4 = PDF/A-4); page selection (L only): { \"PageRange\": \"1-5\" }; accessibility (L only): { \"UseTaggedPDF\": true, \"PDFUACompliance\": true }; JPG/PNG: { \"PixelWidth\": 1200, \"PixelHeight\": 630 }, JPG quality: { \"Quality\": 80 } (1-100); CSV: { \"fieldSeparator\": \";\" }. All options: https://carbone.io/documentation/developer/http-api/generate-reports.html#pdf-options", - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "formatName" - ], - "type": "object" - } -]New value: +[ + { + "enum": [ + "pdf", + "docx", + "doc", + "odt", + "ott", + "rtf", + "epub", + "xlsx", + "xls", + "ods", + "ots", + "csv", + "dbf", + "dif", + "pptx", + "ppt", + "odp", + "otp", + "odg", + "html", + "xhtml", + "txt", + "md", + "xml", + "idml", + "png", + "jpg", + "jpeg", + "webp", + "gif", + "tiff", + "bmp", + "svg", + "emf", + "wmf", + "eps" + ], + "type": "string" + }, + { + "properties": { + "formatName": { + "description": "Same values as the string form.", + "type": "string" + }, + "formatOptions": { + "additionalProperties": {}, + "description": "PDF: { \"EncryptFile\": true, \"DocumentOpenPassword\": \"s3cr3t\" }, { \"Watermarks\": [{ \"text\": \"DRAFT\", \"opacity\": 0.2 }] }, PDF/A { \"SelectPdfVersion\": 2 } or { \"PageRange\": \"1-5\" } (converter \"L\"). Images: { \"PixelWidth\": 1200, \"Scale\": 2, \"Quality\": 80 }. CSV: { \"fieldSeparator\": \";\" }. All options: get_capabilities.", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "formatName" + ], + "type": "object" + } +] - changed
Input schema / properties / convertTo / descriptionPrevious value: -"Target output format. Valid outputs depend on the input format (e.g. HTML converts to pdf, docx or png, but not xlsx); see the conversion matrix: https://carbone.io/documentation/developer/http-api/generate-reports.html#output-file-type. \"doc\", \"xls\" and \"ppt\" are output formats; as input, use DOCX, XLSX or PPTX. Simple usage: \"pdf\". With options: { \"formatName\": \"pdf\", \"formatOptions\": { ... } }."New value: +"Output format, e.g. \"pdf\". Valid outputs depend on the input format (HTML converts to pdf or png, not xlsx; doc, xls and ppt are output only). With options: { \"formatName\": \"pdf\", \"formatOptions\": { ... } }." - changed
Input schema / properties / converter / descriptionPrevious value: -"Converter engine, used whenever the format changes (not only for PDF). If omitted, \"L\" is used. \"L\" LibreOffice: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, MD, PDF; the only converter supporting all PDF options. \"I\" Carbone ICE: DOCX and ODT to PDF; Carbone's own engine, 3x to 300x faster, recommended over \"O\" for DOCX from v5.15.0. It converts all content except WEBP and EMF/WMF images, SmartArt and complex charts (bar, line, area, pie and doughnut charts are drawn), comments, tracked changes, form fields and equations: keep the default \"L\" for documents with those. A missing font is replaced by Noto Sans (https://carbone.io/documentation/developer/http-api/generate-reports.html#converters-carbone-ice-limitations). \"O\" OnlyOffice: DOCX, XLSX, PPTX to PDF. \"C\" Chromium: HTML to PDF, JPG, PNG, WEBP with full CSS/JS; 100 MB max. PDF options: \"L\" supports all of them; \"O\", \"C\" and \"I\" apply Security (passwords, permissions) and Watermarks. Docs: https://carbone.io/documentation/developer/http-api/generate-reports.html#converters"New value: +"Converter, used whenever the format changes. \"L\" LibreOffice (default): every format, and the only one with PDF/A, page ranges and accessibility. \"I\" Carbone ICE: DOCX and ODT to PDF, the fastest (keep \"L\" for SmartArt, complex charts, comments, form fields, equations). \"O\" OnlyOffice: DOCX, XLSX, PPTX to PDF. \"C\" Chromium: HTML and SVG to PDF, PNG, JPG, WEBP. Details: get_capabilities." - changed
Input schema / properties / egressAuthorization / descriptionPrevious value: -"Value for the Authorization header Carbone adds to its OUTBOUND (egress) requests during conversion — e.g. when a Chromium HTML→PDF conversion fetches a protected external image or stylesheet. For example \"Bearer abc123\" makes Carbone send `authorization: Bearer abc123` to those hosts. Only the authorization header can be customised; max 511 characters."New value: +"Authorization header value Carbone sends when it fetches images or styles of the file, e.g. \"Bearer abc\"." - added
Input schema / properties / failOnAdded value: +{ + "description": "[\"IMAGE_URL_ERROR\"] with converter \"C\": fail when an image of the HTML or SVG cannot be downloaded.", + "items": { + "enum": [ + "IMAGE_URL_ERROR" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / file / descriptionPrevious value: -"The document to convert. Three input forms are accepted: (1) Local file path — absolute, e.g. \"/Users/me/report.docx\" (or \"C:\\Users\\me\\report.docx\" on Windows), or under the home directory, e.g. \"~/report.docx\". A relative path must start with \"./\" or \"../\" and resolves against the server process's working directory, which is rarely yours: prefer an absolute path. A bare file name such as \"report.docx\" is NOT a path: it would be sent as base64 content. (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. Supported input formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF. Carbone reads XML-based and text-based documents (plus PDF): the legacy binary Office formats DOC, XLS and PPT are rejected as input, although they are valid outputs. Re-save such a file as DOCX, XLSX or PPTX first. Full conversion matrix: https://carbone.io/documentation/developer/http-api/generate-reports.html#output-file-type"New value: +"The file to convert. An absolute local path (\"/Users/me/report.docx\", \"~/report.docx\"; a bare name like \"report.docx\" is read as base64), an HTTPS URL, or the file as base64. Formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF; not the legacy binary DOC, XLS or PPT (re-save them as DOCX, XLSX, PPTX)." - changed
Input schema / properties / hardRefresh / descriptionPrevious value: -"If true, Carbone runs the converter even when the output format equals the input format, and recomputes pagination and the table of contents at the end of the conversion. Needed for PDF → PDF: without it Carbone returns the PDF unchanged and formatOptions (password, permissions, watermarks, PDF/A, …) are NOT applied. This server sets it automatically when the input is a PDF, convertTo is \"pdf\" and formatOptions are given; pass false to opt out. Example (PDF → PDF/A-4): { \"hardRefresh\": true, \"convertTo\": { \"formatName\": \"pdf\", \"formatOptions\": { \"SelectPdfVersion\": 4 } } }."New value: +"If true, run the converter even for the same format, and recompute pagination. Set automatically for PDF to PDF with formatOptions (password, watermark, PDF/A), which otherwise come back unchanged." - changed
Input schema / properties / outputPath / descriptionPrevious value: -"Optional local file path to save the converted document to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files. The path must not exist yet: an existing file is never overwritten (the call fails and asks for a new file name)."New value: +"Local path to save the converted document to, e.g. \"~/out.pdf\"; returns the path and size. Never overwrites a file." - changed
Input schema / properties / reportName / descriptionPrevious value: -"Name of the delivered file, WITHOUT extension (e.g. \"contract\", \"2026-invoice\"). The document is delivered as \"<reportName>.<ext>\", with the extension of convertTo, used as the attachment name and the default saved file name. This server names the file itself: a conversion has no templating pass, which is where Carbone resolves reportName. Used literally: Carbone tags such as {d.id} are not resolved here. Ignored with returnLink (a download URL, not a named file) and with outputPath (which sets the path itself)."New value: +"File name without extension, taken literally (no tags), e.g. \"contract\"." - changed
Input schema / properties / returnLink / descriptionPrevious value: -"If true, generate the document and return a public download URL instead of the file contents. The link is SHORT-LIVED and ONE-TIME — Carbone deletes the file after the first download — so it is meant for the end user to download once (do not fetch it programmatically). Works in stdio and HTTP. Mutually exclusive with outputPath and asAttachment."New value: +"If true, return a one-time download link instead of the file, for the user to open (never fetch it yourself). Exclusive with outputPath and asAttachment."
- Changed
delete_template1 field changed- changed
Input schema / properties / templateId / descriptionPrevious value: -"Template ID (64-bit) or Version ID (SHA-256) to delete. Template ID — deletes the template record and all its versions. Version ID — deletes only that specific version, leaving other versions intact. Both formats are returned by upload_template and list_templates."New value: +"Template ID (every version) or Version ID (that version only), from list_templates."
- Changed
download_template4 fields changed- changed
Input schema / properties / asAttachment / descriptionPrevious value: -"If true, return the template as a downloadable file attachment (base64 resource) instead of inline text/image. Useful in HTTP mode where outputPath is unavailable. Default: false. Ignored when outputPath is set."New value: +"If true, return a text or image file as a base64 attachment too." - changed
Input schema / properties / outputPath / descriptionPrevious value: -"Optional local file path to save the template file to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files. The path must not exist yet: an existing file is never overwritten (the call fails and asks for a new file name)."New value: +"Local path to save the template file to, e.g. \"~/out.pdf\"; returns the path and size. Never overwrites a file." - changed
Input schema / properties / sample / descriptionPrevious value: -"If true, download the JSON SAMPLE DATASET saved with the template (the \"sample\" array passed to upload_template) instead of the template file, returned as inline JSON text by default, of the form [{ \"data\": {...}, \"complement\": {...}, \"translations\": {...}, \"enum\": {...} }] (each key optional). Use it to recover the example data a template expects before calling render_document. Errors if the template was uploaded without a sample."New value: +"If true, return the sample dataset stored at upload, as JSON, instead of the file; an error if there is none." - changed
Input schema / properties / templateId / descriptionPrevious value: -"Template ID (64-bit) or Version ID (SHA-256) to download. Template ID — downloads the currently deployed version of the template. Version ID — downloads that exact version regardless of deployment status. Both formats are returned by upload_template and list_templates."New value: +"Template ID (its deployed version) or Version ID, from list_templates."
- Changed
inspect_template2 fields changed- changed
Input schema / properties / template / descriptionPrevious value: -"Inline template to inspect, without storing it. Three input forms are accepted: (1) Local file path — absolute, e.g. \"/Users/me/report.docx\" (or \"C:\\Users\\me\\report.docx\" on Windows), or under the home directory, e.g. \"~/report.docx\". A relative path must start with \"./\" or \"../\" and resolves against the server process's working directory, which is rarely yours: prefer an absolute path. A bare file name such as \"report.docx\" is NOT a path: it would be sent as base64 content. (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. Supported input formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF. Carbone reads XML-based and text-based documents (plus PDF): the legacy binary Office formats DOC, XLS and PPT are rejected as input, although they are valid outputs. Re-save such a file as DOCX, XLSX or PPTX first. Mutually exclusive with templateId — provide exactly one, never both."New value: +"A template to inspect, not stored. An absolute local path (\"/Users/me/report.docx\", \"~/report.docx\"; a bare name like \"report.docx\" is read as base64), an HTTPS URL, or the file as base64. Formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF; not the legacy binary DOC, XLS or PPT (re-save them as DOCX, XLSX, PPTX). Exclusive with templateId." - changed
Input schema / properties / templateId / descriptionPrevious value: -"The ID of a stored template to inspect. Two ID formats are accepted: (1) Template ID (64-bit) — the deployed version is inspected. (2) Version ID (SHA-256) — that exact version is inspected. Both are returned by upload_template and list_templates. Mutually exclusive with template — provide exactly one, never both."New value: +"Template ID (its deployed version) or Version ID, from list_templates. Exclusive with template."
- Changed
list_templates7 fields changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"Pagination cursor from the previous response nextCursor field. Use to fetch the next page."New value: +"The nextCursor of the previous response." - changed
Input schema / properties / id / descriptionPrevious value: -"Filter by Template ID (64-bit format). Cannot be a Version ID."New value: +"Filter by Template ID (64-bit format, digits only). Cannot be a Version ID." - added
Input schema / properties / id / patternAdded value: +"^\\d+$" - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results to return, between 1 and 100 (Carbone API limit). Default: 100. Use cursor to page beyond that."New value: +"1 to 100 results (default 100); use cursor for more." - changed
Input schema / properties / origin / descriptionPrevious value: -"Filter by upload origin: 0 = API, 1 = Carbone Studio, 2 = Salesforce integration, 3 = Odoo integration, 4 = HubSpot integration. Templates uploaded through this MCP server are origin 0."New value: +"Upload origin: 0 API (this server), 1 Carbone Studio, 2 Salesforce, 3 Odoo, 4 HubSpot." - removed
Input schema / properties / origin / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / origin / minimumRemoved value: --9007199254740991
- Changed
render_document31 fields changed- changed
Input schema / properties / asAttachment / descriptionPrevious value: -"If true, return the document as a downloadable file attachment (a base64 EmbeddedResource), for any format. Default delivery: text and png/jpg/gif/webp are returned inline; other binary outputs (PDF, Office, …) are saved to a temp file (path returned). Ignored when outputPath or returnLink is set."New value: +"If true, return the file itself as a base64 attachment, for any format, instead of the default (temp file or inline)." - changed
Input schema / properties / batchOutput / descriptionPrevious value: -"Batch result type, with batchSplitBy. \"zip\" (default): an archive of all generated documents. \"pdf\": the generated PDFs concatenated into one file; requires convertTo \"pdf\"."New value: +"Batch result: \"zip\" (default, named after reportName, or batch.zip without one) or \"pdf\", one concatenated PDF (needs convertTo \"pdf\")." - changed
Input schema / properties / batchReportName / descriptionPrevious value: -"Name of each file inside the batch ZIP, WITHOUT extension (Carbone appends it). Carbone tags are resolved against each batch item, e.g. \"invoice-{d.id}\". Ignored when batchOutput is \"pdf\". From v5.14, an index is appended to every file as soon as two names collide (invoice_1.pdf, invoice_2.pdf). Requires batchSplitBy."New value: +"Name of each file in the batch ZIP, without extension; tags resolve per item, e.g. \"invoice-{d.id}\"." - changed
Input schema / properties / batchSplitBy / descriptionPrevious value: -"Batch generation: one document per object of an array. Use \"d\" when data itself is an array, or \"d.items\" for a direct child array of data. Requires webhookUrl (batch is always asynchronous: the result goes to the webhook, not to this tool). At most 100 objects on Carbone Cloud. Combine with batchOutput and batchReportName. Docs: https://carbone.io/documentation/developer/http-api/generate-reports.html#batch-processing"New value: +"One document per item of an array: \"d\" when data is the array, \"d.items\" for a child array; at most 100. Needs a webhookUrl the user provides." - changed
Input schema / properties / complement / descriptionPrevious value: -"Extra data object accessible in templates with {c.field} tags (as opposed to {d.field} for main data). Useful for static or shared values that should not be mixed into the main dataset: company info, logo URLs, footer text, configuration constants. Example: { \"company\": \"Acme Corp\", \"address\": \"123 Main St\", \"vatNumber\": \"FR12345\" }. Like data, may instead be passed by reference as a string — a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string."New value: +"Extra data for {c.…} tags (company details, constants), or a reference to a JSON file." - changed
Input schema / properties / convertTo / anyOfPrevious value: -[ - { - "enum": [ - "pdf", - "docx", - "doc", - "odt", - "ott", - "rtf", - "epub", - "xlsx", - "xls", - "ods", - "ots", - "csv", - "dbf", - "dif", - "pptx", - "ppt", - "odp", - "otp", - "odg", - "html", - "xhtml", - "txt", - "md", - "xml", - "idml", - "png", - "jpg", - "jpeg", - "webp", - "gif", - "tiff", - "bmp", - "svg", - "emf", - "wmf", - "eps" - ], - "type": "string" - }, - { - "properties": { - "formatName": { - "description": "Target format name.", - "enum": [ - "pdf", - "docx", - "doc", - "odt", - "ott", - "rtf", - "epub", - "xlsx", - "xls", - "ods", - "ots", - "csv", - "dbf", - "dif", - "pptx", - "ppt", - "odp", - "otp", - "odg", - "html", - "xhtml", - "txt", - "md", - "xml", - "idml", - "png", - "jpg", - "jpeg", - "webp", - "gif", - "tiff", - "bmp", - "svg", - "emf", - "wmf", - "eps" - ], - "type": "string" - }, - "formatOptions": { - "additionalProperties": {}, - "description": "Format-specific options. Examples: PDF password: { \"EncryptFile\": true, \"DocumentOpenPassword\": \"s3cr3t\" }; PDF permissions: { \"RestrictPermissions\": true, \"PermissionPassword\": \"owner\" }; PDF watermarks (max 4): { \"Watermarks\": [{ \"text\": \"DRAFT\", \"size\": 60, \"opacity\": 0.2, \"rotation\": -45 }] }; PDF/A (L only): { \"SelectPdfVersion\": 2 } (2 = PDF/A-2b, 3 = PDF/A-3b, 4 = PDF/A-4); page selection (L only): { \"PageRange\": \"1-5\" }; accessibility (L only): { \"UseTaggedPDF\": true, \"PDFUACompliance\": true }; JPG/PNG: { \"PixelWidth\": 1200, \"PixelHeight\": 630 }, JPG quality: { \"Quality\": 80 } (1-100); CSV: { \"fieldSeparator\": \";\" }. All options: https://carbone.io/documentation/developer/http-api/generate-reports.html#pdf-options", - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "formatName" - ], - "type": "object" - } -]New value: +[ + { + "enum": [ + "pdf", + "docx", + "doc", + "odt", + "ott", + "rtf", + "epub", + "xlsx", + "xls", + "ods", + "ots", + "csv", + "dbf", + "dif", + "pptx", + "ppt", + "odp", + "otp", + "odg", + "html", + "xhtml", + "txt", + "md", + "xml", + "idml", + "png", + "jpg", + "jpeg", + "webp", + "gif", + "tiff", + "bmp", + "svg", + "emf", + "wmf", + "eps" + ], + "type": "string" + }, + { + "properties": { + "formatName": { + "description": "Same values as the string form.", + "type": "string" + }, + "formatOptions": { + "additionalProperties": {}, + "description": "PDF: { \"EncryptFile\": true, \"DocumentOpenPassword\": \"s3cr3t\" }, { \"Watermarks\": [{ \"text\": \"DRAFT\", \"opacity\": 0.2 }] }, PDF/A { \"SelectPdfVersion\": 2 } or { \"PageRange\": \"1-5\" } (converter \"L\"). Images: { \"PixelWidth\": 1200, \"Scale\": 2, \"Quality\": 80 }. CSV: { \"fieldSeparator\": \";\" }. All options: get_capabilities.", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "formatName" + ], + "type": "object" + } +] - changed
Input schema / properties / convertTo / descriptionPrevious value: -"Output format. If omitted, the output keeps the template format. Valid outputs depend on the input format (e.g. HTML converts to pdf, docx or png, but not xlsx); see the conversion matrix: https://carbone.io/documentation/developer/http-api/generate-reports.html#output-file-type. \"doc\", \"xls\" and \"ppt\" are output formats; as input, use DOCX, XLSX or PPTX. Simple usage: \"pdf\". With options: { \"formatName\": \"pdf\", \"formatOptions\": { ... } }."New value: +"Output format, e.g. \"pdf\". Omitted: the template's own format. Valid outputs depend on the input format (HTML converts to pdf or png, not xlsx; doc, xls and ppt are output only). With options: { \"formatName\": \"pdf\", \"formatOptions\": { ... } }." - changed
Input schema / properties / converter / descriptionPrevious value: -"Converter engine, used whenever the format changes (not only for PDF). If omitted, \"L\" is used. \"L\" LibreOffice: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, MD, PDF; the only converter supporting all PDF options. \"I\" Carbone ICE: DOCX and ODT to PDF; Carbone's own engine, 3x to 300x faster, recommended over \"O\" for DOCX from v5.15.0. It converts all content except WEBP and EMF/WMF images, SmartArt and complex charts (bar, line, area, pie and doughnut charts are drawn), comments, tracked changes, form fields and equations: keep the default \"L\" for documents with those. A missing font is replaced by Noto Sans (https://carbone.io/documentation/developer/http-api/generate-reports.html#converters-carbone-ice-limitations). \"O\" OnlyOffice: DOCX, XLSX, PPTX to PDF. \"C\" Chromium: HTML to PDF, JPG, PNG, WEBP with full CSS/JS; 100 MB max. PDF options: \"L\" supports all of them; \"O\", \"C\" and \"I\" apply Security (passwords, permissions) and Watermarks. Docs: https://carbone.io/documentation/developer/http-api/generate-reports.html#converters"New value: +"Converter, used whenever the format changes. \"L\" LibreOffice (default): every format, and the only one with PDF/A, page ranges and accessibility. \"I\" Carbone ICE: DOCX and ODT to PDF, the fastest (keep \"L\" for SmartArt, complex charts, comments, form fields, equations). \"O\" OnlyOffice: DOCX, XLSX, PPTX to PDF. \"C\" Chromium: HTML and SVG to PDF, PNG, JPG, WEBP. Details: get_capabilities." - changed
Input schema / properties / currencyRates / descriptionPrevious value: -"Exchange rate table used by :formatC for currency conversion. Keys are ISO 4217 currency codes; values are rates relative to a common base. The base currency should have rate 1. Example: { \"EUR\": 1, \"USD\": 1.08, \"GBP\": 0.86, \"JPY\": 160.5 }. May instead be passed by reference as a string — a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string."New value: +"Rates per currency, base 1: { \"EUR\": 1, \"USD\": 1.08 }, or a reference to a JSON file." - changed
Input schema / properties / currencySource / descriptionPrevious value: -"ISO 4217 currency code of the monetary amounts in the JSON data. Used by the :formatC formatter as the conversion source. Must be set together with currencyTarget and currencyRates. Example: \"EUR\" if all prices in your data are in euros."New value: +"ISO 4217 currency of the amounts in data, for :formatC. Set with currencyTarget and currencyRates." - changed
Input schema / properties / currencyTarget / descriptionPrevious value: -"ISO 4217 currency code of the output document. The :formatC formatter converts amounts from currencySource to this currency using currencyRates. Must be set together with currencySource and currencyRates. Example: \"USD\" to display prices in US dollars. Documentation: https://carbone.io/documentation/design/formatters/currency.html#formatc-precisionorformat-targetcurrency"New value: +"ISO 4217 currency to convert the amounts to." - changed
Input schema / properties / data / descriptionPrevious value: -"JSON data merged into the template — an object, or a top-level array (accessed with {d[i].field}). Access fields with {d.fieldName} tags. Nested objects: {d.customer.name}. Array loops: {d.items[i].description} … {d.items[i+1]}. Conditions: {d.status:ifEQ(active):show(Yes):elseShow(No)}. Optional: if omitted, {} is sent, so every tag resolves to empty (\"Hello {d.name}!\" becomes \"Hello !\"). To keep the tags as written instead, pass keepTags: true (and no data). Instead of inlining a large dataset, you may pass a STRING reference to the JSON: a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string — it is read and parsed server-side."New value: +"JSON for the {d.…} tags: an object, a top-level array, or a reference to a JSON file (local path, HTTPS URL or base64). Omitted: every tag renders empty; to keep tags as written, use keepTags. Tag syntax: the Carbone Skill." - changed
Input schema / properties / egressAuthorization / descriptionPrevious value: -"Value for the Authorization header Carbone adds to its OUTBOUND (egress) requests while rendering — fetching external images ({d.imageUrl}), external PDFs (:appendFile / :attachFile), and calling webhooks. For example \"Bearer abc123\" or \"my-secret\" makes Carbone send `authorization: <value>` to those hosts. Only the authorization header can be customised; max 511 characters. For webhook calls specifically, webhookHeaders.authorization (if set) overrides this value."New value: +"Authorization header value Carbone sends when it fetches images, PDFs or the webhook while rendering." - changed
Input schema / properties / enum / descriptionPrevious value: -"Enumeration map used with the :convEnum(TYPE) formatter to translate code values into human-readable labels. Define one key per enum type; each value is an object mapping code → label. Example: { \"STATUS\": { \"1\": \"Active\", \"2\": \"Inactive\", \"3\": \"Pending\" }, \"ROLE\": { \"A\": \"Admin\", \"U\": \"User\" } }. Template usage: {d.status:convEnum(STATUS)}, {d.role:convEnum(ROLE)}. May instead be passed by reference as a string — a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string. Documentation: https://carbone.io/documentation/design/advanced-features/key-value-mapping.html#convenum-type"New value: +"Labels for :convEnum(TYPE), e.g. { \"STATUS\": { \"1\": \"Active\" } }, or a reference to a JSON file." - changed
Input schema / properties / failOn / descriptionPrevious value: -"Conditions that stop the render and return an error (Carbone v5.15.0+). \"IMAGE_URL_ERROR\": an image that cannot be downloaded from its URL fails the render, instead of being replaced with the broken-image placeholder. Empty image values are skipped; base64 images, barcodes and charts are not concerned. Example: [\"IMAGE_URL_ERROR\"]. Docs: https://carbone.io/documentation/developer/http-api/generate-reports.html#fail-on"New value: +"[\"IMAGE_URL_ERROR\"]: fail when an image URL cannot be downloaded, instead of showing a placeholder." - changed
Input schema / properties / hardRefresh / descriptionPrevious value: -"If true, Carbone recomputes pagination and refreshes the table of contents after rendering. Requires convertTo to be defined. Use this for DOCX/ODT templates that contain a TOC field or cross-references that need updating after data injection."New value: +"If true, recompute pagination and the table of contents after rendering. Needs convertTo." - changed
Input schema / properties / keepTags / descriptionPrevious value: -"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. Not the same as 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."New value: +"If true, skip templating: tags stay as written, to proof a template's layout. Exclusive with data." - changed
Input schema / properties / lang / descriptionPrevious value: -"Locale of the generated document. Affects three things: (1) {t(key)} translation tags — selects the matching translation from the translations map. (2) :formatN number formatter — applies locale-specific thousand/decimal separators. (3) :formatC currency formatter — applies locale-specific currency symbols and formatting. Format: BCP-47 lowercase, e.g. \"fr-fr\", \"en-us\", \"de-de\", \"es-es\", \"pt-br\", \"zh-cn\", \"ja-jp\". Full list: https://github.com/carboneio/carbone/blob/master/formatters/_locale.js"New value: +"Locale for {t()} translations, :formatN and :formatC, e.g. \"fr-fr\", \"en-us\"." - changed
Input schema / properties / outputPath / descriptionPrevious value: -"Optional local file path to save the generated document to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files. The path must not exist yet: an existing file is never overwritten (the call fails and asks for a new file name). Ignored for async/webhook renders (no document is returned inline)."New value: +"Local path to save the generated document to, e.g. \"~/out.pdf\"; returns the path and size. Never overwrites a file." - changed
Input schema / properties / preReleaseFeatureIn / descriptionPrevious value: -"Pre-release feature level for this render only: features and fixes introduced up to this tag apply, later ones stay disabled. Overrides the server default; a tag set in the template overrides it. Example: 5000000. Docs: https://carbone.io/documentation/design/overview/version-lifecycle.html#pre-release-features"New value: +"Turn on Carbone pre-release features up to this version tag, e.g. 5000000." - removed
Input schema / properties / preReleaseFeatureIn / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / preReleaseFeatureIn / minimumRemoved value: --9007199254740991 - changed
Input schema / properties / reportName / descriptionPrevious value: -"Filename (WITHOUT extension) for the generated document, returned in the Content-Disposition header. Carbone automatically appends the extension that matches convertTo, so do not include one — passing \"invoice.pdf\" yields \"invoice.pdf.pdf\". Supports Carbone tags resolved against the data at render time. Examples: \"invoice\" (static), \"{d.type}-{d.id}\" (dynamic), \"{d.client}-{d.date:formatD(YYYY-MM)}\". With keepTags (no templating pass), this server names the file \"<reportName>.<ext>\" itself, literally (tags are not resolved)."New value: +"File name without extension; may use tags, e.g. \"invoice-{d.id}\" (taken literally with keepTags)." - changed
Input schema / properties / returnLink / descriptionPrevious value: -"If true, generate the document and return a public download URL instead of the file contents. The link is SHORT-LIVED and ONE-TIME — Carbone deletes the file after the first download — so it is meant for the end user to download once (do not fetch it programmatically). Works in stdio and HTTP. Mutually exclusive with outputPath and asAttachment. Ignored when webhookUrl is set (no link is returned)."New value: +"If true, return a one-time download link instead of the file, for the user to open (never fetch it yourself). Exclusive with outputPath and asAttachment." - changed
Input schema / properties / template / descriptionPrevious value: -"Inline template for one-shot render without storing a template first. Three input forms are accepted: (1) Local file path — absolute, e.g. \"/Users/me/report.docx\" (or \"C:\\Users\\me\\report.docx\" on Windows), or under the home directory, e.g. \"~/report.docx\". A relative path must start with \"./\" or \"../\" and resolves against the server process's working directory, which is rarely yours: prefer an absolute path. A bare file name such as \"report.docx\" is NOT a path: it would be sent as base64 content. (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. The template is uploaded and rendered in a single API request — no Template ID is returned. Use this for ephemeral renders; use upload_template + templateId when you need to reuse the template. Supported input formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF. Carbone reads XML-based and text-based documents (plus PDF): the legacy binary Office formats DOC, XLS and PPT are rejected as input, although they are valid outputs. Re-save such a file as DOCX, XLSX or PPTX first. Mutually exclusive with templateId — provide exactly one, never both."New value: +"A one-off template, not stored. An absolute local path (\"/Users/me/report.docx\", \"~/report.docx\"; a bare name like \"report.docx\" is read as base64), an HTTPS URL, or the file as base64. Formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF; not the legacy binary DOC, XLS or PPT (re-save them as DOCX, XLSX, PPTX). To reuse one, upload_template then pass templateId. Exclusive with templateId." - changed
Input schema / properties / templateId / descriptionPrevious value: -"The ID of a previously uploaded template to render. Two ID formats are accepted: (1) Template ID (64-bit) — stable identifier shared across versions; Carbone automatically uses the deployed version. (2) Version ID (SHA-256) — pins rendering to a specific version regardless of deployment status. Both are returned by upload_template. Mutually exclusive with template — provide exactly one, never both."New value: +"A stored template, from list_templates or upload_template (never guess one): its Template ID (digits, renders the deployed version) or a Version ID (64 hex characters, pins that version). Exclusive with template." - changed
Input schema / properties / timezone / descriptionPrevious value: -"IANA timezone used to convert dates in the rendered document. Default: \"Europe/Paris\". Applied when templates use the :formatD formatter, e.g. {d.date:formatD(YYYY-MM-DD HH:mm)}. Common values: \"UTC\", \"America/New_York\", \"America/Los_Angeles\", \"Europe/London\", \"Europe/Paris\", \"Europe/Berlin\", \"Asia/Tokyo\", \"Asia/Shanghai\", \"Australia/Sydney\". Full list (TZ identifier column): https://en.wikipedia.org/wiki/List_of_tz_database_time_zones"New value: +"IANA time zone for :formatD dates, e.g. \"America/New_York\". Default \"Europe/Paris\"." - changed
Input schema / properties / translations / descriptionPrevious value: -"Translation map for multilingual documents. Requires \"lang\" to be set to select the active locale. Top-level keys are BCP-47 locale codes; values are key → translated-string maps. Template usage: {t(greeting)} is replaced by the matching string for the active locale. Example: { \"fr-fr\": { \"greeting\": \"Bonjour\", \"total\": \"Total\" }, \"en-us\": { \"greeting\": \"Hello\", \"total\": \"Total\" } }. These dictionaries get large, so you may instead pass a string reference — a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string. Documentation: https://carbone.io/documentation/design/advanced-features/translations-i18n.html"New value: +"Strings for {t(key)}, selected by lang: { \"fr-fr\": { \"hello\": \"Bonjour\" } }, or a reference to a JSON file." - changed
Input schema / properties / variableStr / descriptionPrevious value: -"Carbone alias definitions applied to the whole template, as if written in it. An alias is a shortcut to a data path, not a variable: it stores no value and computes nothing (no arithmetic, no concatenation). Define with {#alias = d.path}, optionally with $parameters: {#mealOf($weekday) = d[weekday = $weekday]}. Use them in the template with {$alias}, e.g. {$mealOf(2).name}. Example: \"{#buyer = d.order.customer}\", then {$buyer.name} in the template renders d.order.customer.name. To store a computed value, use the :set formatter instead. Documentation: https://carbone.io/documentation/design/substitutions/aliases.html#alias"New value: +"Aliases for the whole template, e.g. \"{#buyer = d.order.customer}\", then {$buyer.name} in it." - changed
Input schema / properties / webhookHeaders / descriptionPrevious value: -"Custom headers Carbone will include when POSTing to your webhookUrl. Pass plain header names as keys — the prefix \"carbone-webhook-header-\" is added automatically before sending to Carbone, and Carbone forwards the original header names to your webhook endpoint. Example: { \"authorization\": \"my-secret\", \"custom-id\": \"12345\", \"custom-name\": \"Jane Doe\" } — Carbone will call your URL with headers: authorization: my-secret, custom-id: 12345, custom-name: Jane Doe. Requires webhookUrl to be set."New value: +"Headers Carbone sends to webhookUrl, e.g. { \"authorization\": \"secret\" }." - changed
Input schema / properties / webhookUrl / descriptionPrevious value: -"Webhook URL that enables asynchronous rendering (render timeout raised to 5 minutes). This tool then returns only Carbone's acceptance message, never the document. When the document is ready, Carbone POSTs { \"success\": true, \"data\": { \"renderId\": \"...\" } } to this URL; the server behind it must download the document itself with GET /render/{renderId} on the Carbone API (one-time, no auth). You cannot fetch it from here. Required for batchSplitBy: batch output is always delivered this way. outputPath, asAttachment and returnLink are ignored in this mode. Example: \"https://your-server.com/carbone-webhook\"."New value: +"Only an endpoint the user owns and gives you: Carbone POSTs { \"success\": true, \"data\": { \"renderId\" } } to it when the document is ready, and that server downloads it once. This call then returns no document."
- Changed
update_template_metadata14 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"New category, max 200 characters."New value: +"New category (max 200 characters)." - changed
Input schema / properties / comment / descriptionPrevious value: -"New free-text comment, max 200 characters."New value: +"New comment (max 200 characters)." - changed
Input schema / properties / deployedAt / descriptionPrevious value: -"Unix timestamp (seconds) to set as the deployment time for this version. Carbone picks the version with the most recent deployedAt when rendering by Template ID. Use 42000000000 to deploy immediately (special \"NOW\" value). Future values are not allowed, and the deployed version's deployedAt cannot move back in time."New value: +"42000000000 deploys this version now: renders by Template ID use the most recently deployed version." - removed
Input schema / properties / deployedAt / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / deployedAt / minimumRemoved value: --9007199254740991 - changed
Input schema / properties / expireAt / descriptionPrevious value: -"Schedule deletion of the patched version at a UTC Unix timestamp (seconds). After that time it is no longer listed, downloadable or renderable (404), and the file is purged after the retention delay. Send 0 to cancel a scheduled deletion (permanent again); omit to leave it unchanged. To delete now, use delete_template."New value: +"Delete this version at this UTC Unix time (seconds); 0 cancels a scheduled deletion." - removed
Input schema / properties / expireAt / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / idRemoved value: -{ - "description": "DEPRECATED: the 1.6.0 name of moveToTemplateId, kept so existing callers keep working. Use moveToTemplateId; passing both with different values is rejected.", - "minLength": 1, - "type": "string" -} - changed
Input schema / properties / moveToTemplateId / descriptionPrevious value: -"CAUTION, structural change: moves the patched version to this other Template ID (64-bit; a Version ID is rejected). It is NOT the template to patch (that is templateId). Pass the version's Version ID as templateId; with a Template ID, its currently deployed version is moved and that Template ID falls back to its next most recent version (or stops resolving if none is left). Fails if the move creates a deployedAt conflict at the destination. Only use it when the user asks to move a version."New value: +"Only when the user asks to move a version: moves it to this other Template ID (digits). Not the template to change (that is templateId)." - removed
Input schema / properties / moveToTemplateId / minLengthRemoved value: -1 - added
Input schema / properties / moveToTemplateId / patternAdded value: +"^\\d+$" - changed
Input schema / properties / name / descriptionPrevious value: -"New display name, max 200 characters."New value: +"New name (max 200 characters)." - changed
Input schema / properties / tags / descriptionPrevious value: -"New list of tags, replacing the existing ones. Duplicates are removed and the list is sorted; the whole list is limited to 100 characters (about 8 tags of 9 characters)."New value: +"New tags, replacing the current ones: sorted, deduplicated, 100 characters in all." - changed
Input schema / properties / templateId / descriptionPrevious value: -"Template ID (64-bit) or Version ID (SHA-256) of the version to update. A Template ID patches only its currently deployed version (not every version). A Version ID patches that exact version."New value: +"The version to change: a Version ID, or a Template ID for its deployed version."
- Changed
upload_template22 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Group templates into folders/categories, max 200 characters (e.g. \"invoices\", \"legal\", \"hr\")."New value: +"Category, e.g. \"invoices\" (max 200 characters)." - changed
Input schema / properties / comment / descriptionPrevious value: -"Free-text comment to describe the template version or its purpose, max 200 characters."New value: +"Comment on this version (max 200 characters)." - changed
Input schema / properties / deployedAt / descriptionPrevious value: -"UTC Unix timestamp (seconds) to set as the deployment time for this version. Carbone uses the version with the most recent deployedAt when rendering via Template ID. Use 42000000000 to deploy immediately (special \"NOW\" sentinel value). Future values are not allowed."New value: +"42000000000 deploys this version now: renders by Template ID use the most recently deployed version." - removed
Input schema / properties / deployedAt / maximumRemoved value: -9007199254740991 - removed
Input schema / properties / deployedAt / minimumRemoved value: --9007199254740991 - changed
Input schema / properties / expireAt / descriptionPrevious value: -"Schedule deletion at a UTC Unix timestamp (seconds); 0 (default) means the template never expires. After that time it is no longer listed, downloadable or renderable (404), and the file is purged after the retention delay. To remove a template now, use delete_template."New value: +"Delete the template at this UTC Unix time (seconds); 0 (default) never. To delete now, use delete_template." - removed
Input schema / properties / expireAt / maximumRemoved value: -9007199254740991 - changed
Input schema / properties / id / descriptionPrevious value: -"Existing Template ID (64-bit format) to add this upload to its version history. If omitted, a new Template ID is generated. Providing a Version ID (SHA-256) is not allowed and will cause an error."New value: +"Template ID (digits) to add this upload to as a new version; omitted: a new template. Never a Version ID." - added
Input schema / properties / id / patternAdded value: +"^\\d+$" - changed
Input schema / properties / name / descriptionPrevious value: -"Display name for the template, max 200 characters (e.g. \"Invoice Template\", \"NDA Contract\"). Optional but recommended: list_templates shows it and its search matches it."New value: +"Display name, shown and searched by list_templates (max 200 characters)." - changed
Input schema / properties / sample / descriptionPrevious value: -"Sample input data attached to the template for testing in Carbone Studio: an array with at most ONE object, whose keys data, complement, translations and enum are all optional. Example: [{ \"data\": { \"name\": \"Acme\" } }]."New value: +"A sample dataset stored with the template, at most one: [{ \"data\": { \"name\": \"Acme\" } }]." - removed
Input schema / properties / sample / items / properties / complement / descriptionRemoved value: -"Extra data for {c.} tags." - removed
Input schema / properties / sample / items / properties / data / descriptionRemoved value: -"JSON dataset for {d.} tags." - removed
Input schema / properties / sample / items / properties / enum / descriptionRemoved value: -"Enumerations for :convEnum() formatter." - removed
Input schema / properties / sample / items / properties / translations / descriptionRemoved value: -"Localization map for {t()} tags." - changed
Input schema / properties / tags / descriptionPrevious value: -"Labels shown by list_tags and on each list_templates result (e.g. [\"sales\", \"billing\", \"v2\"]). Duplicates are removed and the list is sorted; the whole list is limited to 100 characters (about 8 tags of 9 characters)."New value: +"Labels, e.g. [\"sales\", \"billing\"]: sorted, deduplicated, 100 characters in all." - changed
Input schema / properties / template / descriptionPrevious value: -"The template file. Three input forms are accepted: (1) Local file path — absolute, e.g. \"/Users/me/report.docx\" (or \"C:\\Users\\me\\report.docx\" on Windows), or under the home directory, e.g. \"~/report.docx\". A relative path must start with \"./\" or \"../\" and resolves against the server process's working directory, which is rarely yours: prefer an absolute path. A bare file name such as \"report.docx\" is NOT a path: it would be sent as base64 content. (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. Supported input formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF. Carbone reads XML-based and text-based documents (plus PDF): the legacy binary Office formats DOC, XLS and PPT are rejected as input, although they are valid outputs. Re-save such a file as DOCX, XLSX or PPTX first."New value: +"The template file. An absolute local path (\"/Users/me/report.docx\", \"~/report.docx\"; a bare name like \"report.docx\" is read as base64), an HTTPS URL, or the file as base64. Formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF; not the legacy binary DOC, XLS or PPT (re-save them as DOCX, XLSX, PPTX)." - changed
Input schema / properties / versioning / descriptionPrevious value: -"Enable template versioning (default: true). When true, a stable Template ID is generated and multiple versions can be managed under it. When false, behaves as legacy mode and returns only a templateId (SHA-256 hash) and templateExtension."New value: +"Leave true (default). false is legacy: no Template ID, only a SHA-256 templateId." - added
Output schema / properties / expiresAtAdded value: +{ + "description": "requestUploadUrl only: UTC Unix timestamp after which the URL is refused.", + "type": "number" +} - added
Output schema / properties / headersAdded value: +{ + "additionalProperties": { + "type": "string" + }, + "description": "requestUploadUrl only: the headers to send with the file.", + "propertyNames": { + "type": "string" + }, + "type": "object" +} - changed
Output schema / properties / templateId / descriptionPrevious value: -"Template ID returned in legacy/non-versioned mode."New value: +"versioning: false only: the Version ID (SHA-256) of the upload, not a Template ID." - added
Output schema / properties / uploadUrlAdded value: +{ + "description": "requestUploadUrl only: where to POST the file. The template does not exist yet.", + "type": "string" +}
2 tool updates
v2.1.4- Changed
update_template_metadata3 fields changed- added
Input schema / properties / tags / items / maxLengthAdded value: +96 - added
Input schema / properties / tags / items / minLengthAdded value: +1 - added
Input schema / properties / tags / maxItemsAdded value: +100
- Changed
upload_template3 fields changed- added
Input schema / properties / tags / items / maxLengthAdded value: +96 - added
Input schema / properties / tags / items / minLengthAdded value: +1 - added
Input schema / properties / tags / maxItemsAdded value: +100
11 tool updates
v2.0.0- Changed
convert_document12 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / asAttachment / descriptionPrevious value: -"If true, return the document as a downloadable file attachment (a base64 EmbeddedResource), for any format. Default delivery: text and png/jpg/gif/webp are returned inline; other binary outputs (PDF, Office, …) are saved to a temp file in stdio mode (path returned), or returned as an attachment in HTTP mode. Ignored when outputPath or returnLink is set."New value: +"If true, return the document as a downloadable file attachment (a base64 EmbeddedResource), for any format. Default delivery: text and png/jpg/gif/webp are returned inline; other binary outputs (PDF, Office, …) are saved to a temp file (path returned). Ignored when outputPath or returnLink is set." - changed
Input schema / properties / convertTo / anyOfPrevious value: -[ - { - "enum": [ - "pdf", - "docx", - "doc", - "xlsx", - "xls", - "pptx", - "ppt", - "odt", - "ods", - "odp", - "odg", - "html", - "xhtml", - "txt", - "csv", - "md", - "xml", - "rtf", - "png", - "jpg", - "jpeg", - "webp", - "svg", - "tiff", - "bmp", - "gif", - "zip", - "idml", - "epub", - "cdr" - ], - "type": "string" - }, - { - "properties": { - "formatName": { - "description": "Target format name.", - "enum": [ - "pdf", - "docx", - "doc", - "xlsx", - "xls", - "pptx", - "ppt", - "odt", - "ods", - "odp", - "odg", - "html", - "xhtml", - "txt", - "csv", - "md", - "xml", - "rtf", - "png", - "jpg", - "jpeg", - "webp", - "svg", - "tiff", - "bmp", - "gif", - "zip", - "idml", - "epub", - "cdr" - ], - "type": "string" - }, - "formatOptions": { - "additionalProperties": {}, - "description": "Advanced format options object. Examples by format: PDF — { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\", \"DocumentPermissionPassword\": \"owner\" } password-protect; PDF — { \"Watermarks\": [{ \"text\": \"DRAFT\", \"opacity\": 0.2, \"rotation\": -45, \"fontsize\": 60 }] } up to 5 watermarks; PDF — { \"SelectPdfVersion\": 1 } PDF/A-1b compliance (use 2 for PDF/A-2, 3 for PDF/A-3); PDF — { \"PageRange\": \"1-3,5\" } export specific pages only; PDF — { \"ConvertSlideshow\": true } convert each slide to a separate PDF page; Images (PNG/JPG/WEBP) — { \"Quality\": 90 } set compression quality 0-100; Images — { \"density\": 150 } set DPI for rasterisation (default 96); CSV — { \"fieldSeparator\": \";\" } custom column separator.", - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "formatName" - ], - "type": "object" - } -]New value: +[ + { + "enum": [ + "pdf", + "docx", + "doc", + "odt", + "ott", + "rtf", + "epub", + "xlsx", + "xls", + "ods", + "ots", + "csv", + "dbf", + "dif", + "pptx", + "ppt", + "odp", + "otp", + "odg", + "html", + "xhtml", + "txt", + "md", + "xml", + "idml", + "png", + "jpg", + "jpeg", + "webp", + "gif", + "tiff", + "bmp", + "svg", + "emf", + "wmf", + "eps" + ], + "type": "string" + }, + { + "properties": { + "formatName": { + "description": "Target format name.", + "enum": [ + "pdf", + "docx", + "doc", + "odt", + "ott", + "rtf", + "epub", + "xlsx", + "xls", + "ods", + "ots", + "csv", + "dbf", + "dif", + "pptx", + "ppt", + "odp", + "otp", + "odg", + "html", + "xhtml", + "txt", + "md", + "xml", + "idml", + "png", + "jpg", + "jpeg", + "webp", + "gif", + "tiff", + "bmp", + "svg", + "emf", + "wmf", + "eps" + ], + "type": "string" + }, + "formatOptions": { + "additionalProperties": {}, + "description": "Format-specific options. Examples: PDF password: { \"EncryptFile\": true, \"DocumentOpenPassword\": \"s3cr3t\" }; PDF permissions: { \"RestrictPermissions\": true, \"PermissionPassword\": \"owner\" }; PDF watermarks (max 4): { \"Watermarks\": [{ \"text\": \"DRAFT\", \"size\": 60, \"opacity\": 0.2, \"rotation\": -45 }] }; PDF/A (L only): { \"SelectPdfVersion\": 2 } (2 = PDF/A-2b, 3 = PDF/A-3b, 4 = PDF/A-4); page selection (L only): { \"PageRange\": \"1-5\" }; accessibility (L only): { \"UseTaggedPDF\": true, \"PDFUACompliance\": true }; JPG/PNG: { \"PixelWidth\": 1200, \"PixelHeight\": 630 }, JPG quality: { \"Quality\": 80 } (1-100); CSV: { \"fieldSeparator\": \";\" }. All options: https://carbone.io/documentation/developer/http-api/generate-reports.html#pdf-options", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "formatName" + ], + "type": "object" + } +] - changed
Input schema / properties / convertTo / descriptionPrevious value: -"Target output format. Documents : \"pdf\", \"docx\", \"xlsx\", \"pptx\", \"odt\", \"ods\", \"odp\", \"odg\", \"rtf\", \"epub\", plus the legacy \"doc\", \"xls\", \"ppt\" (output only — Carbone writes them but cannot read them back). Web/text : \"html\", \"xhtml\", \"txt\", \"csv\", \"md\", \"xml\", \"idml\". Images : \"png\", \"jpg\", \"jpeg\", \"webp\", \"svg\", \"tiff\", \"bmp\", \"gif\". Archive : \"zip\" (batch output). Simple usage: \"pdf\". Advanced usage: { \"formatName\": \"pdf\", \"formatOptions\": { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\" } }."New value: +"Target output format. Valid outputs depend on the input format (e.g. HTML converts to pdf, docx or png, but not xlsx); see the conversion matrix: https://carbone.io/documentation/developer/http-api/generate-reports.html#output-file-type. \"doc\", \"xls\" and \"ppt\" are output formats; as input, use DOCX, XLSX or PPTX. Simple usage: \"pdf\". With options: { \"formatName\": \"pdf\", \"formatOptions\": { ... } }." - changed
Input schema / properties / converter / descriptionPrevious value: -"Converter engine. Only relevant when convertTo is \"pdf\" (or an image format rasterised from a document). \"L\" — LibreOffice (default): best all-round engine for DOCX, XLSX, PPTX, ODT, ODS, ODP. \"O\" — OnlyOffice: highest fidelity rendering for Microsoft Office formats (DOCX, XLSX, PPTX). \"C\" — Chromium: best for HTML, CSS, JavaScript — full browser rendering. \"I\" — Carbone ICE (Instant Converter Engine, Carbone 5.14.0+): DOCX → PDF ONLY, no third-party converter — up to 60x faster than LibreOffice on a 1000-page DOCX (3x on a one-page document). Any other input or output format is REJECTED — use another converter for those. PDF options: only Watermarks are applied. EncryptFile, DocumentOpenPassword, RestrictPermissions and the other security options are SILENTLY IGNORED — the PDF comes back readable by anyone, with no error — so NEVER pick \"I\" when the request needs a password or restricted permissions; use \"L\" for those. Also unsupported: WEBP and EMF/WMF images, table of contents, SmartArt, complex charts, footnotes/endnotes, comments, tracked changes, form fields, equations, bookmarks and links; a missing font falls back to Noto Sans. If omitted, LibreOffice is used by default."New value: +"Converter engine, used whenever the format changes (not only for PDF). If omitted, \"L\" is used. \"L\" LibreOffice: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, MD, PDF; the only converter supporting all PDF options. \"I\" Carbone ICE: DOCX and ODT to PDF; Carbone's own engine, 3x to 300x faster, recommended over \"O\" for DOCX from v5.15.0. It converts all content except WEBP and EMF/WMF images, SmartArt and complex charts (bar, line, area, pie and doughnut charts are drawn), comments, tracked changes, form fields and equations: keep the default \"L\" for documents with those. A missing font is replaced by Noto Sans (https://carbone.io/documentation/developer/http-api/generate-reports.html#converters-carbone-ice-limitations). \"O\" OnlyOffice: DOCX, XLSX, PPTX to PDF. \"C\" Chromium: HTML to PDF, JPG, PNG, WEBP with full CSS/JS; 100 MB max. PDF options: \"L\" supports all of them; \"O\", \"C\" and \"I\" apply Security (passwords, permissions) and Watermarks. Docs: https://carbone.io/documentation/developer/http-api/generate-reports.html#converters" - changed
Input schema / properties / converter / enumPrevious value: -[ - "L", - "C", - "O", - "I" -]New value: +[ + "L", + "O", + "C", + "I" +] - changed
Input schema / properties / egressAuthorization / descriptionPrevious value: -"Value for the Authorization header Carbone adds to its OUTBOUND (egress) requests during conversion — e.g. when a Chromium HTML→PDF conversion fetches a protected external image or stylesheet. For example \"Bearer abc123\" makes Carbone send `authorization: Bearer abc123` to those hosts. Only the authorization header can be customised; max 512 characters."New value: +"Value for the Authorization header Carbone adds to its OUTBOUND (egress) requests during conversion — e.g. when a Chromium HTML→PDF conversion fetches a protected external image or stylesheet. For example \"Bearer abc123\" makes Carbone send `authorization: Bearer abc123` to those hosts. Only the authorization header can be customised; max 511 characters." - changed
Input schema / properties / egressAuthorization / maxLengthPrevious value: -512New value: +511 - changed
Input schema / properties / file / descriptionPrevious value: -"The document to convert. Three input forms are accepted: (1) Local file path — absolute or relative, e.g. \"/home/user/report.docx\" or \"./invoice.xlsx\". (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. Supported input formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, Markdown (MD), TXT, CSV, RTF, PDF, PNG and JPG. Carbone reads XML-based and text-based documents only, so the legacy BINARY Office formats DOC, XLS and PPT are REJECTED as input — Carbone can produce them as output but cannot read them. Re-save such a file as DOCX/XLSX/PPTX first. Full conversion matrix: https://carbone.io/documentation/developer/http-api/generate-reports.md"New value: +"The document to convert. Three input forms are accepted: (1) Local file path — absolute, e.g. \"/Users/me/report.docx\" (or \"C:\\Users\\me\\report.docx\" on Windows), or under the home directory, e.g. \"~/report.docx\". A relative path must start with \"./\" or \"../\" and resolves against the server process's working directory, which is rarely yours: prefer an absolute path. A bare file name such as \"report.docx\" is NOT a path: it would be sent as base64 content. (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. Supported input formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF. Carbone reads XML-based and text-based documents (plus PDF): the legacy binary Office formats DOC, XLS and PPT are rejected as input, although they are valid outputs. Re-save such a file as DOCX, XLSX or PPTX first. Full conversion matrix: https://carbone.io/documentation/developer/http-api/generate-reports.html#output-file-type" - changed
Input schema / properties / hardRefresh / descriptionPrevious value: -"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."New value: +"If true, Carbone runs the converter even when the output format equals the input format, and recomputes pagination and the table of contents at the end of the conversion. Needed for PDF → PDF: without it Carbone returns the PDF unchanged and formatOptions (password, permissions, watermarks, PDF/A, …) are NOT applied. This server sets it automatically when the input is a PDF, convertTo is \"pdf\" and formatOptions are given; pass false to opt out. Example (PDF → PDF/A-4): { \"hardRefresh\": true, \"convertTo\": { \"formatName\": \"pdf\", \"formatOptions\": { \"SelectPdfVersion\": 4 } } }." - changed
Input schema / properties / outputPath / descriptionPrevious value: -"Optional local file path to save the converted document to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files."New value: +"Optional local file path to save the converted document to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files. The path must not exist yet: an existing file is never overwritten (the call fails and asks for a new file name)." - changed
Input schema / properties / reportName / descriptionPrevious value: -"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."New value: +"Name of the delivered file, WITHOUT extension (e.g. \"contract\", \"2026-invoice\"). The document is delivered as \"<reportName>.<ext>\", with the extension of convertTo, used as the attachment name and the default saved file name. This server names the file itself: a conversion has no templating pass, which is where Carbone resolves reportName. Used literally: Carbone tags such as {d.id} are not resolved here. Ignored with returnLink (a download URL, not a named file) and with outputPath (which sets the path itself)."
- Changed
delete_template1 field changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
download_template3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / outputPath / descriptionPrevious value: -"Optional local file path to save the template file to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files."New value: +"Optional local file path to save the template file to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files. The path must not exist yet: an existing file is never overwritten (the call fails and asks for a new file name)." - changed
Input schema / properties / sample / descriptionPrevious value: -"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."New value: +"If true, download the JSON SAMPLE DATASET saved with the template (the \"sample\" array passed to upload_template) instead of the template file, returned as inline JSON text by default, of the form [{ \"data\": {...}, \"complement\": {...}, \"translations\": {...}, \"enum\": {...} }] (each key optional). Use it to recover the example data a template expects before calling render_document. Errors if the template was uploaded without a sample."
- Changed
get_api_status1 field changed- changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Added
inspect_template - Changed
list_categories1 field changed- changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_tags1 field changed- changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_templates4 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results to return, between 1 and 100. Default: 100. Use cursor to page beyond that."New value: +"Maximum number of results to return, between 1 and 100 (Carbone API limit). Default: 100. Use cursor to page beyond that." - changed
Input schema / properties / origin / descriptionPrevious value: -"Filter by upload origin. 0 = API, 1 = Carbone Studio, 2 = Salesforce, 3 = Odoo, 4 = HubSpot. Templates created through this MCP are origin 0."New value: +"Filter by upload origin: 0 = API, 1 = Carbone Studio, 2 = Salesforce integration, 3 = Odoo integration, 4 = HubSpot integration. Templates uploaded through this MCP server are origin 0." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
render_document24 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / asAttachment / descriptionPrevious value: -"If true, return the document as a downloadable file attachment (a base64 EmbeddedResource), for any format. Default delivery: text and png/jpg/gif/webp are returned inline; other binary outputs (PDF, Office, …) are saved to a temp file in stdio mode (path returned), or returned as an attachment in HTTP mode. Ignored when outputPath or returnLink is set."New value: +"If true, return the document as a downloadable file attachment (a base64 EmbeddedResource), for any format. Default delivery: text and png/jpg/gif/webp are returned inline; other binary outputs (PDF, Office, …) are saved to a temp file (path returned). Ignored when outputPath or returnLink is set." - changed
Input schema / properties / batchOutput / descriptionPrevious value: -"How the batch result is packaged. Defaults to \"zip\". \"zip\" — every generated document is bundled into a single ZIP archive (use batchReportName to name each entry). \"pdf\" — all documents are CONCATENATED into one continuous PDF instead of being zipped; this requires convertTo to be \"pdf\" as well. Must be used together with batchSplitBy."New value: +"Batch result type, with batchSplitBy. \"zip\" (default): an archive of all generated documents. \"pdf\": the generated PDFs concatenated into one file; requires convertTo \"pdf\"." - changed
Input schema / properties / batchReportName / descriptionPrevious value: -"Filename pattern for each individual document inside the batch ZIP. Supports Carbone tags. Tags are resolved against the item's data (relative path) or the full dataset (absolute path). Examples: \"invoice-{d.id}.pdf\", \"{d.client.name}-{d.date}.docx\". Carbone sanitises the result — path separators, \"..\", Windows-forbidden and control characters each become an underscore — and appends an index to duplicates (\"report_1.pdf\", \"report_2.pdf\"), so a pattern that resolves to the same name for several items will not silently drop documents. Only meaningful with batchOutput: \"zip\"; a concatenated \"pdf\" batch is a single file. Must be used together with batchSplitBy."New value: +"Name of each file inside the batch ZIP, WITHOUT extension (Carbone appends it). Carbone tags are resolved against each batch item, e.g. \"invoice-{d.id}\". Ignored when batchOutput is \"pdf\". From v5.14, an index is appended to every file as soon as two names collide (invoice_1.pdf, invoice_2.pdf). Requires batchSplitBy." - changed
Input schema / properties / batchSplitBy / descriptionPrevious value: -"JSON path to the array in your data that drives batch generation. One document is generated per element of the array. Two forms: \"d\" when data itself IS the array (one report per top-level element), or \"d.arrayName\" to split on a child array. Example: \"d.invoices\" — produces one PDF per item in data.invoices. Example: \"d.employees\" — produces one contract per employee. Carbone Cloud allows 1 to 100 objects per batch (on-premise follows the nbReportMaxPerBatch setting). Batch is ALWAYS asynchronous — webhookUrl is required. Pair with batchOutput to choose ZIP or a single concatenated PDF, and batchReportName to name each document."New value: +"Batch generation: one document per object of an array. Use \"d\" when data itself is an array, or \"d.items\" for a direct child array of data. Requires webhookUrl (batch is always asynchronous: the result goes to the webhook, not to this tool). At most 100 objects on Carbone Cloud. Combine with batchOutput and batchReportName. Docs: https://carbone.io/documentation/developer/http-api/generate-reports.html#batch-processing" - changed
Input schema / properties / convertTo / anyOfPrevious value: -[ - { - "enum": [ - "pdf", - "docx", - "doc", - "xlsx", - "xls", - "pptx", - "ppt", - "odt", - "ods", - "odp", - "odg", - "html", - "xhtml", - "txt", - "csv", - "md", - "xml", - "rtf", - "png", - "jpg", - "jpeg", - "webp", - "svg", - "tiff", - "bmp", - "gif", - "zip", - "idml", - "epub", - "cdr" - ], - "type": "string" - }, - { - "properties": { - "formatName": { - "description": "Target format name.", - "enum": [ - "pdf", - "docx", - "doc", - "xlsx", - "xls", - "pptx", - "ppt", - "odt", - "ods", - "odp", - "odg", - "html", - "xhtml", - "txt", - "csv", - "md", - "xml", - "rtf", - "png", - "jpg", - "jpeg", - "webp", - "svg", - "tiff", - "bmp", - "gif", - "zip", - "idml", - "epub", - "cdr" - ], - "type": "string" - }, - "formatOptions": { - "additionalProperties": {}, - "description": "Advanced format options object. Examples by format: PDF — { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\", \"DocumentPermissionPassword\": \"owner\" } password-protect; PDF — { \"Watermarks\": [{ \"text\": \"DRAFT\", \"opacity\": 0.2, \"rotation\": -45, \"fontsize\": 60 }] } up to 5 watermarks; PDF — { \"SelectPdfVersion\": 1 } PDF/A-1b compliance (use 2 for PDF/A-2, 3 for PDF/A-3); PDF — { \"PageRange\": \"1-3,5\" } export specific pages only; PDF — { \"ConvertSlideshow\": true } convert each slide to a separate PDF page; Images (PNG/JPG/WEBP) — { \"Quality\": 90 } compression quality 0-100; Images — { \"density\": 150 } DPI for rasterisation (default 96); CSV — { \"fieldSeparator\": \";\" } custom column separator.", - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "formatName" - ], - "type": "object" - } -]New value: +[ + { + "enum": [ + "pdf", + "docx", + "doc", + "odt", + "ott", + "rtf", + "epub", + "xlsx", + "xls", + "ods", + "ots", + "csv", + "dbf", + "dif", + "pptx", + "ppt", + "odp", + "otp", + "odg", + "html", + "xhtml", + "txt", + "md", + "xml", + "idml", + "png", + "jpg", + "jpeg", + "webp", + "gif", + "tiff", + "bmp", + "svg", + "emf", + "wmf", + "eps" + ], + "type": "string" + }, + { + "properties": { + "formatName": { + "description": "Target format name.", + "enum": [ + "pdf", + "docx", + "doc", + "odt", + "ott", + "rtf", + "epub", + "xlsx", + "xls", + "ods", + "ots", + "csv", + "dbf", + "dif", + "pptx", + "ppt", + "odp", + "otp", + "odg", + "html", + "xhtml", + "txt", + "md", + "xml", + "idml", + "png", + "jpg", + "jpeg", + "webp", + "gif", + "tiff", + "bmp", + "svg", + "emf", + "wmf", + "eps" + ], + "type": "string" + }, + "formatOptions": { + "additionalProperties": {}, + "description": "Format-specific options. Examples: PDF password: { \"EncryptFile\": true, \"DocumentOpenPassword\": \"s3cr3t\" }; PDF permissions: { \"RestrictPermissions\": true, \"PermissionPassword\": \"owner\" }; PDF watermarks (max 4): { \"Watermarks\": [{ \"text\": \"DRAFT\", \"size\": 60, \"opacity\": 0.2, \"rotation\": -45 }] }; PDF/A (L only): { \"SelectPdfVersion\": 2 } (2 = PDF/A-2b, 3 = PDF/A-3b, 4 = PDF/A-4); page selection (L only): { \"PageRange\": \"1-5\" }; accessibility (L only): { \"UseTaggedPDF\": true, \"PDFUACompliance\": true }; JPG/PNG: { \"PixelWidth\": 1200, \"PixelHeight\": 630 }, JPG quality: { \"Quality\": 80 } (1-100); CSV: { \"fieldSeparator\": \";\" }. All options: https://carbone.io/documentation/developer/http-api/generate-reports.html#pdf-options", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "formatName" + ], + "type": "object" + } +] - changed
Input schema / properties / convertTo / descriptionPrevious value: -"Output format. If omitted, the output matches the template format. Documents : \"pdf\", \"docx\", \"xlsx\", \"pptx\", \"odt\", \"ods\", \"odp\", \"odg\", \"rtf\", \"epub\". Web/text : \"html\", \"xhtml\", \"txt\", \"csv\", \"md\", \"xml\", \"idml\". Images : \"png\", \"jpg\", \"jpeg\", \"webp\", \"svg\", \"tiff\", \"bmp\", \"gif\". Archive : \"zip\" (use with batchSplitBy for batch output). Simple usage: \"pdf\". Advanced usage: { \"formatName\": \"pdf\", \"formatOptions\": { ... } } for PDF-specific options."New value: +"Output format. If omitted, the output keeps the template format. Valid outputs depend on the input format (e.g. HTML converts to pdf, docx or png, but not xlsx); see the conversion matrix: https://carbone.io/documentation/developer/http-api/generate-reports.html#output-file-type. \"doc\", \"xls\" and \"ppt\" are output formats; as input, use DOCX, XLSX or PPTX. Simple usage: \"pdf\". With options: { \"formatName\": \"pdf\", \"formatOptions\": { ... } }." - changed
Input schema / properties / converter / descriptionPrevious value: -"Converter engine. Only relevant when convertTo is \"pdf\" (or an image rasterised from a document). \"L\" — LibreOffice (default): best all-round engine for DOCX, XLSX, PPTX, ODT, ODS, ODP. \"O\" — OnlyOffice: highest fidelity for Microsoft Office formats (DOCX, XLSX, PPTX). \"C\" — Chromium: best for HTML/CSS/JS templates — full browser rendering. \"I\" — Carbone ICE (Instant Converter Engine, Carbone 5.14.0+): DOCX → PDF ONLY, no third-party converter — up to 60x faster than LibreOffice on a 1000-page DOCX (3x on a one-page document). Any other input or output format is REJECTED — use another converter for those. PDF options: only Watermarks are applied. EncryptFile, DocumentOpenPassword, RestrictPermissions and the other security options are SILENTLY IGNORED — the PDF comes back readable by anyone, with no error — so NEVER pick \"I\" when the request needs a password or restricted permissions; use \"L\" for those. Also unsupported: WEBP and EMF/WMF images, table of contents, SmartArt, complex charts, footnotes/endnotes, comments, tracked changes, form fields, equations, bookmarks and links; a missing font falls back to Noto Sans. If omitted, LibreOffice is used by default."New value: +"Converter engine, used whenever the format changes (not only for PDF). If omitted, \"L\" is used. \"L\" LibreOffice: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, MD, PDF; the only converter supporting all PDF options. \"I\" Carbone ICE: DOCX and ODT to PDF; Carbone's own engine, 3x to 300x faster, recommended over \"O\" for DOCX from v5.15.0. It converts all content except WEBP and EMF/WMF images, SmartArt and complex charts (bar, line, area, pie and doughnut charts are drawn), comments, tracked changes, form fields and equations: keep the default \"L\" for documents with those. A missing font is replaced by Noto Sans (https://carbone.io/documentation/developer/http-api/generate-reports.html#converters-carbone-ice-limitations). \"O\" OnlyOffice: DOCX, XLSX, PPTX to PDF. \"C\" Chromium: HTML to PDF, JPG, PNG, WEBP with full CSS/JS; 100 MB max. PDF options: \"L\" supports all of them; \"O\", \"C\" and \"I\" apply Security (passwords, permissions) and Watermarks. Docs: https://carbone.io/documentation/developer/http-api/generate-reports.html#converters" - changed
Input schema / properties / converter / enumPrevious value: -[ - "L", - "C", - "O", - "I" -]New value: +[ + "L", + "O", + "C", + "I" +] - changed
Input schema / properties / currencyTarget / descriptionPrevious value: -"ISO 4217 currency code of the output document. The :formatC formatter converts amounts from currencySource to this currency using currencyRates. Must be set together with currencySource and currencyRates. Example: \"USD\" to display prices in US dollars. Documentation: https://carbone.io/documentation.html#formatc-precisionorformat-"New value: +"ISO 4217 currency code of the output document. The :formatC formatter converts amounts from currencySource to this currency using currencyRates. Must be set together with currencySource and currencyRates. Example: \"USD\" to display prices in US dollars. Documentation: https://carbone.io/documentation/design/formatters/currency.html#formatc-precisionorformat-targetcurrency" - changed
Input schema / properties / data / descriptionPrevious value: -"JSON data merged into the template — an object, or a top-level array (accessed with {d[i].field}). Access fields with {d.fieldName} tags. Nested objects: {d.customer.name}. Array loops: {d.items[i].description} … {d.items[i+1]}. Conditionals: {d.status == \"active\" ? \"Yes\" : \"No\"}. Optional — if omitted, defaults to an empty object {} so the template is simply converted (tags resolve to empty). Useful to convert a stored template by templateId without data injection. Instead of inlining a large dataset, you may pass a STRING reference to the JSON: a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string — it is read and parsed server-side."New value: +"JSON data merged into the template — an object, or a top-level array (accessed with {d[i].field}). Access fields with {d.fieldName} tags. Nested objects: {d.customer.name}. Array loops: {d.items[i].description} … {d.items[i+1]}. Conditions: {d.status:ifEQ(active):show(Yes):elseShow(No)}. Optional: if omitted, {} is sent, so every tag resolves to empty (\"Hello {d.name}!\" becomes \"Hello !\"). To keep the tags as written instead, pass keepTags: true (and no data). Instead of inlining a large dataset, you may pass a STRING reference to the JSON: a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string — it is read and parsed server-side." - changed
Input schema / properties / egressAuthorization / descriptionPrevious value: -"Value for the Authorization header Carbone adds to its OUTBOUND (egress) requests while rendering — fetching external images ({d.imageUrl}), external PDFs (:appendFile / :attachFile), and calling webhooks. For example \"Bearer abc123\" or \"my-secret\" makes Carbone send `authorization: <value>` to those hosts. Only the authorization header can be customised; max 512 characters. For webhook calls specifically, webhookHeaders.authorization (if set) overrides this value."New value: +"Value for the Authorization header Carbone adds to its OUTBOUND (egress) requests while rendering — fetching external images ({d.imageUrl}), external PDFs (:appendFile / :attachFile), and calling webhooks. For example \"Bearer abc123\" or \"my-secret\" makes Carbone send `authorization: <value>` to those hosts. Only the authorization header can be customised; max 511 characters. For webhook calls specifically, webhookHeaders.authorization (if set) overrides this value." - changed
Input schema / properties / egressAuthorization / maxLengthPrevious value: -512New value: +511 - changed
Input schema / properties / enum / descriptionPrevious value: -"Enumeration map used with the :convEnum(TYPE) formatter to translate code values into human-readable labels. Define one key per enum type; each value is an object mapping code → label. Example: { \"STATUS\": { \"1\": \"Active\", \"2\": \"Inactive\", \"3\": \"Pending\" }, \"ROLE\": { \"A\": \"Admin\", \"U\": \"User\" } }. Template usage: {d.status:convEnum(STATUS)}, {d.role:convEnum(ROLE)}. May instead be passed by reference as a string — a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string. Documentation: https://carbone.io/documentation.html#convenum-type-"New value: +"Enumeration map used with the :convEnum(TYPE) formatter to translate code values into human-readable labels. Define one key per enum type; each value is an object mapping code → label. Example: { \"STATUS\": { \"1\": \"Active\", \"2\": \"Inactive\", \"3\": \"Pending\" }, \"ROLE\": { \"A\": \"Admin\", \"U\": \"User\" } }. Template usage: {d.status:convEnum(STATUS)}, {d.role:convEnum(ROLE)}. May instead be passed by reference as a string — a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string. Documentation: https://carbone.io/documentation/design/advanced-features/key-value-mapping.html#convenum-type" - added
Input schema / properties / failOnAdded value: +{ + "description": "Conditions that stop the render and return an error (Carbone v5.15.0+). \"IMAGE_URL_ERROR\": an image that cannot be downloaded from its URL fails the render, instead of being replaced with the broken-image placeholder. Empty image values are skipped; base64 images, barcodes and charts are not concerned. Example: [\"IMAGE_URL_ERROR\"]. Docs: https://carbone.io/documentation/developer/http-api/generate-reports.html#fail-on", + "items": { + "enum": [ + "IMAGE_URL_ERROR" + ], + "type": "string" + }, + "type": "array" +} - changed
Input schema / properties / keepTags / descriptionPrevious value: -"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)."New value: +"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. Not the same as 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." - changed
Input schema / properties / outputPath / descriptionPrevious value: -"Optional local file path to save the generated document to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files. Ignored for async/webhook renders (no document is returned inline)."New value: +"Optional local file path to save the generated document to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files. The path must not exist yet: an existing file is never overwritten (the call fails and asks for a new file name). Ignored for async/webhook renders (no document is returned inline)." - added
Input schema / properties / preReleaseFeatureInAdded value: +{ + "description": "Pre-release feature level for this render only: features and fixes introduced up to this tag apply, later ones stay disabled. Overrides the server default; a tag set in the template overrides it. Example: 5000000. Docs: https://carbone.io/documentation/design/overview/version-lifecycle.html#pre-release-features", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" +} - changed
Input schema / properties / reportName / descriptionPrevious value: -"Filename (WITHOUT extension) for the generated document, returned in the Content-Disposition header. Carbone automatically appends the extension that matches convertTo, so do not include one — passing \"invoice.pdf\" yields \"invoice.pdf.pdf\". Supports Carbone tags resolved against the data at render time. Examples: \"invoice\" (static), \"{d.type}-{d.id}\" (dynamic), \"{d.client}-{d.date:formatD(YYYY-MM)}\"."New value: +"Filename (WITHOUT extension) for the generated document, returned in the Content-Disposition header. Carbone automatically appends the extension that matches convertTo, so do not include one — passing \"invoice.pdf\" yields \"invoice.pdf.pdf\". Supports Carbone tags resolved against the data at render time. Examples: \"invoice\" (static), \"{d.type}-{d.id}\" (dynamic), \"{d.client}-{d.date:formatD(YYYY-MM)}\". With keepTags (no templating pass), this server names the file \"<reportName>.<ext>\" itself, literally (tags are not resolved)." - changed
Input schema / properties / returnLink / descriptionPrevious value: -"If true, generate the document and return a public download URL instead of the file contents. The link is SHORT-LIVED and ONE-TIME — Carbone deletes the file after the first download — so it is meant for the end user to download once (do not fetch it programmatically). Works in stdio and HTTP. Mutually exclusive with outputPath, asAttachment, and webhookUrl (async)."New value: +"If true, generate the document and return a public download URL instead of the file contents. The link is SHORT-LIVED and ONE-TIME — Carbone deletes the file after the first download — so it is meant for the end user to download once (do not fetch it programmatically). Works in stdio and HTTP. Mutually exclusive with outputPath and asAttachment. Ignored when webhookUrl is set (no link is returned)." - changed
Input schema / properties / template / descriptionPrevious value: -"Inline template for one-shot render without storing a template first. Three input forms are accepted: (1) Local file path — absolute or relative, e.g. \"/home/user/report.docx\" or \"./invoice.xlsx\". (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. The template is uploaded and rendered in a single API request — no Template ID is returned. Use this for ephemeral renders; use upload_template + templateId when you need to reuse the template. Supported formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, IDML, XML, Markdown (MD), PDF, and more. Mutually exclusive with templateId — provide exactly one, never both."New value: +"Inline template for one-shot render without storing a template first. Three input forms are accepted: (1) Local file path — absolute, e.g. \"/Users/me/report.docx\" (or \"C:\\Users\\me\\report.docx\" on Windows), or under the home directory, e.g. \"~/report.docx\". A relative path must start with \"./\" or \"../\" and resolves against the server process's working directory, which is rarely yours: prefer an absolute path. A bare file name such as \"report.docx\" is NOT a path: it would be sent as base64 content. (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. The template is uploaded and rendered in a single API request — no Template ID is returned. Use this for ephemeral renders; use upload_template + templateId when you need to reuse the template. Supported input formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF. Carbone reads XML-based and text-based documents (plus PDF): the legacy binary Office formats DOC, XLS and PPT are rejected as input, although they are valid outputs. Re-save such a file as DOCX, XLSX or PPTX first. Mutually exclusive with templateId — provide exactly one, never both." - changed
Input schema / properties / translations / descriptionPrevious value: -"Translation map for multilingual documents. Requires \"lang\" to be set to select the active locale. Top-level keys are BCP-47 locale codes; values are key → translated-string maps. Template usage: {t(greeting)} is replaced by the matching string for the active locale. Example: { \"fr-fr\": { \"greeting\": \"Bonjour\", \"total\": \"Total\" }, \"en-us\": { \"greeting\": \"Hello\", \"total\": \"Total\" } }. These dictionaries get large, so you may instead pass a string reference — a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string. Documentation: https://carbone.io/documentation.html#translations"New value: +"Translation map for multilingual documents. Requires \"lang\" to be set to select the active locale. Top-level keys are BCP-47 locale codes; values are key → translated-string maps. Template usage: {t(greeting)} is replaced by the matching string for the active locale. Example: { \"fr-fr\": { \"greeting\": \"Bonjour\", \"total\": \"Total\" }, \"en-us\": { \"greeting\": \"Hello\", \"total\": \"Total\" } }. These dictionaries get large, so you may instead pass a string reference — a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string. Documentation: https://carbone.io/documentation/design/advanced-features/translations-i18n.html" - changed
Input schema / properties / variableStr / descriptionPrevious value: -"Carbone alias expressions evaluated once before rendering, available everywhere in the template. Used to pre-compute reusable values or shorten repetitive paths. Syntax: \"{#aliasName = expression}\". Example: \"{#fullName = d.firstName + \\\" \\\" + d.lastName}{#total = d.price * d.qty}\". Aliases are then used in the template as {#fullName}, {#total}. Documentation: https://carbone.io/documentation.html#alias"New value: +"Carbone alias definitions applied to the whole template, as if written in it. An alias is a shortcut to a data path, not a variable: it stores no value and computes nothing (no arithmetic, no concatenation). Define with {#alias = d.path}, optionally with $parameters: {#mealOf($weekday) = d[weekday = $weekday]}. Use them in the template with {$alias}, e.g. {$mealOf(2).name}. Example: \"{#buyer = d.order.customer}\", then {$buyer.name} in the template renders d.order.customer.name. To store a computed value, use the :set formatter instead. Documentation: https://carbone.io/documentation/design/substitutions/aliases.html#alias" - changed
Input schema / properties / webhookUrl / descriptionPrevious value: -"Webhook URL to enable asynchronous rendering. When provided, Carbone returns immediately and POSTs { \"success\": true, \"data\": { \"renderId\": \"...\" } } to this URL when the document is ready. The default render timeout is extended to 5 minutes on Carbone Cloud (vs 60 s for synchronous requests). Download the document with GET /render/:renderId once the webhook is received. Required when using batchSplitBy (batch generation is always asynchronous). Example: \"https://your-server.com/carbone-webhook\"."New value: +"Webhook URL that enables asynchronous rendering (render timeout raised to 5 minutes). This tool then returns only Carbone's acceptance message, never the document. When the document is ready, Carbone POSTs { \"success\": true, \"data\": { \"renderId\": \"...\" } } to this URL; the server behind it must download the document itself with GET /render/{renderId} on the Carbone API (one-time, no auth). You cannot fetch it from here. Required for batchSplitBy: batch output is always delivered this way. outputPath, asAttachment and returnLink are ignored in this mode. Example: \"https://your-server.com/carbone-webhook\"."
- Changed
update_template_metadata16 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / category / descriptionPrevious value: -"New category."New value: +"New category, max 200 characters." - added
Input schema / properties / category / maxLengthAdded value: +200 - changed
Input schema / properties / comment / descriptionPrevious value: -"New free-text comment."New value: +"New free-text comment, max 200 characters." - added
Input schema / properties / comment / maxLengthAdded value: +200 - changed
Input schema / properties / deployedAt / descriptionPrevious value: -"Unix timestamp (seconds) to set as the deployment time for this version. Carbone picks the version with the most recent deployedAt when rendering. Use 42000000000 to deploy immediately (special \"NOW\" value)."New value: +"Unix timestamp (seconds) to set as the deployment time for this version. Carbone picks the version with the most recent deployedAt when rendering by Template ID. Use 42000000000 to deploy immediately (special \"NOW\" value). Future values are not allowed, and the deployed version's deployedAt cannot move back in time." - changed
Input schema / properties / expireAt / descriptionPrevious value: -"Unix timestamp (seconds) at which this template will be automatically deleted. Use 42000000000 to delete immediately."New value: +"Schedule deletion of the patched version at a UTC Unix timestamp (seconds). After that time it is no longer listed, downloadable or renderable (404), and the file is purged after the retention delay. Send 0 to cancel a scheduled deletion (permanent again); omit to leave it unchanged. To delete now, use delete_template." - changed
Input schema / properties / expireAt / minimumPrevious value: --9007199254740991New value: +0 - changed
Input schema / properties / id / descriptionPrevious value: -"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."New value: +"DEPRECATED: the 1.6.0 name of moveToTemplateId, kept so existing callers keep working. Use moveToTemplateId; passing both with different values is rejected." - added
Input schema / properties / id / minLengthAdded value: +1 - added
Input schema / properties / moveToTemplateIdAdded value: +{ + "description": "CAUTION, structural change: moves the patched version to this other Template ID (64-bit; a Version ID is rejected). It is NOT the template to patch (that is templateId). Pass the version's Version ID as templateId; with a Template ID, its currently deployed version is moved and that Template ID falls back to its next most recent version (or stops resolving if none is left). Fails if the move creates a deployedAt conflict at the destination. Only use it when the user asks to move a version.", + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / name / descriptionPrevious value: -"New display name."New value: +"New display name, max 200 characters." - added
Input schema / properties / name / maxLengthAdded value: +200 - changed
Input schema / properties / tags / descriptionPrevious value: -"New list of tags — replaces existing tags entirely."New value: +"New list of tags, replacing the existing ones. Duplicates are removed and the list is sorted; the whole list is limited to 100 characters (about 8 tags of 9 characters)." - changed
Input schema / properties / templateId / descriptionPrevious value: -"Template ID (64-bit) or Version ID (SHA-256) to update. Using a Template ID updates the metadata shared by all versions. Using a Version ID updates only that specific version."New value: +"Template ID (64-bit) or Version ID (SHA-256) of the version to update. A Template ID patches only its currently deployed version (not every version). A Version ID patches that exact version." - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "additionalProperties": false, + "properties": { + "category": { + "description": "Category, returned if updated.", + "type": "string" + }, + "comment": { + "description": "Comment, returned if updated.", + "type": "string" + }, + "deployedAt": { + "description": "Deployment timestamp, returned if updated.", + "type": "number" + }, + "expireAt": { + "description": "Deletion timestamp (0 = never expires), returned if updated.", + "type": "number" + }, + "id": { + "description": "Template ID the version now belongs to (returned when moveToTemplateId was used).", + "type": "string" + }, + "name": { + "description": "Name, returned if updated.", + "type": "string" + }, + "tags": { + "description": "Tags, returned if updated.", + "items": { + "type": "string" + }, + "type": "array" + }, + "versionId": { + "description": "Version ID of the patched version.", + "type": "string" + } + }, + "required": [ + "versionId" + ], + "type": "object" +}
- Changed
upload_template24 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - changed
Input schema / properties / category / descriptionPrevious value: -"Group templates into folders/categories (e.g. \"invoices\", \"legal\", \"hr\")."New value: +"Group templates into folders/categories, max 200 characters (e.g. \"invoices\", \"legal\", \"hr\")." - added
Input schema / properties / category / maxLengthAdded value: +200 - changed
Input schema / properties / comment / descriptionPrevious value: -"Free-text comment to describe the template version or its purpose."New value: +"Free-text comment to describe the template version or its purpose, max 200 characters." - added
Input schema / properties / comment / maxLengthAdded value: +200 - changed
Input schema / properties / deployedAt / descriptionPrevious value: -"UTC Unix timestamp (seconds) to set as the deployment time for this version. Carbone uses the version with the most recent deployedAt when rendering via Template ID. Use 42000000000 to deploy immediately (special \"NOW\" sentinel value)."New value: +"UTC Unix timestamp (seconds) to set as the deployment time for this version. Carbone uses the version with the most recent deployedAt when rendering via Template ID. Use 42000000000 to deploy immediately (special \"NOW\" sentinel value). Future values are not allowed." - changed
Input schema / properties / expireAt / descriptionPrevious value: -"UTC Unix timestamp (seconds) at which this template will be automatically deleted. Use 42000000000 to delete immediately (special \"NOW\" sentinel value)."New value: +"Schedule deletion at a UTC Unix timestamp (seconds); 0 (default) means the template never expires. After that time it is no longer listed, downloadable or renderable (404), and the file is purged after the retention delay. To remove a template now, use delete_template." - changed
Input schema / properties / expireAt / minimumPrevious value: --9007199254740991New value: +0 - changed
Input schema / properties / name / descriptionPrevious value: -"Display name for the template (e.g. \"Invoice Template\", \"NDA Contract\")."New value: +"Display name for the template, max 200 characters (e.g. \"Invoice Template\", \"NDA Contract\"). Optional but recommended: list_templates shows it and its search matches it." - added
Input schema / properties / name / maxLengthAdded value: +200 - changed
Input schema / properties / sample / descriptionPrevious value: -"Sample input data attached to the template for testing in Carbone Studio. Each item must include data, complement, translations, and enum objects."New value: +"Sample input data attached to the template for testing in Carbone Studio: an array with at most ONE object, whose keys data, complement, translations and enum are all optional. Example: [{ \"data\": { \"name\": \"Acme\" } }]." - added
Input schema / properties / sample / items / additionalPropertiesAdded value: +false - removed
Input schema / properties / sample / items / requiredRemoved value: -[ - "data", - "complement", - "translations", - "enum" -] - added
Input schema / properties / sample / maxItemsAdded value: +1 - changed
Input schema / properties / tags / descriptionPrevious value: -"Tags for searchability and filtering (e.g. [\"sales\", \"billing\", \"v2\"])."New value: +"Labels shown by list_tags and on each list_templates result (e.g. [\"sales\", \"billing\", \"v2\"]). Duplicates are removed and the list is sorted; the whole list is limited to 100 characters (about 8 tags of 9 characters)." - changed
Input schema / properties / template / descriptionPrevious value: -"The template file. Three input forms are accepted: (1) Local file path — absolute or relative, e.g. \"/home/user/report.docx\" or \"./invoice.xlsx\". (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. Supported formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, IDML, XML, Markdown (MD), PDF, and more. Full list: https://carbone.io/documentation/developer/http-api/generate-reports.md"New value: +"The template file. Three input forms are accepted: (1) Local file path — absolute, e.g. \"/Users/me/report.docx\" (or \"C:\\Users\\me\\report.docx\" on Windows), or under the home directory, e.g. \"~/report.docx\". A relative path must start with \"./\" or \"../\" and resolves against the server process's working directory, which is rarely yours: prefer an absolute path. A bare file name such as \"report.docx\" is NOT a path: it would be sent as base64 content. (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. Supported input formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, MD, TXT, CSV, RTF, PDF. Carbone reads XML-based and text-based documents (plus PDF): the legacy binary Office formats DOC, XLS and PPT are rejected as input, although they are valid outputs. Re-save such a file as DOCX, XLSX or PPTX first." - changed
Input schema / properties / versioning / descriptionPrevious value: -"Enable template versioning (default: true). When true, a stable Template ID is generated and multiple versions can be managed under it. When false, behaves as legacy mode and returns only a templateId (SHA-256 hash)."New value: +"Enable template versioning (default: true). When true, a stable Template ID is generated and multiple versions can be managed under it. When false, behaves as legacy mode and returns only a templateId (SHA-256 hash) and templateExtension." - changed
Input schema / requiredPrevious value: -[ - "template", - "name" -]New value: +[ + "template" +] - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / properties / createdAtAdded value: +{ + "description": "UTC Unix timestamp (seconds) of the upload.", + "type": "number" +} - added
Output schema / properties / deployedAtAdded value: +{ + "description": "UTC Unix timestamp of deployment; 0 means this version is not explicitly deployed.", + "type": "number" +} - changed
Output schema / properties / name / descriptionPrevious value: -"Template display name."New value: +"Template display name, when one was given." - added
Output schema / properties / templateExtensionAdded value: +{ + "description": "Detected file extension, e.g. \"docx\" (legacy/non-versioned mode).", + "type": "string" +} - removed
Output schema / requiredRemoved value: -[ - "name" -]
6 tool updates
v1.6.0- Changed
convert_document8 fields changed- changed
Input schema / properties / convertTo / anyOfPrevious value: -[ - { - "enum": [ - "pdf", - "docx", - "xlsx", - "pptx", - "odt", - "ods", - "odp", - "odg", - "html", - "xhtml", - "txt", - "csv", - "md", - "xml", - "rtf", - "png", - "jpg", - "jpeg", - "webp", - "svg", - "tiff", - "bmp", - "gif", - "zip", - "idml", - "epub", - "cdr" - ], - "type": "string" - }, - { - "properties": { - "formatName": { - "description": "Target format name.", - "enum": [ - "pdf", - "docx", - "xlsx", - "pptx", - "odt", - "ods", - "odp", - "odg", - "html", - "xhtml", - "txt", - "csv", - "md", - "xml", - "rtf", - "png", - "jpg", - "jpeg", - "webp", - "svg", - "tiff", - "bmp", - "gif", - "zip", - "idml", - "epub", - "cdr" - ], - "type": "string" - }, - "formatOptions": { - "additionalProperties": {}, - "description": "Advanced format options object. Examples by format: PDF — { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\", \"DocumentPermissionPassword\": \"owner\" } password-protect; PDF — { \"Watermarks\": [{ \"text\": \"DRAFT\", \"opacity\": 0.2, \"rotation\": -45, \"fontsize\": 60 }] } up to 5 watermarks; PDF — { \"SelectPdfVersion\": 1 } PDF/A-1b compliance (use 2 for PDF/A-2, 3 for PDF/A-3); PDF — { \"PageRange\": \"1-3,5\" } export specific pages only; PDF — { \"ConvertSlideshow\": true } convert each slide to a separate PDF page; Images (PNG/JPG/WEBP) — { \"Quality\": 90 } set compression quality 0-100; Images — { \"density\": 150 } set DPI for rasterisation (default 96); CSV — { \"fieldSeparator\": \";\" } custom column separator.", - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "formatName" - ], - "type": "object" - } -]New value: +[ + { + "enum": [ + "pdf", + "docx", + "doc", + "xlsx", + "xls", + "pptx", + "ppt", + "odt", + "ods", + "odp", + "odg", + "html", + "xhtml", + "txt", + "csv", + "md", + "xml", + "rtf", + "png", + "jpg", + "jpeg", + "webp", + "svg", + "tiff", + "bmp", + "gif", + "zip", + "idml", + "epub", + "cdr" + ], + "type": "string" + }, + { + "properties": { + "formatName": { + "description": "Target format name.", + "enum": [ + "pdf", + "docx", + "doc", + "xlsx", + "xls", + "pptx", + "ppt", + "odt", + "ods", + "odp", + "odg", + "html", + "xhtml", + "txt", + "csv", + "md", + "xml", + "rtf", + "png", + "jpg", + "jpeg", + "webp", + "svg", + "tiff", + "bmp", + "gif", + "zip", + "idml", + "epub", + "cdr" + ], + "type": "string" + }, + "formatOptions": { + "additionalProperties": {}, + "description": "Advanced format options object. Examples by format: PDF — { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\", \"DocumentPermissionPassword\": \"owner\" } password-protect; PDF — { \"Watermarks\": [{ \"text\": \"DRAFT\", \"opacity\": 0.2, \"rotation\": -45, \"fontsize\": 60 }] } up to 5 watermarks; PDF — { \"SelectPdfVersion\": 1 } PDF/A-1b compliance (use 2 for PDF/A-2, 3 for PDF/A-3); PDF — { \"PageRange\": \"1-3,5\" } export specific pages only; PDF — { \"ConvertSlideshow\": true } convert each slide to a separate PDF page; Images (PNG/JPG/WEBP) — { \"Quality\": 90 } set compression quality 0-100; Images — { \"density\": 150 } set DPI for rasterisation (default 96); CSV — { \"fieldSeparator\": \";\" } custom column separator.", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "formatName" + ], + "type": "object" + } +] - changed
Input schema / properties / convertTo / descriptionPrevious value: -"Target output format. Documents : \"pdf\", \"docx\", \"xlsx\", \"pptx\", \"odt\", \"ods\", \"odp\", \"odg\", \"rtf\", \"epub\". Web/text : \"html\", \"xhtml\", \"txt\", \"csv\", \"md\", \"xml\", \"idml\". Images : \"png\", \"jpg\", \"jpeg\", \"webp\", \"svg\", \"tiff\", \"bmp\", \"gif\". Archive : \"zip\" (batch output). Simple usage: \"pdf\". Advanced usage: { \"formatName\": \"pdf\", \"formatOptions\": { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\" } }."New value: +"Target output format. Documents : \"pdf\", \"docx\", \"xlsx\", \"pptx\", \"odt\", \"ods\", \"odp\", \"odg\", \"rtf\", \"epub\", plus the legacy \"doc\", \"xls\", \"ppt\" (output only — Carbone writes them but cannot read them back). Web/text : \"html\", \"xhtml\", \"txt\", \"csv\", \"md\", \"xml\", \"idml\". Images : \"png\", \"jpg\", \"jpeg\", \"webp\", \"svg\", \"tiff\", \"bmp\", \"gif\". Archive : \"zip\" (batch output). Simple usage: \"pdf\". Advanced usage: { \"formatName\": \"pdf\", \"formatOptions\": { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\" } }." - changed
Input schema / properties / converter / descriptionPrevious value: -"Converter engine. Only relevant when convertTo is \"pdf\" (or an image format rasterised from a document). \"L\" — LibreOffice (default): best all-round engine for DOCX, XLSX, PPTX, ODT, ODS, ODP. \"O\" — OnlyOffice: highest fidelity rendering for Microsoft Office formats (DOCX, XLSX, PPTX). \"C\" — Chromium: best for HTML, CSS, JavaScript — full browser rendering. If omitted, LibreOffice is used by default."New value: +"Converter engine. Only relevant when convertTo is \"pdf\" (or an image format rasterised from a document). \"L\" — LibreOffice (default): best all-round engine for DOCX, XLSX, PPTX, ODT, ODS, ODP. \"O\" — OnlyOffice: highest fidelity rendering for Microsoft Office formats (DOCX, XLSX, PPTX). \"C\" — Chromium: best for HTML, CSS, JavaScript — full browser rendering. \"I\" — Carbone ICE (Instant Converter Engine, Carbone 5.14.0+): DOCX → PDF ONLY, no third-party converter — up to 60x faster than LibreOffice on a 1000-page DOCX (3x on a one-page document). Any other input or output format is REJECTED — use another converter for those. PDF options: only Watermarks are applied. EncryptFile, DocumentOpenPassword, RestrictPermissions and the other security options are SILENTLY IGNORED — the PDF comes back readable by anyone, with no error — so NEVER pick \"I\" when the request needs a password or restricted permissions; use \"L\" for those. Also unsupported: WEBP and EMF/WMF images, table of contents, SmartArt, complex charts, footnotes/endnotes, comments, tracked changes, form fields, equations, bookmarks and links; a missing font falls back to Noto Sans. If omitted, LibreOffice is used by default." - changed
Input schema / properties / converter / enumPrevious value: -[ - "L", - "C", - "O" -]New value: +[ + "L", + "C", + "O", + "I" +] - changed
Input schema / properties / file / descriptionPrevious value: -"The document to convert. Three input forms are accepted: (1) Local file path — absolute or relative, e.g. \"/home/user/report.docx\" or \"./invoice.xlsx\". (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. Supported input formats include: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, IDML, Markdown (MD), PDF, TXT, CSV, PNG, JPG, SVG, and more. Full conversion matrix: https://carbone.io/documentation/developer/http-api/generate-reports.md"New value: +"The document to convert. Three input forms are accepted: (1) Local file path — absolute or relative, e.g. \"/home/user/report.docx\" or \"./invoice.xlsx\". (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. Supported input formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, Markdown (MD), TXT, CSV, RTF, PDF, PNG and JPG. Carbone reads XML-based and text-based documents only, so the legacy BINARY Office formats DOC, XLS and PPT are REJECTED as input — Carbone can produce them as output but cannot read them. Re-save such a file as DOCX/XLSX/PPTX first. Full conversion matrix: https://carbone.io/documentation/developer/http-api/generate-reports.md" - added
Input schema / properties / hardRefreshAdded value: +{ + "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.", + "type": "boolean" +} - changed
Input schema / properties / outputPath / descriptionPrevious value: -"Optional local file path to save the converted document to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files. Local (stdio) mode only; rejected in HTTP mode."New value: +"Optional local file path to save the converted document to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files." - added
Input schema / properties / reportNameAdded value: +{ + "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.", + "type": "string" +}
- Changed
download_template2 fields changed- changed
Input schema / properties / outputPath / descriptionPrevious value: -"Optional local file path to save the template file to (e.g. \"/home/user/template.docx\" or \"~/template.docx\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the file inline. Local (stdio) mode only; rejected in HTTP mode."New value: +"Optional local file path to save the template file to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files." - added
Input schema / properties / sampleAdded value: +{ + "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.", + "type": "boolean" +}
- Changed
list_templates2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results to return. Must be between 1 and 100 (Carbone API limit). Default: 100."New value: +"Maximum number of results to return, between 1 and 100. Default: 100. Use cursor to page beyond that." - changed
Input schema / properties / origin / descriptionPrevious value: -"Filter by upload origin. 0 = uploaded via API, 1 = uploaded via Carbone Studio."New value: +"Filter by upload origin. 0 = API, 1 = Carbone Studio, 2 = Salesforce, 3 = Odoo, 4 = HubSpot. Templates created through this MCP are origin 0."
- Changed
render_document15 fields changed- changed
Input schema / properties / batchOutput / descriptionPrevious value: -"Container format for the batch result. Use \"zip\" to receive all generated documents as a single ZIP archive. Must be used together with batchSplitBy."New value: +"How the batch result is packaged. Defaults to \"zip\". \"zip\" — every generated document is bundled into a single ZIP archive (use batchReportName to name each entry). \"pdf\" — all documents are CONCATENATED into one continuous PDF instead of being zipped; this requires convertTo to be \"pdf\" as well. Must be used together with batchSplitBy." - added
Input schema / properties / batchOutput / enumAdded value: +[ + "zip", + "pdf" +] - changed
Input schema / properties / batchReportName / descriptionPrevious value: -"Filename pattern for each individual document inside the batch ZIP. Supports Carbone tags. Tags are resolved against the item's data (relative path) or the full dataset (absolute path). Examples: \"invoice-{d.id}.pdf\", \"{d.client.name}-{d.date}.docx\". Must be used together with batchSplitBy."New value: +"Filename pattern for each individual document inside the batch ZIP. Supports Carbone tags. Tags are resolved against the item's data (relative path) or the full dataset (absolute path). Examples: \"invoice-{d.id}.pdf\", \"{d.client.name}-{d.date}.docx\". Carbone sanitises the result — path separators, \"..\", Windows-forbidden and control characters each become an underscore — and appends an index to duplicates (\"report_1.pdf\", \"report_2.pdf\"), so a pattern that resolves to the same name for several items will not silently drop documents. Only meaningful with batchOutput: \"zip\"; a concatenated \"pdf\" batch is a single file. Must be used together with batchSplitBy." - changed
Input schema / properties / batchSplitBy / descriptionPrevious value: -"JSON path to the array in your data that drives batch generation. One document is generated per element of the array; all documents are bundled together. Use batchOutput: \"zip\" to receive a single ZIP archive. Use batchReportName to customise each filename inside the ZIP. Example: \"d.invoices\" — produces one PDF per item in data.invoices. Example: \"d.employees\" — produces one contract per employee."New value: +"JSON path to the array in your data that drives batch generation. One document is generated per element of the array. Two forms: \"d\" when data itself IS the array (one report per top-level element), or \"d.arrayName\" to split on a child array. Example: \"d.invoices\" — produces one PDF per item in data.invoices. Example: \"d.employees\" — produces one contract per employee. Carbone Cloud allows 1 to 100 objects per batch (on-premise follows the nbReportMaxPerBatch setting). Batch is ALWAYS asynchronous — webhookUrl is required. Pair with batchOutput to choose ZIP or a single concatenated PDF, and batchReportName to name each document." - changed
Input schema / properties / complement / descriptionPrevious value: -"Extra data object accessible in templates with {c.field} tags (as opposed to {d.field} for main data). Useful for static or shared values that should not be mixed into the main dataset: company info, logo URLs, footer text, configuration constants. Example: { \"company\": \"Acme Corp\", \"address\": \"123 Main St\", \"vatNumber\": \"FR12345\" }. Like data, may instead be passed by reference as a string — a local path, HTTPS URL, or base64 to a JSON file."New value: +"Extra data object accessible in templates with {c.field} tags (as opposed to {d.field} for main data). Useful for static or shared values that should not be mixed into the main dataset: company info, logo URLs, footer text, configuration constants. Example: { \"company\": \"Acme Corp\", \"address\": \"123 Main St\", \"vatNumber\": \"FR12345\" }. Like data, may instead be passed by reference as a string — a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string." - changed
Input schema / properties / convertTo / anyOfPrevious value: -[ - { - "enum": [ - "pdf", - "docx", - "xlsx", - "pptx", - "odt", - "ods", - "odp", - "odg", - "html", - "xhtml", - "txt", - "csv", - "md", - "xml", - "rtf", - "png", - "jpg", - "jpeg", - "webp", - "svg", - "tiff", - "bmp", - "gif", - "zip", - "idml", - "epub", - "cdr" - ], - "type": "string" - }, - { - "properties": { - "formatName": { - "description": "Target format name.", - "enum": [ - "pdf", - "docx", - "xlsx", - "pptx", - "odt", - "ods", - "odp", - "odg", - "html", - "xhtml", - "txt", - "csv", - "md", - "xml", - "rtf", - "png", - "jpg", - "jpeg", - "webp", - "svg", - "tiff", - "bmp", - "gif", - "zip", - "idml", - "epub", - "cdr" - ], - "type": "string" - }, - "formatOptions": { - "additionalProperties": {}, - "description": "Advanced format options object. Examples by format: PDF — { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\", \"DocumentPermissionPassword\": \"owner\" } password-protect; PDF — { \"Watermarks\": [{ \"text\": \"DRAFT\", \"opacity\": 0.2, \"rotation\": -45, \"fontsize\": 60 }] } up to 5 watermarks; PDF — { \"SelectPdfVersion\": 1 } PDF/A-1b compliance (use 2 for PDF/A-2, 3 for PDF/A-3); PDF — { \"PageRange\": \"1-3,5\" } export specific pages only; PDF — { \"ConvertSlideshow\": true } convert each slide to a separate PDF page; Images (PNG/JPG/WEBP) — { \"Quality\": 90 } compression quality 0-100; Images — { \"density\": 150 } DPI for rasterisation (default 96); CSV — { \"fieldSeparator\": \";\" } custom column separator.", - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "formatName" - ], - "type": "object" - } -]New value: +[ + { + "enum": [ + "pdf", + "docx", + "doc", + "xlsx", + "xls", + "pptx", + "ppt", + "odt", + "ods", + "odp", + "odg", + "html", + "xhtml", + "txt", + "csv", + "md", + "xml", + "rtf", + "png", + "jpg", + "jpeg", + "webp", + "svg", + "tiff", + "bmp", + "gif", + "zip", + "idml", + "epub", + "cdr" + ], + "type": "string" + }, + { + "properties": { + "formatName": { + "description": "Target format name.", + "enum": [ + "pdf", + "docx", + "doc", + "xlsx", + "xls", + "pptx", + "ppt", + "odt", + "ods", + "odp", + "odg", + "html", + "xhtml", + "txt", + "csv", + "md", + "xml", + "rtf", + "png", + "jpg", + "jpeg", + "webp", + "svg", + "tiff", + "bmp", + "gif", + "zip", + "idml", + "epub", + "cdr" + ], + "type": "string" + }, + "formatOptions": { + "additionalProperties": {}, + "description": "Advanced format options object. Examples by format: PDF — { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\", \"DocumentPermissionPassword\": \"owner\" } password-protect; PDF — { \"Watermarks\": [{ \"text\": \"DRAFT\", \"opacity\": 0.2, \"rotation\": -45, \"fontsize\": 60 }] } up to 5 watermarks; PDF — { \"SelectPdfVersion\": 1 } PDF/A-1b compliance (use 2 for PDF/A-2, 3 for PDF/A-3); PDF — { \"PageRange\": \"1-3,5\" } export specific pages only; PDF — { \"ConvertSlideshow\": true } convert each slide to a separate PDF page; Images (PNG/JPG/WEBP) — { \"Quality\": 90 } compression quality 0-100; Images — { \"density\": 150 } DPI for rasterisation (default 96); CSV — { \"fieldSeparator\": \";\" } custom column separator.", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "formatName" + ], + "type": "object" + } +] - changed
Input schema / properties / converter / descriptionPrevious value: -"Converter engine. Only relevant when convertTo is \"pdf\" (or an image rasterised from a document). \"L\" — LibreOffice (default): best all-round engine for DOCX, XLSX, PPTX, ODT, ODS, ODP. \"O\" — OnlyOffice: highest fidelity for Microsoft Office formats (DOCX, XLSX, PPTX). \"C\" — Chromium: best for HTML/CSS/JS templates — full browser rendering. If omitted, LibreOffice is used by default."New value: +"Converter engine. Only relevant when convertTo is \"pdf\" (or an image rasterised from a document). \"L\" — LibreOffice (default): best all-round engine for DOCX, XLSX, PPTX, ODT, ODS, ODP. \"O\" — OnlyOffice: highest fidelity for Microsoft Office formats (DOCX, XLSX, PPTX). \"C\" — Chromium: best for HTML/CSS/JS templates — full browser rendering. \"I\" — Carbone ICE (Instant Converter Engine, Carbone 5.14.0+): DOCX → PDF ONLY, no third-party converter — up to 60x faster than LibreOffice on a 1000-page DOCX (3x on a one-page document). Any other input or output format is REJECTED — use another converter for those. PDF options: only Watermarks are applied. EncryptFile, DocumentOpenPassword, RestrictPermissions and the other security options are SILENTLY IGNORED — the PDF comes back readable by anyone, with no error — so NEVER pick \"I\" when the request needs a password or restricted permissions; use \"L\" for those. Also unsupported: WEBP and EMF/WMF images, table of contents, SmartArt, complex charts, footnotes/endnotes, comments, tracked changes, form fields, equations, bookmarks and links; a missing font falls back to Noto Sans. If omitted, LibreOffice is used by default." - changed
Input schema / properties / converter / enumPrevious value: -[ - "L", - "C", - "O" -]New value: +[ + "L", + "C", + "O", + "I" +] - changed
Input schema / properties / currencyRates / descriptionPrevious value: -"Exchange rate table used by :formatC for currency conversion. Keys are ISO 4217 currency codes; values are rates relative to a common base. The base currency should have rate 1. Example: { \"EUR\": 1, \"USD\": 1.08, \"GBP\": 0.86, \"JPY\": 160.5 }. May instead be passed by reference as a string — a local path, HTTPS URL, or base64 to a JSON file."New value: +"Exchange rate table used by :formatC for currency conversion. Keys are ISO 4217 currency codes; values are rates relative to a common base. The base currency should have rate 1. Example: { \"EUR\": 1, \"USD\": 1.08, \"GBP\": 0.86, \"JPY\": 160.5 }. May instead be passed by reference as a string — a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string." - changed
Input schema / properties / data / descriptionPrevious value: -"JSON data merged into the template — an object, or a top-level array (accessed with {d[i].field}). Access fields with {d.fieldName} tags. Nested objects: {d.customer.name}. Array loops: {d.items[i].description} … {d.items[i+1]}. Conditionals: {d.status == \"active\" ? \"Yes\" : \"No\"}. Optional — if omitted, defaults to an empty object {} so the template is simply converted (tags resolve to empty). Useful to convert a stored template by templateId without data injection. Instead of inlining a large dataset, you may pass a STRING reference to the JSON: a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string — it is read and parsed server-side. Local paths resolve in stdio (local) mode only; URLs and base64 work in both transports."New value: +"JSON data merged into the template — an object, or a top-level array (accessed with {d[i].field}). Access fields with {d.fieldName} tags. Nested objects: {d.customer.name}. Array loops: {d.items[i].description} … {d.items[i+1]}. Conditionals: {d.status == \"active\" ? \"Yes\" : \"No\"}. Optional — if omitted, defaults to an empty object {} so the template is simply converted (tags resolve to empty). Useful to convert a stored template by templateId without data injection. Instead of inlining a large dataset, you may pass a STRING reference to the JSON: a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string — it is read and parsed server-side." - changed
Input schema / properties / enum / descriptionPrevious value: -"Enumeration map used with the :convEnum(TYPE) formatter to translate code values into human-readable labels. Define one key per enum type; each value is an object mapping code → label. Example: { \"STATUS\": { \"1\": \"Active\", \"2\": \"Inactive\", \"3\": \"Pending\" }, \"ROLE\": { \"A\": \"Admin\", \"U\": \"User\" } }. Template usage: {d.status:convEnum(STATUS)}, {d.role:convEnum(ROLE)}. May instead be passed by reference as a string — a local path, HTTPS URL, or base64 to a JSON file. Documentation: https://carbone.io/documentation.html#convenum-type-"New value: +"Enumeration map used with the :convEnum(TYPE) formatter to translate code values into human-readable labels. Define one key per enum type; each value is an object mapping code → label. Example: { \"STATUS\": { \"1\": \"Active\", \"2\": \"Inactive\", \"3\": \"Pending\" }, \"ROLE\": { \"A\": \"Admin\", \"U\": \"User\" } }. Template usage: {d.status:convEnum(STATUS)}, {d.role:convEnum(ROLE)}. May instead be passed by reference as a string — a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string. Documentation: https://carbone.io/documentation.html#convenum-type-" - added
Input schema / properties / keepTagsAdded value: +{ + "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).", + "type": "boolean" +} - changed
Input schema / properties / outputPath / descriptionPrevious value: -"Optional local file path to save the generated document to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files. Local (stdio) mode only; rejected in HTTP mode. Ignored for async/webhook renders (no document is returned inline)."New value: +"Optional local file path to save the generated document to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files. Ignored for async/webhook renders (no document is returned inline)." - changed
Input schema / properties / template / descriptionPrevious value: -"Inline template for one-shot render without storing a template first. Accepts a local file path (e.g. /home/user/invoice.docx), a URL (https://example.com/template.docx), or a base64-encoded string. The template is uploaded and rendered in a single API request — no Template ID is returned. Use this for ephemeral renders; use upload_template + templateId when you need to reuse the template. Supported formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, IDML, XML, Markdown (MD), PDF, and more. Mutually exclusive with templateId — provide exactly one, never both."New value: +"Inline template for one-shot render without storing a template first. Three input forms are accepted: (1) Local file path — absolute or relative, e.g. \"/home/user/report.docx\" or \"./invoice.xlsx\". (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. The template is uploaded and rendered in a single API request — no Template ID is returned. Use this for ephemeral renders; use upload_template + templateId when you need to reuse the template. Supported formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, IDML, XML, Markdown (MD), PDF, and more. Mutually exclusive with templateId — provide exactly one, never both." - changed
Input schema / properties / translations / descriptionPrevious value: -"Translation map for multilingual documents. Requires \"lang\" to be set to select the active locale. Top-level keys are BCP-47 locale codes; values are key → translated-string maps. Template usage: {t(greeting)} is replaced by the matching string for the active locale. Example: { \"fr-fr\": { \"greeting\": \"Bonjour\", \"total\": \"Total\" }, \"en-us\": { \"greeting\": \"Hello\", \"total\": \"Total\" } }. These dictionaries get large, so you may instead pass a string reference — a local path, HTTPS URL, or base64 to a JSON file. Documentation: https://carbone.io/documentation.html#translations"New value: +"Translation map for multilingual documents. Requires \"lang\" to be set to select the active locale. Top-level keys are BCP-47 locale codes; values are key → translated-string maps. Template usage: {t(greeting)} is replaced by the matching string for the active locale. Example: { \"fr-fr\": { \"greeting\": \"Bonjour\", \"total\": \"Total\" }, \"en-us\": { \"greeting\": \"Hello\", \"total\": \"Total\" } }. These dictionaries get large, so you may instead pass a string reference — a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string. Documentation: https://carbone.io/documentation.html#translations"
- Changed
update_template_metadata1 field changed- added
Input schema / properties / idAdded value: +{ + "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.", + "type": "string" +}
- Changed
upload_template1 field changed- changed
Input schema / properties / template / descriptionPrevious value: -"The template file. Accepts a local file path (e.g. /home/user/invoice.docx), a URL (https://example.com/template.docx), or a base64-encoded string. Supported formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, IDML, XML, Markdown (MD), PDF, and more. Full list: https://carbone.io/documentation/developer/http-api/generate-reports.md"New value: +"The template file. Three input forms are accepted: (1) Local file path — absolute or relative, e.g. \"/home/user/report.docx\" or \"./invoice.xlsx\". (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. Supported formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, IDML, XML, Markdown (MD), PDF, and more. Full list: https://carbone.io/documentation/developer/http-api/generate-reports.md"
2 tool updates
v1.4.0- Changed
convert_document1 field changed- added
Input schema / properties / egressAuthorizationAdded value: +{ + "description": "Value for the Authorization header Carbone adds to its OUTBOUND (egress) requests during conversion — e.g. when a Chromium HTML→PDF conversion fetches a protected external image or stylesheet. For example \"Bearer abc123\" makes Carbone send `authorization: Bearer abc123` to those hosts. Only the authorization header can be customised; max 512 characters.", + "maxLength": 512, + "type": "string" +}
- Changed
render_document3 fields changed- changed
Input schema / properties / data / descriptionPrevious value: -"JSON data merged into the template — an object, or a top-level array (accessed with {d[i].field}). Access fields with {d.fieldName} tags. Nested objects: {d.customer.name}. Array loops: {d.items[i].description} … {d.items[i+1]}. Conditionals: {d.status == \"active\" ? \"Yes\" : \"No\"}. For pure document conversion without data injection, pass {}. Instead of inlining a large dataset, you may pass a STRING reference to the JSON: a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string — it is read and parsed server-side. Local paths resolve in stdio (local) mode only; URLs and base64 work in both transports."New value: +"JSON data merged into the template — an object, or a top-level array (accessed with {d[i].field}). Access fields with {d.fieldName} tags. Nested objects: {d.customer.name}. Array loops: {d.items[i].description} … {d.items[i+1]}. Conditionals: {d.status == \"active\" ? \"Yes\" : \"No\"}. Optional — if omitted, defaults to an empty object {} so the template is simply converted (tags resolve to empty). Useful to convert a stored template by templateId without data injection. Instead of inlining a large dataset, you may pass a STRING reference to the JSON: a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string — it is read and parsed server-side. Local paths resolve in stdio (local) mode only; URLs and base64 work in both transports." - added
Input schema / properties / egressAuthorizationAdded value: +{ + "description": "Value for the Authorization header Carbone adds to its OUTBOUND (egress) requests while rendering — fetching external images ({d.imageUrl}), external PDFs (:appendFile / :attachFile), and calling webhooks. For example \"Bearer abc123\" or \"my-secret\" makes Carbone send `authorization: <value>` to those hosts. Only the authorization header can be customised; max 512 characters. For webhook calls specifically, webhookHeaders.authorization (if set) overrides this value.", + "maxLength": 512, + "type": "string" +} - removed
Input schema / requiredRemoved value: -[ - "data" -]
8 tool updates
v1.2.2- Changed
convert_document5 fields changed- added
Input schema / properties / asAttachmentAdded value: +{ + "description": "If true, return the document as a downloadable file attachment (a base64 EmbeddedResource), for any format. Default delivery: text and png/jpg/gif/webp are returned inline; other binary outputs (PDF, Office, …) are saved to a temp file in stdio mode (path returned), or returned as an attachment in HTTP mode. Ignored when outputPath or returnLink is set.", + "type": "boolean" +} - changed
Input schema / properties / convertTo / anyOfPrevious value: -[ - { - "enum": [ - "pdf", - "docx", - "xlsx", - "pptx", - "odt", - "ods", - "odp", - "odg", - "html", - "xhtml", - "txt", - "csv", - "md", - "xml", - "rtf", - "png", - "jpg", - "jpeg", - "webp", - "svg", - "tiff", - "bmp", - "gif", - "zip", - "idml", - "epub" - ], - "type": "string" - }, - { - "properties": { - "formatName": { - "description": "Target format name.", - "enum": [ - "pdf", - "docx", - "xlsx", - "pptx", - "odt", - "ods", - "odp", - "odg", - "html", - "xhtml", - "txt", - "csv", - "md", - "xml", - "rtf", - "png", - "jpg", - "jpeg", - "webp", - "svg", - "tiff", - "bmp", - "gif", - "zip", - "idml", - "epub" - ], - "type": "string" - }, - "formatOptions": { - "additionalProperties": {}, - "description": "Advanced format options object. Examples by format: PDF — { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\", \"DocumentPermissionPassword\": \"owner\" } password-protect; PDF — { \"Watermarks\": [{ \"text\": \"DRAFT\", \"opacity\": 0.2, \"rotation\": -45, \"fontsize\": 60 }] } up to 5 watermarks; PDF — { \"SelectPdfVersion\": 1 } PDF/A-1b compliance (use 2 for PDF/A-2, 3 for PDF/A-3); PDF — { \"PageRange\": \"1-3,5\" } export specific pages only; PDF — { \"ConvertSlideshow\": true } convert each slide to a separate PDF page; Images (PNG/JPG/WEBP) — { \"Quality\": 90 } set compression quality 0-100; Images — { \"density\": 150 } set DPI for rasterisation (default 96); CSV — { \"fieldSeparator\": \";\" } custom column separator.", - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "formatName" - ], - "type": "object" - } -]New value: +[ + { + "enum": [ + "pdf", + "docx", + "xlsx", + "pptx", + "odt", + "ods", + "odp", + "odg", + "html", + "xhtml", + "txt", + "csv", + "md", + "xml", + "rtf", + "png", + "jpg", + "jpeg", + "webp", + "svg", + "tiff", + "bmp", + "gif", + "zip", + "idml", + "epub", + "cdr" + ], + "type": "string" + }, + { + "properties": { + "formatName": { + "description": "Target format name.", + "enum": [ + "pdf", + "docx", + "xlsx", + "pptx", + "odt", + "ods", + "odp", + "odg", + "html", + "xhtml", + "txt", + "csv", + "md", + "xml", + "rtf", + "png", + "jpg", + "jpeg", + "webp", + "svg", + "tiff", + "bmp", + "gif", + "zip", + "idml", + "epub", + "cdr" + ], + "type": "string" + }, + "formatOptions": { + "additionalProperties": {}, + "description": "Advanced format options object. Examples by format: PDF — { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\", \"DocumentPermissionPassword\": \"owner\" } password-protect; PDF — { \"Watermarks\": [{ \"text\": \"DRAFT\", \"opacity\": 0.2, \"rotation\": -45, \"fontsize\": 60 }] } up to 5 watermarks; PDF — { \"SelectPdfVersion\": 1 } PDF/A-1b compliance (use 2 for PDF/A-2, 3 for PDF/A-3); PDF — { \"PageRange\": \"1-3,5\" } export specific pages only; PDF — { \"ConvertSlideshow\": true } convert each slide to a separate PDF page; Images (PNG/JPG/WEBP) — { \"Quality\": 90 } set compression quality 0-100; Images — { \"density\": 150 } set DPI for rasterisation (default 96); CSV — { \"fieldSeparator\": \";\" } custom column separator.", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "formatName" + ], + "type": "object" + } +] - changed
Input schema / properties / file / descriptionPrevious value: -"The document to convert. Three input forms are accepted: (1) Local file path — absolute or relative, e.g. \"/home/user/report.docx\" or \"./invoice.xlsx\". (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. Supported input formats include: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, IDML, Markdown (MD), PDF, TXT, CSV, PNG, JPG, SVG, and more. Full conversion matrix: https://carbone.io/documentation/developer/http-api/generate-reports.html#output-file-type"New value: +"The document to convert. Three input forms are accepted: (1) Local file path — absolute or relative, e.g. \"/home/user/report.docx\" or \"./invoice.xlsx\". (2) HTTPS URL — the file is downloaded automatically, e.g. \"https://example.com/file.pptx\". (3) Base64-encoded string — the raw file content encoded as base64. Supported input formats include: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, IDML, Markdown (MD), PDF, TXT, CSV, PNG, JPG, SVG, and more. Full conversion matrix: https://carbone.io/documentation/developer/http-api/generate-reports.md" - added
Input schema / properties / outputPathAdded value: +{ + "description": "Optional local file path to save the converted document to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files. Local (stdio) mode only; rejected in HTTP mode.", + "type": "string" +} - added
Input schema / properties / returnLinkAdded value: +{ + "description": "If true, generate the document and return a public download URL instead of the file contents. The link is SHORT-LIVED and ONE-TIME — Carbone deletes the file after the first download — so it is meant for the end user to download once (do not fetch it programmatically). Works in stdio and HTTP. Mutually exclusive with outputPath and asAttachment.", + "type": "boolean" +}
- Changed
download_template2 fields changed- added
Input schema / properties / asAttachmentAdded value: +{ + "description": "If true, return the template as a downloadable file attachment (base64 resource) instead of inline text/image. Useful in HTTP mode where outputPath is unavailable. Default: false. Ignored when outputPath is set.", + "type": "boolean" +} - added
Input schema / properties / outputPathAdded value: +{ + "description": "Optional local file path to save the template file to (e.g. \"/home/user/template.docx\" or \"~/template.docx\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the file inline. Local (stdio) mode only; rejected in HTTP mode.", + "type": "string" +}
- Changed
get_api_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "message": { + "description": "Status message returned by the API.", + "type": "string" + }, + "version": { + "description": "The running Carbone API version.", + "type": "string" + } + }, + "required": [ + "version", + "message" + ], + "type": "object" +}
- Changed
list_categories1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "categories": { + "description": "Template category names in use.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "categories" + ], + "type": "object" +}
- Changed
list_tags1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "tags": { + "description": "Template tag names in use.", + "items": { + "type": "string" + }, + "type": "array" + } + }, + "required": [ + "tags" + ], + "type": "object" +}
- Changed
list_templates5 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results to return (default: 100)."New value: +"Maximum number of results to return. Must be between 1 and 100 (Carbone API limit). Default: 100." - removed
Input schema / properties / limit / exclusiveMinimumRemoved value: -0 - changed
Input schema / properties / limit / maximumPrevious value: -9007199254740991New value: +100 - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "hasMore": { + "description": "Whether more results are available via the cursor.", + "type": "boolean" + }, + "nextCursor": { + "description": "Cursor to pass to the next list_templates call.", + "type": "string" + }, + "templates": { + "description": "The matching templates (all fields).", + "items": { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "templates", + "hasMore" + ], + "type": "object" +}
- Changed
render_document30 fields changed- added
Input schema / properties / asAttachmentAdded value: +{ + "description": "If true, return the document as a downloadable file attachment (a base64 EmbeddedResource), for any format. Default delivery: text and png/jpg/gif/webp are returned inline; other binary outputs (PDF, Office, …) are saved to a temp file in stdio mode (path returned), or returned as an attachment in HTTP mode. Ignored when outputPath or returnLink is set.", + "type": "boolean" +} - removed
Input schema / properties / complement / additionalPropertiesRemoved value: -{} - added
Input schema / properties / complement / anyOfAdded value: +[ + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "type": "string" + } +] - changed
Input schema / properties / complement / descriptionPrevious value: -"Extra data object accessible in templates with {c.field} tags (as opposed to {d.field} for main data). Useful for static or shared values that should not be mixed into the main dataset: company info, logo URLs, footer text, configuration constants. Example: { \"company\": \"Acme Corp\", \"address\": \"123 Main St\", \"vatNumber\": \"FR12345\" }"New value: +"Extra data object accessible in templates with {c.field} tags (as opposed to {d.field} for main data). Useful for static or shared values that should not be mixed into the main dataset: company info, logo URLs, footer text, configuration constants. Example: { \"company\": \"Acme Corp\", \"address\": \"123 Main St\", \"vatNumber\": \"FR12345\" }. Like data, may instead be passed by reference as a string — a local path, HTTPS URL, or base64 to a JSON file." - removed
Input schema / properties / complement / propertyNamesRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / complement / typeRemoved value: -"object" - changed
Input schema / properties / convertTo / anyOfPrevious value: -[ - { - "enum": [ - "pdf", - "docx", - "xlsx", - "pptx", - "odt", - "ods", - "odp", - "odg", - "html", - "xhtml", - "txt", - "csv", - "md", - "xml", - "rtf", - "png", - "jpg", - "jpeg", - "webp", - "svg", - "tiff", - "bmp", - "gif", - "zip", - "idml", - "epub" - ], - "type": "string" - }, - { - "properties": { - "formatName": { - "description": "Target format name.", - "enum": [ - "pdf", - "docx", - "xlsx", - "pptx", - "odt", - "ods", - "odp", - "odg", - "html", - "xhtml", - "txt", - "csv", - "md", - "xml", - "rtf", - "png", - "jpg", - "jpeg", - "webp", - "svg", - "tiff", - "bmp", - "gif", - "zip", - "idml", - "epub" - ], - "type": "string" - }, - "formatOptions": { - "additionalProperties": {}, - "description": "Advanced format options object. Examples by format: PDF — { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\", \"DocumentPermissionPassword\": \"owner\" } password-protect; PDF — { \"Watermarks\": [{ \"text\": \"DRAFT\", \"opacity\": 0.2, \"rotation\": -45, \"fontsize\": 60 }] } up to 5 watermarks; PDF — { \"SelectPdfVersion\": 1 } PDF/A-1b compliance (use 2 for PDF/A-2, 3 for PDF/A-3); PDF — { \"PageRange\": \"1-3,5\" } export specific pages only; PDF — { \"ConvertSlideshow\": true } convert each slide to a separate PDF page; Images (PNG/JPG/WEBP) — { \"Quality\": 90 } compression quality 0-100; Images — { \"density\": 150 } DPI for rasterisation (default 96); CSV — { \"fieldSeparator\": \";\" } custom column separator.", - "propertyNames": { - "type": "string" - }, - "type": "object" - } - }, - "required": [ - "formatName" - ], - "type": "object" - } -]New value: +[ + { + "enum": [ + "pdf", + "docx", + "xlsx", + "pptx", + "odt", + "ods", + "odp", + "odg", + "html", + "xhtml", + "txt", + "csv", + "md", + "xml", + "rtf", + "png", + "jpg", + "jpeg", + "webp", + "svg", + "tiff", + "bmp", + "gif", + "zip", + "idml", + "epub", + "cdr" + ], + "type": "string" + }, + { + "properties": { + "formatName": { + "description": "Target format name.", + "enum": [ + "pdf", + "docx", + "xlsx", + "pptx", + "odt", + "ods", + "odp", + "odg", + "html", + "xhtml", + "txt", + "csv", + "md", + "xml", + "rtf", + "png", + "jpg", + "jpeg", + "webp", + "svg", + "tiff", + "bmp", + "gif", + "zip", + "idml", + "epub", + "cdr" + ], + "type": "string" + }, + "formatOptions": { + "additionalProperties": {}, + "description": "Advanced format options object. Examples by format: PDF — { \"EncryptFile\": true, \"DocumentOpenPassword\": \"secret\", \"DocumentPermissionPassword\": \"owner\" } password-protect; PDF — { \"Watermarks\": [{ \"text\": \"DRAFT\", \"opacity\": 0.2, \"rotation\": -45, \"fontsize\": 60 }] } up to 5 watermarks; PDF — { \"SelectPdfVersion\": 1 } PDF/A-1b compliance (use 2 for PDF/A-2, 3 for PDF/A-3); PDF — { \"PageRange\": \"1-3,5\" } export specific pages only; PDF — { \"ConvertSlideshow\": true } convert each slide to a separate PDF page; Images (PNG/JPG/WEBP) — { \"Quality\": 90 } compression quality 0-100; Images — { \"density\": 150 } DPI for rasterisation (default 96); CSV — { \"fieldSeparator\": \";\" } custom column separator.", + "propertyNames": { + "type": "string" + }, + "type": "object" + } + }, + "required": [ + "formatName" + ], + "type": "object" + } +] - removed
Input schema / properties / currencyRates / additionalPropertiesRemoved value: -{ - "type": "number" -} - added
Input schema / properties / currencyRates / anyOfAdded value: +[ + { + "additionalProperties": { + "type": "number" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "type": "string" + } +] - changed
Input schema / properties / currencyRates / descriptionPrevious value: -"Exchange rate table used by :formatC for currency conversion. Keys are ISO 4217 currency codes; values are rates relative to a common base. The base currency should have rate 1. Example: { \"EUR\": 1, \"USD\": 1.08, \"GBP\": 0.86, \"JPY\": 160.5 }."New value: +"Exchange rate table used by :formatC for currency conversion. Keys are ISO 4217 currency codes; values are rates relative to a common base. The base currency should have rate 1. Example: { \"EUR\": 1, \"USD\": 1.08, \"GBP\": 0.86, \"JPY\": 160.5 }. May instead be passed by reference as a string — a local path, HTTPS URL, or base64 to a JSON file." - removed
Input schema / properties / currencyRates / propertyNamesRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / currencyRates / typeRemoved value: -"object" - removed
Input schema / properties / data / additionalPropertiesRemoved value: -{} - added
Input schema / properties / data / anyOfAdded value: +[ + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "items": {}, + "type": "array" + }, + { + "type": "string" + } +] - changed
Input schema / properties / data / descriptionPrevious value: -"JSON data merged into the template. Access fields with {d.fieldName} tags. Nested objects: {d.customer.name}. Array loops: {d.items[i].description} … {d.items[i+1]}. Conditionals: {d.status == \"active\" ? \"Yes\" : \"No\"}. For pure document conversion without data injection, pass {}."New value: +"JSON data merged into the template — an object, or a top-level array (accessed with {d[i].field}). Access fields with {d.fieldName} tags. Nested objects: {d.customer.name}. Array loops: {d.items[i].description} … {d.items[i+1]}. Conditionals: {d.status == \"active\" ? \"Yes\" : \"No\"}. For pure document conversion without data injection, pass {}. Instead of inlining a large dataset, you may pass a STRING reference to the JSON: a local file path (e.g. \"/data/invoices.json\"), an HTTPS URL, or a base64-encoded JSON string — it is read and parsed server-side. Local paths resolve in stdio (local) mode only; URLs and base64 work in both transports." - removed
Input schema / properties / data / propertyNamesRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / data / typeRemoved value: -"object" - removed
Input schema / properties / enum / additionalPropertiesRemoved value: -{} - added
Input schema / properties / enum / anyOfAdded value: +[ + { + "additionalProperties": {}, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "type": "string" + } +] - changed
Input schema / properties / enum / descriptionPrevious value: -"Enumeration map used with the :convEnum(TYPE) formatter to translate code values into human-readable labels. Define one key per enum type; each value is an object mapping code → label. Example: { \"STATUS\": { \"1\": \"Active\", \"2\": \"Inactive\", \"3\": \"Pending\" }, \"ROLE\": { \"A\": \"Admin\", \"U\": \"User\" } }. Template usage: {d.status:convEnum(STATUS)}, {d.role:convEnum(ROLE)}. Documentation: https://carbone.io/documentation.html#convenum-type-"New value: +"Enumeration map used with the :convEnum(TYPE) formatter to translate code values into human-readable labels. Define one key per enum type; each value is an object mapping code → label. Example: { \"STATUS\": { \"1\": \"Active\", \"2\": \"Inactive\", \"3\": \"Pending\" }, \"ROLE\": { \"A\": \"Admin\", \"U\": \"User\" } }. Template usage: {d.status:convEnum(STATUS)}, {d.role:convEnum(ROLE)}. May instead be passed by reference as a string — a local path, HTTPS URL, or base64 to a JSON file. Documentation: https://carbone.io/documentation.html#convenum-type-" - removed
Input schema / properties / enum / propertyNamesRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / enum / typeRemoved value: -"object" - added
Input schema / properties / outputPathAdded value: +{ + "description": "Optional local file path to save the generated document to (e.g. \"/home/user/out.pdf\" or \"~/out.pdf\"). When set, the file is written to disk and the tool returns the saved path + size instead of embedding the document inline — ideal for large files. Local (stdio) mode only; rejected in HTTP mode. Ignored for async/webhook renders (no document is returned inline).", + "type": "string" +} - changed
Input schema / properties / reportName / descriptionPrevious value: -"Filename for the generated document, returned in the Content-Disposition header. Supports Carbone tags resolved against the data at render time. Examples: \"invoice.pdf\" (static), \"{d.type}-{d.id}.pdf\" (dynamic), \"{d.client}-{d.date:formatD(YYYY-MM)}.docx\"."New value: +"Filename (WITHOUT extension) for the generated document, returned in the Content-Disposition header. Carbone automatically appends the extension that matches convertTo, so do not include one — passing \"invoice.pdf\" yields \"invoice.pdf.pdf\". Supports Carbone tags resolved against the data at render time. Examples: \"invoice\" (static), \"{d.type}-{d.id}\" (dynamic), \"{d.client}-{d.date:formatD(YYYY-MM)}\"." - added
Input schema / properties / returnLinkAdded value: +{ + "description": "If true, generate the document and return a public download URL instead of the file contents. The link is SHORT-LIVED and ONE-TIME — Carbone deletes the file after the first download — so it is meant for the end user to download once (do not fetch it programmatically). Works in stdio and HTTP. Mutually exclusive with outputPath, asAttachment, and webhookUrl (async).", + "type": "boolean" +} - removed
Input schema / properties / translations / additionalPropertiesRemoved value: -{ - "additionalProperties": { - "type": "string" - }, - "propertyNames": { - "type": "string" - }, - "type": "object" -} - added
Input schema / properties / translations / anyOfAdded value: +[ + { + "additionalProperties": { + "additionalProperties": { + "type": "string" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + "propertyNames": { + "type": "string" + }, + "type": "object" + }, + { + "type": "string" + } +] - changed
Input schema / properties / translations / descriptionPrevious value: -"Translation map for multilingual documents. Requires \"lang\" to be set to select the active locale. Top-level keys are BCP-47 locale codes; values are key → translated-string maps. Template usage: {t(greeting)} is replaced by the matching string for the active locale. Example: { \"fr-fr\": { \"greeting\": \"Bonjour\", \"total\": \"Total\" }, \"en-us\": { \"greeting\": \"Hello\", \"total\": \"Total\" } }. Documentation: https://carbone.io/documentation.html#translations"New value: +"Translation map for multilingual documents. Requires \"lang\" to be set to select the active locale. Top-level keys are BCP-47 locale codes; values are key → translated-string maps. Template usage: {t(greeting)} is replaced by the matching string for the active locale. Example: { \"fr-fr\": { \"greeting\": \"Bonjour\", \"total\": \"Total\" }, \"en-us\": { \"greeting\": \"Hello\", \"total\": \"Total\" } }. These dictionaries get large, so you may instead pass a string reference — a local path, HTTPS URL, or base64 to a JSON file. Documentation: https://carbone.io/documentation.html#translations" - removed
Input schema / properties / translations / propertyNamesRemoved value: -{ - "type": "string" -} - removed
Input schema / properties / translations / typeRemoved value: -"object"
- Changed
upload_template2 fields changed- changed
Input schema / properties / template / descriptionPrevious value: -"The template file. Accepts a local file path (e.g. /home/user/invoice.docx), a URL (https://example.com/template.docx), or a base64-encoded string. Supported formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, IDML, XML, Markdown (MD), PDF, and more. Full list: https://carbone.io/documentation/developer/http-api/generate-reports.html#output-file-type"New value: +"The template file. Accepts a local file path (e.g. /home/user/invoice.docx), a URL (https://example.com/template.docx), or a base64-encoded string. Supported formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, IDML, XML, Markdown (MD), PDF, and more. Full list: https://carbone.io/documentation/developer/http-api/generate-reports.md" - changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": false, + "properties": { + "id": { + "description": "Stable Template ID (when versioning is enabled).", + "type": "string" + }, + "name": { + "description": "Template display name.", + "type": "string" + }, + "size": { + "description": "Template size in bytes.", + "type": "number" + }, + "templateId": { + "description": "Template ID returned in legacy/non-versioned mode.", + "type": "string" + }, + "type": { + "description": "Detected template file type.", + "type": "string" + }, + "versionId": { + "description": "Version ID (SHA-256) of this uploaded version.", + "type": "string" + } + }, + "required": [ + "name" + ], + "type": "object" +}
11 tool updates
v1.1.2- First observed
convert_document - First observed
delete_template - First observed
download_template - First observed
get_api_status - First observed
get_capabilities - First observed
list_categories - First observed
list_tags - First observed
list_templates - First observed
render_document - First observed
update_template_metadata - First observed
upload_template
TDQS
Scored across 12 tools
Each tool has a clearly distinct role: template CRUD, rendering, inspection, conversion, metadata lookup, and service status/capabilities. The descriptions explicitly disambiguate close cases such as convert_document vs render_document and update_template_metadata vs delete_template. An agent should be able to select the right tool without guessing.
All tool names use a consistent snake_case verb_noun convention: list_*, get_*, upload_template, render_document, inspect_template, update_template_metadata, delete_template, download_template, convert_document. There are no mixed casing styles or vague standalone verbs. The naming is predictable across the whole set.
Twelve tools is well-scoped for a document template and rendering server. Each tool covers a meaningful operation, and there are no redundant filler tools. The set stays comfortably within a practical range for an agent to manage.
The surface covers the full template lifecycle: listing, uploading, rendering, inspecting, updating metadata, downloading, deleting, and converting documents. Supporting tools for categories, tags, API status, and capability discovery round out the operations without obvious dead ends. Versioning and deployment are handled through template IDs, version IDs, and metadata updates.
Maintenance
Related MCP Connectors
Generate PDF, Word (.docx) and PowerPoint (.pptx) documents from Markdown over MCP.
MCP server for Api2Pdf — generate PDFs & images from HTML, URLs or office files; merge, barcodes.
Design, publish and render PDF templates with Typst. Full template lifecycle over MCP.
Document conversion MCP server: PDF to Markdown, image OCR, spreadsheet parsing.
Related MCP Servers
- AlicenseBqualityNot gradedmaintenanceOrshot's MCP Server lets you dynamically generate images from your templates from your prompts in Claude, Cursor or any app that supports MCP Servers. You can use the pre-designed templates and also AI Generate or design your own templates in Orshot, and then generate images from those templates73-
- AlicenseBqualityDmaintenanceA universal MCP server for document processing, conversion, and automation. Handle PDF, DOCX, HTML, Markdown, and more through a unified API and toolset.1337 npm140MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that enables interaction with the PDF Generator API for automated document generation and management. It supports both stdio and HTTP transports, allowing AI models to create and handle PDFs using OpenAPI v4 specifications.1MIT
- AlicenseAqualityDmaintenanceMCP server for Word document (.docx) creation and manipulation — the production-grade document automation tool for AI agents.949 npmMIT