L2.2 : rejette les paramètres inconnus et les requis manquants (D23)
Mesure V1 (24/08/2026) : le SDK MCP ignore additionalProperties: false —
read_recent_logs({lines: 5}) avec la clause sur le schéma répondait
success: true, returnedLines: 100 (retombée silencieuse sur le défaut).
La validation vit donc dans le wrapper tools/call de src/index.js,
pilotée par les schémas de la table de routage (D22) : paramètre inconnu
ou requis manquant -> erreur structurée nommant le fautif et les
paramètres valides, avant tout dispatch.
Les 23 schémas portent additionalProperties: false — inerte côté SDK,
mais c'est le contrat que lisent les clients. Pas de renommage de
paramètres (écarté, cf. ROADMAP).
Mesures (via le protocole) :
- read_recent_logs({"lines": 5}) -> "Paramètre(s) inconnu(s) pour
read_recent_logs : lines. Paramètres valides : count, log_file."
- read_recent_logs({"count": 5}) -> succès, returnedLines: 5
- boucle sur 22 outils avec {} (execute_command vérifié statiquement) :
22/22 répondent, aucun Unknown tool, les 11 outils à paramètres requis
échouent avec le message actionnable
- handshake : 23 outils, 6 resources
Docs : D23 dans DECISIONS.md, L2.2 retirée de la ROADMAP.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -414,3 +414,29 @@ c'est un bug de développement, pas un cas d'exécution.
|
||||
La table ne présume rien de la signature des outils : `(name, args)` est
|
||||
transmis tel quel au `executeTool()` du module. Ajouter un paramètre à un
|
||||
outil ne la concerne pas.
|
||||
|
||||
---
|
||||
|
||||
## D23 — Le SDK ne valide pas les arguments : validation dans le wrapper
|
||||
|
||||
**Piège mesuré (24/08/2026).** Le SDK MCP (`@modelcontextprotocol/sdk` 1.x)
|
||||
ne valide **pas** les arguments d'appel contre l'`inputSchema` déclaré :
|
||||
`additionalProperties: false` est ignoré, et un paramètre inconnu
|
||||
(`read_recent_logs(lines: 60)`) retombe silencieusement sur les défauts
|
||||
(`count = 100`) sans le moindre signal.
|
||||
|
||||
**Décision.** Le wrapper `tools/call` de `src/index.js` valide chaque appel
|
||||
contre le schéma de la table de routage (D22) avant le dispatch — schéma
|
||||
déclaré = contrat appliqué, pour les 23 outils d'un coup :
|
||||
|
||||
- **paramètre inconnu** → erreur structurée nommant le paramètre fautif **et**
|
||||
les paramètres valides de l'outil ;
|
||||
- **paramètre `required` manquant** → même forme d'erreur.
|
||||
|
||||
Les 23 schémas portent aussi `additionalProperties: false` : inerte côté SDK,
|
||||
mais c'est le contrat que lisent les clients. La validation reste volontairement
|
||||
superficielle (noms et présence, pas les types) : le but est de supprimer le
|
||||
silence, pas de réimplémenter JSON Schema.
|
||||
|
||||
Le renommage des paramètres (`entity_type`/`query` uniformisés) a été **écarté**
|
||||
au profit de cette validation — voir ROADMAP « Écarté ».
|
||||
|
||||
Reference in New Issue
Block a user