MCP générique pour HFSQL

4 min de lecture
hfsql ia

Introduction

Dans un récent échange sur LinkedIn, une question simple mais stratégique m’a été posée : « Comment mettre en place un serveur MCP générique capable d’interroger dynamiquement n’importe quelle analyse HFSQL ? » Cet article propose une réponse concrète, réutilisable, et alignée avec les bonnes pratiques de modélisation de données.

L’objectif est de fournir au serveur MCP une fonction unique : getDataBaseModels(). Celle-ci expose la structure complète d’une analyse HFSQL – fichiers, rubriques, index, et relations – sous forme d’un modèle JSON. Ce modèle, auto-généré et auto-décrit, permet à un agent intelligent de déterminer quelles entités interroger et comment les relier selon les besoins exprimés par l’utilisateur.


Découverte du contenu d’une analyse HFSQL

1. Les fonctions Windev

Windev fournit toutes les fonctions nécessaires pour « découvrir » le contenu d’une analyse :

  • HListeFichier : pour obtenir la liste des tables de l’analyse.
  • HListeRubrique : extrait les colonnes (ou champs) d’une table.
  • HListeClé : liste les clés d’indexage définies.
  • HListeLiaison : liste les liaisons entre champs avec les cardinalités.

2. Définir des structures standardisées pour le MCP

Pour rendre l’analyse exploitable par le serveur MCP, il est indispensable de structurer les informations extraites sous une forme cohérente, claire et standardisée. Cela garantit une lisibilité optimale pour toute consommation automatisée, notamment par une IA.

Les quatre structures suivantes servent de socle au modèle retourné :

STR_Relationship est une Structure
	name		est une chaîne
	table1 		est une chaîne
	column1		est une chaîne
	cardinality1	est une chaîne
	table2		est une chaîne
	column2		est une chaîne
	cardinality2	est une chaîne
FIN

STR_Indexes est une Structure
	name		est une chaîne
	description	est une chaîne
	type		est une chaîne
	unicity		est une chaîne
	keycomponent	est une chaîne
FIN

STR_Columns est une Structure
	name		est une chaîne
	description	est une chaîne
	datatype	est une chaîne
FIN

STR_Table est une Structure
	table 		est une chaîne
	description 	est une chaîne
	columns    	est un tableau de STR_Columns
	indexes		est un tableau dynamique de STR_Indexes
	relationships 	est un tableau de STR_Relationship
FIN

Cette structuration permet de passer d’un modèle relationnel natif HFSQL à un modèle de données sémantique exploitable directement par un moteur d’IA. Elle prépare également la sérialisation JSON de ces données pour exposition via API.

3. La fonction getDataBaseModels()

L’API du serveur MCP expose la fonction getDataBaseModels() qui retourne un objet JSON décrivant l’ensemble des entités de l’analyse HFSQL : fichiers, rubriques, clés, et relations.

Voici une version complète de la procédure :

PROCÉDURE getDataBaseModels()
jsModel est un Buffer

sListeFichier	est une chaîne
sListeRubrique	est une chaîne
sListeClé		est une chaîne
sListeLiaison	est une chaîne

model est un tableau dynamique de STR_Table

sListeFichier = HListeFichier(hLstDétail + hLstTout)

POUR TOUTE CHAÎNE sNomFichier DE sListeFichier SÉPARÉE PAR RC
	uneTable est un STR_Table
	uneTable.table = ExtraitChaîne(sNomFichier,1,TAB)
	uneTable.description = ExtraitChaîne(sNomFichier,2,TAB)

	sListeRubrique = HListeRubrique(uneTable.table, hLstDétailPlus)
	sListeClé = HListeClé(uneTable.table, hLstDétailPlus)
	sListeLiaison = HListeLiaison(uneTable.table,hLstDétail)

	POUR TOUTE CHAÎNE sRubrique DE sListeRubrique SÉPARÉE PAR RC
		uneRubrique est un STR_Columns
		uneRubrique.name = ExtraitChaîne(sRubrique,1,TAB)
		uneRubrique.description = ExtraitChaîne(sRubrique,6,TAB)
		uneRubrique.sdatatype = ExtraitChaîne(sRubrique,2,TAB)
		TableauAjoute(uneTable.columns, uneRubrique)
	FIN

	POUR TOUTE CHAÎNE sClé DE sListeClé SÉPARÉE PAR RC
		unIndex est une STR_Indexes
		unIndex.name = ExtraitChaîne(sClé,1,TAB)
		unIndex.description = ExtraitChaîne(sClé,6,TAB)
		unIndex.type = ExtraitChaîne(sClé,2,TAB)
		unIndex.keycomponent = ExtraitChaîne(sClé,4,TAB)
		SELON ExtraitChaîne(sClé,5,TAB)
			CAS "0" : unIndex.unicity = "primary"
			CAS "1" : unIndex.unicity = "unique"
			CAS "2" : unIndex.unicity = "multiple"
			AUTRE CAS : unIndex.unicity = "unknown"
		FIN
		TableauAjoute(uneTable.indexes,unIndex)
	FIN

	POUR TOUTE CHAÎNE sLiaison DE sListeLiaison SÉPARÉE PAR RC
		uneLiaison est un STR_Relationship
		uneLiaison.name = ExtraitChaîne(sLiaison,1,TAB)
		uneLiaison.table1 = ExtraitChaîne(sLiaison,2,TAB)
		uneLiaison.column1 = ExtraitChaîne(sLiaison,3,TAB)
		uneLiaison.cardinality1 = ExtraitChaîne(sLiaison,4,TAB)
		uneLiaison.table2 = ExtraitChaîne(sLiaison,5,TAB)
		uneLiaison.column2 = ExtraitChaîne(sLiaison,6,TAB)
		uneLiaison.cardinality2 = ExtraitChaîne(sLiaison,7,TAB)
		TableauAjoute(uneTable.relationships,uneLiaison)
	FIN

	model.Ajoute(uneTable)
FIN

Sérialise(model,jsModel,psdJSON)
RENVOYER jsModel

4. Exemple de modèle JSON retourné par le serveur

Le tableau JSON ci-dessous illustre le résultat retourné par la fonction getDataBaseModels() pour une analyse contenant trois fichiers : Client, Ticket et Solution.

Chaque objet JSON correspond à une table. On y retrouve :

  • Les colonnes avec leur nom, type et description.
  • Les index définis sur la table, avec leur unicité.
  • Les relations inter-tables avec les cardinalités dans chaque sens.

Ce modèle devient un véritable dictionnaire de données dynamique utilisable par le serveur MCP. Il autorise :

  • Une navigation transverse entre les entités.
  • Une interprétation automatisée des jointures possibles.
  • Un mapping clair entre un prompt utilisateur (ex : « affiche les tickets récents d’un client ») et les fichiers HFSQL à interroger.

Conclusion

La combinaison des fonctions d’introspection HFSQL et d’une modélisation dynamique standardisée permet de construire un serveur MCP générique, indépendant de toute analyse spécifique. Grâce à la fonction getDataBaseModels(), l’IA dispose d’une source de vérité fiable, contextualisée, et interrogeable automatiquement.

Ce type d’architecture facilite :

la scalabilité vers de multiples analyses HFSQL,

l’automatisation de la génération des requêtes métier,

la réduction des erreurs de jointures ou de navigation dans la base.

Pour une entreprise comme EloNeva, cela signifie des gains concrets en flexibilité, maintenabilité, et vitesse de déploiement de nouveaux cas d’usage basés sur des données Windev.

Liens externes

Documentation officielle PCSoft HFSQL

Exemples d’utilisation de HListeFichier sur le forum PCSoft

Spécification JSON – ECMA International