Agent-first e-signature MCP server with offline PAdES signing and hash-chained audit.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
We haven't yet run this listing's install command through our automated sandbox check. This isn't a red flag β we're steadily working through the catalog.
π‘ Paste into ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows)
Fully-offline e-signature CLI. The built-in PAdES signer (PKCS#7 in /ByteRange, self-issued cert) produces real, cryptographically verifiable signed PDFs with no signup and no third-party provider β or routes through Dropbox Sign / DocuSign / SignWell when you need an external trust anchor. Per-signer approval tokens (TTL-bounded, scoped to one email), hash-chained audit events, RFC 3161 timestamping, named profiles, a 19-tool MCP server, and a 20-route HTTP API.
The asymmetry is the architecture: an agent can drive every step except the actual signing gesture, which stays gated behind a human.
Part of the contract-ops CLI suite β optional. sign-cli works entirely on its own; it's also the signing + audit step of the contract-ops suite: template-vault-cli β draft-cli β nda-review-cli β docx2pdf-cli β sign-cli, with drift detection via compare-cli.
That single command runs the entire lifecycle β create (consent + email-verification gates on) β send β watch the gates block signing β verify email β capture consent β approve β sign β verify chain β export receipt β against the offline local provider, then deletes everything. No signup. No keys. ~5 seconds.
Live demo β β read-only, resets every 4 hours. Self-host: see
deploy/README.md.
| If you are⦠| Start here |
|---|---|
| A new user evaluating the tool | This README's Quick start, then Standard user journey |
| An operator wiring up a hosted provider | docs/setup/ β Dropbox / DocuSign / SignWell / embedded |
| An LLM agent driving the CLI | AGENTS.md β docs/agent-guide.md β docs/recipes/ |
| An auditor verifying a signed bundle | docs/reference/audit-chain.md, docs/reference/legal.md |
| A contributor | docs/reference/architecture.md, docs/regression-testing.md |
| Adding a new CLI to the suite | The build-a-CLI playbook β the conventions every suite CLI follows |
Concept deep-dives live in docs/reference/; task-oriented recipes in docs/recipes/.
Or download a standalone binary from Releases β ./sign-linux-x64 demo. See DISTRIBUTION.md for every install path.
--require-consent gates signing on a recorded intent-to-sign attestation + electronic-records consent (versioned canonical texts, hashed into the audit chain); --require-email-verification gates it on a mailbox-control code; signer record-identity logs how identity was checked out-of-band. No KYC data is collected β by design. See docs/reference/consent-and-identity.md.request send β refuses to double-send unless --force true; pair with --idempotency-key for safe retries.request from-template.sign pdf detect-signature-field + sign sign --auto-place). Detects AcroForm /Sig widgets and anchor text in English + French/EU conventions.sign pdf inspect β parses PAdES PKCS#7 from sign-cli or any other producer (Adobe, DocuSign, Dropbox Sign, SignWell). Returns signer CN/email, cert subject + issuer, validity window, fingerprint, trust label (self_signed_local / self_signed_other / ca_signed / unknown), and message-digest match.signer fetch-document and the MCP signer_fetch_document tool surface existingSignatures, so a signer can see what they're countersigning before they sign.sign document (chains the bundled docx2pdf-cli, auto-place, stamp, PAdES-seal, verify in one call against a scoped temp DB).--read-only true on both mcp serve and serve. Mutating tools/routes return FORBIDDEN_READ_ONLY.{{env:VAR}} references for shell-managed secrets). See docs/reference/profiles.md.request verify-signed-pdf recomputes the digest, extracts X.509 signer certs, supports --recipient <email> for a redacted single-signer view, and reports per-signer trust labels.Or fully offline:
For full provider-specific setup, see docs/setup/.
sign document chains: convert (via the bundled docx2pdf-cli) β detect signature field β stamp β PAdES-seal β verify chain. All intermediate state lives in a scoped temp DB.
19 tools, split read-only vs mutating. Backed by the same SignCliError envelopes you'd see at the CLI. The full discovery contract, wire-up snippets (Claude Desktop, Cursor), and read-only walkthrough are in AGENTS.md. Three resource shapes (request://<id> snapshot, .../document PDF blob, .../audit chain) and four agent-as-signer prompt templates (review_and_sign, policy_check, inbox_triage, verify_receipt) are also exposed.
Twenty routes under /v1/*, 1:1 parity with the MCP tool surface β same input shape, same path-traversal guards, same read-only gating. Bearer auth via --auth-token or SIGN_HTTP_AUTH_TOKEN. Responses are { ok, result } on success or the standard error envelope on failure.
For --provider local, an agent can act as a signer end-to-end without an email link. Set SIGN_LOCAL_AUTOCOMPLETE=false so the local provider holds at sent until each signer explicitly runs sign sign.
Multi-signer: status only flips to completed when every signer is in signedBy[]. Pre-sign safety checks (--require-hash / --require-title / --require-signer-email) throw PRE_SIGN_*_MISMATCH before any state mutation.
Reuse a template defined in the provider dashboard (no PDF upload):
Each --signer must include role:<roleName> matching a template role. --prefill name:K,value:V[,signer:N] populates template fields. Per-provider behavior: DocuSign uses per-signer text tabs; Dropbox uses custom_fields; SignWell uses placeholders.
By default the hosted providers auto-append a generic signature page. For real contracts, pass --field (repeatable) on request create:
Spec: signer:<order> (required), doc:<i> (multi-doc index), type:signature|initials|date|text|name|email, page:<n> x:<pt> y:<pt> (coordinate), or DocuSign-only anchor:"text" with optional x-offset / y-offset / anchor-units. The fields persist on the request and forward to the provider at send time.
For --provider local, sign sign --auto-place calls the detector and uses the top candidate iff there's a unique high-confidence (β₯0.8) match.
Adjustment strategies in priority order: underline-snap (0.95), below-anchor-probe (0.85, French/EU conventions), whitespace-probe (0.75), shrink-to-fit (0.50). Date anchors are detected separately via sign pdf detect-date-field. Full reference in docs/agent-guide.md Β§6.4a.
Each row becomes its own request with autoApprove: true. Title template supports {{email}}, {{name}}, {{row}}. Exit code 3 if any row failed; JSON output lists per-row results.
audit verify walks the local hash chain. request verify-signed-pdf recomputes the SHA-256 over the /ByteRange, compares it to the messageDigest in the embedded PKCS#7, and verifies the PKCS#7 signature value against the signer certificate's public key (RSA/ECDSA) β so a forged or tampered signature fails, exit 3, not just a modified-after-signing one. sign pdf inspect works on any signed PDF (no request id required). audit anchor issues a TimeStamp token from a TSA. See docs/reference/audit-chain.md for the full model.
Resolution order: flag > env > project profile > user profile > built-in default. Credentials redacted by default in profile show (--show-secrets true to reveal). Over the MCP HTTP transport, show_secrets is refused unless an --http-auth-token is configured (it stays available on stdio MCP and the CLI). See docs/reference/profiles.md.
preflight runs env-health checks (runtime:node_version, storage:db_path) on every provider, then provider-scoped checks layer on top. Branch on checks[].name for agent self-recovery.
.env or API keys.MIT. See LICENSE.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/sign-cli)<a href="https://allmcps.com/mcp/sign-cli"><img src="https://allmcps.com/api/badge/sign-cli?style=directory" alt="Sign Cli on AllMCPs" /></a>