@enokdev/springdocs-mcp 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/publish.yml +64 -0
- package/CHANGELOG.md +82 -0
- package/CONTRIBUTING.md +215 -0
- package/DEPLOYMENT.md +205 -0
- package/EXAMPLES.md +186 -0
- package/INSTALL.md +123 -0
- package/LICENSE +21 -0
- package/PUBLICATION_ENOKDEV.md +170 -0
- package/PUBLISHING.md +196 -0
- package/README.md +219 -0
- package/README_ENOKDEV.md +108 -0
- package/RELEASE_NOTES_v1.1.0.md +106 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +232 -0
- package/build/index.js.map +1 -0
- package/build/services/springboot-docs.d.ts +65 -0
- package/build/services/springboot-docs.d.ts.map +1 -0
- package/build/services/springboot-docs.js +549 -0
- package/build/services/springboot-docs.js.map +1 -0
- package/build/tools/index.d.ts +185 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +144 -0
- package/build/tools/index.js.map +1 -0
- package/claude_desktop_config.json +8 -0
- package/docs/index.html +147 -0
- package/guid.md +92 -0
- package/package.json +58 -0
- package/publish.sh +130 -0
- package/src/index.ts +287 -0
- package/src/services/springboot-docs.ts +615 -0
- package/src/tools/index.ts +144 -0
- package/test.sh +64 -0
- package/tsconfig.json +24 -0
package/README.md
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# 📚 Spring Documentation MCP Server
|
|
2
|
+
|
|
3
|
+
[](https://badge.fury.io/js/@enokdev%2Fspringdocs-mcp)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://nodejs.org/)
|
|
6
|
+
[](https://github.com/tky0065/springdocs-mcp)
|
|
7
|
+
|
|
8
|
+
Un serveur **Model Context Protocol (MCP)** public qui donne accès à toute la documentation Spring Boot et l'écosystème Spring complet directement dans Claude Desktop.
|
|
9
|
+
|
|
10
|
+
## 🚀 Installation rapide
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install -g @enokdev/springdocs-mcp
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Puis ajoutez à votre `claude_desktop_config.json` :
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"mcpServers": {
|
|
20
|
+
"spring-docs": {
|
|
21
|
+
"command": "springdocs-mcp"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## ✨ Fonctionnalités
|
|
28
|
+
|
|
29
|
+
- 🌐 **Accès complet** à spring.io/projects (tous les projets Spring)
|
|
30
|
+
- 📖 **Guides pratiques** spring.io/guides avec filtrage
|
|
31
|
+
- 📚 **Documentation de référence** docs.spring.io
|
|
32
|
+
- � **Recherche intelligente** dans tout l'écosystème Spring
|
|
33
|
+
- 💡 **Base de connaissances** intégrée des concepts Spring Boot
|
|
34
|
+
- ⚡ **7 outils MCP** pour une exploration complète
|
|
35
|
+
|
|
36
|
+
## 🛠️ Utilisation
|
|
37
|
+
|
|
38
|
+
### Démarrage du serveur
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm start
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
ou
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
node build/index.js
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## 🛠️ Outils disponibles
|
|
51
|
+
|
|
52
|
+
Le serveur MCP propose **7 outils** pour explorer la documentation Spring :
|
|
53
|
+
|
|
54
|
+
### 1. `search_spring_docs`
|
|
55
|
+
Recherche dans la documentation Spring Boot avec des mots-clés.
|
|
56
|
+
|
|
57
|
+
**Paramètres :**
|
|
58
|
+
- `query` (string, requis) : Mots-clés à rechercher
|
|
59
|
+
- `docType` (string, optionnel) : Type de documentation (`guides`, `reference`, `api`, `all`)
|
|
60
|
+
- `limit` (number, optionnel) : Nombre maximum de résultats (défaut: 10)
|
|
61
|
+
|
|
62
|
+
### 2. `search_spring_projects`
|
|
63
|
+
Recherche parmi tous les projets Spring disponibles sur spring.io/projects.
|
|
64
|
+
|
|
65
|
+
**Paramètres :**
|
|
66
|
+
- `query` (string, requis) : Mots-clés à rechercher dans les projets Spring
|
|
67
|
+
- `limit` (number, optionnel) : Nombre maximum de projets à retourner (défaut: 10)
|
|
68
|
+
|
|
69
|
+
### 3. `get_spring_project`
|
|
70
|
+
Récupère les détails complets d'un projet Spring spécifique.
|
|
71
|
+
|
|
72
|
+
**Paramètres :**
|
|
73
|
+
- `projectName` (string, requis) : Nom du projet Spring (ex: `spring-boot`, `spring-security`)
|
|
74
|
+
|
|
75
|
+
### 4. `get_all_spring_guides`
|
|
76
|
+
Récupère la liste de tous les guides Spring disponibles, optionnellement filtrés par catégorie.
|
|
77
|
+
|
|
78
|
+
**Paramètres :**
|
|
79
|
+
- `category` (string, optionnel) : Catégorie de guides à filtrer
|
|
80
|
+
- `limit` (number, optionnel) : Nombre maximum de guides (défaut: 20)
|
|
81
|
+
|
|
82
|
+
### 5. `get_spring_guide`
|
|
83
|
+
Récupère le contenu complet d'un guide Spring Boot spécifique.
|
|
84
|
+
|
|
85
|
+
**Paramètres :**
|
|
86
|
+
- `guideId` (string, requis) : Identifiant du guide (ex: `gs-rest-service`)
|
|
87
|
+
|
|
88
|
+
### 6. `get_spring_reference`
|
|
89
|
+
Récupère une section spécifique de la documentation de référence Spring Boot.
|
|
90
|
+
|
|
91
|
+
**Paramètres :**
|
|
92
|
+
- `section` (string, requis) : Section de la documentation (ex: `web`, `data`, `security`)
|
|
93
|
+
- `subsection` (string, optionnel) : Sous-section pour une recherche plus précise
|
|
94
|
+
|
|
95
|
+
### 7. `search_spring_concepts`
|
|
96
|
+
Recherche des concepts Spring Boot par catégorie avec explications détaillées.
|
|
97
|
+
|
|
98
|
+
**Paramètres :**
|
|
99
|
+
- `concept` (string, requis) : Concept à rechercher (ex: `auto-configuration`)
|
|
100
|
+
- `category` (string, optionnel) : Catégorie (`core`, `web`, `data`, `security`, `testing`, `production`)
|
|
101
|
+
|
|
102
|
+
## � Sources de documentation
|
|
103
|
+
|
|
104
|
+
Ce serveur MCP accède aux sources de documentation Spring suivantes :
|
|
105
|
+
|
|
106
|
+
- **🌟 [spring.io/projects](https://spring.io/projects)** - Tous les projets Spring (Boot, Security, Data, Cloud, etc.)
|
|
107
|
+
- **📖 [spring.io/guides](https://spring.io/guides)** - Guides pratiques et tutoriels
|
|
108
|
+
- **📚 [docs.spring.io](https://docs.spring.io)** - Documentation de référence officielle
|
|
109
|
+
- **🔧 API Documentation** - Documentation des classes et méthodes
|
|
110
|
+
- **💡 Base de connaissances intégrée** - Concepts et bonnes pratiques Spring Boot
|
|
111
|
+
|
|
112
|
+
## �🔧 Configuration avec Claude Desktop
|
|
113
|
+
|
|
114
|
+
Pour utiliser ce serveur avec Claude Desktop, ajoutez la configuration suivante dans votre fichier `claude_desktop_config.json` :
|
|
115
|
+
|
|
116
|
+
```json
|
|
117
|
+
{
|
|
118
|
+
"mcpServers": {
|
|
119
|
+
"springboot-docs": {
|
|
120
|
+
"command": "node",
|
|
121
|
+
"args": ["/chemin/absolu/vers/springdocsmcp/build/index.js"]
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Localisation du fichier de configuration
|
|
128
|
+
|
|
129
|
+
- **macOS** : `~/Library/Application Support/Claude/claude_desktop_config.json`
|
|
130
|
+
- **Windows** : `%APPDATA%\\Claude\\claude_desktop_config.json`
|
|
131
|
+
|
|
132
|
+
## 📚 Exemples d'utilisation
|
|
133
|
+
|
|
134
|
+
### Recherche générale
|
|
135
|
+
```
|
|
136
|
+
Recherche "REST API" dans la documentation Spring Boot
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Recherche de projets Spring
|
|
140
|
+
```
|
|
141
|
+
Trouve des projets Spring liés à "security"
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Détails d'un projet spécifique
|
|
145
|
+
```
|
|
146
|
+
Montre-moi les détails du projet "spring-boot"
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Liste des guides par catégorie
|
|
150
|
+
```
|
|
151
|
+
Quels sont les guides Spring pour la catégorie "Web" ?
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Récupération d'un guide spécifique
|
|
155
|
+
```
|
|
156
|
+
Récupère le guide "gs-rest-service"
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Exploration des concepts
|
|
160
|
+
```
|
|
161
|
+
Explique le concept "auto-configuration" dans Spring Boot
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## 🏗️ Architecture
|
|
165
|
+
|
|
166
|
+
Le projet est organisé comme suit :
|
|
167
|
+
|
|
168
|
+
```
|
|
169
|
+
src/
|
|
170
|
+
├── index.ts # Point d'entrée principal
|
|
171
|
+
├── services/
|
|
172
|
+
│ └── springboot-docs.ts # Service de récupération de documentation
|
|
173
|
+
└── tools/
|
|
174
|
+
└── index.ts # Définitions des outils MCP
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Composants principaux
|
|
178
|
+
|
|
179
|
+
- **SpringBootMCPServer** : Serveur MCP principal qui gère les requêtes
|
|
180
|
+
- **SpringBootDocsService** : Service pour récupérer et traiter la documentation
|
|
181
|
+
- **ToolDefinitions** : Définitions des outils exposés via MCP
|
|
182
|
+
|
|
183
|
+
## 🔒 Sécurité
|
|
184
|
+
|
|
185
|
+
- Le serveur accède uniquement aux ressources publiques de `docs.spring.io`
|
|
186
|
+
- Aucune donnée sensible n'est stockée ou transmise
|
|
187
|
+
- Toutes les requêtes HTTP sont en lecture seule
|
|
188
|
+
|
|
189
|
+
## 🐛 Dépannage
|
|
190
|
+
|
|
191
|
+
### Erreurs courantes
|
|
192
|
+
|
|
193
|
+
1. **"Cannot find module"** : Vérifiez que `npm install` a été exécuté
|
|
194
|
+
2. **"Serveur non démarré"** : Vérifiez que la compilation avec `npm run build` s'est bien passée
|
|
195
|
+
3. **"Documentation non trouvée"** : Vérifiez votre connexion internet
|
|
196
|
+
|
|
197
|
+
### Logs
|
|
198
|
+
|
|
199
|
+
Le serveur écrit ses logs sur `stderr` pour éviter d'interférer avec le protocole MCP sur `stdout`.
|
|
200
|
+
|
|
201
|
+
## 🤝 Contribution
|
|
202
|
+
|
|
203
|
+
Les contributions sont les bienvenues ! N'hésitez pas à :
|
|
204
|
+
|
|
205
|
+
1. Forker le projet
|
|
206
|
+
2. Créer une branche pour votre fonctionnalité
|
|
207
|
+
3. Commiter vos changements
|
|
208
|
+
4. Pousser vers la branche
|
|
209
|
+
5. Ouvrir une Pull Request
|
|
210
|
+
|
|
211
|
+
## 📄 Licence
|
|
212
|
+
|
|
213
|
+
Ce projet est sous licence MIT. Voir le fichier `LICENSE` pour plus de détails.
|
|
214
|
+
|
|
215
|
+
## 🔗 Ressources utiles
|
|
216
|
+
|
|
217
|
+
- [Documentation Spring Boot](https://docs.spring.io/spring-boot/docs/current/reference/html/)
|
|
218
|
+
- [Model Context Protocol](https://modelcontextprotocol.io/)
|
|
219
|
+
- [SDK MCP TypeScript](https://github.com/modelcontextprotocol/typescript-sdk)
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# 🎯 Publication rapide - Instructions pour EnokDev
|
|
2
|
+
|
|
3
|
+
## ✅ Tout est prêt !
|
|
4
|
+
|
|
5
|
+
Votre serveur MCP Spring Documentation est configuré et prêt pour la publication publique avec vos informations :
|
|
6
|
+
|
|
7
|
+
- **npm**: `@enokdev/springdocs-mcp`
|
|
8
|
+
- **GitHub**: `tky0065/springdocs-mcp`
|
|
9
|
+
- **Commande**: `springdocs-mcp`
|
|
10
|
+
|
|
11
|
+
## 🚀 Publication en 3 étapes
|
|
12
|
+
|
|
13
|
+
### 1. Créer le repository GitHub
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
# Aller sur GitHub et créer un nouveau repository public:
|
|
17
|
+
# Nom: springdocs-mcp
|
|
18
|
+
# Description: Spring Documentation MCP Server for Claude Desktop - Access the complete Spring ecosystem in Claude
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 2. Connecter et publier
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Dans votre terminal
|
|
25
|
+
cd /Users/yacoubakone/Documents/dev/springdocsmcp
|
|
26
|
+
|
|
27
|
+
# Script automatique de publication
|
|
28
|
+
./publish.sh
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Ou manuellement :**
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Connecter le repository
|
|
35
|
+
git remote add origin https://github.com/tky0065/springdocs-mcp.git
|
|
36
|
+
git add .
|
|
37
|
+
git commit -m "Initial release v1.1.0"
|
|
38
|
+
git push -u origin main
|
|
39
|
+
|
|
40
|
+
# Se connecter à npm
|
|
41
|
+
npm login # avec votre compte enokdev
|
|
42
|
+
|
|
43
|
+
# Publier
|
|
44
|
+
npm publish --access public
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### 3. Créer une release
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
git tag v1.1.0
|
|
51
|
+
git push origin v1.1.0
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 📦 Après publication
|
|
55
|
+
|
|
56
|
+
### Les utilisateurs pourront installer avec :
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npm install -g @enokdev/springdocs-mcp
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Configuration Claude Desktop :
|
|
63
|
+
|
|
64
|
+
```json
|
|
65
|
+
{
|
|
66
|
+
"mcpServers": {
|
|
67
|
+
"spring-docs": {
|
|
68
|
+
"command": "springdocs-mcp"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 🌟 Liens de votre package
|
|
75
|
+
|
|
76
|
+
- **npm package**: https://www.npmjs.com/package/@enokdev/springdocs-mcp
|
|
77
|
+
- **GitHub repo**: https://github.com/tky0065/springdocs-mcp
|
|
78
|
+
- **Documentation**: https://tky0065.github.io/springdocs-mcp (après publication)
|
|
79
|
+
- **Stats**: https://npm-stat.com/charts.html?package=@enokdev/springdocs-mcp
|
|
80
|
+
|
|
81
|
+
## 📱 Message de lancement suggéré
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
🚀 Nouveau: @enokdev/springdocs-mcp
|
|
85
|
+
|
|
86
|
+
Un serveur MCP qui donne accès à TOUTE la documentation Spring directement dans Claude Desktop !
|
|
87
|
+
|
|
88
|
+
✨ 7 outils MCP
|
|
89
|
+
📚 Spring Boot + Security + Data + Cloud + tous les projets
|
|
90
|
+
🔍 Recherche intelligente
|
|
91
|
+
⚡ Installation: npm install -g @enokdev/springdocs-mcp
|
|
92
|
+
|
|
93
|
+
Perfect pour les développeurs Spring utilisant Claude !
|
|
94
|
+
|
|
95
|
+
#SpringBoot #Claude #MCP #OpenSource
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## 🔧 Maintenance
|
|
99
|
+
|
|
100
|
+
Pour publier des mises à jour :
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
./publish.sh # Script automatique
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
**🎉 Votre outil va aider toute la communauté des développeurs Spring !**
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# 🎉 Spring Boot MCP Server v1.1.0 - Mise à jour majeure
|
|
2
|
+
|
|
3
|
+
## 🚀 Améliorations apportées
|
|
4
|
+
|
|
5
|
+
Votre serveur MCP Spring Boot Documentation a été considérablement amélioré ! Voici ce qui a été ajouté :
|
|
6
|
+
|
|
7
|
+
### ✨ Nouvelles fonctionnalités principales
|
|
8
|
+
|
|
9
|
+
#### 1. **Support complet de l'écosystème Spring**
|
|
10
|
+
- ✅ Accès à **spring.io/projects** - Tous les projets Spring (Security, Data, Cloud, etc.)
|
|
11
|
+
- ✅ Extension de **spring.io/guides** - Catalogue complet des guides
|
|
12
|
+
- ✅ Intégration enrichie avec la documentation officielle
|
|
13
|
+
|
|
14
|
+
#### 2. **3 nouveaux outils MCP** (Total : 7 outils)
|
|
15
|
+
- 🆕 **`search_spring_projects`** - Recherche parmi tous les projets Spring
|
|
16
|
+
- 🆕 **`get_spring_project`** - Détails complets d'un projet Spring
|
|
17
|
+
- 🆕 **`get_all_spring_guides`** - Liste de tous les guides avec filtrage
|
|
18
|
+
|
|
19
|
+
#### 3. **Base de connaissances étendue**
|
|
20
|
+
- 📚 Projets Spring populaires intégrés (fallback robuste)
|
|
21
|
+
- 🔍 Guides Spring organisés par catégories
|
|
22
|
+
- 🎯 Recherche intelligente avec mécanismes de secours
|
|
23
|
+
|
|
24
|
+
## 🛠️ Outils disponibles (7 au total)
|
|
25
|
+
|
|
26
|
+
| Outil | Description | Nouveau |
|
|
27
|
+
|-------|-------------|---------|
|
|
28
|
+
| `search_spring_docs` | Recherche dans la documentation Spring Boot | ⭐ |
|
|
29
|
+
| `search_spring_projects` | **Recherche de projets Spring** | 🆕 |
|
|
30
|
+
| `get_spring_project` | **Détails d'un projet Spring** | 🆕 |
|
|
31
|
+
| `get_all_spring_guides` | **Liste des guides Spring** | 🆕 |
|
|
32
|
+
| `get_spring_guide` | Contenu d'un guide spécifique | ⭐ |
|
|
33
|
+
| `get_spring_reference` | Documentation de référence | ⭐ |
|
|
34
|
+
| `search_spring_concepts` | Recherche de concepts Spring Boot | ⭐ |
|
|
35
|
+
|
|
36
|
+
## 📋 Tests rapides
|
|
37
|
+
|
|
38
|
+
Testez les nouvelles fonctionnalités avec ces exemples :
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# Test des nouveaux outils
|
|
42
|
+
./test.sh
|
|
43
|
+
|
|
44
|
+
# Ou individuellement :
|
|
45
|
+
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "search_spring_projects", "arguments": {"query": "security"}}}' | node build/index.js
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 🔧 Configuration Claude Desktop
|
|
49
|
+
|
|
50
|
+
Votre configuration reste la même dans `claude_desktop_config.json` :
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"mcpServers": {
|
|
55
|
+
"springboot-docs": {
|
|
56
|
+
"command": "node",
|
|
57
|
+
"args": ["/Users/yacoubakone/Documents/dev/springdocsmcp/build/index.js"]
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 📚 Documentation mise à jour
|
|
64
|
+
|
|
65
|
+
- ✅ **README.md** - Documentation principale mise à jour
|
|
66
|
+
- ✅ **EXAMPLES.md** - Guide d'exemples pratiques
|
|
67
|
+
- ✅ **CONTRIBUTING.md** - Guide pour les développeurs
|
|
68
|
+
- ✅ **CHANGELOG.md** - Historique des versions
|
|
69
|
+
- ✅ **test.sh** - Script de test étendu
|
|
70
|
+
|
|
71
|
+
## 🌟 Exemples d'utilisation avec Claude
|
|
72
|
+
|
|
73
|
+
Maintenant vous pouvez demander à Claude :
|
|
74
|
+
|
|
75
|
+
### Découverte de projets
|
|
76
|
+
> "Quels sont les projets Spring disponibles pour la sécurité ?"
|
|
77
|
+
|
|
78
|
+
### Exploration de l'écosystème
|
|
79
|
+
> "Montre-moi tous les projets Spring liés aux données"
|
|
80
|
+
|
|
81
|
+
### Guides spécialisés
|
|
82
|
+
> "Quels sont les guides Spring Boot pour le développement web ?"
|
|
83
|
+
|
|
84
|
+
### Détails de projets
|
|
85
|
+
> "Peux-tu m'expliquer le projet Spring Cloud ?"
|
|
86
|
+
|
|
87
|
+
## 🎯 Couverture documentaire
|
|
88
|
+
|
|
89
|
+
Votre serveur MCP accède maintenant à :
|
|
90
|
+
|
|
91
|
+
- 🌐 **Tous les projets Spring** (Boot, Security, Data, Cloud, Integration, etc.)
|
|
92
|
+
- 📖 **Guides complets** avec filtrage par catégorie
|
|
93
|
+
- 📚 **Documentation de référence** Spring Boot
|
|
94
|
+
- 🔧 **API Documentation**
|
|
95
|
+
- 💡 **Base de connaissances** enrichie
|
|
96
|
+
|
|
97
|
+
## ✅ État du projet
|
|
98
|
+
|
|
99
|
+
- ✅ **Compilation réussie** (version 1.1.0)
|
|
100
|
+
- ✅ **Tests passés** (7 outils fonctionnels)
|
|
101
|
+
- ✅ **Documentation complète**
|
|
102
|
+
- ✅ **Prêt pour la production**
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
🎉 **Votre serveur MCP Spring Boot Documentation est maintenant un outil complet pour explorer tout l'écosystème Spring !**
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { SpringBootDocsService } from "./services/springboot-docs.js";
|
|
6
|
+
import { ToolDefinitions } from "./tools/index.js";
|
|
7
|
+
/**
|
|
8
|
+
* Serveur MCP pour accéder à la documentation Spring Boot
|
|
9
|
+
*/
|
|
10
|
+
class SpringBootMCPServer {
|
|
11
|
+
server;
|
|
12
|
+
docsService;
|
|
13
|
+
constructor() {
|
|
14
|
+
this.server = new Server({
|
|
15
|
+
name: "springboot-mcp-server",
|
|
16
|
+
version: "1.1.0",
|
|
17
|
+
}, {
|
|
18
|
+
capabilities: {
|
|
19
|
+
tools: {},
|
|
20
|
+
},
|
|
21
|
+
});
|
|
22
|
+
this.docsService = new SpringBootDocsService();
|
|
23
|
+
this.setupToolHandlers();
|
|
24
|
+
}
|
|
25
|
+
setupToolHandlers() {
|
|
26
|
+
// Gestionnaire pour lister les outils disponibles
|
|
27
|
+
this.server.setRequestHandler(ListToolsRequestSchema, async (request) => {
|
|
28
|
+
return {
|
|
29
|
+
tools: ToolDefinitions.getToolList(),
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
// Gestionnaire pour exécuter un outil
|
|
33
|
+
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
34
|
+
const { name, arguments: args } = request.params;
|
|
35
|
+
try {
|
|
36
|
+
switch (name) {
|
|
37
|
+
case "search_spring_docs":
|
|
38
|
+
return await this.handleSearchDocs(args);
|
|
39
|
+
case "search_spring_projects":
|
|
40
|
+
return await this.handleSearchProjects(args);
|
|
41
|
+
case "get_spring_project":
|
|
42
|
+
return await this.handleGetProject(args);
|
|
43
|
+
case "get_all_spring_guides":
|
|
44
|
+
return await this.handleGetAllGuides(args);
|
|
45
|
+
case "get_spring_guide":
|
|
46
|
+
return await this.handleGetGuide(args);
|
|
47
|
+
case "get_spring_reference":
|
|
48
|
+
return await this.handleGetReference(args);
|
|
49
|
+
case "search_spring_concepts":
|
|
50
|
+
return await this.handleSearchConcepts(args);
|
|
51
|
+
default:
|
|
52
|
+
throw new Error(`Outil inconnu: ${name}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const errorMessage = error instanceof Error ? error.message : "Erreur inconnue";
|
|
57
|
+
return {
|
|
58
|
+
content: [
|
|
59
|
+
{
|
|
60
|
+
type: "text",
|
|
61
|
+
text: `Erreur lors de l'exécution de l'outil ${name}: ${errorMessage}`,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
isError: true,
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async handleSearchProjects(args) {
|
|
70
|
+
const { query, limit = 10 } = args;
|
|
71
|
+
if (!query || typeof query !== "string") {
|
|
72
|
+
throw new Error("Le paramètre 'query' est requis et doit être une chaîne de caractères");
|
|
73
|
+
}
|
|
74
|
+
const results = await this.docsService.searchSpringProjects(query, limit);
|
|
75
|
+
return {
|
|
76
|
+
content: [
|
|
77
|
+
{
|
|
78
|
+
type: "text",
|
|
79
|
+
text: `Projets Spring trouvés pour "${query}":\n\n${this.formatSearchResults(results)}`,
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async handleGetProject(args) {
|
|
85
|
+
const { projectName } = args;
|
|
86
|
+
if (!projectName || typeof projectName !== "string") {
|
|
87
|
+
throw new Error("Le paramètre 'projectName' est requis et doit être une chaîne de caractères");
|
|
88
|
+
}
|
|
89
|
+
const project = await this.docsService.getSpringProject(projectName);
|
|
90
|
+
return {
|
|
91
|
+
content: [
|
|
92
|
+
{
|
|
93
|
+
type: "text",
|
|
94
|
+
text: project,
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
async handleGetAllGuides(args) {
|
|
100
|
+
const { category, limit = 20 } = args;
|
|
101
|
+
const results = await this.docsService.getAllSpringGuides(category, limit);
|
|
102
|
+
return {
|
|
103
|
+
content: [
|
|
104
|
+
{
|
|
105
|
+
type: "text",
|
|
106
|
+
text: `Guides Spring disponibles${category ? ` dans la catégorie "${category}"` : ""}:\n\n${this.formatSearchResults(results)}`,
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async handleSearchDocs(args) {
|
|
112
|
+
const { query, docType = "all", limit = 10 } = args;
|
|
113
|
+
if (!query || typeof query !== "string") {
|
|
114
|
+
throw new Error("Le paramètre 'query' est requis et doit être une chaîne de caractères");
|
|
115
|
+
}
|
|
116
|
+
const results = await this.docsService.searchDocumentation(query, docType, limit);
|
|
117
|
+
return {
|
|
118
|
+
content: [
|
|
119
|
+
{
|
|
120
|
+
type: "text",
|
|
121
|
+
text: `Résultats de recherche pour "${query}":\n\n${this.formatSearchResults(results)}`,
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
async handleGetGuide(args) {
|
|
127
|
+
const { guideId } = args;
|
|
128
|
+
if (!guideId || typeof guideId !== "string") {
|
|
129
|
+
throw new Error("Le paramètre 'guideId' est requis et doit être une chaîne de caractères");
|
|
130
|
+
}
|
|
131
|
+
const guide = await this.docsService.getGuide(guideId);
|
|
132
|
+
return {
|
|
133
|
+
content: [
|
|
134
|
+
{
|
|
135
|
+
type: "text",
|
|
136
|
+
text: guide,
|
|
137
|
+
},
|
|
138
|
+
],
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
async handleGetReference(args) {
|
|
142
|
+
const { section, subsection } = args;
|
|
143
|
+
if (!section || typeof section !== "string") {
|
|
144
|
+
throw new Error("Le paramètre 'section' est requis et doit être une chaîne de caractères");
|
|
145
|
+
}
|
|
146
|
+
const reference = await this.docsService.getReference(section, subsection);
|
|
147
|
+
return {
|
|
148
|
+
content: [
|
|
149
|
+
{
|
|
150
|
+
type: "text",
|
|
151
|
+
text: reference,
|
|
152
|
+
},
|
|
153
|
+
],
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
async handleSearchConcepts(args) {
|
|
157
|
+
const { concept, category } = args;
|
|
158
|
+
if (!concept || typeof concept !== "string") {
|
|
159
|
+
throw new Error("Le paramètre 'concept' est requis et doit être une chaîne de caractères");
|
|
160
|
+
}
|
|
161
|
+
const results = await this.docsService.searchConcepts(concept, category);
|
|
162
|
+
return {
|
|
163
|
+
content: [
|
|
164
|
+
{
|
|
165
|
+
type: "text",
|
|
166
|
+
text: this.formatConceptResults(results),
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
formatSearchResults(results) {
|
|
172
|
+
if (results.length === 0) {
|
|
173
|
+
return "Aucun résultat trouvé.";
|
|
174
|
+
}
|
|
175
|
+
return results
|
|
176
|
+
.map((result, index) => {
|
|
177
|
+
return `${index + 1}. **${result.title}**
|
|
178
|
+
Type: ${result.type}
|
|
179
|
+
URL: ${result.url}
|
|
180
|
+
Description: ${result.description || "Aucune description disponible"}
|
|
181
|
+
|
|
182
|
+
`;
|
|
183
|
+
})
|
|
184
|
+
.join("\n");
|
|
185
|
+
}
|
|
186
|
+
formatConceptResults(results) {
|
|
187
|
+
if (!results || Object.keys(results).length === 0) {
|
|
188
|
+
return "Aucun concept trouvé.";
|
|
189
|
+
}
|
|
190
|
+
let formatted = `# Concepts Spring Boot\n\n`;
|
|
191
|
+
for (const [category, concepts] of Object.entries(results)) {
|
|
192
|
+
formatted += `## ${category}\n\n`;
|
|
193
|
+
if (Array.isArray(concepts)) {
|
|
194
|
+
concepts.forEach((concept) => {
|
|
195
|
+
formatted += `- **${concept.name}**: ${concept.description}\n`;
|
|
196
|
+
if (concept.examples && concept.examples.length > 0) {
|
|
197
|
+
formatted += ` Exemples: ${concept.examples.join(", ")}\n`;
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
formatted += "\n";
|
|
202
|
+
}
|
|
203
|
+
return formatted;
|
|
204
|
+
}
|
|
205
|
+
async run() {
|
|
206
|
+
const transport = new StdioServerTransport();
|
|
207
|
+
await this.server.connect(transport);
|
|
208
|
+
console.error("Serveur MCP Spring Boot démarré sur stdio");
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
// Point d'entrée principal
|
|
212
|
+
async function main() {
|
|
213
|
+
const server = new SpringBootMCPServer();
|
|
214
|
+
await server.run();
|
|
215
|
+
}
|
|
216
|
+
// Gestion des erreurs
|
|
217
|
+
process.on("SIGINT", async () => {
|
|
218
|
+
console.error("Arrêt du serveur...");
|
|
219
|
+
process.exit(0);
|
|
220
|
+
});
|
|
221
|
+
process.on("unhandledRejection", (reason, promise) => {
|
|
222
|
+
console.error("Rejet de promesse non géré:", reason);
|
|
223
|
+
process.exit(1);
|
|
224
|
+
});
|
|
225
|
+
// Démarrage du serveur
|
|
226
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
227
|
+
main().catch((error) => {
|
|
228
|
+
console.error("Erreur fatale:", error);
|
|
229
|
+
process.exit(1);
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|