Dynamic Document API
Server Details
PDFs, images and e-invoices (XRechnung, ZUGFeRD) from templates and JSON, rendered in the EU.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 9 tools
The four render tools are cleanly separated by source (template, html, markdown, image), and get_render/list_templates/get_template_schema/merge_pdfs each have distinct roles. The only real overlap is between create_einvoice and render_pdf_from_template's `einvoice` parameter, but the descriptions explicitly cross-reference and clarify the choice.
All names use consistent snake_case with a clear verb_noun or verb_noun_prep_noun pattern (render_pdf_from_html, render_pdf_from_markdown, create_einvoice, list_templates, get_render). The render family forms a predictable, parallel set.
Nine tools is well-scoped for a document rendering API, with each tool covering a distinct capability (three PDF sources, images, e-invoice, merge, discovery, schema, status). No redundancy or filler.
The surface covers the full render lifecycle: template discovery, schema inspection, rendering across formats, e-invoice generation, merging, and async status retrieval via get_render. Minor gaps exist around template/asset management (create/update/delete templates) and render deletion, but these may be out of scope for a rendering-focused API.
Available Tools
9 toolscreate_einvoiceCreate an e-invoice XML (XRechnung, EN 16931, Factur-X / ZUGFeRD)AInspect
Generate a standalone, validated e-invoice XML file from invoice data — e.g. an XRechnung for a German public-sector buyer, or an EN 16931 invoice for a Peppol network. To embed the invoice in a PDF instead, use render_pdf_from_template with einvoice. Returns a signed download URL for the XML (valid for expires_in, default 1 h) and the validator's verdict in conformance.einvoice.status (passed | failed | unavailable). If the data breaks a rule of the profile, the call fails and lists every problem with its field path: fix those fields and call again. This connection's test API key makes every render a free test render: test renders carry a TEST note in the XML (MINIMUM has no field for it) and are limited per minute by plan. Limited to 60 tool calls a minute per connection, shared by all tools.
| Name | Required | Description | Default |
|---|---|---|---|
| test | No | Test mode. Test renders are free and carry a TEST watermark. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for the final document, which is billed. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test renders, a live key always final ones (`true` is refused). | |
| syntax | No | XML syntax: `cii` (UN/CEFACT Cross Industry Invoice, the default, every profile) or `ubl` (UBL 2.1, only EN16931 and XRECHNUNG). Use `ubl` when the recipient asks for UBL, e.g. many Peppol access points. | |
| invoice | Yes | The invoice as EN 16931 fields in snake_case. Required: `number`, `issue_date` (YYYY-MM-DD), `currency` (ISO 4217, e.g. EUR), `seller` and `buyer` {name, address {line1, city, postcode, country (ISO 3166 alpha-2)}}, `lines` [{quantity, price {net}, tax {category, rate}, item {name}}]. Often needed: `due_date`, `buyer_reference`, `payment_terms`, `type_code` (380 invoice, 381 credit note), `seller.vat_id`, `electronic_address` {id, scheme: EM for e-mail, 0204 for a Leitweg-ID}, `payment` {means_code: "58" SEPA credit transfer, credit_transfers [{account_id: IBAN}]}, line `unit` (C62 piece, HUR hour, DAY day), `invoice_period` {start, end}. VAT categories: S standard, Z zero-rated, E exempt, AE reverse charge, K intra-EU supply, G export, O not subject to VAT (E, AE, K, G and O need `vat_exemptions` {<category>: {reason}}). Amounts are decimal strings such as "95.00". Do NOT send totals, VAT amounts or line net amounts: they are computed from the lines. | |
| profile | Yes | E-invoice profile. XRECHNUNG: German public-sector buyers — needs `buyer_reference` (the Leitweg-ID), seller `contact` {name, phone, email}, seller and buyer `electronic_address`, and `payment`. EN16931: the full European standard. Factur-X / ZUGFeRD levels: MINIMUM and BASIC_WL (line items are not transmitted), BASIC, EXTENDED. | |
| filename | No | Output filename; `.xml` is enforced. Default: the invoice number. | |
| metadata | No | Your own key/value pairs stored on the render (max 50 keys, values <= 500 chars). | |
| reference | No | Your own identifier for this render; filterable later via the renders list. | |
| expires_in | No | Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime. |
Output Schema
| Name | Required | Description |
|---|---|---|
| test | Yes | A free test render, marked TEST; false for a final, billed one. |
| error | No | Why the render failed (`status: failed`). |
| files | Yes | The output files, usually one. |
| pages | No | Page count of the PDF. |
| status | Yes | `succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone. |
| warnings | No | Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user. |
| reference | No | The `reference` the call passed. |
| render_id | Yes | Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source. |
| created_at | No | |
| conformance | No | |
| completed_at | No | |
| output_format | No | |
| billed_renders | No | Renders billed for this render: 0 for test and failed ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, idempotentHint=false and openWorldHint=true, which covers the safety profile. The description adds real value beyond that: a signed download URL with a lifetime tied to `expires_in`, the validator verdict location `conformance.einvoice.status`, per-minute rate limits, and the test-key override of the `test` flag. Given annotations carry the write/open-world semantics, a 3 understates how much the description adds, but the bar is lower with annotations present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the action and the alternative, then failure behavior, then test/rate-limit caveats. It is long, but nearly every sentence carries distinct information an agent needs; the trailing rate-limit note is slightly tangental but still operationally relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex, nested-payload mutation tool the description covers the failure mode, validation verdict, output artifact and its lifetime, and the test/final billing distinction. The output schema already exists, so omitting deeper return-value detail is appropriate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including `invoice`, `profile`, `syntax`, `test`, `metadata`, `reference` and `expires_in` is already documented in the schema with examples and enums. The description echoes only a little of this (`expires_in` default of 1 h), so the baseline of 3 is correct — the schema, not the description, does the parameter work here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and artifact ('Generate a standalone, validated e-invoice XML file from invoice data') and names the concrete profiles it targets. It also distinguishes itself from `render_pdf_from_template`, so an agent can route between XML generation and PDF embedding without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the alternative case ('To embed the invoice in a PDF instead, use `render_pdf_from_template` with `einvoice`') and explains the recovery path on validation failure ('fix those fields and call again'). The test-vs-final key behavior and per-minute limits give the agent the operational context needed before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_renderGet a renderARead-onlyIdempotentInspect
Fetch one render of the connected workspace by id: its status, files with freshly signed download URLs, billed_renders and the conformance report. Use it when a render tool returned queued or processing (call again every few seconds until succeeded or failed), or when a download link has expired. Not needed after a render tool already returned succeeded with its files. New URLs last the render's expires_in again, until the plan's file retention ends; after that the render is expired and its files have no URL. Not billed. Limited to 60 tool calls a minute per connection, shared by all tools.
| Name | Required | Description | Default |
|---|---|---|---|
| render_id | Yes | Render id from a render tool's result, e.g. `rnd_01J9ZM…`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| test | Yes | A free test render, marked TEST; false for a final, billed one. |
| error | No | Why the render failed (`status: failed`). |
| files | Yes | The output files, usually one. |
| pages | No | Page count of the PDF. |
| status | Yes | `succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone. |
| warnings | No | Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user. |
| reference | No | The `reference` the call passed. |
| render_id | Yes | Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source. |
| created_at | No | |
| conformance | No | |
| completed_at | No | |
| output_format | No | |
| billed_renders | No | Renders billed for this render: 0 for test and failed ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent safety profile, but the description adds crucial non-obvious behavior: it is not billed, it carries a 60-calls-per-minute shared rate limit, URLs are freshly signed and last expires_in until retention ends, after which the render becomes expired with no URL. This is exactly the context annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then expiry semantics and limits in a logical order; every sentence carries information. It is on the long side for a one-parameter tool, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be re-explained, and the description still covers lifecycle semantics (queued/processing/succeeded/failed/expired), URL lifetime, cost, and rate limits. An agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single render_id parameter already documents its expected form (`rnd_01J9ZM…`). The description explains where the id comes from ('from a render tool's result'), which is minor added value, but the baseline of 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch one render ... by id') and enumerates what comes back (status, files with signed URLs, billed_renders, conformance report). It is unambiguous against siblings like render_pdf_from_html, which create renders rather than retrieve one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when a render tool returned queued or processing', or an expired download link), when-not ('Not needed after a render tool already returned succeeded'), and even the polling cadence ('call again every few seconds until succeeded or failed'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_template_schemaGet a template's data schemaARead-onlyIdempotentInspect
Get the data a template expects before rendering it: its JSON Schema, every field as a dotted path with type and required flag, an image template's dynamic properties, an example payload and einvoice_default (the template's default ZUGFeRD / Factur-X e-invoice, or null). Call it once per template, after list_templates or with an id the user gave, and build data from fields and example_data: render_pdf_from_template and render_image_from_template reject data that breaks the schema. render_pdf_from_html and render_pdf_from_markdown take no template and need no schema. When einvoice_default is set, every PDF render embeds that e-invoice, so data must also hold the invoice object at its invoice_path (on Free and Starter it is skipped with the warning einvoice_skipped_plan); render_pdf_from_template can replace it or turn it off. Not billed. Limited to 60 tool calls a minute per connection, shared by all tools.
| Name | Required | Description | Default |
|---|---|---|---|
| template_id | Yes | Template id from `list_templates`, e.g. `tpl_01J9ZK…`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fields | Yes | Every field of the schema, flattened. |
| schema | No | The JSON Schema of `data`. |
| version | No | The template version the schema belongs to. |
| declared | No | False when the schema was inferred from the template source rather than declared. |
| template_id | Yes | |
| example_data | No | A `data` payload that matches the schema, to fill in. |
| einvoice_default | No | The template's default e-invoice, or null. When set, every PDF render embeds a ZUGFeRD / Factur-X e-invoice read from `data` at `invoice_path`, unless the render passes `einvoice` (replace) or `einvoice: null` (plain PDF). |
| dynamic_properties | Yes | What `data` can set on an image (`image_canvas`) template; empty for PDF templates. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the readOnly/idempotent annotations: discloses billing status ('Not billed'), a concrete rate limit ('60 tool calls a minute per connection, shared by all tools'), the einvoice side effect on every PDF render, and the plan-gated `einvoice_skipped_plan` warning. This is behavior an agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and tightly packed, with each sentence carrying distinct information (dependencies, e-invoice behavior, rate limit). The einvoice_default sentence is long and condition-heavy, which is the only mild drag on readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, yet the description still frames what the returned `data` is for and how to build a valid render payload, plus prerequisites, rate limits, and plan constraints. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines `template_id` and its format. The description still adds usable sourcing guidance ('an id the user gave', implicitly from `list_templates`), which is slight but genuine added meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ('Get the `data` a template expects before rendering it') and enumerates exactly what comes back: JSON Schema, dotted-path fields with type/required, image dynamic properties, example payload, and `einvoice_default`. This clearly separates it from sibling renderers and from `list_templates`.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Call it once per template, after `list_templates` or with an id the user gave') and explicit when-not ('`render_pdf_from_html` and `render_pdf_from_markdown` take no template and need no schema'). The downstream consumers (`render_pdf_from_template`, `render_image_from_template`) and the consequence of skipping it (data rejected) are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesList Dynamic Document API templatesARead-onlyIdempotentInspect
List the published templates of the connected workspace: id, name, type and live version. Use it to find the template_id for a document the user describes; skip it when you already have the id. PDF templates (pdf_code, pdf_markdown) go to render_pdf_from_template, image templates (image_canvas) to render_image_from_template; call get_template_schema next for the data a template expects. Returns 50 templates per page unless limit says otherwise; pass next_cursor as cursor while has_more. Not billed. Limited to 60 tool calls a minute per connection, shared by all tools.
| Name | Required | Description | Default |
|---|---|---|---|
| type | No | Only return templates of this type, e.g. `image_canvas` for image templates. | |
| limit | No | Page size, 1-100 (default 50). | |
| query | No | Part of a template name, case-insensitive. | |
| cursor | No | `next_cursor` of the previous page. |
Output Schema
| Name | Required | Description |
|---|---|---|
| has_more | Yes | More templates match: call again with `cursor: next_cursor`. |
| templates | Yes | |
| next_cursor | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only declare it as a safe, idempotent read), the description adds pagination behavior (50 per page, next_cursor/has_more contract), the billing status ('Not billed'), and a concrete rate limit shared across all tools. These are operational facts an agent cannot derive from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Information-dense and front-loaded: purpose, usage, routing, pagination, then cost/limits. Every clause carries distinct operational information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation; the description covers everything else an agent needs — discovery role, sibling routing, pagination loop, and throttling — for a 4-parameter read tool with an enum filter.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and self-documenting, but the description still adds value by restating the 50-item default and explaining the cursor contract ('pass next_cursor as cursor while has_more'), which links the request parameter to the response field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the published templates of the connected workspace') and enumerates the returned fields (id, name, type, live version). This clearly separates it from the render_* and get_template_schema siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('find the template_id for a document the user describes'), explicit when-not ('skip it when you already have the id'), and routes by template type to render_pdf_from_template or render_image_from_template, plus names get_template_schema as the logical next call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
merge_pdfsMerge PDFsAInspect
Merge 2-200 existing PDFs into one PDF, in the order given, with a bookmark per source unless bookmarks is none. Use it to combine documents (e.g. a cover letter and an invoice from earlier renders) or PDFs at public URLs. It renders nothing itself: render each part first, then pass its render_id. The sources stay unchanged. Waits up to 25 s, then returns the files with signed download URLs valid for expires_in (default 1 h). A slower render comes back queued or processing: get_render collects it, and re-signs expired links. This connection's test API key makes every render a free test render: test renders carry a TEST watermark and are limited per minute by plan. Limited to 60 tool calls a minute per connection, shared by all tools.
| Name | Required | Description | Default |
|---|---|---|---|
| test | No | Test mode. Test renders are free and carry a TEST watermark. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for the final document, which is billed. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test renders, a live key always final ones (`true` is refused). | |
| sources | Yes | The PDFs to merge, in order. | |
| filename | No | Output filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`. | |
| metadata | No | Your own key/value pairs stored on the render (max 50 keys, values <= 500 chars). | |
| bookmarks | No | `filenames` (default): a top-level bookmark per source, named after its file; `none`: no bookmarks. | |
| reference | No | Your own identifier for this render; filterable later via the renders list. | |
| expires_in | No | Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime. |
Output Schema
| Name | Required | Description |
|---|---|---|
| test | Yes | A free test render, marked TEST; false for a final, billed one. |
| error | No | Why the render failed (`status: failed`). |
| files | Yes | The output files, usually one. |
| pages | No | Page count of the PDF. |
| status | Yes | `succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone. |
| warnings | No | Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user. |
| reference | No | The `reference` the call passed. |
| render_id | Yes | Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source. |
| created_at | No | |
| conformance | No | |
| completed_at | No | |
| output_format | No | |
| billed_renders | No | Renders billed for this render: 0 for test and failed ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations only declaring readOnly=false/destructive=false/openWorld=true, the description carries real behavioral load: sources stay unchanged, a 25 s wait ceiling before returning queued/processing, signed download URLs tied to expires_in, TEST watermark and per-minute test-render limits, and a 60 calls/min connection-wide rate limit. This is context an agent cannot get from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose, ordering, and bookmark behavior are front-loaded, and each subsequent sentence adds a distinct operational fact. It is on the long side — the rate-limit and test-key details could be compressed — but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nested-source, high-parameter tool with an output schema, the description covers the prerequisite chain, ordering, async fallback, link lifetime, and quota constraints. Nothing an agent needs in order to invoke it correctly is missing, and return-value details are appropriately left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema does not: sources are consumed 'in the order given', render_id references an earlier render's stored files, bookmarks defaults to a per-source bookmark, and expires_in defaults to one hour. These tie the parameters into an actual workflow rather than restating field docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb (merge), resource (existing PDFs), cardinality (2-200), ordering guarantee, and the bookmark default. It also explicitly distinguishes itself from the render_* siblings with 'It renders nothing itself', so an agent can tell what this tool is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names concrete use cases (combining a cover letter and an invoice from earlier renders, or public-URL PDFs) and states the prerequisite workflow: render each part first, then pass its render_id. It also routes the agent to get_render when the result is queued or processing, and to re-sign expired links.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_image_from_templateRender an image from a templateAInspect
Render a PNG, JPEG or WebP image from a saved image template (image_canvas) plus data: social and Open Graph images, banners, badges. Find the template with list_templates (type: image_canvas) and what it lets you set with get_template_schema (its dynamic properties), then pass those in data as dotted keys such as title.text or hero.src (an image URL). For a PDF, use render_pdf_from_template. Waits up to 25 s, then returns the files with signed download URLs valid for expires_in (default 1 h). A slower render comes back queued or processing: get_render collects it, and re-signs expired links. This connection's test API key makes every render a free test render: test renders carry a TEST watermark and are limited per minute by plan. Limited to 60 tool calls a minute per connection, shared by all tools.
| Name | Required | Description | Default |
|---|---|---|---|
| data | No | Template data as JSON. Canvas/image templates accept dotted keys (`title.text`, `hero.src`) or the equivalent nested objects. Call `get_template_schema` first to learn the shape. | |
| test | No | Test mode. Test renders are free and carry a TEST watermark. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for the final document, which is billed. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test renders, a live key always final ones (`true` is refused). | |
| image | No | Image output options. | |
| format | No | Output format (default png). | |
| version | No | Template version: `live` (default), `draft` (test keys only) or a version number. | |
| filename | No | Output filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`. | |
| metadata | No | Your own key/value pairs stored on the render (max 50 keys, values <= 500 chars). | |
| reference | No | Your own identifier for this render; filterable later via the renders list. | |
| expires_in | No | Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime. | |
| template_id | Yes | Image template id from `list_templates`, e.g. `tpl_01J9ZK…`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| test | Yes | A free test render, marked TEST; false for a final, billed one. |
| error | No | Why the render failed (`status: failed`). |
| files | Yes | The output files, usually one. |
| pages | No | Page count of the PDF. |
| status | Yes | `succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone. |
| warnings | No | Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user. |
| reference | No | The `reference` the call passed. |
| render_id | Yes | Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source. |
| created_at | No | |
| conformance | No | |
| completed_at | No | |
| output_format | No | |
| billed_renders | No | Renders billed for this render: 0 for test and failed ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far exceeds the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false, destructiveHint=false), which only signal a non-idempotent, non-destructive, open-world write. The description adds the 25 s synchronous wait, the queued/processing fallback and how get_render resolves it, signed-URL lifetime tied to expires_in, TEST watermark behavior for test keys, and a 60 calls/min per-connection rate limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads what the tool does, then workflow, then alternative, then timing/async/test/rate-limit behavior. Every sentence carries operational information, though the final third is dense and packs async, test-mode, and rate-limit facts into one paragraph that is harder to scan than the opening.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with an output schema, the description is complete: it covers prerequisites, data shape, format scope, async handling, URL lifetime, and quota limits. Return-value detail can correctly be delegated to the output schema, and nothing needed to invoke it successfully is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds concrete semantic framing for data (dotted keys like title.text and hero.src with an image URL) and explains expires_in's default and re-signing behavior. The remaining parameters (image, format, version, filename, metadata, reference) are left entirely to the schema, so it stops short of a full 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (render an image from a saved image template) and enumerates concrete use cases (social/OG images, banners, badges). It explicitly names the sibling it is not (render_pdf_from_template for PDF), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite chain: find the template via list_templates (type: image_canvas), learn its settable properties via get_template_schema, then pass them in data. It also gives explicit alternatives for adjacent needs (render_pdf_from_template for PDF, get_render for slow renders) and states when the async path applies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_pdf_from_htmlRender a PDF from HTMLAInspect
Render a PDF from HTML and CSS you write, in headless Chromium. Use it when no saved template fits and the layout matters: letters, styled tables, one-off documents. For a saved template use render_pdf_from_template; for a text report without layout work render_pdf_from_markdown is shorter. With data, the HTML is a Jinja template ({{ name }}, {% for row in rows %}). Remote images and fonts must be public URLs; load web fonts with tags in head. Waits up to 25 s, then returns the files with signed download URLs valid for expires_in (default 1 h). A slower render comes back queued or processing: get_render collects it, and re-signs expired links. This connection's test API key makes every render a free test render: test renders carry a TEST watermark and are limited per minute by plan. Limited to 60 tool calls a minute per connection, shared by all tools.
| Name | Required | Description | Default |
|---|---|---|---|
| css | No | CSS injected as a <style> block in <head>. | |
| No | PDF output options; these override the template's defaults. | ||
| data | No | Jinja variables for the HTML; when present, the HTML is rendered as a Jinja template first. | |
| head | No | Raw <head> contents (link/meta/script), appended after `css`. | |
| html | Yes | The HTML to render: a full document or just the <body> content. | |
| test | No | Test mode. Test renders are free and carry a TEST watermark. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for the final document, which is billed. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test renders, a live key always final ones (`true` is refused). | |
| filename | No | Output filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`. | |
| metadata | No | Your own key/value pairs stored on the render (max 50 keys, values <= 500 chars). | |
| reference | No | Your own identifier for this render; filterable later via the renders list. | |
| expires_in | No | Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime. |
Output Schema
| Name | Required | Description |
|---|---|---|
| test | Yes | A free test render, marked TEST; false for a final, billed one. |
| error | No | Why the render failed (`status: failed`). |
| files | Yes | The output files, usually one. |
| pages | No | Page count of the PDF. |
| status | Yes | `succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone. |
| warnings | No | Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user. |
| reference | No | The `reference` the call passed. |
| render_id | Yes | Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source. |
| created_at | No | |
| conformance | No | |
| completed_at | No | |
| output_format | No | |
| billed_renders | No | Renders billed for this render: 0 for test and failed ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, openWorldHint=true, idempotentHint=false): it discloses the 25s wait-then-return flow, the queued/processing async path and that get_render collects and re-signs expired links, that remote assets must be public URLs, that the test key yields watermarked test renders, and the shared 60 calls/min limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then routing, then mechanics — a sensible order with no filler sentences. It is dense and long, but each sentence carries distinct operational information rather than restating the name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, nested-schema tool with an output schema present, the description supplies everything the schema cannot: async handling, asset restrictions, auth/test-key semantics, and rate limits. Return-value details are correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds Jinja syntax examples (`{{ name }}`, `{% for row in rows %}`) that meaningfully help an agent construct the `data`/`html` inputs, and it restates the expires_in default and test-mode interplay. The many pdf sub-options (scale, margin, page_ranges) are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Render a PDF from HTML') and immediately scopes it as 'HTML and CSS you write, in headless Chromium.' It explicitly differentiates from siblings render_pdf_from_template and render_pdf_from_markdown, so an agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use condition ('when no saved template fits and the layout matters: letters, styled tables, one-off documents') plus two named alternatives with the condition selecting each. When-not guidance is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_pdf_from_markdownRender a PDF from MarkdownAInspect
Render a PDF from Markdown with a built-in theme: the quickest way to turn a report, summary or notes you have written into a clean document, with no layout work. Supports tables, task lists, footnotes and strikethrough; raw HTML is not rendered. For a designed layout use render_pdf_from_html, for a saved template render_pdf_from_template. Waits up to 25 s, then returns the files with signed download URLs valid for expires_in (default 1 h). A slower render comes back queued or processing: get_render collects it, and re-signs expired links. This connection's test API key makes every render a free test render: test renders carry a TEST watermark and are limited per minute by plan. Limited to 60 tool calls a minute per connection, shared by all tools.
| Name | Required | Description | Default |
|---|---|---|---|
| css | No | Extra CSS layered on top of the theme. | |
| No | PDF output options; these override the template's defaults. | ||
| data | No | Jinja variables for the Markdown, e.g. `{{ customer }}`. | |
| test | No | Test mode. Test renders are free and carry a TEST watermark. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for the final document, which is billed. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test renders, a live key always final ones (`true` is refused). | |
| theme | No | Built-in stylesheet (default `default`); `none` leaves only your `css`. | |
| filename | No | Output filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`. | |
| markdown | Yes | The Markdown source (GitHub-style tables, task lists and footnotes work). | |
| metadata | No | Your own key/value pairs stored on the render (max 50 keys, values <= 500 chars). | |
| reference | No | Your own identifier for this render; filterable later via the renders list. | |
| expires_in | No | Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime. |
Output Schema
| Name | Required | Description |
|---|---|---|
| test | Yes | A free test render, marked TEST; false for a final, billed one. |
| error | No | Why the render failed (`status: failed`). |
| files | Yes | The output files, usually one. |
| pages | No | Page count of the PDF. |
| status | Yes | `succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone. |
| warnings | No | Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user. |
| reference | No | The `reference` the call passed. |
| render_id | Yes | Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source. |
| created_at | No | |
| conformance | No | |
| completed_at | No | |
| output_format | No | |
| billed_renders | No | Renders billed for this render: 0 for test and failed ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations (readOnlyHint=false, openWorldHint=true) by disclosing the 25 s blocking window, the signed-URL return with expiry, the queued/processing async fallback and its collector tool, the TEST watermark and per-plan limiting when a test key is used, and the 60 calls/minute connection-wide rate limit. It also states a real content constraint (raw HTML not rendered), which is behavior an agent must know before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and then ordered by escalating need: capabilities, sibling routing, timing/return, async fallback, test-mode and rate limits. Dense but every sentence is operational. Slightly overstuffed in the test-key sentence, which repeats ground the `test` parameter description already covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter, open-world, potentially asynchronous renderer with an output schema, it covers the pieces an agent actually needs: which sibling to pick, how long it blocks, what comes back, what to do when it does not finish, and the quota/test constraints. Return-value detail is correctly left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns a step above by adding meaning the schema does not, notably that the Markdown source accepts tables/task lists/footnotes but excludes raw HTML, and that the theme is the built-in default path. It does not re-explain individual PDF options, which is appropriate given the schema already documents them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Render a PDF from Markdown') plus its built-in theming, and immediately names the two sibling renderers it is not (render_pdf_from_html, render_pdf_from_template). An agent can select this tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the concrete use case (report, summary, notes with no layout work) and explicit routing rules: designed layout -> render_pdf_from_html, saved template -> render_pdf_from_template. It also names get_render as the follow-up path for queued/processing renders, covering the alternative for the async case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_pdf_from_templateRender a PDF from a templateAInspect
Render a PDF from a saved template of the workspace plus JSON data. Use it when a template exists for the document (invoices, quotes, certificates, recurring reports); otherwise write the layout with render_pdf_from_html or turn text into a PDF with render_pdf_from_markdown, and use render_image_from_template for images. Take template_id from list_templates and the shape of data from get_template_schema; data that breaks the schema fails with each wrong field's path. Waits up to 25 s, then returns the files with signed download URLs valid for expires_in (default 1 h). A slower render comes back queued or processing: get_render collects it, and re-signs expired links. This connection's test API key makes every render a free test render: test renders carry a TEST watermark and are limited per minute by plan. Pass einvoice for a hybrid e-invoice PDF (Factur-X / ZUGFeRD / XRechnung) that accounting software can read. A template with einvoice_default (from get_template_schema) embeds a ZUGFeRD / Factur-X e-invoice in every PDF render, a hybrid PDF/A-3b, read from data at its invoice_path (missing: 400 validation_error at /data). einvoice replaces that default, einvoice: null turns it off for a plain PDF. On plans without e-invoicing (Free, Starter) it is skipped with the warning einvoice_skipped_plan: tell the user the e-invoice needs the Growth plan or higher. Limited to 60 tool calls a minute per connection, shared by all tools.
| Name | Required | Description | Default |
|---|---|---|---|
| No | PDF output options; these override the template's defaults. | ||
| data | No | Template data as JSON. Canvas/image templates accept dotted keys (`title.text`, `hero.src`) or the equivalent nested objects. Call `get_template_schema` first to learn the shape. | |
| test | No | Test mode. Test renders are free and carry a TEST watermark. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for the final document, which is billed. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test renders, a live key always final ones (`true` is refused). | |
| version | No | Template version: `live` (default), `draft` (test keys only) or a version number. | |
| einvoice | No | An e-invoice object embeds (or replaces the template's default) e-invoice; `null` turns the template's default e-invoice off for this render (a plain PDF); omit it to keep the template's default. | |
| filename | No | Output filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`. | |
| metadata | No | Your own key/value pairs stored on the render (max 50 keys, values <= 500 chars). | |
| reference | No | Your own identifier for this render; filterable later via the renders list. | |
| expires_in | No | Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime. | |
| template_id | Yes | Template id from `list_templates`, e.g. `tpl_01J9ZK…`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| test | Yes | A free test render, marked TEST; false for a final, billed one. |
| error | No | Why the render failed (`status: failed`). |
| files | Yes | The output files, usually one. |
| pages | No | Page count of the PDF. |
| status | Yes | `succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone. |
| warnings | No | Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user. |
| reference | No | The `reference` the call passed. |
| render_id | Yes | Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source. |
| created_at | No | |
| conformance | No | |
| completed_at | No | |
| output_format | No | |
| billed_renders | No | Renders billed for this render: 0 for test and failed ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare a non-read-only, open-world, non-idempotent operation, and the description layers on concrete behavior beyond them: a 25 s wait then queued/processing with get_render as the collector, signed URL lifetimes, TEST watermark semantics under a test key, plan-gated e-invoice skipping with a named warning, and a 60 calls/min connection limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads purpose and routing, then escalates into behavior, e-invoice rules, and limits. Almost every sentence carries operational content, but the e-invoice passage is dense enough that the section on the default-vs-override interplay could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 10 parameters, nested objects, and an output schema, the description covers routing, prerequisites, async collection, billing/watermark behavior, and the full e-invoice decision tree. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema itself is rich, so the baseline is 3; the description still adds cross-parameter meaning the schema cannot express — einvoice replaces the template's einvoice_default, einvoice:null turns it off, and a test API key overrides the test parameter. It does not, however, add format detail for the pdf option object or margins.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Render a PDF from a saved template of the workspace plus JSON data') and immediately distinguishes itself from render_pdf_from_html, render_pdf_from_markdown, and render_image_from_template by naming when each applies. An agent can route without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('when a template exists for the document') and when-not, with named alternatives for each case, plus the prerequisite tools list_templates and get_template_schema for the required inputs. No inference left to the agent.
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.
9 tool updates
- Changed
create_einvoice18 fields changed- changed
Input schema / properties / expires_in / descriptionPrevious value: -"Lifetime of the returned signed file URL, in seconds (default 3600)."New value: +"Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime." - added
Output schema / properties / billed_renders / descriptionAdded value: +"Renders billed for this render: 0 for test and failed ones." - added
Output schema / properties / error / descriptionAdded value: +"Why the render failed (`status: failed`)." - added
Output schema / properties / files / descriptionAdded value: +"The output files, usually one." - added
Output schema / properties / files / items / properties / bytes / descriptionAdded value: +"File size in bytes." - added
Output schema / properties / files / items / properties / format / descriptionAdded value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`." - added
Output schema / properties / files / items / properties / height / descriptionAdded value: +"Image height in pixels." - added
Output schema / properties / files / items / properties / id / descriptionAdded value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`." - added
Output schema / properties / files / items / properties / pages / descriptionAdded value: +"Page count of a PDF." - changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)." - added
Output schema / properties / files / items / properties / url_expires_at / descriptionAdded value: +"When `url` stops working (ISO 8601); `get_render` signs a new one." - added
Output schema / properties / files / items / properties / width / descriptionAdded value: +"Image width in pixels." - added
Output schema / properties / pages / descriptionAdded value: +"Page count of the PDF." - added
Output schema / properties / reference / descriptionAdded value: +"The `reference` the call passed." - added
Output schema / properties / render_id / descriptionAdded value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source." - added
Output schema / properties / status / descriptionAdded value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone." - added
Output schema / properties / test / descriptionAdded value: +"A free test render, marked TEST; false for a final, billed one." - added
Output schema / properties / warnings / descriptionAdded value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
- Changed
get_render18 fields changed- changed
Input schema / properties / render_id / descriptionPrevious value: -"Render id, e.g. `rnd_01J9ZM…`."New value: +"Render id from a render tool's result, e.g. `rnd_01J9ZM…`." - added
Output schema / properties / billed_renders / descriptionAdded value: +"Renders billed for this render: 0 for test and failed ones." - added
Output schema / properties / error / descriptionAdded value: +"Why the render failed (`status: failed`)." - added
Output schema / properties / files / descriptionAdded value: +"The output files, usually one." - added
Output schema / properties / files / items / properties / bytes / descriptionAdded value: +"File size in bytes." - added
Output schema / properties / files / items / properties / format / descriptionAdded value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`." - added
Output schema / properties / files / items / properties / height / descriptionAdded value: +"Image height in pixels." - added
Output schema / properties / files / items / properties / id / descriptionAdded value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`." - added
Output schema / properties / files / items / properties / pages / descriptionAdded value: +"Page count of a PDF." - changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)." - added
Output schema / properties / files / items / properties / url_expires_at / descriptionAdded value: +"When `url` stops working (ISO 8601); `get_render` signs a new one." - added
Output schema / properties / files / items / properties / width / descriptionAdded value: +"Image width in pixels." - added
Output schema / properties / pages / descriptionAdded value: +"Page count of the PDF." - added
Output schema / properties / reference / descriptionAdded value: +"The `reference` the call passed." - added
Output schema / properties / render_id / descriptionAdded value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source." - added
Output schema / properties / status / descriptionAdded value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone." - added
Output schema / properties / test / descriptionAdded value: +"A free test render, marked TEST; false for a final, billed one." - added
Output schema / properties / warnings / descriptionAdded value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
- Changed
get_template_schema11 fields changed- changed
Input schema / properties / template_id / descriptionPrevious value: -"Template id, e.g. `tpl_01J9ZK…`."New value: +"Template id from `list_templates`, e.g. `tpl_01J9ZK…`." - added
Output schema / properties / declared / descriptionAdded value: +"False when the schema was inferred from the template source rather than declared." - added
Output schema / properties / dynamic_properties / descriptionAdded value: +"What `data` can set on an image (`image_canvas`) template; empty for PDF templates." - added
Output schema / properties / dynamic_properties / items / properties / key / descriptionAdded value: +"Dotted `data` key of an image template, e.g. `title.text` or `hero.src`." - added
Output schema / properties / example_data / descriptionAdded value: +"A `data` payload that matches the schema, to fill in." - added
Output schema / properties / fields / descriptionAdded value: +"Every field of the schema, flattened." - added
Output schema / properties / fields / items / properties / enum / descriptionAdded value: +"The only values the field accepts." - added
Output schema / properties / fields / items / properties / line_item / descriptionAdded value: +"The field sits inside an array of rows, such as invoice lines." - added
Output schema / properties / fields / items / properties / path / descriptionAdded value: +"Dotted path into `data`, e.g. `customer.name`, or `items[].price` inside an array." - added
Output schema / properties / schema / descriptionAdded value: +"The JSON Schema of `data`." - added
Output schema / properties / version / descriptionAdded value: +"The template version the schema belongs to."
- Changed
list_templates7 fields changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"Pagination cursor from a previous call."New value: +"`next_cursor` of the previous page." - changed
Input schema / properties / query / descriptionPrevious value: -"Free-text search over template names."New value: +"Part of a template name, case-insensitive." - changed
Input schema / properties / type / descriptionPrevious value: -"Only return templates of this type."New value: +"Only return templates of this type, e.g. `image_canvas` for image templates." - added
Output schema / properties / has_more / descriptionAdded value: +"More templates match: call again with `cursor: next_cursor`." - added
Output schema / properties / templates / items / properties / id / descriptionAdded value: +"Template id (`tpl_…`), the `template_id` of the render tools." - added
Output schema / properties / templates / items / properties / live_version / descriptionAdded value: +"The version renders use by default." - added
Output schema / properties / templates / items / properties / type / descriptionAdded value: +"`pdf_code`, `pdf_markdown`, `image_canvas`, `docx` or `pdf_form`."
- Changed
merge_pdfs23 fields changed- changed
Input schema / properties / bookmarks / descriptionPrevious value: -"Add a top-level bookmark per source file."New value: +"`filenames` (default): a top-level bookmark per source, named after its file; `none`: no bookmarks." - changed
Input schema / properties / expires_in / descriptionPrevious value: -"Lifetime of the returned signed file URL, in seconds (default 3600)."New value: +"Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime." - changed
Input schema / properties / sources / items / properties / file_id / descriptionPrevious value: -"Which file of `render_id` to use."New value: +"Which PDF of `render_id` to take (default: its first PDF)." - changed
Input schema / properties / sources / items / properties / render_id / descriptionPrevious value: -"A previous render to take a file from."New value: +"An earlier render of this workspace whose files are still stored, e.g. `rnd_…`." - changed
Input schema / properties / sources / items / properties / upload_id / descriptionPrevious value: -"Id from an upload, e.g. `upl_…`."New value: +"A PDF uploaded through the API, e.g. `upl_…`." - changed
Input schema / properties / sources / items / properties / url / descriptionPrevious value: -"Publicly reachable PDF URL."New value: +"Public https URL of a PDF." - added
Output schema / properties / billed_renders / descriptionAdded value: +"Renders billed for this render: 0 for test and failed ones." - added
Output schema / properties / error / descriptionAdded value: +"Why the render failed (`status: failed`)." - added
Output schema / properties / files / descriptionAdded value: +"The output files, usually one." - added
Output schema / properties / files / items / properties / bytes / descriptionAdded value: +"File size in bytes." - added
Output schema / properties / files / items / properties / format / descriptionAdded value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`." - added
Output schema / properties / files / items / properties / height / descriptionAdded value: +"Image height in pixels." - added
Output schema / properties / files / items / properties / id / descriptionAdded value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`." - added
Output schema / properties / files / items / properties / pages / descriptionAdded value: +"Page count of a PDF." - changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)." - added
Output schema / properties / files / items / properties / url_expires_at / descriptionAdded value: +"When `url` stops working (ISO 8601); `get_render` signs a new one." - added
Output schema / properties / files / items / properties / width / descriptionAdded value: +"Image width in pixels." - added
Output schema / properties / pages / descriptionAdded value: +"Page count of the PDF." - added
Output schema / properties / reference / descriptionAdded value: +"The `reference` the call passed." - added
Output schema / properties / render_id / descriptionAdded value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source." - added
Output schema / properties / status / descriptionAdded value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone." - added
Output schema / properties / test / descriptionAdded value: +"A free test render, marked TEST; false for a final, billed one." - added
Output schema / properties / warnings / descriptionAdded value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
- Changed
render_image_from_template19 fields changed- changed
Input schema / properties / expires_in / descriptionPrevious value: -"Lifetime of the returned signed file URL, in seconds (default 3600)."New value: +"Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime." - changed
Input schema / properties / template_id / descriptionPrevious value: -"Template id, e.g. `tpl_01J9ZK…`."New value: +"Image template id from `list_templates`, e.g. `tpl_01J9ZK…`." - added
Output schema / properties / billed_renders / descriptionAdded value: +"Renders billed for this render: 0 for test and failed ones." - added
Output schema / properties / error / descriptionAdded value: +"Why the render failed (`status: failed`)." - added
Output schema / properties / files / descriptionAdded value: +"The output files, usually one." - added
Output schema / properties / files / items / properties / bytes / descriptionAdded value: +"File size in bytes." - added
Output schema / properties / files / items / properties / format / descriptionAdded value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`." - added
Output schema / properties / files / items / properties / height / descriptionAdded value: +"Image height in pixels." - added
Output schema / properties / files / items / properties / id / descriptionAdded value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`." - added
Output schema / properties / files / items / properties / pages / descriptionAdded value: +"Page count of a PDF." - changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)." - added
Output schema / properties / files / items / properties / url_expires_at / descriptionAdded value: +"When `url` stops working (ISO 8601); `get_render` signs a new one." - added
Output schema / properties / files / items / properties / width / descriptionAdded value: +"Image width in pixels." - added
Output schema / properties / pages / descriptionAdded value: +"Page count of the PDF." - added
Output schema / properties / reference / descriptionAdded value: +"The `reference` the call passed." - added
Output schema / properties / render_id / descriptionAdded value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source." - added
Output schema / properties / status / descriptionAdded value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone." - added
Output schema / properties / test / descriptionAdded value: +"A free test render, marked TEST; false for a final, billed one." - added
Output schema / properties / warnings / descriptionAdded value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
- Changed
render_pdf_from_html20 fields changed- changed
Input schema / properties / data / descriptionPrevious value: -"Jinja variables for the HTML."New value: +"Jinja variables for the HTML; when present, the HTML is rendered as a Jinja template first." - changed
Input schema / properties / expires_in / descriptionPrevious value: -"Lifetime of the returned signed file URL, in seconds (default 3600)."New value: +"Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime." - changed
Input schema / properties / html / descriptionPrevious value: -"The HTML body to render."New value: +"The HTML to render: a full document or just the <body> content." - added
Output schema / properties / billed_renders / descriptionAdded value: +"Renders billed for this render: 0 for test and failed ones." - added
Output schema / properties / error / descriptionAdded value: +"Why the render failed (`status: failed`)." - added
Output schema / properties / files / descriptionAdded value: +"The output files, usually one." - added
Output schema / properties / files / items / properties / bytes / descriptionAdded value: +"File size in bytes." - added
Output schema / properties / files / items / properties / format / descriptionAdded value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`." - added
Output schema / properties / files / items / properties / height / descriptionAdded value: +"Image height in pixels." - added
Output schema / properties / files / items / properties / id / descriptionAdded value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`." - added
Output schema / properties / files / items / properties / pages / descriptionAdded value: +"Page count of a PDF." - changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)." - added
Output schema / properties / files / items / properties / url_expires_at / descriptionAdded value: +"When `url` stops working (ISO 8601); `get_render` signs a new one." - added
Output schema / properties / files / items / properties / width / descriptionAdded value: +"Image width in pixels." - added
Output schema / properties / pages / descriptionAdded value: +"Page count of the PDF." - added
Output schema / properties / reference / descriptionAdded value: +"The `reference` the call passed." - added
Output schema / properties / render_id / descriptionAdded value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source." - added
Output schema / properties / status / descriptionAdded value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone." - added
Output schema / properties / test / descriptionAdded value: +"A free test render, marked TEST; false for a final, billed one." - added
Output schema / properties / warnings / descriptionAdded value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
- Changed
render_pdf_from_markdown21 fields changed- changed
Input schema / properties / data / descriptionPrevious value: -"Jinja variables for the Markdown."New value: +"Jinja variables for the Markdown, e.g. `{{ customer }}`." - changed
Input schema / properties / expires_in / descriptionPrevious value: -"Lifetime of the returned signed file URL, in seconds (default 3600)."New value: +"Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime." - changed
Input schema / properties / markdown / descriptionPrevious value: -"The Markdown source."New value: +"The Markdown source (GitHub-style tables, task lists and footnotes work)." - changed
Input schema / properties / theme / descriptionPrevious value: -"Built-in stylesheet (default `default`)."New value: +"Built-in stylesheet (default `default`); `none` leaves only your `css`." - added
Output schema / properties / billed_renders / descriptionAdded value: +"Renders billed for this render: 0 for test and failed ones." - added
Output schema / properties / error / descriptionAdded value: +"Why the render failed (`status: failed`)." - added
Output schema / properties / files / descriptionAdded value: +"The output files, usually one." - added
Output schema / properties / files / items / properties / bytes / descriptionAdded value: +"File size in bytes." - added
Output schema / properties / files / items / properties / format / descriptionAdded value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`." - added
Output schema / properties / files / items / properties / height / descriptionAdded value: +"Image height in pixels." - added
Output schema / properties / files / items / properties / id / descriptionAdded value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`." - added
Output schema / properties / files / items / properties / pages / descriptionAdded value: +"Page count of a PDF." - changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)." - added
Output schema / properties / files / items / properties / url_expires_at / descriptionAdded value: +"When `url` stops working (ISO 8601); `get_render` signs a new one." - added
Output schema / properties / files / items / properties / width / descriptionAdded value: +"Image width in pixels." - added
Output schema / properties / pages / descriptionAdded value: +"Page count of the PDF." - added
Output schema / properties / reference / descriptionAdded value: +"The `reference` the call passed." - added
Output schema / properties / render_id / descriptionAdded value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source." - added
Output schema / properties / status / descriptionAdded value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone." - added
Output schema / properties / test / descriptionAdded value: +"A free test render, marked TEST; false for a final, billed one." - added
Output schema / properties / warnings / descriptionAdded value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
- Changed
render_pdf_from_template19 fields changed- changed
Input schema / properties / expires_in / descriptionPrevious value: -"Lifetime of the returned signed file URL, in seconds (default 3600)."New value: +"Lifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime." - changed
Input schema / properties / template_id / descriptionPrevious value: -"Template id, e.g. `tpl_01J9ZK…`."New value: +"Template id from `list_templates`, e.g. `tpl_01J9ZK…`." - added
Output schema / properties / billed_renders / descriptionAdded value: +"Renders billed for this render: 0 for test and failed ones." - added
Output schema / properties / error / descriptionAdded value: +"Why the render failed (`status: failed`)." - added
Output schema / properties / files / descriptionAdded value: +"The output files, usually one." - added
Output schema / properties / files / items / properties / bytes / descriptionAdded value: +"File size in bytes." - added
Output schema / properties / files / items / properties / format / descriptionAdded value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`." - added
Output schema / properties / files / items / properties / height / descriptionAdded value: +"Image height in pixels." - added
Output schema / properties / files / items / properties / id / descriptionAdded value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`." - added
Output schema / properties / files / items / properties / pages / descriptionAdded value: +"Page count of a PDF." - changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`."New value: +"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)." - added
Output schema / properties / files / items / properties / url_expires_at / descriptionAdded value: +"When `url` stops working (ISO 8601); `get_render` signs a new one." - added
Output schema / properties / files / items / properties / width / descriptionAdded value: +"Image width in pixels." - added
Output schema / properties / pages / descriptionAdded value: +"Page count of the PDF." - added
Output schema / properties / reference / descriptionAdded value: +"The `reference` the call passed." - added
Output schema / properties / render_id / descriptionAdded value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source." - added
Output schema / properties / status / descriptionAdded value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone." - added
Output schema / properties / test / descriptionAdded value: +"A free test render, marked TEST; false for a final, billed one." - added
Output schema / properties / warnings / descriptionAdded value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
9 tool updates
- First observed
create_einvoice - First observed
get_render - First observed
get_template_schema - First observed
list_templates - First observed
merge_pdfs - First observed
render_image_from_template - First observed
render_pdf_from_html - First observed
render_pdf_from_markdown - First observed
render_pdf_from_template
Publisher details
- Operator
- N.M.M. NOBLE MINDS MEDIA LTD · Publisher source
- Operator website
- https://dynamicdocumentapi.com
- Vendor relationship
- First-party
- Documentation
- https://dynamicdocumentapi.com/docs/mcp
- Trust center
- https://dynamicdocumentapi.com/security/
- Restrictions
- Requires a Dynamic Document API account (free plan: 50 renders per month, no credit card). Sign in with OAuth or send an API key as a Bearer token. Test renders are free and watermarked. Data is processed in the EU (Germany).
Related MCP Connectors
JSON in, PDF out. Render invoices, certificates, reports and cards from a template and a payload.
Render PDFs and images (invoices, receipts, OG images) from templates or HTML. 1 cent each.
Automate production-ready PDF, Word, Excel and PowerPoint documents from templates and JSON data
Cloud PDF generation from HTML, CSS and XSL-FO, with PDF/A and PDF/UA support.
Related MCP Servers
AlicenseAqualityCmaintenancePDF/DOCX/Excel generation from HTML/Markdown with stationery overlay, ZUGFeRD/XRechnung e-invoicing, digital signing, form filling, and AI receipt OCR with DATEV/SKR03 export.40MIT
@sheetrender/mcpofficial
AlicenseAqualityBmaintenanceRenders PDFs from HTML templates or saved templates and spreadsheet data, with batch job support and document retrieval.1158 npm1MIT
DocuQueue MCP Serverofficial
AlicenseNot gradedqualityBmaintenanceEnables creating professional documents (invoices, contracts, certificates, proposals, reports) via the DocuQueue API, with tools for template management, filling, previewing, and PDF generation.1MIT
docjet-mcpofficial
AlicenseAqualityCmaintenanceRender branded PDF documents (invoices, reports, certificates) and PNG social images directly from any MCP client using DocJet templates or raw HTML with JSON data.319 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.