WalletSuite MCP is non-custodial. We never hold your keys or funds. Signing happens locally via OWS with policy controls.
Trust model
WalletSuite MCP keeps the orchestration core private and replaces source-code visibility with three explicit architectural guarantees: Non-custodial by design. The server never stores or transmits private keys. A fresh install uses only the WalletSuite API key — no local signing, no broadcast. Enabling OWS keeps keys in an encrypted vault on the host you control; signing stays under user or policy control. Architecture transparency. Theprepare → sign → broadcast flow is publicly documented. Responsibilities between WalletSuite MCP, the WalletSuite API, OWS, and the caller are explicit. Policy boundaries for signing are stated in Policy Gates.
Minimal public surface. WalletSuite exposes the npm package, Docker image, MCP tool interfaces, and these docs. Internal orchestration details that aren’t required for safe integration are not disclosed.
How signing works
WalletSuite MCP separates transaction preparation from signing:Separation of responsibilities
| Component | Responsibility |
|---|---|
| WalletSuite MCP | MCP orchestration and tool exposure |
| WalletSuite API | wallet data, prices, balances, and transfer preparation |
| OWS | local key storage and local signing |
| User or policy owner | final approval of sensitive actions |
Policy-based signing
OWS adds the signing control layer. In owner mode:- the user controls signing directly through the local vault passphrase
- wallet creation is available
- signing uses a pre-created scoped OWS token
- the current default WalletSuite MCP policy limits signing to the allowed chains in that wallet policy and an expiry window
- policy denial blocks the signing request before the key is used
What WalletSuite does not do
WalletSuite does not:- store private keys
- custody funds
- sign transactions on your behalf
- move funds without an enabled signing path and explicit approval
Attack model
If WalletSuite MCP is misconfigured or compromised on its own:- an attacker still does not get your private keys
- an attacker still cannot sign transactions unless local OWS signing is enabled and reachable
- an attacker still cannot broadcast through
send_transactionunless the broadcast band is enabled, the RPC URL is configured, and the request is explicitly confirmed
What WalletSuite does not control
WalletSuite does not control:- the contents of your local OWS vault
- the approval decision to sign when OWS is configured for local signing
- the host where the vault, environment variables, and MCP server run
What risks still exist
Non-custodial does not mean zero risk. Important remaining risks are:- enabling broader bands than you need
- approving or automating a transaction you did not inspect carefully
- running on a compromised host
- leaking environment secrets such as API keys, passphrases, or agent tokens
Bands control tool exposure
WalletSuite MCP exposes tools through bands:| Band | What it allows |
|---|---|
read | balances, prices, fee quotes, asset resolution, transaction status and history |
prepare | transaction-preparation tools |
sign | local wallet lookup and detached signing through OWS |
broadcast | local sign-and-send through OWS |
read.
This matters because the best security control for AI tooling is often not a runtime warning. It is not exposing a more powerful tool in the first place.
Why the default should stay narrow
Read-only tools answer many wallet questions without creating transfer payloads or exposing any signing surface. A safe rollout pattern is:- start with
read - move to
read,prepareonly when you need transaction preparation - add
signonly when you are ready to manage a local OWS wallet - add
broadcastonly when you are ready to execute on-chain actions
Detached signing vs local broadcast
sign_transaction and send_transaction are intentionally separate.
sign_transaction
Use this when you want detached signing of raw unsigned transaction hex.
This is still sensitive, but it does not submit anything on-chain by itself.
send_transaction
Use this only for explicit user-approved broadcasts.
send_transaction is the destructive path because it signs and broadcasts the transaction. WalletSuite MCP requires:
- the broadcast band
confirmBroadcast=true- the matching RPC URL for the selected chain
Secrets stay out of tool arguments
Sensitive values are supplied through environment variables, not through tool arguments. Examples:WALLETSUITE_API_KEYOWS_PASSPHRASEOWS_AGENT_TOKENOWS_ETHEREUM_RPC_URLOWS_TRON_RPC_URL
Local signing boundaries
When OWS is enabled:- keys stay local
- signing happens inside OWS
- the MCP tool surface only receives wallet names, chain ids, and raw unsigned transaction hex where applicable
Verifiable audit trail
Everysign_transaction and send_transaction call appends a structured JSON receipt to a local log file at ~/.walletsuite/audit-trail.jsonl (override with WALLETSUITE_AUDIT_PATH). Receipts are linked by a SHA-256 hash chain: each entry records the previous entry’s hash, so tampering with any line invalidates every line after it. Secrets are redacted before write (API keys, mnemonics, bearer tokens) and transaction hex is truncated.
The audit trail is local by default — it stays on the host that runs the MCP server, under operator control, and can be shipped to a SIEM or archived on a schedule. See Audit Trail for the full receipt schema, hash-chain verification, and SIEM integration guidance.
Why WalletSuite MCP is closed-source
WalletSuite MCP is distributed as a product surface through the published npm package and Docker image, while the core implementation remains private. Trust comes from:- non-custodial architecture
- local signing boundaries
- explicit capability controls through bands and OWS modes
- clear operational documentation
Practical guidance
Use these defaults unless you have a reason not to:MCP_BANDS=readfor a new install- no OWS on day one
- no broadcast until the local signing flow is proven