# CertSeal — MCP server on mcp.ai > Connect your CertSeal account and use 21 tools for e-signatures straight from your AI agent. Connect with your own API key. CertSeal provides APIs for issuing and managing verifiable digital certificates, recipients, batches, designs, and webhook subscriptions. By: mcp.ai · official Page: https://mcp.ai/cert_seal ## Connect (MCP protocol) Remote MCP endpoint (HTTP, streamable): https://api.mcp.ai/p_cert_seal?ms=1787298900000 Add it as a custom/remote MCP connector, then authenticate when prompted. ## REST API (no MCP client required) Every tool is also a REST endpoint, authed with a workspace API key. Discover: GET https://api.mcp.ai/api/cert_seal/_endpoints # public; lists every endpoint Call: POST https://api.mcp.ai/api/cert_seal/ Authorization: Bearer sk_live_… # create one at https://mcp.ai/settings/api-keys Content-Type: application/json Body: { …args } → { "ok": true, "tool": "", "result": { … } } ## Developer docs How to use (MCP or REST), markdown: https://mcp.ai/cert_seal/skill.md Postman collection (v2.1): https://mcp.ai/cert_seal/postman.json ## Tools - cert_seal_create_batch(title: string, design_id: string, course_name?: string, description?: string, issuer_name?: string, email_template_id?: string) — Create a persistent certificate batch from an existing CertSeal design and optional email template. This consumes a batch slot and can fail when the plan batch limit is reached; designs and templates - cert_seal_create_webhook_subscription(url: string, events: string[]) — Create a persistent webhook subscription for selected certificate events. The response contains a wh_sec_ signing secret exactly once; capture it immediately and store it securely because later reads - cert_seal_delete_recipient(batch_id: string, recipient_id: string) — Permanently delete an issued recipient from an active batch. This cannot be undone, does not refund certificate quota, and permanently burns the certificate ID. Use only when permanent removal is inte - cert_seal_delete_webhook_subscription(subscription_id: string) — Permanently delete a webhook subscription and stop future deliveries. This cannot be undone; create a new subscription to resume events. - cert_seal_get_batch(batch_id: string) — Get one active or archived certificate batch by ID. - cert_seal_get_certificate(share_token?: string, certificate_id?: string) — Look up an issued certificate using either its human-readable certificate ID or its public-viewer share token, and return its recipient, batch, design, and resolved variables. Provide exactly one look - cert_seal_get_current_workspace() — Verify the connected CertSeal API key and return the workspace ID and username it belongs to. Use this to confirm account context before creating or changing resources. - cert_seal_get_recipient(batch_id: string, recipient_id: string) — Get one issued certificate recipient record by batch ID and recipient ID. - cert_seal_get_webhook_subscription(subscription_id: string) — Get one webhook subscription by ID. This does not reveal the signing secret; it returns only the stored secret tail. - cert_seal_issue_and_send_certificates(batch_id: string, recipients: object[]) — Atomically issue certificates for 1-100 recipients and queue email delivery for every created certificate. This irreversible external side effect requires every recipient to have an email address and - cert_seal_issue_certificates(batch_id: string, recipients: object[]) — Atomically issue certificates without sending email for 1-100 recipients in one active batch. Each recipient permanently consumes one certificate quota unit even if later deleted; any invalid row, dup - cert_seal_list_batches(limit?: integer, cursor?: string, status?: string) — Return one newest-first page of certificate batches in the connected workspace, optionally filtered by archive state. - cert_seal_list_designs(limit?: integer, cursor?: string) — Return one newest-first page of reusable certificate designs. Designs are read-only through the API and must be authored in the CertSeal web app. - cert_seal_list_recipients(limit?: integer, cursor?: string, batch_id: string, email_status?: string) — Return one page of issued certificate recipients in a batch, optionally filtered by email delivery status. - cert_seal_list_webhook_subscriptions(limit?: integer, cursor?: string) — Return one newest-first page of webhook subscriptions. Stored signing secrets are never returned; secret_tail is only a non-sensitive identifier. - cert_seal_rotate_webhook_signing_secret(subscription_id: string) — Immediately invalidate a webhook subscription's current signing secret and replace it. The new wh_sec_ secret is returned exactly once; capture and deploy it immediately or webhook verification will f - cert_seal_send_certificate_emails(batch_id: string, recipient_ids: string[]) — Sequentially queue real certificate emails for 1-25 existing recipients in one active batch. Each queued email is irreversible. Processing stops after the first failed or unknown attempt, and remainin - cert_seal_send_recipient_certificate_email(batch_id: string, recipient_id: string) — Queue asynchronous certificate email delivery to one recipient. This causes an external email side effect and requires a recipient email, a batch email template, and configured mail delivery; already - cert_seal_set_batch_archived(archived: boolean, batch_id: string) — Idempotently archive or unarchive a batch. Archiving freezes recipient create, update, delete, and send operations but preserves existing certificate URLs; unarchiving re-enables those writes. This pe - cert_seal_test_webhook_subscription(event_type?: string, subscription_id: string) — Enqueue one synthetic signed event through CertSeal's normal webhook dispatcher. This causes a real external delivery to the subscription URL; it does not only validate the subscription locally. - cert_seal_update_recipient(data?: object, name?: string, email?: string, batch_id: string, issue_date?: string, expiry_date?: string, recipient_id: string, certificate_id?: string) — Partially update an issued certificate recipient. Only supplied fields change, while an explicit null clears an optional field; changing certificate_id must remain globally unique. Archived batches re ## Example prompts - "What can I do in CertSeal?" - "Show me a summary of my CertSeal account" ## Links Docs: https://mcp.ai/docs/mcps/cert_seal Website: https://mcp.ai/mcps/cert_seal