Connects Claude to Carbone's document generation and conversion API. Exposes tools to convert between 100+ formats (PDF, DOCX, XLSX, HTML, Markdown, images), render documents from templates using JSON data injection, and manage a template library with versioning and categories. Includes batch generation, PDF watermarking, form filling, and localization support. Works via stdio (Claude Desktop, Cursor, VS Code) or streamable HTTP at mcp.carbone.io. Requires a Carbone API key for the cloud service, or point it at your own on-premise instance. Useful when you need Claude to produce finished documents, invoices, or reports rather than just draft text.
claude mcp add --transport http carbone-mcp https://mcp.carbone.ioRun in your terminal. Add --scope user to make it available in every project.
Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.
Verified live against the running server on Jun 10, 2026.
list_templatesList 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...8 paramsList 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...
idstringlimitintegercursorstringoriginintegersearchstringcategorystringversionIdstringincludeVersionsbooleanconvert_documentConvert any document to another format without storing a template. Supports 100+ input/output format combinations: Office documents, PDFs, images, web pages, spreadsheets, and more. The source file can be a local path, a URL, or a base64 string. Use render_document instead whe...3 paramsConvert any document to another format without storing a template. Supports 100+ input/output format combinations: Office documents, PDFs, images, web pages, spreadsheets, and more. The source file can be a local path, a URL, or a base64 string. Use render_document instead whe...
file*stringconvertTo*valueconverterstringL · C · Orender_documentGenerate 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 con...21 paramsGenerate 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 con...
data*objectenumobjectlangstringtemplatestringtimezonestringconvertTovalueconverterstringL · C · OcomplementobjectreportNamestringtemplateIdstringwebhookUrlstringbatchOutputstringhardRefreshbooleanvariableStrstringbatchSplitBystringtranslationsobjectcurrencyRatesobjectcurrencySourcestringcurrencyTargetstringwebhookHeadersobjectbatchReportNamestringlist_categoriesList 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.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.
No parameters — call it with no arguments.
list_tagsList 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 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...
No parameters — call it with no arguments.
upload_templateUpload 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....10 paramsUpload 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....
idstringname*stringtagsarraysamplearraycommentstringcategorystringexpireAtintegertemplate*stringdeployedAtintegerversioningbooleanupdate_template_metadataUpdate 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.7 paramsUpdate 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.
namestringtagsarraycommentstringcategorystringexpireAtintegerdeployedAtintegertemplateId*stringdelete_templateDelete 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 sch...1 paramsDelete 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 sch...
templateId*stringdownload_templateDownload 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 v...1 paramsDownload 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 v...
templateId*stringget_api_statusCheck 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.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.
No parameters — call it with no arguments.
get_capabilitiesReturns 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.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.
No parameters — call it with no arguments.
Official Carbone MCP server — Turn AI assistants into document automation experts. Generate professional PDFs, invoices, reports, and more using natural language.
Give Claude, ChatGPT, and other AI assistants the power to:
{d.field} tagsGet your free API key at account.carbone.io.
All stdio-compatible MCP clients use the same config:
{
"mcpServers": {
"carbone": {
"command": "npx",
"args": ["-y", "carbone-mcp"],
"env": {
"CARBONE_API_KEY": "your_api_key_here"
}
}
}
}
| Client | Config file |
|---|---|
| Claude Desktop (macOS) | ~/Library/Application Support/Claude/claude_desktop_config.json |
| Claude Desktop (Windows) | %APPDATA%\Claude\claude_desktop_config.json |
| Cursor (global) | ~/.cursor/mcp.json |
| Cursor (project) | .cursor/mcp.json |
| Claude Code | claude mcp add carbone-mcp -e CARBONE_API_KEY=your_key -- npx -y carbone-mcp |
VS Code uses
{ "mcp": { "servers": { ... } } }instead of{ "mcpServers": { ... } }— the inner config block is identical.
After adding the config, restart your client and try: "What can Carbone do?"
Connect directly to the hosted endpoint. Supported by VS Code, Cursor, Claude Code, and other clients that support streamable HTTP transport.
{
"mcp": {
"servers": {
"carbone": {
"type": "streamable-http",
"url": "https://mcp.carbone.io",
"headers": {
"Authorization": "Bearer your_api_key_here"
}
}
}
}
}
Authentication: The HTTP endpoint currently requires a Carbone API key passed as a Bearer token in the
Authorizationheader. OAuth2 support (for Claude Desktop, Mistral, ChatGPT, Gemini, and other clients) is planned for a future release.Cursor uses
{ "mcpServers": { ... } }instead of{ "mcp": { "servers": { ... } } }— the inner config block is identical.Claude Desktop does not support HTTP Bearer token authentication — use the stdio option above instead.
docker run -d -p 3000:3000 \
-e MCP_TRANSPORT=http \
-e CARBONE_API_KEY=your_api_key_here \
carbone/carbone-mcp
Connect your MCP client to http://your-host:3000 using the HTTP config above (replace the URL).
Docker Compose — see compose.yml:
CARBONE_API_KEY=your_key docker compose up -d
Claude Desktop with Docker (stdio) — Claude Desktop does not support HTTP transport; use the stdio mode instead:
{
"mcpServers": {
"carbone": {
"command": "docker",
"args": ["run", "-i", "--rm",
"-e", "CARBONE_API_KEY=your_api_key_here",
"-e", "MCP_TRANSPORT=stdio",
"carbone/carbone-mcp"]
}
}
}
If you run Carbone on-premise, point the MCP server at your instance — no API key required:
# 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
Required (stdio mode, cloud API):
CARBONE_API_KEY — Your Carbone API key (get one free →). Not required when CARBONE_BASE_URL points to your own on-premise server, or when running in HTTP mode (clients supply their own key via Authorization: Bearer).| Variable | Default | Description |
|---|---|---|
CARBONE_BASE_URL | https://api.carbone.io | Override for self-hosted or staging environments. When set to a custom URL, CARBONE_API_KEY is not required. |
CARBONE_TIMEOUT | 60000 | Request timeout in milliseconds (max: 60000) |
CARBONE_MAX_FILE_BYTES | 104857600 | Maximum size (bytes) for a resolved input file — path, URL, or base64 (100 MB default) |
MCP_TRANSPORT | stdio | Transport mode: stdio (default, for AI clients) or http (for self-hosted deployments) |
MCP_PORT | 3000 | HTTP server port (only used when MCP_TRANSPORT=http) |
MCP_PATH | / | HTTP endpoint path (only used when MCP_TRANSPORT=http) |
MCP_MAX_BODY_BYTES | 62914560 | Maximum request body size in bytes (60 MB default, matching Carbone Cloud limit) |
CARBONE_REQUIRE_CLIENT_AUTH_HEADER | false | HTTP mode only — reject requests without a Bearer key instead of falling back to the server-level CARBONE_API_KEY (multi-tenant safety) |
| Tool | Description | Docs |
|---|---|---|
convert_document | Convert documents between 100+ formats without storing a template | → |
render_document | Generate documents from templates by merging with JSON data | → |
| Tool | Description | Docs |
|---|---|---|
list_templates | Browse your template library with filtering by category or search (tags are returned per template but not filterable server-side) | → |
list_categories | List all template categories in your account | → |
list_tags | List all tags used across your templates | → |
upload_template | Store reusable templates with versioning, categorization, and metadata | → |
update_template_metadata | Rename, categorize, tag, deploy, or expire template versions | → |
delete_template | Soft-delete templates (marked for removal, gone after ~24h) | → |
download_template | Download original template files (DOCX, XLSX, PDF, etc.) | → |
| Tool | Description | Docs |
|---|---|---|
get_api_status | Check Carbone API health and current version | |
get_capabilities | View all supported formats, features, and examples |
📖 Full API Reference → — Detailed parameters, schemas, and examples
By default, a generated or converted file is returned based on its type and transport:
| Output | stdio (local clients) | HTTP (remote / self-hosted) |
|---|---|---|
| Text — HTML, TXT, CSV, MD, XML | inline text | inline text |
| Inline images — PNG, JPG, GIF, WEBP | inline image | inline image |
| Everything else — PDF, Office, ZIP, SVG… | saved to a temp file, path returned | returned as a download attachment |
Three optional parameters on convert_document and render_document (and outputPath / asAttachment on download_template) override this:
| Parameter | Effect |
|---|---|
outputPath | stdio only — save the output to this local path instead of returning it inline (rejected in HTTP mode) |
asAttachment | return the bytes as a downloadable attachment for any format, instead of inline |
returnLink | return Carbone's public one-time download URL instead of the file — short-lived and consumed by the first download, so hand it to the user rather than fetching it yourself (works in stdio and HTTP) |
Claude Desktop: it cannot render inline binary attachments (it mishandles them as images). For PDFs and Office files, rely on the default stdio temp-file path, or use
returnLinkto get a download 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"
"Rasterize this PDF to PNG images — one per page"
"Generate an invoice using template T123 with: {customer: 'Acme Corp', total: 1500, items: [...]}"
"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"
"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"
Test and debug the server interactively:
npx @modelcontextprotocol/inspector npx carbone-mcp
Or from a local build:
npx @modelcontextprotocol/inspector node dist/index.js
Open http://localhost:5173 to view all tools, test calls, and inspect request/response JSON — no AI inference needed.
# macOS — Claude Desktop logs
tail -f ~/Library/Logs/Claude/mcp*.log
# Windows
Get-Content "$env:APPDATA\Claude\logs\mcp*.log" -Wait -Tail 50
Look for:
Carbone MCP Server v1.x.x started (stdio)When running in HTTP mode, the server exposes a health endpoint:
curl http://localhost:3000/health
{
"mcp": { "version": "1.2.2" },
"carbone": { "version": "5.x.x" }
}
The carbone field shows backend connectivity:
{ "version": "..." } — reachable and authenticated{ "error": "unauthorized", "message": "..." } — reachable but no/invalid API key{ "error": "unreachable", "message": "..." } — network error, timeout, or unexpected response⚠️ Prompt Injection Connecting an AI assistant to any external service carries inherent risks. A malicious document or template could contain instructions that trick the AI into performing unintended actions (e.g. exfiltrating data, deleting templates). Always review what your AI client is about to do before confirming tool calls.
⚠️ API Key Protection
CARBONE_API_KEY to version control⚠️ Template Safety
⚠️ Data Privacy
CARBONE_BASE_URL to point to a self-hosted instance for maximum controlDesign templates in Word, Excel, LibreOffice, or HTML with {d.field} tags:
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]}
Guides & best practices:
| Category | Formats |
|---|---|
| Documents | PDF, DOCX, XLSX, PPTX, ODT, ODS, ODP, ODG, RTF, EPUB |
| Images | PNG, JPG, WEBP, SVG, TIFF, BMP, GIF |
| Web / Text | HTML, TXT, CSV, MD, XML |
Full conversion matrix: carbone.io/documentation
We welcome contributions:
See CONTRIBUTING.md for guidelines.
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 — see LICENSE
CARBONE_API_KEY*secretYour Carbone API key from https://account.carbone.io. Required when using the Carbone cloud API. If CARBONE_BASE_URL points to an on-premise server, authentication is not required and this can be left empty.
CARBONE_BASE_URLdefault: https://api.carbone.ioCustom Carbone API base URL for on-premise deployments. Defaults to https://api.carbone.io. When set to a custom URL, CARBONE_API_KEY is not required.
csoai-org/pdf-document-mcp
xt765/mcp-document-converter
io.github.xjtlumedia/markdown-formatter
io.github.ai-aviate/better-notion
suekou/mcp-notion-server
meterlong/mcp-doc