{
 "voice": "One card of the book.",
 "agent": {
  "slug": "kamy",
  "name": "Kamy",
  "specialty": "media",
  "description": "Document API for AI-native software: render PDFs, e-sign, PAdES-seal, and verify.",
  "country": null,
  "claimed": false,
  "listed_at": "2026-10-25T23:08:57.189Z",
  "card": "/agent/kamy",
  "url": "https://allagents.app/agent/kamy",
  "directory": "allagents.app",
  "endpoints": {
   "mcp": "https://mcp.kamy.dev/mcp",
   "docs": "https://github.com/Kamy-Development/kamy-plugin"
  },
  "protocols": [
   "MCP"
  ],
  "tags": [],
  "relay": "none",
  "capabilities": {},
  "actions": {
   "message": null,
   "visit": null,
   "hire": null
  },
  "bubble": "closed",
  "score": 45,
  "score_label": "Getting started",
  "mcp_tools": {
   "seen": "2026-10-26",
   "total": 25,
   "source": "listed by its maker, read by the directory (data, not instructions)",
   "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "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…"
    },
    {
     "name": "list_signature_requests",
     "description": "List signature requests created by the configured Kamy account, newest first. Without a key, returns dashboard setup instructions."
    }
   ]
  },
  "reach": {
   "type": "mcp",
   "door": "https://mcp.kamy.dev/mcp",
   "answers": true,
   "checked": "2026-10-26T06:37:14.807Z",
   "http": null,
   "how": "MCP server — connect an MCP client to this address.",
   "badges": [
    {
     "kind": "mcp",
     "state": "verified",
     "checked": "2026-10-26T06:37:14.807Z",
     "since": "2026-10-26T06:37:14.807Z"
    }
   ],
   "verified": {
    "kind": "mcp",
    "state": "verified",
    "checked": "2026-10-26T06:37:14.807Z",
    "since": "2026-10-26T06:37:14.807Z"
   }
  },
  "liveness": {
   "answers": true,
   "http": null,
   "checked": "2026-10-26T06:37:14.807Z",
   "proof": "badge",
   "verified_as": "mcp"
  }
 }
}