
quota-mcp
io.github.limitcoolPublished by GitHub account limitcoolv0.3.2Updated Oct 24, 2026
Usage & quota tracker for AI subscription accounts (StepFun, Command Code)
Overview
Local read-only MCP server that tracks AI subscription usage and quota for StepFun and Command Code accounts and answers how much quota is left.
- What you can do
- List accounts with plan, expiry, remaining quota and masked session or key status, plus a per-platform summary of serving, limited, invalid or needs-relogin accounts and a digest report payload for scheduled summaries. Live-probe one account or all accounts against the upstream vendors and refresh the cached data. Check firing alerts for low credit, upcoming expiry, dead sessions, rejected keys and exceeded rate windows. Account enrolment, renewal and deletion are not exposed over MCP; they live on the server's separate REST management API.
- When to use it
- Useful when you hold StepFun or Command Code subscriptions and want an assistant to answer quota questions, flag low balances or expiring plans, or produce a periodic usage digest without opening each vendor dashboard.
- Requirements
- Runs as a local process (binary or the published container image) with a SQLite database path set by QUOTA_MCP_DB. Set QUOTA_MCP_MASTER_KEY (64 hex characters) in production to encrypt stored credentials. Accounts must first be enrolled through the REST API with vendor credentials: a StepFun browser session cookie or plan key, or a Command Code API key or session cookie. Network access to the vendor endpoints is needed for probing.
Installation
In SourceWeft
- Open quota-mcp in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
English | 简体中文
quota-mcp
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:
Highlights:
- Encrypted at rest: credentials are AES-256-GCM encrypted into SQLite (pure-Go driver, no CGO); every endpoint returns masked views only
- StepFun session auto-renewal: a background goroutine checks every 60 s and renews any session whose TTL drops below 20 min. Renewing an expired session gets you a degraded device token — there is a guard that detects this and refuses to persist it
- Dual auth planes: StepFun's plan key (permanent) and console session (quota data) are managed and probed separately; the verdict is driven by the permanent plane
- MCP is read-only: the query surface (list / probe / summarize) is safe to hand to agents; enrol / renew / delete live on the REST side only
- Single binary, zero external services
Quick start
After startup:
http://127.0.0.1:8780/healthzhealth checkhttp://127.0.0.1:8780/api/stepfun/accountsREST listhttp://127.0.0.1:8780/mcpMCP endpoint
Enrolling accounts
Command Code (two credential planes)
The 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.
StepFun (browser session)
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):
- The
.aiOasis-Tokencookie value is two JWTs concatenated (8 segments); the console only accepts the whole value — a single segment gets youtoken is illegal - Timestamp units differ per site:
.aireturns second-level strings,.comreturns milliseconds; the code infers by magnitude .comdevice tokens live only 30 minutes and its RefreshToken returns a degraded token —.comsessions need periodic re-import- Renewing after expiry yields a device token (
mode 1, data plane alwaystoken is illegal), so renewal must happen before expiry; a degradation guard refuses to store such tokens
REST API
MCP surface (for agents)
Two 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:
Alerts, expiry warnings & scheduled digest
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:
1. Threshold & expiry alerts (event-driven, push)
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.
2. Scheduled digest (cron)
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.
3. Environment variables
Example (quota_status output — what an agent would read to answer "how much quota is left?"):
Project layout
Security boundary
- Ciphertext goes to the DB only — never to logs, never to responses; every endpoint returns masks
- The REST surface contains writes: bind it to loopback or a private network. To expose it publicly, front it with a reverse proxy + auth and only publish the MCP path
- Losing the master key means every stored credential becomes unreadable — back up
QUOTA_MCP_MASTER_KEY
Releases
Binaries for Linux / macOS / Windows (amd64 + arm64) are attached to each GitHub Release. Grab the latest:
Docker
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.
License
MIT
Source: README.md at commit 4f8bc4f
Tools
0Version history
2- v0.3.2LatestSep 22, 2026
- v0.2.1Sep 21, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts