minimax-remaining-mcp
MCP 服务器:让 AI 代理知道 MiniMax Token Plan 套餐还剩多少额度, 以及什么时候该暂停自己以避免触发限流。
适配 DeepSeek Harness (DSH)、Claude Desktop、Cursor 等所有兼容 MCP 协议的客户端。
┌──────────────┐ stdio ┌──────────────────────┐ HTTPS ┌──────────────┐
│ AI 代理 │ ──────────► │ minimax-remaining- │ ────────► │ MiniMax │
│ (DSH 等) │ ◄────────── │ mcp │ ◄──────── │ Web API │
└──────────────┘ └──────────┬───────────┘ └──────────────┘
│
▼
┌─────────────┐
│ Camoufox │ 一次性手动登录
│ (Firefox) │ → 持久化会话 cookie
└─────────────┘
项目背景
MiniMax 网页控制台的 "5h 限额 / 61% 已用 / 2h56m 后重置" 面板其实由 两个 HTTP 接口驱动:
/v1/api/openplatform/coding_plan/remains?GroupId=…— 5 小时固定窗口的 剩余百分比 + 倒计时/backend/account/token_plan_credit— 套餐池(周维度)的累计额度
两个接口都不接受网页 UI 上的 api_key(长得像 sk-cp-...)作为
Bearer Token —— 用它会返回 base_resp = {2062, "no active token plan"}。
唯一可行的方案是使用网页会话 cookie(真实浏览器登录后的 _token)。
本项目用 Camoufox 维持一个持久化的 Firefox profile,让 cookie 在
MCP 服务器重启之间保留下来。
5 小时固定窗口(不是滚动窗口)
按 MiniMax 官方文档:
套餐内额度受 5 小时固定窗口和周窗口控制;未使用完的套餐内额度 不会结转到下一个计费周期。
所以窗口边界是固定的时钟时段(典型为 CST 00:00 10:00 / 15:00 / 20:00
等),而不是从你的首次请求开始滚动。如果你在窗口切换前几秒查询,返回
的会是下一个窗口的数据。响应里的 interval_start_iso /
interval_end_iso 字段会告诉你具体是哪一段。
一行安装
# 方式 1:从 PyPI 安装(推荐)
pip install minimax-remaining-mcp
# 或
uv pip install minimax-remaining-mcp
# 或
uvx minimax-remaining-mcp # 不安装直接运行
# 方式 2:从 GitHub 安装(无需 PyPI 账号)
pip install git+https://github.com/yang-cc/minimax-remaining-mcp.git
# 方式 3:本地开发模式
git clone https://github.com/yang-cc/minimax-remaining-mcp.git
cd minimax-remaining-mcp
uv venv .venv --python 3.12
uv pip install -e .
一次性登录
由于没有 Bearer Token 路径,需要先在 Camoufox 里手动登录一次:
# 1. 启动服务器
python -m minimax_remaining_mcp.server
# 2. 在 MCP 客户端里调用:
minimax_login(timeout_seconds=600)
Camoufox 浏览器会弹出并打开 MiniMax 登录页。请手动完成
Cloudflare / CAPTCHA 验证、登录账号,直到浏览器进入 API Keys 页面。
服务器会自动检测到 _token cookie 并把会话持久化到 data/cookies.json。
🔌 DeepSeek Harness (DSH) 集成
DSH 通过 @deepseek-ai/dsh-mcp-client 加载 MCP 服务器。在
~/.dsh/profiles/web/cordis.patch.yml 里追加下面这段(注意 package
名是 minimax-remaining-mcp,但 Python 模块路径是
minimax_remaining_mcp.server):
- insert:
- id: minimax-remaining-mcp
name: '@deepseek-ai/dsh-mcp-client'
config:
serverName: minimax
transport: stdio
command: <repo>/.venv/Scripts/python.exe # 或 uv 环境的 python
args: ['-u', '-m', 'minimax_remaining_mcp.server']
env:
# 暂停阈值:5h 剩余低于 30% 时触发代理暂停
MINIMAX_PAUSE_THRESHOLD_REMAINING_PCT: '30'
# 储存目录(可选,默认 ./data)
# MINIMAX_DATA_DIR: E:\\codex_dir\\.dsh\\state\\minimax-remaining-mcp
failOnStartupError: false
toolCallTimeoutMs: 180000
DSH 集成要点
| 注意点 | 说明 |
|---|---|
-u 参数 |
让 Python stdio 不带缓冲,DSH 控制台能立刻看到 MCP 服务器日志。 |
| Python 解释器路径 | 取决于安装方式: • pip install → 用系统 Python 或 venv 中的 python• uv pip install -e . → <repo>/.venv/Scripts/python.exe• uv tool install → uv tool run minimax-remaining-mcp 也行,但 stdio 缓冲需要 -u |
| 首次启动需要登录 | DSH 启动 MCP 服务器时如果 data/cookies.json 不存在,调用 minimax_login() 会弹出浏览器窗口。 |
| 重启 DSH | 修改 cordis.patch.yml 后必须重启 DSH 才会生效。 |
failOnStartupError: false |
推荐设为 false,这样即使首次启动时 cookie 还没准备好,DSH 也不会立即报错。 |
| 持久化目录隔离 | 多个项目共用同一个 DSH 时,建议每个项目用不同的 MINIMAX_DATA_DIR,避免 cookie 互相覆盖。 |
DSH 中的典型用法
DSH 启动后,会调用 minimax_status() 来判断剩余额度。你可以训练代理在
每次 MiniMax API 调用前先调用一次 minimax_status(),观察 should_pause
字段:
remaining_percent_5h < 30 → should_pause=true → 代理应停下来或转做其他事
remaining_percent_5h >= 30 → should_pause=false → 可以继续调用
更彻底的方案是调用 minimax_wait_for_quota(),它会阻塞直到额度恢复
到阈值之上(默认 MINIMAX_PAUSE_THRESHOLD_REMAINING_PCT),省去代理自己
写轮询逻辑。
工具一览
| 工具 | 用途 |
|---|---|
minimax_status() |
网页面板的全部数字:5h 剩余/已用 %、倒计时、套餐累计。低于阈值时设置 should_pause=true。 |
minimax_window() |
仅返回代理本地的 5h 观测窗口状态(与 MiniMax 的固定窗口是分开的,仅用于代理自节流)。 |
minimax_consume(delta=N) |
把本地窗口消费计数器加 N。每次 MiniMax API 调用后调用一次。 |
minimax_wait_for_quota(target_pct=None, poll_seconds=60) |
阻塞到 5h 剩余百分比 ≥ target_pct。关闭 MCP 连接可中断。 |
minimax_login(timeout_seconds=600) |
弹出 Camoufox 浏览器窗口用于手动登录。 |
minimax_smoke() |
快速 Camoufox 健康检查(打开 example.com)。 |
minimax_info() |
静态配置 + 最近一次会话元数据。 |
minimax_clear(confirm=True) |
清空 cookies / session / window 状态。 |
⚠️ 首次冷启动(Camoufox)会比较慢
minimax_smoke() 和 minimax_login() 第一次启动 Camoufox 时,需要解压
持久化的 Firefox profile、初始化 sqlite 数据库、加载扩展等,通常需要
30-90 秒(视磁盘速度而定)。这是 Camoufox 冷启动的正常表现,不是
bug——后续启动会复用 data/profile/ 里的缓存,秒级完成。
如果首次调用超过了你的 MCP 客户端 toolCallTimeoutMs(DSH 默认 180s)
而被中止,重试一次即可看到结果。如果你预计会频繁冷启动(例如在
CI 里跑),可以把对应 MCP 客户端的 toolCallTimeoutMs 调到 300000(5
分钟)。
minimax_status() 响应示例
实际诊断输出(当 5h 窗口已耗尽、应触发暂停时):
下面是规范化后的 JSON 结构:
{
"ok": true,
"source": "coding_plan",
"remaining_percent_5h": 76, // 5h 窗口剩余 %
"used_percent_5h": 24, // 5h 窗口已用 %
"seconds_until_reset_human": "4h21m35s",
"interval_end_iso": "2026-08-25T12:00:00+00:00",
"interval_status_text": "active", // active | exhausted | inactive
"remaining_percent_weekly": 100,
"seconds_until_weekly_reset_human": "5d08h42m",
"total_credits": 14000, // 套餐累计(周维度)
"used_credits": 3188,
"remaining_credits": 10812,
"user_name": "...",
"group_id": "...",
"should_pause": false, // 低于阈值时为 true
"model_remains": [
{ "model_name": "general", "interval_remaining_percent": 76, "interval_status": 1 },
{ "model_name": "video", "interval_remaining_percent": 100, "interval_status": 3 }
]
}
暂停阈值语义
MINIMAX_PAUSE_THRESHOLD_REMAINING_PCT=30 的意思是 当 5h 窗口的剩余
百分比 < 30% 时暂停(即已用超过 70%)。对比的是 remaining_percent_5h,
不是套餐累计的 remaining_credits —— 这两者是独立指标。
持久化文件
所有状态以纯 JSON 储存在 data/(已被 .gitignore 屏蔽):
data/
├── cookies.json # Camoufox 会话 cookie
├── session.json # 最近一次登录元数据
├── window.json # 代理本地的 5h 观测窗口
├── last_usage.json # 最近一次成功的 API 响应(缓存)
└── profile/ # Camoufox 持久化 Firefox profile(~150 MB)
如果 coding_plan/remains 返回 401/403,完整响应体会写到
data/last_coding_plan_failure.json 方便排查 —— 在怀疑服务挂了之前先
看这个文件。
环境变量
全部可选,默认值见下表。
| 变量 | 默认 | 说明 |
|---|---|---|
MINIMAX_PAUSE_THRESHOLD_REMAINING_PCT |
30 |
5h 剩余低于此值时暂停。 |
MINIMAX_WINDOW_SECONDS |
18000 |
代理本地窗口长度(5h)。 |
MINIMAX_HEADFUL_ON_LOGIN |
1 |
登录时强制显示浏览器窗口。 |
MINIMAX_CAMOUFOX_OS |
auto | windows / macos / linux。 |
MINIMAX_CAMOUFOX_LOCALE |
zh-CN |
浏览器语言。 |
MINIMAX_HTTP_TIMEOUT |
15 |
API 请求超时(秒)。 |
MINIMAX_DATA_DIR |
./data |
cookies / session 储存目录。 |
MINIMAX_WEB_URL |
https://platform.minimaxi.com |
覆盖控制台基础 URL。 |
MINIMAX_USAGE_API_URL |
…/backend/account/token_plan_credit |
套餐池 endpoint。 |
MINIMAX_REMAINS_API_URL |
…/v1/api/openplatform/coding_plan/remains |
5h 窗口 endpoint。 |
MINIMAX_REMAINS_API_URL_FALLBACK |
api.minimaxi.com/... |
主 endpoint 失败时使用。 |
MINIMAX_LOGIN_HINT_URL |
…/user-center/basic-information/interface-key |
登录落地页。 |
本地开发 & 调试
# 启动 MCP 服务器(stdio 模式)
.venv\Scripts\python.exe -u -m minimax_remaining_mcp.server
# 或(Windows)
run.bat
# 直接探测 coding_plan 接口(无需 MCP / 浏览器)
.venv\Scripts\python.exe probe_coding_plan.py
# 检查持久化状态
cat data/cookies.json | head -c 200
cat data/session.json
cat data/last_coding_plan_failure.json # 如果存在
打包发布到 PyPI(维护者用)
# 安装打包工具
pip install build twine
# 在项目根目录构建 wheel + sdist
python -m build
# → dist/minimax_remaining_mcp-0.1.0-py3-none-any.whl
# → dist/minimax_remaining_mcp-0.1.0.tar.gz
# 检查产物
twine check dist/*
# 上传到 PyPI(需要先 `twine login` 或用 token)
twine upload dist/*
# 或:uv publish dist/*
发布后任何人可以:
pip install minimax-remaining-mcp
uv pip install minimax-remaining-mcp
uvx minimax-remaining-mcp # 临时运行
限制
- 没有 Bearer-key 路径。 MiniMax 目前没有为 Coding Plan API 发放订阅
密钥;网页控制台上的
api_key当作 Bearer 用会返回2062 "no active token plan"。唯一可行的是会话 cookie。 - Cloudflare / CAPTCHA 需手动完成。 首次登录必须由真人完成。 本项目不接入任何打码服务。
- 5h 窗口是 CST 固定时段。 在窗口切换前查询,会拿到下一个窗口的数据。
interval_start_iso/interval_end_iso告诉你具体是哪一段。 - 套餐累计(
remaining_credits)不会结转。 它是周维度的累计池, 不会随 5h 窗口重置而清零。
许可证
MIT — 详见 LICENSE。
Metadata
Release files for minimax-remaining-mcp 0.1.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| minimax_remaining_mcp-0.1.4.tar.gz | 26.4 kB | Without provenance | Details for minimax_remaining_mcp-0.1.4.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| minimax_remaining_mcp-0.1.4-py3-none-any.whl | Python 3 | none | any | Details for minimax_remaining_mcp-0.1.4-py3-none-any.whl |
Total release size: 57.4 kB
Release files / minimax_remaining_mcp-0.1.4.tar.gz
| Download URL | minimax_remaining_mcp-0.1.4.tar.gz |
|---|---|
| Size | 26.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3f4138212cd1559c558b7b3d4c1dd02c0a206e249ac084a2d9d257fb105f8763
|
|
BLAKE2b-256 checksum How to use checksums |
e7c0458f99d41fa344014c89c3223306e53229a0a3b92c33609728aabf07239b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / minimax_remaining_mcp-0.1.4-py3-none-any.whl
| Download URL | minimax_remaining_mcp-0.1.4-py3-none-any.whl |
|---|---|
| Size | 31.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3e25a22bcec5fcae5338286c6371fab0e9fee5ce5f57d54de4afacd6ce91c091
|
|
BLAKE2b-256 checksum How to use checksums |
e0855140d8ab65dcd2f9358ccebb3a62897f0742b467c3ff063e8f0a1cff49b5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.5 {"installer":{"name":"uv","version":"0.12.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Security for minimax-remaining-mcp 0.1.4
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.