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.

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

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)

Docs
claude 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

Docs
URL     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

Docs
https://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

13

Generate, convert and reshape files. Every tool here spends one render from the monthly quota.

  • render_pdfAPI keyrender

    Render a PDF from a Kamy template and data, and wait for it.

  • render_docxAPI keyrender

    Render an editable Word (.docx) document from a Kamy template and data.

  • render_pptxAPI keyrender

    Build a PowerPoint (.pptx) deck from a slide spec: an ordered array of slides, each tagged with one of five fixed layouts (title, bullets, two-column, table, quote).

  • render_xlsxAPI keyrender

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

  • render_htmlAPI keyrender

    Compile a Kamy template — or raw Handlebars source you pass inline — against a data payload and get the rendered HTML string back.

  • convert_documentAPI keyrender

    Convert a file you already hold — .docx, .xlsx or .csv — into a PDF, preserving its existing content.

  • merge_pdfsAPI keyrender

    Concatenate 2–20 existing renders into a single new PDF, in exactly the order the ids are given.

  • split_pdfAPI keyrender

    Extract page ranges from one existing render into separate new PDFs — the inverse of merge_pdfs.

  • edit_pdfAPI keyrender

    Modify an existing PDF: fill AcroForm fields by name, stamp text at absolute coordinates, or paint opaque boxes over regions.

  • upload_fileAPI keyuploads:write

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

  • get_uploadAPI keyuploads:read

    Look up a stored asset by its upload id: filename, contentType, sizeBytes, status, its `kamy://asset/<id>` reference, and a freshly signed downloadUrl valid for one hour once the bytes exist.

  • render_asyncAPI keyrender

    Queue one PDF render and return immediately with { jobId, status: 'queued' } instead of waiting for the document.

  • render_batchAPI keyrender

    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.

Account, quota & history

5

Check what the plan allows before spending it, and find a document this account already produced.

  • get_accountAPI key

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

  • list_rendersAPI keyrenders:read

    List the documents this account has already produced, newest first.

  • get_renderAPI keyrenders:read

    Fetch one previously produced document by its render id, with a freshly signed download URL valid for the next hour.

  • get_render_pagesAPI keyrenders:read

    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.

  • get_jobAPI keyrenders:read

    Poll an asynchronous render job started by render_async.

Scheduling & webhooks

6

Run renders on a cron and get called back when work finishes, so nothing has to sit and poll.

  • create_scheduleAPI keyschedules:write

    Set up a recurring render: a cron expression, a template, and where each document goes.

  • list_schedulesAPI keyschedules:read

    List this account's recurring render schedules, newest first, with the id needed to delete one.

  • delete_scheduleAPI keyschedules:write

    Permanently delete a recurring schedule so it stops firing.

  • create_webhookAPI keywebhooks:write

    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.

  • list_webhooksAPI keywebhooks:read

    List the webhook endpoints registered on this account, with the id needed to test one.

  • test_webhookAPI keywebhooks:write

    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.

Signatures

13

Send a PDF for e-signature, seal it with PAdES cryptography, and pull the audit certificate back out.

  • create_signature_requestAPI keysignatures:write

    Send a previously rendered PDF to a signer for e-signature when a Kamy API key is configured.

  • create_envelopeAPI keysignatures:write

    Send a single PDF to 2–10 signers as one envelope.

  • list_signature_requestsAPI keysignatures:read

    List signature requests created by the configured Kamy account, newest first.

  • get_signature_certificateAPI keysignatures:read

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

  • get_signature_requestAPI keysignatures:read

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

  • get_envelopeAPI keysignatures:read

    Fetch one multi-signer envelope with every recipient in signing order — each with a live sign_url, status, recipient_order, expires_at and last_reminded_at — plus the envelope's own status and routing.

  • remind_signatureAPI keysignatures:write

    Resend the signature invitation email.

  • bulk_signature_requestsAPI keysignatures:write

    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.

  • preview_field_placementAPI keysignatures:read

    Check a placedFields layout against a real render's page geometry before anything is sent: no signature request is created, no email goes out, and no signature quota is spent.

  • list_signature_templatesAPI keysignatures:read

    List 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:read

    Fetch one e-signature preset in full, including the placed_fields array and position that list_signature_templates omits.

  • pki_sign_pdfAPI keysignatures:write

    Cryptographically sign an existing render with PAdES when a Kamy API key is configured.

  • verify_pdf_signaturepublic

    Turn PDF bytes you are holding into their SHA-256 digest and the matching kamy.dev/verify/{sha256} page URL.

Data extraction & validation

3

Read an inbound document, or check a payload before spending a render on it.

  • validate_payloadAPI keyrender

    Dry-run a render payload against a template's schema WITHOUT producing a PDF or using quota.

  • extract_documentAPI keyextract

    Extract structured data from a PDF (invoice, receipt, contract, ID document, or any form).

  • extract_from_renderAPI keyrenders:read

    Read the text or the form fields back out of a document this account already rendered, without uploading anything.

Trust & provenance

7

Sign what your agent produced and keep a hash-chained record of what it did, so it can be replayed later.

  • attest_artifactAPI keyattest

    Cryptographically sign an output your agent produced — a PDF, report, code patch, dataset, email — so a third party can later confirm those exact bytes are the ones that were recorded, unmodified.

  • verify_attestationpublic

    Ask Kamy whether a SHA-256 digest has an attestation on record — the tool that actually returns a verdict.

  • record_agent_actionAPI keytrace:record

    Append one signed tool_call -> tool_result pair to a tamper-evident ledger.

  • get_provenance_chainAPI keytrace:read

    Replay everything recorded under one run_id — artifacts from attest_artifact and calls from record_agent_action — in order, with each record's link to its parent hash.

  • trace_recordAPI keytrace:record

    Record one LLM call — prompt, output, provider, model, tokens, latency — into Kamy Trace, a signed retention ledger.

  • trace_record_batchAPI keytrace:record

    Write up to 100 Kamy Trace records in one call.

  • trace_searchAPI keytrace:read

    Query this account's Kamy Trace records, newest first, filtered by feature, status, provider, tag, or time window.

MCP ecosystem trust

2

Kamy watching the rest of the MCP ecosystem on your behalf: manifest drift and prompt-injection tells.

  • verify_mcp_serverAPI keytrace:record

    Detect when an MCP server changes its tool manifest after you adopted it — the 'rug pull' case, where a server you already trusted silently rewrites a tool's description or input schema.

  • scan_tool_descriptionAPI keytrace:read

    Heuristic pattern scan of MCP tool description text for prompt-injection tells — instructions addressed at the reading model, data-exfiltration hints, attempts to override your system prompt or hide content.

Template authoring & versioning

6

Write your own templates, snapshot them into versions, publish one, and roll back when a release goes wrong.

  • create_templateAPI keytemplates:write

    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.

  • update_templateAPI keytemplates:write

    Edit an existing custom template's DRAFT — name, html, css, schema, tags, visibility — addressed by UUID or slug.

  • publish_templateAPI keytemplates:write

    Make a template version live for rendering.

  • rollback_templateAPI keytemplates:write

    Revert 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:read

    List a template's immutable version snapshots, newest first, as { id, version, createdAt }.

  • get_template_versionAPI keytemplates:read

    Fetch one template version snapshot in full — html, css, schema, createdBy, createdAt — exactly as it was frozen when that version was cut.

Templates & setup

4

Discovery and onboarding. All public — an agent can call these before you have a key.

  • list_templatespublic

    List Kamy's public system PDF templates.

  • get_template_schemapublic

    Fetch the JSON Schema (exact data shape) and a copy-pasteable sample payload for a Kamy system template by slug.

  • ask_kamypublic

    Ask Kamy Brain a question about Kamy usage, templates, plans, or errors.

  • get_startedpublic

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

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.

MCP Server — Kamy — Kamy