{
  "markdown": "<p align=\"center\">\n  <img src=\"assets/banner.png\" alt=\"WaxSeal SDK\" width=\"100%\" />\n</p>\n\n<h1 align=\"center\">WaxSeal SDK</h1>\n\n<p align=\"center\">\n  <strong>Cryptographic identity for the open web and for AI agents.</strong><br/>\n  One Ed25519 keypair. One 64-character fingerprint. Permanent on-chain record.\n</p>\n\n<p align=\"center\">\n  <a href=\"https://waxseal.id\">waxseal.id</a> ·\n  <a href=\"https://waxseal.id/developers\">Developer Docs</a> ·\n  <a href=\"https://waxseal.id/create\">Get your seal</a>\n</p>\n\n<p align=\"center\">\n  <img src=\"https://img.shields.io/badge/license-MIT-crimson.svg\" alt=\"MIT License\" />\n  <img src=\"https://img.shields.io/badge/TypeScript-ready-blue.svg\" alt=\"TypeScript\" />\n  <img src=\"https://img.shields.io/badge/REST%20API-no%20key%20required-green.svg\" alt=\"REST API\" />\n  <img src=\"https://img.shields.io/npm/v/@waxseal/verify?color=blue&label=%40waxseal%2Fverify\" alt=\"@waxseal/verify on npm\" />\n  <img src=\"https://img.shields.io/npm/v/@waxseal/mcp?color=crimson&label=%40waxseal%2Fmcp\" alt=\"@waxseal/mcp on npm\" />\n  <a href=\"https://glama.ai/mcp/servers/degenlegion-com/waxseal-sdk\"><img src=\"https://glama.ai/mcp/servers/degenlegion-com/waxseal-sdk/badges/score.svg\" alt=\"Glama MCP score\" /></a>\n</p>\n\n---\n\n## Packages\n\n| Package | What it is | Install |\n|---------|-----------|---------|\n| [`@waxseal/verify`](#waxsealverify) | Browser + Node SDK — verify identities, validate signatures, embed badges, verify webhooks | `npm install @waxseal/verify` |\n| [`@waxseal/mcp`](./mcp) | MCP server for Claude, Cursor, Windsurf, and VS Code — verify identities, sign documents, gate AI actions with human approvals | `npx @waxseal/mcp` |\n\n---\n\n## `@waxseal/mcp` — for AI agents\n\n<a href=\"https://smithery.ai/servers/degenlegion-com/waxseal\"><img src=\"https://smithery.ai/badge/degenlegion-com/waxseal\" alt=\"Smithery\" /></a>\n<img src=\"https://img.shields.io/npm/v/@waxseal/mcp?color=crimson&label=npm\" alt=\"npm\" />\n\nGive Claude, Cursor, Windsurf, or VS Code Copilot a cryptographic identity layer in under two minutes.\n\n```json\n{\n  \"mcpServers\": {\n    \"waxseal\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@waxseal/mcp\"],\n      \"env\": {\n        \"WAXSEAL_PRIVATE_KEY_PEM\": \"-----BEGIN PRIVATE KEY-----\\n<your key>\\n-----END PRIVATE KEY-----\"\n      }\n    }\n  }\n}\n```\n\n> **No install needed.** Use the hosted server in any HTTP-capable MCP client:\n> `https://api.waxseal.id/mcp`\n\n**What the 6 tools give your agent:**\n\n| Tool | What it does | Key needed? |\n|------|-------------|:-----------:|\n| `waxseal.info` | Platform overview, tiers, and tool guide | No |\n| `waxseal.identity.verify` | Look up fingerprint → name, chain, wallet, status | No |\n| `waxseal.signature.verify` | Confirm an Ed25519 signature against an on-chain key | No |\n| `waxseal.approval.verify` | Validate a human approval token before executing | No |\n| `waxseal.document.sign` | Sign any content with your WaxSeal private key | **Yes** |\n| `waxseal.approval.create` | Create a signed, time-limited approval token | **Yes** |\n\nVerify-only tools work with zero configuration. Signing tools require `WAXSEAL_PRIVATE_KEY_PEM`.\n\n→ [Full MCP docs](./mcp/README.md) · [Smithery listing](https://smithery.ai/servers/degenlegion-com/waxseal) · [npm](https://www.npmjs.com/package/@waxseal/mcp)\n\n---\n\n## `@waxseal/verify` — for apps and backends {#waxsealverify}\n\n<img src=\"https://img.shields.io/npm/v/@waxseal/verify?color=blue&label=npm\" alt=\"npm\" />\n\n```bash\nnpm install @waxseal/verify\n```\n\nWorks in **React**, **Vue**, **Node.js**, **n8n**, serverless functions, and any runtime with `fetch`.\n\n<p align=\"center\">\n  <img src=\"assets/seals.png\" alt=\"WaxSeal examples\" width=\"80%\" />\n</p>\n\n### Two modes, one fingerprint\n\n#### Mode 1 · Badge Verification\n\n> *\"Does this WaxSeal exist and is it real?\"*\n\nConfirm a seal is on-chain. No user interaction required — the fingerprint alone is enough.\n\n**Use cases**\n- ✦ Verified author badge on blog posts and articles\n- ✦ Contributor identity on GitHub-style tools\n- ✦ Publisher verification on CMS platforms\n- ✦ Prove you created something before AI did\n\n```ts\nimport { verifySeal } from \"@waxseal/verify\";\n\nconst seal = await verifySeal({ fingerprint: \"a1b2c3d4...\" });\n\nif (seal.valid && seal.onChain) {\n  console.log(seal.displayName, \"·\", seal.chain);\n  // \"Ada Lovelace · base\"\n}\n```\n\n---\n\n#### Mode 2 · Login & Action Approval\n\n> *\"Did this person sign this, right now?\"*\n\nA signed challenge proves the key holder is present — replaces passwords, OTP, and email loops entirely.\n\n**Use cases**\n- ✦ Passwordless sign-in — no email, no OTP, no credentials to breach\n- ✦ Approve a document or high-value transaction\n- ✦ Gate a comment, post, or vote behind verified identity\n- ✦ Issue an API key only to verified seal holders\n- ✦ Automate identity checks in n8n / Make.com / Zapier\n\n```ts\nconst seal = await verifySeal({\n  fingerprint: \"a1b2c3d4...\",\n  message:     \"I approve this transfer.\",\n  signature:   \"base64url...\",\n});\n\nif (seal.valid && seal.onChain && seal.signatureValid) {\n  // Cryptographic proof — no password, no session token\n}\n```\n\n---\n\n### React Badge\n\n```tsx\nimport { WaxSealBadge } from \"@waxseal/verify/badge\";\n\n<WaxSealBadge fingerprint=\"a1b2c3d4...\" />\n```\n\nOr build your own:\n\n```tsx\nimport { useEffect, useState } from \"react\";\nimport { verifySeal, type VerifyResult } from \"@waxseal/verify\";\n\nexport function SealBadge({ fingerprint }: { fingerprint: string }) {\n  const [seal, setSeal] = useState<VerifyResult | null>(null);\n\n  useEffect(() => {\n    let active = true;\n    verifySeal({ fingerprint }).then((r) => active && setSeal(r));\n    return () => { active = false; };\n  }, [fingerprint]);\n\n  if (!seal?.valid || !seal.onChain) return null;\n\n  return (\n    <a href={`https://waxseal.id/seal/${seal.fingerprint}`} target=\"_blank\" rel=\"noopener noreferrer\">\n      ✦ {seal.displayName ?? seal.fingerprint.slice(0, 8)}\n    </a>\n  );\n}\n```\n\n---\n\n### HTML Embed (no build step)\n\n```html\n<script src=\"https://waxseal.id/embed.js\"></script>\n<span data-wax-seal=\"YOUR_64_CHAR_FINGERPRINT\"></span>\n```\n\n> **Email** — script tags are blocked by mail clients. Use a plain link instead:\n> `<a href=\"https://waxseal.id/seal/YOUR_FINGERPRINT\">Verify my Wax Seal</a>`\n\n---\n\n### Webhook Verification\n\n```ts\nimport { verifyWebhookSignature, isWaxSealWebhookEvent } from \"@waxseal/verify/webhooks\";\n\napp.post(\"/webhook/waxseal\", express.raw({ type: \"*/*\" }), (req, res) => {\n  const valid = verifyWebhookSignature({\n    body:      req.body,\n    signature: String(req.headers[\"x-waxseal-signature\"]),\n    secret:    process.env.WAXSEAL_WEBHOOK_SECRET,\n  });\n\n  if (!valid) return res.status(401).send(\"Invalid signature\");\n\n  const event = JSON.parse(req.body.toString());\n\n  if (isWaxSealWebhookEvent(event, \"seal.minted\")) {\n    console.log(\"New seal:\", event.data.fingerprint, \"on\", event.data.chain);\n  }\n\n  res.sendStatus(200);\n});\n```\n\n**Webhook events**\n\n| Event | When it fires |\n|---|---|\n| `seal.verified` | A seal was verified via the API |\n| `seal.minted` | A new seal NFT was minted on-chain |\n| `seal.updated` | Seal name, avatar, or metadata changed |\n| `seal.subscription.started` | A seal holder started a paid subscription |\n| `seal.subscription.ended` | A subscription expired or was cancelled |\n| `challenge.approved` | A login challenge was verified — user authenticated |\n\n---\n\n### REST API — no SDK, no key required\n\n```\nPOST https://api.waxseal.id/v1/verify\nContent-Type: application/json\n\n{\n  \"fingerprint\": \"<64-char hex>\",\n  \"message\":     \"...\",\n  \"signature\":   \"...\"\n}\n```\n\n```json\n{\n  \"valid\": true,\n  \"onChain\": true,\n  \"chain\": \"base\",\n  \"displayName\": \"Ada Lovelace\",\n  \"walletAddress\": \"0x…\",\n  \"signatureValid\": true,\n  \"verifiedAt\": \"2026-01-01T00:00:00Z\"\n}\n```\n\n---\n\n### Works with everything\n\n| Stack | How |\n|---|---|\n| **React / Vue / Svelte** | `npm install @waxseal/verify` |\n| **Node.js / Express** | Same package + webhook helper |\n| **n8n** | HTTP Request node → REST API, or npm package in Code node |\n| **Make.com** | HTTP module → REST API |\n| **Zapier** | Webhook by Zapier trigger |\n| **PHP / Python / Go** | Plain HTTP POST to the REST API |\n| **Static HTML / CMS** | Two-line `embed.js` snippet |\n| **Claude / Cursor / Windsurf / VS Code** | [`@waxseal/mcp`](./mcp) |\n\n---\n\n### VerifyResult type\n\n```ts\ntype VerifyResult = {\n  valid: boolean;\n  fingerprint: string;\n  onChain: boolean;\n  chain?: \"ethereum\" | \"base\" | \"bnb\";\n  walletAddress?: string;\n  displayName?: string;\n  publicKeyConfirmed?: boolean;\n  signatureValid?: boolean;\n  verifiedAt?: string;\n  error?: string;\n};\n```\n\n---\n\nMIT © [Wax Seal](https://waxseal.id)\n",
  "bytes": 8640,
  "sha": "8452d765f56f877a634641ce5f81f50c8e4e4dc8e059ef3f0c9f502692788411",
  "repo_slug": "degenlegion-com/waxseal-sdk",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_degenlegion_com_waxseal_272b9a8d/readme"
}