Galley Render
Server Details
JSON in, PDF out. Render invoices, certificates, reports and cards from a template and a payload.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
TDQS
Scored across 10 tools
Each tool targets a distinct resource and action: accounts, templates, renders, usage, and validation. There is no ambiguity between render (create) and get_render (fetch), or between list_templates and get_template. The descriptions reinforce clear boundaries.
Most tools follow the verb_noun pattern (create_account, get_template, list_renders), but 'render' is a bare verb and 'usage' is a noun, deviating slightly. The convention is still predictable and readable.
With 10 tools, the server is well-scoped. Each tool covers a necessary part of the lifecycle: template management, rendering, retrieval, account management, and validation. No tool feels redundant or missing.
The surface covers the full workflow: create and update templates, list and get them, render and fetch renders, validate data, check usage, and manage the account. Since templates are immutable and renders are stateless, there are no obvious gaps like delete or update operations.
Available Tools
10 toolscreate_accountCreate an account and get an API keyAIdempotentInspect
Turn the keyless trial into a real account and get a permanent API key.
Call it once with an email: a verification link is sent and the tool returns status: "pending_verification". After the human clicks the link, call it again with the same email and it returns the API key, once. The key is not released before the click.
The trial in this session is upgraded in place, so templates and renders made during the trial are kept. The free tier is 200 renders a month; pricing beyond that is at https://galleyrender.com/pricing. Store the key as a secret — it is shown only on that one call.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Account name. Defaults to the local part of the email. | |
| Yes | Where to send the verification link. Use the address of the person who owns this project — not a made-up one; the key is only released after the link is clicked. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses key behavioral traits beyond annotations: the two-step verification flow, that the key is only released after link click, that the key is shown only once, and that the trial is upgraded in place. It also mentions the free tier limit and pricing URL. This adds significant context beyond the annotations (readOnlyHint=false, idempotentHint=true, etc.) and does not contradict them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: it starts with the core purpose, then explains the two-step flow, then covers edge cases and constraints. Every sentence adds value, and the length is appropriate for the complexity of the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (two-step verification, one-time key release, in-place upgrade), the description covers all necessary aspects: how to call it, what to expect, what to do after, and important caveats. No output schema exists, but the description explains the return values ('status: pending_verification' and the API key).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters. The description adds meaning by explaining the email's role in the verification flow and warning against using a made-up email. It also clarifies the 'name' parameter defaults to the local part of the email. This goes beyond the schema's basic descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: converting a keyless trial into a real account and obtaining a permanent API key. It uses a specific verb ('create') and resource ('account'), and the title reinforces this. It distinguishes itself from siblings by focusing on account creation rather than template/render operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit step-by-step usage: call once with email, wait for verification link click, call again with same email to get the key. It also states when not to use it (e.g., not for trial operations) and mentions the in-place upgrade preserving trial data. This is clear guidance for an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_templateCreate a templateAInspect
Create a new template at version 1 from an HTML document with Liquid expressions, plus a JSON Schema for its data. Use this when nothing in list_templates fits. The name must be free on this account — publishing a change to an existing template is update_template, not this. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Template name: lowercase letters, digits, dot, dash or underscore, 1-63 characters. Unique per account. Versions are separate — do not put `@1` here. | |
| engine | No | Rendering engine. `chromium` (default) is full HTML and CSS and is required for PDF. `satori` is a fast PNG path for simple flexbox card layouts — no page breaks, no floats, no external CSS — and costs us less, so prefer it for OG images and social cards. | |
| schema | No | JSON Schema (2020-12) for the `data` payload this template accepts. Strongly recommended: it is what turns a bad payload into a field-level error with a path, an expected type and a working example instead of a blank page. Use `required` and give each property a `description`. | |
| source | Yes | One self-contained HTML document with inline CSS and Liquid expressions (`{{ customer.name }}`, `{% for line in line_items %}`). No file includes: everything the render needs must be in this string, or at a public https URL. Two extra filters ship by default: `money` and `date_medium`. For a PDF, use `@page { size: Letter; margin: 18mm }` to control pagination. | |
| example | No | A payload that renders correctly. It is echoed back in validation errors, so include one. | |
| message | No | Change note for this version, like a commit message. | |
| options | No | Render options, merged over the template's own defaults. Options are part of the cache key, so two calls that differ only here are two different renders. | |
| description | No | One line on what this template is for. Shown in list_templates. | |
| expected_pages | No | How many PDF pages a typical payload renders. Default 1. This is the estimate the free tier and the spend cap are checked against before the render starts, so a template that runs to several pages must say so or a render that cannot fit the allowance will be started and then go over. It is not a limit: the render is billed on the pages it actually produced. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already convey that this is not read-only and not idempotent. The description adds useful behavioral context beyond them: the tool creates at version 1, requires an unused name, and is not for updating existing templates. There is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tight and front-loaded, with clear selection guidance and no redundant restatement of the title. The trailing 'Free.' is slightly ambiguous and adds only marginal value, keeping it from a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the 9-parameter nested schema, the description plus the exhaustive schema is sufficient for an agent to select and invoke the tool correctly. The sibling differentiation is handled, and no critical invocation detail appears missing, although the lack of an output schema means response behavior is left unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema provides rich explanations for parameters including engine trade-offs, source expectations, options semantics, and expected_pages. The tool description itself adds little parameter-level detail, which is fine because the schema carries the burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: 'Create a new template at version 1 from an HTML document with Liquid expressions, plus a JSON Schema for its data.' It also distinguishes itself from siblings by explicitly marking 'update_template' as the alternative for publishing changes to existing templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit selection rule: 'Use this when nothing in list_templates fits.' It also states the precondition that the name must be free and the alternative tool to use for existing templates, which fully orients the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_renderGet a renderARead-onlyInspect
Fetch a render by id: its status, and a freshly signed URL once it has succeeded. Use it to poll a queued render, or to re-sign a URL that has expired — signed URLs are short-lived, the stored object is not. Free, and never re-renders.
| Name | Required | Description | Default |
|---|---|---|---|
| render_id | Yes | Render id from a previous render call, e.g. `rnd_…`. Returns the status and a fresh signed URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description adds meaningful behavior: signed URLs are short-lived while the stored object persists, the tool is free, and it never re-renders. This clarifies side-effect expectations without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences carry the purpose, usage scenarios, and behavioral caveats with no filler. The core action is front-loaded and every remaining clause adds decision-relevant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still names the return content (status and freshly signed URL) and the two main calling scenarios. It does not enumerate possible status values or error behavior, but for a one-parameter read-only tool this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the input schema already documents render_id with an example and the note that it comes from a previous render call. The tool description only adds 'by id', so it provides no meaningful semantic value beyond the schema; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Fetch a render by id.' It also names the exact outputs (status and a freshly signed URL), so an agent can distinguish this from sibling tools like render, list_renders, or get_template.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives two explicit use cases: polling a queued render and re-signing an expired URL. It does not explicitly name alternatives or say when not to use it, so it stops short of a full when/when-not guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_templateGet a templateARead-onlyInspect
Fetch one template version: its JSON Schema, its default render options, an example payload and its HTML source. Read the schema before rendering — it is the contract for the data argument. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| template | Yes | Template to use: `invoice` for the latest version, or `invoice@3` to pin version 3. Pin the version in anything you ship — a new version changes the output and the cache key. Call list_templates to see what this account has. | |
| include_source | No | Include the HTML source in the response. Default true. Set false when you only need the schema. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and open-world, so the safety profile is covered. The description adds value beyond annotations by stating the tool is free and by specifying exactly what the response contains, which is especially useful because no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no redundancy: the first front-loads the core purpose, the second conveys a critical usage warning, and the third notes cost. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter retrieval tool with full schema coverage and read-only/open-world annotations, the description plus schema fully equips the agent: what to pass, what to expect back, why it matters, and that it is free. The enumerated return values compensate for the missing output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already fully documents the template parameter (including version pinning) and include_source. The description adds no parameter-specific detail beyond pointing to the 'data' argument contract, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Fetch') and clearly identifies the resource ('one template version') while enumerating the exact payload components: JSON Schema, default render options, example payload, and HTML source. This immediately distinguishes it from sibling tools like get_render and list_templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs the agent to read the schema before rendering, positioning this tool as a prerequisite for render or validate_data workflows. It does not explicitly name alternative tools for rendered output, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rendersList recent rendersARead-onlyInspect
Recent renders on this account, newest first, with status, template version and a signed URL for each that succeeded. Useful for finding a render whose id you lost, or checking what a batch did. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many to return, newest first. 1-100, default 25. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, lowering the bar. The description adds behavioral specifics: 'newest first' ordering, inclusion of status and template version, and signed URLs only for successes, plus the note that it is 'Free.' These go beyond the annotations and help an agent understand what the call returns and its side-effect-free nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. It front-loads the primary function and ordering, then adds practical use cases and a cost note, all in a compact, scannable format.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one optional parameter, read-only annotations, and no output schema, the description covers the essential information: what is returned, ordering, and when to use it. It does not mention response format details (e.g., array shape) or pagination beyond the limit, but those are minor given the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%—the schema fully documents the 'limit' parameter with min, max, and default. The description does not add any new meaning to the parameter; it simply omits it. Per the rubric, a baseline of 3 is appropriate when the schema carries the parameter documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists recent renders on the account, ordered newest first, and specifies the included fields (status, template version, signed URL for successes). It also distinguishes itself from siblings like get_render (which fetches a specific render) and render (which creates one) by its listing focus and explicit use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete usage scenarios ('finding a render whose id you lost' and 'checking what a batch did'), which tells an agent when to choose this tool. It does not explicitly name alternatives or state when not to use it, but the context is clear enough for correct selection among siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesList templatesARead-onlyInspect
List the templates on this account, with their latest version number. Start here: rendering needs a template, and this says which ones exist. A brand-new trial account starts with the starter library (invoice, quote, receipt, og-card, certificate and more) already loaded. Free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description doesn't need to restate that. It adds useful context: 'Free' (cost) and the presence of a starter library for new trial accounts. However, it doesn't disclose potential pagination, sorting, or response format, which are minor gaps for a list tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the primary action, and each sentence adds value. 'Start here' is a helpful orientation, and the mention of the starter library and cost is concise and relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple list operation with no parameters and no output schema, the description covers the key purpose, expected contents (starter library), and a note on cost. It could mention the return format (e.g., list of template IDs and versions), but the description already hints at the version number, making it sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Tool has zero parameters, so baseline is 4. The description adds no parameter info, which is unnecessary; the schema is empty and already self-explanatory.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'List the templates on this account' with a specific output detail (latest version number). Differentiates from siblings by positioning it as the starting point for rendering, distinguishing it from get_template or create_template.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: 'Start here: rendering needs a template, and this says which ones exist.' This tells the agent when to use it (before rendering) without naming alternatives, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renderRender a documentAIdempotentInspect
Render a template plus a JSON payload into a PDF, PNG or JPG and return a signed URL. This is the one tool most calls need.
Small jobs finish inside the call and come back status: "succeeded" with a url you can hand straight to a user. Anything with a webhook_url, async: true or a large payload comes back status: "queued" with an id for get_render.
Renders are deterministic and cached: the same template version, data and options return the stored object with cached: true, free and instant. Billing is one unit per PNG or JPG and one per PDF page; cache hits are never billed.
No API key needed to start — the first call mints a 50-render trial and returns its token.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | The JSON payload for the template, matching its schema. Call get_template for the schema, or validate_data to dry-run a payload for free. | |
| async | No | Force the queued path even for a small job. Default false: small jobs finish inside the call and come back with a URL already. | |
| format | No | Output format. Defaults to `pdf` for chromium templates and `png` for satori ones. `webp` is not supported in v1. | |
| options | No | Render options, merged over the template's own defaults. Options are part of the cache key, so two calls that differ only here are two different renders. | |
| template | Yes | Template to use: `invoice` for the latest version, or `invoice@3` to pin version 3. Pin the version in anything you ship — a new version changes the output and the cache key. Call list_templates to see what this account has. | |
| webhook_url | No | Absolute https URL to POST the finished render to. Supplying one forces the queued path: the call returns immediately with status `queued`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description discloses caching and determinism, succeeded vs. queued statuses, billing behavior, and the trial-token minting side effect. It also clarifies that cache hits are free and instant, which is materially useful for an agent deciding whether and how to invoke the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tightly organized, front-loading the core action and then layering sync/async behavior, caching, billing, and auth. Every sentence carries operational value and none merely repeats the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool does, what response statuses to expect, how to retrieve async results, billing consequences, caching semantics, and how authentication starts. This is enough for an agent to invoke it correctly without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds meaningful cross-parameter context: webhook_url and async drive the queued path, options and template version participate in the cache key, and large payloads trigger async handling. This goes beyond the schema without replacing it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise action and resource: render a template plus JSON payload into PDF, PNG, or JPG and return a signed URL. It also distinguishes itself by calling out that this is the one tool most calls need, separating it from siblings like get_render, get_template, and validate_data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing guidance: use get_render for queued jobs, get_template for schemas, validate_data for dry-runs, and list_templates to discover templates. It also explains when async/webhook forces the queued path, so an agent knows how to choose between this tool and alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_templatePublish a new template versionAInspect
Publish a new immutable version of an existing template. Versions are never edited in place: invoice@2 keeps rendering exactly as it did, and anything pinned to it is unaffected. Renders cached against the old version stay valid, and the new version starts with a cold cache. engine, schema, options and example are inherited from the previous version unless you send them, so a source-only change needs only template and source. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| engine | No | Engine for the new version. Inherited from the previous version when omitted. | |
| schema | No | JSON Schema for the `data` payload. Inherited from the previous version when omitted — send `{}` only if you really want a version that validates nothing. | |
| source | Yes | One self-contained HTML document with inline CSS and Liquid expressions (`{{ customer.name }}`, `{% for line in line_items %}`). No file includes: everything the render needs must be in this string, or at a public https URL. Two extra filters ship by default: `money` and `date_medium`. For a PDF, use `@page { size: Letter; margin: 18mm }` to control pagination. | |
| example | No | A payload that renders correctly under the new version. Inherited when omitted. | |
| message | No | Change note for this version, like a commit message. | |
| options | No | Default render options. Inherited from the previous version when omitted. | |
| template | Yes | Name of an existing template. A new immutable version is published; earlier versions keep rendering, so anything pinned to `name@2` is unaffected. | |
| description | No | Replaces the template description. | |
| expected_pages | No | How many PDF pages a typical payload renders. Inherited from the previous version when omitted. This is the estimate the free tier and the spend cap are checked against before the render starts, so a template that runs to several pages must say so or a render that cannot fit the allowance will be started and then go over. It is not a limit: the render is billed on the pages it actually produced. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only mark it as non-read-only, non-destructive, and open-world), the description discloses key behavioral traits: immutability, cache behavior (old cache remains valid, new version starts cold), inheritance rules for optional fields, and that the operation is free. This is substantive context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both dense with information. The first sentence states the core purpose and immutability; the second covers cache, inheritance, and minimal usage. No filler or repetition of schema content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a publish operation with no output schema, the description covers the critical behaviors (immutability, cache, inheritance, cost) and the schema documents all parameters thoroughly. The only minor gap is the absence of any mention of what the response contains or what happens on invalid template names, but these are not blockers for correctly invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by summarizing the inheritance pattern (engine, schema, options, example are inherited) and showing how that reduces the required parameter set. It does not add per-parameter details beyond schema, but the combined guidance is helpful.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Publish') and resource ('new immutable version of an existing template'), making it immediately distinct from create_template. It also clarifies the versioning model ('invoice@2 keeps rendering exactly as it did'), which eliminates ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies when to use this tool (for existing templates) and gives practical guidance on minimal calls ('a source-only change needs only template and source'). However, it does not explicitly name alternatives or state when not to use it, such as 'use create_template for a new template'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
usageUsage and limitsARead-onlyInspect
What this account has spent this period and what is left: renders, billable units by format, cost, the free-tier allowance, the monthly spend cap and — on a keyless trial — how many of the 50 trial renders remain. Check it before a large batch. Free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the readOnlyHint annotation by detailing what the report contains and noting that it is free to call. It does not describe response format or potential pagination, but the annotations already signal safety and open-world output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences each carry purpose: what the tool reports, when to use it, and the cost implication. The first sentence is dense with an em-dash and a long list, but it is still readable and front-loads the core 'what you have spent and what is left' message.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only usage report with readOnlyHint and openWorldHint already set, the description covers everything an agent needs: the report's contents, the recommended timing, and that it is free. No output schema exists, but the description sufficiently describes the returned information without needing to enumerate fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the input schema is fully complete by default. The description adds value by explaining what data the report exposes, which is more than the schema can convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as an account usage and limits report, enumerating what it covers: renders, billable units, cost, free-tier allowance, monthly spend cap, and trial render count. The imperative 'Check it' makes the read action explicit, and this is clearly distinct from the sibling creation, rendering, and template tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a specific trigger for use: 'Check it before a large batch.' This is clear contextual guidance, though it does not explicitly name alternatives or state when not to use the tool. The sibling list contains no overlapping read-only usage tool, so the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_dataValidate a payload against a templateARead-onlyInspect
Dry-run a data payload against a template's JSON Schema and get back exactly the errors a render would raise — field path, expected type, what was received and a value that would be accepted. Costs nothing and renders nothing. Use it before a batch, or whenever you are assembling a payload from somewhere you do not control.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | The payload you intend to render. Checked against the template's JSON Schema and nothing else. | |
| template | Yes | Template to use: `invoice` for the latest version, or `invoice@3` to pin version 3. Pin the version in anything you ship — a new version changes the output and the cache key. Call list_templates to see what this account has. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the agent knows it's a safe, non-mutating operation. The description adds valuable context: it costs nothing, renders nothing, and returns specific error details (field path, expected type, received value, accepted value). This goes beyond the annotations and helps the agent understand the tool's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded. The first sentence states the core function and output. The second sentence adds cost/behavior context. The third gives concrete usage guidance. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a validation tool with readOnlyHint and openWorldHint annotations, the description is quite complete. It explains the return value (errors with field path, expected type, received value, accepted value), the cost (nothing), and the usage context. It doesn't describe the exact output format, but since there's no output schema and the description already lists the error components, this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description adds meaningful context for the template parameter: how to pin versions (invoice@3) and the warning that new versions change output and cache key. It also clarifies that data is checked against the template's JSON Schema and nothing else. This adds value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: dry-run a data payload against a template's JSON Schema and return the exact errors a render would raise. It specifies the resource (template's JSON Schema) and the verb (validate/dry-run), and distinguishes it from the render tool by emphasizing it costs nothing and renders nothing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it: before a batch, or whenever assembling a payload from an untrusted source. It also implies when not to use it (when you want an actual render) by stating it renders nothing. This is clear usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
- First observed
create_account - First observed
create_template - First observed
get_render - First observed
get_template - First observed
list_renders - First observed
list_templates - First observed
render - First observed
update_template - First observed
usage - First observed
validate_data
Related MCP Connectors
Turn an HTML template plus JSON into a finished PDF: a quote, invoice, work order or certificate.
Generate PDF/DOCX/XLSX/PPTX from templates+JSON. Convert Office/HTML/MD to PDF. Universal templating
Generate HTML to PDF documents in bulk or single — raw replacements or based on conditions, loops
Render HTML, URLs, and templates to PDF. AI drafts templates and fixes them from logs.
Related MCP Servers
AlicenseAqualityBmaintenanceRenders PDFs from HTML templates or saved templates and spreadsheet data, with batch job support and document retrieval.4672 npm1MIT- AlicenseNot gradedqualityDmaintenanceEnables PDF and image generation from templates, JSON, HTML, or URLs through the PDF Gen Studio API. Supports rendering, template management, and multiple output formats.5 npm1MIT

docjet-mcpofficial
AlicenseAqualityCmaintenanceRender branded PDF documents (invoices, reports, certificates) and PNG social images directly from any MCP client using DocJet templates or raw HTML with JSON data.326 npmMIT- AlicenseAqualityCmaintenanceGenerate professional PDFs from Claude, Cursor, and other AI tools. Create invoices, contracts, reports, and certificates from templates or inline HTML markup.730 npm1MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.