目录 / Galley Render
MCP
鉴权未知
未评级
已上架
Galley Render
Galley Render turns a template and a JSON payload into a PDF, PNG or JPG behind a signed URL. Every render is deterministic and cached, so the same input always returns the same file and an identical repeat call costs nothing. Templates are code: HTML with a small expression language, versioned like git, each carrying a JSON Schema that is the contract for its data. The hosted MCP server gives an agent sixteen tools and a trial of 10 PDF pages or 10 images that needs no signup, no key and no card.
该来源不提供完整文件导出(国内平台多为平台内托管),仅存元数据与原链
接入信息
- 传输形态
- http
- 鉴权方式
- 鉴权未知
- 端点
https://galley-render--muellermr.run.tools
鉴权方式未标注,请核对官方文档后再接入——不要直接使用以下片段
{
"mcpServers": {
"Galley Render": {
"url": "https://galley-render--muellermr.run.tools"
}
}
}
能力清单
| 工具 | 说明 |
|---|---|
| list_templates | 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. |
| get_template | 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. |
| create_template | 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. |
| update_template | 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. |
| validate_data | 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. |
| render | 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 per PNG or JPG and per PDF page; cache hits are never billed. No API key needed to start — the first call mints a trial of 10 PDF pages or 10 images and returns its token. |
| get_render | 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, and never re-renders. |
| list_renders | 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. |
| usage | 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. |
| upgrade | 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 second or two. Confirm with `usage`. Use it when a render was refused with `quota_exceeded`, or with `plan_required` because the account is on Free and asked for webhooks or cloud delivery. The error body names the plan that would have worked. The account needs a verified email address first — invoices and receipts go to it — so call `create_account` before this if you are on the keyless trial. Changing or cancelling an existing plan is `billing_portal`, never this. Free. **If billing is not enabled on the deployment this is pointed at, the call is refused with `billing_unavailable` (503) rather than answered with a link.** That is deliberate: the alternative is a URL on a domain that does not resolve, which you cannot tell apart from a real one. On that error, say so and point the human at https://galleyrender.com/pricing. Do not construct a checkout URL yourself and do not retry. |
| billing_portal | 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-lived, so fetch a fresh one rather than storing it. Only works once the account has subscribed at least once; before that, use `upgrade`. Free. **If billing is not enabled on the deployment this is pointed at, the call is refused with `billing_unavailable` (503) rather than answered with a link.** Say so and point the human at support@galleyrender.com. Do not construct a portal URL yourself and do not retry. |
| whoami | 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 call it the moment anything about quota surprises you. A `quota_exceeded` that quotes a limit you do not recognise almost always means `trial`: the key never reached this server, and the renders are coming out of a throwaway account rather than yours. Free, and it renders nothing. |
| link_account | 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 own can be linked.** A connector added with the shared URL and no client id is recognised by its IP address and User-Agent, and every user of a hosted connector shares those: they call from their vendor's servers. Linking that would link all of them, so it is refused. Add this server with a personal URL instead — `https://mcp.galleyrender.com/mcp/c/<id>`, with a random `<id>` of your own (https://galleyrender.com/docs/connect makes one) — or send `X-Galley-Client-Id` with at least 128 random bits, then link. Two ways to prove the account is yours. `api_key`, if you have the key to hand. Or `link_code`, the one-time code mailed to the account's own address — call `create_account` with that address to have one sent, and nobody has to paste a key into a chat window. Either way the credential is used once, checked, and dropped: what is stored is the account id and a key minted for this client, which `unlink_account` revokes. **Whoever has the client id acts as the account.** A personal connector URL or a client id header is a credential once linked: keep it like a key, and `unlink_account` when you are done on a machine that is not yours. Free. |
| unlink_account | 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 the keyless trial. Safe to call when nothing is linked. Free. |
| rotate_key | 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 tell you it is saved, then call `rotate_key({ confirm_saved: true, revoke_key_id: "…" })` with the id from `other_live_keys` to kill the old one. Revoking first would take their integration down between the two calls, and revoking without asking would do it without them knowing why. **The key is shown once and cannot be recovered.** Hand it over immediately and do not repeat it in any later message, summary, log or file. Needs a key on the connection or a linked client — it cannot help somebody holding nothing. That case starts at `create_account` with the account's verified address, which mails a one-time code for `link_account`. Free, and it renders nothing. |
| create_account | 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 if it shows the code you gave them. After they confirm, call this again with the same email, from this same client, and it returns the API key, once. The key goes only to the client whose request was confirmed, and that client is then bound to the account, so a connector that cannot send headers is connected from then on. **A client with no identity of its own can't be handed the key** (`can_receive_key: false`). That is any client that sent no key and no client id — every hosted connector added with the shared URL, because they all call from their vendor's servers. Its person verifies the address on the page and sees the key there, once. To use the account from such a connector afterwards, add it with a personal URL (`https://mcp.galleyrender.com/mcp/c/<id>`). If the person says the request wasn't theirs, it is cancelled, this returns `status: "declined"`, and the address can't be asked about again from this client for a day. **If that address already has an account, no second one is made, and no key comes back.** You get `status: "existing_account"`, `verified: false`, `existing_account: true`, and a one-time code in the post — hand that code to `link_account` and this client is connected to the account that already exists. Use this rather than inventing a second address: two accounts means two free tiers and two sets of templates, and the renders anyone is waiting for are on the first one. A key on the connection changes this only if it is a live key for that same account. When the person confirms this client's request, this client's trial is upgraded in place, so templates and renders made during the trial are kept. The free tier is 5 PDF pages or 5 images a month; Solo is $5 a month for 200 PDF pages or 500 images. Pricing: https://galleyrender.com/pricing. Store the key as a secret — it is shown only on that one call. |
纠错与举报(发现条目失效、署名有误或涉及侵权?)
提交举报 / 纠错
侵权举报经核验成立后,我们会即时下线该条目并删除已存的内容副本。