- Bands control which tools the agent can see (MCP layer)
- Policies control what the visible tools can do (signing layer)
How Policies Work
- You register a policy on the cosigner with constraints (destination allowlist, per-tx value cap, rate limit)
- You create an agent API key bound to that wallet
- When the agent requests a signature, the cosigner evaluates the policy before producing its share
- If the policy denies the request, signing fails with a
flowerror containing the denial reason and arequiredActionto fix it
Available Constraints
| Constraint | What It Controls |
|---|---|
allowlist | List of EIP-55 checksummed destination addresses the cosigner will permit |
maxValueEth | Maximum native-value per transaction, as a decimal ETH string (converted to wei before transmission) |
rateLimitPerHour | Maximum number of signatures per rolling hour (integer, 1-1000) |
MISSING_POLICY_GUARDRAIL.
Creating a Policy
Use thecreate_custom_policy tool in owner mode (requires MCP_BANDS including sign, and the server started with MPC_AUTH_MODE=owner):
policyId along with the walletName it applies to and the appliedAt timestamp.
Issuing an Agent Key for the Wallet
Usecreate_agent_api_key to issue a token bound to the wallet the policy was registered on. The policy is enforced by the cosigner for every signature the key produces.
0600, default ~/.walletsuite/mpc-agent-token) and never returned in chat. Restart the MCP server in agent mode with MPC_AGENT_TOKEN sourced from that file.
What Happens When a Policy Denies
When a transaction violates a registered constraint, the cosigner refuses to produce its share and the agent receives a structuredflow error. The message carries the denial reason and the requiredAction tells the agent how to proceed - for example, that the destination is outside the allowlist, that the value exceeds the per-transaction cap, or that the rate limit is exhausted.
See Structured Errors for the full error taxonomy.
Owner Mode
Policy registration and agent-key issuance are owner-mode operations - the server must be started withMPC_AUTH_MODE=owner. Calling create_custom_policy or create_agent_api_key without owner mode raises MPC_OWNER_MODE_REQUIRED.
To change what a denied agent can do, register an updated policy on the wallet from owner mode. Because signing is MPC 2-of-2, neither WalletSuite nor any other party can sign without the customer share, so the customer retains full control over what gets signed.
Bands vs Policies
Bands and policies are orthogonal - they sit on different axes and address different threats.| Control | What it controls | Where it runs | Applies to |
|---|---|---|---|
| Band Filtering | Which tools exist in the MCP schema | MCP Server (resolved at startup) | MCP only |
| Policy Gates | What signed transactions can do | MPC cosigner (per-request) | All surfaces (MCP, SDK, REST) |
- Set
MCP_BANDSto the minimum required level - Register a policy with the constraints the agent should be held to
- Issue an agent key for that wallet
- The agent can only see the tools it needs AND can only sign what the policy allows
Practical Example
Scenario: You want an agent that can prepare and sign transfers from thetreasury wallet, capped at 1 ETH per transaction and 10 signatures per hour.
Setup:
-
From owner mode, register a policy on wallet
treasury:maxValueEth:"1.0"rateLimitPerHour:10
-
Issue an agent key for the
treasurywallet -
Configure the MCP server:
MCP_BANDS=full- Launch in agent mode with
MPC_AGENT_TOKENsourced from the token file; the registered policy is enforced by the WalletSuite cosigner
treasury. If it tries to send more than 1 ETH in a single transaction, or exceeds 10 signatures in an hour, the cosigner denies the signature.
See Self-Hosting over HTTP to run the MCP server on your own infrastructure, and the Security Model for how signing works.