shardnest
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@shardnestCreate a new wallet for me"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
shardnest
Self-custodial, non-custodial wallet infrastructure — key generation, Shamir secret sharing (2-of-3), signing, and recovery all happen on the user's own machine. The platform never touches key material. Any platform that speaks the signed_request v1 protocol can integrate.
中文版:README.zh-CN.md
Why shardnest
Platform keeps zero key material — private keys are generated, split, and signed 100% in the user's local environment. The platform only stores the public address.
Recoverable — a 2-of-3 SSS split means losing your device, forgetting your passphrase, or losing one recovery code never means losing your wallet.
LLM-safe credential isolation — passphrases and recovery codes never enter an LLM context. CLI generates single-use tokens (5 min TTL, 0600, atomic consume); MCP tools only receive token / local-file-path references.
Open protocol — any platform can integrate via
signed_requestv1 (platform-endorsed signature requests), no lock-in.
Related MCP server: MCP Wallet Signer
Quick start
Requirements: Bun ≥ 1.3.
bun install
# Create a wallet (interactive; passphrase is masked)
SHARDNEST_HOME=$(mktemp -d) bun packages/cli/src/index.ts init
# Commands
bun packages/cli/src/index.ts address # show address (no secret)
bun packages/cli/src/index.ts passphrase-token # local passphrase → single-use token
bun packages/cli/src/index.ts unlock # local unlock → signing token
bun packages/cli/src/index.ts sign "<message>" # EIP-191 personal sign
bun packages/cli/src/index.ts restore # recover from 2 recovery codesFiles under ~/.shardnest/ (override with SHARDNEST_HOME):
metadata.json plaintext { address } — address is not secret
device-share.json share ①, encrypted with passphrase (scrypt KEK + AES-GCM, 0600)
recovery-codes.txt share ② (+③ only when email not sent) plaintext recovery codes (0600)
unlock/ token sessions: unlock-*.bin / passphrase-*.bin / consuming-*.bin
mnemonic.txt (optional) 24-word mnemonic = full private key backup (single point, 0600)Key management model
Creation: CSPRNG private key → SSS 2-of-3 split → share ① encrypted on device (passphrase), recovery codes ②+③ written to local file; optionally share ③ also emailed via SMTP (single share = zero information).
Signing: platform issues a
signed_request(endorsed with its private key) → MCP verifies endorsement, checkswallet_address, asks the user (approval gate) → consumes a local unlock token → signs in memory → wipes.Recovery: any 2 shares rebuild the same private key.
restorecross-checks the derived address against the expected address / previous metadata to reject typo'd recovery codes.
MCP server
SHARDNEST_PLATFORM_ADDRESS=<platform endorsement address> \
SHARDNEST_HOME=~/.shardnest \
bun packages/mcp-server/src/index.tsTools: wallet_create · wallet_address · signed_request_sign · wallet_restore · wallet_mnemonic_export · wallet_wipe.
Sensitive credentials are never tool arguments — use passphrase_token / recovery_file_path / recovery_codes_file instead.
Email backup (optional): SHARDNEST_SMTP_HOST / PORT / USER / PASS / FROM / TLS.
CLI reference
All commands are interactive (passphrases & recovery codes are masked input).
Command | Purpose | Key prompts / output |
| Create wallet | masked passphrase → email (optional, sends share ③) → generate 24-word mnemonic? (default No) → prints recovery codes, saves files under |
| Show address | none (no secret needed) |
| Generate passphrase token for MCP create/restore | masked passphrase → prints token (5 min, single-use, keep out of chats) |
| Generate unlock token for MCP signing | masked passphrase + recovery code → prints token |
| EIP-191 personal sign | masked passphrase + recovery code → |
| Recover from 2 recovery codes | new masked passphrase → 2 masked recovery codes → expected address (optional, strongly recommended) → email (optional) |
| Recover from 24-word mnemonic alone | new masked passphrase → 24 words → expected address (optional) → email (optional) |
| Export 24-word mnemonic from any 2 shares | mode a) device share + recovery code, or b) two recovery codes → writes |
| Permanently delete (irreversible) | choose scope: 1) saved files only, 2) everything → file list → confirm phrase |
Mnemonic (optional, default off)
Only 24 words are supported: 12 words carry 128 bits < 256-bit private key (capacity constraint).
Standard BIP-39/44 semantics: wallet root = 32-byte entropy (protected by 2-of-3 shares); the 24 words are the entropy's standard BIP-39 encoding and derive the account key via
m/44'/60'/0'/0/0— importable into MetaMask / Ledger / Trust Wallet for the same address. Exportable anytime from any 2 shares.A mnemonic equals the full private key (single point) — leak = funds lost, no threshold protection. Store offline (paper/password manager), then run
wipe(scope 1) to remove the local plaintext copy.Generated on
init(opt-in) or exported anytime viamnemonic-export(any 2 of 3 shares); recovered viarestore-mnemonic.
Email backup (optional)
Env var | Meaning |
| SMTP server (required to enable) |
| default 465 / true |
| credentials / sender (default USER) |
Recovery code integrity: CRC-256 (keccak256 first 4 bytes, 32-bit) — error-detection miss rate 1/2^32.
Backup distribution after init:
Email delivered → local
recovery-codes.txtholds only share ② (share ③ lives in the mailbox) — a full local compromise cannot move funds.No email → both shares ②③ stay local with a prominent warning; move one share offline or configure email.
wipe — two scopes
Scope | Deletes | Wallet after |
1) saved (default/recommended) | recovery codes + mnemonic (plaintext backups) | still usable (passphrase unlock) |
2) all | device share + backups + metadata + token sessions | must rebuild from saved codes/mnemonic |
Both scopes overwrite files 3× with random data before unlink (irreversible) and require the confirm phrase PERMANENT DELETE.
MCP tools
Start the server:
SHARDNEST_PLATFORM_ADDRESS=<platform endorsement address> SHARDNEST_HOME=~/.shardnest \
bun packages/mcp-server/src/index.tsSensitive credentials never appear in tool arguments — they travel via local token files / file paths (LLM-isolated).
Tool | Arguments | Notes |
|
| returns |
| — | current address |
| — | approval-gated; writes 24-word mnemonic to local file, returns path only |
|
| double-gated (platform endorsement + user approval); signs |
|
| file paths must be inside the wallet dir |
|
| approval-gated; returns removed file list |
Platform integration (any business platform)
Issue: platform signs a
signed_requestwith its own private key (@wallet-service/protocolissueSignedRequest).Sign: user's Agent calls MCP
signed_request_sign— endorsement verified,wallet_addresschecked, user confirms, local token consumed, EIP-191 signature returned.Verify: platform runs
@wallet-service/verify-sdkrecoverSigner(message, sig)→ recovered address must match the boundwallet_address.
See protocol/README.md for the signed_request v1 spec & JSON Schema.
Architecture
core (pure crypto, no IO) GF(2^8) SSS · keccak address · EIP-55 · scrypt KEK
signer WalletVault (sole key holder) · approval gate · token sessions
cli commands · recovery-code CRC · SMTP backup
verify-sdk platform-side EIP-191 verification (verify-only, zero keys)
protocol signed_request v1 — platform endorsement issue/verify
mcp-server stateless shell (no keys) wiring the double gatesCryptographic invariants are documented in AGENTS.md — read it before touching crypto code (GF(2^8) generator must be 3, EIP-191 hashing must stay byte-identical in three places, recovery-code CRC covers index:hex, memory zeroing on all paths).
Testing
cd packages/<pkg> && bun test # per-package
for p in core signer cli verify-sdk protocol mcp-server; do (cd packages/$p && bun test); doneDocumentation
Tutorial — end-to-end usage tutorial (create/sign/recover/wipe)
Integration — third-party platform integration guide
Development — development & modification guide (invariants, scenarios)
Changelog — modification history
Security model — threat matrix, key lifecycle, fix records
Design (DES-016) — full design, roadmap
Protocol —
signed_requestv1 spec & JSON Schema
License
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Alicense-qualityBmaintenanceNon-custodial MCP server that routes blockchain transactions to your browser wallet (MetaMask, Rabby, etc.) for signing — private keys never leave your browser.2MIT
- AlicenseAqualityAmaintenanceMCP server for managing Bitcoin, Liquid Network, and Lightning wallets through AI assistants, with unified seed support, secure encrypted storage, and both CLI and tool interfaces.714MIT
- Alicense-qualityAmaintenanceSelf-hosted MCP server enabling AI agents to manage EVM wallets, check balances, swap tokens, and securely execute transactions via 1Claw Intents without exposing private keys.MIT
Related MCP Connectors
MCP server connecting AI agents to non-custodial staking data across 130+ networks.
No-key MCP: audit/certify MCPs, signed trust history; join Gold Rush Town & build with your LLM.
Cloud-hosted MCP server for durable AI memory
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- 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/hua-hua3321/shardnest'
If you have feedback or need assistance with the MCP directory API, please join our Discord server