Skip to main content
Glama

Carbone MCP Server

npm version MCP Registry License: Apache-2.0

Automate production-ready PDF, Word, Excel and PowerPoint documents from templates and JSON data, and convert files across 100+ formats, from Claude, Cursor, VS Code or any MCP client. The official server for the Carbone document generation API.

  • Convert files: DOCX, XLSX, PPTX, HTML, 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, delivered to your 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

These work on any Carbone account, even without a plan (you then get watermarked PDFs):

  • "Convert this Markdown to PDF: # Quarterly update …"

  • "Fill my invoice template with this JSON and give me a PDF: {"customer": "Acme", "total": 1500}"

  • "Which data does this contract template need?" (inspect_template lists its tags and drafts a sample JSON)

More in Example prompts, including with Salesforce, HubSpot, Notion and Stripe.

Related MCP server: doc-ops-mcp

Quick start

Upgrading from 1.x? Read the upgrade notes — HTTP deployments should upgrade now (security fixes).

Prerequisites

  • A Carbone account at account.carbone.io. The hosted server signs you in with it and uses your production key once your account has a plan (the Free plan included), the test key until then. The local package and Docker use one of the two keys directly (details):

    • Test key: unlimited watermarked PDFs, free (PDF output only). Templates stored with it are kept for up to 30 days.

    • Production key: any output format, no watermark. The Free plan includes 100 documents per month.

  • Node.js 20.3 or later for the local package (npx carbone-mcp). Check with node --version. The Docker image needs Docker only.

Choose a setup

Setup

Runs

Clients

Local files

Hosted server (HTTP)

https://mcp.carbone.io, nothing to install

claude.ai, Claude Desktop, Claude Code, VS Code, Cursor, …: sign in with your Carbone account

❌ URLs and base64 only

Local package (stdio)

npx carbone-mcp on your machine

Claude Desktop, Claude Code, VS Code, Cursor, and any client that starts local servers

✅ reads local paths, saves documents to disk

Docker (HTTP)

Your own server

Clients that can send an Authorization header: Claude Code, VS Code, Cursor, …

❌ URLs and base64 only

claude.ai and Claude Desktop: add the hosted server as a connector. In Claude Desktop, use the local package instead to read and save files on your computer.

Local package (stdio)

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 claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\). Quit and restart Claude Desktop afterwards.

Cursor

~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project)

Claude Code:

claude mcp add --env CARBONE_API_KEY=your_api_key_here --transport stdio carbone -- npx -y carbone-mcp

VS 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

Hosted server (mcp.carbone.io)

Nothing to install: connect to https://mcp.carbone.io over Streamable HTTP, and sign in with your Carbone account when your client opens account.carbone.io in your browser. Over HTTP, file inputs must be URLs or base64 (File inputs).

Claude Code: add the server, then run /mcp, select carbone and choose Authenticate.

claude mcp add --transport http carbone https://mcp.carbone.io

VS 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" }
  }
}

claude.ai and Claude Desktop connectors

  1. Add a custom connector with the URL https://mcp.carbone.io. Leave the OAuth client ID and secret empty.

  2. Click Connect, sign in with your Carbone account and approve.

In an organization, each member connects with their own Carbone account, and their documents count against it. Claude Desktop uses the same connectors; to read and save files on your computer, use the local package instead.

Files in and out

File inputs

file (convert_document) and template (render_document, inspect_template, upload_template) accept:

Form

Example

stdio

HTTP

Absolute local path

/Users/me/invoice.docx, ~/invoice.docx, C:\Users\me\invoice.docx

✅

❌ refused

URL

https://example.com/invoice.docx

✅

✅

Base64

the file content, base64-encoded

✅

✅

Any other string, such as a bare invoice.docx, is read as base64 and fails. Relative paths (./…, ../…) resolve against the server's working directory, which your client chooses: prefer absolute paths. The JSON parameters (data, complement, …) also accept a path, URL or base64 string pointing to a JSON file (details).

Output delivery

Output

stdio (local clients)

HTTP (remote / self-hosted)

Text: HTML, TXT, CSV, MD, XML, JSON (template samples)

inline text

inline text

Images: PNG, JPG, GIF, WEBP

inline image

inline image

Everything else: PDF, Office, SVG, TIFF…

saved to a temp file, path returned

returned as a download attachment

You can instead save to a path you choose (outputPath, stdio only), get an attachment for any format (asAttachment), or get a one-time download link (returnLink): see Output and file delivery.

Claude Desktop cannot display inline binary attachments (it mishandles them as images). For PDF and Office files, keep the default temp-file path, or ask for returnLink to get a download URL.

Tools

Tool

What it does

convert_document

Converts a file to another format; Carbone tags stay as written

render_document

Fills a template with JSON data, and can convert the result (to PDF, for example)

inspect_template

Lists a template's tags and returns a matching sample dataset. Runs one render on your account (counts as one document generation)

list_templates

Lists stored templates, filtered by category, name or ID

list_categories

Lists the template categories in your account

list_tags

Lists the tags used across your templates

upload_template

Stores a reusable template, with versions, category and tags

update_template_metadata

Renames, categorizes, tags, deploys or schedules the deletion of a template version

delete_template

Deletes a template or one of its versions, immediately

download_template

Downloads a template's original file, or the sample data stored with it

get_api_status

Checks the Carbone API's health and version

get_capabilities

Summarizes the formats, features and usage examples

Every parameter, with examples: docs/API.md.

Example prompts

With your other tools. Carbone turns data that another MCP server fetches into a finished document. These assume that server (Salesforce, HubSpot, Notion, Stripe, …) is connected in the same client.

  • "Get the Acme Corp opportunity and its products from Salesforce, fill my 'Sales quote' template and give me the PDF"

  • "For each HubSpot deal that moved to Closed Won this week, fill the 'Service agreement' template and save the PDFs in ~/Contracts"

  • "Inspect my 'Invoice' template, map its fields to the HubSpot deal 'Acme renewal', and show me the JSON before you render it"

  • "Collect the tasks marked Done in the Notion 'Sprint 42' database and fill our 'Sprint report' template as a DOCX"

  • "List last month's paid Stripe invoices for Acme Corp and produce an account statement with the 'Statement' template"

  • "Read the attendee list from the 'Workshop' Google Sheet and create one certificate per attendee from the 'Certificate' template"

  • "Summarize the pull requests merged on GitHub this week into our 'Release notes' template, then post a two-line summary in #releases on Slack"

Templates and data

  • "Generate an invoice from template 1530905183164918624 with {customer: 'Acme Corp', total: 1500, items: [...]}"

  • "Fill ~/templates/offer-letter.docx with ~/hr/jane-doe.json and save the PDF as ~/Documents/offer-jane-doe.pdf"

  • "Show me template 1530905183164918624 as a PDF with its tags still visible, so I can check the layout"

Convert

  • "Convert /Users/me/contracts/contract.docx to PDF with the Carbone ICE converter"

  • "Turn https://example.com/sales.xlsx into a CSV separated by semicolons"

  • "Render this PDF as a PNG thumbnail"

Batch and localization

  • "Create one invoice per customer in ~/data/invoices.json, as a ZIP of files named invoice-{d.id}, delivered to my webhook https://example.com/hook"

  • "Generate this invoice in French, German and Spanish from the same template"

  • "Render the report with prices converted from EUR to USD at 1.08, and dates in New York time"

PDF options and template library

  • "Convert this DOCX to a PDF with the open password 'secret123' and a DRAFT watermark at 20% opacity"

  • "Make a PDF/A-2b copy of pages 1 to 5 of this NDA for archiving"

  • "Deploy the newest version of my invoice template, and schedule the old one for deletion in 30 days"

Troubleshooting

Symptom

Cause and fix

Tool error Authentication failed: … (no key, or a key the Carbone API rejects with 401)

stdio: set CARBONE_API_KEY in the client config's env and restart the client (without it, the server stops at startup with CARBONE_API_KEY environment variable is required). Self-hosted HTTP: send Authorization: Bearer <key>; a server with CARBONE_REQUIRE_CLIENT_AUTH_HEADER=true requires it on every request. Check the key at account.carbone.io.

mcp.carbone.io asks you to sign in again, or sign-in fails

Reconnect: in Claude, Disconnect then Connect the connector; in Claude Code, /mcp → Clear authentication, then Authenticate.

HTTP 403 Invalid Origin: <host>

A browser-based client served from a host other than localhost. Add its hostname to MCP_ALLOWED_ORIGINS.

HTTP 405 Method not allowed when you open the endpoint in a browser

Expected: the endpoint only answers MCP POST requests. Connect with an MCP client; check the server with GET /health.

HTTP 413 Request body too large, or the stdio connection closes

One MCP message is over MCP_MAX_BODY_BYTES (60 MB by default; it applies to stdio messages too). Pass large files by URL (or a local path in stdio) instead of inline base64, or raise the limit.

Rate limit exceeded. Please wait N second(s)

The Carbone API answered 429. Wait the time given and try again.

Tags such as {d.name} still visible in the output

convert_document is a pure conversion and keeps tags. Use render_document with your data.

Watermark on every PDF, or only PDF works

You use the 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.

A file given by name (invoice.docx) fails

A bare name is read as base64. Pass an absolute path (stdio), a URL, or base64 (File inputs).

Rendering by Template ID still uses the old version after an upload

Renders by Template ID use the deployed version (most recent deployedAt). Deploy the new version with update_template_metadata (templateId = its Version ID, deployedAt = 42000000000), or render by Version ID.

Password, watermark or PDF/A missing from a PDF

PDF/A, page ranges and accessibility use the default converter L (LibreOffice); O, C and I apply passwords, permissions and watermarks. For PDF → PDF the server sets hardRefresh for you: don't pass hardRefresh: false.

Claude Desktop shows no Carbone tools, or the server disconnects

Read mcp-server-carbone.log (the server's stderr) in ~/Library/Logs/Claude/ (macOS) or %APPDATA%\Claude\logs\ (Windows). A good start logs Carbone MCP Server v<version> started (stdio).

You want to test the server without an AI client

Run the MCP Inspector (Node.js 22.19+): npx @modelcontextprotocol/inspector -e CARBONE_API_KEY=your_api_key_here npx carbone-mcp. It lists the tools and shows each request and response.

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/health

Connect your client with your key in the Authorization header:

claude mcp add --transport http carbone http://localhost:3000 --header "Authorization: Bearer your_api_key_here"

In VS Code and Cursor, take the hosted server config with the URL http://localhost:3000 and add "headers": { "Authorization": "Bearer your_api_key_here" } next to "url". VS Code can prompt for the key with an inputs entry of type promptString ("Bearer ${input:carbone-api-key}"), and Cursor can read it from your environment ("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:

docker run -d --name carbone-mcp -p 127.0.0.1:3000:3000 -e CARBONE_API_KEY=your_api_key_here carbone/carbone-mcp

Read the shared-key warning before you use it.

Docker 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

CARBONE_API_KEY

none

Your Carbone API key: required in stdio for Carbone Cloud, optional over HTTP (Security)

CARBONE_BASE_URL

https://api.carbone.io

Carbone API URL; set it to an on-premise instance (no key needed)

CARBONE_TIMEOUT

60000

Carbone API request timeout in ms; Carbone Cloud's own limit is 60 s

CARBONE_MAX_FILE_BYTES

104857600 (100 MB)

Largest input file read from a path, URL or base64

MCP_TRANSPORT

stdio (http in Docker)

stdio or http

MCP_PORT

3000

HTTP port

MCP_PATH

/

HTTP endpoint path; cannot be /health

MCP_MAX_BODY_BYTES

62914560 (60 MB)

Largest MCP message: an HTTP body (413 above it) or a stdio message

MCP_ALLOWED_ORIGINS

none (localhost is always allowed)

HTTP: browser Origin hostnames to allow, comma-separated

CARBONE_REQUIRE_CLIENT_AUTH_HEADER

false

HTTP: true refuses requests that bring no Bearer key of their own

CARBONE_ALLOW_PRIVATE_NETWORK

false

true lets URL inputs reach private and internal addresses

Full descriptions: Configuration in docs/API.md.

Security

  • URL inputs and local files. URLs that resolve to a private or internal address (localhost, RFC 1918, cloud metadata) are refused unless CARBONE_ALLOW_PRIVATE_NETWORK=true (details). Local paths are read in stdio only, where the server runs as you; over HTTP they are refused.

  • Shared server key (HTTP). With CARBONE_API_KEY set on an HTTP server and CARBONE_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 set CARBONE_REQUIRE_CLIENT_AUTH_HEADER=true so each client must bring its own key. This doesn't apply when no server key is set (for example on-premise Carbone without authentication).

  • Browser origins (HTTP). A request whose Origin header is present but not allowed gets 403, so a malicious web page cannot reach a locally running server (DNS rebinding) and spend its key. localhost, 127.0.0.1 and [::1] are allowed; list the browser-based clients you trust in MCP_ALLOWED_ORIGINS. Requests without an Origin (desktop, CLI and server-side clients) are unaffected.

  • 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.

  • 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 documents rendered with returnLink or a webhook until they are downloaded. See the privacy policy, or run Carbone on-premise for full control.

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).

Contributing

Bug reports, fixes and documentation improvements are welcome. CONTRIBUTING.md covers the development setup, tests, debugging and the pull request process.

Support

License

Apache 2.0, see LICENSE.

Available Tools

12 tools
convert_documentConvert DocumentAInspect

Convert a document to another format without storing a template. Pure conversion: no data is sent, so Carbone tags such as {d.name} are kept as written; this is also how you proof a template in another format (DOCX template → PDF, or DOCX → ODT while it stays a template). The source file can be a local file path, an HTTPS URL, or a base64-encoded string. Use render_document instead when you need data injection ({d.field} tags resolved), translations, or batch generation. Example: { "file": "/Users/me/report.docx", "convertTo": "pdf" } (a bare file name such as "report.docx" is not a path). Common conversions: DOCX → PDF (add converter: "I" for the fastest conversion), XLSX → PDF, PPTX → PDF, HTML → PDF (converter: "C" for full CSS/JS rendering), DOCX → HTML, XLSX → CSV, PDF → PNG, PPTX → PNG (first slide as image), MD → PDF.

NameRequiredDescriptionDefault
fileYesThe 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
convertToYesTarget 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": { ... } }.
converterNoConverter 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
outputPathNoOptional 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).
reportNameNoName 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).
returnLinkNoIf 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.
hardRefreshNoIf 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 } } }.
asAttachmentNoIf 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.
egressAuthorizationNoValue 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.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, openWorldHint=true), so the bar is lower. The description still adds real behavioral context: no data is injected so Carbone tags are kept literal, and no template is stored. It does not itself cover delivery side effects like one-time links or non-overwriting paths, but those live in the parameter docs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Core purpose, tag-preservation semantics, input forms, the alternative tool, an example, and common conversions are all front-loaded in a logical order. It is dense but nearly every sentence carries information; the trailing conversions list is the only borderline padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter tool with no output schema, the description covers purpose, alternative routing, examples, and typical conversion paths, while the rich schema documents delivery (outputPath/returnLink/asAttachment) and options. It is nearly complete, though it never states the default return/delivery behavior itself.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description goes beyond the schema by pairing conversion examples with practical converter choices ('I' for fastest DOCX→PDF, 'C' for full CSS/JS HTML→PDF) and by showing a concrete invocation example, which meaningfully aids correct parameter selection.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Convert a document to another format') and immediately distinguishes scope with 'without storing a template' and 'no data is sent'. The sibling render_document is explicitly named as the tool to use for a different job, so an agent can differentiate 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use-this ('pure conversion', proofing a template in another format) and an explicit when-to-use-something-else ('Use render_document instead when you need data injection, translations, or batch generation'). The common-conversion list further anchors the intended scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_templateDelete TemplateA
DestructiveIdempotent
Inspect

Delete a stored Carbone template. Takes effect immediately: the template is no longer listed, downloadable or renderable (404); the file itself is purged after the retention delay (Carbone Cloud: 24 hours). You can delete by Template ID (removes all versions) or by Version ID (removes only that specific version). To schedule a deletion instead, use update_template_metadata with expireAt set to a future Unix timestamp.

NameRequiredDescriptionDefault
templateIdYesTemplate 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.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=true; the description adds what is actually destroyed (listing/download/render stop immediately with 404, file purged after a 24h retention delay on Carbone Cloud) and the blast radius difference between Template ID and Version ID. That is behavioral context well beyond the annotation hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the action, then effect, then the ID-type distinction, then the alternative. No filler or restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers action, immediate and delayed effects, ID-type semantics, and the alternative scheduling tool. No output schema is needed for a deletion, and no gaps remain for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema description already explains the two ID formats and where they come from. The description restates the Template ID vs Version ID distinction without adding syntax or format detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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 Carbone template') and immediately qualifies scope by ID type. An agent can distinguish it from sibling read/list tools 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: delete by Template ID vs Version ID, and names the alternative path for deferred action ('To schedule a deletion instead, use update_template_metadata with expireAt...'). This is when-to-use and when-to-use-something-else in one place.

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 the original source file of a stored Carbone template (e.g. the DOCX, XLSX, PPTX, or HTML file that was uploaded). Use this to inspect, edit, or back up a template. Pass a Template ID to download the currently deployed version, or a Version ID to download a specific version. Set sample: true to get the JSON sample dataset stored with the template instead of the template file.

NameRequiredDescriptionDefault
sampleNoIf 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.
outputPathNoOptional 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).
templateIdYesTemplate 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.
asAttachmentNoIf 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.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false while the description frames this as a passive 'download', which the disk-write behavior under outputPath justifies rather than contradicts. The description notes the no-overwrite guard and the sample error case, but both of those details are already spelled out in the schema, so genuine added behavioral context is limited.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each doing distinct work, with the core action and file types front-loaded before the version-selection and sample-mode refinements.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter tool with no output schema and one required parameter, the description covers the main modes (deployed vs versioned, file vs sample JSON) adequately. It could mention the attachment/inline return trade-off, though the schema handles that thoroughly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description restates the Template ID vs Version ID semantics and the sample flag, but adds no format or syntax detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Download the original source file of a stored Carbone template') and enumerates the file types involved, so it is immediately distinguishable from siblings like list_templates, render_document, and inspect_template.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete use cases ('inspect, edit, or back up a template') and clearly routes between Template ID (deployed version) and Version ID (specific version), plus when to use sample:true. It stops short of naming an actual alternative tool for the inspect/back-up workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_api_statusAPI StatusA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
messageYesStatus message returned by the API.
versionYesThe running Carbone API version.

TDQS

A4.3/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_capabilitiesCapabilitiesA
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 TemplateA
Read-onlyIdempotent
Inspect

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 exactly one of templateId (a stored template: Template ID or Version ID) or template: a local file path, an HTTPS URL, or a base64-encoded string. It runs one render on the Carbone account and discards the document. {t()} translation tags are not listed.

NameRequiredDescriptionDefault
templateNoInline 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.
templateIdNoThe 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.

Output Schema

NameRequiredDescription
tagsYesThe Carbone tags of the template, as written, e.g. "{d.customer.name}", "{d.items[i].label}", "{c.company}". {t()} translation tags are not listed.
errorNoError reported by Carbone while inspecting; only present when there is one.
sampleYesA sample dataset matching the template structure, with placeholder values: { "data": {...}, "complement": {...} }. Pass sample.data as render_document data, and sample.complement as complement.
signaturesNoSignature fields found in the template; only present when there are any.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-obvious context beyond that: it consumes one render on the Carbone account and discards the resulting document, and it will not list {t()} translation tags. It does not cover auth or rate-limit behavior, which keeps it out of the top band.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, front-loaded with purpose, then routing guidance, then the parameter contract, then the translation-tag caveat. Every sentence carries information an agent needs, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

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 no prose explanation, and annotations carry the safety profile. Given that, the description covers what is left: what it returns conceptually, when to call it, the parameter exclusivity, the account-side side effect, and a known limitation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the schema already documents path forms, supported formats, and ID types in detail. The description still earns a bump by foregrounding the exclusive-or contract ('Pass exactly one of templateId ... or template') and summarizing the three accepted input forms, which is the key selection decision at call time.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb+resource pair: list the Carbone tags a template uses and return a matching sample JSON dataset. It also distinguishes itself from the closest sibling by naming render_document, so an agent can separate inspection from rendering 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit trigger: 'Call it before render_document when you do not know which data a template expects,' naming the alternative tool and the condition that selects it. It stops short of stating the inverse (skip it when the data shape is already known), so it is clear context rather than a full when/when-not rule.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_categoriesList CategoriesA
Read-onlyIdempotent
Inspect

List all template categories currently in use in your Carbone account. Categories act like folders for organising templates (e.g. "invoices", "legal", "hr"). Use the returned names as the category filter in list_templates or upload_template.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
categoriesYesTemplate category names in use.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as a read-only, idempotent, non-destructive, closed-world operation, so the safety profile is covered. The description adds genuine domain context beyond that — categories behave like folders, with concrete examples ('invoices', 'legal', 'hr') — though it says nothing about auth requirements or result size.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, each earning its place: what the tool returns, what a category conceptually is, and how to consume the output. The purpose is front-loaded with no preamble.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value documentation is unnecessary, and the description still explains how to use the returned names. For a zero-argument list tool with full annotations, nothing an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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; the baseline for a parameterless tool is 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all template categories') and scopes it to the caller's Carbone account. It is clearly distinguishable from siblings like list_templates and list_tags because it names the domain object it enumerates.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent forward: 'Use the returned names as the category filter in list_templates or upload_template,' naming the downstream tools. It lacks an explicit when-not-to-use condition, but the usage context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_tagsList TagsA
Read-onlyIdempotent
Inspect

List all tags currently used across templates in your Carbone account. Tags are free-form labels attached to templates (e.g. "sales", "billing", "v2"). To find the templates with a tag, call list_templates and keep the results whose tags include it.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
tagsYesTemplate tag names in use.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and non-open-world behavior, so the safety profile is covered. The description adds genuinely new context beyond the annotations: tags are free-form (uncontrolled vocabulary) and the result is an account-wide aggregate across templates, which tells the agent what the list represents.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action and scope, then the definition, then the follow-up routing. 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.

Completeness5/5

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, and the input is parameterless. The description covers purpose, scope, the meaning of the returned data, and the next step, leaving nothing an agent needs in order to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no argument semantics to explain; the baseline for a parameterless tool is 4. Nothing in the description misrepresents the (empty) input contract.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all tags') with an explicit scope constraint ('currently used across templates in your Carbone account'), and defines the domain concept ('free-form labels attached to templates') so the agent knows what a tag is. This is enough to separate it from the template-listing siblings 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.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete follow-up guidance: to resolve a tag to templates, call list_templates and filter results whose `tags` include it. It does not state exclusions or contrast against the similar-sounding list_categories sibling, 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.

list_templatesList TemplatesA
Read-onlyIdempotent
Inspect

List stored Carbone templates with filtering, search, and pagination. Filter by Template ID, Version ID, category, or upload origin. Use includeVersions to see the full version history of each template. Supports cursor-based pagination for large collections. Each result carries its tags: to find templates by tag, keep the results whose tags include it (list_tags lists the tags in use). Note: templates uploaded with versioning disabled appear with id = null and are identified only by their versionId — pass that versionId where a Template ID is expected (e.g. delete_template, download_template).

NameRequiredDescriptionDefault
idNoFilter by Template ID (64-bit format). Cannot be a Version ID.
limitNoMaximum number of results to return, between 1 and 100 (Carbone API limit). Default: 100. Use cursor to page beyond that.
cursorNoPagination cursor from the previous response nextCursor field. Use to fetch the next page.
originNoFilter 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.
searchNoFuzzy search in template names, or exact match on Template ID / Version ID.
categoryNoFilter by category (e.g. "invoices", "legal").
versionIdNoFilter by Version ID (SHA-256 format).
includeVersionsNoIf true, returns all versions for each template. Default: false (only deployed version).

Output Schema

NameRequiredDescription
hasMoreYesWhether more results are available via the cursor.
templatesYesThe matching templates (all fields).
nextCursorNoCursor to pass to the next list_templates call.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so the safety profile is covered. The description adds genuinely non-obvious behavior: cursor-based pagination and the id=null case for templates uploaded with versioning disabled. It stops short of describing result shape, but the output schema handles that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and filtering scope in the first sentence, then edge cases. Slight redundancy between the opening phrase "with filtering, search, and pagination" and the subsequent enumeration of filter fields, but every remaining sentence carries actionable content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter, zero-required listing tool with full schema coverage, annotations, and an output schema, the description covers the one thing structured fields cannot: the id=null/versionId fallback and tag-based lookup workflow. Nothing needed to invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, but the description adds real semantic value beyond the schema by explaining how id and versionId relate (null id, versionId as substitute) and how tags are actually consumed from results rather than filtered on.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ("List stored Carbone templates") and enumerates the filtering dimensions, which cleanly separates it from siblings like list_tags, list_categories, and inspect_template. An agent can identify the tool's role 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: use includeVersions for version history, use list_tags to discover tags (since tags are not a filter parameter here), and pass versionId to delete_template/download_template when id is null. It names concrete alternatives and the conditions that select them.

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 by merging a Carbone template with JSON data. Two modes: (1) pass templateId to use a previously uploaded template; (2) pass template (a local file path, an HTTPS URL, or a base64-encoded string) to upload and render in a single request without storing a template. Supports output format conversion, multilingual rendering, currency conversion, batch generation, and advanced PDF options (watermark, password, PDF/A). Without data, every tag resolves to empty; to keep the tags as written, pass keepTags: true (e.g. to proof a stored template), or use convert_document for a file. Async mode: pass webhookUrl. This tool then returns only Carbone's acceptance message, never the document: Carbone POSTs { "success": true, "data": { "renderId": "..." } } to the webhook, whose server downloads the document itself from GET /render/{renderId} (one-time, no auth). You cannot fetch it from here. Batch generation (batchSplitBy) is always delivered this way.

NameRequiredDescriptionDefault
dataNoJSON 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.
enumNoEnumeration 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
langNoLocale 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
failOnNoConditions 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
keepTagsNoIf 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.
templateNoInline 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.
timezoneNoIANA 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
convertToNoOutput 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": { ... } }.
converterNoConverter 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
complementNoExtra 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.
outputPathNoOptional 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).
reportNameNoFilename (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).
returnLinkNoIf 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).
templateIdNoThe 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.
webhookUrlNoWebhook 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".
batchOutputNoBatch result type, with batchSplitBy. "zip" (default): an archive of all generated documents. "pdf": the generated PDFs concatenated into one file; requires convertTo "pdf".
hardRefreshNoIf 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.
variableStrNoCarbone 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
asAttachmentNoIf 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.
batchSplitByNoBatch 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
translationsNoTranslation 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
currencyRatesNoExchange 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.
currencySourceNoISO 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.
currencyTargetNoISO 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
webhookHeadersNoCustom 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.
batchReportNameNoName 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.
egressAuthorizationNoValue 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.
preReleaseFeatureInNoPre-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

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly=false, openWorld=true, idempotent=false, destructive=false. The description adds crucial non-obvious behavior: in async mode it returns only Carbone's acceptance message and never the document, the webhook server must fetch GET /render/{renderId} (one-time, no auth), and 'You cannot fetch it from here.' This is high-value disclosure beyond structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and the two modes are front-loaded, and the async caveat is called out with emphasis. The prose is dense and long but nearly every sentence (keepTags semantics, webhook delivery, batch behavior) earns its place; minor trimming is possible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 28-parameter, no-output-schema tool, the description covers the highest-risk behaviors: async/webhook delivery, mutual exclusivity, keepTags, and batch. Remaining details (converter engine choice, currency/translation plumbing) are fully documented in the schema, so completeness is strong though not exhaustive in the description itself.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% across all 28 params, so the schema already carries full parameter semantics; baseline is 3. The description reinforces the keepTags-vs-omitted-data distinction and mode exclusivity but mostly restates what the schema documents.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource ('Generate a document by merging a Carbone template with JSON data') and immediately distinguishes its two operating modes (templateId vs inline template). It also names sibling tools (convert_document, upload_template) so an agent can differentiate without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes between alternatives: inline template for ephemeral renders vs upload_template + templateId for reuse, convert_document when working from a file, and keepTags to proof a stored template. It states the async condition (webhookUrl) and that batch generation is always delivered that way, leaving little to inference.

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 MetadataA
DestructiveIdempotent
Inspect

Update the metadata of ONE stored template version: name, comment, category, tags, deployment (deployedAt), scheduled deletion (expireAt), or the Template ID it belongs to (moveToTemplateId). With a Template ID, Carbone patches its currently deployed version only; with a Version ID, that exact version. Use deployedAt to choose the version used when rendering by Template ID. Returns the patched versionId and the updated fields, as echoed back by Carbone. To delete a template now, use delete_template.

NameRequiredDescriptionDefault
idNoDEPRECATED: the 1.6.0 name of moveToTemplateId, kept so existing callers keep working. Use moveToTemplateId; passing both with different values is rejected.
nameNoNew display name, max 200 characters.
tagsNoNew 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).
commentNoNew free-text comment, max 200 characters.
categoryNoNew category, max 200 characters.
expireAtNoSchedule 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.
deployedAtNoUnix 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.
templateIdYesTemplate 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.
moveToTemplateIdNoCAUTION, 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.

Output Schema

NameRequiredDescription
idNoTemplate ID the version now belongs to (returned when moveToTemplateId was used).
nameNoName, returned if updated.
tagsNoTags, returned if updated.
commentNoComment, returned if updated.
categoryNoCategory, returned if updated.
expireAtNoDeletion timestamp (0 = never expires), returned if updated.
versionIdYesVersion ID of the patched version.
deployedAtNoDeployment timestamp, returned if updated.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive, non-read-only, and idempotent, but the description adds substantial context: expireAt causes 404 and eventual file purge, deployedAt has a special NOW value and cannot move backward, and moveToTemplateId is a structural change with fallback behavior on the source template. These details go well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and then layers on the important behavioral rules without filler. Every sentence carries actionable information for a 9-parameter mutation tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so the return values needn't be fully explained, but the description still notes that the patched versionId and updated fields are echoed back. Combined with annotations and full schema coverage, an agent has everything needed to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, the schema already documents each parameter in depth, so the baseline is 3. The description adds a useful consolidated semantic layer—grouping the fields and clarifying the Template ID vs Version ID patching rule—but much of this overlaps the schema, keeping it below a full 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Update the metadata of ONE stored template version') and enumerates the updatable fields, so an agent can immediately tell what the tool touches. It also distinguishes itself from delete_template and separates Template ID vs Version ID semantics.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use rules: Template ID patches only the deployed version, Version ID patches the exact version, and deployedAt selects the version used for rendering by Template ID. It also names delete_template for immediate deletion and cautions that moveToTemplateId should be used only when the user asks to move a version.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_templateUpload TemplateAInspect

Upload and store a reusable Carbone template. Once uploaded, use render_document with the returned Template ID to generate documents from it. Supports versioning: multiple versions can live under a single stable Template ID, and rendering by Template ID uses the version with the most recent deployedAt. A result deployedAt of 0 means the version is not explicitly deployed: if another version of the same Template ID is deployed, renders by Template ID keep using that one. Accepted formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, XML, SVG, IDML, Markdown, TXT, CSV, RTF and PDF (not the legacy binary DOC, XLS or PPT).

NameRequiredDescriptionDefault
idNoExisting 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.
nameNoDisplay 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.
tagsNoLabels 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).
sampleNoSample 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" } }].
commentNoFree-text comment to describe the template version or its purpose, max 200 characters.
categoryNoGroup templates into folders/categories, max 200 characters (e.g. "invoices", "legal", "hr").
expireAtNoSchedule 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.
templateYesThe 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.
deployedAtNoUTC 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.
versioningNoEnable 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.

Output Schema

NameRequiredDescription
idNoStable Template ID (when versioning is enabled).
nameNoTemplate display name, when one was given.
sizeNoTemplate size in bytes.
typeNoDetected template file type.
createdAtNoUTC Unix timestamp (seconds) of the upload.
versionIdNoVersion ID (SHA-256) of this uploaded version.
deployedAtNoUTC Unix timestamp of deployment; 0 means this version is not explicitly deployed.
templateIdNoTemplate ID returned in legacy/non-versioned mode.
templateExtensionNoDetected file extension, e.g. "docx" (legacy/non-versioned mode).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a non-read-only, open-world, non-idempotent, non-destructive operation. The description adds substantial behavioral context beyond those annotations: versioning semantics, the deployedAt=0 behavior, expiry/purge/404 consequences, and rejection of legacy binary Office formats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and follow-up usage, then proceeds to versioning and format details. It is somewhat long and repeats accepted format information that also appears in the schema, but the size is reasonable for a complex 10-parameter upload tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, output schema, and annotations, the description covers what an agent needs: purpose, follow-up render action, versioning behavior, accepted formats, and expiry behavior. No critical behavior appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds meaningful cross-parameter semantics not fully captured by individual schema fields, especially how multiple versions relate to a stable Template ID and how rendering selects the most recent deployedAt version.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: uploading and storing a reusable Carbone template. It also explains the primary follow-up action via render_document using the returned Template ID, which clearly distinguishes this tool from render_document itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context by saying the returned Template ID should be passed to render_document, and it mentions delete_template for immediate removal. It does not explicitly compare this tool against update_template_metadata or state when not to use it, so it falls 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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 2 tool updatesv2.1.4
    • Changedupdate_template_metadata3 fields changed
      • addedInput schema / properties / tags / items / maxLength
        Added value: +96
      • addedInput schema / properties / tags / items / minLength
        Added value: +1
      • addedInput schema / properties / tags / maxItems
        Added value: +100
    • Changedupload_template3 fields changed
      • addedInput schema / properties / tags / items / maxLength
        Added value: +96
      • addedInput schema / properties / tags / items / minLength
        Added value: +1
      • addedInput schema / properties / tags / maxItems
        Added value: +100
  2. 11 tool updatesv2.0.0
    • Changedconvert_document12 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / asAttachment / description
        Previous 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."
      • changedInput schema / properties / convertTo / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / convertTo / description
        Previous 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\": { ... } }."
      • changedInput schema / properties / converter / description
        Previous 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"
      • changedInput schema / properties / converter / enum
        Previous value: -[
        -  "L",
        -  "C",
        -  "O",
        -  "I"
        -]New value: +[
        +  "L",
        +  "O",
        +  "C",
        +  "I"
        +]
      • changedInput schema / properties / egressAuthorization / description
        Previous 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."
      • changedInput schema / properties / egressAuthorization / maxLength
        Previous value: -512New value: +511
      • changedInput schema / properties / file / description
        Previous 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"
      • changedInput schema / properties / hardRefresh / description
        Previous 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 } } }."
      • changedInput schema / properties / outputPath / description
        Previous 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)."
      • changedInput schema / properties / reportName / description
        Previous 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)."
    • Changeddelete_template1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changeddownload_template3 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / outputPath / description
        Previous 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)."
      • changedInput schema / properties / sample / description
        Previous 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."
    • Changedget_api_status1 field changed
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Addedinspect_template
    • Changedlist_categories1 field changed
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_tags1 field changed
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedlist_templates4 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / limit / description
        Previous 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."
      • changedInput schema / properties / origin / description
        Previous 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."
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedrender_document24 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / asAttachment / description
        Previous 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."
      • changedInput schema / properties / batchOutput / description
        Previous 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\"."
      • changedInput schema / properties / batchReportName / description
        Previous 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."
      • changedInput schema / properties / batchSplitBy / description
        Previous 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"
      • changedInput schema / properties / convertTo / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / convertTo / description
        Previous 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\": { ... } }."
      • changedInput schema / properties / converter / description
        Previous 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"
      • changedInput schema / properties / converter / enum
        Previous value: -[
        -  "L",
        -  "C",
        -  "O",
        -  "I"
        -]New value: +[
        +  "L",
        +  "O",
        +  "C",
        +  "I"
        +]
      • changedInput schema / properties / currencyTarget / description
        Previous 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"
      • changedInput schema / properties / data / description
        Previous 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."
      • changedInput schema / properties / egressAuthorization / description
        Previous 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."
      • changedInput schema / properties / egressAuthorization / maxLength
        Previous value: -512New value: +511
      • changedInput schema / properties / enum / description
        Previous 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"
      • addedInput schema / properties / failOn
        Added 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"
        +}
      • changedInput schema / properties / keepTags / description
        Previous 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."
      • changedInput schema / properties / outputPath / description
        Previous 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)."
      • addedInput schema / properties / preReleaseFeatureIn
        Added 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"
        +}
      • changedInput schema / properties / reportName / description
        Previous 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)."
      • changedInput schema / properties / returnLink / description
        Previous 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)."
      • changedInput schema / properties / template / description
        Previous 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."
      • changedInput schema / properties / translations / description
        Previous 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"
      • changedInput schema / properties / variableStr / description
        Previous 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"
      • changedInput schema / properties / webhookUrl / description
        Previous 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\"."
    • Changedupdate_template_metadata16 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / category / description
        Previous value: -"New category."New value: +"New category, max 200 characters."
      • addedInput schema / properties / category / maxLength
        Added value: +200
      • changedInput schema / properties / comment / description
        Previous value: -"New free-text comment."New value: +"New free-text comment, max 200 characters."
      • addedInput schema / properties / comment / maxLength
        Added value: +200
      • changedInput schema / properties / deployedAt / description
        Previous 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."
      • changedInput schema / properties / expireAt / description
        Previous 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."
      • changedInput schema / properties / expireAt / minimum
        Previous value: --9007199254740991New value: +0
      • changedInput schema / properties / id / description
        Previous 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."
      • addedInput schema / properties / id / minLength
        Added value: +1
      • addedInput schema / properties / moveToTemplateId
        Added 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"
        +}
      • changedInput schema / properties / name / description
        Previous value: -"New display name."New value: +"New display name, max 200 characters."
      • addedInput schema / properties / name / maxLength
        Added value: +200
      • changedInput schema / properties / tags / description
        Previous 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)."
      • changedInput schema / properties / templateId / description
        Previous 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."
      • changedOutput 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"
        +}
    • Changedupload_template24 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / category / description
        Previous 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\")."
      • addedInput schema / properties / category / maxLength
        Added value: +200
      • changedInput schema / properties / comment / description
        Previous 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."
      • addedInput schema / properties / comment / maxLength
        Added value: +200
      • changedInput schema / properties / deployedAt / description
        Previous 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."
      • changedInput schema / properties / expireAt / description
        Previous 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."
      • changedInput schema / properties / expireAt / minimum
        Previous value: --9007199254740991New value: +0
      • changedInput schema / properties / name / description
        Previous 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."
      • addedInput schema / properties / name / maxLength
        Added value: +200
      • changedInput schema / properties / sample / description
        Previous 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\" } }]."
      • addedInput schema / properties / sample / items / additionalProperties
        Added value: +false
      • removedInput schema / properties / sample / items / required
        Removed value: -[
        -  "data",
        -  "complement",
        -  "translations",
        -  "enum"
        -]
      • addedInput schema / properties / sample / maxItems
        Added value: +1
      • changedInput schema / properties / tags / description
        Previous 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)."
      • changedInput schema / properties / template / description
        Previous 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."
      • changedInput schema / properties / versioning / description
        Previous 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."
      • changedInput schema / required
        Previous value: -[
        -  "template",
        -  "name"
        -]New value: +[
        +  "template"
        +]
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / createdAt
        Added value: +{
        +  "description": "UTC Unix timestamp (seconds) of the upload.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / deployedAt
        Added value: +{
        +  "description": "UTC Unix timestamp of deployment; 0 means this version is not explicitly deployed.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / name / description
        Previous value: -"Template display name."New value: +"Template display name, when one was given."
      • addedOutput schema / properties / templateExtension
        Added value: +{
        +  "description": "Detected file extension, e.g. \"docx\" (legacy/non-versioned mode).",
        +  "type": "string"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "name"
        -]
  3. 6 tool updatesv1.6.0
    • Changedconvert_document8 fields changed
      • changedInput schema / properties / convertTo / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / convertTo / description
        Previous 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\" } }."
      • changedInput schema / properties / converter / description
        Previous 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."
      • changedInput schema / properties / converter / enum
        Previous value: -[
        -  "L",
        -  "C",
        -  "O"
        -]New value: +[
        +  "L",
        +  "C",
        +  "O",
        +  "I"
        +]
      • changedInput schema / properties / file / description
        Previous 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"
      • addedInput schema / properties / hardRefresh
        Added 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"
        +}
      • changedInput schema / properties / outputPath / description
        Previous 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."
      • addedInput schema / properties / reportName
        Added 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"
        +}
    • Changeddownload_template2 fields changed
      • changedInput schema / properties / outputPath / description
        Previous 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."
      • addedInput schema / properties / sample
        Added 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"
        +}
    • Changedlist_templates2 fields changed
      • changedInput schema / properties / limit / description
        Previous 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."
      • changedInput schema / properties / origin / description
        Previous 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."
    • Changedrender_document15 fields changed
      • changedInput schema / properties / batchOutput / description
        Previous 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."
      • addedInput schema / properties / batchOutput / enum
        Added value: +[
        +  "zip",
        +  "pdf"
        +]
      • changedInput schema / properties / batchReportName / description
        Previous 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."
      • changedInput schema / properties / batchSplitBy / description
        Previous 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."
      • changedInput schema / properties / complement / description
        Previous 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."
      • changedInput schema / properties / convertTo / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / converter / description
        Previous 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."
      • changedInput schema / properties / converter / enum
        Previous value: -[
        -  "L",
        -  "C",
        -  "O"
        -]New value: +[
        +  "L",
        +  "C",
        +  "O",
        +  "I"
        +]
      • changedInput schema / properties / currencyRates / description
        Previous 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."
      • changedInput schema / properties / data / description
        Previous 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."
      • changedInput schema / properties / enum / description
        Previous 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-"
      • addedInput schema / properties / keepTags
        Added 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"
        +}
      • changedInput schema / properties / outputPath / description
        Previous 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)."
      • changedInput schema / properties / template / description
        Previous 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."
      • changedInput schema / properties / translations / description
        Previous 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"
    • Changedupdate_template_metadata1 field changed
      • addedInput schema / properties / id
        Added 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"
        +}
    • Changedupload_template1 field changed
      • changedInput schema / properties / template / description
        Previous 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"
  4. 2 tool updatesv1.4.0
    • Changedconvert_document1 field changed
      • addedInput schema / properties / egressAuthorization
        Added 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"
        +}
    • Changedrender_document3 fields changed
      • changedInput schema / properties / data / description
        Previous 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."
      • addedInput schema / properties / egressAuthorization
        Added 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"
        +}
      • removedInput schema / required
        Removed value: -[
        -  "data"
        -]
  5. 8 tool updatesv1.2.2
    • Changedconvert_document5 fields changed
      • addedInput schema / properties / asAttachment
        Added 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"
        +}
      • changedInput schema / properties / convertTo / anyOf
        Previous 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"
        +  }
        +]
      • changedInput schema / properties / file / description
        Previous 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"
      • addedInput schema / properties / outputPath
        Added 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"
        +}
      • addedInput schema / properties / returnLink
        Added 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"
        +}
    • Changeddownload_template2 fields changed
      • addedInput schema / properties / asAttachment
        Added 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"
        +}
      • addedInput schema / properties / outputPath
        Added 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"
        +}
    • Changedget_api_status1 field changed
      • changedOutput 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"
        +}
    • Changedlist_categories1 field changed
      • changedOutput 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"
        +}
    • Changedlist_tags1 field changed
      • changedOutput 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"
        +}
    • Changedlist_templates5 fields changed
      • changedInput schema / properties / limit / description
        Previous 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."
      • removedInput schema / properties / limit / exclusiveMinimum
        Removed value: -0
      • changedInput schema / properties / limit / maximum
        Previous value: -9007199254740991New value: +100
      • addedInput schema / properties / limit / minimum
        Added value: +1
      • changedOutput 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"
        +}
    • Changedrender_document30 fields changed
      • addedInput schema / properties / asAttachment
        Added 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"
        +}
      • removedInput schema / properties / complement / additionalProperties
        Removed value: -{}
      • addedInput schema / properties / complement / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": {},
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / complement / description
        Previous 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."
      • removedInput schema / properties / complement / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / complement / type
        Removed value: -"object"
      • changedInput schema / properties / convertTo / anyOf
        Previous 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"
        +  }
        +]
      • removedInput schema / properties / currencyRates / additionalProperties
        Removed value: -{
        -  "type": "number"
        -}
      • addedInput schema / properties / currencyRates / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": {
        +      "type": "number"
        +    },
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / currencyRates / description
        Previous 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."
      • removedInput schema / properties / currencyRates / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / currencyRates / type
        Removed value: -"object"
      • removedInput schema / properties / data / additionalProperties
        Removed value: -{}
      • addedInput schema / properties / data / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": {},
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "items": {},
        +    "type": "array"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / data / description
        Previous 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."
      • removedInput schema / properties / data / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / data / type
        Removed value: -"object"
      • removedInput schema / properties / enum / additionalProperties
        Removed value: -{}
      • addedInput schema / properties / enum / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": {},
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / enum / description
        Previous 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-"
      • removedInput schema / properties / enum / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / enum / type
        Removed value: -"object"
      • addedInput schema / properties / outputPath
        Added 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"
        +}
      • changedInput schema / properties / reportName / description
        Previous 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)}\"."
      • addedInput schema / properties / returnLink
        Added 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"
        +}
      • removedInput schema / properties / translations / additionalProperties
        Removed value: -{
        -  "additionalProperties": {
        -    "type": "string"
        -  },
        -  "propertyNames": {
        -    "type": "string"
        -  },
        -  "type": "object"
        -}
      • addedInput schema / properties / translations / anyOf
        Added value: +[
        +  {
        +    "additionalProperties": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "propertyNames": {
        +      "type": "string"
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "string"
        +  }
        +]
      • changedInput schema / properties / translations / description
        Previous 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"
      • removedInput schema / properties / translations / propertyNames
        Removed value: -{
        -  "type": "string"
        -}
      • removedInput schema / properties / translations / type
        Removed value: -"object"
    • Changedupload_template2 fields changed
      • changedInput schema / properties / template / description
        Previous 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"
      • changedOutput 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"
        +}
  6. 11 tool updatesv1.1.2
    • First observedconvert_document
    • First observeddelete_template
    • First observeddownload_template
    • First observedget_api_status
    • First observedget_capabilities
    • First observedlist_categories
    • First observedlist_tags
    • First observedlist_templates
    • First observedrender_document
    • First observedupdate_template_metadata
    • First observedupload_template

TDQS

A4.4/5.0

Scored across 12 tools

Disambiguation4/5

Each tool targets a distinct action on a distinct resource (upload, list, download, update, delete, render, convert, inspect), and the descriptions explicitly cross-reference each other to steer selection. The only mild overlap is render_document vs convert_document (both can output a converted/proofed file, and render with keepTags:true approaches conversion), but the descriptions call this distinction out clearly.

Naming Consistency5/5

All twelve tools use a uniform snake_case verb_noun pattern (upload_template, list_tags, update_template_metadata, delete_template, get_api_status, etc.). No mixed casing or inconsistent verb styles; list/get/update/delete/upload/convert/render forms are predictable.

Tool Count5/5

Twelve tools is well within the ideal 3-15 range and each one covers a distinct capability (lifecycle CRUD, rendering, conversion, inspection, discovery helpers). No obvious filler or redundant tool.

Completeness4/5

Template lifecycle is fully covered: upload (create), list/download (read), update_template_metadata (update), delete, plus render, convert, inspect, and discovery helpers for tags/categories/capabilities/status. Minor gaps exist around async render jobs—there is no tool to poll render status or fetch a renderId result, since async output only goes to a webhook—and tags/categories can only be listed, not managed directly.

Maintenance

ActivityNo data
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers