{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_rf9uvuvd8ur9","handle":"galley-render","url":"https://wellknown.network/agents/galley-render","links":{"self":"https://wellknown.network/agents/galley-render/record.json","html":"https://wellknown.network/agents/galley-render","markdown":"https://wellknown.network/agents/galley-render/record.md","api":"https://wellknown.network/api/v1/agents/galley-render","status":"https://wellknown.network/api/v1/agents/galley-render/status","claim":"https://wellknown.network/agents/galley-render/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/galley-render/claim.json","badge":"https://wellknown.network/agents/galley-render/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/galley-render/history","tools":"https://wellknown.network/api/v1/agents/galley-render/tools"},"ard":{"identifier":"urn:air:mcp.galleyrender.com:server:galley-render","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Galley Render","summary":"JSON in, PDF out. Render invoices, certificates, reports and cards from a template and a payload.","description":"JSON in, PDF out. Render invoices, certificates, reports and cards from a template and a payload.","publisher":{"name":"com.galleyrender","url":null},"homepage":"https://galleyrender.com","repository":null,"version":"0.2.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://mcp.galleyrender.com/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-09-22T17:53:33.02823Z","publishedAt":"2026-09-22T17:53:33.02823Z","registryName":"com.galleyrender/galley-render"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"documents.invoice-processing","name":"Invoice Processing","confidence":1,"provenance":"derived"},{"slug":"commerce.payments","name":"Payments","confidence":1,"provenance":"derived"},{"slug":"ai.prompting","name":"Prompt Management","confidence":0.938,"provenance":"derived"}],"categories":["ai","commerce","documents"],"language":"fr"},"observed":{"status":"live","statusReason":"Responded 3h ago.","lastOkAt":"2026-10-12T12:27:41.545Z","lastProbedAt":"2026-10-12T12:27:41.545Z","statusComputedAt":"2026-10-12T12:28:40.714Z","reliability30d":{"probes":89,"successRate":1,"p50Ms":205,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":89,"ok":89,"authBoundaryOk":0,"serviceOk":89,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-10-12T12:27:41.545Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":220,"error":null,"detail":{"tools":[{"name":"list_templates","description":"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 "},{"name":"get_template","description":"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 co"},{"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."},{"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 "},{"name":"validate_data","description":"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 an"},{"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 a"},{"name":"get_render","description":"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 "},{"name":"list_renders","description":"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 l"},{"name":"usage","description":"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 key"},{"name":"upgrade","description":"Get a Stripe Checkout link for a paid plan, for a human to open.\n\n**This tool cannot subscribe anybody.** It returns a `url`; a person has to open it and enter "},{"name":"billing_portal","description":"Get a link to the Stripe customer portal, for a human to open: change plan, update the card, download invoices, or cancel.\n\nThis is the only way any of those ha"},{"name":"whoami","description":"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 i"},{"name":"link_account","description":"Point this MCP client at an account you already have, so header-less calls from it stop spending the keyless trial.\n\n**This is for clients that cannot set HTTP "},{"name":"unlink_account","description":"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 "},{"name":"rotate_key","description":"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"},{"name":"create_account","description":"Turn the keyless trial into a real account and get a permanent API key.\n\nCall it once with an email. A link is mailed to that address and the tool returns `stat"},{"name":"import_document","description":"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 "},{"name":"get_import","description":"The state of a document import and what to do next (`next_step`). Poll it after import_document and after answer_import.\n\n- `awaiting_answers`: up to three ques"},{"name":"answer_import","description":"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 `"},{"name":"save_import","description":"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 field"}],"toolCount":20,"toolsHash":"b9bd9c374f35660d5800020f26a5fa4e29e4f84e8f29bb5077cc045f871329c8","serverName":"galley-render","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-12T06:24:56.732Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":192,"error":null,"detail":{"tools":[{"name":"list_templates","description":"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 "},{"name":"get_template","description":"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 co"},{"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."},{"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 "},{"name":"validate_data","description":"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 an"},{"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 a"},{"name":"get_render","description":"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 "},{"name":"list_renders","description":"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 l"},{"name":"usage","description":"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 key"},{"name":"upgrade","description":"Get a Stripe Checkout link for a paid plan, for a human to open.\n\n**This tool cannot subscribe anybody.** It returns a `url`; a person has to open it and enter "},{"name":"billing_portal","description":"Get a link to the Stripe customer portal, for a human to open: change plan, update the card, download invoices, or cancel.\n\nThis is the only way any of those ha"},{"name":"whoami","description":"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 i"},{"name":"link_account","description":"Point this MCP client at an account you already have, so header-less calls from it stop spending the keyless trial.\n\n**This is for clients that cannot set HTTP "},{"name":"unlink_account","description":"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 "},{"name":"rotate_key","description":"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"},{"name":"create_account","description":"Turn the keyless trial into a real account and get a permanent API key.\n\nCall it once with an email. A link is mailed to that address and the tool returns `stat"},{"name":"import_document","description":"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 "},{"name":"get_import","description":"The state of a document import and what to do next (`next_step`). Poll it after import_document and after answer_import.\n\n- `awaiting_answers`: up to three ques"},{"name":"answer_import","description":"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 `"},{"name":"save_import","description":"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 field"}],"toolCount":20,"toolsHash":"b9bd9c374f35660d5800020f26a5fa4e29e4f84e8f29bb5077cc045f871329c8","serverName":"galley-render","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-11T23:22:38.524Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":177,"error":null,"detail":{"tools":[{"name":"list_templates","description":"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 "},{"name":"get_template","description":"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 co"},{"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."},{"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 "},{"name":"validate_data","description":"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 an"},{"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 a"},{"name":"get_render","description":"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 "},{"name":"list_renders","description":"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 l"},{"name":"usage","description":"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 key"},{"name":"upgrade","description":"Get a Stripe Checkout link for a paid plan, for a human to open.\n\n**This tool cannot subscribe anybody.** It returns a `url`; a person has to open it and enter "},{"name":"billing_portal","description":"Get a link to the Stripe customer portal, for a human to open: change plan, update the card, download invoices, or cancel.\n\nThis is the only way any of those ha"},{"name":"whoami","description":"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 i"},{"name":"link_account","description":"Point this MCP client at an account you already have, so header-less calls from it stop spending the keyless trial.\n\n**This is for clients that cannot set HTTP "},{"name":"unlink_account","description":"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 "},{"name":"rotate_key","description":"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"},{"name":"create_account","description":"Turn the keyless trial into a real account and get a permanent API key.\n\nCall it once with an email. A link is mailed to that address and the tool returns `stat"},{"name":"import_document","description":"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 "},{"name":"get_import","description":"The state of a document import and what to do next (`next_step`). Poll it after import_document and after answer_import.\n\n- `awaiting_answers`: up to three ques"},{"name":"answer_import","description":"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 `"},{"name":"save_import","description":"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 field"}],"toolCount":20,"toolsHash":"b9bd9c374f35660d5800020f26a5fa4e29e4f84e8f29bb5077cc045f871329c8","serverName":"galley-render","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-11T16:29:01.142Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":164,"error":null,"detail":{"tools":[{"name":"list_templates","description":"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 "},{"name":"get_template","description":"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 co"},{"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."},{"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 "},{"name":"validate_data","description":"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 an"},{"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 a"},{"name":"get_render","description":"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 "},{"name":"list_renders","description":"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 l"},{"name":"usage","description":"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 key"},{"name":"upgrade","description":"Get a Stripe Checkout link for a paid plan, for a human to open.\n\n**This tool cannot subscribe anybody.** It returns a `url`; a person has to open it and enter "},{"name":"billing_portal","description":"Get a link to the Stripe customer portal, for a human to open: change plan, update the card, download invoices, or cancel.\n\nThis is the only way any of those ha"},{"name":"whoami","description":"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 i"},{"name":"link_account","description":"Point this MCP client at an account you already have, so header-less calls from it stop spending the keyless trial.\n\n**This is for clients that cannot set HTTP "},{"name":"unlink_account","description":"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 "},{"name":"rotate_key","description":"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"},{"name":"create_account","description":"Turn the keyless trial into a real account and get a permanent API key.\n\nCall it once with an email. A link is mailed to that address and the tool returns `stat"},{"name":"import_document","description":"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 "},{"name":"get_import","description":"The state of a document import and what to do next (`next_step`). Poll it after import_document and after answer_import.\n\n- `awaiting_answers`: up to three ques"},{"name":"answer_import","description":"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 `"},{"name":"save_import","description":"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 field"}],"toolCount":20,"toolsHash":"b9bd9c374f35660d5800020f26a5fa4e29e4f84e8f29bb5077cc045f871329c8","serverName":"galley-render","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-11T09:26:54.734Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":293,"error":null,"detail":{"tools":[{"name":"list_templates","description":"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 "},{"name":"get_template","description":"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 co"},{"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."},{"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 "},{"name":"validate_data","description":"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 an"},{"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 a"},{"name":"get_render","description":"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 "},{"name":"list_renders","description":"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 l"},{"name":"usage","description":"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 key"},{"name":"upgrade","description":"Get a Stripe Checkout link for a paid plan, for a human to open.\n\n**This tool cannot subscribe anybody.** It returns a `url`; a person has to open it and enter "},{"name":"billing_portal","description":"Get a link to the Stripe customer portal, for a human to open: change plan, update the card, download invoices, or cancel.\n\nThis is the only way any of those ha"},{"name":"whoami","description":"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 i"},{"name":"link_account","description":"Point this MCP client at an account you already have, so header-less calls from it stop spending the keyless trial.\n\n**This is for clients that cannot set HTTP "},{"name":"unlink_account","description":"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 "},{"name":"rotate_key","description":"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"},{"name":"create_account","description":"Turn the keyless trial into a real account and get a permanent API key.\n\nCall it once with an email. A link is mailed to that address and the tool returns `stat"},{"name":"import_document","description":"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 "},{"name":"get_import","description":"The state of a document import and what to do next (`next_step`). Poll it after import_document and after answer_import.\n\n- `awaiting_answers`: up to three ques"},{"name":"answer_import","description":"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 `"},{"name":"save_import","description":"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 field"}],"toolCount":20,"toolsHash":"b9bd9c374f35660d5800020f26a5fa4e29e4f84e8f29bb5077cc045f871329c8","serverName":"galley-render","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-11T03:21:59.602Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":466,"error":null,"detail":{"tools":[{"name":"list_templates","description":"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 "},{"name":"get_template","description":"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 co"},{"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."},{"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 "},{"name":"validate_data","description":"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 an"},{"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 a"},{"name":"get_render","description":"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 "},{"name":"list_renders","description":"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 l"},{"name":"usage","description":"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 key"},{"name":"upgrade","description":"Get a Stripe Checkout link for a paid plan, for a human to open.\n\n**This tool cannot subscribe anybody.** It returns a `url`; a person has to open it and enter "},{"name":"billing_portal","description":"Get a link to the Stripe customer portal, for a human to open: change plan, update the card, download invoices, or cancel.\n\nThis is the only way any of those ha"},{"name":"whoami","description":"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 i"},{"name":"link_account","description":"Point this MCP client at an account you already have, so header-less calls from it stop spending the keyless trial.\n\n**This is for clients that cannot set HTTP "},{"name":"unlink_account","description":"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 "},{"name":"rotate_key","description":"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"},{"name":"create_account","description":"Turn the keyless trial into a real account and get a permanent API key.\n\nCall it once with an email. A link is mailed to that address and the tool returns `stat"},{"name":"import_document","description":"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 "},{"name":"get_import","description":"The state of a document import and what to do next (`next_step`). Poll it after import_document and after answer_import.\n\n- `awaiting_answers`: up to three ques"},{"name":"answer_import","description":"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 `"},{"name":"save_import","description":"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 field"}],"toolCount":20,"toolsHash":"b9bd9c374f35660d5800020f26a5fa4e29e4f84e8f29bb5077cc045f871329c8","serverName":"galley-render","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T21:25:17.394Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":172,"error":null,"detail":{"tools":[{"name":"list_templates","description":"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 "},{"name":"get_template","description":"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 co"},{"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."},{"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 "},{"name":"validate_data","description":"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 an"},{"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 a"},{"name":"get_render","description":"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 "},{"name":"list_renders","description":"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 l"},{"name":"usage","description":"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 key"},{"name":"upgrade","description":"Get a Stripe Checkout link for a paid plan, for a human to open.\n\n**This tool cannot subscribe anybody.** It returns a `url`; a person has to open it and enter "},{"name":"billing_portal","description":"Get a link to the Stripe customer portal, for a human to open: change plan, update the card, download invoices, or cancel.\n\nThis is the only way any of those ha"},{"name":"whoami","description":"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 i"},{"name":"link_account","description":"Point this MCP client at an account you already have, so header-less calls from it stop spending the keyless trial.\n\n**This is for clients that cannot set HTTP "},{"name":"unlink_account","description":"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 "},{"name":"rotate_key","description":"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"},{"name":"create_account","description":"Turn the keyless trial into a real account and get a permanent API key.\n\nCall it once with an email. A link is mailed to that address and the tool returns `stat"},{"name":"import_document","description":"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 "},{"name":"get_import","description":"The state of a document import and what to do next (`next_step`). Poll it after import_document and after answer_import.\n\n- `awaiting_answers`: up to three ques"},{"name":"answer_import","description":"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 `"},{"name":"save_import","description":"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 field"}],"toolCount":20,"toolsHash":"b9bd9c374f35660d5800020f26a5fa4e29e4f84e8f29bb5077cc045f871329c8","serverName":"galley-render","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T14:26:31.972Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":173,"error":null,"detail":{"tools":[{"name":"list_templates","description":"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 "},{"name":"get_template","description":"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 co"},{"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."},{"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 "},{"name":"validate_data","description":"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 an"},{"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 a"},{"name":"get_render","description":"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 "},{"name":"list_renders","description":"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 l"},{"name":"usage","description":"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 key"},{"name":"upgrade","description":"Get a Stripe Checkout link for a paid plan, for a human to open.\n\n**This tool cannot subscribe anybody.** It returns a `url`; a person has to open it and enter "},{"name":"billing_portal","description":"Get a link to the Stripe customer portal, for a human to open: change plan, update the card, download invoices, or cancel.\n\nThis is the only way any of those ha"},{"name":"whoami","description":"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 i"},{"name":"link_account","description":"Point this MCP client at an account you already have, so header-less calls from it stop spending the keyless trial.\n\n**This is for clients that cannot set HTTP "},{"name":"unlink_account","description":"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 "},{"name":"rotate_key","description":"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"},{"name":"create_account","description":"Turn the keyless trial into a real account and get a permanent API key.\n\nCall it once with an email. A link is mailed to that address and the tool returns `stat"},{"name":"import_document","description":"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 "},{"name":"get_import","description":"The state of a document import and what to do next (`next_step`). Poll it after import_document and after answer_import.\n\n- `awaiting_answers`: up to three ques"},{"name":"answer_import","description":"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 `"},{"name":"save_import","description":"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 field"}],"toolCount":20,"toolsHash":"8484a9fe22387ddf16847576a2f6c3aa2cbc78e9dd410812527f9a0ef90e191f","serverName":"galley-render","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T08:31:40.393Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":325,"error":null,"detail":{"tools":[{"name":"list_templates","description":"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 "},{"name":"get_template","description":"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 co"},{"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."},{"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 "},{"name":"validate_data","description":"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 an"},{"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 a"},{"name":"get_render","description":"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 "},{"name":"list_renders","description":"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 l"},{"name":"usage","description":"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 key"},{"name":"upgrade","description":"Get a Stripe Checkout link for a paid plan, for a human to open.\n\n**This tool cannot subscribe anybody.** It returns a `url`; a person has to open it and enter "},{"name":"billing_portal","description":"Get a link to the Stripe customer portal, for a human to open: change plan, update the card, download invoices, or cancel.\n\nThis is the only way any of those ha"},{"name":"whoami","description":"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 i"},{"name":"link_account","description":"Point this MCP client at an account you already have, so header-less calls from it stop spending the keyless trial.\n\n**This is for clients that cannot set HTTP "},{"name":"unlink_account","description":"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 "},{"name":"rotate_key","description":"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"},{"name":"create_account","description":"Turn the keyless trial into a real account and get a permanent API key.\n\nCall it once with an email. A link is mailed to that address and the tool returns `stat"},{"name":"import_document","description":"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 "},{"name":"get_import","description":"The state of a document import and what to do next (`next_step`). Poll it after import_document and after answer_import.\n\n- `awaiting_answers`: up to three ques"},{"name":"answer_import","description":"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 `"},{"name":"save_import","description":"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 field"}],"toolCount":20,"toolsHash":"8484a9fe22387ddf16847576a2f6c3aa2cbc78e9dd410812527f9a0ef90e191f","serverName":"galley-render","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-10T01:24:48.835Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":161,"error":null,"detail":{"tools":[{"name":"list_templates","description":"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 "},{"name":"get_template","description":"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 co"},{"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."},{"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 "},{"name":"validate_data","description":"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 an"},{"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 a"},{"name":"get_render","description":"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 "},{"name":"list_renders","description":"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 l"},{"name":"usage","description":"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 key"},{"name":"upgrade","description":"Get a Stripe Checkout link for a paid plan, for a human to open.\n\n**This tool cannot subscribe anybody.** It returns a `url`; a person has to open it and enter "},{"name":"billing_portal","description":"Get a link to the Stripe customer portal, for a human to open: change plan, update the card, download invoices, or cancel.\n\nThis is the only way any of those ha"},{"name":"whoami","description":"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 i"},{"name":"link_account","description":"Point this MCP client at an account you already have, so header-less calls from it stop spending the keyless trial.\n\n**This is for clients that cannot set HTTP "},{"name":"unlink_account","description":"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 "},{"name":"rotate_key","description":"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"},{"name":"create_account","description":"Turn the keyless trial into a real account and get a permanent API key.\n\nCall it once with an email. A link is mailed to that address and the tool returns `stat"},{"name":"import_document","description":"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 "},{"name":"get_import","description":"The state of a document import and what to do next (`next_step`). Poll it after import_document and after answer_import.\n\n- `awaiting_answers`: up to three ques"},{"name":"answer_import","description":"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 `"},{"name":"save_import","description":"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 field"}],"toolCount":20,"toolsHash":"8484a9fe22387ddf16847576a2f6c3aa2cbc78e9dd410812527f9a0ef90e191f","serverName":"galley-render","capabilities":["tools"],"serverVersion":"0.2.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"list_templates","description":"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 "},{"name":"get_template","description":"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 co"},{"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."},{"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 "},{"name":"validate_data","description":"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 an"},{"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 a"},{"name":"get_render","description":"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 "},{"name":"list_renders","description":"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 l"},{"name":"usage","description":"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 key"},{"name":"upgrade","description":"Get a Stripe Checkout link for a paid plan, for a human to open.\n\n**This tool cannot subscribe anybody.** It returns a `url`; a person has to open it and enter "},{"name":"billing_portal","description":"Get a link to the Stripe customer portal, for a human to open: change plan, update the card, download invoices, or cancel.\n\nThis is the only way any of those ha"},{"name":"whoami","description":"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 i"},{"name":"link_account","description":"Point this MCP client at an account you already have, so header-less calls from it stop spending the keyless trial.\n\n**This is for clients that cannot set HTTP "},{"name":"unlink_account","description":"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 "},{"name":"rotate_key","description":"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"},{"name":"create_account","description":"Turn the keyless trial into a real account and get a permanent API key.\n\nCall it once with an email. A link is mailed to that address and the tool returns `stat"},{"name":"import_document","description":"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 "},{"name":"get_import","description":"The state of a document import and what to do next (`next_step`). Poll it after import_document and after answer_import.\n\n- `awaiting_answers`: up to three ques"},{"name":"answer_import","description":"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 `"},{"name":"save_import","description":"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 field"}],"package":null,"toolSurface":{"id":"ts_cy7ehsjyqksz","endpointId":"ep_7bnxwthkx6v6","hash":"b9bd9c374f35660d5800020f26a5fa4e29e4f84e8f29bb5077cc045f871329c8","toolCount":20,"serverName":"galley-render","serverVersion":"0.2.0","protocolVersion":"2025-06-18","firstSeenAt":"2026-10-10T21:25:17.390Z","lastSeenAt":"2026-10-12T12:27:41.550Z","observations":7,"toolNames":["list_templates","get_template","create_template","update_template","validate_data","render","get_render","list_renders","usage","upgrade","billing_portal","whoami","link_account","unlink_account","rotate_key","create_account","import_document","get_import","answer_import","save_import"],"distinctSurfaces":9},"endpointFacts":[{"id":"ep_7bnxwthkx6v6","url":"https://mcp.galleyrender.com/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-10-10T08:31:40.403Z","auth":{"observedAt":"2026-10-10T08:31:40.718Z","authRequired":false,"scheme":null,"resourceMetadata":null,"authorizationServer":null,"conformance":{"dpop":false,"rfc8414":false,"rfc9728":false,"pkceS256":false,"clientIdMetadataDocument":false,"dynamicClientRegistration":false}},"tls":{"observedAt":"2026-10-10T08:31:40.730Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"mcp.galleyrender.com","issuer":{"commonName":"WE1","organization":"Google Trust Services"},"validFrom":"2026-09-16T15:32:20.000Z","validTo":"2026-12-15T16:32:14.000Z","daysToExpiry":64,"sanCount":1,"fingerprint256":"C8:B3:89:2A:18:1B:81:3D:78:87:B6:FC:DE:BE:AF:91:C4:92:C3:EF:46:F5:C5:BE:7B:FA:5A:C5:95:6B:26:28"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"com.galleyrender/galley-render","url":"https://registry.modelcontextprotocol.io/v0/servers/com.galleyrender%2Fgalley-render","firstSeenAt":"2026-09-18T06:21:06.707Z","fetchedAt":"2026-10-12T03:20:50.475Z","normalizedAt":"2026-10-12T03:20:50.475Z"}]},"firstSeenAt":"2026-09-18T06:21:06.707Z","updatedAt":"2026-10-12T12:29:56.688Z"}