The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Quota MCP listing page.
English | 简体中文
A usage & quota tracker for AI subscription accounts. It pulls the balances, subscription expiry dates and rate-limit windows that are scattered across vendor dashboards into one place, and exposes them through both a REST management API and an MCP query surface — point your agent (Hermes, Claude Code, …) at it with one config line and it can answer "how much quota do I have left?" on its own.
Two platforms supported today:
| Platform | Data source | Credential | What you can see |
|---|---|---|---|
StepFun (阶跃星辰, .ai intl / .com China) | platform.stepfun.{ai,com} console Connect RPC | Browser session (Oasis-Token, ~2 h, auto-renewed) + optional plan key | Plan & expiry, 5-hour / weekly / subscription credit windows, access keys under the account, session health |
| Command Code (commandcode.ai) | Undocumented /alpha/* endpoints on api.commandcode.ai | A single Bearer API key | Plan (GOAT/Pro/Max/…), 5-hour / weekly / monthly windows, balances, billing-period request stats |
Highlights:
After startup:
http://127.0.0.1:8780/healthz health checkhttp://127.0.0.1:8780/api/stepfun/accounts REST listhttp://127.0.0.1:8780/mcp MCP endpointThe alpha/API-key plane is the easy one — a permanent Bearer key:
Get the key from commandcode.ai/settings/keys (shown once at creation). The server validates it with whoami first and refuses to store a rejected key.
The internal/session plane mirrors the browser: pass session_text (the whole Cookie: header, a document.cookie dump, or the bare __Secure-commandcode_prod_.session_token value). It is validated against billing/credits and never stored unless it passes. Sessions expire, so refresh them from CookieCloud or by copying the cookie again from DevTools:
When both are stored the API key wins. Each enrol overwrites the credential planes it was given — re-enrolling with only api_key clears any stored session, and vice-versa, so a rotation is never silently skipped.
Oasis-Token is an HttpOnly cookie, so document.cookie cannot read it — copy it from a request header in DevTools. Paste the whole Cookie: header (or the bare token) to the server:
Protocol findings from real-world testing (all handled in code):
.ai Oasis-Token cookie value is two JWTs concatenated (8 segments); the console only accepts the whole value — a single segment gets you token is illegal.ai returns second-level strings, .com returns milliseconds; the code infers by magnitude.com device tokens live only 30 minutes and its RefreshToken returns a degraded token — .com sessions need periodic re-importmode 1, data plane always token is illegal), so renewal must happen before expiry; a degradation guard refuses to store such tokensTwo ways to connect — pick either:
1. Streamable HTTP (served on /mcp) — for always-on deployments:
2. stdio — for clients that spawn the server themselves (Claude Code, containers, mcp-publisher-style registry installs):
Works the same way from Claude Code or any other MCP client.
All tools are read-only:
| Tool | Description |
|---|---|
quota_list_accounts | List every account: plan, expiry, remaining quota, session/key status (masked) |
quota_probe_account | Live-probe one account (hits upstream, takes a few seconds) |
quota_probe_all | Serially probe all accounts and refresh the cache |
quota_status | Summary: per-platform counts of serving / limited / invalid / needs-relogin, plus a one-line status per account |
quota_check_alerts | Firing alerts: low quota, upcoming expiry, dead session, rejected key, window exceeded |
quota_report | The scheduled-digest payload: all account numbers + current alerts |
quota-mcp owns condition detection (it holds the data and runs a 60 s background loop); scheduling and delivery belong to your agent platform. A hermes-style wiring:
A background evaluator refreshes stale probe data (>5 min), evaluates rules, keeps a
firing/resolved state machine in SQLite (alert_events), and POSTs only the transitions
to a webhook — the same alert never repeats until it clears and fires again.
Rules: credit_low (remaining share below threshold), expiring_soon (subscription/billing
period ending within N days), session_dead (StepFun console session needs re-import),
key_rejected (Command Code key got 401/403), window_limited (rate window exceeded).
Payload pushed on each transition:
No webhook? No problem — hermes (or anything) can poll instead:
then have a hermes cron every 15–30 min call quota_check_alerts and hermes send anything
new. Same for GET /api/alerts?history=20.
quota_report (or GET /api/report) returns a stable, agent-friendly payload: every account's
plan / expiry / remaining quota / session state / window usage / request stats, plus current
alerts. Point hermes's existing 09:30 cron at it: one turn calls the tool, composes the message,
and delivers via hermes send. No scheduler is duplicated inside quota-mcp.
| Variable | Default | Meaning |
|---|---|---|
QUOTA_MCP_ALERT_CREDIT_PCT | 0.2 | Fires when remaining share drops below this |
QUOTA_MCP_ALERT_EXPIRY_DAYS | 7 | Fires when subscription/billing period ends within N days |
QUOTA_MCP_ALERT_WEBHOOK_URL | — | POST target for alert transitions; empty = record only (pull mode) |
Example (quota_status output — what an agent would read to answer "how much quota is left?"):
QUOTA_MCP_MASTER_KEYBinaries for Linux / macOS / Windows (amd64 + arm64) are attached to each GitHub Release. Grab the latest:
Image is published to ghcr.io/limitcool/quota-mcp (amd64 + arm64) on every main push (:main) and tag (:v1.0.0, :latest).
Or with the bundled compose file (QUOTA_MCP_MASTER_KEY is required, put it in .env):
The database lives in the /data volume (QUOTA_MCP_DB=/data/quota-mcp.db). Back up the master key — losing it makes every stored credential unreadable.
MIT