MCP Server
Give your agent the whole document layer.
Kamy ships a hosted Model Context Protocol server at https://mcp.kamy.dev/mcp. Connect any MCP client in one command — no proxy server, no JSON-schema maintenance, no function-call boilerplate. Your agent discovers 59 tools on connect: rendering and file conversion, e-signature and PAdES sealing, document extraction, and a signed provenance ledger for what it did.
6 tools work with no key at all. The other 53 touch your account — add your API key as a Bearer header, below.
What is MCP?
The Model Context Protocol is the open standard for connecting LLMs to external tools and data. Anthropic introduced it in late 2024 and it's now supported by Claude (Desktop + Code), Cursor, and a growing ecosystem of agent frameworks. An MCP server exposes named tools with JSON-Schema-typed parameters — the agent can list them, pick the right one, and call it without you having to write any glue.
Kamy's MCP server is hosted at https://mcp.kamy.dev/mcp over HTTP streamable transport. Authentication uses your standard kamy_pk_… or kamy_sk_… bearer key — same key you use for the REST API, and the same scopes apply.
Install for your AI client
Claude Desktop
Docs// claude_desktop_config.json
{
"mcpServers": {
"kamy": {
"command": "npx",
"args": [
"-y", "mcp-remote", "https://mcp.kamy.dev/mcp",
"--header", "Authorization: Bearer kamy_pk_..."
]
}
}
}Desktop has no CLI — `claude mcp add` is Claude Code's command and does not register anything with Desktop. Either add the config above (Settings → Developer → Edit Config) or use Settings → Connectors → Add custom connector with just the URL. Restart Desktop afterwards; it only re-reads MCP config at startup. All 59 tools then appear in the tools menu. Omit the --header pair to connect anonymously; the 6 public tools still work.
Claude Code (CLI)
Docsclaude mcp add --transport http kamy https://mcp.kamy.dev/mcp \ --header "Authorization: Bearer $KAMY_API_KEY"
Identical install. Once registered, prompting Claude Code to "render an invoice and send it for signature" chains get_template_schema → render_pdf → create_signature_request without you writing any glue.
Cursor
Docs// .cursor/mcp.json
{
"mcpServers": {
"kamy": {
"url": "https://mcp.kamy.dev/mcp",
"transport": "http",
"headers": { "Authorization": "Bearer kamy_pk_..." }
}
}
}Add the snippet to your project's .cursor/mcp.json. Cursor reads it on startup. See Cursor → Settings → MCP for the GUI flow.
Form-based clients
DocsURL https://mcp.kamy.dev/mcp Header Authorization Value Bearer kamy_pk_...
Replit, n8n, Make.com, Zapier and most web dashboards ask for a URL plus one header. The server also accepts the key as X-Kamy-Api-Key if the client reserves Authorization for its own use.
ChatGPT Apps
Docshttps://kamy.dev/api/openapi.json
Custom GPTs and ChatGPT Apps consume OpenAPI rather than MCP. Point Actions at the OpenAPI spec — same backend, same auth (Bearer kamy_pk_…).
The 59 tools
Every tool below is registered by the live server — this list is generated from its source, so it can't fall behind. Each carries its own JSON-Schema signature, which your client reads on connection and renders into the right call for you.
Tools marked API key call your Kamy account and need an API key whose scopes cover them. Everything else answers anonymously.
Signed in? Your MCP page shows the same list with your key's scopes applied, so you can see which of these your agent can actually call.
Documents
13Generate, convert and reshape files. Every tool here spends one render from the monthly quota.
render_pdfAPI keyrenderRender a PDF from a Kamy template and data, and wait for it.
render_docxAPI keyrenderRender an editable Word (.docx) document from a Kamy template and data.
render_pptxAPI keyrenderBuild a PowerPoint (.pptx) deck from a slide spec: an ordered array of slides, each tagged with one of five fixed layouts (title, bullets, two-column, table, quote).
render_xlsxAPI keyrenderBuild an Excel (.xlsx) workbook from a sheet spec: columns with keys, row objects keyed to those columns, optional Excel number formats and a formula-aware total row (bare 'SUM' / 'AVG' / 'COUNT' / 'MIN' / 'MAX' expands into a real formula over the column's data range).
render_htmlAPI keyrenderCompile a Kamy template — or raw Handlebars source you pass inline — against a data payload and get the rendered HTML string back.
convert_documentAPI keyrenderConvert a file you already hold — .docx, .xlsx or .csv — into a PDF, preserving its existing content.
merge_pdfsAPI keyrenderConcatenate 2–20 existing renders into a single new PDF, in exactly the order the ids are given.
split_pdfAPI keyrenderExtract page ranges from one existing render into separate new PDFs — the inverse of merge_pdfs.
edit_pdfAPI keyrenderModify an existing PDF: fill AcroForm fields by name, stamp text at absolute coordinates, or paint opaque boxes over regions.
upload_fileAPI keyuploads:writeStore an image, font or PDF in the account's asset bucket and get back a `kamy://asset/<id>` reference you can drop anywhere inside a render_pdf / render_html data payload — Kamy swaps it for a fresh signed URL at render time.
get_uploadAPI keyuploads:readLook up a stored asset by its upload id: filename, contentType, sizeBytes, status, its `kamy://asset/<id>` reference, and a freshly signed downloadUrl valid for one hour once the bytes exist.
render_asyncAPI keyrenderQueue one PDF render and return immediately with { jobId, status: 'queued' } instead of waiting for the document.
render_batchAPI keyrenderRender 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.
Account, quota & history
5Check what the plan allows before spending it, and find a document this account already produced.
get_accountAPI keyRead everything about the authenticated Kamy account in one call: profile, plan and plan status, the plan's limits (renders per month, API keys, seats, custom templates, overage pricing, priority queue), month-to-date render usage, and whether documents rendered on this plan carry Kamy's own watermark.
list_rendersAPI keyrenders:readList the documents this account has already produced, newest first.
get_renderAPI keyrenders:readFetch one previously produced document by its render id, with a freshly signed download URL valid for the next hour.
get_render_pagesAPI keyrenders:readRasterise every page of an existing render to a PNG image and return one signed 1-hour URL per page, with pixel width and height.
get_jobAPI keyrenders:readPoll an asynchronous render job started by render_async.
Scheduling & webhooks
6Run renders on a cron and get called back when work finishes, so nothing has to sit and poll.
create_scheduleAPI keyschedules:writeSet up a recurring render: a cron expression, a template, and where each document goes.
list_schedulesAPI keyschedules:readList this account's recurring render schedules, newest first, with the id needed to delete one.
delete_scheduleAPI keyschedules:writePermanently delete a recurring schedule so it stops firing.
create_webhookAPI keywebhooks:writeRegister an HTTPS endpoint that Kamy POSTs to when work finishes, so a long render or an e-signature does not have to be polled.
list_webhooksAPI keywebhooks:readList the webhook endpoints registered on this account, with the id needed to test one.
test_webhookAPI keywebhooks:writeSend 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.
Signatures
13Send a PDF for e-signature, seal it with PAdES cryptography, and pull the audit certificate back out.
create_signature_requestAPI keysignatures:writeSend a previously rendered PDF to a signer for e-signature when a Kamy API key is configured.
create_envelopeAPI keysignatures:writeSend a single PDF to 2–10 signers as one envelope.
list_signature_requestsAPI keysignatures:readList signature requests created by the configured Kamy account, newest first.
get_signature_certificateAPI keysignatures:readReturns the authenticated download URL for a signature request's Certificate of Completion PDF — the process audit trail (invite → opened → consent → signed, with IP / user-agent) that legal teams expect.
get_signature_requestAPI keysignatures:readFetch one signature request by id, with the detail list_signature_requests leaves out: the placed_fields layout, signed_at plus signed_ip and signed_user_agent, last_reminded_at, cc_emails, and envelope_id + recipient_order when it is part of an envelope.
get_envelopeAPI keysignatures:readFetch one multi-signer envelope with every recipient in signing order — each with a live sign_url, status, recipient_order, expires_at and last_reminded_at — plus the envelope's own status and routing.
remind_signatureAPI keysignatures:writeResend the signature invitation email.
bulk_signature_requestsAPI keysignatures:writeFan 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.
preview_field_placementAPI keysignatures:readCheck a placedFields layout against a real render's page geometry before anything is sent: no signature request is created, no email goes out, and no signature quota is spent.
list_signature_templatesAPI keysignatures:readList this account's reusable e-signature presets — saved field placements, default invite message, default link lifetime and CC list — newest first.
get_signature_templateAPI keysignatures:readFetch one e-signature preset in full, including the placed_fields array and position that list_signature_templates omits.
pki_sign_pdfAPI keysignatures:writeCryptographically sign an existing render with PAdES when a Kamy API key is configured.
verify_pdf_signaturepublicTurn PDF bytes you are holding into their SHA-256 digest and the matching kamy.dev/verify/{sha256} page URL.
Data extraction & validation
3Read an inbound document, or check a payload before spending a render on it.
validate_payloadAPI keyrenderDry-run a render payload against a template's schema WITHOUT producing a PDF or using quota.
extract_documentAPI keyextractExtract structured data from a PDF (invoice, receipt, contract, ID document, or any form).
extract_from_renderAPI keyrenders:readRead the text or the form fields back out of a document this account already rendered, without uploading anything.
Trust & provenance
7Sign what your agent produced and keep a hash-chained record of what it did, so it can be replayed later.
attest_artifactAPI keyattestCryptographically sign an output your agent produced — a PDF, report, code patch, dataset, email — so a third party can later confirm those exact bytes are the ones that were recorded, unmodified.
verify_attestationpublicAsk Kamy whether a SHA-256 digest has an attestation on record — the tool that actually returns a verdict.
record_agent_actionAPI keytrace:recordAppend one signed tool_call -> tool_result pair to a tamper-evident ledger.
get_provenance_chainAPI keytrace:readReplay everything recorded under one run_id — artifacts from attest_artifact and calls from record_agent_action — in order, with each record's link to its parent hash.
trace_recordAPI keytrace:recordRecord one LLM call — prompt, output, provider, model, tokens, latency — into Kamy Trace, a signed retention ledger.
trace_record_batchAPI keytrace:recordWrite up to 100 Kamy Trace records in one call.
trace_searchAPI keytrace:readQuery this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window.
MCP ecosystem trust
2Kamy watching the rest of the MCP ecosystem on your behalf: manifest drift and prompt-injection tells.
verify_mcp_serverAPI keytrace:recordDetect when an MCP server changes its tool manifest after you adopted it — the 'rug pull' case, where a server you already trusted silently rewrites a tool's description or input schema.
scan_tool_descriptionAPI keytrace:readHeuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts to override your system prompt or hide content.
Template authoring & versioning
6Write your own templates, snapshot them into versions, publish one, and roll back when a release goes wrong.
create_templateAPI keytemplates:writeCreate a new custom PDF template owned by this account: a name, a unique slug, a Handlebars/HTML body, and optional CSS and JSON Schema.
update_templateAPI keytemplates:writeEdit an existing custom template's DRAFT — name, html, css, schema, tags, visibility — addressed by UUID or slug.
publish_templateAPI keytemplates:writeMake a template version live for rendering.
rollback_templateAPI keytemplates:writeRevert a template after a bad release: repoints published_version at the version you name, so every subsequent render immediately serves that snapshot again.
list_template_versionsAPI keytemplates:readList a template's immutable version snapshots, newest first, as { id, version, createdAt }.
get_template_versionAPI keytemplates:readFetch one template version snapshot in full — html, css, schema, createdBy, createdAt — exactly as it was frozen when that version was cut.
Templates & setup
4Discovery and onboarding. All public — an agent can call these before you have a key.
list_templatespublicList Kamy's public system PDF templates.
get_template_schemapublicFetch the JSON Schema (exact data shape) and a copy-pasteable sample payload for a Kamy system template by slug.
ask_kamypublicAsk Kamy Brain a question about Kamy usage, templates, plans, or errors.
get_startedpublicEverything needed to go from nothing to a rendered document in one call: the steps to create an API key in the dashboard, and — when you name a `framework` — the install command for the Kamy SDK, the environment variable it reads, and the client-setup snippet for that stack.
Authentication
There is no OAuth dance and no in-client sign-up prompt: you pass a key or you don't. Get one at kamy.dev/dashboard/api-keys. Use a kamy_pk_… publishable key for development and testing — they work against production but are safe to keep in CI configs and dotfiles. Switch to a kamy_sk_… secret key for high-volume production.
Keys ride as a Bearer token in the Authorization header on every MCP request; clients that reserve that header can send X-Kamy-Api-Key instead. Call a keyed tool without one and it returns setup instructions rather than a cryptic failure. Revoke from the dashboard at any time — the cache invalidates within 60 seconds.
Scopes are enforced by the REST API behind each tool, not by the MCP layer. A key without signatures:write can still see create_signature_request in the tool list, but the call fails with 403 FORBIDDEN. Mint keys with the scopes your agent actually needs.
Example prompts that just work
These are real prompts you can paste into Claude Desktop, Claude Code, or Cursor after installing the MCP server. The agent picks the right tool and arguments automatically.
Generate an invoice
Generate an invoice from Acme Inc. ([email protected]) to Globex Corp. for $5,400. Line items: product design $4,800, three revision rounds at $200 each. Tax rate 8.75%. Net 30. Issue date today.
Behavior: Calls get_template_schema to learn the shape, then render_pdf with template="invoice". Returns a signed PDF URL.
Discover what's available
What document types can Kamy render?
Behavior: Calls list_templates and returns the catalog with descriptions. No API key needed.
Render, then collect two signatures
Render the mutual NDA for Acme and Globex, then send it to [email protected] and [email protected] — Acme signs first.
Behavior: Chains render_pdf → create_envelope with routing="sequential". Each recipient gets their own sign URL.
Read an inbound vendor PDF
Here's the invoice the supplier emailed. Pull the totals and check them against PO-91.
Behavior: Calls extract_document, which returns structured JSON plus a public verify URL anchored to a hash of the source file.
Prove what the agent did
Record this refund approval so we can produce it if the customer disputes the charge.
Behavior: Calls attest_artifact (or record_agent_action inside a run) and returns a verify URL a third party can check without an account.
Country-compliant tax invoice
Generate a UAE FTA tax invoice for Dubai Trading LLC (TRN 100123456700003), VAT 5%, AED 10,000 in consulting services.
Behavior: Calls render_pdf with template="uae-tax-invoice" and bilingual Arabic+English fields. Pro plan or above.
Why MCP, and not function calling?
Function calling (OpenAI Actions, Gemini function declarations) requires you to maintain JSON schemas in your application code, route the call back to the API yourself, and update them whenever the API changes. MCP moves the contract to the server side — you change Kamy, every connected agent picks up the new schema on next list.
Use Kamy's MCP server when your client supports it (Claude, Cursor, agent frameworks). Use the OpenAPI spec at kamy.dev/openapi.json when your platform expects function declarations (ChatGPT Apps, Gemini, Bedrock). Same backend, same auth, same outputs.
Troubleshooting
Tools don't show up after install
Restart your AI client. Some clients only re-read MCP config at startup. In Claude Desktop, fully quit (⌘Q) and reopen — closing the window isn't enough.
Only 6 tools work; the rest ask me to configure a key
Your client connected anonymously. Re-add the server with --header "Authorization: Bearer $KAMY_API_KEY" (or fill the header field in a form-based client) and restart it.
401 UNAUTHORIZED on first call
Your client didn't pass the API key, or the key was revoked. Run `claude mcp list` to see registered servers and re-authenticate. Confirm the key starts with kamy_pk_ or kamy_sk_.
403 FORBIDDEN with a valid key
The key is real but its scopes don't cover that tool — e.g. attest_artifact needs `attest`. Check /dashboard/mcp to see which tools your key permits, then widen or mint a new key.
render_pdf fails with VALIDATION
The data payload didn't match the template's schema. Call get_template_schema for the slug — it returns the exact JSON Schema plus a copy-pasteable sample payload — or validate_payload to dry-run without spending a render.
Cache hits look like duplicate renders
By default identical render payloads (same template + data + options) within 24 hours hit a cache and skip the Chromium pool. The customer still receives a PDF and is billed. Send X-Kamy-Bypass-Cache: 1 to force a fresh render.
Connect your agent in 30 seconds.
Free tier ships with 100 renders / month. No credit card.