Skip to main content
Glama

Carbone MCP Server

npm version MCP Registry License: Apache-2.0

公式 Carbone MCP サーバー — AI アシスタントを文書自動化のエキスパートに変えます。自然言語を使ってプロフェッショナルな PDF、請求書、レポートなどを生成します。

Claude、ChatGPT、その他の AI アシスタントに以下の機能を提供します:

  • 🔄 ドキュメント変換 — 100 以上の形式の組み合わせ (PDF、DOCX、XLSX、PNG、HTML、CSV など)

  • 📄 テンプレートエンジン{d.field} タグを使用して JSON データからドキュメントを生成

  • 📚 テンプレートライブラリ — 再利用可能なテンプレートのアップロード、バージョン管理、カテゴリ分類、管理

  • 🎨 PDF カスタマイズ — PDF フォームの入力、透かし、パスワード、暗号化、複数の変換エンジン (LibreOffice、OnlyOffice、Chromium、Carbone ICE)

  • 🌍 ローカライゼーション — 多言語サポート、通貨換算、タイムゾーン処理

  • バッチ生成 — 1 回のリクエストで数百のドキュメントを作成 (webhook による非同期)


インストール

無料の API キーを account.carbone.io で取得してください。

stdio — Claude Desktop、VS Code、Cursor、Claude Code など

すべての stdio 互換 MCP クライアントは同じ設定を使用します:

{
  "mcpServers": {
    "carbone": {
      "command": "npx",
      "args": ["-y", "carbone-mcp"],
      "env": {
        "CARBONE_API_KEY": "your_api_key_here"
      }
    }
  }
}

クライアント

設定ファイル

Claude Desktop (macOS)

~/Library/Application Support/Claude/claude_desktop_config.json

Claude Desktop (Windows)

%APPDATA%\Claude\claude_desktop_config.json

Cursor (グローバル)

~/.cursor/mcp.json

Cursor (プロジェクト)

.cursor/mcp.json

Claude Code

claude mcp add carbone-mcp -e CARBONE_API_KEY=your_key -- npx -y carbone-mcp

VS Code{ "mcp": { "servers": { ... } } }{ "mcpServers": { ... } } の代わりに使用します — 内部の設定ブロックは同一です。

設定を追加したら、クライアントを再起動して、「Carbone は何ができますか?」 と試してみてください。


HTTP — mcp.carbone.io (ローカルインストール不要)

ホストされたエンドポイントに直接接続します。VS Code、Cursor、Claude Code、およびストリーミング可能な HTTP トランスポートをサポートする他のクライアントでサポートされています。

{
  "mcp": {
    "servers": {
      "carbone": {
        "type": "streamable-http",
        "url": "https://mcp.carbone.io",
        "headers": {
          "Authorization": "Bearer your_api_key_here"
        }
      }
    }
  }
}

認証: HTTP エンドポイントは現在、Authorization ヘッダーで Bearer トークンとして渡される Carbone API キーを必要とします。OAuth2 サポート (Claude Desktop、Mistral、ChatGPT、Gemini、および他のクライアント向け) は将来のリリースで計画されています。

Cursor{ "mcpServers": { ... } }{ "mcp": { "servers": { ... } } } の代わりに使用します — 内部の設定ブロックは同一です。

Claude Desktop は HTTP Bearer トークン認証をサポートしていません — 代わりに上記の stdio オプションを使用してください。


Docker — セルフホスト HTTP サーバー

docker run -d -p 3000:3000 \
  -e MCP_TRANSPORT=http \
  -e CARBONE_API_KEY=your_api_key_here \
  carbone/carbone-mcp

上記の HTTP 設定を使用して MCP クライアントを http://your-host:3000 に接続します (URL を置き換えてください)。

Docker Composecompose.yml を参照してください:

CARBONE_API_KEY=your_key docker compose up -d

Claude Desktop と Docker (stdio) — Claude Desktop は HTTP トランスポートをサポートしていません。代わりに stdio モードを使用してください:

{
  "mcpServers": {
    "carbone": {
      "command": "docker",
      "args": ["run", "-i", "--rm",
               "-e", "CARBONE_API_KEY=your_api_key_here",
               "-e", "MCP_TRANSPORT=stdio",
               "carbone/carbone-mcp"]
    }
  }
}

オンプレミス — セルフホスト Carbone インスタンス

Carbone オンプレミス を実行している場合は、MCP サーバーをインスタンスに向けてください — API キーは不要です:

# Docker (HTTP)
docker run -d -p 3000:3000 \
  -e CARBONE_BASE_URL=https://your-carbone-server.com \
  carbone/carbone-mcp

# stdio
CARBONE_BASE_URL=https://your-carbone-server.com npx carbone-mcp

Related MCP server: docx-forge-mcp

環境変数

必須 (stdio モード、クラウド API):

  • CARBONE_API_KEY — あなたの Carbone API キー (無料で取得 →)。CARBONE_BASE_URL が自社のオンプレミスサーバーを指している場合、または HTTP モードで実行している場合 (クライアントが Authorization: Bearer 経由で独自のキーを提供する場合) は不要です。

変数

デフォルト

説明

CARBONE_BASE_URL

https://api.carbone.io

セルフホストまたはステージング環境用の上書き。カスタム URL に設定すると、CARBONE_API_KEY は不要です。

CARBONE_TIMEOUT

60000

リクエストのタイムアウト (ミリ秒、最大: 60000)

CARBONE_MAX_FILE_BYTES

104857600

解決された入力ファイル (パス、URL、base64) の最大サイズ (バイト、デフォルト 100 MB)

MCP_TRANSPORT

stdio

トランスポートモード: stdio (デフォルト、AI クライアント用) または http (セルフホストデプロイメント用)

MCP_PORT

3000

HTTP サーバーのポート (MCP_TRANSPORT=http の場合のみ使用)

MCP_PATH

/

HTTP エンドポイントのパス (MCP_TRANSPORT=http の場合のみ使用)

MCP_MAX_BODY_BYTES

62914560

リクエストボディの最大サイズ (バイト、デフォルト 60 MB、Carbone Cloud の制限に一致)

CARBONE_REQUIRE_CLIENT_AUTH_HEADER

false

HTTP モードのみ — すべてのリクエストで Authorization: Bearer <key> を要求します。共有キーサーバーを意図する場合のみ false のままにしてください: サーバーレベルの CARBONE_API_KEY が設定されている場合、Bearer キーを持たないリクエストはそれにフォールバックするため、ポートに到達できる誰でもその Carbone アカウントを使用できます。各クライアントが独自のキーを持つことを要求するには true に設定します。サーバーキーが設定されていない場合 (例: オンプレミス) は無関係です。

CARBONE_ALLOW_PRIVATE_NETWORK

false

ユーザー指定の URL (テンプレート、data など) がプライベート/内部アドレスに解決されることを許可します。SSRF (クラウドメタデータ、localhost、RFC1918) をブロックするため、デフォルトではオフです。内部テンプレートホストを持つ信頼できるデプロイメントでのみ有効にしてください。


利用可能なツール

ドキュメント操作

ツール

説明

ドキュメント

convert_document

テンプレートを保存せずに 100 以上の形式間でドキュメントを変換します

render_document

JSON データとマージしてテンプレートからドキュメントを生成します

テンプレート管理

ツール

説明

ドキュメント

list_templates

カテゴリや検索でフィルタリングしてテンプレートライブラリを閲覧します(タグはテンプレートごとに返されますが、サーバー側でフィルタリングはできません)

list_categories

アカウント内のすべてのテンプレートカテゴリを一覧表示します

list_tags

テンプレート全体で使用されているすべてのタグを一覧表示します

upload_template

バージョン管理、カテゴリ分類、メタデータを備えた再利用可能なテンプレートを保存します

update_template_metadata

テンプレートバージョンの名前変更、カテゴリ分類、タグ付け、デプロイ、または期限切れ設定を行います

delete_template

テンプレートをソフト削除します(削除対象としてマークされ、約24時間後に消去されます)

download_template

元のテンプレートファイル(DOCX、XLSX、PDFなど)をダウンロードします

ディスカバリー

ツール

説明

ドキュメント

get_api_status

Carbone APIのヘルス状態と現在のバージョンを確認します

get_capabilities

サポートされているすべての形式、機能、および例を表示します

📖 完全なAPIリファレンス → — 詳細なパラメータ、スキーマ、および例


出力とファイル配信

デフォルトでは、生成または変換されたファイルは、そのタイプとトランスポートに基づいて返されます:

出力

stdio(ローカルクライアント)

HTTP(リモート / セルフホスト)

テキスト — HTML、TXT、CSV、MD、XML

インラインテキスト

インラインテキスト

インライン画像 — PNG、JPG、GIF、WEBP

インライン画像

インライン画像

その他すべて — PDF、Office、ZIP、SVG…

一時ファイルに保存され、パスが返されます

ダウンロード添付ファイルとして返されます

convert_documentrender_document(および download_templateoutputPath / asAttachment)の3つのオプションパラメータでこれを上書きできます:

パラメータ

効果

outputPath

stdioのみ — インラインで返す代わりに、出力をこのローカルパスに保存します(HTTPモードでは拒否されます)

asAttachment

任意の形式で、インラインではなくダウンロード可能な添付ファイルとしてバイトを返します

returnLink

ファイルの代わりにCarboneの公開ワンタイムダウンロードURLを返します — 短命で、最初のダウンロードで消費されるため、自分で取得するのではなくユーザーに渡してください(stdioとHTTPの両方で動作します)

Claude Desktop: インラインのバイナリ添付ファイルをレンダリングできません(画像として誤って処理されます)。PDFやOfficeファイルの場合は、デフォルトのstdio一時ファイルパスを使用するか、returnLink を使用してダウンロードURLを取得してください。


一般的なユースケース

📄 ドキュメント変換

"Convert this Word document to PDF: /path/to/contract.docx"
"Turn my Excel spreadsheet into CSV format"
"Convert this HTML page to a PNG image"
"Convert my Markdown README to PDF"
"Convert this PPTX to PNG — use OnlyOffice for best fidelity"
"Convert this 500-page Word report to PDF — use the ICE converter, it's much faster"
"Rasterize this PDF to PNG images — one per page"

💼 財務と請求

"Generate an invoice using template T123 with: {customer: 'Acme Corp', total: 1500, items: [...]}"
"Generate invoices from the data in /data/invoices.json"
"Create 500 invoices from my billing data and bundle them in a ZIP"
"Generate a French invoice for my Paris client — use EUR currency and fr-fr locale"
"Render this monthly report for each client in clients.json and ZIP them all"
"Generate invoice-{d.id}.pdf for each row in my sales data"

⚖️ 法務とコンプライアンス

"Add a CONFIDENTIAL watermark to this contract before sending it"
"Convert this NDA to PDF/A format for long-term archiving"
"Generate a password-protected PDF — open password: 'secret123'"
"Create signed offer letters for each candidate using this DOCX template"
"Generate a compliance report with a DRAFT watermark, 20% opacity, rotated -45°"

👥 人事と人材オペレーション

"Create personalized onboarding documents for all 50 new employees in this JSON"
"Generate an employment contract for each person in new-hires.json"
"Build payslips for every employee in my payroll export"
"Create training certificates for everyone who passed this month"
"Fill out the performance review template with each employee's data"

🌍 ローカライゼーションと多言語対応

"Generate this invoice in French, German, and Spanish from the same template"
"Render the report with timezone America/New_York so dates show in Eastern time"
"Convert all prices from EUR to USD using today's exchange rates"
"Generate the contract in fr-fr locale so numbers use European formatting"

🔐 PDFセキュリティと高度なオプション

"Convert this DOCX to a password-protected PDF"
"Add a semi-transparent DRAFT watermark to every page"
"Generate a PDF/A-1b compliant version of this document for archiving"
"Export only pages 1–5 of this presentation as a PDF"
"Convert each slide of this PPTX to a separate PDF page"

📚 テンプレート管理

"Upload this invoice template and tag it 'sales' and 'finance'"
"What templates do I have in the 'contracts' category?"
"Show me all templates tagged 'hr'"
"Download template T456 so I can edit it locally"
"Deploy version V789 as the active version without deleting the others"
"Schedule this old template for deletion in 30 days"

デバッグ

MCP Inspectorの使用

サーバーを対話的にテストおよびデバッグします:

npx @modelcontextprotocol/inspector npx carbone-mcp

またはローカルビルドから:

npx @modelcontextprotocol/inspector node dist/index.js

http://localhost:5173 を開くと、すべてのツールの表示、テスト呼び出し、リクエスト/レスポンスJSONの検査ができます — AI推論は不要です。

サーバーログの表示

# macOS — Claude Desktop logs
tail -f ~/Library/Logs/Claude/mcp*.log

# Windows
Get-Content "$env:APPDATA\Claude\logs\mcp*.log" -Wait -Tail 50

確認する項目:

  • Carbone MCP Server v1.x.x started (stdio)

  • ❌ エラーメッセージやスタックトレース

ヘルスチェック(HTTPモードのみ)

HTTPモードで実行している場合、サーバーはヘルスエンドポイントを公開します:

curl http://localhost:3000/health
{
  "mcp":    { "version": "1.2.2" },
  "carbone": { "version": "5.x.x" }
}

carbone フィールドはバックエンドの接続状態を示します:

  • { "version": "..." } — 到達可能かつ認証済み

  • { "error": "unauthorized", "message": "..." } — 到達可能だがAPIキーがない、または無効

  • { "error": "unreachable", "message": "..." } — ネットワークエラー、タイムアウト、または予期しないレスポンス


セキュリティ

⚠️ ファイルおよびURL入力(SSRF / ローカルファイル) ツールは、file / template および参照渡しのJSONパラメータ(datacomplement など)に対して、ローカルパス、HTTPS URL、またはbase64を受け入れます。2つのガードが適用されます:

  • URL は、ループバック、プライベート(RFC1918)、リンクローカル(クラウドメタデータ 169.254.169.254 を含む)、CGNAT、または予約済みアドレスを指す場合に解決され拒否されます — また、すべてのリダイレクトホップが再チェックされます。内部テンプレートホストを必要とする信頼できるデプロイメントでのみ CARBONE_ALLOW_PRIVATE_NETWORK=true を設定してください。

  • ローカルパスstdioのみ で読み取り可能です。この場合、サーバーはすでにあなた自身として実行されています。HTTPモードでは拒否されるため、リモートの呼び出し元がサーバーに自身のファイルシステムを読み取らせることは決してできません。

⚠️ サーバーレベルのAPIキーの共有(HTTPモード) HTTPサーバーで CARBONE_API_KEY を設定し、CARBONE_REQUIRE_CLIENT_AUTH_HEADER=false(デフォルト)のままにすると、Bearerキーなしのリクエストはそのキーにフォールバックします — ポートに到達できる人は誰でもそのCarboneアカウントを使用できます。各クライアントが独自のキーを持つことを要求するには true に設定するか、信頼できるネットワーク上でのみポートを公開してください。(サーバーキーが設定されていない場合、例えば認証なしのオンプレミスCarboneでは適用されません。)

⚠️ プロンプトインジェクション AIアシスタントを外部サービスに接続することには固有のリスクが伴います。悪意のあるドキュメントやテンプレートには、AIを意図しないアクション(データの外部送信、テンプレートの削除など)に誘導する指示が含まれている可能性があります。ツール呼び出しを確認する前に、AIクライアントが実行しようとしていることを常に確認してください。

⚠️ APIキーの保護

  • CARBONE_API_KEY をバージョン管理にコミットしないでください

  • 環境変数またはシークレットマネージャーを使用してください

  • account.carbone.io でAPIキーを定期的にローテーションしてください

⚠️ テンプレートの安全性

  • 信頼できるソースからのテンプレートのみをアップロードしてください

  • デプロイ前にテンプレートを確認してください

  • 簡単なロールバックのためにテンプレートのバージョン管理を使用してください

⚠️ データプライバシー

  • Carboneはレンダリング後にドキュメントデータを保存しません

  • 最大限の制御のために CARBONE_BASE_URL を使用してセルフホストインスタンスを指定してください

  • 詳細はプライバシーポリシーを参照してください


テンプレート構文

Word、Excel、LibreOffice、またはHTMLで {d.field} タグを使用してテンプレートをデザインします:

Dear {d.customer.name},

Your invoice total is {d.total:formatC(EUR)}.

Items:
{d.items[i].description}  {d.items[i].quantity}x  {d.items[i].price:formatC(EUR)}
{d.items[i+1]}

ガイドとベストプラクティス:


サポートされている出力形式

カテゴリ

形式

ドキュメント

PDF、DOCX、XLSX、PPTX、ODT、ODS、ODP、ODG、RTF、EPUB

画像

PNG、JPG、WEBP、SVG、TIFF、BMP、GIF

Web / テキスト

HTML、TXT、CSV、MD、XML

完全な変換マトリックス:carbone.io/documentation


コントリビューション

コントリビューションを歓迎します:

  • 🐛 バグの報告GitHub Issues 経由

  • 💡 機能リクエスト や改善提案

  • 📝 ドキュメントの改善

  • 🧪 テストの追加 でカバレッジを向上

  • 🔧 プルリクエストの提出 でバグ修正や機能強化

ガイドラインについては CONTRIBUTING.md を参照してください。

開発

npm run dev          # Run with tsx (no build needed)
npm run build        # Compile TypeScript → dist/
npm test             # Run the test suite (integration tests run only with CARBONE_TEST_API_KEY)
npm run test:watch   # Watch mode
npm run test:integration  # Real API tests (requires CARBONE_TEST_API_KEY)
npm run test:coverage     # Coverage report

サポート


ライセンス

Apache 2.0 — LICENSE を参照してください。

Available Tools

11 tools
convert_documentConvert DocumentA
Read-onlyIdempotent
Inspect

Convert any document to another format without storing a template. Supports 100+ input/output format combinations: Office documents, PDFs, images, web pages, spreadsheets, and more. The source file can be a local path, a URL, or a base64 string. Carbone tags are PRESERVED, not resolved: converting a template keeps every {d.field} intact, so this is also how you proof a template in another format (DOCX template → PDF, or DOCX → ODT while it stays a template). Use render_document instead when you need data injection ({d.field} tags resolved), translations, or batch generation. Common conversions: DOCX → PDF (file: "report.docx", convertTo: "pdf"; add converter: "I" for the fastest DOCX→PDF path), XLSX → PDF (file: "data.xlsx", convertTo: "pdf"), PPTX → PDF (file: "slides.pptx", convertTo: "pdf", converter: "O" for best fidelity), HTML → PDF (file: "page.html", convertTo: "pdf", converter: "C" for full CSS/JS rendering), DOCX → HTML (file: "doc.docx", convertTo: "html"), XLSX → CSV (file: "sheet.xlsx", convertTo: "csv"), PDF → PNG (file: "doc.pdf", convertTo: "png"), PPTX → PNG (first slide as image), MD → PDF (file: "readme.md", convertTo: "pdf").

ParametersJSON Schema
NameRequiredDescriptionDefault
fileYesThe 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
convertToYesTarget 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" } }.
converterNoConverter 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.
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.
reportNameNoFilename (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.
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.
hardRefreshNoForces 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.
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 in stdio mode (path returned), or returned as an attachment in HTTP mode. 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 512 characters.

TDQS

A5/5.0
Behavior5/5

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

Annotations already set readOnlyHint, openWorldHint, and idempotentHint. The description adds significant behavioral detail: it clarifies that tags are NOT resolved, describes the ICE engine's limitations (e.g., silently ignoring password options), explains returnLink's short-lived one-time nature, and notes outputPath behavior. This goes well beyond the annotations and is transparent about side effects and caveats.

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?

Although lengthy, every sentence carries unique value. The structure is logical: general purpose → input forms → format lists → converter details → parameter walkthrough. It front-loads the core intent and uses bullet-like formatting within prose to keep information scannable. No redundancy or filler is present.

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 tool's complexity (9 parameters including nested objects and enums), the description covers all necessary aspects: supported input/output formats, converter engine trade-offs, security warnings, edge cases (like ICE ignoring PDF options), and delivery mechanisms. It even points to a full conversion matrix URL. There is no missing information a user would need to call the tool correctly.

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

Parameters5/5

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

Schema coverage is 100% with each parameter having a detailed description. The description adds depth: it explains the three input forms for 'file' (path, URL, base64), the meaning of each converter enum value, the formatOptions examples for PDF and images, and the reportName extension pitfall. This substantially enriches the schema's basic field descriptions.

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 clearly states the tool's function: 'Convert any document to another format without storing a template.' It specifies the verb (convert), the resource (document), and the scope (format transformation). It also distinguishes itself from the sibling render_document by noting that Carbone tags are preserved, not resolved, which makes the purpose unmistakable.

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?

The description explicitly contrasts with render_document: 'Use render_document instead when you need data injection, translations, or batch generation.' It also provides guidance on converter engine selection (L, O, C, I) and notes when hardRefresh is needed (PDF→PDF with formatOptions). This leaves no ambiguity about when to choose this tool versus alternatives.

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. This is a soft delete: the template is marked for garbage collection and removed after a delay (default 24 hours). You can delete by Template ID (removes all versions) or by Version ID (removes only that specific version). For immediate or scheduled deletion, use update_template_metadata with expireAt = 42000000000 (NOW) or a future Unix timestamp.

ParametersJSON Schema
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 indicate destructive and idempotent behavior. The description adds crucial details: it is a soft delete with a 24-hour garbage collection delay, and explains the two deletion modes (template vs version). No contradiction with 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 concise: two sentences. First sentence states the action and soft-delete nature. Second sentence provides the alternative usage. No unnecessary words, well-front-loaded.

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 simple tool with one parameter and no output schema, the description covers all essential aspects: operation, behavior (soft delete, delay), two input modes, and an explicit alternative for different timing needs. It is complete and does not leave gaps.

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, baseline is 3. The description adds meaning beyond the schema by explaining the effect of each ID type: 'removes all versions' vs 'removes only that specific version', and notes that both formats are returned by other tools.

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 clearly states 'Delete a stored Carbone template' with a specific verb and resource. It distinguishes between deleting by Template ID (removes all versions) and Version ID (removes specific version), setting it apart from sibling tools like update_template_metadata.

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

Usage Guidelines4/5

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

The description provides clear context on when to use this tool: for soft deletion with default delay. It explicitly names an alternative for immediate or scheduled deletion ('use update_template_metadata with expireAt'), but does not explicitly state when not to use this tool beyond that.

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

download_templateDownload TemplateA
Read-onlyIdempotent
Inspect

Download the original source file of a stored Carbone template (e.g. the DOCX, XLSX, PPTX, or HTML file that was uploaded). Use this to inspect, edit, or back up a template. Pass a Template ID to download the currently deployed version, or a Version ID to download a specific version. Set sample:true to fetch the JSON sample dataset stored with the template instead of the template file itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
sampleNoIf 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.
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.
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.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is known. The description adds valuable behavioral context beyond that: the distinction between template and version IDs, the side effect of outputPath writing to disk, the asAttachment behavior, and the behavior when sample:true is set (errors if no sample exists). This exceeds what annotations provide and helps the agent anticipate outcomes.

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 two sentences. The first sentence names the purpose and file types, the second covers the version/sample options. Every clause earns its place—no fluff, no repetition of schema fields. The core purpose is front-loaded.

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 tool with 4 parameters, no output schema, and rich annotations, the description covers all key behavioral variations: template vs version selection, sample download, outputPath side effects, and asAttachment fallback. Nothing an agent needs to correctly invoke this tool is missing—including error conditions for missing samples.

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%, so the schema already documents all four parameters thoroughly. The description adds marginal value by restating the template/version distinction in prose, but it does not introduce new semantics beyond the schema. Per the rubric, a baseline of 3 is appropriate when the schema carries the full parameter documentation.

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: 'Download the original source file of a stored Carbone template' and lists the file types (DOCX, XLSX, PPTX, HTML). It clearly distinguishes from siblings like render_document (which generates outputs) and upload_template (which creates templates). The purpose is unambiguous.

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 context for use: 'Use this to inspect, edit, or back up a template.' It differentiates between downloading the deployed version vs a specific version, and explains the sample option. However, it does not explicitly name alternative tools or state when NOT to use this tool, leaving some inference to the agent. Still, the guidance is specific and actionable.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

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

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint. The description adds that it returns 'the current API version and a status message', providing behavioral context 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 consists of three concise, front-loaded sentences with no redundant information. Every sentence adds value.

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 simple health-check tool with no parameters and an output schema, the description covers purpose, return value, and use case completely.

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?

No parameters exist, so baseline is 4. The description appropriately omits parameter details as there are none.

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 uses the specific verb 'Check' and the resource 'Carbone API health and version', clearly distinguishing it from sibling tools that deal with templates and documents.

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 explicitly states it is 'useful for verifying connectivity and confirming which Carbone version is active', providing clear usage context. It does not explicitly mention when not to use, but the purpose is self-evident.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=false. The description adds context about the content of the summary and usage prioritization, but no additional behavioral traits beyond what annotations cover.

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, front-loaded with purpose and usage guidance. Every sentence earns its place with no redundancy or fluff.

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?

Given zero parameters and no output schema, the description covers the tool's purpose and usage guidance well. It mentions links to documentation but does not describe the return format; however, for a simple discovery tool this is sufficient.

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?

No parameters exist, and schema_description_coverage is 100% (trivially). The description adds no parameter info since none are needed. Baseline score of 4 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?

The description clearly states the tool returns a summary of Carbone capabilities, listing specific content like supported formats, features, examples, and links. This distinguishes it from siblings that perform specific operations (e.g., convert_document, render_document).

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?

Explicit guidance is given: 'Call this first if you are unsure what Carbone can do.' It implies when to use, though no explicit when-not-to-use or alternatives are mentioned. Clear and actionable.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON 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 readOnlyHint, openWorldHint, and idempotentHint. The description adds behavioral context by explaining categories act as folders and providing examples (e.g., 'invoices'), enhancing transparency beyond 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?

Two concise sentences with no waste. Front-loaded with the main action, then contextual usage. Every sentence adds value.

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 tool's simplicity (no parameters, output schema exists), the description is complete: it explains what the tool does, why categories matter, and how to use the output. No gaps remain.

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?

No parameters exist, so the description naturally has no parameter info. The schema coverage is 100%, meeting the baseline of 4 for zero-parameter tools.

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 uses a specific verb 'list' and resource 'categories', clearly stating it lists all template categories in use. It distinguishes from siblings like list_tags and list_templates by specifying 'categories' and noting their role as folders.

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 explicitly states how to use the returned names: as a category filter in list_templates or upload_template. While it doesn't mention when not to use it, this context is sufficient for typical use.

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"). Note: the Carbone API does not support filtering list_templates by tag — use this tool to discover available tags, then call list_templates and filter the results manually.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
tagsYesTemplate tag names in use.

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint; the description adds valuable context about tags being free-form and the filtering limitation, which goes beyond 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?

Two sentences plus a note; every sentence adds value. No fluff.

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 no parameters and good annotations, the description fully covers the tool's purpose, usage, and limitations. It also directs to the appropriate sibling tool.

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?

No parameters exist, so schema coverage is 100% (vacuous). Baseline is 4; no extra information needed.

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?

Clearly states it lists all tags used in templates, distinguishing this from related tools like list_categories and list_templates. Includes examples of tags and specifies the scope ('across templates').

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 advises to use this tool to discover tags, then call list_templates and filter manually because the API does not support filtering by tag. Provides a clear workflow.

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. Note: filtering by tags is not supported by the Carbone API — use list_tags to discover tags, then filter results manually. 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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoFilter by Template ID (64-bit format). Cannot be a Version ID.
limitNoMaximum number of results to return, between 1 and 100. 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, 3 = Odoo, 4 = HubSpot. Templates created through this MCP 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

ParametersJSON 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.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the safety profile is covered. The description adds genuinely valuable behavioral context beyond that: cursor-based pagination mechanics, the tags API limitation, and the critical edge case that templates uploaded with versioning disabled appear with id = null and must be addressed via versionId in tools like delete_template and download_template. No contradiction with annotations.

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?

Six sentences, front-loaded with the core purpose before any caveats. Each sentence carries a distinct fact—scope, filter dimensions, includeVersions behavior, pagination, tags limitation, and the null-id edge case—so there is no filler. Slightly long, but the two 'Note:' caveats convey non-obvious API behavior and earn their space.

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 an 8-parameter tool with zero required params, the description covers the essential decisions: which filters exist, how to paginate large collections, when to include versions, what the API cannot do (tag filtering), and how to identify versioning-disabled templates, including cross-tool remediation. An output schema exists, so return-value shape is covered elsewhere. The only minor gap is filter-combination semantics (e.g., whether search and category compose), which is left to inference.

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%, setting a baseline of 3. The description rises above that by aggregating the filter dimensions ('Filter by Template ID, Version ID, category, or upload origin'), giving usage guidance for includeVersions ('full version history of each template'), and framing limit/cursor as a strategy for large collections. It adds selection and combination context the schema's individual parameter docs do not.

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 opens with 'List stored Carbone templates with filtering, search, and pagination' — a specific verb, resource, and capability set. It clearly distinguishes itself from siblings like list_categories and list_tags by targeting templates specifically, and it elaborates the title's bare 'List Templates' with scope ('stored') and operations.

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 clear operational context: filters (Template ID, Version ID, category, origin), cursor pagination for large collections, and when to use includeVersions. It also provides an explicit exclusion—'filtering by tags is not supported by the Carbone API — use list_tags to discover tags, then filter results manually'—which routes the agent to the correct sibling. It doesn't systematically address all sibling alternatives, but the guidance is strong and actionable.

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

render_documentGenerate DocumentA
Read-onlyIdempotent
Inspect

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 (file path, URL, or base64) 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). Async mode: pass webhookUrl to render asynchronously — Carbone will POST the renderId to your URL when the document is ready. Async mode is required when using batch generation (batchSplitBy).

ParametersJSON Schema
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]}. 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.
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.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
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. 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).
templateNoInline 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.
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 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.
converterNoConverter 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.
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. 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)}".
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, asAttachment, and webhookUrl (async).
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 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".
batchOutputNoHow 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.
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 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
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 in stdio mode (path returned), or returned as an attachment in HTTP mode. Ignored when outputPath or returnLink is set.
batchSplitByNoJSON 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.
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.html#translations
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.html#formatc-precisionorformat-
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.
batchReportNameNoFilename 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.
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 512 characters. For webhook calls specifically, webhookHeaders.authorization (if set) overrides this value.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations only indicate read-only, open-world, and idempotent behavior, but the description adds substantial behavioral context: one-shot template upload stores nothing, async rendering POSTs renderId to a webhook, batch generation is always asynchronous, and returnLink is short-lived and one-time. It also discloses side effects like local file writing via outputPath and silent password-ignoring behavior of the ICE converter, all without contradicting 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 five sentences long, front-loaded with the core purpose and two modes, then lists capabilities and the async requirement. Every sentence adds distinct information with no redundancy or filler.

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 26 parameters and no output schema, the description covers the essential selection and invocation criteria: two modes, the async/batch relationship, and the main capability set. The exhaustive parameter descriptions in the schema fill in all remaining details, so nothing critical is missing for an agent to invoke the tool correctly.

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%, so the baseline is 3; the description doesn't add per-parameter specifics beyond the schema. It summarizes capability areas like conversion, multilingual rendering, currency conversion, and PDF options, but those are already elaborated in each parameter's description. No additional parameter semantics are needed.

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 action ('Generate a document') with an exact mechanism ('merging a Carbone template with JSON data'). It clearly distinguishes two operation modes (templateId vs template) and differentiates from upload_template by noting the one-shot mode stores no template. The title 'Generate Document' aligns perfectly with the described behavior.

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 explicitly says when to use templateId ('previously uploaded template') versus template ('without storing a template'), and names upload_template + templateId as the alternative for reusable templates. It also states that async mode is required for batch generation. However, it doesn't explicitly contrast with the sibling convert_document for pure format-conversion use cases.

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 MetadataB
Idempotent
Inspect

Update the metadata of a stored template: name, comment, category, tags, deployment timestamp, or expiration. Use deployedAt to activate a specific version for rendering. Use expireAt to schedule or trigger immediate deletion.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoMove 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.
nameNoNew display name.
tagsNoNew list of tags — replaces existing tags entirely.
commentNoNew free-text comment.
categoryNoNew category.
expireAtNoUnix timestamp (seconds) at which this template will be automatically deleted. Use 42000000000 to delete immediately.
deployedAtNoUnix 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).
templateIdYesTemplate 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.

TDQS

B3.2/5.0
Behavior2/5

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

The description is transparent about side effects, disclosing that expireAt 'can trigger immediate deletion' and that deployedAt affects which version Carbone renders. That said, these disclosures conflict with the annotations: destructiveHint=false, while the tool describes how to trigger immediate, permanent deletion of a template. The annotations signal 'safe, non-destructive update' while the description openly exercises a destructive path, forcing an agent to distrust one signal or the other.

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?

Three tight sentences with zero filler. The first sentence front-loads the metadata list and the next two highlight the two behaviorally significant fields. It earns a 4 rather than 5 because the 'deployment/expiration' phrasing under-sells the genuinely surprising bits (re-parenting, immediate deletion) that the description itself later references.

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

Completeness3/5

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

Given the medium complexity of an 8-parameter, 1-required tool with no output schema and no enums, the definition feels mostly complete: units, sentinels, and replace-vs-merge semantics are all covered. However, the description never surfaces the 'id' re-parenting parameter, and the capacity to delete or permanently alter version history is easy to miss. It's adequate for an agent that reads the schema—but that's the schema doing heavy lifting, not the description.

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 parameter descriptions are rich: they document the special 'NOW' value (42000000000), time units (Unix seconds), and the difference between Template ID and Version ID. The tool description adds only marginal cross-cutting value, reminding the reader that deployedAt 'activates' and expireAt schedules deletion, but most of this is restated in the schema. With the schema carrying the load, this is a solid baseline 3.

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?

The description states a clear verb+resource ('Update the metadata of a stored template') and enumerates the exact fields involved (name, comment, category, tags, deployment timestamp, expiration). The two follow-up imperative sentences about deployedAt and expireAt add behavior the field list alone wouldn't convey. It stops short of 5 because it doesn't explicitly distinguish itself from the sibling tools (e.g., upload_template, delete_template) and omits the re-parenting behavior of 'id' entirely.

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

Usage Guidelines3/5

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

The description gives explicit parameter-level directives ('Use deployedAt to activate a specific version for rendering. Use expireAt to schedule or trigger immediate deletion.') which guide one aspect of usage well. However, there is no guidance on when this tool should be preferred over template- or document-level alternatives, no exclusions, and no prerequisites mentioned.

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, with deployedAt controlling which version is active. Accepted formats: DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, HTML, XHTML, IDML, XML, Markdown, PDF, and more.

ParametersJSON Schema
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.
nameYesDisplay name for the template (e.g. "Invoice Template", "NDA Contract").
tagsNoTags for searchability and filtering (e.g. ["sales", "billing", "v2"]).
sampleNoSample input data attached to the template for testing in Carbone Studio. Each item must include data, complement, translations, and enum objects.
commentNoFree-text comment to describe the template version or its purpose.
categoryNoGroup templates into folders/categories (e.g. "invoices", "legal", "hr").
expireAtNoUTC Unix timestamp (seconds) at which this template will be automatically deleted. Use 42000000000 to delete immediately (special "NOW" sentinel value).
templateYesThe 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
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).
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).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoStable Template ID (when versioning is enabled).
nameYesTemplate display name.
sizeNoTemplate size in bytes.
typeNoDetected template file type.
versionIdNoVersion ID (SHA-256) of this uploaded version.
templateIdNoTemplate ID returned in legacy/non-versioned mode.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations declare readOnlyHint false and idempotentHint false, indicating a mutating, non-idempotent operation. The description adds behavioral context by explaining versioning behavior (multiple versions under a single ID, deployedAt controls active version) and the accepted formats. This goes beyond the schema's parameter descriptions and adds value for invocation.

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 two concise sentences that front-load the core purpose and workflow, then add versioning and format details without redundancy. Every sentence adds distinct information, making it efficient and well-structured.

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?

Given the rich schema with 100% coverage and an output schema, the description covers the essential workflow and versioning concept. It could mention the three accepted input forms (file path, URL, base64) but those are detailed in the schema's template parameter. Overall, nothing critical is missing for an agent to use the tool correctly.

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%, so baseline is 3. The description itself does not elaborate on parameters beyond what the schema provides; it mentions versioning and formats already covered in schema property descriptions. No extra semantic details are provided in the description itself.

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 clearly states the tool uploads and stores a reusable Carbone template, and distinguishes it from render_document by specifying that the returned Template ID is used for rendering. It also mentions versioning, which sets it apart from metadata-only tools like update_template_metadata. The verb and resource are specific and unambiguous.

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 provides explicit workflow guidance: 'Once uploaded, use render_document with the returned Template ID.' It also hints at versioning usage with deployedAt controlling active version. However, it does not explicitly contrast with alternatives like list_templates or update_template_metadata, so it lacks full when-not guidance.

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. 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"
  2. 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"
        -]
  3. 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"
        +}
  4. 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.2/5.0

Scored across 11 tools

Disambiguation4/5

Most tools have clearly distinct purposes: template CRUD, rendering, conversion, and API introspection are well separated. The only potential ambiguity is between convert_document and render_document, but their descriptions strongly differentiate template-preserving conversion from data-injection rendering.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern: list_templates, upload_template, render_document, get_api_status, etc. This makes the tool surface predictable and easy to navigate.

Tool Count5/5

11 tools is well-scoped for a document templating and rendering service: template CRUD, listing/management, conversion, rendering, and discovery/status each have a place. No redundancy or bloat.

Completeness5/5

The surface covers template CRUD (upload, list, download, delete, update metadata), rendering, conversion, category/tag discovery, and API health. This is comprehensive for Carbone's core workflows; no obvious dead ends.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers