Symptôme
capabilities.search renvoie systématiquement {"capabilities": [], "total": 0} quelle que
soit la requête, y compris pour des mots-clés qui correspondent à des tools présents dans la
même build. Le résultat est annoncé result_confidence: "complete" — donc un vide affirmé
comme fiable, indiscernable d'un « ce besoin n'est pas couvert ».
Build testée : 5e4eb061d (2026-08-19), 83 commits après v1.25.0, compilée localement.
Appels passés avec --mcp-binary vers la build (vérifié : token.holders répond ici et
retourne Unknown tool sur le Homebrew 1.25.0).
Cas de test
for q in holders token balance lending portfolio; do
printf "%-12s -> " "$q"
$BUILD/alter-cli mcp capabilities.search --json "{\"query\":\"$q\"}" \
--mcp-binary $BUILD/alter-mcp --timeout 90 \
| python3 -c "import sys,json;d=json.loads(json.loads(sys.stdin.read())['content'][0]['text'])['data'];print('total=',d.get('total'),'ids=',[c.get('id') for c in (d.get('capabilities') or [])])"
done
Observé vs attendu
Observé :
holders -> total= 0 ids= []
token -> total= 0 ids= []
balance -> total= 0 ids= []
lending -> total= 0 ids= []
portfolio -> total= 0 ids= []
result_confidence = "complete" à chaque fois
Attendu :
au moins un résultat pour "holders" (token.holders existe dans cette build)
au moins un résultat pour "lending" (lending.pool_snapshot, lending.spread, lending.events,
lending.positions_batch existent)
au moins un résultat pour "portfolio" (address.portfolio existe et répond en 1,4 s)
Vérité terrain : ces tools répondent tous normalement quand on les appelle par leur nom
exact dans la même session, sur la même build.
Testé aussi en français (« liste des détenteurs », « total supply ERC-20 », « prix d'un
token RealToken ») : même résultat vide. Ce n'est donc pas un problème de langue de requête.
Effet de bord : capabilities.evaluate devient inutilisable
$BUILD/alter-cli mcp capabilities.evaluate --json '{"network":"gnosis","address":"0x..."}' \
--mcp-binary $BUILD/alter-mcp
# → Missing required parameter(s): capability_key, contract_address, holder_address, network_id
capabilities.evaluate exige un capability_key. Le seul moyen de découvrir les clés
valides est capabilities.search — qui ne retourne rien. Les deux tools de découverte sont
donc inutilisables ensemble : on ne peut pas évaluer une capacité dont on ne peut pas
apprendre le nom.
À noter que address.inspect expose bien, lui, des capabilityKey exploitables
(transfer_tokens, approve_operator, …) — la donnée existe donc quelque part, elle n'est
simplement pas atteignable par le tool de recherche.
Impact usage
Ce projet applique une règle explicite : avant tout RPC/scraping manuel, vérifier qu'aucun
tool Alter ne couvre déjà le besoin. capabilities.search est l'outil prévu pour cette
vérification. Comme il répond « rien » avec une confiance « complete », il pousse
activement vers le contournement manuel — c'est-à-dire exactement le comportement que la
règle vise à éviter.
Concrètement, sur cette session : la recherche « holders » a renvoyé vide alors que
token.holders existait dans la build testée. Sans lecture des release notes, la
conclusion aurait été « Alter ne sait pas faire, je passe par l'explorer ».
✅ Test d'acceptation
capabilities.search {"query":"holders"} retourne au moins une entrée référençant
token.holders.
capabilities.search {"query":"lending"} retourne au moins les tools lending.*
exposés par la build.
- Chaque entrée retournée expose un identifiant réutilisable tel quel comme
capability_key par capabilities.evaluate.
- Si le registre est réellement vide (cas légitime), la réponse porte
result_confidence != "complete" et une note actionnable — jamais un vide silencieux
présenté comme complet.
- Anti-régression : les tools continuent de répondre quand on les appelle par leur nom
exact, et address.inspect continue d'exposer ses capabilityKey.
Réserves
Testé sur profil chargé, avec la collection rmm-v3 provisionnée et la chaîne Gnosis
présente, sans clé API explorer. Je n'ai pas vérifié si le registre de capacités dépend
d'un provisionnement particulier — si c'est le cas, l'absence de ce prérequis devrait être
signalée dans la réponse plutôt que rendue par un total de 0.
Symptôme
capabilities.searchrenvoie systématiquement{"capabilities": [], "total": 0}quelle quesoit la requête, y compris pour des mots-clés qui correspondent à des tools présents dans la
même build. Le résultat est annoncé
result_confidence: "complete"— donc un vide affirmécomme fiable, indiscernable d'un « ce besoin n'est pas couvert ».
Build testée :
5e4eb061d(2026-08-19), 83 commits aprèsv1.25.0, compilée localement.Appels passés avec
--mcp-binaryvers la build (vérifié :token.holdersrépond ici etretourne
Unknown toolsur le Homebrew 1.25.0).Cas de test
Observé vs attendu
Testé aussi en français (« liste des détenteurs », « total supply ERC-20 », « prix d'un
token RealToken ») : même résultat vide. Ce n'est donc pas un problème de langue de requête.
Effet de bord :
capabilities.evaluatedevient inutilisablecapabilities.evaluateexige uncapability_key. Le seul moyen de découvrir les clésvalides est
capabilities.search— qui ne retourne rien. Les deux tools de découverte sontdonc inutilisables ensemble : on ne peut pas évaluer une capacité dont on ne peut pas
apprendre le nom.
À noter que
address.inspectexpose bien, lui, descapabilityKeyexploitables(
transfer_tokens,approve_operator, …) — la donnée existe donc quelque part, elle n'estsimplement pas atteignable par le tool de recherche.
Impact usage
Ce projet applique une règle explicite : avant tout RPC/scraping manuel, vérifier qu'aucun
tool Alter ne couvre déjà le besoin.
capabilities.searchest l'outil prévu pour cettevérification. Comme il répond « rien » avec une confiance « complete », il pousse
activement vers le contournement manuel — c'est-à-dire exactement le comportement que la
règle vise à éviter.
Concrètement, sur cette session : la recherche « holders » a renvoyé vide alors que
token.holdersexistait dans la build testée. Sans lecture des release notes, laconclusion aurait été « Alter ne sait pas faire, je passe par l'explorer ».
✅ Test d'acceptation
capabilities.search {"query":"holders"}retourne au moins une entrée référençanttoken.holders.capabilities.search {"query":"lending"}retourne au moins les toolslending.*exposés par la build.
capability_keyparcapabilities.evaluate.result_confidence != "complete"et une note actionnable — jamais un vide silencieuxprésenté comme complet.
exact, et
address.inspectcontinue d'exposer sescapabilityKey.Réserves
Testé sur profil chargé, avec la collection
rmm-v3provisionnée et la chaîne Gnosisprésente, sans clé API explorer. Je n'ai pas vérifié si le registre de capacités dépend
d'un provisionnement particulier — si c'est le cas, l'absence de ce prérequis devrait être
signalée dans la réponse plutôt que rendue par un total de 0.