Dynamic Document API
Server Details
PDFs, images and e-invoices (XRechnung, ZUGFeRD) from templates and JSON, rendered in the EU.
- Status
- Healthy
- Uptime
- 99.5% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- Dynamic Document API
TDQS
Scored across 10 tools
Each tool targets a distinct input/output: the four render_* variants are separated by explicit source (saved template vs HTML vs Markdown vs image template), and descriptions cross-reference each other to steer selection. create_einvoice (standalone XML) vs render_pdf_from_template with einvoice (hybrid PDF) and validate_einvoice (read-only check) are explicitly contrasted, and get_render is clearly the polling/refresh tool.
All names are snake_case verb_noun (create_einvoice, get_render, list_templates, merge_pdfs, validate_einvoice) with a coherent render_<format>_from_<source> family. The pattern is predictable enough that an agent can infer tool names from intent.
Ten tools is well within the sweet spot and each covers a real operation (four render paths, two e-invoice operations, template discovery, polling, merge). No tool appears redundant, though the render family could have been collapsed if the platform allowed a single source-type parameter.
CRUD-ish lifecycle for renders is covered: create (five paths), poll/refresh (get_render), plus template discovery, schema introspection, merge and e-invoice validation. Gaps remain: no way to list past renders by workspace (only fetch by known id), and no delete/cancel operation for renders or files, which could strand an agent that lost a render id.
Available Tools
10 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. Needs the Growth plan or higher; on other plans the call fails with 402 plan_feature_unavailable. 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?
With annotations only telling the agent this is a non-read-only, non-idempotent, non-destructive write, the description supplies the real behavioral profile: a signed download URL valid for `expires_in`, a validator verdict at `conformance.einvoice.status`, and exhaustive per-field-path error listings on rule violations. It also discloses plan gating (402), free test renders with a TEST note, and the 60-calls-per-minute connection limit — none of which annotations 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 the alternative, then outputs, failure modes, plan gating and rate limits — each sentence carries distinct information. It is dense but a touch back-loaded, with billing/test-mode and rate-limit caveats stacked at the end where a scanning agent may skim past them.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, nested-object, mutation tool this covers what matters: how to obtain output, how success is verified, how validation failures surface, and what account/rate constraints gate the call. Even though an output schema exists, the returned status enum and URL lifetime are surfaced where an agent will act on them.
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 field-level meaning of `profile`, `syntax`, `test`, `invoice` and `expires_in` is already carried by the schema. The description echoes return-URL lifetime and default but adds no syntax/format guidance beyond it, so it meets the baseline rather than exceeding it.
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") with the concrete standards it targets (XRechnung, EN 16931, Peppol). It also names the sibling it is not — `render_pdf_from_template` with `einvoice` — so the agent can separate XML-only output from 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 agent: use this for standalone XML, use `render_pdf_from_template` with `einvoice` when the invoice must be embedded in a PDF. Adds hard preconditions (Growth plan or higher, otherwise 402 `plan_feature_unavailable`) and explains the API-key/test-mode interaction, so an agent knows both when to pick it and when the call will be rejected.
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 (most renders reach succeeded or failed within seconds), 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 declare readOnly/idempotent/non-destructive, and the description adds real context on top: URLs are re-signed and last `expires_in` again, retention ends at which point the render becomes `expired` with no URL, the call is not billed, and there is a 60 calls/minute per-connection limit shared across tools. Those are non-obvious operational traits an agent cannot get from the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then when-to-use, then when-not, then expiry/billing/rate-limit caveats — every sentence contributes distinct information. It is dense and semicolon-heavy, which slightly hurts scannability, but there is 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?
For a single-parameter read tool with full annotation coverage and an output schema, the description covers everything an agent needs: what comes back, when to call it, when not to, and the state-transition caveats around URL expiry and retention.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single `render_id` parameter is already documented with its format and provenance, so the description adds little beyond "by id". Baseline 3 applies since the schema carries the parameter burden.
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 the payload contents (status, freshly signed file URLs, billed_renders, conformance report). This clearly separates it from the render_* siblings, which create renders rather than retrieve them.
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 positive triggers ("when a render tool returned `queued` or `processing`", "when a download link has expired") and an explicit negative one ("Not needed after a render tool already returned `succeeded` with its files"). No inference is required to decide between this and a render_* sibling.
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). One call per template is enough; the id comes from list_templates or from the user. fields and example_data show the shape of data, and 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?
Annotations already declare read-only/idempotent/non-destructive, but the description goes well beyond: it is not billed, it is capped at 60 calls per minute shared across all tools, and it warns that when `einvoice_default` is set the `data` must also carry the invoice object at `invoice_path`, with plan-based skipping (`einvoice_skipped_plan`) on Free and Starter. It also notes downstream validation behavior (render tools reject non-conforming data).
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?
Purpose is front-loaded and every sentence carries operational information (rate limit, plan gating, sibling exclusions). The opening sentence is overloaded with four comma-separated clauses, which slightly taxes readability, but there is 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?
Despite an output schema existing, the description still previews the return shape, and it adds the prerequisites (id source, plan tier behavior, einvoice coupling) an agent needs to call this correctly. Nothing material is missing for a one-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is documented with an example format, so the schema does the heavy lifting (baseline 3). The description adds genuine context by naming the authoritative source of the id (`list_templates` or the user), which the schema does not say.
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 is returned: JSON Schema, dotted-path fields, image dynamic properties, example payload, einvoice_default. This clearly separates it from the sibling render_* tools, which consume the schema rather than produce it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when it is needed ('before rendering'), when it is not ('`render_pdf_from_html` and `render_pdf_from_markdown` take no template and need no schema'), the call frequency ('One call per template is enough'), and where the id comes from (`list_templates` or the user). 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.
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; get_template_schema returns 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?
Annotations already cover the safety profile, and the description adds context an agent could not infer: 50 results per page, the has_more/next_cursor paging loop, no billing, and a 60 calls-per-minute per-connection limit shared across all tools.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph, front-loaded with purpose and scope, followed by routing, pagination, and operational limits. Every sentence carries a distinct, non-redundant instruction.
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 field detail is unnecessary; the description still covers discovery purpose, sibling routing, pagination, billing, and rate limits. Nothing an agent needs to call 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?
With 100% schema coverage the baseline is 3, but the description adds the paging contract that the schema alone does not state: the default page size and the instruction to pass `next_cursor` as `cursor` while `has_more` is true. It also ties template `type` values to the correct downstream render tool, which is meaning beyond the enum itself.
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 fields returned (id, name, type, live version), which lets an agent distinguish it immediately from get_template_schema and the render_* 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 ('to find the `template_id` for a document the user describes'), an explicit when-not ('skip it when you already have the id'), and routes by template type: pdf_code/pdf_markdown to render_pdf_from_template, image_canvas to render_image_from_template, and schema lookup to get_template_schema.
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, and 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?
Goes well beyond annotations: sources remain unchanged, synchronous wait is capped at 25 s, slow renders return `queued`/`processing`, download URLs are signed and expire per `expires_in`, expired links can be re-signed by get_render, and there are per-minute limits plus TEST-watermark behavior for test keys. The rate limits and watermark disclosure are exactly the kind of context annotations don't carry.
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 what the tool does and its hard limits, then use cases, then async/return behavior, then operational constraints. Dense but every clause is informative; there is no filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, annotations covering read-only/destructive/idempotency, and 100% schema coverage, the remaining risks an agent faces (sync vs async, link expiry, test vs billed renders, rate limits) are all addressed in the description. Nothing material is missing for correct invocation.
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 still adds value by explaining ordering of `sources`, the `bookmarks` default semantics, and that `expires_in` governs the returned signed URL lifetime and is reusable by get_render. It leaves `metadata`, `reference`, and `filename` elaborations mostly to the schema, which already documents them well.
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 with hard scope ("Merge 2-200 existing PDFs into one PDF, in the order given") plus the bookmark behavior, and explicitly separates itself from the render_* siblings by noting "It renders nothing itself." An agent can distinguish it from render_pdf_from_html/template 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 concrete use cases ("combine documents, e.g. a cover letter and an invoice from earlier renders") and names get_render as the tool to use when the result returns `queued`/`processing`. It stops short of an explicit rule about when to choose merge_pdfs versus the render_* family for new content, but the boundary is strongly implied by "it renders nothing itself."
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. Image templates are listed by list_templates (type: image_canvas); their dynamic properties, from get_template_schema, go in data as dotted keys such as title.text or hero.src (an image URL). A PDF comes from 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?
Annotations only declare non-readonly, open-world, non-idempotent, non-destructive; the description adds real behavior beyond that: a 25 s wait with signed URLs valid for `expires_in`, the queued/processing async states, watermark and free-test semantics, and a 60 calls/min connection rate limit. None of that is derivable 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 the core action and formats, then routing, then behavior; each sentence carries distinct information. It is dense for a single paragraph — the test-key and rate-limit sentences could be split out — but nothing is truly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter tool with nested objects, an output schema, and annotations, the description covers the entry path, data shape, alternatives, async follow-up, and limits. Return-value detail is correctly omitted since an output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so every parameter is already documented, including dotted keys for `data`, `expires_in` defaults, and `version` options. The description largely restates those facts; its only marginal addition is the workflow hint that `data` keys come from `get_template_schema` and that `hero.src` is an image URL. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb + resource (render an image from a saved image_canvas template plus data), names output formats and concrete use cases (social/OG images, banners, badges), and explicitly separates itself from the PDF sibling. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: image templates come from `list_templates` with `type: image_canvas`, dynamic properties from `get_template_schema` go into `data`, and PDFs go to `render_pdf_from_template`. It also gives the fallback path for slow renders (`get_render` collects queued/processing and re-signs links), which is exactly the when-to-use decision an agent needs.
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?
Annotations only declare non-readonly, open-world, non-idempotent, non-destructive; the description adds substantial operational context beyond that: a 25 s synchronous wait then signed download URLs with an expiry, queued/processing states that require get_render and re-signing, the requirement that remote images/fonts be public URLs, the TEST watermark and per-minute limits on a test key, and a 60 calls/min connection-wide rate limit. These are exactly the traits an agent needs to plan a call sequence.
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 templating, then lifecycle, then billing/limits — a sensible ordering with no filler sentences. Slightly long, and the test-key billing behavior is partly restated from the `test` parameter description, but each sentence still carries operational information.
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 nested pdf options, this is complete: it covers input constraints (public URLs for assets, Jinja via `data`), timing and async fallback, auth/billing behavior of the API key, and rate limits. An output schema exists, yet the description still provides the return-lifecycle facts an agent needs to know before calling.
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, and the description earns above that by explaining the Jinja semantics of `data` with concrete syntax ('{{ name }}', '{% for row in rows %}'), that `head` is the place for web-font <link> tags, and that `expires_in` defaults to one hour with get_render re-signing. It does not add anything about the pdf options block, but the schema already documents those well.
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 a PDF from HTML/CSS in headless Chromium) and immediately triangulates against the two sibling render tools by name. An agent can distinguish it from render_pdf_from_template and render_pdf_from_markdown 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 explicit positive conditions ('when no saved template fits and the layout matters: letters, styled tables, one-off documents') and explicit alternatives with the selecting condition for each ('for a saved template use render_pdf_from_template'; 'for a text report without layout work render_pdf_from_markdown is shorter'). Also names get_render as the follow-up path for slow renders.
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?
Annotations only declare the safety profile (not read-only, open-world, non-idempotent, non-destructive); the description adds the substantive behavior: a 25 s wait then signed URLs, the queued/processing async path with get_render and re-signing, the TEST watermark on test renders, and a 60 calls/minute per-connection limit. It also discloses a hard capability boundary — raw HTML is not rendered.
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 alternatives, then async/expiry behavior, then billing and rate limits — a sensible information hierarchy. It is dense and long-ish for one paragraph, but nearly every clause carries operational weight; only the expires_in restatement is mild duplication.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description still covers what an agent must know before calling: timeout, async fallback, link expiry, watermark/billing semantics and rate limits. Nothing material is left to inference for a 10-parameter, nested-object render tool.
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 input schema already documents all 10 parameters including expires_in's 3600 default and the test-mode semantics. The description restates the expires_in default and the API-key override of test mode, adding reinforcement but no genuinely new parameter semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Render a PDF from Markdown") plus the mechanism (built-in theme) and the value proposition. It explicitly distinguishes itself from the two nearest siblings, render_pdf_from_html and render_pdf_from_template.
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?
Names both alternatives and the condition that selects each ("For a designed layout use render_pdf_from_html, for a saved template use render_pdf_from_template"), and positions this as the quick option for reports, summaries or notes. It also routes the agent to get_render when a render comes back queued or processing.
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. template_id comes 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) the PDF is rendered without it and carries the warning einvoice_skipped_plan; e-invoicing 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 only say it is a non-read-only, open-world, non-idempotent call; the description adds the behavior that matters: a 25 s wait then signed URLs with an expires_in lifetime, queued/processing outcomes recovered via get_render, test-key semantics with watermarking, plan gating for e-invoicing with an einvoice_skipped_plan warning, and a 60 calls/min connection rate limit. None of that is inferable from the 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 routing, then builds outward to timing, statuses, test mode, e-invoicing and rate limits; most sentences carry distinct information. It is dense and the e-invoice plan limitation is spread across two sentences, but nothing is padding for a tool with this much behavior.
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, and the description still covers everything an agent needs before calling: prerequisites, failure modes (schema errors, 400 on invoice_path), asynchronous completion path, link expiry and re-signing, billing/test implications, and plan constraints. No material gap remains.
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 cross-tool provenance the schema lacks: template_id comes from list_templates, data shape from get_template_schema, and schema violations fail per wrong field path. It also clarifies the tri-state e-invoice semantics (object replaces default, null disables, omitted keeps default) and that a missing invoice_path yields a 400 validation_error.
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 three siblings by naming the cases each one handles. An agent can pick this tool over render_pdf_from_html, render_pdf_from_markdown or render_image_from_template 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 'use it when a template exists' rule, names the fallback siblings and the condition that selects each (no template -> html/markdown, images -> render_image_from_template), and routes to list_templates and get_template_schema for prerequisites. When-not-to-use is stated, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_einvoiceValidate an e-invoice (XRechnung, ZUGFeRD / Factur-X, EN 16931)ARead-onlyIdempotentInspect
Check an e-invoice someone sent: a Factur-X / ZUGFeRD PDF (or a PDF carrying xrechnung.xml), or an XRechnung or EN 16931 XML in CII or UBL. Use it on incoming invoices before they go to accounting, or on an XML from create_einvoice (its render_id). It creates no file; to make an e-invoice, use create_einvoice or render_pdf_from_template with einvoice. Every plan, Free included. The KoSIT validator checks the XML against the standard's schema and business rules; for a PDF, veraPDF checks PDF/A-3b, which Factur-X requires. Returns valid, what the file holds in document (profile, syntax, specification identifier) and the validators' reports in conformance, with the rules the file breaks. A file without an e-invoice, or with one the check doesn't cover (ZUGFeRD 1.0 and 2.0, XRechnung before 3.0, Peppol BIS Billing 3.0), returns valid: false with a reason. Not checked: whether the invoice is right for tax purposes, signatures, and whether the PDF's pages match the XML. Waits up to 25 s; a slower check comes back queued or processing, and get_render collects it. This connection's test API key makes every render a free test render: test renders give the same verdict, at most 25 a day per workspace, 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 checks are free and give the same verdict, at most 25 a day per workspace. Omitted, the server's default applies (test mode, unless it was configured otherwise). Pass `false` for a billed check. With an API key instead of a sign-in the key decides, whatever is passed: a test key always makes test checks, a live key always billed ones (`true` is refused). | |
| source | Yes | Exactly one of `url`, `data_uri`, `upload_id` or `render_id` (+ `file_id`). | |
| 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| test | Yes | A free test check; false for a billed one. Both give the same verdict. |
| pages | No | Page count of a PDF; null for an XML. |
| valid | Yes | `true`: the XML passed the KoSIT validator and, for a PDF, the PDF passed PDF/A-3b (warnings don't count). `false`: it failed (see `conformance`), or the file holds no e-invoice this check covers (see `reason`). `null` while the check is still running. |
| reason | Yes | Why there is no verdict: `einvoice_not_found`, the file is no e-invoice (neither a PDF nor an XML, a PDF without an embedded invoice XML, an XML that isn't an invoice); `einvoice_unsupported`, an e-invoice this check doesn't cover (e.g. ZUGFeRD 1.0, XRechnung before 3.0, Peppol BIS Billing 3.0). `null` with a verdict. |
| status | Yes | `succeeded`: the validators gave a verdict, see `valid`. `queued` / `processing`: still running, collect it with `get_render`. `failed`: the file holds no e-invoice this check covers, see `reason`. |
| document | Yes | What the check found in the file; null without a verdict. |
| warnings | No | Non-fatal problems of the check itself; the validators' warnings are in `conformance`. |
| reference | No | The `reference` the call passed. |
| render_id | Yes | Id of the check (`rnd_…`), for `get_render`. |
| created_at | No | |
| conformance | Yes | The reports, `status` `passed` or `failed`: the KoSIT validator's on the XML (`einvoice`) and, for a PDF, veraPDF's PDF/A-3b report on the file as received (`pdfa`). Every rule the file breaks is in `errors`. |
| completed_at | No | |
| billed_renders | No | Renders billed for the check: 1 for a verdict, valid or invalid; 0 for test checks and failed ones. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Well beyond the supplied readOnly/idempotent annotations, it discloses the validation engines (KoSIT for schema/business rules, veraPDF for PDF/A-3b), what is explicitly not checked (tax correctness, signatures, PDF-page-to-XML match), and the latency contract: 25 s wait, then `queued`/`processing` collected via get_render. It also states plan availability, the 25/day test-render cap, and the shared 60 calls/minute 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 the action and accepted inputs, followed by routing, behavior, and limits in a logical order with no filler sentences. It is a dense block that packs several distinct concerns (engines, exclusions, latency, quotas) into one paragraph, which is efficient but slightly harder to scan than a structured list would be.
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 a nested source object, an output schema, and a mutation-free but quota-governed operation, the description covers inputs, engines, failure modes (valid:false with reason), async behavior, and rate limits. Nothing an agent needs in order to call it correctly and interpret the result 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 all four parameters (source variants, test, metadata, reference) are already fully documented in the schema, and the baseline of 3 applies. The description only lightly reinforces parameter meaning by tying `render_id` to create_einvoice output and mentioning the 25 s/queued behavior relevant to `test`; it adds no format, precedence, or size guidance beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete verb ('Check an e-invoice') plus the exact accepted resources: Factur-X/ZUGFeRD PDF, PDF carrying xrechnung.xml, CII or UBL XML. It also explicitly separates itself from the creation siblings ('It creates no file'), so an agent can distinguish it from create_einvoice and render_pdf_from_template without inspecting 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 explicit when-to-use conditions ('incoming invoices before they go to accounting', or an XML from create_einvoice via render_id) and explicit routing to alternatives ('to make an e-invoice, use create_einvoice or render_pdf_from_template with einvoice'). It additionally names the cases it does NOT cover (ZUGFeRD 1.0/2.0, XRechnung before 3.0, Peppol BIS 3.0), which prevents mis-selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Added
validate_einvoice
7 tool updates
- Changed
create_einvoice1 field changed- changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."New value: +"Download link; expires at `url_expires_at`, and an altered link doesn't open. Absent once the files are gone (`status: expired`)."
- Changed
get_render1 field changed- changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."New value: +"Download link; expires at `url_expires_at`, and an altered link doesn't open. Absent once the files are gone (`status: expired`)."
- Changed
merge_pdfs1 field changed- changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."New value: +"Download link; expires at `url_expires_at`, and an altered link doesn't open. Absent once the files are gone (`status: expired`)."
- Changed
render_image_from_template1 field changed- changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."New value: +"Download link; expires at `url_expires_at`, and an altered link doesn't open. Absent once the files are gone (`status: expired`)."
- Changed
render_pdf_from_html1 field changed- changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."New value: +"Download link; expires at `url_expires_at`, and an altered link doesn't open. Absent once the files are gone (`status: expired`)."
- Changed
render_pdf_from_markdown1 field changed- changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."New value: +"Download link; expires at `url_expires_at`, and an altered link doesn't open. Absent once the files are gone (`status: expired`)."
- Changed
render_pdf_from_template1 field changed- changed
Output schema / properties / files / items / properties / url / descriptionPrevious value: -"Signed download URL; expires at `url_expires_at`. Absent once the files are gone (`status: expired`)."New value: +"Download link; expires at `url_expires_at`, and an altered link doesn't open. Absent once the files are gone (`status: expired`)."
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.
Cloud PDF generation from HTML, CSS and XSL-FO, with PDF/A and PDF/UA support.
Convert, merge, compress and check PDFs, images, Office files and e-invoices (XRechnung, ZUGFeRD).
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.11154 npm1MIT
DocuQueue MCP Serverofficial
AlicenseNot gradedqualityCmaintenanceEnables creating professional documents (invoices, contracts, certificates, proposals, reports) via the DocuQueue API, with tools for template management, filling, previewing, and PDF generation.27 npm1MIT
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.341 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.