{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_jxnsj95atek7","handle":"kamy","url":"https://wellknown.network/agents/kamy","links":{"self":"https://wellknown.network/agents/kamy/record.json","html":"https://wellknown.network/agents/kamy","markdown":"https://wellknown.network/agents/kamy/record.md","api":"https://wellknown.network/api/v1/agents/kamy","status":"https://wellknown.network/api/v1/agents/kamy/status","claim":"https://wellknown.network/agents/kamy/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/kamy/claim.json","badge":"https://wellknown.network/agents/kamy/badge.svg","openapi":"https://wellknown.network/openapi.json","history":"https://wellknown.network/api/v1/agents/kamy/history","tools":"https://wellknown.network/api/v1/agents/kamy/tools"},"ard":{"identifier":"urn:air:mcp.kamy.dev:server:kamy","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"Kamy","summary":"Document API for AI-native software: render PDFs, e-sign, PAdES-seal, and verify.","description":"Document API for AI-native software: render PDFs, e-sign, PAdES-seal, and verify.","publisher":{"name":"dev.kamy","url":null},"homepage":null,"repository":"https://github.com/Kamy-Development/kamy-plugin","version":"1.2.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://mcp.kamy.dev/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-05-06T09:34:54.40107Z","publishedAt":"2026-05-06T09:34:54.40107Z","registryName":"dev.kamy/kamy"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","repoUrl":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"documents.spreadsheets","name":"Spreadsheets","confidence":1,"provenance":"derived"},{"slug":"documents.presentations","name":"Presentations","confidence":1,"provenance":"derived"},{"slug":"analytics.reporting","name":"Reporting & Dashboards","confidence":1,"provenance":"derived"},{"slug":"automation.scheduling","name":"Scheduling & Cron","confidence":1,"provenance":"derived"},{"slug":"documents.contracts","name":"Contracts & Legal","confidence":0.977,"provenance":"derived"},{"slug":"documents.conversion","name":"Document Conversion","confidence":0.977,"provenance":"derived"},{"slug":"documents.extraction","name":"Data Extraction","confidence":0.583,"provenance":"derived"},{"slug":"security.scanning","name":"Security Scanning","confidence":0.583,"provenance":"derived"}],"categories":["analytics","automation","documents","security"],"language":"en"},"observed":{"status":"live","statusReason":"Responded 37m ago.","lastOkAt":"2026-10-10T04:33:05.431Z","lastProbedAt":"2026-10-10T04:33:05.431Z","statusComputedAt":"2026-10-10T04:33:43.990Z","reliability30d":{"probes":109,"successRate":1,"p50Ms":39,"basis":"service","measures":{"availability":"availability","latency":"response time","tools":"tool surface observed","summary":"Checks reached the service itself."},"checks":{"total":109,"ok":109,"authBoundaryOk":0,"serviceOk":109,"note":"Counted from the observation rows for the window, checks of the server only (HTTP, A2A card, MCP initialize). ok = authBoundaryOk + serviceOk. `probes` is the sum of daily rollups and includes registry checks, so it can differ from `total`."}},"latestObservations":[{"at":"2026-10-10T04:33:05.431Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":37,"error":null,"detail":{"tools":[{"name":"list_templates","description":"List Kamy's public system PDF templates. No authentication required."},{"name":"get_template_schema","description":"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 rig"},{"name":"create_template","description":"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"},{"name":"update_template","description":"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. Cruciall"},{"name":"publish_template","description":"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 — thi"},{"name":"rollback_template","description":"Revert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Pr"},{"name":"list_template_versions","description":"List a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_"},{"name":"get_template_version","description":"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_ve"},{"name":"render_pdf","description":"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,"},{"name":"render_docx","description":"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 contain"},{"name":"render_pptx","description":"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, qu"},{"name":"render_xlsx","description":"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 tota"},{"name":"render_html","description":"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 pr"},{"name":"convert_document","description":"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 f"},{"name":"merge_pdfs","description":"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 "},{"name":"split_pdf","description":"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 sa"},{"name":"edit_pdf","description":"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 give"},{"name":"upload_file","description":"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 d"},{"name":"get_upload","description":"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"},{"name":"validate_payload","description":"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 receive"},{"name":"extract_document","description":"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 extr"},{"name":"ask_kamy","description":"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."},{"name":"create_signature_request","description":"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."},{"name":"create_envelope","description":"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 "},{"name":"list_signature_requests","description":"List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions."},{"name":"get_signature_certificate","description":"Returns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, wi"},{"name":"get_signature_request","description":"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,"},{"name":"get_envelope","description":"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 — pl"},{"name":"remind_signature","description":"Resend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — su"},{"name":"bulk_signature_requests","description":"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 ow"},{"name":"preview_field_placement","description":"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 "},{"name":"list_signature_templates","description":"List this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are s"},{"name":"get_signature_template","description":"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 "},{"name":"pki_sign_pdf","description":"Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions."},{"name":"verify_pdf_signature","description":"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 m"},{"name":"attest_artifact","description":"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 "},{"name":"verify_attestation","description":"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"},{"name":"record_agent_action","description":"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 wr"},{"name":"get_provenance_chain","description":"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 paren"},{"name":"trace_record","description":"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 t"},{"name":"trace_record_batch","description":"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 o"},{"name":"trace_search","description":"Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, late"},{"name":"verify_mcp_server","description":"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 de"},{"name":"scan_tool_description","description":"Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts "},{"name":"get_started","description":"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` — th"},{"name":"get_account","description":"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 t"},{"name":"list_renders","description":"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 p"},{"name":"get_render","description":"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 li"},{"name":"get_render_pages","description":"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"},{"name":"extract_from_render","description":"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 t"},{"name":"render_async","description":"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 n"},{"name":"get_job","description":"Poll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'complete"},{"name":"render_batch","description":"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 calli"},{"name":"create_schedule","description":"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 r"},{"name":"list_schedules","description":"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 dup"},{"name":"delete_schedule","description":"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 con"},{"name":"create_webhook","description":"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"},{"name":"list_webhooks","description":"List the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus fr"},{"name":"test_webhook","description":"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."}],"toolCount":59,"toolsHash":"b1d9bba5a3b735cfeb39cb0d99fdd067a88bcdd09b03f52fb0b76860ae6752af","serverName":"kamy","capabilities":["tools"],"serverVersion":"1.5.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T22:28:37.417Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":35,"error":null,"detail":{"tools":[{"name":"list_templates","description":"List Kamy's public system PDF templates. No authentication required."},{"name":"get_template_schema","description":"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 rig"},{"name":"create_template","description":"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"},{"name":"update_template","description":"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. Cruciall"},{"name":"publish_template","description":"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 — thi"},{"name":"rollback_template","description":"Revert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Pr"},{"name":"list_template_versions","description":"List a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_"},{"name":"get_template_version","description":"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_ve"},{"name":"render_pdf","description":"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,"},{"name":"render_docx","description":"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 contain"},{"name":"render_pptx","description":"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, qu"},{"name":"render_xlsx","description":"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 tota"},{"name":"render_html","description":"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 pr"},{"name":"convert_document","description":"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 f"},{"name":"merge_pdfs","description":"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 "},{"name":"split_pdf","description":"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 sa"},{"name":"edit_pdf","description":"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 give"},{"name":"upload_file","description":"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 d"},{"name":"get_upload","description":"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"},{"name":"validate_payload","description":"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 receive"},{"name":"extract_document","description":"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 extr"},{"name":"ask_kamy","description":"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."},{"name":"create_signature_request","description":"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."},{"name":"create_envelope","description":"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 "},{"name":"list_signature_requests","description":"List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions."},{"name":"get_signature_certificate","description":"Returns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, wi"},{"name":"get_signature_request","description":"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,"},{"name":"get_envelope","description":"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 — pl"},{"name":"remind_signature","description":"Resend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — su"},{"name":"bulk_signature_requests","description":"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 ow"},{"name":"preview_field_placement","description":"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 "},{"name":"list_signature_templates","description":"List this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are s"},{"name":"get_signature_template","description":"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 "},{"name":"pki_sign_pdf","description":"Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions."},{"name":"verify_pdf_signature","description":"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 m"},{"name":"attest_artifact","description":"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 "},{"name":"verify_attestation","description":"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"},{"name":"record_agent_action","description":"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 wr"},{"name":"get_provenance_chain","description":"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 paren"},{"name":"trace_record","description":"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 t"},{"name":"trace_record_batch","description":"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 o"},{"name":"trace_search","description":"Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, late"},{"name":"verify_mcp_server","description":"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 de"},{"name":"scan_tool_description","description":"Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts "},{"name":"get_started","description":"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` — th"},{"name":"get_account","description":"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 t"},{"name":"list_renders","description":"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 p"},{"name":"get_render","description":"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 li"},{"name":"get_render_pages","description":"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"},{"name":"extract_from_render","description":"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 t"},{"name":"render_async","description":"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 n"},{"name":"get_job","description":"Poll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'complete"},{"name":"render_batch","description":"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 calli"},{"name":"create_schedule","description":"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 r"},{"name":"list_schedules","description":"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 dup"},{"name":"delete_schedule","description":"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 con"},{"name":"create_webhook","description":"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"},{"name":"list_webhooks","description":"List the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus fr"},{"name":"test_webhook","description":"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."}],"toolCount":59,"toolsHash":"b1d9bba5a3b735cfeb39cb0d99fdd067a88bcdd09b03f52fb0b76860ae6752af","serverName":"kamy","capabilities":["tools"],"serverVersion":"1.5.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T16:31:48.762Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":100,"error":null,"detail":{"tools":[{"name":"list_templates","description":"List Kamy's public system PDF templates. No authentication required."},{"name":"get_template_schema","description":"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 rig"},{"name":"create_template","description":"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"},{"name":"update_template","description":"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. Cruciall"},{"name":"publish_template","description":"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 — thi"},{"name":"rollback_template","description":"Revert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Pr"},{"name":"list_template_versions","description":"List a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_"},{"name":"get_template_version","description":"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_ve"},{"name":"render_pdf","description":"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,"},{"name":"render_docx","description":"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 contain"},{"name":"render_pptx","description":"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, qu"},{"name":"render_xlsx","description":"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 tota"},{"name":"render_html","description":"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 pr"},{"name":"convert_document","description":"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 f"},{"name":"merge_pdfs","description":"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 "},{"name":"split_pdf","description":"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 sa"},{"name":"edit_pdf","description":"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 give"},{"name":"upload_file","description":"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 d"},{"name":"get_upload","description":"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"},{"name":"validate_payload","description":"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 receive"},{"name":"extract_document","description":"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 extr"},{"name":"ask_kamy","description":"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."},{"name":"create_signature_request","description":"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."},{"name":"create_envelope","description":"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 "},{"name":"list_signature_requests","description":"List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions."},{"name":"get_signature_certificate","description":"Returns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, wi"},{"name":"get_signature_request","description":"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,"},{"name":"get_envelope","description":"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 — pl"},{"name":"remind_signature","description":"Resend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — su"},{"name":"bulk_signature_requests","description":"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 ow"},{"name":"preview_field_placement","description":"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 "},{"name":"list_signature_templates","description":"List this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are s"},{"name":"get_signature_template","description":"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 "},{"name":"pki_sign_pdf","description":"Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions."},{"name":"verify_pdf_signature","description":"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 m"},{"name":"attest_artifact","description":"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 "},{"name":"verify_attestation","description":"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"},{"name":"record_agent_action","description":"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 wr"},{"name":"get_provenance_chain","description":"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 paren"},{"name":"trace_record","description":"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 t"},{"name":"trace_record_batch","description":"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 o"},{"name":"trace_search","description":"Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, late"},{"name":"verify_mcp_server","description":"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 de"},{"name":"scan_tool_description","description":"Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts "},{"name":"get_started","description":"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` — th"},{"name":"get_account","description":"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 t"},{"name":"list_renders","description":"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 p"},{"name":"get_render","description":"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 li"},{"name":"get_render_pages","description":"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"},{"name":"extract_from_render","description":"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 t"},{"name":"render_async","description":"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 n"},{"name":"get_job","description":"Poll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'complete"},{"name":"render_batch","description":"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 calli"},{"name":"create_schedule","description":"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 r"},{"name":"list_schedules","description":"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 dup"},{"name":"delete_schedule","description":"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 con"},{"name":"create_webhook","description":"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"},{"name":"list_webhooks","description":"List the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus fr"},{"name":"test_webhook","description":"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."}],"toolCount":59,"toolsHash":"b1d9bba5a3b735cfeb39cb0d99fdd067a88bcdd09b03f52fb0b76860ae6752af","serverName":"kamy","capabilities":["tools"],"serverVersion":"1.5.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T09:27:07.074Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":29,"error":null,"detail":{"tools":[{"name":"list_templates","description":"List Kamy's public system PDF templates. No authentication required."},{"name":"get_template_schema","description":"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 rig"},{"name":"create_template","description":"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"},{"name":"update_template","description":"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. Cruciall"},{"name":"publish_template","description":"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 — thi"},{"name":"rollback_template","description":"Revert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Pr"},{"name":"list_template_versions","description":"List a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_"},{"name":"get_template_version","description":"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_ve"},{"name":"render_pdf","description":"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,"},{"name":"render_docx","description":"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 contain"},{"name":"render_pptx","description":"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, qu"},{"name":"render_xlsx","description":"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 tota"},{"name":"render_html","description":"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 pr"},{"name":"convert_document","description":"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 f"},{"name":"merge_pdfs","description":"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 "},{"name":"split_pdf","description":"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 sa"},{"name":"edit_pdf","description":"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 give"},{"name":"upload_file","description":"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 d"},{"name":"get_upload","description":"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"},{"name":"validate_payload","description":"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 receive"},{"name":"extract_document","description":"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 extr"},{"name":"ask_kamy","description":"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."},{"name":"create_signature_request","description":"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."},{"name":"create_envelope","description":"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 "},{"name":"list_signature_requests","description":"List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions."},{"name":"get_signature_certificate","description":"Returns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, wi"},{"name":"get_signature_request","description":"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,"},{"name":"get_envelope","description":"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 — pl"},{"name":"remind_signature","description":"Resend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — su"},{"name":"bulk_signature_requests","description":"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 ow"},{"name":"preview_field_placement","description":"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 "},{"name":"list_signature_templates","description":"List this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are s"},{"name":"get_signature_template","description":"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 "},{"name":"pki_sign_pdf","description":"Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions."},{"name":"verify_pdf_signature","description":"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 m"},{"name":"attest_artifact","description":"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 "},{"name":"verify_attestation","description":"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"},{"name":"record_agent_action","description":"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 wr"},{"name":"get_provenance_chain","description":"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 paren"},{"name":"trace_record","description":"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 t"},{"name":"trace_record_batch","description":"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 o"},{"name":"trace_search","description":"Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, late"},{"name":"verify_mcp_server","description":"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 de"},{"name":"scan_tool_description","description":"Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts "},{"name":"get_started","description":"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` — th"},{"name":"get_account","description":"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 t"},{"name":"list_renders","description":"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 p"},{"name":"get_render","description":"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 li"},{"name":"get_render_pages","description":"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"},{"name":"extract_from_render","description":"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 t"},{"name":"render_async","description":"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 n"},{"name":"get_job","description":"Poll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'complete"},{"name":"render_batch","description":"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 calli"},{"name":"create_schedule","description":"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 r"},{"name":"list_schedules","description":"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 dup"},{"name":"delete_schedule","description":"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 con"},{"name":"create_webhook","description":"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"},{"name":"list_webhooks","description":"List the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus fr"},{"name":"test_webhook","description":"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."}],"toolCount":59,"toolsHash":"b1d9bba5a3b735cfeb39cb0d99fdd067a88bcdd09b03f52fb0b76860ae6752af","serverName":"kamy","capabilities":["tools"],"serverVersion":"1.5.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-09T03:22:46.917Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":41,"error":null,"detail":{"tools":[{"name":"list_templates","description":"List Kamy's public system PDF templates. No authentication required."},{"name":"get_template_schema","description":"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 rig"},{"name":"create_template","description":"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"},{"name":"update_template","description":"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. Cruciall"},{"name":"publish_template","description":"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 — thi"},{"name":"rollback_template","description":"Revert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Pr"},{"name":"list_template_versions","description":"List a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_"},{"name":"get_template_version","description":"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_ve"},{"name":"render_pdf","description":"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,"},{"name":"render_docx","description":"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 contain"},{"name":"render_pptx","description":"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, qu"},{"name":"render_xlsx","description":"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 tota"},{"name":"render_html","description":"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 pr"},{"name":"convert_document","description":"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 f"},{"name":"merge_pdfs","description":"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 "},{"name":"split_pdf","description":"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 sa"},{"name":"edit_pdf","description":"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 give"},{"name":"upload_file","description":"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 d"},{"name":"get_upload","description":"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"},{"name":"validate_payload","description":"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 receive"},{"name":"extract_document","description":"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 extr"},{"name":"ask_kamy","description":"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."},{"name":"create_signature_request","description":"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."},{"name":"create_envelope","description":"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 "},{"name":"list_signature_requests","description":"List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions."},{"name":"get_signature_certificate","description":"Returns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, wi"},{"name":"get_signature_request","description":"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,"},{"name":"get_envelope","description":"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 — pl"},{"name":"remind_signature","description":"Resend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — su"},{"name":"bulk_signature_requests","description":"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 ow"},{"name":"preview_field_placement","description":"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 "},{"name":"list_signature_templates","description":"List this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are s"},{"name":"get_signature_template","description":"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 "},{"name":"pki_sign_pdf","description":"Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions."},{"name":"verify_pdf_signature","description":"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 m"},{"name":"attest_artifact","description":"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 "},{"name":"verify_attestation","description":"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"},{"name":"record_agent_action","description":"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 wr"},{"name":"get_provenance_chain","description":"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 paren"},{"name":"trace_record","description":"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 t"},{"name":"trace_record_batch","description":"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 o"},{"name":"trace_search","description":"Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, late"},{"name":"verify_mcp_server","description":"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 de"},{"name":"scan_tool_description","description":"Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts "},{"name":"get_started","description":"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` — th"},{"name":"get_account","description":"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 t"},{"name":"list_renders","description":"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 p"},{"name":"get_render","description":"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 li"},{"name":"get_render_pages","description":"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"},{"name":"extract_from_render","description":"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 t"},{"name":"render_async","description":"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 n"},{"name":"get_job","description":"Poll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'complete"},{"name":"render_batch","description":"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 calli"},{"name":"create_schedule","description":"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 r"},{"name":"list_schedules","description":"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 dup"},{"name":"delete_schedule","description":"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 con"},{"name":"create_webhook","description":"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"},{"name":"list_webhooks","description":"List the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus fr"},{"name":"test_webhook","description":"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."}],"toolCount":59,"toolsHash":"b1d9bba5a3b735cfeb39cb0d99fdd067a88bcdd09b03f52fb0b76860ae6752af","serverName":"kamy","capabilities":["tools"],"serverVersion":"1.5.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T20:25:15.126Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":94,"error":null,"detail":{"tools":[{"name":"list_templates","description":"List Kamy's public system PDF templates. No authentication required."},{"name":"get_template_schema","description":"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 rig"},{"name":"create_template","description":"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"},{"name":"update_template","description":"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. Cruciall"},{"name":"publish_template","description":"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 — thi"},{"name":"rollback_template","description":"Revert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Pr"},{"name":"list_template_versions","description":"List a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_"},{"name":"get_template_version","description":"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_ve"},{"name":"render_pdf","description":"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,"},{"name":"render_docx","description":"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 contain"},{"name":"render_pptx","description":"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, qu"},{"name":"render_xlsx","description":"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 tota"},{"name":"render_html","description":"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 pr"},{"name":"convert_document","description":"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 f"},{"name":"merge_pdfs","description":"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 "},{"name":"split_pdf","description":"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 sa"},{"name":"edit_pdf","description":"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 give"},{"name":"upload_file","description":"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 d"},{"name":"get_upload","description":"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"},{"name":"validate_payload","description":"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 receive"},{"name":"extract_document","description":"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 extr"},{"name":"ask_kamy","description":"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."},{"name":"create_signature_request","description":"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."},{"name":"create_envelope","description":"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 "},{"name":"list_signature_requests","description":"List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions."},{"name":"get_signature_certificate","description":"Returns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, wi"},{"name":"get_signature_request","description":"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,"},{"name":"get_envelope","description":"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 — pl"},{"name":"remind_signature","description":"Resend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — su"},{"name":"bulk_signature_requests","description":"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 ow"},{"name":"preview_field_placement","description":"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 "},{"name":"list_signature_templates","description":"List this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are s"},{"name":"get_signature_template","description":"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 "},{"name":"pki_sign_pdf","description":"Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions."},{"name":"verify_pdf_signature","description":"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 m"},{"name":"attest_artifact","description":"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 "},{"name":"verify_attestation","description":"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"},{"name":"record_agent_action","description":"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 wr"},{"name":"get_provenance_chain","description":"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 paren"},{"name":"trace_record","description":"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 t"},{"name":"trace_record_batch","description":"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 o"},{"name":"trace_search","description":"Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, late"},{"name":"verify_mcp_server","description":"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 de"},{"name":"scan_tool_description","description":"Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts "},{"name":"get_started","description":"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` — th"},{"name":"get_account","description":"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 t"},{"name":"list_renders","description":"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 p"},{"name":"get_render","description":"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 li"},{"name":"get_render_pages","description":"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"},{"name":"extract_from_render","description":"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 t"},{"name":"render_async","description":"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 n"},{"name":"get_job","description":"Poll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'complete"},{"name":"render_batch","description":"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 calli"},{"name":"create_schedule","description":"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 r"},{"name":"list_schedules","description":"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 dup"},{"name":"delete_schedule","description":"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 con"},{"name":"create_webhook","description":"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"},{"name":"list_webhooks","description":"List the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus fr"},{"name":"test_webhook","description":"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."}],"toolCount":59,"toolsHash":"b1d9bba5a3b735cfeb39cb0d99fdd067a88bcdd09b03f52fb0b76860ae6752af","serverName":"kamy","capabilities":["tools"],"serverVersion":"1.5.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T13:22:23.898Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":36,"error":null,"detail":{"tools":[{"name":"list_templates","description":"List Kamy's public system PDF templates. No authentication required."},{"name":"get_template_schema","description":"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 rig"},{"name":"create_template","description":"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"},{"name":"update_template","description":"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. Cruciall"},{"name":"publish_template","description":"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 — thi"},{"name":"rollback_template","description":"Revert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Pr"},{"name":"list_template_versions","description":"List a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_"},{"name":"get_template_version","description":"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_ve"},{"name":"render_pdf","description":"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,"},{"name":"render_docx","description":"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 contain"},{"name":"render_pptx","description":"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, qu"},{"name":"render_xlsx","description":"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 tota"},{"name":"render_html","description":"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 pr"},{"name":"convert_document","description":"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 f"},{"name":"merge_pdfs","description":"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 "},{"name":"split_pdf","description":"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 sa"},{"name":"edit_pdf","description":"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 give"},{"name":"upload_file","description":"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 d"},{"name":"get_upload","description":"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"},{"name":"validate_payload","description":"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 receive"},{"name":"extract_document","description":"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 extr"},{"name":"ask_kamy","description":"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."},{"name":"create_signature_request","description":"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."},{"name":"create_envelope","description":"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 "},{"name":"list_signature_requests","description":"List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions."},{"name":"get_signature_certificate","description":"Returns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, wi"},{"name":"get_signature_request","description":"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,"},{"name":"get_envelope","description":"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 — pl"},{"name":"remind_signature","description":"Resend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — su"},{"name":"bulk_signature_requests","description":"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 ow"},{"name":"preview_field_placement","description":"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 "},{"name":"list_signature_templates","description":"List this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are s"},{"name":"get_signature_template","description":"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 "},{"name":"pki_sign_pdf","description":"Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions."},{"name":"verify_pdf_signature","description":"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 m"},{"name":"attest_artifact","description":"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 "},{"name":"verify_attestation","description":"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"},{"name":"record_agent_action","description":"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 wr"},{"name":"get_provenance_chain","description":"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 paren"},{"name":"trace_record","description":"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 t"},{"name":"trace_record_batch","description":"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 o"},{"name":"trace_search","description":"Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, late"},{"name":"verify_mcp_server","description":"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 de"},{"name":"scan_tool_description","description":"Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts "},{"name":"get_started","description":"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` — th"},{"name":"get_account","description":"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 t"},{"name":"list_renders","description":"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 p"},{"name":"get_render","description":"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 li"},{"name":"get_render_pages","description":"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"},{"name":"extract_from_render","description":"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 t"},{"name":"render_async","description":"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 n"},{"name":"get_job","description":"Poll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'complete"},{"name":"render_batch","description":"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 calli"},{"name":"create_schedule","description":"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 r"},{"name":"list_schedules","description":"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 dup"},{"name":"delete_schedule","description":"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 con"},{"name":"create_webhook","description":"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"},{"name":"list_webhooks","description":"List the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus fr"},{"name":"test_webhook","description":"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."}],"toolCount":59,"toolsHash":"b1d9bba5a3b735cfeb39cb0d99fdd067a88bcdd09b03f52fb0b76860ae6752af","serverName":"kamy","capabilities":["tools"],"serverVersion":"1.5.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T07:26:03.557Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":30,"error":null,"detail":{"tools":[{"name":"list_templates","description":"List Kamy's public system PDF templates. No authentication required."},{"name":"get_template_schema","description":"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 rig"},{"name":"create_template","description":"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"},{"name":"update_template","description":"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. Cruciall"},{"name":"publish_template","description":"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 — thi"},{"name":"rollback_template","description":"Revert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Pr"},{"name":"list_template_versions","description":"List a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_"},{"name":"get_template_version","description":"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_ve"},{"name":"render_pdf","description":"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,"},{"name":"render_docx","description":"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 contain"},{"name":"render_pptx","description":"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, qu"},{"name":"render_xlsx","description":"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 tota"},{"name":"render_html","description":"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 pr"},{"name":"convert_document","description":"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 f"},{"name":"merge_pdfs","description":"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 "},{"name":"split_pdf","description":"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 sa"},{"name":"edit_pdf","description":"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 give"},{"name":"upload_file","description":"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 d"},{"name":"get_upload","description":"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"},{"name":"validate_payload","description":"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 receive"},{"name":"extract_document","description":"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 extr"},{"name":"ask_kamy","description":"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."},{"name":"create_signature_request","description":"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."},{"name":"create_envelope","description":"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 "},{"name":"list_signature_requests","description":"List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions."},{"name":"get_signature_certificate","description":"Returns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, wi"},{"name":"get_signature_request","description":"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,"},{"name":"get_envelope","description":"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 — pl"},{"name":"remind_signature","description":"Resend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — su"},{"name":"bulk_signature_requests","description":"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 ow"},{"name":"preview_field_placement","description":"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 "},{"name":"list_signature_templates","description":"List this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are s"},{"name":"get_signature_template","description":"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 "},{"name":"pki_sign_pdf","description":"Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions."},{"name":"verify_pdf_signature","description":"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 m"},{"name":"attest_artifact","description":"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 "},{"name":"verify_attestation","description":"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"},{"name":"record_agent_action","description":"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 wr"},{"name":"get_provenance_chain","description":"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 paren"},{"name":"trace_record","description":"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 t"},{"name":"trace_record_batch","description":"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 o"},{"name":"trace_search","description":"Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, late"},{"name":"verify_mcp_server","description":"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 de"},{"name":"scan_tool_description","description":"Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts "},{"name":"get_started","description":"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` — th"},{"name":"get_account","description":"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 t"},{"name":"list_renders","description":"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 p"},{"name":"get_render","description":"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 li"},{"name":"get_render_pages","description":"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"},{"name":"extract_from_render","description":"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 t"},{"name":"render_async","description":"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 n"},{"name":"get_job","description":"Poll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'complete"},{"name":"render_batch","description":"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 calli"},{"name":"create_schedule","description":"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 r"},{"name":"list_schedules","description":"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 dup"},{"name":"delete_schedule","description":"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 con"},{"name":"create_webhook","description":"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"},{"name":"list_webhooks","description":"List the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus fr"},{"name":"test_webhook","description":"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."}],"toolCount":59,"toolsHash":"b1d9bba5a3b735cfeb39cb0d99fdd067a88bcdd09b03f52fb0b76860ae6752af","serverName":"kamy","capabilities":["tools"],"serverVersion":"1.5.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-08T00:26:17.795Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":24,"error":null,"detail":{"tools":[{"name":"list_templates","description":"List Kamy's public system PDF templates. No authentication required."},{"name":"get_template_schema","description":"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 rig"},{"name":"create_template","description":"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"},{"name":"update_template","description":"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. Cruciall"},{"name":"publish_template","description":"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 — thi"},{"name":"rollback_template","description":"Revert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Pr"},{"name":"list_template_versions","description":"List a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_"},{"name":"get_template_version","description":"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_ve"},{"name":"render_pdf","description":"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,"},{"name":"render_docx","description":"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 contain"},{"name":"render_pptx","description":"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, qu"},{"name":"render_xlsx","description":"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 tota"},{"name":"render_html","description":"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 pr"},{"name":"convert_document","description":"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 f"},{"name":"merge_pdfs","description":"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 "},{"name":"split_pdf","description":"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 sa"},{"name":"edit_pdf","description":"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 give"},{"name":"upload_file","description":"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 d"},{"name":"get_upload","description":"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"},{"name":"validate_payload","description":"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 receive"},{"name":"extract_document","description":"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 extr"},{"name":"ask_kamy","description":"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."},{"name":"create_signature_request","description":"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."},{"name":"create_envelope","description":"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 "},{"name":"list_signature_requests","description":"List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions."},{"name":"get_signature_certificate","description":"Returns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, wi"},{"name":"get_signature_request","description":"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,"},{"name":"get_envelope","description":"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 — pl"},{"name":"remind_signature","description":"Resend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — su"},{"name":"bulk_signature_requests","description":"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 ow"},{"name":"preview_field_placement","description":"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 "},{"name":"list_signature_templates","description":"List this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are s"},{"name":"get_signature_template","description":"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 "},{"name":"pki_sign_pdf","description":"Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions."},{"name":"verify_pdf_signature","description":"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 m"},{"name":"attest_artifact","description":"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 "},{"name":"verify_attestation","description":"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"},{"name":"record_agent_action","description":"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 wr"},{"name":"get_provenance_chain","description":"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 paren"},{"name":"trace_record","description":"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 t"},{"name":"trace_record_batch","description":"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 o"},{"name":"trace_search","description":"Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, late"},{"name":"verify_mcp_server","description":"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 de"},{"name":"scan_tool_description","description":"Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts "},{"name":"get_started","description":"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` — th"},{"name":"get_account","description":"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 t"},{"name":"list_renders","description":"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 p"},{"name":"get_render","description":"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 li"},{"name":"get_render_pages","description":"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"},{"name":"extract_from_render","description":"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 t"},{"name":"render_async","description":"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 n"},{"name":"get_job","description":"Poll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'complete"},{"name":"render_batch","description":"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 calli"},{"name":"create_schedule","description":"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 r"},{"name":"list_schedules","description":"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 dup"},{"name":"delete_schedule","description":"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 con"},{"name":"create_webhook","description":"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"},{"name":"list_webhooks","description":"List the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus fr"},{"name":"test_webhook","description":"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."}],"toolCount":59,"toolsHash":"b1d9bba5a3b735cfeb39cb0d99fdd067a88bcdd09b03f52fb0b76860ae6752af","serverName":"kamy","capabilities":["tools"],"serverVersion":"1.5.0","protocolVersion":"2025-06-18"}},{"at":"2026-10-07T18:27:08.996Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":44,"error":null,"detail":{"tools":[{"name":"list_templates","description":"List Kamy's public system PDF templates. No authentication required."},{"name":"get_template_schema","description":"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 rig"},{"name":"create_template","description":"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"},{"name":"update_template","description":"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. Cruciall"},{"name":"publish_template","description":"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 — thi"},{"name":"rollback_template","description":"Revert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Pr"},{"name":"list_template_versions","description":"List a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_"},{"name":"get_template_version","description":"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_ve"},{"name":"render_pdf","description":"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,"},{"name":"render_docx","description":"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 contain"},{"name":"render_pptx","description":"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, qu"},{"name":"render_xlsx","description":"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 tota"},{"name":"render_html","description":"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 pr"},{"name":"convert_document","description":"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 f"},{"name":"merge_pdfs","description":"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 "},{"name":"split_pdf","description":"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 sa"},{"name":"edit_pdf","description":"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 give"},{"name":"upload_file","description":"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 d"},{"name":"get_upload","description":"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"},{"name":"validate_payload","description":"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 receive"},{"name":"extract_document","description":"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 extr"},{"name":"ask_kamy","description":"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."},{"name":"create_signature_request","description":"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."},{"name":"create_envelope","description":"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 "},{"name":"list_signature_requests","description":"List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions."},{"name":"get_signature_certificate","description":"Returns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, wi"},{"name":"get_signature_request","description":"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,"},{"name":"get_envelope","description":"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 — pl"},{"name":"remind_signature","description":"Resend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — su"},{"name":"bulk_signature_requests","description":"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 ow"},{"name":"preview_field_placement","description":"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 "},{"name":"list_signature_templates","description":"List this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are s"},{"name":"get_signature_template","description":"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 "},{"name":"pki_sign_pdf","description":"Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions."},{"name":"verify_pdf_signature","description":"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 m"},{"name":"attest_artifact","description":"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 "},{"name":"verify_attestation","description":"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"},{"name":"record_agent_action","description":"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 wr"},{"name":"get_provenance_chain","description":"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 paren"},{"name":"trace_record","description":"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 t"},{"name":"trace_record_batch","description":"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 o"},{"name":"trace_search","description":"Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, late"},{"name":"verify_mcp_server","description":"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 de"},{"name":"scan_tool_description","description":"Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts "},{"name":"get_started","description":"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` — th"},{"name":"get_account","description":"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 t"},{"name":"list_renders","description":"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 p"},{"name":"get_render","description":"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 li"},{"name":"get_render_pages","description":"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"},{"name":"extract_from_render","description":"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 t"},{"name":"render_async","description":"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 n"},{"name":"get_job","description":"Poll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'complete"},{"name":"render_batch","description":"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 calli"},{"name":"create_schedule","description":"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 r"},{"name":"list_schedules","description":"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 dup"},{"name":"delete_schedule","description":"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 con"},{"name":"create_webhook","description":"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"},{"name":"list_webhooks","description":"List the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus fr"},{"name":"test_webhook","description":"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."}],"toolCount":59,"toolsHash":"b1d9bba5a3b735cfeb39cb0d99fdd067a88bcdd09b03f52fb0b76860ae6752af","serverName":"kamy","capabilities":["tools"],"serverVersion":"1.5.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"list_templates","description":"List Kamy's public system PDF templates. No authentication required."},{"name":"get_template_schema","description":"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 rig"},{"name":"create_template","description":"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"},{"name":"update_template","description":"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. Cruciall"},{"name":"publish_template","description":"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 — thi"},{"name":"rollback_template","description":"Revert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again. Pr"},{"name":"list_template_versions","description":"List a template's immutable version snapshots, newest first, as { id, version, createdAt }. This is where the version number that publish_template and rollback_"},{"name":"get_template_version","description":"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_ve"},{"name":"render_pdf","description":"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,"},{"name":"render_docx","description":"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 contain"},{"name":"render_pptx","description":"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, qu"},{"name":"render_xlsx","description":"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 tota"},{"name":"render_html","description":"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 pr"},{"name":"convert_document","description":"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 f"},{"name":"merge_pdfs","description":"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 "},{"name":"split_pdf","description":"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 sa"},{"name":"edit_pdf","description":"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 give"},{"name":"upload_file","description":"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 d"},{"name":"get_upload","description":"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"},{"name":"validate_payload","description":"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 receive"},{"name":"extract_document","description":"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 extr"},{"name":"ask_kamy","description":"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."},{"name":"create_signature_request","description":"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."},{"name":"create_envelope","description":"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 "},{"name":"list_signature_requests","description":"List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions."},{"name":"get_signature_certificate","description":"Returns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, wi"},{"name":"get_signature_request","description":"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,"},{"name":"get_envelope","description":"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 — pl"},{"name":"remind_signature","description":"Resend the signature invitation email. Pass signatureRequestId to nudge one signer, or envelopeId to nudge every currently-pending recipient of an envelope — su"},{"name":"bulk_signature_requests","description":"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 ow"},{"name":"preview_field_placement","description":"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 "},{"name":"list_signature_templates","description":"List this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first. These are s"},{"name":"get_signature_template","description":"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 "},{"name":"pki_sign_pdf","description":"Cryptographically sign an existing render with PAdES when a Kamy API key is configured. Without a key, returns dashboard setup instructions."},{"name":"verify_pdf_signature","description":"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 m"},{"name":"attest_artifact","description":"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 "},{"name":"verify_attestation","description":"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"},{"name":"record_agent_action","description":"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 wr"},{"name":"get_provenance_chain","description":"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 paren"},{"name":"trace_record","description":"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 t"},{"name":"trace_record_batch","description":"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 o"},{"name":"trace_search","description":"Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window. Returns record metadata — model, tokens, late"},{"name":"verify_mcp_server","description":"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 de"},{"name":"scan_tool_description","description":"Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts "},{"name":"get_started","description":"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` — th"},{"name":"get_account","description":"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 t"},{"name":"list_renders","description":"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 p"},{"name":"get_render","description":"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 li"},{"name":"get_render_pages","description":"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"},{"name":"extract_from_render","description":"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 t"},{"name":"render_async","description":"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 n"},{"name":"get_job","description":"Poll an asynchronous render job started by render_async. Returns { jobId, status } where status is 'queued', 'processing', 'completed' or 'failed'; on 'complete"},{"name":"render_batch","description":"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 calli"},{"name":"create_schedule","description":"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 r"},{"name":"list_schedules","description":"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 dup"},{"name":"delete_schedule","description":"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 con"},{"name":"create_webhook","description":"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"},{"name":"list_webhooks","description":"List the webhook endpoints registered on this account, with the id needed to test one. Each row carries url, events, enabled, and lastDeliveryAt / lastStatus fr"},{"name":"test_webhook","description":"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."}],"package":null,"toolSurface":{"id":"ts_xhvrfxpkhepe","endpointId":"ep_8hwwfhv8ruyr","hash":"b1d9bba5a3b735cfeb39cb0d99fdd067a88bcdd09b03f52fb0b76860ae6752af","toolCount":59,"serverName":"kamy","serverVersion":"1.5.0","protocolVersion":"2025-06-18","firstSeenAt":"2026-09-12T09:28:00.257Z","lastSeenAt":"2026-10-10T04:33:05.451Z","observations":102,"toolNames":["list_templates","get_template_schema","create_template","update_template","publish_template","rollback_template","list_template_versions","get_template_version","render_pdf","render_docx","render_pptx","render_xlsx","render_html","convert_document","merge_pdfs","split_pdf","edit_pdf","upload_file","get_upload","validate_payload","extract_document","ask_kamy","create_signature_request","create_envelope","list_signature_requests","get_signature_certificate","get_signature_request","get_envelope","remind_signature","bulk_signature_requests","preview_field_placement","list_signature_templates","get_signature_template","pki_sign_pdf","verify_pdf_signature","attest_artifact","verify_attestation","record_agent_action","get_provenance_chain","trace_record","trace_record_batch","trace_search","verify_mcp_server","scan_tool_description","get_started","get_account","list_renders","get_render","get_render_pages","extract_from_render","render_async","get_job","render_batch","create_schedule","list_schedules","delete_schedule","create_webhook","list_webhooks","test_webhook"],"distinctSurfaces":1},"endpointFacts":[{"id":"ep_8hwwfhv8ruyr","url":"https://mcp.kamy.dev/mcp","type":"mcp_streamable_http","factsCheckedAt":"2026-10-09T03:22:46.941Z","auth":{"observedAt":"2026-10-09T03:22:46.985Z","authRequired":false,"scheme":null,"resourceMetadata":null,"authorizationServer":null,"conformance":{"dpop":false,"rfc8414":false,"rfc9728":false,"pkceS256":false,"clientIdMetadataDocument":false,"dynamicClientRegistration":false}},"tls":{"observedAt":"2026-10-09T03:22:46.993Z","protocol":"TLSv1.3","chainValid":true,"chainError":null,"hostMatches":true,"subject":"kamy.dev","issuer":{"commonName":"WE1","organization":"Google Trust Services"},"validFrom":"2026-08-17T10:13:36.000Z","validTo":"2026-11-15T11:13:18.000Z","daysToExpiry":36,"sanCount":3,"fingerprint256":"A0:C5:57:E6:F9:78:65:31:86:CE:33:30:F1:BE:25:4D:7A:91:C2:1C:A3:45:80:95:69:FE:F7:9B:50:3C:13:AD"}}]},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"dev.kamy/kamy","url":"https://registry.modelcontextprotocol.io/v0/servers/dev.kamy%2Fkamy","firstSeenAt":"2026-09-05T23:20:57.315Z","fetchedAt":"2026-10-09T13:22:20.788Z","normalizedAt":"2026-10-09T13:22:20.788Z"}]},"firstSeenAt":"2026-09-05T23:20:57.315Z","updatedAt":"2026-10-10T04:34:56.150Z"}