Wallet-as-Identity
Aether MCP uses Wallet-as-Identity authentication: your Solana wallet IS your identity. No usernames, no passwords — just cryptographic signatures.Why Wallet-as-Identity?
- Cryptographically Secure: Ed25519 signatures cannot be forged
- No Passwords: No risk of password leaks or brute force
- One Identity: Your wallet address is your unique identifier
- Permissionless: No registration required, authenticate instantly
- Cross-Platform: Same identity across all MCP clients
Authentication Flows
Development Flow (All Networks)
Best for: Testing, experimentation, rapid prototypingwallet_create handles everything in a single call: generates a wallet, encrypts and stores it, auto-authenticates (challenge + sign + verify + JWT), and airdrops SOL on devnet.
One call to go from nothing to a fully authenticated, funded wallet. Ready to use all tools immediately.
Production Flow (Mainnet)
Best for: Production, user-owned wallets (Phantom, Solflare, etc.)wallet_connect is mainnet-only. On devnet, wallet_create handles authentication automatically.Session Fingerprinting
The server creates a session fingerprint usingSHA256(IP + User-Agent) to associate sessions with clients. This enables:
- Automatic session persistence: Reconnecting from the same client restores your session
- Wallet-to-fingerprint linking: The server remembers which wallet was used from which client
- Keypair restoration on devnet: When reconnecting, the server can automatically restore your wallet keypair
Session Persistence
Configurable Timeout
Session timeout is configurable via theMCP_SESSION_TIMEOUT_MS environment variable:
| Setting | Default | Description |
|---|---|---|
MCP_SESSION_TIMEOUT_MS | 3600000 (1 hour) | Time before an inactive in-memory session is cleaned up |
This controls in-memory session cleanup only. The session data persists in the database (SQLite/Redis) and can be reconstructed.
Automatic Session Reconstruction
When an in-memory session expires but the session data still exists in the database, the server automatically reconstructs the session:- Client reconnects with the same fingerprint
- Server finds the fingerprint-wallet link in the database
- Session state is rebuilt from persisted data
- On devnet, the wallet keypair is restored from encrypted storage
- The session is fully functional again without re-authentication
Session Management
Session Tokens
JWT tokens are issued after successful authentication:walletAddress: Your authenticated walletsessionId: Unique session identifierjti: JWT ID for revocationexp: Expiration timestamp (7 days)
Check Session Status
Session Restoration
Restore your session from a JWT token:Session Revocation
Revoke Current Token
Immediately invalidate your current session token:Revoke All Sessions
Revoke all sessions for your wallet (security emergency): Use Case: Compromised token, lost device, security breach.Security Best Practices
Store Tokens Securely
Store Tokens Securely
- Use secure storage (OS keychain, encrypted storage)
- Never commit tokens to git
- Regenerate tokens if exposed
- Don’t store in localStorage (XSS risk)
- Don’t log tokens in production
Signature Verification
Signature Verification
The server verifies:
- Signature matches wallet’s public key (Ed25519)
- Challenge nonce exists and hasn’t expired
- Message content matches exactly
- Nonce used only once (replay protection)
Session Expiration
Session Expiration
- Default: 7 days
- Auto-refresh: When < 1 hour remaining
- Revocation: Instant via JWT blacklist
- Cleanup: Expired tokens removed hourly
Mainnet Safety
Mainnet Safety
On mainnet:
- Signature verification extra strict
- Rate limiting enforced (5 auth attempts / 15 min)
- All transfers logged and monitored
HTTP Authentication
For direct HTTP/REST access (non-MCP clients):Get Challenge
Submit Signature
Use Token
Troubleshooting
Invalid Signature
Invalid Signature
Causes:
- Signed wrong message (must match exactly)
- Wrong signature format (use base64, not hex)
- Challenge expired (> 5 minutes old)
- Get fresh challenge
- Copy message exactly as provided
- Sign with correct wallet
- Encode signature as base64
Session Expired
Session Expired
Solution: Re-authenticate:
- On devnet: call
wallet_createagain - On mainnet:
session_auth-> sign ->wallet_connect
Too Many Auth Attempts
Too Many Auth Attempts
Rate limit: 5 attempts per 15 minutes per IP+wallet.Solution: Wait 15 minutes or use different wallet/IP.
Wallet Already Authenticated
Wallet Already Authenticated
Your session is still active! Use existing token or:
