Skip to content

Commit e500b6f

Browse files
authored
Merge pull request #6 from nic01asFr/claude/fix-grist-ctx-parameter-Xqhnr
Fix table and column creation Add schema tools Fix files download
2 parents 3d13dcd + 22a575f commit e500b6f

File tree

12 files changed

+2118
-105
lines changed

12 files changed

+2118
-105
lines changed

CHANGELOG.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# Changelog
2+
3+
Tous les changements notables de ce projet seront documentés dans ce fichier.
4+
5+
Le format est basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.0.0/),
6+
et ce projet adhère au [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7+
8+
## [0.2.0] - 2024-12-30
9+
10+
### Ajouté
11+
12+
- **Nouvel outil `create_schema`** : Création de schémas complets en une opération
13+
- Création séquentielle : tables simples → résolution refs → colonnes référence
14+
- Support des relations inverses (`reverse` dans la définition)
15+
- Insertion optionnelle de données initiales
16+
- Rapport détaillé avec warnings et erreurs
17+
18+
- **Nouvel outil `create_reference_column`** : Création de références simplifiée
19+
- Résolution automatique de `visibleCol` par nom de colonne
20+
- Validation de l'existence de la table cible
21+
- Création optionnelle de la relation inverse
22+
23+
- **Nouvel outil `validate_schema`** : Validation sans création
24+
- Vérification des tables cibles
25+
- Détection des colonnes Choice sans choix
26+
- Liste des erreurs et warnings
27+
28+
- **Nouvel outil `export_schema`** : Export de schémas existants
29+
- Formats : JSON, YAML, Mermaid (diagramme ER)
30+
- Option pour inclure les données
31+
32+
- **Nouveau module `types.py`** : Définitions de types
33+
- `ColumnDefinition`, `TableDefinition`, `SchemaDefinition`
34+
- Mapping `GRIST_COLUMN_TYPES` avec validations
35+
- Fonction `parse_schema_dict` pour parser les schémas
36+
37+
- **Nouveau module `utils.py`** : Fonctions utilitaires
38+
- `prepare_table_payload` : Format correct pour création de tables
39+
- `prepare_column_payload` : Format correct pour colonnes
40+
- `resolve_visible_col` : Résolution nom → colRef
41+
- `check_table_exists` : Vérification d'existence
42+
43+
### Corrigé
44+
45+
- **`create_table`** : Format du payload corrigé
46+
- Avant : `{"tables": [{"tableId": "X", "columns": [...]}]}`
47+
- Après : `{"tables": [{"id": "X", "columns": [{"id": "col", "fields": {...}}]}]}`
48+
49+
- **`modify_table`** : Format du payload corrigé
50+
- Avant : `{"tables": [{"tableId": "X", "newTableId": "Y"}]}`
51+
- Après : `{"tables": [{"id": "X", "fields": {"tableId": "Y"}}]}`
52+
53+
- **`create_column` / `modify_column`** : `widgetOptions` sérialisé en JSON string
54+
- L'API Grist attend une string, pas un dict
55+
- Correction appliquée via `json.dumps()`
56+
57+
- **`create_column`** : Support des `choices` pour `Choice`/`ChoiceList`
58+
- Nouveau paramètre `choices: List[str]`
59+
- Intégré automatiquement dans `widgetOptions`
60+
61+
- **`download_table_csv`** : Implémentation complète
62+
- Paramètre `tableId` correctement passé
63+
64+
- **`download_document_excel`** : Gestion du paramètre obligatoire `tableId`
65+
- Récupère automatiquement la première table si non spécifié
66+
67+
### Modifié
68+
69+
- **`create_column`** : Nouveaux paramètres
70+
- `visible_col: int` : Pour les références
71+
- `untie_col_id_from_label: bool` : Défaut True
72+
- `description: str` : Description de la colonne
73+
- `choices: List[str]` : Pour Choice/ChoiceList
74+
75+
- **`modify_column`** : Nouveaux paramètres
76+
- `visible_col: int`
77+
- `untie_col_id_from_label: bool`
78+
- `description: str`
79+
80+
### Structure du projet
81+
82+
```
83+
src/mcp_server_grist/
84+
├── types.py # NOUVEAU: Types et validations
85+
├── tools/
86+
│ ├── __init__.py # MODIFIÉ: Exports
87+
│ ├── utils.py # NOUVEAU: Utilitaires
88+
│ ├── administration.py # MODIFIÉ: Corrections
89+
│ ├── schema.py # NOUVEAU: Outils schéma
90+
│ └── downloads.py # MODIFIÉ: Corrections
91+
└── ...
92+
```
93+
94+
## [0.1.x] - Versions précédentes
95+
96+
### Fonctionnalités initiales
97+
98+
- Navigation : organisations, workspaces, documents, tables, colonnes
99+
- CRUD tables et colonnes
100+
- CRUD enregistrements
101+
- Requêtes SQL
102+
- Gestion des accès
103+
- Webhooks
104+
- Pièces jointes
689 KB
Binary file not shown.

mcp-server-grist-v0.2.0.tar.gz

21.1 KB
Binary file not shown.

src/mcp_server_grist/client.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -408,13 +408,15 @@ async def download_doc(self, doc_id: str, nohistory: bool = False, template: boo
408408
response.raise_for_status()
409409
return response.content
410410

411-
async def download_doc_xlsx(self, doc_id: str, header: str = "label") -> bytes:
411+
async def download_doc_xlsx(self, doc_id: str, table_id: Optional[str] = None, header: str = "label") -> bytes:
412412
"""Télécharge un document au format Excel."""
413413
params = {"header": header}
414+
if table_id:
415+
params["tableId"] = table_id
414416

415-
logger.debug(f"Downloading document {doc_id} as Excel")
417+
logger.debug(f"Downloading document {doc_id} as Excel with params: {params}")
416418
try:
417-
async with httpx.AsyncClient(timeout=120.0) as client: # Augmenter timeout
419+
async with httpx.AsyncClient(timeout=120.0) as client:
418420
response = await client.request(
419421
method="GET",
420422
url=f"{self.api_url.rstrip('/')}/docs/{doc_id}/download/xlsx",
@@ -423,17 +425,15 @@ async def download_doc_xlsx(self, doc_id: str, header: str = "label") -> bytes:
423425
)
424426

425427
logger.debug(f"Excel download response status: {response.status_code}")
426-
logger.debug(f"Excel download response headers: {dict(response.headers)}")
427428

428429
response.raise_for_status()
429430
return response.content
430431

431432
except httpx.TimeoutException as e:
432433
logger.error(f"Excel download timeout for doc {doc_id}: {e}")
433-
raise ValueError(f"Excel download timeout - document may be too large. Try download_document_sqlite as alternative.")
434+
raise ValueError(f"Excel download timeout - document may be too large.")
434435
except httpx.HTTPStatusError as e:
435436
logger.error(f"Excel download HTTP error for doc {doc_id}: {e}")
436-
logger.error(f"Response text: {e.response.text}")
437437
raise ValueError(f"Excel download failed: {e.response.status_code} - {e.response.text}")
438438
except Exception as e:
439439
logger.error(f"Excel download unexpected error for doc {doc_id}: {e}")

src/mcp_server_grist/tools/__init__.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
44
Ce module regroupe tous les outils MCP disponibles pour interagir
55
avec l'API Grist, organisés par catégories fonctionnelles.
6+
7+
v0.2.0: Ajout des outils de schéma (create_schema, create_reference_column, etc.)
68
"""
79

810
from .access import register_access_tools
@@ -12,39 +14,43 @@
1214
from .navigation import register_navigation_tools
1315
from .queries import register_query_tools
1416
from .records import register_record_tools
17+
from .schema import register_schema_tools
1518
from .webhooks import register_webhook_tools
1619

1720

1821
def register_all_tools(mcp_server):
1922
"""
2023
Enregistre tous les outils MCP disponibles sur le serveur.
21-
24+
2225
Cette fonction centralise l'enregistrement de tous les outils
2326
pour faciliter leur gestion et leur découverte.
24-
27+
2528
Args:
2629
mcp_server: L'instance du serveur MCP sur laquelle enregistrer les outils.
2730
"""
2831
# Navigation (lecture)
2932
register_navigation_tools(mcp_server)
30-
33+
3134
# Records (écriture)
3235
register_record_tools(mcp_server)
33-
36+
3437
# Queries (requêtes SQL)
3538
register_query_tools(mcp_server)
36-
39+
3740
# Administration
3841
register_admin_tools(mcp_server)
39-
42+
4043
# Gestion des accès
4144
register_access_tools(mcp_server)
42-
45+
4346
# Export et téléchargement
4447
register_export_tools(mcp_server)
45-
48+
4649
# Pièces jointes
4750
register_attachment_tools(mcp_server)
48-
51+
4952
# Webhooks
50-
register_webhook_tools(mcp_server)
53+
register_webhook_tools(mcp_server)
54+
55+
# Schéma (v0.2.0) - Outils de création de schéma
56+
register_schema_tools(mcp_server)

0 commit comments

Comments
 (0)