Aller au contenu principal

CRD ToolSet

La CRD ToolSet génère plusieurs ressources Tool depuis une spécification OpenAPI.

GroupVersionKind​

ChampValeur
Groupgostoa.dev
Versionv1alpha1
KindToolSet

Exemple Complet​

apiVersion: gostoa.dev/v1alpha1
kind: ToolSet
metadata:
name: payment-api-tools
namespace: tenant-acme
spec:
displayName: Tools API Paiement
description: Tools générés depuis la spec OpenAPI de l'API Paiement
openAPISpec:
url: https://api.<YOUR_DOMAIN>/acme/payment-api/v2/openapi.json
refreshInterval: "1h"
baseURL: https://api.<YOUR_DOMAIN>/acme/payment-api/v2
selector:
tags:
- payments
- refunds
excludeTags:
- internal
- deprecated
methods:
- GET
- POST
toolDefaults:
tags:
- generated
- payment-api
timeout: "30s"
rateLimit:
requestsPerMinute: 100
burst: 20
authentication:
type: bearer
secretRef:
name: payment-api-token
key: token
naming:
prefix: "payment_"
useOperationId: true
enabled: true
status:
phase: Ready
toolCount: 12
tools:
- payment_create_payment
- payment_get_payment
- payment_list_payments
- payment_create_refund
lastSyncedAt: "2026-02-06T12:00:00Z"
specHash: "abc123"

Champs Spec​

Champs Obligatoires​

ChampTypeDescription
displayNamestringNom lisible par un humain (1-64 caractères)

Source de la Spec OpenAPI​

Configurer d'où récupérer la spécification OpenAPI :

spec:
openAPISpec:
# Option 1 : URL (recommandé)
url: https://api.example.com/openapi.json
refreshInterval: "1h" # Fréquence de récupération

# Option 2 : ConfigMap
configMapRef:
name: api-spec
key: openapi.yaml

# Option 3 : Secret (pour les specs privées)
secretRef:
name: private-api-spec
key: openapi.json

# Option 4 : Inline (petites specs uniquement)
inline: |
openapi: "3.0.0"
info:
title: Mon API
version: "1.0"
paths: ...

Selector (Filtrer les Opérations)​

Contrôler quelles opérations deviennent des tools :

spec:
selector:
# N'inclure que ces tags
tags:
- public
- v2

# Exclure ces tags
excludeTags:
- internal
- deprecated
- admin

# Limiter les méthodes HTTP
methods:
- GET
- POST

# Filtre par préfixe de chemin
pathPrefix: /api/v2/

# Opérations spécifiques par ID
operationIds:
- createUser
- getUser
- listUsers

Valeurs par Défaut des Tools​

Appliquer des valeurs par défaut à tous les tools générés :

spec:
toolDefaults:
tags:
- generated
timeout: "30s"
rateLimit:
requestsPerMinute: 60
burst: 10
authentication:
type: bearer
secretRef:
name: api-token
key: token

Configuration du Nommage​

Contrôler le nommage des tools :

spec:
naming:
prefix: "myapi_" # Préfixer tous les noms de tools
suffix: "_v2" # Suffixer tous les noms de tools
useOperationId: true # Utiliser l'operationId OpenAPI (recommandé)

Les noms de tools sont générés comme suit : {prefix}{operationId}{suffix}

Exemple : myapi_createPayment_v2

Champs Status​

ChampTypeDescription
phaseenumPending, Syncing, Ready, Error, Disabled
toolCountintegerNombre de tools générés
toolsarrayListe des noms de tools générés
lastSyncedAtdatetimeDernière synchronisation réussie
specHashstringHash de la spec OpenAPI (pour la détection de changements)
lastErrorstringMessage d'erreur le plus récent
conditionsarrayConditions de style Kubernetes

Phases​

PhaseDescription
PendingToolSet créé, en attente de la première synchronisation
SyncingRécupération et traitement de la spec en cours
ReadyTools générés et enregistrés
ErrorÉchec de la synchronisation
DisabledToolSet désactivé manuellement

Comportement de Synchronisation​

  1. Synchronisation initiale — À la création, récupère la spec et génère les tools
  2. Actualisation périodique — Re-récupère à refreshInterval
  3. Détection des changements — Ne régénère que si le hash de la spec change
  4. Incrémental — Ajoute les nouveaux tools, supprime les opérations effacées
  5. Préserve les modifications — Les modifications manuelles des tools sont préservées

Exemples​

Depuis une URL Publique​

apiVersion: gostoa.dev/v1alpha1
kind: ToolSet
metadata:
name: petstore-tools
namespace: tenant-demo
spec:
displayName: API Petstore
openAPISpec:
url: https://petstore3.swagger.io/api/v3/openapi.json
refreshInterval: "24h"
baseURL: https://petstore3.swagger.io/api/v3
selector:
tags:
- pet
- store
enabled: true

Depuis un ConfigMap​

apiVersion: gostoa.dev/v1alpha1
kind: ToolSet
metadata:
name: internal-api-tools
namespace: tenant-corp
spec:
displayName: API Interne
openAPISpec:
configMapRef:
name: internal-api-spec
key: openapi.yaml
baseURL: http://internal-api.corp.svc.cluster.local
toolDefaults:
authentication:
type: none # Service interne, aucune auth requise

Filtré par Méthodes​

apiVersion: gostoa.dev/v1alpha1
kind: ToolSet
metadata:
name: readonly-tools
namespace: tenant-readonly
spec:
displayName: Tools API Lecture Seule
description: Uniquement les opérations GET exposées
openAPISpec:
url: https://api.example.com/openapi.json
selector:
methods:
- GET
toolDefaults:
timeout: "10s"
rateLimit:
requestsPerMinute: 200

Dépannage​

Tools Non Générés​

Vérifier le statut du ToolSet :

kubectl describe toolset my-toolset -n tenant-acme

Problèmes courants :

  • URL de spec OpenAPI invalide
  • Filtres selector trop restrictifs
  • Authentification requise pour l'URL de la spec

Spec Non Actualisée​

Vérifier que refreshInterval est défini et consulter les logs :

kubectl logs -l app=mcp-gateway -n stoa-system | grep toolset

Noms de Tools en Double​

S'assurer que naming.prefix est unique par ToolSet.

Ressources Associées​