kamy-development avatar

Kamy

kamy-development/kamy-plugin

Connects Claude to Kamy's document API for rendering PDFs, applying e-signatures, PAdES seals, and verification. The server runs at mcp.kamy.dev and requires a KAMY_API_KEY from their dashboard. Useful when you need production quality PDF generation from code, whether you're building invoice systems, contract workflows, or any app that needs signed documents with legal compliance. The plugin includes a specialized sub-agent for authoring Handlebars templates with print CSS, plus coding rules for the SDK. Works across Node, Bun, Deno, and edge runtimes if you want to use the underlying SDK directly instead of MCP.

tools
59
transport
HTTP
last updated
May 6, 2026

Install

From registry metadata
$ npx add-mcp https://mcp.kamy.dev/mcp --name kamy

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http kamy https://mcp.kamy.dev/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 59 tools

Verified live against the running server on Nov 6, 2026.

list_templatesList Kamy's public system PDF templates. No authentication required.

List Kamy's public system PDF templates. No authentication required.

No parameters. Call it with no arguments.

get_template_schemaFetch the JSON Schema (exact data shape) and a copy-pasteable sample payload for a Kamy system template by slug. Call this before render_pdf so you fill the right fields with the right types instead of guessing. No authentication required.1 params

Fetch the JSON Schema (exact data shape) and a copy-pasteable sample payload for a Kamy system template by slug. Call this before render_pdf so you fill the right fields with the right types instead of guessing. No authentication required.

Parameters* required
slug*string
Template slug — e.g. 'invoice', 'receipt', 'uae-tax-invoice'.
create_templateCreate a new custom PDF template owned by this account: a name, a unique slug, a Handlebars/HTML body, and optional CSS and JSON Schema. The slug is what render_pdf then takes as `template`. Custom templates are a paid feature — on the Free plan this returns 403 FORBIDDEN befo...8 params

Create a new custom PDF template owned by this account: a name, a unique slug, a Handlebars/HTML body, and optional CSS and JSON Schema. The slug is what render_pdf then takes as `template`. Custom templates are a paid feature — on the Free plan this returns 403 FORBIDDEN befo...

Parameters* required
cssstring
Stylesheet applied at render time. Max 1 MB.
descriptionstring
What this template is for.
html*string
Handlebars/HTML body of the document. Max 5 MB.
isPublicboolean
When true, other accounts can list and render it. Defaults to false.
name*string
Human-readable template name.
schemaobject
JSON Schema describing the data payload the template expects. Defaults to {}.
slug*string
Stable identifier the render tools take as `template`. Unique per account, and it may not collide with a built-in system slug (invoice, receipt, quote, …) — both cases are rejected with 422.
tagsarray
Up to 10 free-form labels.
update_templateEdit an existing custom template's DRAFT — name, html, css, schema, tags, visibility — addressed by UUID or slug. Only the fields you pass are changed. Crucially, this does not change what renders once the template has been published even once: while published_version is set,...8 params

Edit an existing custom template's DRAFT — name, html, css, schema, tags, visibility — addressed by UUID or slug. Only the fields you pass are changed. Crucially, this does not change what renders once the template has been published even once: while published_version is set,...

Parameters* required
cssstring
Replaces the draft CSS entirely.
descriptionstring
htmlstring
Replaces the draft HTML entirely.
isPublicboolean
namestring
schemaobject
Replaces the draft JSON Schema entirely.
tagsarray
template*string
Template UUID or slug. This route accepts either.
publish_templateMake a template version live for rendering. Called with no `version`, it snapshots the current draft into a new version and points published_version at it — this is how you ship an edit made with update_template. Called with an existing `version`, it republishes that earlier s...2 params

Make a template version live for rendering. Called with no `version`, it snapshots the current draft into a new version and points published_version at it — this is how you ship an edit made with update_template. Called with an existing `version`, it republishes that earlier s...

Parameters* required
templateId*string
Template UUID or slug — every /v1/templates route resolves either.
versioninteger
Omit to snapshot the current draft into a new version and publish that. Supply an existing version number to republish a known-good earlier snapshot, leaving the draft untouched.
rollback_templateRevert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Prefer this over publish_template's `version` argument whenever you are reverting, because only this tool takes expecte...4 params

Revert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Prefer this over publish_template's `version` argument whenever you are reverting, because only this tool takes expecte...

Parameters* required
expectedPublishedVersioninteger
Optimistic fence: the published_version you believe is live (0 if never published). The call is rejected with 409 VERSION_CONFLICT if someone moved the pointer in the meantime. Pass it whenever you...
restoreDraftboolean
When true, also overwrite the working draft (html/css/schema) with that version's content. The current draft is auto-snapshotted into a new version first, unless it is already byte-identical. Defau...
templateId*string
Template UUID or slug — every /v1/templates route resolves either.
version*integer
The known-good version to make live again. Get it from list_template_versions.
list_template_versionsList a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_template take comes from. Bodies are deliberately not included — call get_template_version when you need one snapshot...1 params

List a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_template take comes from. Bodies are deliberately not included — call get_template_version when you need one snapshot...

Parameters* required
templateId*string
Template UUID or slug — every /v1/templates route resolves either.
get_template_versionFetch one template version snapshot in full — html, css, schema, createdBy, createdAt — exactly as it was frozen when that version was cut. Use list_template_versions first to find the number. Use this to inspect what a released version actually contained, or to recover conten...2 params

Fetch one template version snapshot in full — html, css, schema, createdBy, createdAt — exactly as it was frozen when that version was cut. Use list_template_versions first to find the number. Use this to inspect what a released version actually contained, or to recover conten...

Parameters* required
templateId*string
Template UUID or slug — every /v1/templates route resolves either.
version*integer
Version number from list_template_versions.
render_pdfRender a PDF from a Kamy template and data, and wait for it. This is the default document tool: it blocks until the file exists and hands back { id, url, bytes, durationMs, templateId, createdAt } in one call, where url is a signed download link valid for one hour and id is th...3 params

Render a PDF from a Kamy template and data, and wait for it. This is the default document tool: it blocks until the file exists and hands back { id, url, bytes, durationMs, templateId, createdAt } in one call, where url is a signed download link valid for one hour and id is th...

Parameters* required
data*object
Data to populate the template
formatstring
one of a4 · letterdefault: a4
template*string
Template slug (e.g., 'invoice') or template UUID
render_docxRender an editable Word (.docx) document from a Kamy template and data. Takes the same { template, data } payload as render_pdf but produces a different container — reach for it when the recipient has to EDIT the document (legal redlines, Word-based intake, corporate templates...3 params

Render an editable Word (.docx) document from a Kamy template and data. Takes the same { template, data } payload as render_pdf but produces a different container — reach for it when the recipient has to EDIT the document (legal redlines, Word-based intake, corporate templates...

Parameters* required
dataobject
Template data, identical in shape to the render_pdf payload for the same slug — call get_template_schema first to get the exact fields.
namestring
Label stored on the render row so the document is identifiable in the dashboard.
template*string
Which built-in document to build. These five are the only slugs with a Word implementation; custom templates and other system templates are PDF-only (use render_pdf).one of invoice · receipt · quote · contract · agreement
render_pptxBuild a PowerPoint (.pptx) deck from a slide spec: an ordered array of slides, each tagged with one of five fixed layouts (title, bullets, two-column, table, quote). This is NOT a template renderer like render_pdf / render_docx — there is no template slug and no free-form layo...4 params

Build a PowerPoint (.pptx) deck from a slide spec: an ordered array of slides, each tagged with one of five fixed layouts (title, bullets, two-column, table, quote). This is NOT a template renderer like render_pdf / render_docx — there is no template slug and no free-form layo...

Parameters* required
formatstring
WIDE = 16:9 (default), STANDARD = 4:3.one of WIDE · STANDARDdefault: WIDE
slides*array
Ordered slides. Each carries a `layout` discriminator: 'title', 'bullets', 'two-column', 'table' or 'quote'. There is no free-form layout — content that doesn't fit one of the five should be reshap...
themeobject
titlestring
Deck title — used as document metadata and as the returned filename stem.
render_xlsxBuild an Excel (.xlsx) workbook from a sheet spec: columns with keys, row objects keyed to those columns, optional Excel number formats and a formula-aware total row (bare 'SUM' / 'AVG' / 'COUNT' / 'MIN' / 'MAX' expands into a real formula over the column's data range). Choose...2 params

Build an Excel (.xlsx) workbook from a sheet spec: columns with keys, row objects keyed to those columns, optional Excel number formats and a formula-aware total row (bare 'SUM' / 'AVG' / 'COUNT' / 'MIN' / 'MAX' expands into a real formula over the column's data range). Choose...

Parameters* required
sheets*array
One or more sheets, in tab order.
titlestring
Workbook title — document metadata and the returned filename stem.
render_htmlCompile a Kamy template — or raw Handlebars source you pass inline — against a data payload and get the rendered HTML string back. No browser runs, no PDF is produced and no file is stored, so this is the tool for piping a template into a transactional email provider, or for i...4 params

Compile a Kamy template — or raw Handlebars source you pass inline — against a data payload and get the rendered HTML string back. No browser runs, no PDF is produced and no file is stored, so this is the tool for piping a template into a transactional email provider, or for i...

Parameters* required
dataobject
Values substituted into the template's Handlebars expressions.
directionstring
Force the document's lang/dir attributes for RTL/bidi mail clients. 'auto' (default) leaves the template's own <html lang> untouched.one of auto · ltr · rtl
htmlstring
Raw Handlebars/HTML source to compile instead of a stored template. Supply exactly one of template or html.
templatestring
Template slug or UUID — a Kamy system template or one of your own. Supply exactly one of template or html.
convert_documentConvert a file you already hold — .docx, .xlsx or .csv — into a PDF, preserving its existing content. Pass the bytes base64-encoded together with the original filename, which is what the API uses to detect the input type. This is the inbound direction: it consumes an existing...3 params

Convert a file you already hold — .docx, .xlsx or .csv — into a PDF, preserving its existing content. Pass the bytes base64-encoded together with the original filename, which is what the API uses to detect the input type. This is the inbound direction: it consumes an existing...

Parameters* required
fileBase64*string
Base64-encoded bytes of the source file.
filename*string
Source filename including its extension — the route detects the input type from it. Must end in .docx, .xlsx or .csv.
namestring
Label for the resulting render row. Defaults to the source filename.
merge_pdfsConcatenate 2–20 existing renders into a single new PDF, in exactly the order the ids are given. Both the inputs and the output are Kamy render ids, so this is the composition step after several render_pdf / convert_document / edit_pdf calls — it cannot merge arbitrary URLs or...2 params

Concatenate 2–20 existing renders into a single new PDF, in exactly the order the ids are given. Both the inputs and the output are Kamy render ids, so this is the composition step after several render_pdf / convert_document / edit_pdf calls — it cannot merge arbitrary URLs or...

Parameters* required
namestring
Label for the merged render, e.g. 'Q3 statement bundle'.
renderIds*array
2–20 render UUIDs owned by this account, in the page order you want. Any id that isn't yours, or whose render didn't complete, fails the whole call.
split_pdfExtract page ranges from one existing render into separate new PDFs — the inverse of merge_pdfs. Each range you pass produces its own render, returned in the same order, so one call can both halve a contract and peel off single pages. Omit a range's `to` to run to the end of t...2 params

Extract page ranges from one existing render into separate new PDFs — the inverse of merge_pdfs. Each range you pass produces its own render, returned in the same order, so one call can both halve a contract and peel off single pages. Omit a range's `to` to run to the end of t...

Parameters* required
ranges*array
1–50 page ranges; each produces one output render, returned in this order. A range that starts past the last page fails the whole call.
renderId*string
UUID of the completed render to split. Must belong to this account.
edit_pdfModify an existing PDF: fill AcroForm fields by name, stamp text at absolute coordinates, or paint opaque boxes over regions. Operations apply in the order given, to either a render you own (renderId) or a PDF Kamy downloads from a public URL (pdfUrl) — supply exactly one. Use...5 params

Modify an existing PDF: fill AcroForm fields by name, stamp text at absolute coordinates, or paint opaque boxes over regions. Operations apply in the order given, to either a render you own (renderId) or a PDF Kamy downloads from a public URL (pdfUrl) — supply exactly one. Use...

Parameters* required
flattenFieldsboolean
Bake AcroForm values into the page content stream after the fill_field ops so they can no longer be edited. Leave true before e-signing. Pass false only when something downstream still needs the li...default: true
namestring
Label for the resulting render row.
operations*array
1–200 operations applied in the order given. 'fill_field' writes into an AcroForm widget; 'stamp_text' draws text at an absolute position; 'cover' paints an opaque rectangle over the region — it hi...
pdfUrlstring
Publicly fetchable URL of a PDF Kamy has never seen. Kamy downloads it, applies the operations and stores only the edited result — the source does not become a separate render, and the call costs o...
renderIdstring
UUID of an existing render owned by this account. Supply exactly one of renderId or pdfUrl.
upload_fileStore an image, font or PDF in the account's asset bucket and get back a `kamy://asset/<id>` reference you can drop anywhere inside a render_pdf / render_html data payload — Kamy swaps it for a fresh signed URL at render time. That reference is the point of this tool: it is ho...4 params

Store an image, font or PDF in the account's asset bucket and get back a `kamy://asset/<id>` reference you can drop anywhere inside a render_pdf / render_html data payload — Kamy swaps it for a fresh signed URL at render time. That reference is the point of this tool: it is ho...

Parameters* required
contentBase64string
Base64 bytes to upload. When supplied, this server PUTs them to the pre-signed URL and the asset is immediately usable. Omit for files too large to pass through a tool call — you then get uploadUrl...
contentType*string
MIME type. The API rejects anything outside this list.one of image/png · image/jpeg · image/webp · image/gif · image/svg+xml · application/pdf
filename*string
Name to store the asset under. Characters outside [A-Za-z0-9._-] are replaced with '_'.
sizeBytesinteger
Declared size in bytes. Computed automatically when contentBase64 is supplied. Max 100 MB.
get_uploadLook up a stored asset by its upload id: filename, contentType, sizeBytes, status, its `kamy://asset/<id>` reference, and a freshly signed downloadUrl valid for one hour once the bytes exist. Its main use is confirming an out-of-band transfer landed — upload_file returns uploa...1 params

Look up a stored asset by its upload id: filename, contentType, sizeBytes, status, its `kamy://asset/<id>` reference, and a freshly signed downloadUrl valid for one hour once the bytes exist. Its main use is confirming an out-of-band transfer landed — upload_file returns uploa...

Parameters* required
uploadId*string
Upload UUID returned by upload_file. The bare UUID, not the kamy://asset/... ref.
validate_payloadDry-run a render payload against a template's schema WITHOUT producing a PDF or using quota. Returns per-field self-healing errors (expected type, value received, allowed values, an example) so you can fix the data before render_pdf. Requires a Kamy API key.2 params

Dry-run a render payload against a template's schema WITHOUT producing a PDF or using quota. Returns per-field self-healing errors (expected type, value received, allowed values, an example) so you can fix the data before render_pdf. Requires a Kamy API key.

Parameters* required
data*object
The data payload to validate against the template schema.
template*string
Template slug (e.g. 'invoice') or template UUID.
extract_documentExtract structured data from a PDF (invoice, receipt, contract, ID document, or any form). Returns the parsed JSON plus a public verify URL that proves the extraction matches the source. Use this when an agent needs to read an inbound document and act on it.3 params

Extract structured data from a PDF (invoice, receipt, contract, ID document, or any form). Returns the parsed JSON plus a public verify URL that proves the extraction matches the source. Use this when an agent needs to read an inbound document and act on it.

Parameters* required
source_base64string
Base64-encoded PDF bytes. Use when the source isn't publicly fetchable.
source_urlstring
Public URL to a PDF (preferred). One of source_url or source_base64 is required.
template*string
Predefined template id. invoice/receipt for AP and POS docs, contract for legal agreements, id_document for passports/IDs, generic_form for anything else.one of invoice · receipt · contract · id_document · generic_form
ask_kamyAsk Kamy Brain a question about Kamy usage, templates, plans, or errors. Sends the question to Kamy's public assistant endpoint and returns a paragraph answer.1 params

Ask Kamy Brain a question about Kamy usage, templates, plans, or errors. Sends the question to Kamy's public assistant endpoint and returns a paragraph answer.

Parameters* required
question*string
The question to ask Kamy about — how to render a template, why a render failed, what plan to pick, etc.
create_signature_requestSend a previously rendered PDF to a signer for e-signature when a Kamy API key is configured. Without a key, returns dashboard setup instructions.14 params

Send a previously rendered PDF to a signer for e-signature when a Kamy API key is configured. Without a key, returns dashboard setup instructions.

Parameters* required
authMethodstring
Identity-verification mode. `link` (default) — possession of the secret URL is the only check. `email_otp` — sign page renders a 6-digit OTP gate; code emailed to `signerEmail`. `sms_otp` — same ga...one of link · sms_otp · email_otp
ccEmailsarray
Up to 10 observer addresses CC'd on the invite and the completion notice. Not signers themselves.
expiresIninteger
How long (seconds) the sign link stays valid. Defaults to 30 days. Min 1 hour, max 30 days.
messagestring
Optional message rendered in the email invitation body.
placedFieldsarray
Up to 100 sender-defined fillable fields stamped onto the PDF at sign time. Use for flat PDFs that don't ship AcroForm widgets. Names must be unique.
positionobject
Optional sender-chosen signature placement in PDF points (72 dpi, origin bottom-left). Defaults to bottom-right of the last page sized 220×64 pt; when omitted, the signer can drag the placeholder o...
reminderCadenceHoursinteger
When set (24–168), the auto-reminder cron resends the invite every N hours while the request stays pending, up to 3 reminders. Omit for no auto-reminders.
renderId*string
Render UUID returned by render_pdf or any /v1/render call. The render's PDF is the document the signer will receive.
requireStampboolean
Require the signer to upload a company stamp / seal alongside their personal signature (UAE, KSA, JP, KR, IN, CN B2B workflows). Server refuses to seal without one.
signOnEveryPageboolean
When true, the server stamps the signer's signature on every page of the source PDF instead of only the configured position. Common B2B contract pattern.
signatureTemplateIdstring
Apply a signature template's defaults (placedFields, position, message, expiresIn, ccEmails). Request-level fields override the template.
signerEmail*string
Recipient email address.
signerName*string
Recipient full name. Must be typed verbatim by the signer to confirm intent.
signerPhonestring
E.164 phone number. Required when `authMethod` is `sms_otp`; ignored otherwise. Example: `+14155551234`.
create_envelopeSend a single PDF to 2–10 signers as one envelope. This is the multi-signer counterpart to create_signature_request, which handles exactly one signer — the API rejects an envelope with fewer than two recipients, so pick the tool by signer count. routing 'parallel' (default) em...10 params

Send a single PDF to 2–10 signers as one envelope. This is the multi-signer counterpart to create_signature_request, which handles exactly one signer — the API rejects an envelope with fewer than two recipients, so pick the tool by signer count. routing 'parallel' (default) em...

Parameters* required
ccEmailsarray
Up to 10 observers CC'd on the invitations. Not signers.
expiresIninteger
Sign-link lifetime in seconds. Min 1 hour, max 30 days.
messagestring
Message included in every invitation email.
pdfUrlstring
Publicly fetchable PDF URL. Kamy downloads it and stores it as a render first. Supply exactly one of renderId or pdfUrl.
placedFieldsarray
Up to 100 sender-placed form fields for signers to complete.
positionobject
Default signature placement in PDF points, origin bottom-left.
previewboolean
When true, creates the envelope and returns every sign URL WITHOUT emailing anyone and without consuming signature quota. Use it to check placement and routing before the real send.
recipients*array
2–10 signers. The route rejects a single recipient — use create_signature_request for one signer.
renderIdstring
UUID of a completed render owned by this account. Supply exactly one of renderId or pdfUrl.
routingstring
'parallel' (default) emails everyone at once and each signs independently. 'sequential' emails only the lowest-order recipient; the rest are created with status 'waiting' and activated one at a tim...one of parallel · sequentialdefault: parallel
list_signature_requestsList signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions.2 params

List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions.

Parameters* required
limitinteger
Default 50.
offsetinteger
Default 0.
get_signature_certificateReturns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, with IP / user-agent) that legal teams expect. Only available after the request reaches a terminal state. Without a key...1 params

Returns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, with IP / user-agent) that legal teams expect. Only available after the request reaches a terminal state. Without a key...

Parameters* required
signatureRequestId*string
ID of the signature_request to fetch the Certificate of Completion for. Must be in a terminal state (signed / declined / delegated / voided / expired); pending requests return 409.
get_signature_requestFetch one signature request by id, with the detail list_signature_requests leaves out: the placed_fields layout, signed_at plus signed_ip and signed_user_agent, last_reminded_at, cc_emails, and envelope_id + recipient_order when it is part of an envelope. Use list_signature_re...1 params

Fetch one signature request by id, with the detail list_signature_requests leaves out: the placed_fields layout, signed_at plus signed_ip and signed_user_agent, last_reminded_at, cc_emails, and envelope_id + recipient_order when it is part of an envelope. Use list_signature_re...

Parameters* required
signatureRequestId*string
ID returned by create_signature_request, bulk_signature_requests, or a list call.
get_envelopeFetch one multi-signer envelope with every recipient in signing order — each with a live sign_url, status, recipient_order, expires_at and last_reminded_at — plus the envelope's own status and routing. This is the tool for 'who still has not signed?' after a create_envelope se...1 params

Fetch one multi-signer envelope with every recipient in signing order — each with a live sign_url, status, recipient_order, expires_at and last_reminded_at — plus the envelope's own status and routing. This is the tool for 'who still has not signed?' after a create_envelope se...

Parameters* required
envelopeId*string
Envelope ID returned by create_envelope.
remind_signatureResend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — supply exactly one; there is no separate envelope-reminder tool. This sends real email to third parties. Each recipient...2 params

Resend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — supply exactly one; there is no separate envelope-reminder tool. This sends real email to third parties. Each recipient...

Parameters* required
envelopeIdstring
Nudge every currently-pending recipient of this envelope. Supply exactly one of signatureRequestId or envelopeId.
signatureRequestIdstring
Nudge this one signer. Supply exactly one of signatureRequestId or envelopeId.
bulk_signature_requestsFan one already-rendered PDF out to up to 100 independent signers in a single call — the 'send this NDA to everyone on the list' path. Each signer gets their own request, their own sign link and their own invitation email, but they all share one source render, so only one docu...6 params

Fan one already-rendered PDF out to up to 100 independent signers in a single call — the 'send this NDA to everyone on the list' path. Each signer gets their own request, their own sign link and their own invitation email, but they all share one source render, so only one docu...

Parameters* required
expiresIninteger
Sign-link lifetime in seconds. Min 1 hour, max 30 days. Defaults to 7 days.
messagestring
Shared invite message. `{{signerName}}` is substituted per recipient.
positionobject
One signature rectangle in PDF points (origin bottom-left) shared by every signer.
reminderCadenceHoursinteger
Auto-reminder cadence in hours, shared across the batch. Up to 3 reminders.
renderId*string
Render UUID every signer receives. One render, one storage object, many requests.
signers*array
1–100 signers. Duplicate emails are rejected up front with 422.
preview_field_placementCheck a placedFields layout against a real render's page geometry before anything is sent: no signature request is created, no email goes out, and no signature quota is spent. It accepts exactly what create_signature_request accepts — all seven field types, `options`, and anch...2 params

Check a placedFields layout against a real render's page geometry before anything is sent: no signature request is created, no email goes out, and no signature quota is spent. It accepts exactly what create_signature_request accepts — all seven field types, `options`, and anch...

Parameters* required
placedFields*array
Up to 100 fields to validate. Exactly the shape create_signature_request takes — same seven types, same `anchor` and `options` support — so a layout that previews clean is a layout that sends.
renderId*string
Render UUID whose real page sizes the fields are checked against.
list_signature_templatesList this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are signing presets, NOT the document catalog: list_templates is what render_pdf draws from. Rows here carry only id, name...2 params

List this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are signing presets, NOT the document catalog: list_templates is what render_pdf draws from. Rows here carry only id, name...

Parameters* required
limitinteger
Page size, 1–100. Default 50.
offsetinteger
Rows to skip. Default 0.
get_signature_templateFetch one e-signature preset in full, including the placed_fields array and position that list_signature_templates omits. Use it to inspect or copy an existing field layout before applying it through create_signature_request's signatureTemplateId, or as the starting point for...1 params

Fetch one e-signature preset in full, including the placed_fields array and position that list_signature_templates omits. Use it to inspect or copy an existing field layout before applying it through create_signature_request's signatureTemplateId, or as the starting point for...

Parameters* required
signatureTemplateId*string
ID from list_signature_templates.
pki_sign_pdfCryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions.7 params

Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions.

Parameters* required
locationstring
Optional /Sig dictionary Location.
reasonstring
Optional /Sig dictionary Reason — surfaced in Acrobat's signature panel. ASCII-coerced server-side.
renderId*string
Render UUID returned by render_pdf or any /v1/render call. The PDF will be sealed with a Kamy-issued X.509 leaf certificate.
signerEmailstring
Override the signer email. Defaults to the account's email.
signerNamestring
Override the signer display name. Defaults to the account's full_name.
withRevocationInfoboolean
When false, skip embedding the Kamy CA CRL into the PKCS#7 SignedData (PAdES-B-T instead of B-LT). Online verifiers can still fetch the CRL via the Distribution Point on the leaf cert. Default: true.
withTimestampboolean
When false, skip the RFC 3161 timestamp call (PAdES-B-B instead of B-T). Default: true.
verify_pdf_signatureTurn PDF bytes you are holding into their SHA-256 digest and the matching kamy.dev/verify/{sha256} page URL. Purely local: the MCP Worker hashes the base64 in memory, makes no Kamy API call, stores nothing and forwards nothing, so it works with no key and never leaves a trace....1 params

Turn PDF bytes you are holding into their SHA-256 digest and the matching kamy.dev/verify/{sha256} page URL. Purely local: the MCP Worker hashes the base64 in memory, makes no Kamy API call, stores nothing and forwards nothing, so it works with no key and never leaves a trace....

Parameters* required
pdfBase64*string
Base64-encoded PDF bytes. The MCP Worker hashes the file in-memory and does not store or forward it.
attest_artifactCryptographically sign an output your agent produced — a PDF, report, code patch, dataset, email — so a third party can later confirm those exact bytes are the ones that were recorded, unmodified. Pass content_text or content_base64 and Kamy hashes the bytes for you; pass cont...9 params

Cryptographically sign an output your agent produced — a PDF, report, code patch, dataset, email — so a third party can later confirm those exact bytes are the ones that were recorded, unmodified. Pass content_text or content_base64 and Kamy hashes the bytes for you; pass cont...

Parameters* required
artifact_type*string
What kind of output this is, e.g. 'pdf', 'report', 'code_patch', 'dataset', 'email', 'llm_output'. Free-form label used for filtering later.
content_base64string
Base64-encoded artifact bytes. Use for binary output (PDF, image, archive). Supply exactly one of content_sha256, content_base64, or content_text.
content_sha256string
SHA-256 of the artifact bytes, when you'd rather not send the content itself. Supply exactly one of content_sha256, content_base64, or content_text.
content_textstring
UTF-8 text artifact. Convenience input: this MCP server base64-encodes it locally and sends it as content_base64 — no other transformation is applied. Supply exactly one of content_sha256, content_...
featurestring
Product area or pipeline name, for grouping attestations.
metadataobject
Arbitrary JSON stored alongside the attestation (model, source URL, reviewer, ...).
parent_sha256value
content_sha256 of the preceding record in the chain, when this artifact was derived from an earlier one.
run_idstring
Your identifier for the agent run this artifact belongs to. Pass the same run_id across attestations and agent-action records to build one provenance chain readable via get_provenance_chain.
tagsarray
Up to 20 free-form labels.
verify_attestationAsk Kamy whether a SHA-256 digest has an attestation on record — the tool that actually returns a verdict. Takes a digest, not a file: if what you hold is a PDF, run verify_pdf_signature over the bytes first and pass the sha256 it gives you. A match returns { verified: true, a...1 params

Ask Kamy whether a SHA-256 digest has an attestation on record — the tool that actually returns a verdict. Takes a digest, not a file: if what you hold is a PDF, run verify_pdf_signature over the bytes first and pass the sha256 it gives you. A match returns { verified: true, a...

Parameters* required
hash*string
SHA-256 of the artifact you want to check, as hex. Hash the bytes you actually hold — if they were modified after attestation, the digest won't match any record and `verified` comes back false.
record_agent_actionAppend one signed tool_call -> tool_result pair to a tamper-evident ledger. Call it after any consequential tool invocation — a payment, an outbound email, a write into a customer system — so there is a hash-chained record of what the agent asked for and what came back, signed...8 params

Append one signed tool_call -> tool_result pair to a tamper-evident ledger. Call it after any consequential tool invocation — a payment, an outbound email, a write into a customer system — so there is a hash-chained record of what the agent asked for and what came back, signed...

Parameters* required
latency_msinteger
Wall-clock duration of the call.
parent_sha256string
content_sha256 of the previous record in this run, to link the chain explicitly.
run_idstring
Your identifier for this agent run. Reuse it across records to build one chain.
server*string
Identifier of the MCP server (or tool provider) the call went to, e.g. 'kamy'.
statusstring
Outcome of the call. Defaults to ok.one of ok · error · flagged
tool*string
Name of the tool that was invoked.
tool_callvalue
The request you sent — typically the arguments object, verbatim.
tool_resultvalue
The result you received back, verbatim.
get_provenance_chainReplay everything recorded under one run_id — artifacts from attest_artifact and calls from record_agent_action — in order, with each record's link to its parent hash. Use it to answer 'what did this agent actually do, and in what sequence?' during an incident review, a handov...1 params

Replay everything recorded under one run_id — artifacts from attest_artifact and calls from record_agent_action — in order, with each record's link to its parent hash. Use it to answer 'what did this agent actually do, and in what sequence?' during an incident review, a handov...

Parameters* required
run_id*string
The run_id you passed to attest_artifact / record_agent_action.
trace_recordRecord one LLM call — prompt, output, provider, model, tokens, latency — into Kamy Trace, a signed retention ledger. Each record is hashed and signed at write time, so it can be produced later without the 'you could have edited this' objection. Reach for it when model calls ne...11 params

Record one LLM call — prompt, output, provider, model, tokens, latency — into Kamy Trace, a signed retention ledger. Each record is hashed and signed at write time, so it can be produced later without the 'you could have edited this' objection. Reach for it when model calls ne...

Parameters* required
featurestring
Product area the call belongs to, e.g. 'support_reply'. Filterable in trace_search.
input_tokensinteger
Prompt tokens billed.
latency_msinteger
Wall-clock duration of the call.
model*string
Model identifier exactly as the provider reports it, e.g. 'claude-sonnet-4-6'.
outputvalue
The model's response, verbatim. Any JSON value.
output_tokensinteger
Completion tokens billed.
promptvalue
The prompt / request you sent, verbatim. Any JSON value (string, array, object).
provider*string
Which model vendor served the call. Use 'custom' for anything self-hosted.one of anthropic · openai · custom
statusstring
Outcome. 'flagged' marks a call you want a human to review later. Defaults to 'ok'.one of ok · flagged · error
status_detailstring
Why the call was flagged or failed. Free text.
tagsarray
Up to 20 free-form labels. trace_search can filter on any one of them.
trace_record_batchWrite up to 100 Kamy Trace records in one call. Reach for this over trace_record whenever you have more than a couple of buffered LLM calls to persist — it is one auth, one quota check and one round trip instead of N. Each element takes exactly the shape trace_record takes. Th...1 params

Write up to 100 Kamy Trace records in one call. Reach for this over trace_record whenever you have more than a couple of buffered LLM calls to persist — it is one auth, one quota check and one round trip instead of N. Each element takes exactly the shape trace_record takes. Th...

Parameters* required
records*array
1–100 records, each exactly the shape trace_record takes.
trace_searchQuery this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, latency, status, content hash, recorded_at — plus next_cursor for paging; it does not return the stored prompt and output...8 params

Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, latency, status, content hash, recorded_at — plus next_cursor for paging; it does not return the stored prompt and output...

Parameters* required
cursorstring
Pass the `next_cursor` from the previous response to fetch the next page.
featurestring
Exact-match filter on the feature label.
limitinteger
Page size, 1-100. Default 25.
providerstring
Exact-match filter on provider.one of anthropic · openai · custom
sincestring
ISO-8601 timestamp, inclusive lower bound.
statusstring
Exact-match filter on outcome.one of ok · flagged · error
tagstring
Return records whose tags array contains this tag.
untilstring
ISO-8601 timestamp, exclusive upper bound.
verify_mcp_serverDetect when an MCP server changes its tool manifest after you adopted it — the 'rug pull' case, where a server you already trusted silently rewrites a tool's description or input schema. Pass server_url and Kamy fetches that third-party server's manifest itself, or pass manife...2 params

Detect when an MCP server changes its tool manifest after you adopted it — the 'rug pull' case, where a server you already trusted silently rewrites a tool's description or input schema. Pass server_url and Kamy fetches that third-party server's manifest itself, or pass manife...

Parameters* required
manifestvalue
A tool manifest you already hold — the `tools/list` result, or an object with a `tools` array. Use this when the server isn't reachable from Kamy (local stdio server, private network). Supply eithe...
server_urlstring
URL of the MCP server to fingerprint. Kamy fetches its tool manifest server-side. Supply either server_url or manifest.
scan_tool_descriptionHeuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts to override your system prompt or hide content. Run it on descriptions from third-party MCP servers before you act on...2 params

Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts to override your system prompt or hide content. Run it on descriptions from third-party MCP servers before you act on...

Parameters* required
descriptionstring
A single tool description to scan. Supply description, tools, or both.
toolsarray
Several tools at once — e.g. the entries of a `tools/list` result. Supply description, tools, or both.
get_startedEverything needed to go from nothing to a rendered document in one call: the steps to create an API key in the dashboard, and — when you name a `framework` — the install command for the Kamy SDK, the environment variable it reads, and the client-setup snippet for that stack. A...3 params

Everything needed to go from nothing to a rendered document in one call: the steps to create an API key in the dashboard, and — when you name a `framework` — the install command for the Kamy SDK, the environment variable it reads, and the client-setup snippet for that stack. A...

Parameters* required
frameworkstring
Stack being integrated. Omit to get only the API-key steps; supply it to also get the install command, the environment variable, and the client-setup snippet.one of nextjs · remix · sveltekit · astro · express · fastify
packageManagerstring
Package manager for the install command. Default npm. Ignored for Python stacks.one of npm · pnpm · yarn · bun
templatestring
Template slug (e.g. 'invoice') to also emit a ready-to-paste route handler that renders it. Requires `framework`. Call list_templates first if you do not know the slug.
get_accountRead everything about the authenticated Kamy account in one call: profile, plan and plan status, the plan's limits (renders per month, API keys, seats, custom templates, overage pricing, priority queue), month-to-date render usage, and whether documents rendered on this plan c...

Read everything about the authenticated Kamy account in one call: profile, plan and plan status, the plan's limits (renders per month, API keys, seats, custom templates, overage pricing, priority queue), month-to-date render usage, and whether documents rendered on this plan c...

No parameters. Call it with no arguments.

list_rendersList the documents this account has already produced, newest first. This is how you find a PDF made earlier — in a previous turn, by a schedule, or by another process — when you no longer hold its URL. Download URLs returned by the render tools are signed and expire after an h...2 params

List the documents this account has already produced, newest first. This is how you find a PDF made earlier — in a previous turn, by a schedule, or by another process — when you no longer hold its URL. Download URLs returned by the render tools are signed and expire after an h...

Parameters* required
pageinteger
1-based page number. Defaults to 1 (the most recent renders).
page_sizeinteger
Rows per page, 1-100. Defaults to 20.
get_renderFetch one previously produced document by its render id, with a freshly signed download URL valid for the next hour. This is the recovery path for an expired link: the URL is minted at read time, so calling this again on an old render always yields a working download. Use list...1 params

Fetch one previously produced document by its render id, with a freshly signed download URL valid for the next hour. This is the recovery path for an expired link: the URL is minted at read time, so calling this again on an old render always yields a working download. Use list...

Parameters* required
render_id*string
Render id (UUID) as returned by render_pdf, render_async/get_job, or list_renders.
get_render_pagesRasterise every page of an existing render to a PNG image and return one signed 1-hour URL per page, with pixel width and height. Use this when a page has to be looked at rather than read — thumbnails, previews, visual QA of a layout, or an image attachment — and use extract_f...2 params

Rasterise every page of an existing render to a PNG image and return one signed 1-hour URL per page, with pixel width and height. Use this when a page has to be looked at rather than read — thumbnails, previews, visual QA of a layout, or an image attachment — and use extract_f...

Parameters* required
dpiinteger
Raster resolution. Defaults to 150 (screen quality); 300 for print-quality thumbnails. Clamped to 72-300 server-side.
render_id*string
Render id (UUID) as returned by render_pdf, render_async/get_job, or list_renders.
extract_from_renderRead the text or the form fields back out of a document this account already rendered, without uploading anything. Pass type='text' (the default) for per-page text plus a joined fullText string, or type='fields' for the PDF's AcroForm field names, types and current values — th...2 params

Read the text or the form fields back out of a document this account already rendered, without uploading anything. Pass type='text' (the default) for per-page text plus a joined fullText string, or type='fields' for the PDF's AcroForm field names, types and current values — th...

Parameters* required
render_id*string
Render id (UUID) as returned by render_pdf, render_async/get_job, or list_renders.
typestring
'text' (default) returns { pages: [{ page, text }], fullText, pageCount }. 'fields' returns the AcroForm fields as { name, type, value }.one of text · fields
render_asyncQueue one PDF render and return immediately with { jobId, status: 'queued' } instead of waiting for the document. Choose this over render_pdf when blocking is not acceptable — a heavy template, a large data set, or a turn where you have other work to do — and poll get_job with...8 params

Queue one PDF render and return immediately with { jobId, status: 'queued' } instead of waiting for the document. Choose this over render_pdf when blocking is not acceptable — a heavy template, a large data set, or a turn where you have other work to do — and poll get_job with...

Parameters* required
data*object
Data used to populate the template.
formatstring
Paper size. Defaults to a4.one of a4 · letter
marginobject
CSS lengths, e.g. { top: '20mm', bottom: '20mm' }.
metadataobject
PDF document properties written into the file's metadata dictionary.
namestring
Your own label for this document. Echoed back on the job result and stored on the render, so list_renders can be grepped by it later.
pdf_astring
Convert the output to a PDF/A archival conformance level.one of 1b · 2b · 3b
template*string
Template slug (e.g. 'invoice') or template UUID. Same values render_pdf accepts.
watermarkobject
Draws your own diagonal watermark over every page. Unrelated to the free-plan Kamy watermark, which is applied regardless — see get_account.watermarkPolicy.
get_jobPoll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'completed' the response also carries `render` with the finished document's id, signed URL, size and duration, and on 'failed'...1 params

Poll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'completed' the response also carries `render` with the finished document's id, signed URL, size and duration, and on 'failed'...

Parameters* required
job_id*string
The jobId render_async returned.
render_batchRender up to 100 documents in a single blocking call, each from its own template, HTML or URL, and get every result back in one response. Choose this over calling render_pdf in a loop whenever you have more than a couple of documents — it is one round trip, one quota reservati...1 params

Render up to 100 documents in a single blocking call, each from its own template, HTML or URL, and get every result back in one response. Choose this over calling render_pdf in a loop whenever you have more than a couple of documents — it is one round trip, one quota reservati...

Parameters* required
items*array
1-100 documents to render, in order. Results come back in this same order.
create_scheduleSet up a recurring render: a cron expression, a template, and where each document goes. Use this instead of render_pdf when the user wants a document produced repeatedly on a calendar — a weekly report, a monthly invoice run — so nothing has to stay running. Delivery channel i...9 params

Set up a recurring render: a cron expression, a template, and where each document goes. Use this instead of render_pdf when the user wants a document produced repeatedly on a calendar — a weekly report, a monthly invoice run — so nothing has to stay running. Delivery channel i...

Parameters* required
channel*string
Where each rendered document goes. 'download' just stores it (find it later with list_renders); 'email' and 'whatsapp' require recipients.one of email · whatsapp · download
dataobject
Template data, used verbatim on every firing. Defaults to {}.
enabledboolean
Defaults to true. Create it disabled to set it up now and start it later.
name*string
Human label for this schedule, shown in the dashboard.
optionsobject
Render options passed straight through to the render, in the nested /v1/render shape, e.g. { format: 'letter', margin: { top: '20mm' } }.
recipientsarray
Email addresses or phone numbers, matching the channel. Required and non-empty for email and whatsapp; ignored for download.
schedule*string
Standard 5-field cron expression, e.g. '0 9 * * 1' for 09:00 every Monday. Rejected with a validation error if it fires more often than the plan's minimum interval.
template*string
Template slug or UUID rendered on every firing. Same values render_pdf accepts.
timezonestring
IANA timezone the cron expression is evaluated in, e.g. 'Asia/Dubai'. Defaults to UTC.
list_schedulesList this account's recurring render schedules, newest first, with the id needed to delete one. Use it to answer what is already automated before creating a duplicate, and to diagnose a schedule that is not producing documents: each row carries enabled, schedule, timezone, nex...2 params

List this account's recurring render schedules, newest first, with the id needed to delete one. Use it to answer what is already automated before creating a duplicate, and to diagnose a schedule that is not producing documents: each row carries enabled, schedule, timezone, nex...

Parameters* required
limitinteger
Rows to return, 1-100. Defaults to 50.
offsetinteger
Rows to skip. Defaults to 0.
delete_schedulePermanently delete a recurring schedule so it stops firing. There is no undo and no trash — recreate it with create_schedule if it is deleted by mistake, so confirm with the user before calling this on a schedule you did not just create. If the intent is only to pause it, do n...1 params

Permanently delete a recurring schedule so it stops firing. There is no undo and no trash — recreate it with create_schedule if it is deleted by mistake, so confirm with the user before calling this on a schedule you did not just create. If the intent is only to pause it, do n...

Parameters* required
schedule_id*string
Schedule id (UUID) from create_schedule or list_schedules.
create_webhookRegister an HTTPS endpoint that Kamy POSTs to when work finishes, so a long render or an e-signature does not have to be polled. Use this when the caller owns a server that can receive callbacks; use get_job or list_renders when it cannot. The response includes a one-time sign...3 params

Register an HTTPS endpoint that Kamy POSTs to when work finishes, so a long render or an e-signature does not have to be polled. Use this when the caller owns a server that can receive callbacks; use get_job or list_renders when it cannot. The response includes a one-time sign...

Parameters* required
enabledboolean
Defaults to true. Register it disabled to wire it up before switching it on.
eventsarray
Event names to receive. Defaults to ["render.completed", "render.failed"]. Known events: render.completed, render.failed, signature.signed, signature.voided, signature.expired, signature.envelope_c...
url*string
HTTPS endpoint Kamy POSTs each event to. Private, loopback, link-local and cloud-metadata hosts are rejected at registration time, so localhost and 10.x/192.168.x addresses will not work.
list_webhooksList the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus from the most recent delivery — lastStatus is the HTTP code the caller's own server returned, so this is where a silent...

List the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus from the most recent delivery — lastStatus is the HTTP code the caller's own server returned, so this is where a silent...

No parameters. Call it with no arguments.

test_webhookSend a real test.ping event to a registered webhook endpoint — an actual outbound HTTP POST to whatever URL the user configured, signed like a genuine delivery. Use it to prove an endpoint is reachable and that signature verification works before relying on it. Delivery is dis...1 params

Send a real test.ping event to a registered webhook endpoint — an actual outbound HTTP POST to whatever URL the user configured, signed like a genuine delivery. Use it to prove an endpoint is reachable and that signature verification works before relying on it. Delivery is dis...

Parameters* required
webhook_id*string
Webhook endpoint id (UUID) from create_webhook or list_webhooks.

Sponsors

Readme

Kamy

Kamy Plugin

SDK CLI kamy.dev MIT License

Open Plugins distribution for Kamy — install Kamy PDF generation in Cursor, Claude Code, and any other Open-Plugins-compatible AI coding agent.

This repository ships only the plugin manifest and the agent-facing assets (skill, rules, sub-agent, MCP config). The Kamy API, dashboard, SDK source, and template engine live in private infrastructure; this repo is the install surface for AI agents.


View the full README on GitHub

Details

Repository
github.com/kamy-development/kamy-plugin
Categories
Design & Creative, Documents & Knowledge
Transport
HTTP
Registry
MCP registry, active
Tools verified
Nov 6, 2026

Related Design & Creative MCP servers

View all
1levels-dev avatarready→made MCPlevels-dev/readymade-mcpDeterministic Figma to Elementor, Gutenberg, Oxygen, Etch and HTML layouts for AI assistants.0stars
2dreliq9 avatarAdclipdreliq9/adclipAd creative generation via MCP — copy and static images from a JSON brief. Keyless.0stars
3moddable-games avatarModdable Games Toolsmoddable-games/moddable-website15 tools for chess variant analysis, hex map generation, and board game utilities0stars
4gregario avatar3dprint Oraclegregario/3dprint-oracle3D printing filament and materials knowledge MCP server0stars
5groupdocs-viewer avatarGroupdocs Viewer Mcpgroupdocs-viewer/groupdocs.viewer.mcpMCP server for GroupDocs.Viewer — render pages as PNG and inspect view info via AI agents.0stars
6hj1003862396 avatarDraw Flow Mcp Serverhj1003862396/draw-flow-mcp-serverMCP server for Next AI Draw.io - AI-powered diagram generation with real-time browser preview0stars