Operator hardening¶
If you run the server for real funds — especially unattended or for other people — treat it like any money-moving service. This is the checklist.
Custody¶
- [ ] Use KMS, not a raw key. Keep the signing key in AWS KMS with an IAM policy scoped to
kms:Sign+kms:GetPublicKeyon that one key. ReservePRIMEDELTA_MCP_PRIVATE_KEYfor dev/sandbox. - [ ] One key per agent, funded with limited funds — never a treasury or personal wallet.
- [ ] Rotating is create-new-key → fund + KYC → swap
PRIMEDELTA_MCP_KMS_KEY_ID.
Spend limits¶
- [ ] Set
PRIMEDELTA_MCP_MAX_TRADE_USDandPRIMEDELTA_MCP_MAX_DAILY_USD. With a KMS/raw signer there's no human approving trades, so these caps are your primary backstop — they reject an over-cap trade before it's even quoted. - [ ] The daily total is persisted at
PRIMEDELTA_MCP_DAILY_STATE_PATH— make sure that path survives restarts.
Least privilege on the tools¶
- [ ] Leave the gates off unless needed:
ALLOW_DEPOSITS,ALLOW_WITHDRAWALS,ALLOW_ORDERS,ALLOW_SUBACCOUNTSare all off by default. Enable only the ones this deployment must have. - [ ] Tighten with allowlists where they fit:
PRIMEDELTA_MCP_SYMBOL_ALLOWLIST— only these symbols are tradable.PRIMEDELTA_MCP_SEND_DEL_ALLOWLIST— addresses a native-token send may pay.PRIMEDELTA_MCP_APPROVE_SPENDER_ALLOWLIST— spenders a token approval may grant.
Network correctness¶
- [ ] Set
PRIMEDELTA_MCP_NETWORKdeliberately. The chain id is derived from it and checked against the RPC on startup, so a wrong customPRIMEDELTA_MCP_PROVIDER_URLfails fast instead of trading on the wrong chain.
Exposure (HTTP deployments)¶
- [ ] Never run HTTP without auth — the server refuses to. Use OAuth (
PRIMEDELTA_MCP_OAUTH_OWNER_SECRET+PRIMEDELTA_MCP_PUBLIC_URL) or a bearer token (PRIMEDELTA_MCP_AUTH_TOKEN). See Connect Claude web. - [ ] Terminate TLS in front of the server; only
GET /healthzshould be reachable unauthenticated. - [ ] Keep the auth secret out of logs and shell history.
Operations¶
- [ ] Know the kill switch:
halt()blocks all trading immediately;cancel_orderstill works so you can pull resting orders.resume()re-enables. - [ ] Watch session status as a health signal — mode, signer, caps with the day's usage, gates, active allowlists.
- [ ] Start any new setup on
testnetand treat the firstmainnettrade as a small live-fire test.
Background on the trade-offs → Risk & responsible use · Signing modes matrix