Pour les agents
Brimline donne à vos agents les mêmes chiffres que la barre des menus. Il ne contient aucune IA et n'est pas un prompt : c'est une commande et un serveur MCP local qui répondent par des chiffres quand un agent les demande. Il ne change jamais de compte.
Comment ça marche
L'app lit les jetons et interroge le fournisseur. Après chaque lecture, elle écrit les chiffres, et seulement les chiffres, dans un cache : ~/Library/Application Support/Brimline/usage.json. Le serveur MCP et brimline status lisent ce cache et ne voient jamais de jeton. Seule brimline status --live lit le Trousseau et interroge elle-même le fournisseur, avec le même code que l'app. Chaque réponse chiffrée dit l'âge de ses chiffres. Rien de tout cela n'écrit dans vos dossiers Claude Code ni dans le Trousseau, et rien ne lance ni n'arrête un agent.
Est-ce un prompt ?
Non. Brimline ne contient aucun modèle d'IA. Quand votre agent démarre, son client (Claude Code, Codex) lit une courte notice du serveur : le nom et la description de ses trois outils, et une courte consigne. Ce texte aide le modèle à savoir quand appeler un outil ; les réponses, elles, ne sont que des chiffres en JSON.

La commande
# Chaque compte, depuis le cache de l'app
brimline status
# La même chose, en JSON
brimline status --json
# Une lecture directe, sans le cache
brimline status --live
# Un seul fournisseur (claude, chatgpt, gemini, grok ou cursor)
brimline status --provider chatgpt --json
# Les fournisseurs, et si chacun est activé
brimline providers
# Le serveur MCP, sur l'entrée et la sortie standard
brimline mcp--live lit directement le fournisseur, avec le même code que l'app, pour quand l'app ne tourne pas. L'installateur relie la commande à ~/.local/bin/brimline ; son chemin exact est affiché dans les Réglages, onglet Agents.
Le serveur MCP
brimline mcp est un serveur MCP local, sur l'entrée et la sortie standard, sans port réseau. Il propose trois outils :
list_accounts- Les comptes, chacun avec son fournisseur, son adresse, son organisation et son état, sans chiffres.
get_usage- Les limites de chaque compte, d'un fournisseur (
provider:claude,chatgpt,gemini,grokoucursor) ou d'un seul compte (account: une adresse ou un id de compte) : chaque limite avec son pourcentage utilisé et son heure de remise à zéro, et l'âge des chiffres. Les comptes masqués sont laissés de côté, sauf siinclude_hiddenvaut true. best_account- Le compte qui a le plus de marge, parmi les comptes d'un fournisseur (
provider,claudepar défaut : un appel écrit avant les fournisseurs répond comme avant).window:any(toutes les limites qui s'appliquent, par défaut),session,week,day,monthouperiod, parmi celles qui existent pour le fournisseur (en demander une autre est une erreur, pas une réponse vide) ;model, facultatif, ajoute la limite de ce modèle. Les comptes masqués, jamais lus, refusés ou sans connexion sont écartés ; les comptes indisponibles viennent en dernier. Un compte qui n'a aucune des limites demandées, par exemple un siège d'équipe sans limite hebdomadaire globale, est jugé sur sa limite la plus serrée : la limite qui compte peut alors être la session.
Dans Claude Code
L'installateur relie la commande à ~/.local/bin/brimline. L'onglet Agents donne la même ligne avec votre chemin exact, prête à copier. --scope user le rend disponible dans tous vos projets ; sans cette option, Claude Code ne l'ajoute qu'au projet en cours.
claude mcp add --scope user brimline -- ~/.local/bin/brimline mcpDans Codex (OpenAI)
Codex déclare un serveur MCP en une ligne, ou dans ~/.codex/config.toml ; dans le fichier, donnez le chemin complet de la commande. Par Brimline, Codex lit les chiffres de chaque fournisseur activé : Claude toujours, et ChatGPT, Gemini, Grok et Cursor une fois que vous les avez activés. Un fournisseur coupé n'a aucun compte dans les réponses.
codex mcp add brimline -- ~/.local/bin/brimline mcp[mcp_servers.brimline]
command = "/Users/<you>/.local/bin/brimline"
args = ["mcp"]Dans un autre client MCP
Les clients qui prennent le bloc JSON mcpServers habituel acceptent celui-ci. Remplacez /Users/<you> par votre dossier personnel : les fichiers de configuration veulent un chemin absolu et ne développent pas ~. L'onglet Agents donne le bloc avec votre chemin.
{
"mcpServers": {
"brimline": {
"command": "/Users/<you>/.local/bin/brimline",
"args": ["mcp"]
}
}
}Essayez vous-même
C'est exactement ce que fait votre agent. Lancez l'app, puis collez ceci dans un terminal : la commande demande au serveur le compte Claude qui a le plus de marge cette semaine (provider vaut claude, la valeur par défaut, écrite ici en toutes lettres), et affiche la réponse.
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"try","version":"0"}}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"best_account","arguments":{"provider":"claude","window":"week"}}}' \
| brimline mcp | tail -n 1 | python3 -m json.toolLa réponse, raccourcie (la réponse complète donne aussi chaque limite de chaque compte) :
{
"result": {
"isError": false,
"structuredContent": {
"provider": "claude",
"window": "week",
"model": null,
"age_seconds": 42,
"best": {
"email": "your@claude.ai",
"source": "~/.claude",
"status": "ok",
"stale": false,
"headroom_percent": 58,
"binding_limit": { "kind": "weekly", "percent": 42, "resets_in_seconds": 183600 }
},
"ranking": [
{ "email": "your@claude.ai", "headroom_percent": 58 },
{ "email": "team@claude.ai", "headroom_percent": 12 }
]
}
}
}best est le premier de ranking. headroom_percent est la marge sur la limite qui compte (binding_limit) ; age_seconds et stale disent si les chiffres sont frais. Vos chiffres et vos adresses seront différents.
Deux fournisseurs, une question
Admettons que vous ayez un compte Claude et un compte ChatGPT (lu par Codex), tous deux activés. Vous demandez à votre agent : « Lequel de mes deux assistants a le plus de marge cette semaine pour une longue tâche ? » best_account classe les comptes d'un fournisseur à la fois : l'agent l'appelle donc une fois par fournisseur :
{ "name": "best_account", "arguments": { "provider": "claude", "window": "week" } }
{ "name": "best_account", "arguments": { "provider": "chatgpt", "window": "week" } }Les réponses, raccourcies à ce qui décide (les chiffres sont un exemple) :
{ "provider": "claude",
"best": { "email": "your@claude.ai", "source": "~/.claude", "headroom_percent": 58,
"binding_limit": { "kind": "weekly", "percent": 42, "resets_in_seconds": 183600 } } }
{ "provider": "chatgpt",
"best": { "email": null, "source": "~/.codex", "headroom_percent": 29,
"binding_limit": { "kind": "weekly", "percent": 71, "resets_in_seconds": 367200 } } }L'agent compare : Claude a 58 % de sa semaine devant lui et ChatGPT 29 %, donc la longue tâche va à Claude ; la semaine de ChatGPT repart dans 4 jours environ, celle de Claude dans 2. Un compte ChatGPT lu par Codex n'a pas d'adresse (email vaut null) : on le distingue par sa source, ici ~/.codex. Un fournisseur qui ne donne aucune limite que Brimline puisse lire est listé par list_accounts et jamais classé : Gemini sans Antigravity a status: not_readable, et un compte Grok gratuit a status: ok, un limits vide et la phrase « xAI ne renvoie aucune limite de crédits pour ce compte. »
En mots
Vous demandez : « Avant cette longue tâche, lequel de mes comptes Claude a le plus de marge cette semaine ? » L'agent appelle best_account avec window: week, reçoit your@claude.ai avec 58 % de marge sur la semaine, remise à zéro dans deux jours environ, et répond : « Prends your@claude.ai : claude dans son dossier habituel. » La session en cours reste sur son compte ; c'est vous qui lancez la suivante.