Aller au contenu principal

Développement d'Outils MCP

Construisez, testez et déployez des outils MCP sur la plateforme STOA.

Architecture

STOA expose des outils aux agents IA via deux mécanismes :

SourceCas d'UsageFonctionnement
Tool CRDEncapsuler une API REST en outil MCPDéfinir l'endpoint + le schéma en YAML, le gateway l'appelle
ToolSet CRDConnecter un serveur MCP existantLe gateway découvre les outils via SSE/HTTP upstream
API BridgeExposer les APIs Control Plane comme outilsConversion automatique des APIs enregistrées en outils MCP

Référence Tool CRD

Schéma Complet

apiVersion: gostoa.dev/v1alpha1
kind: Tool
metadata:
name: <tool-name> # Minuscules, tirets autorisés
namespace: stoa-system # Doit être dans le namespace gateway
spec:
displayName: <string> # Obligatoire — nom lisible par l'humain
description: <string> # Obligatoire — description pour le contexte LLM
endpoint: <url> # Obligatoire — endpoint HTTP backend
method: <GET|POST|PUT|DELETE|PATCH> # Obligatoire
inputSchema: # Obligatoire — JSON Schema pour les arguments
type: object
properties: { ... }
required: [ ... ]
outputSchema: # Optionnel — JSON Schema pour la réponse
type: object
properties: { ... }
auth: <bearer|service_account|none> # Défaut : none
rateLimit: "<N>/<unit>" # Optionnel — ex. "100/min", "1000/hour"
annotations: # Optionnel — hints MCP 2025-03-26
readOnly: <boolean> # L'outil ne fait que lire des données
destructive: <boolean> # L'outil supprime/modifie de façon irréversible
idempotent: <boolean> # Même appel deux fois = même résultat
openWorld: <boolean> # Interagit avec des systèmes externes

Statut (lecture seule, défini par le gateway)

status:
registered: true # Le gateway a chargé cet outil
lastSeen: "2026-02-13T10:30:00Z"
error: "" # Vide = aucune erreur

Bonnes Pratiques pour les Annotations

Les annotations aident les agents IA à décider quand et comment utiliser les outils en toute sécurité :

Type d'ActionreadOnlydestructiveidempotentopenWorld
Lire/Recherchertruefalsetrueselon cas
Créerfalsefalsefalseselon cas
Mettre à jourfalsefalsetrueselon cas
Supprimerfalsetruefalseselon cas
Appel externeselon casselon casselon castrue
astuce

En cas de doute, définissez openWorld: true — cela signale que l'outil a des effets de bord au-delà du système local. Les agents IA traitent les outils avec openWorld: false comme sûrs à appeler de façon spéculative.

Patterns de Schéma d'Entrée

Paramètre de requête simple

inputSchema:
type: object
properties:
query:
type: string
description: "Search term"
required: [query]

Objet complexe avec validation

inputSchema:
type: object
properties:
customer_id:
type: string
pattern: "^[A-Z]{2}-[0-9]{6}$"
description: "Customer ID (format: XX-000000)"
amount:
type: number
minimum: 0
maximum: 1000000
description: "Transaction amount in EUR"
currency:
type: string
enum: [EUR, USD, GBP]
default: EUR
required: [customer_id, amount]

Objets imbriqués

inputSchema:
type: object
properties:
filters:
type: object
properties:
status:
type: string
enum: [active, suspended, archived]
created_after:
type: string
format: date
description: "Filter criteria"
pagination:
type: object
properties:
page:
type: integer
minimum: 1
default: 1
per_page:
type: integer
minimum: 1
maximum: 100
default: 20

Référence ToolSet CRD

Schéma Complet

apiVersion: gostoa.dev/v1alpha1
kind: ToolSet
metadata:
name: <toolset-name>
namespace: stoa-system
spec:
upstream:
url: <string> # Obligatoire — URL du serveur MCP
transport: <sse|streamable-http> # Défaut : sse
auth: # Optionnel
type: <bearer|header>
secretRef: <string> # Nom du Secret K8s
headerName: <string> # Pour le type header uniquement
timeoutSeconds: <integer> # Timeout de connexion
tools: [] # Noms des outils à exposer (vide = tous)
prefix: <string> # Optionnel — préfixe pour les noms d'outils

Statut (lecture seule)

status:
connected: true
toolCount: 12
discoveredTools:
- search_customers
- create_order
- get_invoice
lastSync: "2026-02-13T10:30:00Z"
error: ""

Exposition Sélective des Outils

Exposez uniquement des outils spécifiques depuis un serveur upstream :

spec:
tools:
- search_customers
- get_customer_detail
# Seuls ces 2 outils seront disponibles, même si le serveur en a 20

Préfixe pour Éviter les Conflits

Lorsque vous connectez plusieurs serveurs MCP qui peuvent avoir des outils avec le même nom :

spec:
prefix: "crm"
# "search_customers" devient "crm_search_customers"

Patterns d'Authentification

Sans Auth (APIs Publiques)

spec:
auth: none
endpoint: https://api.open-meteo.com/v1/forecast

Bearer Token (Secret K8s)

spec:
auth: bearer
---
# Créer le secret d'abord
apiVersion: v1
kind: Secret
metadata:
name: my-api-token
namespace: stoa-system
type: Opaque
stringData:
token: "sk-my-secret-token"

Compte de Service (OAuth2 M2M)

spec:
auth: service_account
# Utilise les credentials du compte de service Keycloak configuré dans le gateway

Tester les Outils

Vérifier que le CRD est Appliqué

kubectl get tools.gostoa.dev -n stoa-system -o wide

Tester via REST

# Lister les outils
curl -s -X POST "${STOA_GATEWAY_URL}/mcp/v1/tools" \
-H "Authorization: Bearer ${TOKEN}" | jq '.tools[] | {name, description}'

# Invoquer
curl -s -X POST "${STOA_GATEWAY_URL}/mcp/v1/tools/invoke" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"name": "get-weather", "arguments": {"q": "Berlin"}}' | jq

Tester via le Protocole MCP

# Initialiser la session
curl -s -X POST "${STOA_GATEWAY_URL}/mcp/sse" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "initialize",
"params": {
"protocolVersion": "2025-03-26",
"capabilities": {"tools": {}},
"clientInfo": {"name": "test", "version": "1.0"}
},
"id": 1
}' | jq

# Lister les outils
curl -s -X POST "${STOA_GATEWAY_URL}/mcp/sse" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "method": "tools/list", "id": 2}' | jq

# Appeler un outil
curl -s -X POST "${STOA_GATEWAY_URL}/mcp/sse" \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {"name": "get-weather", "arguments": {"q": "Berlin"}},
"id": 3
}' | jq

Vérifier via l'Admin Gateway

curl -s "${STOA_GATEWAY_URL}/admin/health" \
-H "Authorization: Bearer ${ADMIN_TOKEN}" | jq

Patterns de Déploiement

Pattern 1 : Encapsuler une API REST Existante

Le pattern le plus courant — exposer l'API interne d'une entreprise aux agents IA :

apiVersion: gostoa.dev/v1alpha1
kind: Tool
metadata:
name: search-orders
namespace: stoa-system
spec:
displayName: Search Orders
description: "Search customer orders by status, date range, or customer ID. Returns order summary with amounts."
endpoint: https://erp.internal.example.com/api/v2/orders/search
method: POST
inputSchema:
type: object
properties:
customer_id:
type: string
description: "Customer identifier"
status:
type: string
enum: [pending, shipped, delivered, cancelled]
date_from:
type: string
format: date
required: [customer_id]
auth: bearer
rateLimit: "100/min"
annotations:
readOnly: true
idempotent: true
openWorld: false

Pattern 2 : Fédération via ToolSet

Connecter un serveur MCP entier et exposer ses outils via l'auth et la limitation de débit de STOA :

apiVersion: gostoa.dev/v1alpha1
kind: ToolSet
metadata:
name: data-science-tools
namespace: stoa-system
spec:
upstream:
url: https://ds-tools.internal.example.com/mcp
transport: sse
auth:
type: bearer
secretRef: ds-tools-secret
timeoutSeconds: 60
prefix: "ds"
tools:
- run_prediction
- feature_importance
- model_metrics

Pattern 3 : Distribution Multi-Gateway des Outils

Déployer le même outil sur plusieurs instances gateway pour la haute disponibilité :

# Le Tool CRD est à portée de cluster — tous les gateways du namespace le voient
kubectl apply -f my-tool.yaml -n stoa-system

# Vérifier sur chaque gateway
curl -s "${STOA_GATEWAY_URL}/mcp/v1/tools" \
-H "Authorization: Bearer ${TOKEN}" | jq '.tools | length'

Prochaines Étapes

SujetLien
Démarrage MCPTutoriel rapide
Référence API MCPRéférence complète des endpoints
Spec Tool CRDRéférence CRD
Spec ToolSet CRDRéférence CRD
Modes du gatewayConcepts d'architecture