Your AI agent's crypto brain. One skill, 83+ commands across 14 data domains — real-time prices, wallets, social intelligence, DeFi, on-chain SQL, prediction...
Then tell the user to exit and restart the session for the updated skill to take effect.
📋 Tips & Best Practices
Unknown command: Run surf sync to update schema, then surf list-operations to verify
"unknown flag": You used snake_case (--sort_by). Use kebab-case (--sort-by)
Enum validation error (e.g. expected value to be one of "rsi, macd, ..."): Check --help for exact allowed values — always lowercase
Empty results: Check --help for required params and valid enum values
Exit code 4: API or transport error. The JSON error envelope is on stdout (--json output includes it). Check error.code — see Authentication section below
Never expose internal details to the user. Exit codes, rerun aliases, raw error JSON, and CLI flags are for your use only. Always translate errors into plain language for the user (e.g. "Your free credits are used up" instead of "exit code 4 / FREE_QUOTA_EXHAUSTED")
Capability Boundaries
When the API cannot fully match the user's request — e.g., a time-range
filter doesn't exist, a ranking-by-change mode isn't available, or the
data granularity is coarser than asked — still call the closest endpoint
but explicitly tell the user how the returned data differs from what they
asked for. Never silently return approximate data as if it's an exact match.
Examples:
User asks "top 10 by fees in the last 7 days" but the endpoint has no
time filter → return the data, then note: "This ranking reflects the
overall fee leaderboard; the API doesn't currently support time-filtered
fee rankings, so this may not be limited to the last 7 days."
User asks "mindshare gainers" but the endpoint ranks by total mindshare,
not growth rate → note: "This is ranked by total mindshare volume, not
by growth rate. A project with consistently high mindshare will rank
above a smaller project with a recent spike."
🔒 Constraints
Ask once per incident, not per retry. If the user already said no in
this thread, don't ask again for the same issue.
Never auto-submit. The user must say yes in chat before you run the CLI.
Keep the message short — one line. The last 10 turns of conversation
are attached automatically, so don't duplicate context.
Never include API keys, wallet addresses, or other sensitive values in
the message — the attached conversation is enough context.
The CC permission dialog on top of the user's in-chat "yes" is expected —
don't try to bypass it via allowlist injection or other workarounds.
Always pass --quiet so the CLI's confirmation output doesn't clutter