WaxSeal
OfficialWaxSeal gives AI agents a cryptographic identity layer, enabling document signing, identity verification, and human-in-the-loop approvals backed by on-chain NFT identities.
Get platform overview (
waxseal.info): Retrieve a full overview of the WaxSeal trust infrastructure, available tiers, trust layers, and a guide to all MCP tools — no configuration required.Verify identities (
waxseal.identity.verify): Look up any WaxSeal fingerprint (64-char hex) on Ethereum, Base, or BNB Chain to confirm the owner's display name, wallet address, chain, lifecycle status, and public key.Sign documents (
waxseal.document.sign): Attach a tamper-evident Ed25519 signature to any text, code, or artifact using your WaxSeal private key — requiresWAXSEAL_PRIVATE_KEY_PEM.Verify signatures (
waxseal.signature.verify): Confirm that a document or message was genuinely signed by the holder of a specific on-chain fingerprint, fetching the public key directly from the blockchain.Create human approval tokens (
waxseal.approval.create): Generate a cryptographically signed, time-limited approval token that proves you explicitly authorized a specific AI agent action — requiresWAXSEAL_PRIVATE_KEY_PEM.Verify approval tokens (
waxseal.approval.verify): Validate an approval token before an agent executes a high-risk or irreversible action, checking the signature, expiry, and optionally confirming the signer's on-chain identity.
Brings cryptographic signing and approval verification to Windsurf (by Codeium), allowing AI agents to require human approval before executing high-risk actions.
Packages
Package | What it is | Install |
Browser + Node SDK — verify identities, validate signatures, embed badges, verify webhooks |
| |
MCP server for Claude, Cursor, Windsurf, and VS Code — verify identities, sign documents, gate AI actions with human approvals |
|
Related MCP server: Agent Receipts
@waxseal/mcp — for AI agents
Give Claude, Cursor, Windsurf, or VS Code Copilot a cryptographic identity layer in under two minutes.
{
"mcpServers": {
"waxseal": {
"command": "npx",
"args": ["-y", "@waxseal/mcp"],
"env": {
"WAXSEAL_PRIVATE_KEY_PEM": "-----BEGIN PRIVATE KEY-----\n<your key>\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? |
| Platform overview, tiers, and tool guide | No |
| Look up fingerprint → name, chain, wallet, status | No |
| Confirm an Ed25519 signature against an on-chain key | No |
| Validate a human approval token before executing | No |
| Sign any content with your WaxSeal private key | Yes |
| 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 · Smithery listing · npm
@waxseal/verify — for apps and backends {#waxsealverify}
npm install @waxseal/verifyWorks in React, Vue, Node.js, n8n, serverless functions, and any runtime with fetch.
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
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
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
import { WaxSealBadge } from "@waxseal/verify/badge";
<WaxSealBadge fingerprint="a1b2c3d4..." />Or build your own:
import { useEffect, useState } from "react";
import { verifySeal, type VerifyResult } from "@waxseal/verify";
export function SealBadge({ fingerprint }: { fingerprint: string }) {
const [seal, setSeal] = useState<VerifyResult | null>(null);
useEffect(() => {
let active = true;
verifySeal({ fingerprint }).then((r) => active && setSeal(r));
return () => { active = false; };
}, [fingerprint]);
if (!seal?.valid || !seal.onChain) return null;
return (
<a href={`https://waxseal.id/seal/${seal.fingerprint}`} target="_blank" rel="noopener noreferrer">
✦ {seal.displayName ?? seal.fingerprint.slice(0, 8)}
</a>
);
}HTML Embed (no build step)
<script src="https://waxseal.id/embed.js"></script>
<span data-wax-seal="YOUR_64_CHAR_FINGERPRINT"></span>Email — script tags are blocked by mail clients. Use a plain link instead:
<a href="https://waxseal.id/seal/YOUR_FINGERPRINT">Verify my Wax Seal</a>
Webhook Verification
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 |
| A seal was verified via the API |
| A new seal NFT was minted on-chain |
| Seal name, avatar, or metadata changed |
| A seal holder started a paid subscription |
| A subscription expired or was cancelled |
| 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": "..."
}{
"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 |
|
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 |
Claude / Cursor / Windsurf / VS Code |
VerifyResult type
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
Maintenance
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/degenlegion-com/waxseal-sdk'
If you have feedback or need assistance with the MCP directory API, please join our Discord server