Mcp Server Grist — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Mcp Server Grist (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.

Un serveur MCP (Model Context Protocol) pour interagir avec l'API Grist. Ce serveur permet d'accéder et de manipuler les données Grist directement depuis des modèles de langage comme Claude.
mcp-server-grist/
├── src/
│ └── mcp_server_grist/ # Package principal
│ ├── __init__.py # Point d'entrée du package
│ ├── __main__.py # Support pour exécution en module
│ ├── version.py # Gestion de version
│ ├── main.py # Point d'entrée principal
│ ├── server.py # Configuration du serveur MCP
│ ├── client.py # Client API Grist
│ ├── tools/ # Outils MCP organisés par catégorie
│ └── models.py # Modèles de données Pydantic
├── tests/ # Tests unitaires et d'intégration
├── docs/ # Documentation détaillée
├── requirements.txt # Dépendances Python
├── pyproject.toml # Configuration moderne du package
├── Dockerfile # Configuration Docker
├── docker-compose.yml # Configuration multi-services
├── .env.template # Template pour variables d'environnement
└── README.md # Documentation principalefastmcp, httpx, pydantic, python-dotenvEn utilisant uvx, l'environnement et le téléchargement des paquets se fait à la volée au moment de l'éxécution
uvx mcp-server-gristLa configuration en json est :
{
"mcpServers": {
"grist-server": {
"disabled": false,
"timeout": 60,
"type": "stdio",
"command": "uvx",
"args": [
"mcp-server-grist"
],
"env": {
"GRIST_API_KEY": "ta_cle_API_GRIST"
}
}
}
}pip install mcp-server-gristAprès l'installation, vous pouvez exécuter le serveur avec :
mcp-server-gristPour utiliser ce serveur MCP avec Claude Desktop, ajoutez la configuration suivante à votre fichier mcp_servers.json :
{
"mcpServers": {
"grist-mcp": {
"command": "node",
"args": [
"chemin/vers/npm-wrapper/bin/start.js"
],
"env": {
"GRIST_API_KEY": "votre_clé_api_grist",
"GRIST_API_URL": "https://docs.getgrist.com/api"
}
}
}
}Remplacez chemin/vers/npm-wrapper/bin/start.js par le chemin absolu vers le script start.js du wrapper Node.js inclus dans ce package.
Pour contribuer ou personnaliser le serveur :
# Cloner le repository
git clone https://github.com/modelcontextprotocol/mcp-server-grist.git
cd mcp-server-grist
# Installer en mode développement
pip install -e .
# Lancer les tests
python -m pytest testsPour un déploiement rapide avec Docker :
# Construire l'image
docker build -t mcp/grist-mcp-server .
# Exécuter le container
docker run -it --rm \
-e GRIST_API_KEY=votre_clé_api \
-e GRIST_API_HOST=https://docs.getgrist.com/api \
mcp/grist-mcp-serverPour déployer plusieurs modes de transport en parallèle :
# Configurer les variables d'environnement
cp .env.example .env
# Éditer le fichier .env avec votre clé API
# Lancer les services
docker-compose upCréez un fichier .env basé sur .env.template avec les variables suivantes :
GRIST_API_KEY=votre_clé_api
GRIST_API_HOST=https://docs.getgrist.com/api
LOG_LEVEL=INFO # Options: DEBUG, INFO, WARNING, ERROR, CRITICALVous trouverez votre clé API dans les paramètres de votre compte Grist.
Ajoutez ceci à votre claude_desktop_config.json :
#### Version Python
{
"mcpServers": {
"grist-mcp": {
"command": "python",
"args": [
"-m", "grist_mcp_server"
]
}
}
}#### Version Docker
{
"mcpServers": {
"grist-mcp": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"-e", "GRIST_API_KEY=votre_clé_api",
"-e", "GRIST_API_HOST=https://docs.getgrist.com/api",
"mcp/grist-mcp-server"
]
}
}
}Le serveur prend en charge plusieurs modes de transport conformes au standard MCP :
# Mode stdio (par défaut pour Claude)
python -m mcp_server_grist --transport stdio
# Mode HTTP streamable (pour intégration web)
python -m mcp_server_grist --transport streamable-http --host 127.0.0.1 --port 8000 --path /mcp
# Active le mode debug avec logging détaillé
python -m mcp_server_grist --debugOptions:
--transport {stdio,streamable-http,sse}
Type de transport à utiliser
--host HOST Hôte pour les transports HTTP (défaut: 127.0.0.1)
--port PORT Port pour les transports HTTP (défaut: 8000)
--path PATH Chemin pour streamable-http (défaut: /mcp)
--mount-path MOUNT_PATH
Chemin pour SSE (défaut: /sse)
--debug Active le mode debug
--help Affiche l'aidePour les transports HTTP, nous recommandons :
127.0.0.1 (localhost) plutôt que 0.0.0.0 pour limiter l'accès au réseau localvalidate_origin) pour éviter les attaques DNS rebindinglist_organizations : Liste les organisationsdescribe_organization : Obtient des informations détaillées sur une organisationmodify_organization : Modifie une organisationdelete_organization : Supprime une organisationlist_workspaces : Liste les espaces de travail dans une organisationdescribe_workspace : Obtient des informations détaillées sur un espace de travailcreate_workspace : Crée un nouvel espace de travailmodify_workspace : Modifie un espace de travaildelete_workspace : Supprime un espace de travaillist_documents : Liste les documents dans un espace de travaildescribe_document : Obtient des informations détaillées sur un documentcreate_document : Crée un nouveau documentmodify_document : Modifie un documentdelete_document : Supprime un documentmove_document : Déplace un document vers un autre espace de travailforce_reload_document : Force le rechargement d'un documentdelete_document_history : Supprime l'historique d'un documentlist_tables : Liste les tables dans un documentcreate_table : Crée une nouvelle tablemodify_table : Modifie une tablelist_columns : Liste les colonnes dans une tablecreate_column : Crée une nouvelle colonnecreate_column_with_feedback : Crée une colonne avec validation et retour détaillémodify_column : Modifie une colonnedelete_column : Supprime une colonnecreate_column_with_formula_safe : Crée une colonne de formule avec validationget_formula_helpers : Obtient de l'aide pour construire des formulesvalidate_formula : Valide une formule et suggère des correctionsget_table_schema : Obtient le schéma d'une tablelist_records : Liste les enregistrements avec tri et limiteadd_grist_records : Ajoute des enregistrementsadd_grist_records_safe : Ajoute des enregistrements avec validationupdate_grist_records : Met à jour des enregistrementsdelete_grist_records : Supprime des enregistrementsfilter_sql_query : Requête SQL optimisée pour le filtrage simpleexecute_sql_query : Requête SQL complexelist_organization_access : Liste les utilisateurs ayant accès à une organisationmodify_organization_access : Modifie l'accès d'un utilisateur à une organisationlist_workspace_access : Liste les utilisateurs ayant accès à un espace de travailmodify_workspace_access : Modifie l'accès d'un utilisateur à un espace de travaillist_document_access : Liste les utilisateurs ayant accès à un documentmodify_document_access : Modifie l'accès d'un utilisateur à un documentdownload_document_sqlite : Télécharge un document au format SQLitedownload_document_excel : Télécharge un document au format Exceldownload_table_csv : Télécharge une table au format CSVlist_attachments : Liste les pièces jointes dans un documentget_attachment_info : Obtient des informations sur une pièce jointedownload_attachment : Télécharge une pièce jointeupload_attachment : Téléverse une pièce jointelist_webhooks : Liste les webhooks d'un documentcreate_webhook : Crée un webhookmodify_webhook : Modifie un webhookdelete_webhook : Supprime un webhookclear_webhook_queue : Vide la file d'attente des webhooks# Liste des organisations
orgs = await list_organizations()
# Liste des espaces de travail
workspaces = await list_workspaces(org_id=1)
# Liste des documents
docs = await list_documents(workspace_id=1)
# Liste des tables
tables = await list_tables(doc_id="abc123")
# Liste des colonnes
columns = await list_columns(doc_id="abc123", table_id="Table1")
# Liste des enregistrements avec tri et limite
records = await list_records(
doc_id="abc123",
table_id="Table1",
sort="name",
limit=10
)
# Filtrage simple avec filter_sql_query
filtered_records = await filter_sql_query(
doc_id="abc123",
table_id="Table1",
columns=["name", "age", "status"],
where_conditions={
"organisation": "OPSIA",
"status": "actif"
},
order_by="name",
limit=10
)
# Requête SQL complexe avec execute_sql_query
sql_result = await execute_sql_query(
doc_id="abc123",
sql_query="""
SELECT t1.name, t1.age, t2.department
FROM Table1 t1
JOIN Table2 t2 ON t1.id = t2.employee_id
WHERE t1.status = ? AND t1.age > ?
ORDER BY t1.name
LIMIT ?
""",
parameters=["actif", 25, 10],
timeout_ms=2000
)
# Ajout d'enregistrements
new_records = await add_grist_records(
doc_id="abc123",
table_id="Table1",
records=[{"name": "John", "age": 30}]
)
# Mise à jour d'enregistrements
updated_records = await update_grist_records(
doc_id="abc123",
table_id="Table1",
records=[{"id": 1, "name": "John", "age": 31}]
)
# Création d'une colonne de formule avec validation
formula_column = await create_column_with_formula_safe(
doc_id="abc123",
table_id="Table1",
column_label="Total",
formula="$Prix * $Quantité",
column_type="Numeric"
)
# Téléchargement d'un document au format Excel
excel_doc = await download_document_excel(
doc_id="abc123",
header_format="label"
)
# Gestion des accès
await modify_document_access(
doc_id="abc123",
user_email="[email protected]",
access_level="editors"
)list_organizations, list_workspaces, list_documents, list_tables, list_columnslist_records : Pour obtenir tous les enregistrements d'une tablefilter_sql_query : Pour les filtres simples sur une seule tableexecute_sql_query : Pour les requêtes complexes avec jointures et sous-requêtesadd_grist_records et add_grist_records_safe : Pour ajouter des données avec ou sans validationupdate_grist_records : Pour modifier des enregistrements existantsdelete_grist_records : Pour supprimer des enregistrementsget_formula_helpers : Pour obtenir la syntaxe correcte des références de colonnesvalidate_formula : Pour vérifier et corriger automatiquement les formulescreate_column_with_formula_safe : Pour créer des colonnes calculées sécuriséesdownload_document_sqlite, download_document_excel, download_table_csv : Pour exporter les donnéesdownload_attachment : Pour récupérer les fichiers attachéslist_*_access et modify_*_access : Pour administrer les permissions utilisateurscreate_webhook, modify_webhook : Pour connecter Grist à d'autres servicesLe serveur MCP Grist est conçu pour :
Les contributions sont les bienvenues ! Voici comment contribuer :
Ce serveur MCP est sous licence MIT.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.