MCP server for terminal commands, file operations, and process management
Kamy is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Document API for AI-native software: render PDFs, e-sign, PAdES-seal, and verify.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http kamy-mcp https://mcp.kamy.dev/mcp
# 2 — ask your agent for something these tools do
# list_templates, get_template_schema, create_template and 56 more
Kamy costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http kamy-mcp https://mcp.kamy.dev/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
59 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
List Kamy's public system PDF templates. No authentication required.
No parameter schema on file.
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | Template slug — e.g. 'invoice', 'receipt', 'uae-tax-invoice'. |
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 before anything is created. The slug must be unique within the account and must not collide with a built-in system slug (invoic
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Human-readable template name. |
| slug | string | yes | 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. |
| html | string | yes | Handlebars/HTML body of the document. Max 5 MB. |
| css | string | no | Stylesheet applied at render time. Max 1 MB. |
| schema | object | no | JSON Schema describing the data payload the template expects. Defaults to {}. |
| description | string | no | What this template is for. |
| isPublic | boolean | no | When true, other accounts can list and render it. Defaults to false. |
| tags | array | no | Up to 10 free-form labels. |
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, render_pdf serves that frozen snapshot and your edits stay invisible until publish_template moves the pointer, so an edit t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template | string | yes | Template UUID or slug. This route accepts either. |
| name | string | no | — |
| description | string | no | — |
| html | string | no | Replaces the draft HTML entirely. |
| css | string | no | Replaces the draft CSS entirely. |
| schema | object | no | Replaces the draft JSON Schema entirely. |
| isPublic | boolean | no | — |
| tags | array | no | — |
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 snapshot and leaves the draft alone. Reach for rollback_template instead when you are reverting a bad release: only that too
| Parameter | Type | Required | Notes |
|---|---|---|---|
| templateId | string | yes | Template UUID or slug — every /v1/templates route resolves either. |
| version | integer | no | 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. |
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 expectedPublishedVersion — an optimistic fence that rejects with 409 VERSION_CONFLICT if someone moved the pointer since you read
| Parameter | Type | Required | Notes |
|---|---|---|---|
| templateId | string | yes | Template UUID or slug — every /v1/templates route resolves either. |
| version | integer | yes | The known-good version to make live again. Get it from list_template_versions. |
| restoreDraft | boolean | no | 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. Defaults |
| expectedPublishedVersion | integer | no | 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 re |
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's html, css and schema. Works on system and public templates as well as your own, by UUID or slug. Read-only and spends no
| Parameter | Type | Required | Notes |
|---|---|---|---|
| templateId | string | yes | Template UUID or slug — every /v1/templates route resolves either. |
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 content a later draft edit overwrote; it changes nothing on its own, so pair it with rollback_template when you want that version
| Parameter | Type | Required | Notes |
|---|---|---|---|
| templateId | string | yes | Template UUID or slug — every /v1/templates route resolves either. |
| version | integer | yes | Version number from list_template_versions. |
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 the render id every later tool takes. Reach for render_async instead when waiting is not acceptable, and render_batch when se
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template | string | yes | Template slug (e.g., 'invoice') or template UUID |
| data | object | yes | Data to populate the template |
| format | string | no | — |
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) rather than receive a fixed artifact. Only five slugs have a Word implementation — invoice, receipt, quote, contract, agr
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template | string | yes | 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). |
| data | object | no | Template data, identical in shape to the render_pdf payload for the same slug — call get_template_schema first to get the exact fields. |
| name | string | no | Label stored on the render row so the document is identifiable in the dashboard. |
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 layout, so content has to be shaped into those five. It also converts nothing; use convert_document to turn a file you already
| Parameter | Type | Required | Notes |
|---|---|---|---|
| title | string | no | Deck title — used as document metadata and as the returned filename stem. |
| format | string | no | WIDE = 16:9 (default), STANDARD = 4:3. |
| theme | object | no | — |
| slides | array | yes | 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 reshaped |
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 this over render_pdf when the recipient will sort, filter or recompute the numbers, and over render_docx when the content
| Parameter | Type | Required | Notes |
|---|---|---|---|
| title | string | no | Workbook title — document metadata and the returned filename stem. |
| sheets | array | yes | One or more sheets, in tab order. |
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 inspecting the markup before committing to render_pdf. Use render_pdf instead whenever the output has to be a paginated, pri
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template | string | no | Template slug or UUID — a Kamy system template or one of your own. Supply exactly one of template or html. |
| html | string | no | Raw Handlebars/HTML source to compile instead of a stored template. Supply exactly one of template or html. |
| data | object | no | Values substituted into the template's Handlebars expressions. |
| direction | string | no | Force the document's lang/dir attributes for RTL/bidi mail clients. 'auto' (default) leaves the template's own <html lang> untouched. |
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 document, whereas render_docx / render_xlsx / render_pptx GENERATE new documents from structured data, and render_pdf build
| Parameter | Type | Required | Notes |
|---|---|---|---|
| filename | string | yes | Source filename including its extension — the route detects the input type from it. Must end in .docx, .xlsx or .csv. |
| fileBase64 | string | yes | Base64-encoded bytes of the source file. |
| name | string | no | Label for the resulting render row. Defaults to the source filename. |
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 raw bytes, and every id must belong to this account and point at a completed render or the whole call fails. The source re
| Parameter | Type | Required | Notes |
|---|---|---|---|
| renderIds | array | yes | 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. |
| name | string | no | Label for the merged render, e.g. 'Q3 statement bundle'. |
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 the document; a range starting past the last page fails the entire call. The source render is left untouched. Returns { rend
| Parameter | Type | Required | Notes |
|---|---|---|---|
| renderId | string | yes | UUID of the completed render to split. Must belong to this account. |
| ranges | array | yes | 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. |
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 this when a document already exists and needs values or marks; use render_pdf when the document should be generated from a
| Parameter | Type | Required | Notes |
|---|---|---|---|
| renderId | string | no | UUID of an existing render owned by this account. Supply exactly one of renderId or pdfUrl. |
| pdfUrl | string | no | 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 one |
| operations | array | yes | 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 hides |
| name | string | no | Label for the resulting render row. |
| flattenFields | boolean | no | 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 live |
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 how a logo, signature image or custom font gets into a template without hosting it yourself. Pass contentBase64 and this serv
| Parameter | Type | Required | Notes |
|---|---|---|---|
| filename | string | yes | Name to store the asset under. Characters outside [A-Za-z0-9._-] are replaced with '_'. |
| contentType | string | yes | MIME type. The API rejects anything outside this list. |
| contentBase64 | string | no | 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 ba |
| sizeBytes | integer | no | Declared size in bytes. Computed automatically when contentBase64 is supplied. Max 100 MB. |
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 uploaded:false when the file was too large to pass inline and you PUT it yourself — because this read reconciles a still-'pendin
| Parameter | Type | Required | Notes |
|---|---|---|---|
| uploadId | string | yes | Upload UUID returned by upload_file. The bare UUID, not the kamy://asset/... ref. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template | string | yes | Template slug (e.g. 'invoice') or template UUID. |
| data | object | yes | The data payload to validate against the template schema. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template | string | yes | Predefined template id. invoice/receipt for AP and POS docs, contract for legal agreements, id_document for passports/IDs, generic_form for anything else. |
| source_url | string | no | Public URL to a PDF (preferred). One of source_url or source_base64 is required. |
| source_base64 | string | no | Base64-encoded PDF bytes. Use when the source isn't publicly fetchable. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| question | string | yes | The question to ask Kamy about — how to render a template, why a render failed, what plan to pick, etc. |
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.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| renderId | string | yes | Render UUID returned by render_pdf or any /v1/render call. The render's PDF is the document the signer will receive. |
| signerEmail | string | yes | Recipient email address. |
| signerName | string | yes | Recipient full name. Must be typed verbatim by the signer to confirm intent. |
| position | object | no | 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 on t |
| message | string | no | Optional message rendered in the email invitation body. |
| authMethod | string | no | 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 gate, |
| signerPhone | string | no | E.164 phone number. Required when authMethod is sms_otp; ignored otherwise. Example: +14155551234. |
| ccEmails | array | no | Up to 10 observer addresses CC'd on the invite and the completion notice. Not signers themselves. |
| expiresIn | integer | no | How long (seconds) the sign link stays valid. Defaults to 30 days. Min 1 hour, max 30 days. |
| reminderCadenceHours | integer | no | 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. |
| signOnEveryPage | boolean | no | 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. |
| requireStamp | boolean | no | 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. |
| signatureTemplateId | string | no | Apply a signature template's defaults (placedFields, position, message, expiresIn, ccEmails). Request-level fields override the template. |
| placedFields | array | no | 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. |
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) emails everyone at once and each signs independently; routing 'sequential' emails only the lowest-order recipient and activat
| Parameter | Type | Required | Notes |
|---|---|---|---|
| renderId | string | no | UUID of a completed render owned by this account. Supply exactly one of renderId or pdfUrl. |
| pdfUrl | string | no | Publicly fetchable PDF URL. Kamy downloads it and stores it as a render first. Supply exactly one of renderId or pdfUrl. |
| recipients | array | yes | 2–10 signers. The route rejects a single recipient — use create_signature_request for one signer. |
| routing | string | no | '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 time a |
| position | object | no | Default signature placement in PDF points, origin bottom-left. |
| message | string | no | Message included in every invitation email. |
| placedFields | array | no | Up to 100 sender-placed form fields for signers to complete. |
| expiresIn | integer | no | Sign-link lifetime in seconds. Min 1 hour, max 30 days. |
| ccEmails | array | no | Up to 10 observers CC'd on the invitations. Not signers. |
| preview | boolean | no | 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. |
List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Default 50. |
| offset | integer | no | Default 0. |
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, returns dashboard setup instructions.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| signatureRequestId | string | yes | 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. |
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_requests to find an id and this to inspect it; use get_signature_certificate when what you actually want is the legal audit-t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| signatureRequestId | string | yes | ID returned by create_signature_request, bulk_signature_requests, or a list call. |
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 send; get_signature_request answers that for a single standalone request and returns no recipient list. Under sequential rout
| Parameter | Type | Required | Notes |
|---|---|---|---|
| envelopeId | string | yes | Envelope ID returned by create_envelope. |
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 is capped at one reminder per hour: the single-request form returns 429 REMIND_TOO_SOON with a Retry-After header, while t
| Parameter | Type | Required | Notes |
|---|---|---|---|
| signatureRequestId | string | no | Nudge this one signer. Supply exactly one of signatureRequestId or envelopeId. |
| envelopeId | string | no | Nudge every currently-pending recipient of this envelope. Supply exactly one of signatureRequestId or envelopeId. |
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 document is produced and stored. Choose create_envelope instead when the recipients are signing the SAME document together and
| Parameter | Type | Required | Notes |
|---|---|---|---|
| renderId | string | yes | Render UUID every signer receives. One render, one storage object, many requests. |
| signers | array | yes | 1–100 signers. Duplicate emails are rejected up front with 422. |
| message | string | no | Shared invite message. {{signerName}} is substituted per recipient. |
| expiresIn | integer | no | Sign-link lifetime in seconds. Min 1 hour, max 30 days. Defaults to 7 days. |
| reminderCadenceHours | integer | no | Auto-reminder cadence in hours, shared across the batch. Up to 3 reminders. |
| position | object | no | One signature rectangle in PDF points (origin bottom-left) shared by every signer. |
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 anchor-positioned fields — so anything that previews clean will send. Returns each page's true width and height, so a sender UI
| Parameter | Type | Required | Notes |
|---|---|---|---|
| renderId | string | yes | Render UUID whose real page sizes the fields are checked against. |
| placedFields | array | yes | 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. |
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, description, expires_in and cc_emails; call get_signature_template for the placed_fields and position. Pass an id as crea
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Page size, 1–100. Default 50. |
| offset | integer | no | Rows to skip. Default 0. |
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 a preview_field_placement check against a new render. Read-only and spends no quota. Requires a Kamy API key with the `sign
| Parameter | Type | Required | Notes |
|---|---|---|---|
| signatureTemplateId | string | yes | ID from list_signature_templates. |
Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| renderId | string | yes | Render UUID returned by render_pdf or any /v1/render call. The PDF will be sealed with a Kamy-issued X.509 leaf certificate. |
| reason | string | no | Optional /Sig dictionary Reason — surfaced in Acrobat's signature panel. ASCII-coerced server-side. |
| location | string | no | Optional /Sig dictionary Location. |
| signerName | string | no | Override the signer display name. Defaults to the account's full_name. |
| signerEmail | string | no | Override the signer email. Defaults to the account's email. |
| withTimestamp | boolean | no | When false, skip the RFC 3161 timestamp call (PAdES-B-B instead of B-T). Default: true. |
| withRevocationInfo | boolean | no | 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. |
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. Note it returns no verdict — it does not tell you whether the document is genuine, signed, or on record anywhere. It is th
| Parameter | Type | Required | Notes |
|---|---|---|---|
| pdfBase64 | string | yes | Base64-encoded PDF bytes. The MCP Worker hashes the file in-memory and does not store or forward it. |
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 content_sha256 alone when the content itself must never leave your environment. Returns { attestation_id, content_sha256, signa
| Parameter | Type | Required | Notes |
|---|---|---|---|
| artifact_type | string | yes | What kind of output this is, e.g. 'pdf', 'report', 'code_patch', 'dataset', 'email', 'llm_output'. Free-form label used for filtering later. |
| content_sha256 | string | no | 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_base64 | string | no | Base64-encoded artifact bytes. Use for binary output (PDF, image, archive). Supply exactly one of content_sha256, content_base64, or content_text. |
| content_text | string | no | 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_bas |
| metadata | object | no | Arbitrary JSON stored alongside the attestation (model, source URL, reviewer, ...). |
| feature | string | no | Product area or pipeline name, for grouping attestations. |
| tags | array | no | Up to 20 free-form labels. |
| run_id | string | no | 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. |
| parent_sha256 | no | content_sha256 of the preceding record in the chain, when this artifact was derived from an earlier one. |
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, artifact_type, recorded_at, signature, public_key }. A false result means no attestation exists for those exact bytes, which
| Parameter | Type | Required | Notes |
|---|---|---|---|
| hash | string | yes | 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. |
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 at write time. Pass a stable run_id to keep an entire agent run in one chain, and parent_sha256 to link records explicitly
| Parameter | Type | Required | Notes |
|---|---|---|---|
| server | string | yes | Identifier of the MCP server (or tool provider) the call went to, e.g. 'kamy'. |
| tool | string | yes | Name of the tool that was invoked. |
| tool_call | no | The request you sent — typically the arguments object, verbatim. | |
| tool_result | no | The result you received back, verbatim. | |
| run_id | string | no | Your identifier for this agent run. Reuse it across records to build one chain. |
| parent_sha256 | string | no | content_sha256 of the previous record in this run, to link the chain explicitly. |
| status | string | no | Outcome of the call. Defaults to ok. |
| latency_ms | integer | no | Wall-clock duration of the call. |
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 handover, or an audit. Returns { run_id, chain_intact, records: [...] }, where chain_intact is the server's verdict on whether th
| Parameter | Type | Required | Notes |
|---|---|---|---|
| run_id | string | yes | The run_id you passed to attest_artifact / record_agent_action. |
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 need a reviewable history: regulated workflows, customer-facing generations, anything you may have to explain months later. S
| Parameter | Type | Required | Notes |
|---|---|---|---|
| provider | string | yes | Which model vendor served the call. Use 'custom' for anything self-hosted. |
| model | string | yes | Model identifier exactly as the provider reports it, e.g. 'claude-sonnet-4-6'. |
| prompt | no | The prompt / request you sent, verbatim. Any JSON value (string, array, object). | |
| output | no | The model's response, verbatim. Any JSON value. | |
| feature | string | no | Product area the call belongs to, e.g. 'support_reply'. Filterable in trace_search. |
| tags | array | no | Up to 20 free-form labels. trace_search can filter on any one of them. |
| latency_ms | integer | no | Wall-clock duration of the call. |
| input_tokens | integer | no | Prompt tokens billed. |
| output_tokens | integer | no | Completion tokens billed. |
| status | string | no | Outcome. 'flagged' marks a call you want a human to review later. Defaults to 'ok'. |
| status_detail | string | no | Why the call was flagged or failed. Free text. |
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. The whole batch is counted against the monthly Trace quota up front, so a batch that would cross the plan cap is rejected in
| Parameter | Type | Required | Notes |
|---|---|---|---|
| records | array | yes | 1–100 records, each exactly the shape trace_record takes. |
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 bodies. Use it to answer questions like 'how many flagged calls last week?' or to locate a specific record's id before ope
| Parameter | Type | Required | Notes |
|---|---|---|---|
| feature | string | no | Exact-match filter on the feature label. |
| status | string | no | Exact-match filter on outcome. |
| provider | string | no | Exact-match filter on provider. |
| tag | string | no | Return records whose tags array contains this tag. |
| since | string | no | ISO-8601 timestamp, inclusive lower bound. |
| until | string | no | ISO-8601 timestamp, exclusive upper bound. |
| limit | integer | no | Page size, 1-100. Default 25. |
| cursor | string | no | Pass the next_cursor from the previous response to fetch the next page. |
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 manifest when you already hold it (local or private servers). Returns status 'new' (first fingerprint for this account — nothing
| Parameter | Type | Required | Notes |
|---|---|---|---|
| server_url | string | no | URL of the MCP server to fingerprint. Kamy fetches its tool manifest server-side. Supply either server_url or manifest. |
| manifest | no | 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 either s |
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 what they say. Returns risk 'low' | 'medium' | 'high' and the matched findings with excerpts. This is a heuristic aid, NOT
| Parameter | Type | Required | Notes |
|---|---|---|---|
| description | string | no | A single tool description to scan. Supply description, tools, or both. |
| tools | array | no | Several tools at once — e.g. the entries of a tools/list result. Supply description, tools, or both. |
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. Add a template slug and it also returns a ready-to-paste route handler that renders it. Every argument is optional and eac
| Parameter | Type | Required | Notes |
|---|---|---|---|
| framework | string | no | 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. |
| packageManager | string | no | Package manager for the install command. Default npm. Ignored for Python stacks. |
| template | string | no | 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. |
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 carry Kamy's own watermark. This is the only tool that answers any of those questions — there is no separate quota tool. Cal
No parameter schema on file.
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 hour, so a link from earlier in the conversation is probably dead; find the render here, then call get_render with its id to
| Parameter | Type | Required | Notes |
|---|---|---|---|
| page | integer | no | 1-based page number. Defaults to 1 (the most recent renders). |
| page_size | integer | no | Rows per page, 1-100. Defaults to 20. |
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_renders first if you do not have the id. Returns { id, name, templateId, templateName, status, bytes, durationMs, url, cre
| Parameter | Type | Required | Notes |
|---|---|---|---|
| render_id | string | yes | Render id (UUID) as returned by render_pdf, render_async/get_job, or list_renders. |
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_from_render when you want the text. The render must already have status 'success'; a queued or failed one comes back as 409
| Parameter | Type | Required | Notes |
|---|---|---|---|
| render_id | string | yes | Render id (UUID) as returned by render_pdf, render_async/get_job, or list_renders. |
| dpi | integer | no | Raster resolution. Defaults to 150 (screen quality); 300 for print-quality thumbnails. Clamped to 72-300 server-side. |
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 — the latter is how you discover what edit_pdf can fill in. Choose extract_document instead when the PDF came from outside Kamy
| Parameter | Type | Required | Notes |
|---|---|---|---|
| render_id | string | yes | Render id (UUID) as returned by render_pdf, render_async/get_job, or list_renders. |
| type | string | no | 'text' (default) returns { pages: [{ page, text }], fullText, pageCount }. 'fields' returns the AcroForm fields as { name, type, value }. |
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 the returned jobId until status is 'completed' (the finished render, including its download URL, arrives on the job) or 'f
| Parameter | Type | Required | Notes |
|---|---|---|---|
| template | string | yes | Template slug (e.g. 'invoice') or template UUID. Same values render_pdf accepts. |
| data | object | yes | Data used to populate the template. |
| name | string | no | 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. |
| format | string | no | Paper size. Defaults to a4. |
| margin | object | no | CSS lengths, e.g. { top: '20mm', bottom: '20mm' }. |
| metadata | object | no | PDF document properties written into the file's metadata dictionary. |
| watermark | object | no | Draws your own diagonal watermark over every page. Unrelated to the free-plan Kamy watermark, which is applied regardless — see get_account.watermarkPolicy. |
| pdf_a | string | no | Convert the output to a PDF/A archival conformance level. |
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' it carries error with the reason. Poll every few seconds rather than in a tight loop — a typical render finishes in seco
| Parameter | Type | Required | Notes |
|---|---|---|---|
| job_id | string | yes | The jobId render_async returned. |
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 reservation and one rate-limit charge. It does block: items render sequentially inside a 300-second budget, so expect to wait, and r
| Parameter | Type | Required | Notes |
|---|---|---|---|
| items | array | yes | 1-100 documents to render, in order. Results come back in this same order. |
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 is 'email' or 'whatsapp' (recipients required) or 'download' (stored only; retrieve later with list_renders). The cron is ev
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Human label for this schedule, shown in the dashboard. |
| template | string | yes | Template slug or UUID rendered on every firing. Same values render_pdf accepts. |
| schedule | string | yes | 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. |
| channel | string | yes | Where each rendered document goes. 'download' just stores it (find it later with list_renders); 'email' and 'whatsapp' require recipients. |
| recipients | array | no | Email addresses or phone numbers, matching the channel. Required and non-empty for email and whatsapp; ignored for download. |
| data | object | no | Template data, used verbatim on every firing. Defaults to {}. |
| options | object | no | Render options passed straight through to the render, in the nested /v1/render shape, e.g. { format: 'letter', margin: { top: '20mm' } }. |
| timezone | string | no | IANA timezone the cron expression is evaluated in, e.g. 'Asia/Dubai'. Defaults to UTC. |
| enabled | boolean | no | Defaults to true. Create it disabled to set it up now and start it later. |
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, next_run_at, and last_run_at / last_run_status / last_run_error from the most recent firing — last_run_error is where a delive
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | Rows to return, 1-100. Defaults to 50. |
| offset | integer | no | Rows to skip. Defaults to 0. |
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 not use this tool: a schedule can be switched off and back on again via its enabled flag on the REST endpoint (PATCH /v1/s
| Parameter | Type | Required | Notes |
|---|---|---|---|
| schedule_id | string | yes | Schedule id (UUID) from create_schedule or list_schedules. |
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 signing secret used to verify delivery signatures — it is shown here and never again, so surface it to the user immediately and
| Parameter | Type | Required | Notes |
|---|---|---|---|
| url | string | yes | 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. |
| events | array | no | Event names to receive. Defaults to ["render.completed", "render.failed"]. Known events: render.completed, render.failed, signature.signed, signature.voided, signature.expired, signature.envelope_comp |
| enabled | boolean | no | Defaults to true. Register it disabled to wire it up before switching it on. |
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 silently broken endpoint shows up as a 4xx or 5xx. Signing secrets are never returned here; they are shown only once, by create_w
No parameter schema on file.
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 dispatched in the background, so the { message: 'Test ping dispatched' } you get back means accepted for sending, not that the
| Parameter | Type | Required | Notes |
|---|---|---|---|
| webhook_id | string | yes | Webhook endpoint id (UUID) from create_webhook or list_webhooks. |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Kamy or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither: the repository linked on this page is where this record was collected from, not a copy of what the address serves, so it is not graded in its place. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 1.2.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Kamy can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.