MCP server for terminal commands, file operations, and process management
Galley Render is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
JSON in, PDF out. Render invoices, certificates, reports and cards from a template and a payload.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http galley-render-mcp https://mcp.galleyrender.com/mcp
# 2 — ask your agent for something these tools do
# list_templates, get_template, create_template and 17 more
Galley Render costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http galley-render-mcp https://mcp.galleyrender.com/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
20 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
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. Each template says where it came from in origin: library (a starter), import (made from the person's own document by impo
No parameter schema on file.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template | string | 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 se |
| include_source | boolean | no | Include the HTML source in the response. Default true. Set false when you only need the schema. |
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 r
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Template name: lowercase letters, digits, dot, dash or underscore, 1-63 characters. Unique per account. Versions are separate — do not put @1 here. |
| source | string | 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, o |
| engine | string | 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 cost |
| schema | object | 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 in |
| options | object | 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. |
| expected_pages | integer | 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 mus |
| example | no | A payload that renders correctly. It is echoed back in validation errors, so include one. | |
| description | string | no | One line on what this template is for. Shown in list_templates. |
| message | string | no | Change note for this version, like a commit message. |
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
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template | string | yes | Name of an existing template. A new immutable version is published; earlier versions keep rendering, so anything pinned to name@2 is unaffected. |
| source | string | 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, o |
| engine | string | no | Engine for the new version. Inherited from the previous version when omitted. |
| schema | object | 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. |
| options | object | no | Default render options. Inherited from the previous version when omitted. |
| expected_pages | integer | 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 |
| example | no | A payload that renders correctly under the new version. Inherited when omitted. | |
| description | string | no | Replaces the template description. |
| message | string | no | Change note for this version, like a commit message. |
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. warnings lists fields the template would not use, each with a `did_you
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template | string | 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 se |
| data | yes | The payload you intend to render. Checked against the template's JSON Schema; fields it does not use come back in warnings, not as errors. lang and labels at the root are honoured only if the te |
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:
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template | string | 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 se |
| 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. If get_template shows a lang property in the schema, add `la | |
| format | string | no | Output format. Defaults to pdf for chromium templates and png for satori ones. webp is not supported in v1. |
| options | object | 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. |
| webhook_url | string | no | Absolute https URL to POST the finished render to. Supplying one forces the queued path: the call returns immediately with status queued. |
| async | boolean | 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. |
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 last an hour, the stored file lasts until the render's expires_at (the plan's retention). Past expires_at the file is deleted and this returns retention_expired (410) with the render and the template version to render again. Free
| Parameter | Type | Required | Notes |
|---|---|---|---|
| render_id | string | yes | Render id from a previous render call, e.g. rnd_…. Returns the status and a fresh signed URL. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | How many to return, newest first. 1-100, default 25. |
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 much of the trial's 10 PDF pages or 10 images remains. Check it before a large batch. Free.
No parameter schema on file.
Get a Stripe Checkout link for a paid plan, for a human to open. This tool cannot subscribe anybody. It returns a url; a person has to open it and enter a card on Stripe's own page. Hand the URL to the human you are working for and say what it costs. Nothing is charged, and no plan changes, until they finish on that page — at which point Stripe tells Galley and the new plan is live within a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| plan | string | yes | Which paid plan to subscribe to. Solo $5/mo (200 PDF pages or 500 images, webhooks, cloud delivery), Starter $19/mo (2,000 PDF pages or 5,000 images), Growth $79/mo (12,000 PDF pages or 30,000 images, |
| interval | string | no | Billing interval. Default month. year is ten months for twelve on every plan. |
Get a link to the Stripe customer portal, for a human to open: change plan, update the card, download invoices, or cancel. This is the only way any of those happen. Galley's API cannot change or cancel a subscription and cannot issue a refund — deliberately — so if you are asked to downgrade or cancel, the answer is this link and a human on the other end of it. The link is single-use and short-li
No parameter schema on file.
The account this connection is acting on: its id, its plan, how many PDF pages or images its trial or free tier has left (renders_remaining, one per page or image), and — the part no other tool answers — how this request authenticated: header (a key on the HTTP connection), binding (this client was linked with link_account), or trial (the keyless trial). Call it before a batch, and
No parameter schema on file.
Point this MCP client at an account you already have, so header-less calls from it stop spending the keyless trial. This is for clients that cannot set HTTP headers — Claude.ai custom connectors and ChatGPT apps. If your client *can* set a header, prefer that: it is per-connection, it is not tied to a network address, and it needs no tool call at all. **Only a client with an identity of its
| Parameter | Type | Required | Notes |
|---|---|---|---|
| api_key | string | no | A Galley API key, starting glr_sk_. It is checked against the API and then discarded — the binding that is stored is by account id, and this server keeps no copy of the key. Give either this or `lin |
| link_code | string | no | The one-time code mailed to the account's address, like GLR-4F7K-9QX2. Ten minutes, one use. Ask for one by calling create_account with the address: if it already has an account, a code is what co |
Undo link_account. The binding is deleted and the key that was minted for this client is revoked, so the client can no longer reach the account. Your own API key is untouched — this disconnects a client, it does not close an account. Do this on any machine that is not yours, and whenever a personal connector URL or a client id may have been seen by somebody else. Calls afterwards fall back to t
No parameter schema on file.
Get a fresh API key for the account this connection is already acting on — the answer to a key that has been lost, leaked, pasted into a chat window, or left on a machine that is not yours. Two calls, on purpose. rotate_key({}) mints the new key and shows it once; it revokes nothing, so whatever is running on the old key keeps running. Give the new key to the person, wait until they tel
| Parameter | Type | Required | Notes |
|---|---|---|---|
| confirm_saved | boolean | no | Leave this off for the first call: it mints the new key and shows it once, and revokes nothing. Set it to true — together with revoke_key_id — only after the human has told you they have saved the |
| revoke_key_id | string | no | The id of the key to revoke, taken from other_live_keys in the first call's answer. Required with confirm_saved. Never guess one: revoking the wrong key takes down whatever was using it. |
Turn the keyless trial into a real account and get a permanent API key. Call it once with an email. A link is mailed to that address and the tool returns status: "pending_verification" with a four-character request_code. Tell the person the code. The link opens a page that names who asked, when, and the code, and nothing happens until the person answers it: they confirm the request only i
| Parameter | Type | Required | Notes |
|---|---|---|---|
| string | 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. If this address already has a Galley a | |
| name | string | no | Account name. Defaults to the local part of the email. |
Turn a document the person already sends — their invoice, letterhead, minutes, a form — into a Galley template that reproduces its look, with a JSON Schema you can fill. PDF only (exported from the program that made it, not a scan), up to 10 pages and 20 MB. Getting the file to Galley — send exactly one: - upload: true, the usual answer in a chat. A file the person dropped into the conversa
| Parameter | Type | Required | Notes |
|---|---|---|---|
| upload | boolean | no | true for a one-time upload link (15 minutes, one use) to give the person, plus a curl line for an agent with a shell. The usual choice in a chat: a file someone dropped into the conversation reaches |
| file_url | string | no | A public https link to the PDF, such as a share link the person pasted. Fetched once, up to 20 MB, from public addresses only. |
| file_base64 | string | no | The PDF's bytes, base64, at most 5 MB decoded. Only for a client that already holds the bytes in code. A model writing base64 out spends roughly a token for every two or three characters — a 100 KB PD |
| name | string | no | Name for the template this import will save as, e.g. ashcroft-invoice. Optional: save_import can name it too, and the draft proposes one. |
| hint | string | no | What kind of document this is, if you know: invoice, quote, meeting-minutes, letterhead… A hint for the classifier, never a command; it does not change what the page says. |
| auto | boolean | no | Skip the questions: every one takes its recommended answer. Default false. Use it only when the person has said they do not want to be asked. |
The state of a document import and what to do next (next_step). Poll it after import_document and after answer_import. - awaiting_answers: up to three questions, each with its options, the recommended one, and its evidence — the words on the page (evidence.text) and an image of the region. The rule for who answers: answer a question yourself when the evidence decides it (a paragraph of paym
| Parameter | Type | Required | Notes |
|---|---|---|---|
| import_id | string | yes | The import's id, from import_document: imp_…. |
| include_draft | boolean | no | Also return the draft template — HTML source, JSON Schema, example payload — when the import is ready. Default false. Ask for it only to edit the draft and create_template it yourself: it is the per |
Answer the questions get_import shows on an import in awaiting_answers. Each answer is one of its question's option values — nothing else is accepted — plus path, a lowercase dotted field name such as payment_terms, when the answer makes a paragraph a field. Who answers: answer a question yourself when the evidence decides it (a paragraph of payment terms is field_with_default; a table wi
| Parameter | Type | Required | Notes |
|---|---|---|---|
| import_id | string | yes | The import's id, from import_document: imp_…. |
| answers | array | no | Every answer, in one call. A question left out takes its recommended answer; an empty list takes them all. |
Save a ready import as a template on this account, once the person has seen the preview and says it is right. Returns the template's ref (name@1), its fields, and how to render it. name defaults to the one import_document was given, then the draft's own. It counts against the plan's template limit like any template of the account's own (plan_required at the limit). Saving again returns the
| Parameter | Type | Required | Notes |
|---|---|---|---|
| import_id | string | yes | The import's id, from import_document: imp_…. |
| name | string | no | Template name. Defaults to the name import_document was given, then the draft's own. Must be free on this account. |
| description | string | no | One line on what the template is for. Shown in list_templates. |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Galley Render or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 0.2.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Galley Render can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.