Skip to main content
Glama

Server Details

PDFs, images and e-invoices (XRechnung, ZUGFeRD) from templates and JSON, rendered in the EU.

Ownership verified
Status
Healthy
Uptime
99.5% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
ChatGPT
–
Claude
Dynamic Document API

TDQS

A4.6/5.0

Scored across 10 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count4/5

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.

Completeness4/5

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 tools
create_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.

NameRequiredDescriptionDefault
testNoTest 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).
syntaxNoXML 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.
invoiceYesThe 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.
profileYesE-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.
filenameNoOutput filename; `.xml` is enforced. Default: the invoice number.
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
referenceNoYour own identifier for this render; filterable later via the renders list.
expires_inNoLifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime.

Output Schema

NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

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.

NameRequiredDescriptionDefault
render_idYesRender id from a render tool's result, e.g. `rnd_01J9ZM…`.

Output Schema

NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

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.

NameRequiredDescriptionDefault
template_idYesTemplate id from `list_templates`, e.g. `tpl_01J9ZK…`.

Output Schema

NameRequiredDescription
fieldsYesEvery field of the schema, flattened.
schemaNoThe JSON Schema of `data`.
versionNoThe template version the schema belongs to.
declaredNoFalse when the schema was inferred from the template source rather than declared.
template_idYes
example_dataNoA `data` payload that matches the schema, to fill in.
einvoice_defaultNoThe 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_propertiesYesWhat `data` can set on an image (`image_canvas`) template; empty for PDF templates.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

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.

NameRequiredDescriptionDefault
typeNoOnly return templates of this type, e.g. `image_canvas` for image templates.
limitNoPage size, 1-100 (default 50).
queryNoPart of a template name, case-insensitive.
cursorNo`next_cursor` of the previous page.

Output Schema

NameRequiredDescription
has_moreYesMore templates match: call again with `cursor: next_cursor`.
templatesYes
next_cursorNo

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

An output schema exists, so return 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.

Parameters4/5

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.

Purpose5/5

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

States a specific verb and resource ('List 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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
testNoTest 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).
sourcesYesThe PDFs to merge, in order.
filenameNoOutput filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`.
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
bookmarksNo`filenames` (default): a top-level bookmark per source, named after its file; `none`: no bookmarks.
referenceNoYour own identifier for this render; filterable later via the renders list.
expires_inNoLifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime.

Output Schema

NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3; the description 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
dataNoTemplate 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.
testNoTest 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).
imageNoImage output options.
formatNoOutput format (default png).
versionNoTemplate version: `live` (default), `draft` (test keys only) or a version number.
filenameNoOutput filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`.
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
referenceNoYour own identifier for this render; filterable later via the renders list.
expires_inNoLifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime.
template_idYesImage template id from `list_templates`, e.g. `tpl_01J9ZK…`.

Output Schema

NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
cssNoCSS injected as a <style> block in <head>.
pdfNoPDF output options; these override the template's defaults.
dataNoJinja variables for the HTML; when present, the HTML is rendered as a Jinja template first.
headNoRaw <head> contents (link/meta/script), appended after `css`.
htmlYesThe HTML to render: a full document or just the <body> content.
testNoTest 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).
filenameNoOutput filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`.
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
referenceNoYour own identifier for this render; filterable later via the renders list.
expires_inNoLifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime.

Output Schema

NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
cssNoExtra CSS layered on top of the theme.
pdfNoPDF output options; these override the template's defaults.
dataNoJinja variables for the Markdown, e.g. `{{ customer }}`.
testNoTest 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).
themeNoBuilt-in stylesheet (default `default`); `none` leaves only your `css`.
filenameNoOutput filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`.
markdownYesThe Markdown source (GitHub-style tables, task lists and footnotes work).
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
referenceNoYour own identifier for this render; filterable later via the renders list.
expires_inNoLifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime.

Output Schema

NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

NameRequiredDescriptionDefault
pdfNoPDF output options; these override the template's defaults.
dataNoTemplate 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.
testNoTest 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).
versionNoTemplate version: `live` (default), `draft` (test keys only) or a version number.
einvoiceNoAn 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.
filenameNoOutput filename. Jinja is allowed, e.g. `invoice-{{ data.number }}.pdf`.
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
referenceNoYour own identifier for this render; filterable later via the renders list.
expires_inNoLifetime of the signed download URLs, in seconds (default 3600, one hour). `get_render` signs fresh ones for the same lifetime.
template_idYesTemplate id from `list_templates`, e.g. `tpl_01J9ZK…`.

Output Schema

NameRequiredDescription
testYesA free test render, marked TEST; false for a final, billed one.
errorNoWhy the render failed (`status: failed`).
filesYesThe output files, usually one.
pagesNoPage count of the PDF.
statusYes`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone.
warningsNoNon-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user.
referenceNoThe `reference` the call passed.
render_idYesRender id (`rnd_…`), for `get_render` and as a `merge_pdfs` source.
created_atNo
conformanceNo
completed_atNo
output_formatNo
billed_rendersNoRenders billed for this render: 0 for test and failed ones.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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

An output schema exists, so return values need no 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines5/5

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)A
Read-onlyIdempotent
Inspect

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.

NameRequiredDescriptionDefault
testNoTest 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).
sourceYesExactly one of `url`, `data_uri`, `upload_id` or `render_id` (+ `file_id`).
metadataNoYour own key/value pairs stored on the render (max 50 keys, values <= 500 chars).
referenceNoYour own identifier for this render; filterable later via the renders list.

Output Schema

NameRequiredDescription
testYesA free test check; false for a billed one. Both give the same verdict.
pagesNoPage count of a PDF; null for an XML.
validYes`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.
reasonYesWhy 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.
statusYes`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`.
documentYesWhat the check found in the file; null without a verdict.
warningsNoNon-fatal problems of the check itself; the validators' warnings are in `conformance`.
referenceNoThe `reference` the call passed.
render_idYesId of the check (`rnd_…`), for `get_render`.
created_atNo
conformanceYesThe 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_atNo
billed_rendersNoRenders billed for the check: 1 for a verdict, valid or invalid; 0 for test checks and failed ones.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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. 1 tool update
    • Addedvalidate_einvoice
  2. 7 tool updates
    • Changedcreate_einvoice1 field changed
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
    • Changedget_render1 field changed
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
    • Changedmerge_pdfs1 field changed
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
    • Changedrender_image_from_template1 field changed
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
    • Changedrender_pdf_from_html1 field changed
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
    • Changedrender_pdf_from_markdown1 field changed
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
    • Changedrender_pdf_from_template1 field changed
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
  3. 9 tool updates
    • Changedcreate_einvoice18 fields changed
      • changedInput schema / properties / expires_in / description
        Previous 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."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
    • Changedget_render18 fields changed
      • changedInput schema / properties / render_id / description
        Previous value: -"Render id, e.g. `rnd_01J9ZM…`."New value: +"Render id from a render tool's result, e.g. `rnd_01J9ZM…`."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
    • Changedget_template_schema11 fields changed
      • changedInput schema / properties / template_id / description
        Previous value: -"Template id, e.g. `tpl_01J9ZK…`."New value: +"Template id from `list_templates`, e.g. `tpl_01J9ZK…`."
      • addedOutput schema / properties / declared / description
        Added value: +"False when the schema was inferred from the template source rather than declared."
      • addedOutput schema / properties / dynamic_properties / description
        Added value: +"What `data` can set on an image (`image_canvas`) template; empty for PDF templates."
      • addedOutput schema / properties / dynamic_properties / items / properties / key / description
        Added value: +"Dotted `data` key of an image template, e.g. `title.text` or `hero.src`."
      • addedOutput schema / properties / example_data / description
        Added value: +"A `data` payload that matches the schema, to fill in."
      • addedOutput schema / properties / fields / description
        Added value: +"Every field of the schema, flattened."
      • addedOutput schema / properties / fields / items / properties / enum / description
        Added value: +"The only values the field accepts."
      • addedOutput schema / properties / fields / items / properties / line_item / description
        Added value: +"The field sits inside an array of rows, such as invoice lines."
      • addedOutput schema / properties / fields / items / properties / path / description
        Added value: +"Dotted path into `data`, e.g. `customer.name`, or `items[].price` inside an array."
      • addedOutput schema / properties / schema / description
        Added value: +"The JSON Schema of `data`."
      • addedOutput schema / properties / version / description
        Added value: +"The template version the schema belongs to."
    • Changedlist_templates7 fields changed
      • changedInput schema / properties / cursor / description
        Previous value: -"Pagination cursor from a previous call."New value: +"`next_cursor` of the previous page."
      • changedInput schema / properties / query / description
        Previous value: -"Free-text search over template names."New value: +"Part of a template name, case-insensitive."
      • changedInput schema / properties / type / description
        Previous value: -"Only return templates of this type."New value: +"Only return templates of this type, e.g. `image_canvas` for image templates."
      • addedOutput schema / properties / has_more / description
        Added value: +"More templates match: call again with `cursor: next_cursor`."
      • addedOutput schema / properties / templates / items / properties / id / description
        Added value: +"Template id (`tpl_…`), the `template_id` of the render tools."
      • addedOutput schema / properties / templates / items / properties / live_version / description
        Added value: +"The version renders use by default."
      • addedOutput schema / properties / templates / items / properties / type / description
        Added value: +"`pdf_code`, `pdf_markdown`, `image_canvas`, `docx` or `pdf_form`."
    • Changedmerge_pdfs23 fields changed
      • changedInput schema / properties / bookmarks / description
        Previous 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."
      • changedInput schema / properties / expires_in / description
        Previous 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."
      • changedInput schema / properties / sources / items / properties / file_id / description
        Previous value: -"Which file of `render_id` to use."New value: +"Which PDF of `render_id` to take (default: its first PDF)."
      • changedInput schema / properties / sources / items / properties / render_id / description
        Previous 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_…`."
      • changedInput schema / properties / sources / items / properties / upload_id / description
        Previous value: -"Id from an upload, e.g. `upl_…`."New value: +"A PDF uploaded through the API, e.g. `upl_…`."
      • changedInput schema / properties / sources / items / properties / url / description
        Previous value: -"Publicly reachable PDF URL."New value: +"Public https URL of a PDF."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
    • Changedrender_image_from_template19 fields changed
      • changedInput schema / properties / expires_in / description
        Previous 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."
      • changedInput schema / properties / template_id / description
        Previous value: -"Template id, e.g. `tpl_01J9ZK…`."New value: +"Image template id from `list_templates`, e.g. `tpl_01J9ZK…`."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
    • Changedrender_pdf_from_html20 fields changed
      • changedInput schema / properties / data / description
        Previous value: -"Jinja variables for the HTML."New value: +"Jinja variables for the HTML; when present, the HTML is rendered as a Jinja template first."
      • changedInput schema / properties / expires_in / description
        Previous 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."
      • changedInput schema / properties / html / description
        Previous value: -"The HTML body to render."New value: +"The HTML to render: a full document or just the <body> content."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
    • Changedrender_pdf_from_markdown21 fields changed
      • changedInput schema / properties / data / description
        Previous value: -"Jinja variables for the Markdown."New value: +"Jinja variables for the Markdown, e.g. `{{ customer }}`."
      • changedInput schema / properties / expires_in / description
        Previous 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."
      • changedInput schema / properties / markdown / description
        Previous value: -"The Markdown source."New value: +"The Markdown source (GitHub-style tables, task lists and footnotes work)."
      • changedInput schema / properties / theme / description
        Previous value: -"Built-in stylesheet (default `default`)."New value: +"Built-in stylesheet (default `default`); `none` leaves only your `css`."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
    • Changedrender_pdf_from_template19 fields changed
      • changedInput schema / properties / expires_in / description
        Previous 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."
      • changedInput schema / properties / template_id / description
        Previous value: -"Template id, e.g. `tpl_01J9ZK…`."New value: +"Template id from `list_templates`, e.g. `tpl_01J9ZK…`."
      • addedOutput schema / properties / billed_renders / description
        Added value: +"Renders billed for this render: 0 for test and failed ones."
      • addedOutput schema / properties / error / description
        Added value: +"Why the render failed (`status: failed`)."
      • addedOutput schema / properties / files / description
        Added value: +"The output files, usually one."
      • addedOutput schema / properties / files / items / properties / bytes / description
        Added value: +"File size in bytes."
      • addedOutput schema / properties / files / items / properties / format / description
        Added value: +"`pdf`, `png`, `jpeg`, `webp` or `xml`."
      • addedOutput schema / properties / files / items / properties / height / description
        Added value: +"Image height in pixels."
      • addedOutput schema / properties / files / items / properties / id / description
        Added value: +"File id (`file_…`); `merge_pdfs` takes it as `file_id` with the `render_id`."
      • addedOutput schema / properties / files / items / properties / pages / description
        Added value: +"Page count of a PDF."
      • changedOutput schema / properties / files / items / properties / url / description
        Previous 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`)."
      • addedOutput schema / properties / files / items / properties / url_expires_at / description
        Added value: +"When `url` stops working (ISO 8601); `get_render` signs a new one."
      • addedOutput schema / properties / files / items / properties / width / description
        Added value: +"Image width in pixels."
      • addedOutput schema / properties / pages / description
        Added value: +"Page count of the PDF."
      • addedOutput schema / properties / reference / description
        Added value: +"The `reference` the call passed."
      • addedOutput schema / properties / render_id / description
        Added value: +"Render id (`rnd_…`), for `get_render` and as a `merge_pdfs` source."
      • addedOutput schema / properties / status / description
        Added value: +"`succeeded`: `files` are ready. `queued` / `processing`: still running, collect it with `get_render`. `failed`: see `error`. `expired`: the stored files are gone."
      • addedOutput schema / properties / test / description
        Added value: +"A free test render, marked TEST; false for a final, billed one."
      • addedOutput schema / properties / warnings / description
        Added value: +"Non-fatal problems, e.g. `einvoice_skipped_plan` (the e-invoice was left out); tell the user."
  4. 9 tool updates
    • First observedcreate_einvoice
    • First observedget_render
    • First observedget_template_schema
    • First observedlist_templates
    • First observedmerge_pdfs
    • First observedrender_image_from_template
    • First observedrender_pdf_from_html
    • First observedrender_pdf_from_markdown
    • First observedrender_pdf_from_template

Publisher details

Operator
N.M.M. NOBLE MINDS MEDIA LTD · Publisher source
Vendor relationship
First-party
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

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources