mcp-registry/com.galleyrender/galley-render · v0.2.0
As of 2026-10-26 12:52 UTC, the Galleyrender Galley Render MCP server is up with a Glimind reliability score of 100/100 (grade A). Over the last 30 days it answered 100% of Glimind's liveness checks.
JSON in, PDF out. Render invoices, certificates, reports and cards from a template and a payload.
Claude Code
claude mcp add --transport http galleyrender-galley-render-mcp-server https://mcp.galleyrender.com/mcp
Claude Desktop · Windsurf · Cline (mcpServers JSON)
{
"mcpServers": {
"galleyrender-galley-render-mcp-server": {
"type": "http",
"url": "https://mcp.galleyrender.com/mcp"
}
}
}
Third-party server, listed as discovered. Review its source before installing.
2 tool definition(s) exceed ~1,200 tokens each (largest: create_template, ~1,393).
Move long reference material out of descriptions (link a doc or expose a resource), drop repeated examples, and collapse large enums. Trimming these to ~600 tokens saves ~1,471 tokens every session. How to fix →
4 tool(s) have parameters with no type (no type/enum/anyOf/$ref).
Give every parameter a "type" (or "enum"/"anyOf"). Untyped parameters make models guess — strings for numbers, objects for arrays. How to fix →
1 tool(s) look like they change state (create/send/delete/pay…) but declare no destructiveHint.
Set annotations {"readOnlyHint": false, "destructiveHint": true|false, "idempotentHint": …}. Clients use these to ask the user before a side effect and to auto-approve safe reads. How to fix →
No tool declares an outputSchema.
Declare outputSchema and return structuredContent (MCP 2025-06-18+). Agents can then parse results without guessing, and chain tools reliably. How to fix →
In the last 30 days: 0 tool(s) removed and 2 schema change(s).
Add new tools or optional parameters instead of renaming or removing; deprecate first (say so in the description) and remove later. Agents cache tool contracts. How to fix →
Paste-ready definitions with the problems above fixed. Changes marked verify need a human look. All of them as JSON: /v1/readiness/mcp-registry%2Fcom.galleyrender%2Fgalley-render/fixes
{
"name": "create_template",
"description": "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, but each plan keeps a limited number of templates of your own (the starter library never counts): at the limit this returns `plan_required` with how many the account has, and `update_template` still works.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"source"
],
"properties": {
"name": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9._-]{0,62}$",
"examples": [
"invoice",
"delivery-note"
],
"description": "Template name: lowercase letters, digits, dot, dash or underscore, 1-63 characters. Unique per account. Versions are separate — do not put `@1` here."
},
"engine": {
"enum": [
"chromium",
"satori"
],
"type": "string",
"description": "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": {
"type": "object",
"examples": [
{
"type": "object",
"required": [
"title"
],
"properties": {
"title": {
"type": "string",
"description": "Headline, one line"
}
}
}
],
"description": "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`.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"source": {
"type": "string",
"examples": [
"<html><body><h1>{{ title }}</h1></body></html>"
],
"minLength": 1,
"description": "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": {
"description": "A payload that renders correctly. It is echoed back in validation errors, so include one.",
"type": "string"
},
"message": {
"type": "string",
"description": "Change note for this version, like a commit message."
},
"options": {
"type": "object",
"properties": {
"css": {
"type": "string",
"description": "Extra CSS appended after the template's own styles."
},
"scale": {
"type": "number",
"maximum": 3,
"minimum": 0.1,
"description": "Device pixel ratio for png/jpg, 0.1-3. Use 2 for retina."
},
"width": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Viewport width in px for png/jpg. Default 1200.",
"exclusiveMinimum": 0
},
"height": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Viewport height in px for png/jpg. Default 630.",
"exclusiveMinimum": 0
},
"margin": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "object",
"properties": {
"top": {
"type": [
"string",
"number"
]
},
"left": {
"type": [
"string",
"number"
]
},
"right": {
"type": [
"string",
"number"
]
},
"bottom": {
"type": [
"string",
"number"
]
}
}
}
],
"description": "PDF margins, CSS lengths in `in`, `px`, `cm` or `mm`: `18mm`, or per side. A bare number is px."
},
"quality": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "jpg only, 1-100. Default 90."
},
"full_page": {
"type": "boolean",
"description": "png/jpg: capture the whole document instead of the viewport."
},
"landscape": {
"type": "boolean",
"description": "PDF only. Default false."
},
"page_size": {
"type": "string",
"description": "PDF page size: `Letter`, `A4`, `Legal`, or `210mm x 297mm`."
},
"background": {
"type": "string",
"description": "CSS colour painted under the document, e.g. `#ffffff`."
},
"on_blocked_asset": {
"enum": [
"fail",
"skip"
],
"type": "string",
"description": "What to do when an image or font the template asks for is refused by the egress policy or fails to fetch. `fail` (the default) fails the render with `asset_blocked` naming the URL; `skip` drops the asset and renders without it. Use `skip` only for decorative assets."
},
"print_background": {
"type": "boolean",
"description": "PDF: print background colours and images. Default true."
}
},
"description": "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": {
"type": "string",
"description": "One line on what this template is for. Shown in list_templates."
},
"expected_pages": {
"type": "integer",
"maximum": 2000,
"minimum": 1,
"description": "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."
}
}
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
},
"title": "Create a template"
}{
"name": "render",
"description": "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.\n\nSmall 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.\n\nRenders are deterministic and cached: the same template version, data and options return the stored object with `cached: true`, free and ",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"template",
"data"
],
"properties": {
"data": {
"description": "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. If get_template shows a `lang` property in the schema, add `lang` (a BCP 47 tag such as `fi` or `pt-BR`) for the reader's language, and `labels` (key to text) to reword single strings. Do not send them to a template whose schema lacks them: they are unknown fields there (a warning on an open schema, a 422 on a closed one).",
"type": "string"
},
"async": {
"type": "boolean",
"description": "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": {
"enum": [
"pdf",
"png",
"jpg",
"jpeg"
],
"type": "string",
"description": "Output format. Defaults to `pdf` for chromium templates and `png` for satori ones. `webp` is not supported in v1."
},
"options": {
"type": "object",
"properties": {
"css": {
"type": "string",
"description": "Extra CSS appended after the template's own styles."
},
"scale": {
"type": "number",
"maximum": 3,
"minimum": 0.1,
"description": "Device pixel ratio for png/jpg, 0.1-3. Use 2 for retina."
},
"width": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Viewport width in px for png/jpg. Default 1200.",
"exclusiveMinimum": 0
},
"height": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Viewport height in px for png/jpg. Default 630.",
"exclusiveMinimum": 0
},
"margin": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "object",
"properties": {
"top": {
"type": [
"string",
"number"
]
},
"left": {
"type": [
"string",
"number"
]
},
"right": {
"type": [
"string",
"number"
]
},
"bottom": {
"type": [
"string",
"number"
]
}
}
}
],
"description": "PDF margins, CSS lengths in `in`, `px`, `cm` or `mm`: `18mm`, or per side. A bare number is px."
},
"quality": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "jpg only, 1-100. Default 90."
},
"full_page": {
"type": "boolean",
"description": "png/jpg: capture the whole document instead of the viewport."
},
"landscape": {
"type": "boolean",
"description": "PDF only. Default false."
},
"page_size": {
"type": "string",
"description": "PDF page size: `Letter`, `A4`, `Legal`, or `210mm x 297mm`."
},
"background": {
"type": "string",
"description": "CSS colour painted under the document, e.g. `#ffffff`."
},
"on_blocked_asset": {
"enum": [
"fail",
"skip"
],
"type": "string",
"description": "What to do when an image or font the template asks for is refused by the egress policy or fails to fetch. `fail` (the default) fails the render with `asset_blocked` naming the URL; `skip` drops the asset and renders without it. Use `skip` only for decorative assets."
},
"print_background": {
"type": "boolean",
"description": "PDF: print background colours and images. Default true."
}
},
"description": "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": {
"type": "string",
"examples": [
"invoice",
"invoice@3"
],
"minLength": 1,
"description": "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": {
"type": "string",
"examples": [
"https://example.com/hooks/galley"
],
"description": "Absolute https URL to POST the finished render to. Supplying one forces the queued path: the call returns immediately with status `queued`."
}
}
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
},
"title": "Render a document"
}{
"name": "update_template",
"description": "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.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"template",
"source"
],
"properties": {
"engine": {
"enum": [
"chromium",
"satori"
],
"type": "string",
"description": "Engine for the new version. Inherited from the previous version when omitted."
},
"schema": {
"type": "object",
"examples": [
{
"type": "object",
"required": [
"title"
],
"properties": {
"title": {
"type": "string",
"description": "Headline, one line"
}
}
}
],
"description": "JSON Schema for the `data` payload. Inherited from the previous version when omitted — send `{}` only if you really want a version that validates nothing.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"source": {
"type": "string",
"examples": [
"<html><body><h1>{{ title }}</h1></body></html>"
],
"minLength": 1,
"description": "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": {
"description": "A payload that renders correctly under the new version. Inherited when omitted.",
"type": "string"
},
"message": {
"type": "string",
"description": "Change note for this version, like a commit message."
},
"options": {
"type": "object",
"properties": {
"css": {
"type": "string",
"description": "Extra CSS appended after the template's own styles."
},
"scale": {
"type": "number",
"maximum": 3,
"minimum": 0.1,
"description": "Device pixel ratio for png/jpg, 0.1-3. Use 2 for retina."
},
"width": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Viewport width in px for png/jpg. Default 1200.",
"exclusiveMinimum": 0
},
"height": {
"type": "integer",
"maximum": 9007199254740991,
"description": "Viewport height in px for png/jpg. Default 630.",
"exclusiveMinimum": 0
},
"margin": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "object",
"properties": {
"top": {
"type": [
"string",
"number"
]
},
"left": {
"type": [
"string",
"number"
]
},
"right": {
"type": [
"string",
"number"
]
},
"bottom": {
"type": [
"string",
"number"
]
}
}
}
],
"description": "PDF margins, CSS lengths in `in`, `px`, `cm` or `mm`: `18mm`, or per side. A bare number is px."
},
"quality": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "jpg only, 1-100. Default 90."
},
"full_page": {
"type": "boolean",
"description": "png/jpg: capture the whole document instead of the viewport."
},
"landscape": {
"type": "boolean",
"description": "PDF only. Default false."
},
"page_size": {
"type": "string",
"description": "PDF page size: `Letter`, `A4`, `Legal`, or `210mm x 297mm`."
},
"background": {
"type": "string",
"description": "CSS colour painted under the document, e.g. `#ffffff`."
},
"on_blocked_asset": {
"enum": [
"fail",
"skip"
],
"type": "string",
"description": "What to do when an image or font the template asks for is refused by the egress policy or fails to fetch. `fail` (the default) fails the render with `asset_blocked` naming the URL; `skip` drops the asset and renders without it. Use `skip` only for decorative assets."
},
"print_background": {
"type": "boolean",
"description": "PDF: print background colours and images. Default true."
}
},
"description": "Default render options. Inherited from the previous version when omitted."
},
"template": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9._-]{0,62}$",
"examples": [
"invoice",
"delivery-note"
],
"description": "Name of an existing template. A new immutable version is published; earlier versions keep rendering, so anything pinned to `name@2` is unaffected."
},
"description": {
"type": "string",
"description": "Replaces the template description."
},
"expected_pages": {
"type": "integer",
"maximum": 2000,
"minimum": 1,
"description": "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."
}
}
},
"annotations": {
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
},
"title": "Publish a new template version"
}Get an email or webhook when this server's readiness drops by 10+ points, tool-poisoning text appears, or a tool breaks:
curl -X POST https://glimind.com/v1/subscriptions -H 'content-type: application/json' -d '{"tools":["mcp-registry/com.galleyrender/galley-render"],"email":"[email protected]"}'Agents: watch_tool({"toolId": "mcp-registry/com.galleyrender/galley-render"}) over MCP.
create_template ~1,393 tokensupdate_template ~1,278 tokensrender ~1,132 tokensimport_document ~650 tokensanswer_import ~487 tokensStatic checks of the advertised tools/list (schema, descriptions, annotations, tool-poisoning patterns, names, size) plus observed protocol, uptime, latency and contract changes. Read-only: no tool is ever called. Weights: schema 15, docs 20, safety 15, efficiency 15, compatibility 15, protocol 5, reliability 10, stability 5. Token counts are estimates (~3.6 characters per token).
Operator? Fix these, then re-check live. Embed the readiness badge:
[](https://glimind.com/server/mcp-registry%2Fcom.galleyrender%2Fgalley-render?ref=badge)
<a href="https://glimind.com/server/mcp-registry%2Fcom.galleyrender%2Fgalley-render?ref=badge"><img src="https://glimind.com/v1/readiness/badge/mcp-registry%2Fcom.galleyrender%2Fgalley-render.svg" alt="MCP agent-readiness"></a>
.. image:: https://glimind.com/v1/readiness/badge/mcp-registry%2Fcom.galleyrender%2Fgalley-render.svg :target: https://glimind.com/server/mcp-registry%2Fcom.galleyrender%2Fgalley-render?ref=badge :alt: MCP agent-readiness
Glimind records every version of this server's tool definitions in a signed, append-only transparency log. Current manifest sha256:a4acf732a2bb0c53…, first seen 2026-10-17, included at leaf 615 of 72,943. Version history · verify what your client received.
Compare: most reliable other servers · most reliable payments servers · most reliable productivity servers · most reliable media servers · most reliable knowledge servers
Glimind tells agents whether a server is up right now and how to call it, then fails over to a live alternative when it isn't.
Claude Code
claude mcp add --transport http glimind https://glimind.com/mcp
Claude Desktop · Windsurf · Cline (mcpServers JSON)
{
"mcpServers": {
"glimind": {
"type": "http",
"url": "https://glimind.com/mcp"
}
}
}
As of 2026-10-26 12:52 UTC, the Galleyrender Galley Render MCP server is up with a Glimind reliability score of 100/100 (grade A). Over the last 30 days it answered 100% of Glimind's liveness checks.
Galleyrender Galley Render MCP server advertises 20 tools, including answer_import, billing_portal, create_account, create_template, get_import.
Point your MCP client at this streamable-http endpoint: https://mcp.galleyrender.com/mcp
Glimind scanned all 20 tool definitions for tool-poisoning patterns — hidden or invisible characters, instructions that override the model, concealment from the user, requests to read credential or MCP config files, conversation exfiltration and cross-tool shadowing — and found none. This checks what the server tells the model, not what its code does; review the source before granting access to sensitive data.
Status page: 90-day uptime, every outage and how long it lasted.
Claim this listing to get the Verified operator marker, a remediation checklist and owner analytics, or embed the live badge from any of the tool pages above. Maintainers: alerts, deploy attestation and monthly reports.
Status is an automated estimate from Glimind's liveness checks (handshake and tool listing only; no tool is ever called) and may lag or differ from your network. Glimind is not affiliated with this server or its operator. Operator? Request a correction or opt out at https://glimind.com/opt-out.