WaxSeal SDK

WaxSeal SDK

Cryptographic identity for the open web and for AI agents.
One Ed25519 keypair. One 64-character fingerprint. Permanent on-chain record.

waxseal.id · Developer Docs · Get your seal

MIT License TypeScript REST API @waxseal/verify on npm @waxseal/mcp on npm Glama MCP score

--- ## Packages | Package | What it is | Install | |---------|-----------|---------| | [`@waxseal/verify`](#waxsealverify) | Browser + Node SDK — verify identities, validate signatures, embed badges, verify webhooks | `npm install @waxseal/verify` | | [`@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` | --- ## `@waxseal/mcp` — for AI agents Smithery npm Give Claude, Cursor, Windsurf, or VS Code Copilot a cryptographic identity layer in under two minutes. ```json { "mcpServers": { "waxseal": { "command": "npx", "args": ["-y", "@waxseal/mcp"], "env": { "WAXSEAL_PRIVATE_KEY_PEM": "-----BEGIN PRIVATE KEY-----\n\n-----END PRIVATE KEY-----" } } } } ``` > **No install needed.** Use the hosted server in any HTTP-capable MCP client: > `https://api.waxseal.id/mcp` **What the 6 tools give your agent:** | Tool | What it does | Key needed? | |------|-------------|:-----------:| | `waxseal.info` | Platform overview, tiers, and tool guide | No | | `waxseal.identity.verify` | Look up fingerprint → name, chain, wallet, status | No | | `waxseal.signature.verify` | Confirm an Ed25519 signature against an on-chain key | No | | `waxseal.approval.verify` | Validate a human approval token before executing | No | | `waxseal.document.sign` | Sign any content with your WaxSeal private key | **Yes** | | `waxseal.approval.create` | Create a signed, time-limited approval token | **Yes** | Verify-only tools work with zero configuration. Signing tools require `WAXSEAL_PRIVATE_KEY_PEM`. → [Full MCP docs](./mcp/README.md) · [Smithery listing](https://smithery.ai/servers/degenlegion-com/waxseal) · [npm](https://www.npmjs.com/package/@waxseal/mcp) --- ## `@waxseal/verify` — for apps and backends {#waxsealverify} npm ```bash npm install @waxseal/verify ``` Works in **React**, **Vue**, **Node.js**, **n8n**, serverless functions, and any runtime with `fetch`.

WaxSeal examples

### Two modes, one fingerprint #### Mode 1 · Badge Verification > *"Does this WaxSeal exist and is it real?"* Confirm a seal is on-chain. No user interaction required — the fingerprint alone is enough. **Use cases** - ✦ Verified author badge on blog posts and articles - ✦ Contributor identity on GitHub-style tools - ✦ Publisher verification on CMS platforms - ✦ Prove you created something before AI did ```ts import { verifySeal } from "@waxseal/verify"; const seal = await verifySeal({ fingerprint: "a1b2c3d4..." }); if (seal.valid && seal.onChain) { console.log(seal.displayName, "·", seal.chain); // "Ada Lovelace · base" } ``` --- #### Mode 2 · Login & Action Approval > *"Did this person sign this, right now?"* A signed challenge proves the key holder is present — replaces passwords, OTP, and email loops entirely. **Use cases** - ✦ Passwordless sign-in — no email, no OTP, no credentials to breach - ✦ Approve a document or high-value transaction - ✦ Gate a comment, post, or vote behind verified identity - ✦ Issue an API key only to verified seal holders - ✦ Automate identity checks in n8n / Make.com / Zapier ```ts const seal = await verifySeal({ fingerprint: "a1b2c3d4...", message: "I approve this transfer.", signature: "base64url...", }); if (seal.valid && seal.onChain && seal.signatureValid) { // Cryptographic proof — no password, no session token } ``` --- ### React Badge ```tsx import { WaxSealBadge } from "@waxseal/verify/badge"; ``` Or build your own: ```tsx import { useEffect, useState } from "react"; import { verifySeal, type VerifyResult } from "@waxseal/verify"; export function SealBadge({ fingerprint }: { fingerprint: string }) { const [seal, setSeal] = useState(null); useEffect(() => { let active = true; verifySeal({ fingerprint }).then((r) => active && setSeal(r)); return () => { active = false; }; }, [fingerprint]); if (!seal?.valid || !seal.onChain) return null; return ( ✦ {seal.displayName ?? seal.fingerprint.slice(0, 8)} ); } ``` --- ### HTML Embed (no build step) ```html ``` > **Email** — script tags are blocked by mail clients. Use a plain link instead: > `Verify my Wax Seal` --- ### Webhook Verification ```ts import { verifyWebhookSignature, isWaxSealWebhookEvent } from "@waxseal/verify/webhooks"; app.post("/webhook/waxseal", express.raw({ type: "*/*" }), (req, res) => { const valid = verifyWebhookSignature({ body: req.body, signature: String(req.headers["x-waxseal-signature"]), secret: process.env.WAXSEAL_WEBHOOK_SECRET, }); if (!valid) return res.status(401).send("Invalid signature"); const event = JSON.parse(req.body.toString()); if (isWaxSealWebhookEvent(event, "seal.minted")) { console.log("New seal:", event.data.fingerprint, "on", event.data.chain); } res.sendStatus(200); }); ``` **Webhook events** | Event | When it fires | |---|---| | `seal.verified` | A seal was verified via the API | | `seal.minted` | A new seal NFT was minted on-chain | | `seal.updated` | Seal name, avatar, or metadata changed | | `seal.subscription.started` | A seal holder started a paid subscription | | `seal.subscription.ended` | A subscription expired or was cancelled | | `challenge.approved` | A login challenge was verified — user authenticated | --- ### REST API — no SDK, no key required ``` POST https://api.waxseal.id/v1/verify Content-Type: application/json { "fingerprint": "<64-char hex>", "message": "...", "signature": "..." } ``` ```json { "valid": true, "onChain": true, "chain": "base", "displayName": "Ada Lovelace", "walletAddress": "0x…", "signatureValid": true, "verifiedAt": "2026-01-01T00:00:00Z" } ``` --- ### Works with everything | Stack | How | |---|---| | **React / Vue / Svelte** | `npm install @waxseal/verify` | | **Node.js / Express** | Same package + webhook helper | | **n8n** | HTTP Request node → REST API, or npm package in Code node | | **Make.com** | HTTP module → REST API | | **Zapier** | Webhook by Zapier trigger | | **PHP / Python / Go** | Plain HTTP POST to the REST API | | **Static HTML / CMS** | Two-line `embed.js` snippet | | **Claude / Cursor / Windsurf / VS Code** | [`@waxseal/mcp`](./mcp) | --- ### VerifyResult type ```ts type VerifyResult = { valid: boolean; fingerprint: string; onChain: boolean; chain?: "ethereum" | "base" | "bnb"; walletAddress?: string; displayName?: string; publicKeyConfirmed?: boolean; signatureValid?: boolean; verifiedAt?: string; error?: string; }; ``` --- MIT © [Wax Seal](https://waxseal.id)