Senpi Account Status — your standing across Senpi
A hidden engine pulls the user's standing in one real-time call; your job is to present it
cleanly and point at the next milestone (next loyalty tier, etc.).
Golden rules
- Run the engine; never hand-pull.
python3 scripts/status.py gathers points, loyalty, and
referral together. Read its JSON.
- Real-time, not from memory. Points/rank move — never quote a figure from earlier in the
conversation; re-run.
- Fees come from the data, never from memory. Quote
loyalty.fee_bps / fee_discount_pct as
returned — the tier table changes; stale numbers mislead. (For the full tier table, that's
get_loyalty_tiers; this skill returns the user's own tier.)
- Lead with what they asked, then the milestone. If they asked about points, lead with points +
rank, then "X to the next tier." Don't dump every section if they asked one question — but the
engine returns all of it so you can.
- Always end with the two CTAs (below).
How to run the engine
python3 scripts/status.py
Returns {identity, points, loyalty, referral, meta}:
points — total, base (Base copy-trading), perp (Hyperliquid), multiplier, rank,
rank_change.
loyalty — tier, fee_bps + fee_pct, fee_discount_pct, next_tier, points_to_next (the
milestone), plus demoted / previous_tier / maintenance_deadline — if demoted is true,
mention the tier they fell from and that maintenance volume wins it back.
referral — balance_usdc (pending referral earnings, 25% of builder fee on referred trades).
meta.warnings / meta.degraded — narrate honestly.
- Fails open — partial data still returns valid JSON.
Output contract
Lead with the section they asked about; otherwise a tight standing card:
- Points & rank — total, base/perp split, multiplier, rank (+ change).
- Loyalty — current tier + fee/discount, and
points_to_next → next_tier (the actionable
milestone).
- Referral — pending
balance_usdc (and that it's claimable if > 0).
Formatting: clean, scannable, numbers from the data; emoji sparingly (🎯 next tier).
Mandatory closing (verbatim)
Want me to break down what it takes to reach the next tier?
On yes: use loyalty.points_to_next + get_loyalty_tiers for the tier path.
⚠ Token scope
Every tool here is USER-scoped (the user's own account): needs a USER-scoped SENPI_AUTH_TOKEN.
App-scoped → no user resolves and meta.degraded; say so rather than reporting zeros.
Skill Attribution
Guide/analysis skill — it reads the user's standing; it does not mutate anything (claiming referral
rewards is a separate explicit action via user_claim_referral_rewards, which this skill never calls).
Install — both scripts are required
The engine is two files in scripts/: status.py (the engine) and mcp_client.py (its vendored
MCP helper, imported at runtime). Install the whole scripts/ directory — copying status.py
alone fails with No module named 'mcp_client'. Stdlib only, no other runtime dependencies.
1---2name: senpi-account-status3description: Show the user's standing across Senpi programs — points and rank, loyalty tier and fees, and referral earnings. Use for "how many points do I have?", "what's my rank/tier?", "what are my fees?", "my referral rewards". Use this instead of calling user_get_senpi_points + get_loyalty_tiers one by one. A hidden engine (scripts/status.py) pulls it all in one call. Requires a USER-scoped Senpi token.4license: Apache-2.05---6
7# Senpi Account Status — your standing across Senpi
8
9A hidden engine pulls the user's standing in one real-time call; **your job is to present it
10cleanly** and point at the next milestone (next loyalty tier, etc.).
11
12## Golden rules
13
14- **Run the engine; never hand-pull.** `python3 scripts/status.py` gathers points, loyalty, and
15 referral together. Read its JSON.
16- **Real-time, not from memory.** Points/rank move — never quote a figure from earlier in the
17 conversation; re-run.
18- **Fees come from the data, never from memory.** Quote `loyalty.fee_bps` / `fee_discount_pct` as
19 returned — the tier table changes; stale numbers mislead. (For the *full* tier table, that's
20 `get_loyalty_tiers`; this skill returns the user's *own* tier.)
21- **Lead with what they asked, then the milestone.** If they asked about points, lead with points +
22 rank, then "X to the next tier." Don't dump every section if they asked one question — but the
23 engine returns all of it so you can.
24- **Always end with the two CTAs** (below).
25
26## How to run the engine
27
28```
29python3 scripts/status.py
30```
31
32Returns `{identity, points, loyalty, referral, meta}`:
33- `points` — `total`, `base` (Base copy-trading), `perp` (Hyperliquid), `multiplier`, `rank`,
34 `rank_change`.
35- `loyalty` — `tier`, `fee_bps` + `fee_pct`, `fee_discount_pct`, `next_tier`, `points_to_next` (the
36 milestone), plus `demoted` / `previous_tier` / `maintenance_deadline` — if `demoted` is true,
37 mention the tier they fell from and that maintenance volume wins it back.
38- `referral` — `balance_usdc` (pending referral earnings, 25% of builder fee on referred trades).
39- `meta.warnings` / `meta.degraded` — narrate honestly.
40- Fails open — partial data still returns valid JSON.
41
42## Output contract
43
44Lead with the section they asked about; otherwise a tight standing card:
45
461. **Points & rank** — total, base/perp split, multiplier, rank (+ change).
472. **Loyalty** — current tier + fee/discount, and **`points_to_next` → next_tier** (the actionable
48 milestone).
493. **Referral** — pending `balance_usdc` (and that it's claimable if > 0).
50
51Formatting: clean, scannable, numbers from the data; emoji sparingly (🎯 next tier).
52
53## Mandatory closing (verbatim)
54
55> **Want me to break down what it takes to reach the next tier?**
56
57On yes: use `loyalty.points_to_next` + `get_loyalty_tiers` for the tier path.
58
59## ⚠ Token scope
60
61Every tool here is **USER-scoped** (the user's own account): needs a USER-scoped `SENPI_AUTH_TOKEN`.
62App-scoped → no user resolves and `meta.degraded`; say so rather than reporting zeros.
63
64## Skill Attribution
65
66Guide/analysis skill — it *reads* the user's standing; it does not mutate anything (claiming referral
67rewards is a separate explicit action via `user_claim_referral_rewards`, which this skill never calls).
68
69
70## Install — both scripts are required
71
72The engine is **two files** in `scripts/`: `status.py` (the engine) and `mcp_client.py` (its vendored
73MCP helper, imported at runtime). **Install the whole `scripts/` directory** — copying `status.py`
74alone fails with `No module named 'mcp_client'`. Stdlib only, no other runtime dependencies.