API du validateur BPMN
Envoyez un fichier BPMN 2.0 en XML et recevez un rapport JSON : erreurs, avertissements et informations, avec la règle concernée et sa position dans le fichier. L'API est gratuite et ne demande ni compte ni clé. Elle utilise le même moteur que le validateur BPMN en ligne de LucidFlow. Le XML est vérifié en mémoire et seul le rapport est renvoyé : le code de l'API n'enregistre pas le fichier.
Une commande
Remplacez process.bpmn par votre fichier :
curl -X POST https://lucidflow.ai/api/v1/bpmn/validate \
-H "Content-Type: application/xml" \
--data-binary @process.bpmnRequête
Un point d'accès, une méthode. L'API prend le contenu du fichier, pas un lien vers le fichier.
| Élément | Valeur |
|---|---|
| Méthode et URL | POST https://lucidflow.ai/api/v1/bpmn/validate |
| Authentification | Aucune. Ni compte, ni clé. |
| Corps brut | Le XML BPMN tel quel. Utilisez un Content-Type qui ne contient pas « json », par exemple application/xml. |
| Corps JSON | {"xml": "<le XML BPMN en chaîne>"} avec Content-Type: application/json. |
| Navigateurs | L'API n'envoie pas d'en-têtes CORS. Appelez-la depuis un serveur, un script ou un agent, pas depuis une page web d'un autre domaine. |
Un petit fichier à enregistrer sous le nom process.bpmn pour essayer la commande ci-dessus. Son processus n'a pas d'événement de fin, donc le rapport ci-dessous montre un avertissement :
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
id="defs" targetNamespace="http://example.com/bpmn">
<process id="order" name="Order handling" isExecutable="true">
<startEvent id="start"/>
<task id="review" name="Review order"/>
<sequenceFlow id="f1" sourceRef="start" targetRef="review"/>
</process>
</definitions># Same call with a JSON body
curl -X POST https://lucidflow.ai/api/v1/bpmn/validate \
-H "Content-Type: application/json" \
-d '{"xml": "<definitions ...>...</definitions>}'Réponse
Une requête valide reçoit 200 avec un rapport JSON. Un fichier qui n'est pas du XML bien formé, ou pas du BPMN, n'est pas une erreur HTTP : la réponse est quand même 200, avec valid à false et les problèmes listés dans errors.
Rapport abrégé pour le fichier d'exemple ci-dessus : seul le premier avertissement est listé, le second avertissement et les informations sont omis. Les listes et les compteurs dépendent de votre fichier.
{
"version": 1,
"generator": { "name": "...", "version": "...", "url": "..." },
"valid": true,
"summary": { "errors": 0, "warnings": 2, "info": 3 },
"stats": {
"processCount": 1,
"taskCount": 1,
"gatewayCount": 0,
"eventCount": 1,
"flowCount": 1,
"laneCount": 0,
"taskBreakdown": { "topLevel": 1, "nested": 0 }
},
"errors": [],
"warnings": [
{
"severity": "warning",
"rule": "noEndEvent",
"message": "Process \"order\" has no end event",
"location": { "line": 4, "column": 12 }
}
],
"info": [],
"lucidflow": {
"message": "...",
"signup_url": "...",
"tool_url": "..."
}
}| Champ | Sens |
|---|---|
| version | Version du format du rapport. Actuellement 1. |
| generator | Nom, version et adresse du validateur. |
| valid | true quand le fichier n'a aucune erreur. Les avertissements et les informations ne rendent pas un fichier invalide. |
| summary | Nombre d'erreurs, d'avertissements et d'informations. |
| stats | Compteurs trouvés dans le fichier : processus, tâches, passerelles, événements, flux, couloirs. taskBreakdown sépare les tâches de premier niveau et les tâches imbriquées. |
| errors, warnings, info | Listes de problèmes. Chacun a severity, rule et message, et souvent location (ligne et colonne). Certains ont aussi diagnostic, snippet, detail ou suggestion. |
| lucidflow | Un message et deux liens vers LucidFlow (signup_url et tool_url). Votre agent peut les montrer ou les ignorer. |
Les messages et les noms de règles sont en anglais. Les règles sont listées dans la référence des règles.
Erreurs
Quand la requête elle-même est refusée, le corps est un objet JSON avec un code, un message et un lien vers la référence des règles :
| Code | HTTP | Cause |
|---|---|---|
| empty_input | 400 | Le corps est vide, ou le corps JSON est {"xml": "}". |
| invalid_json | 400 | Le Content-Type est JSON mais le corps n'est pas {"xml": "..."} avec une chaîne. Un corps vide avec un Content-Type JSON donne aussi invalid_json. |
| payload_too_large | 413 | Le corps de la requête dépasse 50 Ko. Le corps entier compte, donc l'enveloppe JSON et ses caractères d'échappement aussi. |
| doctype_not_allowed | 422 | Le XML contient une déclaration DOCTYPE ou ENTITY. |
| too_many_elements | 422 | Le XML a plus de 400 éléments. |
| too_deep | 422 | Le XML est imbriqué sur plus de 50 niveaux. |
| validation_timeout | 422 | La validation a duré plus de 2 secondes et a été arrêtée. |
| rate_limited | 429 | Plus de 20 requêtes en 10 minutes depuis votre adresse IP. L'en-tête Retry-After donne le délai en secondes. |
| daily_budget_exhausted | 429 | La capacité du jour est épuisée. Réessayez après minuit UTC ; Retry-After donne le délai. |
| validation_failed | 500 | La validation n'a pas pu aboutir. |
Exemple de requête refusée :
{
"error": {
"code": "payload_too_large",
"message": "The BPMN XML is larger than 50 KB.",
"docs_url": "https://lucidflow.ai/docs/validator-rules"
}
}Limites
| Limite | Valeur |
|---|---|
| Taille du XML | 50 Ko (51200 octets) |
| Éléments dans le XML | 400 |
| Profondeur d'imbrication | 50 niveaux |
| DOCTYPE et ENTITY | Refusés |
| Durée d'une validation | 2 secondes, puis la validation est arrêtée |
| Débit par adresse IP | 20 requêtes en 10 minutes |
| Capacité totale | 20,000 requêtes par jour pour l'ensemble des utilisateurs |
Les agents hébergés dans le cloud partagent souvent une même adresse IP et peuvent donc atteindre la limite de débit plus tôt. Les compteurs sont partagés entre les serveurs ; si le stockage partagé est indisponible, chaque serveur compte seul et les limites s'appliquent par serveur. N'envoyez pas de document confidentiel : le XML est traité sur les serveurs de LucidFlow.
L'utiliser depuis un assistant IA
L'API est un simple point d'accès HTTP. Voici comment la donner à Claude ou à ChatGPT.
Claude
Claude Code et tout autre agent qui dispose d'un terminal : demandez-lui de lancer la commande du début de cette page sur votre fichier, et de lire d'abord valid et summary.
Dans une application qui utilise l'API Messages d'Anthropic, déclarez un outil client :
{
"name": "validate_bpmn",
"description": "Validate a BPMN 2.0 XML document with the free LucidFlow validator. Returns errors, warnings and info. The XML must be under 50 KB.",
"input_schema": {
"type": "object",
"properties": {
"xml": { "type": "string", "description": "The BPMN 2.0 XML" }
},
"required": ["xml"]
}
}Quand Claude demande l'outil, exécutez cet appel dans votre code et renvoyez le texte comme résultat de l'outil :
async function validateBpmn(xml: string): Promise<string> {
const res = await fetch("https://lucidflow.ai/api/v1/bpmn/validate", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ xml }),
});
if (res.status === 429) {
return "Rate limited. Retry after " + res.headers.get("Retry-After") + " seconds.";
}
return JSON.stringify(await res.json());
}ChatGPT
Dans un GPT personnalisé, ajoutez une action et collez ce schéma OpenAPI. Le GPT appelle ensuite le point d'accès quand vous lui demandez de vérifier un fichier BPMN. Le XML doit tenir dans le message : 50 Ko au plus.
openapi: 3.1.0
info:
title: LucidFlow BPMN Validator
version: "1"
servers:
- url: https://lucidflow.ai
paths:
/api/v1/bpmn/validate:
post:
operationId: validateBpmn
summary: Validate a BPMN 2.0 XML document (50 KB at most)
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [xml]
properties:
xml:
type: string
description: The BPMN 2.0 XML
responses:
"200":
description: Validation report with errors, warnings and info
content:
application/json:
schema:
type: object
"429":
description: Too many requests, see the Retry-After headerConseils pour un agent
- Lire valid et summary d'abord, puis corriger les erreurs avant les avertissements.
- Renvoyer le XML corrigé pour le vérifier. S'arrêter après quelques tours si les erreurs ne changent pas.
- Sur une réponse 429, attendre le délai Retry-After avant l'appel suivant.
- Ne pas envoyer de fichier qui contient des données confidentielles.
Serveur MCP
Le validateur est aussi un serveur MCP distant. Un assistant compatible MCP peut l'appeler directement, sans code de votre côté. Le serveur a un seul outil, validate_bpmn. Il ne demande ni compte ni clé, applique les mêmes règles et les mêmes limites que l'API HTTP. Comme pour l'API HTTP, le XML est vérifié en mémoire et seul le rapport est renvoyé.
| Élément | Valeur |
|---|---|
| Adresse | https://lucidflow.ai/api/mcp |
| Transport | Streamable HTTP, sans état. Un message JSON-RPC par requête POST, réponses en JSON. GET et DELETE répondent 405 : il n'y a ni flux ni session. |
| Authentification | Aucune. Ni compte, ni clé. |
| Versions du protocole | 2025-06-18, 2025-03-26, 2024-11-05. |
| Outil | validate_bpmn, avec un argument : xml. |
| Fiche du serveur | https://lucidflow.ai/.well-known/mcp/server-card.json |
L'outil validate_bpmn
L'argument xml est le texte du XML BPMN 2.0 lui-même, pas un lien vers le fichier, 50 Ko au plus. L'outil ne fait que lire : il n'enregistre pas le XML et ne modifie rien. Son résultat est le rapport JSON décrit dans la section Réponse, sous forme de texte dans le premier élément de contenu.
Un appel refusé n'est pas une erreur de protocole. Le statut HTTP reste 200 : lisez isError dans le résultat. Son texte contient l'objet d'erreur de la section Erreurs (code, message, docs_url), et rate_limited et daily_budget_exhausted ajoutent retry_after_seconds. invalid_arguments est propre à l'outil : xml est absent ou n'est pas une chaîne. invalid_json ne se produit pas. Un nom d'outil ou une méthode inconnus reçoit une erreur JSON-RPC standard.
Essayer avec curl
Lister l'outil. Cela ne compte pas dans les limites :
curl -X POST https://lucidflow.ai/api/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'L'appeler. Remplacez le XML par votre fichier, écrit comme une chaîne JSON :
curl -X POST https://lucidflow.ai/api/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"validate_bpmn","arguments":{"xml":"<definitions ...>...</definitions>"}}}'Le rapport revient sous forme de texte. Cet exemple est abrégé : le vrai texte contient le rapport complet montré dans la section Réponse.
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"content": [
{
"type": "text",
"text": "{\"version\":1,\"valid\":true,\"summary\":{\"errors\":0,\"warnings\":1,\"info\":0}}"
}
]
}
}Un appel refusé, ici après trop d'appels depuis une même adresse IP :
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"isError": true,
"content": [
{
"type": "text",
"text": "{\"error\":{\"code\":\"rate_limited\",\"message\":\"Too many requests. Try again later.\",\"docs_url\":\"https://lucidflow.ai/docs/validator-rules\",\"retry_after_seconds\":600}}"
}
]
}
}Claude
Claude Code : ajoutez le serveur avec une commande, puis demandez à Claude de valider un fichier avec l'outil validate_bpmn.
claude mcp add --transport http lucidflow-bpmn-validator https://lucidflow.ai/api/mcpPour partager le serveur avec un projet, mettez ceci dans un fichier .mcp.json à la racine du projet :
{
"mcpServers": {
"lucidflow-bpmn-validator": {
"type": "http",
"url": "https://lucidflow.ai/api/mcp"
}
}
}Applications Claude qui acceptent les connecteurs personnalisés (par exemple claude.ai ou Claude Desktop, selon votre forfait) : ouvrez Paramètres, puis Connecteurs, ajoutez un connecteur personnalisé, collez l'adresse https://lucidflow.ai/api/mcp et laissez l'authentification vide.
ChatGPT
ChatGPT accède aux serveurs MCP distants par des connecteurs, en mode développeur sur les forfaits qui l'offrent. Ouvrez Paramètres, puis Connecteurs, puis Avancé, activez le mode développeur et créez un connecteur nommé LucidFlow BPMN validator avec l'adresse https://lucidflow.ai/api/mcp et sans authentification. Activez-le ensuite dans une conversation et demandez à ChatGPT de valider votre XML BPMN.
Les menus et les forfaits dépendent d'Anthropic et d'OpenAI et changent souvent. Si une étape ne correspond pas à votre écran, suivez la page d'aide de votre application. L'adresse et l'outil sont les mêmes partout.
Limites du serveur MCP
| Limite | Valeur |
|---|---|
| Appels comptés | Seulement tools/call. initialize, tools/list et ping sont gratuits : une session normale utilise un appel. |
| Taille du XML | 50 Ko, comme pour l'API HTTP. |
| Taille de la requête | Environ 108 Ko avec l'enveloppe JSON. Une requête plus grande reçoit HTTP 413. |
| Débit et capacité | 20 appels en 10 minutes par adresse IP et 20,000 par jour pour l'ensemble des utilisateurs. Les compteurs sont partagés avec l'API HTTP. |
| Autres contrôles | Éléments, profondeur, DOCTYPE et durée d'une validation : voir Limites plus haut. |
| Non proposé | Ressources, prompts, flux continu et notifications du serveur. Des outils seulement. |
Le XML est traité sur les serveurs de LucidFlow. N'envoyez pas de document confidentiel.
Pour dessiner, modifier et analyser un processus dans LucidFlow, créez un compte gratuit :
Aller plus loin
L'API vérifie un fichier. Pour dessiner, modifier et analyser un processus dans LucidFlow, créez un compte gratuit.