fix: simplify MCP tool response to reduce grammar size for Bedrock#36
Conversation
- Replace BricksDocumentInfo (16 fields) with DocumentSummary (5 fields) in list_bricks_documents - Bedrock returns 400 'compiled grammar is too large' when tool schemas are too complex - Only expose what the LLM needs: id, file_name, mime_type, size, status
Kaiohz
left a comment
There was a problem hiding this comment.
Review — fix: simplify MCP tool response to reduce grammar size for Bedrock
Score: 8/10 🟢
✅ What works well
-
Problème bien ciblé — Bedrock a une limite de taille de grammaire pour les tool schemas. En réduisant de 16 champs (avec aliases Pydantic) à 5 champs essentiels, on réduit drastiquement la surface du JSON Schema généré. C'est la bonne approche.
-
Typage du retour — Le passage de
list→list[DocumentSummary]est un vrai plus. FastMCP va maintenant générer un schema JSON propre pour le tool, au lieu d'unlistopaque. -
Mapping explicite — La list comprehension est claire et explicite. On mappe uniquement les 5 champs utiles, pas de fuite de données internes.
-
Description sur
id— Le champida une description qui fait le lien avecread_bricks_document:"Document ID — pass this to read_bricks_document". C'est exactement ce qu'un LLM a besoin de savoir pour enchaîner les appels. Excellent choix. -
Approche non-destructive —
BricksDocumentInforeste intact dans le domaine. Seule la couche MCP fait le mapping. L'architecture hexagonale est respectée.
⚠️ Points à améliorer
-
Pas de test pour le mapping —
DocumentSummaryest un nouveau modèle qui mappe depuisBricksDocumentInfo. Même si c'est simple, un test unitaire qui vérifie que le mapping fonctionne (surtout les defaults) serait bienvenu. Ex:def test_document_summary_from_bricks_document_info(): doc = BricksDocumentInfo(id="abc", fileName="test.pdf", url="...", mimeType="application/pdf", size=1024, status="ready") summary = DocumentSummary(id=doc.id, file_name=doc.file_name, mime_type=doc.mime_type, size=doc.size, status=doc.status) assert summary.id == "abc"
-
Descriptions en français — Les descriptions Pydantic sont en français (
"Nom du fichier","Type MIME du fichier", etc.) alors que la description deidest en anglais ("Document ID — pass this to read_bricks_document"). En pratique, pour un tool MCP destiné à des LLMs multilingues, l'anglais serait préférable pour maximiser la compréhension. Mais ce n'est pas bloquant — le LLM comprendra les deux. -
Fin de fichier sans newline — Le diff montre
\\ No newline at end of file. Cosmétique, mais ça fait du bruit dans les diffs futurs. Ajouter un newline final. -
DocumentSummarydans le fichier tools — Le modèle est défini directement dansmcp_bricks_tools.py. Pour un projet en architecture hexagonale, ça serait plus propre dans un moduleapplication/responses/ouapplication/schemas/, séparé de la logique MCP. Mais vu la taille du modèle (5 champs), c'est acceptable ici.
💡 Suggestions optionnelles
-
Model_config sur DocumentSummary — Si jamais l'API Bricks renvoie du camelCase dans les futures additions, ajouter
model_config = ConfigDict(populate_by_name=True)en amont éviterait des surprises. -
Champs
urlmanquant ? — L'ancienBricksDocumentInfoexpose un champurl(URL pré-signée). Le LLM n'en a pas besoin directement (il passe parread_bricks_document), mais c'est bon à documenter dans la docstring du tool si quelqu'un se pose la question.
Verdict
PR propre et ciblée. Le fix est minimal, non-destructif, et résout le problème Bedrock. Les suggestions ci-dessus sont des améliorations cosmétiques/qualité — la PR est mergeable en l'état. 👍
Les 2 points qui mériteraient un follow-up : ajouter un test pour le mapping et homogénéiser les descriptions (FR vs EN).
Summary