Skip to content

capabilities.search retourne 0 résultat sur toute requête, y compris les tools existants — avec result_confidence "complete" #78

Description

@spouletmathis

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

  1. capabilities.search {"query":"holders"} retourne au moins une entrée référençant
    token.holders.
  2. capabilities.search {"query":"lending"} retourne au moins les tools lending.*
    exposés par la build.
  3. Chaque entrée retournée expose un identifiant réutilisable tel quel comme
    capability_key par capabilities.evaluate.
  4. 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.
  5. 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions