fluyo-mcp
This MCP server lets you create, edit, and export architecture diagrams in Fluyo's native .fluyo.json format. Key tools:
Diagram creation:
create_diagramgenerates diagrams from nodes/edges with auto-layout and theming.Diagram editing:
edit_diagrammodifies existing diagrams (add/update/remove nodes/edges, change theme, rename page, relayout).Export:
export_diagramrenders a page to static SVG.Templates:
list_templatesshows predefined patterns, andcreate_from_templateinstantiates them.Design resources:
list_icons,list_colors,list_anims, andlist_fontslist available icons, colors, animations, and fonts.
All tools are pure functions with full round-trip fidelity with the Fluyo app. Available locally or via a remote stateless HTTP endpoint (no auth required).
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@fluyo-mcpCreate a diagram of an event-driven architecture with API Gateway, Kafka, and two consumers."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
fluyo-mcp
Servidor MCP para Fluyo: crea, edita y exporta diagramas de arquitectura desde un asistente de IA, operando sobre el mismo formato .fluyo.json que produce y consume la aplicación.
No necesita backend. Es una capa delgada sobre el modelo de documento de Fluyo, así que lo que genera se abre con el botón Abrir del editor sin conversión de por medio, y un diagrama guardado desde la app se puede seguir editando desde aquí.
Qué resuelve
Tool | Para qué |
| Texto → diagrama. Nodos y aristas; si no das |
| Modifica un documento existente con operaciones (añadir, actualizar, borrar, cambiar tema, recalcular layout). |
| Renderiza una página a SVG estático. |
| Instancia patrones de arquitectura predefinidos (Kafka, RAG, microservicios) con reemplazo de etiquetas. |
| Las 47 claves de ícono, agrupadas (General, GCP, AWS, Azure, Estados, Varios). |
| Los 14 colores semánticos de la paleta. |
| Los 8 GIFs animados para nodos |
| Las 11 tipografías disponibles. |
Las nueve son funciones puras: reciben JSON y devuelven JSON, sin tocar disco, red ni ningún estado externo. Van anotadas como tal (readOnlyHint, idempotentHint).
Related MCP server: AI Charts
Instalación
npm install
npm run buildRequiere Node 22.18 o superior.
npm test # contrato contra los ejemplos reales de Fluyo, tools y rendererConectarlo
Hay dos transportes sobre el mismo núcleo. Las nueve tools, sus schemas y el renderer son idénticos en los dos; lo único que cambia es por dónde entran los mensajes.
stdio | Streamable HTTP | |
Entry point |
|
|
Uso | local, el proceso lo lanza el cliente | conector remoto en |
Sesiones | una por proceso | ninguna: stateless, cada petición se procesa y se descarta |
Topes | ninguno | 1 MB de entrada, 200 KB por respuesta de tool, 30 req/min por IP |
Como conector remoto
POST https://mcp.fluyo.space/mcpSin autenticación y sin Mcp-Session-Id. Pega esa URL donde tu cliente pida un servidor MCP remoto.
Como proceso local (stdio)
Añade el servidor a la configuración MCP de Claude Code o Claude Desktop:
{
"mcpServers": {
"fluyo": {
"command": "node",
"args": ["/ruta/absoluta/a/fluyo-mcp/dist/index.js"]
}
}
}O como ejecutable global (npm link):
{
"mcpServers": {
"fluyo": { "command": "fluyo-mcp" }
}
}Ejemplo de uso
Diagrama un pipeline donde un API Gateway recibe requests, publica eventos en Kafka y dos servicios consumidores procesan los mensajes; uno de ellos persiste en Cloud SQL.
El modelo llamará a create_diagram con algo así:
{
"pageName": "Pipeline de eventos",
"nodes": [
{ "key": "gw", "shape": "rect", "label": "API Gateway", "color": "Servicio" },
{ "key": "kafka", "shape": "icon", "label": "Kafka", "icon": "kafka", "pulse": true, "color": "Eventos / Kafka" },
{ "key": "svcA", "shape": "rect", "label": "Servicio A", "color": "Servicio" },
{ "key": "svcB", "shape": "rect", "label": "Servicio B", "color": "Servicio" },
{ "key": "db", "shape": "cylinder", "label": "Cloud SQL", "color": "Datos" }
],
"edges": [
{ "from": "gw", "to": "kafka", "label": "evento", "route": "ortho" },
{ "from": "kafka", "to": "svcA", "label": "topic: A", "route": "ortho" },
{ "from": "kafka", "to": "svcB", "label": "topic: B", "route": "ortho" },
{ "from": "svcB", "to": "db", "label": "persistencia", "dashed": true }
]
}El resultado es un .fluyo.json completo, y el resumen de la respuesta trae un enlace
fluyo.space/#d=… que lo abre ya animado en la app, sin guardar ningún archivo. También se
puede guardar el JSON y abrirlo con el botón Abrir, o seguir editándolo con edit_diagram.
El enlace fluyo.space/#d=…
create_diagram, edit_diagram y create_from_template devuelven, junto al resumen, un
enlace que abre el diagrama ya animado en la app. Es el paso que faltaba: antes había que
copiar el JSON del chat, guardarlo como .fluyo.json y abrirlo a mano.
El diagrama viaja dentro del enlace. No hay backend, no hay nada que dar de alta y no hay
nada que caduque. Va detrás de la almohadilla a propósito: el navegador no envía el
fragmento al servidor, ni en la petición ni en la cabecera Referer, así que el contenido
no llega a ningún registro de acceso — ni al de fluyo.space, ni al de nadie.
La contrapartida, dicha claramente: va codificado, no cifrado. Quien reciba el enlace puede leer el diagrama. Trátalo como tratarías el archivo.
Formato, por si alguien quiere generarlos por su cuenta:
#d= base64url( [1 byte de versión] + [carga] )
1 → deflate-raw ← lo que emite este servidor
0 → JSON en UTF-8 tal cual ← lo entiende el lector, no se emiteTamaño. Medido sobre los ocho ejemplos que publica Fluyo: 3.971 bytes de JSON minificado de media acaban en 1.061 caracteres de URL — factor 5, porque este JSON repite las mismas claves en cada nodo y eso es justo lo que come el deflate. Un diagrama de 8 nodos son 987 caracteres; uno de 30, 2.429.
Cuándo no hay enlace. Por encima de 16.000 caracteres no se emite, y la respuesta explica
por qué. El límite no lo pone el navegador —Chrome traga fragmentos de dos millones de
caracteres— sino el medio por el que viaja el enlace: un cliente de correo en texto plano
parte las líneas largas, y una URL partida ya no abre nada. Lo que dispara el tope en la
práctica no es el número de nodos, son los nodos image: llevan la imagen entera dentro como
data URI y uno solo puede pesar más que un diagrama de cien nodos.
Operaciones de edit_diagram
Se envían como lista en operations y se aplican en orden.
Operación | Campos principales | Descripción |
|
| Añade un nodo. |
|
| Actualiza un nodo por su id numérico. |
|
| Elimina el nodo y todas sus conexiones. |
|
| Crea una conexión. Acepta ids existentes o |
|
| Modifica una arista. |
|
| Elimina una arista. |
|
|
|
|
| Renombra la página. |
| — | Recalcula las posiciones en capas. Borra todos los waypoints manuales de la página. |
Para referenciar nodos que ya existen en el documento usa siempre su
idnumérico. Laskeydeadd_nodeson temporales y no se guardan en el.fluyo.json.
Fidelidad con la aplicación
Importa ser preciso aquí, porque una versión anterior de este README prometía paridad que el código no daba.
Derivado mecánicamente de Fluyo — npm run sync:config lee fluyo/js/config.js y fluyo/js/state.js y genera src/generated/config.ts. La paleta, los temas, los 72 íconos con su SVG, los 8 GIFs, las 12 tipografías y los tamaños por forma no se copian a mano: se extraen. CI comprueba que sigan sincronizados.
Portado a mano, verificado por tests — la geometría de aristas y el exportador SVG son ports de fluyo/js/geometry.js y fluyo/js/export.js. No hay forma de derivarlos automáticamente, así que el renderer se compara en cada CI contra los SVG que produjo el exportador de la propia app para los cinco ejemplos publicados.
Deliberadamente distinto — dos cosas:
La medición de texto es una heurística. La app pide
getBBox()al navegador; aquí no hay DOM y se estima sumando anchos por carácter. Las etiquetas que caben en su forma salen idénticas; las que hay que encoger pueden quedar a un tamaño de fuente ligeramente distinto, y el fondo de una etiqueta de arista, unos píxeles más ancho o estrecho.export_diagramno anima. Igual que "Exportar → SVG" en la app: sin puntos de flujo ni aparición escalonada. Para el GIF animado hay que abrir el documento en Fluyo.
Round-trip garantizado — un documento guardado por la app entra y sale de este servidor sin perder un solo campo, incluidos los que el servidor todavía no sabe interpretar. Lo verifica un test de contrato contra los cinco ejemplos reales de fluyo/ejemplos/data/. No es un detalle: la versión anterior descartaba en silencio 16 campos de estilo en cada llamada.
Limitaciones actuales
Solo SVG. PNG y GIF necesitan un renderer de canvas (
sharp,resvg,node-canvas).El endpoint remoto tiene topes que el local no tiene. 1 MB de cuerpo, 200 KB por respuesta de tool y 30 peticiones por minuto y por IP. Un diagrama con nodos
imagepuede pasarse de cualquiera de los dos primeros; por stdio no hay ninguno.Los nodos
imageno se pueden crear, porque llevan los bytes de la imagen dentro (img, un data URI que se pega o arrastra en la app). Los que ya existen se leen, editan y exportan con normalidad. Losanimsí se pueden crear: sus claves son un catálogo cerrado (list_anims).No se pueden crear ni borrar páginas. Se puede elegir sobre cuál trabajar (
pageIndex) y renombrarla.No se leen documentos del formato v1. La app los migra al abrirlos; ábrelo y vuelve a guardarlo.
El auto-layout es un Sugiyama simplificado. Va muy bien en pipelines y arquitecturas convencionales; para grafos muy ramificados conviene dar coordenadas o retocar tras un
relayout.edit_diagramreenvía el documento entero en la entrada y en la salida. En sesiones de edición largas sobre diagramas grandes eso consume bastante contexto.
Privacidad
Este servidor no almacena los diagramas. No hay base de datos, no hay disco, no hay caché y no hay sesiones: cada petición HTTP construye un servidor, procesa el mensaje y lo descarta.
El registro de operación anota exactamente esto, una línea JSON por petición en stderr:
{"ts":"…","route":"/mcp","method":"POST","status":200,"outcome":"ok",
"durationMs":31,"requestBytes":1462,"responseBytes":9038,"tools":["export_diagram"]}Y nada más. No se registra el documento, ni las etiquetas, ni los argumentos de las tools, ni el cuerpo de la respuesta, ni los mensajes de error, ni stack traces, ni la IP del cliente, ni cabeceras. No hay modo debug que levante esas restricciones.
Que siga siendo cierto no depende de la disciplina de quien edite el código: el tipo RequestLog de src/http-logging.ts es un enum cerrado sin ningún campo donde quepa texto libre del usuario, y test/http.test.ts mete marcadores irrepetibles en las etiquetas de un diagrama y falla si aparecen en alguna línea de log.
Detalle honesto sobre las IPs: el limitador de caudal guarda en memoria la IP del cliente y las marcas de tiempo de sus últimas peticiones, durante la ventana de un minuto. Nunca se escribe a disco ni al log, y desaparece al reciclarse la instancia.
Fuera de este proceso, Cloud Run escribe automáticamente sus propios request logs (IP del cliente, ruta, código de estado, latencia, user-agent) en Cloud Logging. Eso no lo controla este código: lo genera la plataforma antes de que la petición llegue al contenedor. La retención está fijada a 7 días en el bucket _Default — ver Retención de logs, donde está el comando que lo fija, para que el número de la política de privacidad sea reproducible y no una promesa.
Desplegar en Cloud Run
El servidor se despliega como servicio propio de Cloud Run en mcp.fluyo.space — no dentro del deployment de fluyo/, que es estático a propósito y publica «no hay backend» como argumento de privacidad. Ver DRIFT.md §6.
Por qué Cloud Run y no Vercel. El plan Hobby de Vercel restringe el uso a personal no comercial y, al exceder los límites, pausa el servicio 30 días. Para un servidor listado en un directorio público eso es inaceptable: el modo de fallo es quedarse caído un mes sin recurso. Cloud Run no tiene esa restricción y su modo de fallo es facturar, que sí se puede acotar — de ahí los topes de la sección siguiente.
Piezas
Archivo | Papel |
| Multi-stage: compila con todas las dependencias, y la imagen final solo lleva |
| Mantiene el contexto de build pequeño; |
| 21 comprobaciones contra el despliegue ya en marcha |
No hay archivos estáticos. En Vercel robots.txt lo servía la plataforma desde public/; aquí el contenedor es lo único que contesta, así que la ruta /robots.txt la sirve src/http.ts como cualquier otra.
Variables de entorno
Se fijan por revisión: cambiar una crea una revisión nueva, y hasta que esa revisión reciba tráfico el cambio no surte efecto. Ninguna es un secreto; ninguna es obligatoria salvo la del challenge, y esa solo mientras dure la verificación de OpenAI.
Variable | Por defecto | Para qué |
| — | Valor que sirve |
| los de Claude, ChatGPT y Fluyo | Lista blanca de |
|
| Peticiones por IP y por ventana en |
|
| Tamaño de la ventana deslizante. |
|
| Tope del cuerpo de la petición. Por encima: 413. |
|
| Tope del resultado de una tool. Por encima se sustituye por un error que explica cómo reducir el diagrama. |
|
| Base de los enlaces |
| activado |
|
PORT no se configura. La inyecta Cloud Run y el contenedor la lee; fijarla a mano rompe el despliegue. En local sí se usa (PORT=3000 npm run start:http).
Topes de coste
Estos valores no son negociables y son la razón por la que este servicio no puede sorprender con una factura:
--max-instances=2 # techo de cómputo. Ver la aritmética de abajo
--concurrency=80 # peticiones simultáneas por instancia
--timeout=30s
--min-instances=0 # sin tráfico, no se paga nada
--cpu=1 --memory=512Mi
--cpu-boost # arranque en frío más rápidoLa aritmética del techo. Con max-instances=2, cpu=1 y memory=512Mi, el peor caso es que las dos instancias estén saturadas las 24 horas:
2 instancias × 86.400 s = 172.800 instancia-segundos/día
CPU: 172.800 × 1 × $0,000024 = $4,15/día
Memoria:172.800 × 0,5 × $0,0000025 = $0,22/día
─────────
≈ $4,4/día ← el máximo posibleEn operación normal la cifra real es una fracción de eso, porque con min-instances=0 no se factura nada mientras no hay tráfico.
--concurrency=80no se toca. Es contraintuitivo: bajarlo multiplica el coste. Cada instancia atiende hasta 80 peticiones a la vez; conconcurrency=10harían falta ocho veces más instancias para el mismo tráfico, se toparía antes enmax-instances=2y los usuarios recibirían 429 de la plataforma antes que del rate limiter. Las nueve tools son funciones puras que no comparten estado, así que 80 simultáneas por instancia no tienen ningún inconveniente.
Primer despliegue
PROJECT=tu-proyecto-gcp
REGION=us-central1
gcloud config set project "$PROJECT"
gcloud services enable run.googleapis.com cloudbuild.googleapis.com artifactregistry.googleapis.com
# Construye desde el Dockerfile y despliega en un solo paso.
gcloud run deploy fluyo-mcp \
--source . \
--region "$REGION" \
--platform managed \
--allow-unauthenticated \
--max-instances=2 \
--concurrency=80 \
--timeout=30s \
--min-instances=0 \
--cpu=1 --memory=512Mi --cpu-boost \
--set-env-vars "OPENAI_APPS_CHALLENGE=el-valor-que-te-dio-openai"--allow-unauthenticated es deliberado: es un servidor MCP público sin credenciales. Lo que lo protege del abuso es el rate limiter y max-instances, no IAM.
Después, verifica el despliegue entero de una vez:
./scripts/verify-deploy.sh https://mcp.fluyo.spaceSon 21 comprobaciones con ✓/✗ y código de salida distinto de cero si algo falla. Cubre lo que los tests no pueden ver, porque corren contra un handler en memoria: redirecciones, cabeceras que añada la plataforma y el mapeo de dominio.
Dominio mcp.fluyo.space
gcloud beta run domain-mappings create \
--service fluyo-mcp \
--domain mcp.fluyo.space \
--region "$REGION"El comando imprime el registro DNS que hay que crear en la zona de fluyo.space:
CNAME mcp ghs.googlehosted.com.El certificado lo emite Google automáticamente una vez propagado el DNS; suele tardar entre unos minutos y un par de horas. Mientras tanto el servicio ya responde en su URL *.run.app.
Si tu región no ofrece domain mappings, la alternativa es un balanceador de carga HTTP(S) global con un backend serverless NEG apuntando al servicio. Cuesta más y añade una pieza; el mapeo directo basta para este caso.
Retención de logs
Cloud Run escribe request logs automáticamente. La política de privacidad publica una retención de 7 días, y esto es lo que la hace cierta:
gcloud logging buckets update _Default \
--location=global \
--retention-days=7 \
--project="$PROJECT"
# Comprobarlo:
gcloud logging buckets describe _Default --location=global --format='value(retentionDays)'El valor por defecto de _Default son 30 días. Si no se ejecuta ese comando, la política dice 7 y la realidad son 30, que es exactamente el tipo de desajuste que hace falsa una declaración de privacidad. Va aquí, y no solo en un runbook, para que sea reproducible.
Esto es independiente del logger de la aplicación: src/http-logging.ts no escribe ningún dato de usuario, y eso sigue siendo cierto pase lo que pase con la retención de la plataforma.
La ruta del challenge de OpenAI
Es el punto que más fácil se rompe, así que conviene entenderlo antes de poner nada delante del servicio:
El verificador de OpenAI elimina el subpath. Da igual que el MCP esté montado en /mcp: siempre pide https://mcp.fluyo.space/.well-known/openai-apps-challenge, en la raíz del host. Y tiene que contestar 200 directo con text/plain. Una redirección hacia la ruta «correcta», aunque acabe en el sitio adecuado, cuenta como fallo.
Lo que garantiza que eso se cumpla:
El contenedor no redirige nunca.
normalizePath()ensrc/http.tsquita la query string y la barra final sobrante sin emitir un 301. Si aparece una redirección, viene de delante: del mapeo de dominio o de un balanceador.La ruta se atiende antes que nada en
route()— antes del rate limit y antes de la comprobación deOrigin. El verificador nunca puede recibir un 429 ni un 403.Cloud Run reenvía la petición tal cual al contenedor, sin reescribir rutas ni añadir barras. No hay equivalente de
cleanUrls/trailingSlashque pueda estropearlo por defecto.Hay un test (
test/http.test.ts) que pide la ruta conredirect: "manual"y exige exactamente 200 ytext/plain, yverify-deploy.shrepite la comprobación contra el despliegue real.
Rotar el challenge:
gcloud run services update fluyo-mcp \
--region "$REGION" \
--update-env-vars "OPENAI_APPS_CHALLENGE=el-valor-nuevo"Eso crea una revisión nueva y le manda el tráfico. Las variables de entorno de Cloud Run pertenecen a la revisión, no al servicio: hasta que la revisión nueva esté sirviendo, la ruta sigue devolviendo el valor viejo. Verifica con:
curl -i https://mcp.fluyo.space/.well-known/openai-apps-challenge
gcloud run services describe fluyo-mcp --region "$REGION" \
--format='value(spec.template.spec.containers[0].env)'Probar la imagen en local antes de subir
npm run build
npm run start:http # sin contenedor: http://localhost:3000/mcp
# Con el contenedor real, que es lo que corre en Cloud Run:
docker build -t fluyo-mcp .
docker run --rm -p 8080:8080 \
-e PORT=8080 \
-e OPENAI_APPS_CHALLENGE=prueba \
fluyo-mcp
./scripts/verify-deploy.sh http://localhost:8080El script pasa igual contra el contenedor local que contra producción, salvo la comprobación del challenge si no le pasas la variable.
Cómo se comporta el rate limit aquí
src/http-security.ts lee la IP del cliente de x-forwarded-for, y Cloud Run la rellena con el mismo formato que cualquier proxy: el primer valor es el cliente y el resto la cadena de saltos (203.0.113.45, 130.211.0.1). El código toma el primero, así que dos clientes detrás del mismo front-end de Google no comparten cubo. Es la misma lectura que se hacía en Vercel; no hubo que cambiar nada.
Un matiz que conviene tener presente: el estado del limitador vive en la memoria de cada instancia. Con max-instances=2, el límite efectivo puede llegar a ser el doble del configurado. Es una barrera contra el abuso accidental y los bucles de reintentos, no una cuota exacta — para eso haría falta un almacén compartido, y almacenar algo es justo lo que este servicio evita.
Estructura del proyecto
src/
generated/
config.ts # GENERADO por sync:config desde fluyo/. No editar a mano.
schema.ts # Reexporta las constantes + helpers (iconDataUri, resolveColor…)
model.ts # Esquemas Zod y tipos del documento Fluyo
errors.ts # Traduce los fallos de validación a frases accionables
layout.ts # Auto-layout por capas
diagram.ts # createDiagram / editDiagram
svg.ts # Exportador SVG
templates.ts # Plantillas de arquitectura
link.ts # Enlace fluyo.space/#d=… (deflate-raw + base64url)
server.ts # Registro de las tools MCP — común a los dos transportes
index.ts # Entry point 1: stdio
http.ts # Entry point 2: Streamable HTTP (stateless) + rutas del host
http-security.ts # Origin, rate limit, tope de cuerpo, gzip
http-logging.ts # Qué se registra, y sobre todo qué no
Dockerfile # Imagen de Cloud Run: multi-stage, no-root, lee PORT
.dockerignore # Contexto de build mínimo
scripts/
sync-config.ts # Genera src/generated/config.ts desde fluyo/
sync-fixtures.ts # Refresca test/fixtures/ desde los ejemplos de fluyo/
verify-deploy.sh # 21 comprobaciones contra un despliegue en marcha
test/
contract.test.ts # Los 5 ejemplos reales: se aceptan, round-trip sin pérdida, exportan
tools.test.ts # Flujo extremo a extremo de las 9 tools
render.test.ts # El SVG cuadra con el que produce la app
http.test.ts # Handshake por HTTP, paridad con stdio, seguridad y privacidad del log
link.test.ts # Formato del enlace, tope de tamaño y firma meta.generator
fixtures/ # Copias de fluyo/ejemplos/ (datos y previews de referencia)Contribuir
Lee CONTRIBUTING.md. Lo importante en dos líneas: src/generated/config.ts no se edita a mano, y si añades un campo al formato tiene que sobrevivir al test de contrato.
Licencia
MIT. Ver LICENSE.
Available Tools
9 toolscreate_diagramCrear diagrama FluyoARead-onlyIdempotent
Crea un diagrama de arquitectura completo (formato .fluyo.json) a partir de una lista de nodos y aristas. Si un nodo no trae x/y, se posiciona automáticamente en capas de izquierda a derecha según las aristas (auto-layout). El JSON resultante se puede abrir directo en fluyo (botón Abrir) o seguir editando con edit_diagram / exportando con export_diagram. Usa list_icons para ver íconos válidos y list_templates si el patrón ya existe como plantilla.
| Name | Required | Description | Default |
|---|---|---|---|
| dots | No | Cuántos puntos recorren cada arista. | |
| font | No | Tipografía global del diagrama. Usa list_fonts; si se omite, Georgia. | |
| grid | No | ||
| build | No | Si es true, los nodos aparecen escalonados según 'order' al reproducir la animación. | |
| edges | No | ||
| nodes | Yes | ||
| speed | No | Velocidad del flujo animado. | |
| theme | No | dark | |
| single | No | Modo 'pelota única por ruta': en vez de puntos por flecha, una sola pelota recorre el diagrama y se parte en cada bifurcación. | |
| stagger | No | Segundos entre la aparición de un nodo y el siguiente cuando build=true. | |
| customBg | No | Color de fondo (hex) que sobrescribe el del tema. | |
| pageName | No | Página 1 | |
| autoLayout | No | Si es true, calcula x/y de los nodos que no las traigan explícitas, en capas de izquierda a derecha según el grafo de aristas. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which already tell the agent this is a safe, idempotent creation with no destructive side effects. The description adds meaningful context beyond this: auto-layout behavior for missing coordinates, and the note that the result is directly openable/editable in Fluyo. It doesn't contradict annotations. It doesn't cover every edge case but adds value beyond the structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentence description — front-loads the core purpose and output format, then adds auto-layout behavior, and closes with concrete sibling-tool references for valid values. Zero wasted words, every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 13 parameters, no output schema, and no nested objects, the description is reasonably complete. It covers the output format (.fluyo.json), the auto-layout behavior, and points to sibling tools for valid enums. It could mention the build/stagger animation behavior or the single mode, but those are documented in the schema. It's adequate for a creation tool with this parameter richness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 62% (8 of 13 parameters described in-schema), so baseline is 3. The description adds context on node 'key' as a temporal identifier used only within the call, and explains auto-layout positions nodes when x/y omitted. However, the description doesn't enumerate or elaborate on the many styling parameters (dots, speed, stagger, single, build) beyond what the schema already provides, so it doesn't push above baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it creates a complete architecture diagram in .fluyo.json format from nodes and edges — specific verb+resource+output format. It clearly distinguishes from siblings by naming edit_diagram and export_diagram as follow-up tools rather than overlapping functions. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: it handles auto-layout when x/y are missing, and the resulting JSON can be opened directly in Fluyo or further edited/exported. It also points to list_icons and list_templates for valid values, giving helpful usage hints. However, it doesn't explicitly state when NOT to use this vs creating from a template (create_from_template is a sibling), which would elevate it to a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_from_templateCrear diagrama desde un templateCRead-onlyIdempotent
Instancia uno de los templates de list_templates como un documento Fluyo completo, con auto-layout aplicado. Se pueden personalizar los labels de los nodos vía 'labelOverrides' (mapa key -> nuevo texto).
| Name | Required | Description | Default |
|---|---|---|---|
| theme | No | ||
| pageName | No | ||
| templateId | Yes | ||
| labelOverrides | No | Ej: {"gateway": "Ingress", "db": "Cloud SQL"} |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotation contradiction: the description implies a mutation/write operation ('Instancia... un documento Fluyo completo, con auto-layout aplicado') creating a new document, but annotations declare readOnlyHint=true and idempotentHint=true. Creating a document is inherently a state-changing write, contradicting the read-only annotation. Even setting aside the contradiction, the description doesn't add meaningful behavioral context beyond what a brief 'creates a document with auto-layout' provides.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one tight sentence with a parenthetical clarification for labelOverrides. It's front-loaded with the core purpose and efficient. No wasted words, though the parenthetical could arguably be moved entirely to parameter-level documentation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a creation tool with 4 params, 25% schema coverage, no output schema, and annotations that contradict the described behavior, the description is under-specified. It doesn't explain the return value/result of creation, requirements around templateId validity, or how theme interacts with the template. The auto-layout note is helpful but insufficient given the write-operation nature and annotations confusion.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 25% (only labelOverrides has a description in the schema). The tool description does add value by explaining labelOverrides as 'mapa key -> nuevo texto' which clarifies its purpose beyond the schema example. However, it doesn't add meaning for theme, pageName, or templateId beyond what the names imply. Baseline is 3 given low coverage, but the description only partially compensates.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Instancia') plus resource ('templates de list_templates') and explains what it produces (un documento Fluyo completo con auto-layout). It clearly distinguishes itself from create_diagram by focusing on template instantiation. However, it doesn't explicitly note the sibling differentiator beyond referencing list_templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage ('Instancia uno de los templates de list_templates') by referencing how to get templates, which gives some contextual guidance. But it doesn't explicitly state when to choose this over create_diagram, nor provide exclusion criteria or prerequisites/alternative guidance. The context is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_diagramEditar diagrama FluyoARead-onlyIdempotent
Aplica una lista de operaciones (add_node, update_node, remove_node, add_edge, update_edge, remove_edge, set_theme, rename_page, relayout) sobre un documento Fluyo existente (el JSON completo devuelto por create_diagram o cargado desde un .fluyo.json). Las operaciones se aplican en orden; add_node puede definir un 'key' temporal que add_edge referencia en la misma llamada. Para editar nodos/aristas ya existentes en el documento, usa su 'id' numérico (visible en el JSON del documento).
| Name | Required | Description | Default |
|---|---|---|---|
| document | Yes | El documento Fluyo completo (.fluyo.json): el objeto que devuelve create_diagram / edit_diagram, o el contenido de un archivo guardado con Ctrl+S en la app. | |
| pageIndex | No | Índice de página a editar (por defecto, la página actual del documento). | |
| operations | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide readOnlyHint=true and destructiveHint=false, and the description adds important context: operations apply sequentially, add_node/add_edge interact via temporary keys, and editing existing elements requires numeric IDs from the document JSON. The relayout operation's description even warns it deletes ALL manual waypoints—genuinely useful behavioral detail that complements the annotations rather than contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a compact, densely informative paragraph with no filler. Every clause serves a purpose—listing operations, explaining ordering semantics, and clarifying the key/id mechanism. The relayout sub-description is brief but packs critical destructive behavior into one sentence. Zero waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 3-parameter tool with nested operation objects and 9 operation types, the description covers the core interaction model (document source, ordering, key references, id-based editing). The relayout op gets its own warning, which is the kind of edge-case disclosure needed. It could detail edge cases for other operations (e.g., what happens with invalid ids), but the description covers the essential for an agent to use it confidently. No output schema, so return-value expectations are not described, but that is acceptable given the complexity-heavy input side.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 67% schema coverage, the description adds meaningful value beyond the schema. It explains that 'document' must be the full Fluyo JSON from create_diagram or a saved .fluyo.json file, clarifies that add_edge's 'from' can reference a temp key from the same call, and explains that existing-element edits use numeric 'id'. The parameter descriptions inside the schema for document and from also add context, though some nested fields remain unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Aplica una lista de operaciones... sobre un documento Fluyo existente') and lists all 9 supported operation types explicitly. It clearly distinguishes from sibling create_diagram by requiring an existing document as input, and the signature of supported operations differentiates it from read/export siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states operations are applied in order, explains add_node can define a temporary 'key' that add_edge references within the same call, and specifies that existing nodes/edges use numeric 'id' from the document JSON. It doesn't explicitly name alternatives or say when NOT to use it, but the target usage (editing an existing document) is clear enough given sibling context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_diagramExportar diagrama Fluyo a SVGARead-onlyIdempotent
Renderiza una página de un documento Fluyo a SVG estático, con las mismas formas, colores, íconos, rellenos, bordes y tipografías que produce 'Exportar → SVG' dentro de la app. Útil para pegar el diagrama en Notion/Confluence/Markdown o previsualizarlo sin abrir Fluyo. No incluye animación (puntos de flujo ni aparición escalonada), igual que el SVG que exporta la app; para el GIF animado hay que abrir el documento en Fluyo. PNG y GIF no están disponibles aquí: necesitan un renderer de canvas.
| Name | Required | Description | Default |
|---|---|---|---|
| crop | No | Si es true, recorta el lienzo al contenido en vez de emitir los 2560×1440 completos. Por defecto false, que es lo que hace la app: así el SVG de aquí y el de 'Exportar' son idénticos. | |
| scale | No | Escala de las dimensiones width/height del SVG resultante. | |
| document | Yes | El documento Fluyo completo (.fluyo.json): el objeto que devuelve create_diagram / edit_diagram, o el contenido de un archivo guardado con Ctrl+S en la app. | |
| pageIndex | No | Índice de página a exportar (por defecto, la página actual). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and idempotentHint=true, so the safety profile is fully covered. The description adds useful context about output format parity with the app's export and the lack of animation. However, with no annotations on return/output schema, it doesn't describe what the SVG output looks like structurally, though the parity statement partially compensates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense, front-loaded sentences covering purpose, use cases, exclusions, and the app-parity guarantee. No wasted words; every clause earns its place. The information about what is NOT available (PNG/GIF, animation) is precisely the disambiguation an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only export tool with 100% schema coverage and clear annotations, the description fully disambiguates the output format, parity guarantee, animation limitations, and use cases. It correctly delegates document structure details to the schema and eliminates ambiguity about which format is being produced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so parameters are documented. The description adds value by explaining the default behavior of crop (matching app parity for identical output) and describing the document parameter as the complete .fluyo.json object referencing sibling tools create_diagram/edit_diagram. This adds context beyond bare schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what it does: renders a Fluyo document page to static SVG with identical shapes, colors, icons, fills, borders and typography as the in-app 'Exportar → SVG'. It identifies the resource (document page), verb (render/export), and output format (SVG), and differentiates from siblings by its format specificity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('útil para pegar el diagrama en Notion/Confluence/Markdown o previsualizarlo sin abrir Fluyo') and when NOT to ('no incluye animación... para el GIF animado hay que abrir el documento en Fluyo'). It also names the alternative path (opening in Fluyo for GIF/PNG) and explicitly states PNG/GIF are unavailable here.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_animsListar GIFs animadosARead-onlyIdempotent
Devuelve las claves válidas para nodos shape='anim'. Son pequeñas animaciones que Fluyo dibuja fotograma a fotograma en el lienzo y en el GIF exportado (un spinner girando, una barra de progreso avanzando, un tick que se traza). En un SVG estático se ve su fotograma de referencia. Sirven para señalar estados —cargando, procesando, error— dentro de un diagrama.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the safety profile is well covered. The description adds meaningful context: that animations are drawn frame-by-frame in the canvas and exported GIF, and that static SVG shows only the reference frame. This adds real behavioral value beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet informative, using exactly three sentences to convey purpose, behavioral detail, and usage context. No wasted words, front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter list tool with strong annotations and no output schema, the description is complete. It explains what's returned (valid keys), what the animations are for, and how they manifest in different outputs. Minor gap: it doesn't describe the exact return format/structure, but for a key-listing tool this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0 parameters and 100% schema coverage, the baseline is 4. There are no parameters to document, and the description correctly explains the output semantics (valid keys) without needing parameter details.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns valid keys for shape='anim' nodes, describing what animated GIFs are (frame-by-frame animations Fluyo draws). It distinguishes from siblings by being specifically about animation keys, complementing list_icons, list_colors, list_fonts which handle other resource types.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains clearly when to use this tool: to get valid animation keys for anim-shaped nodes that signal states (loading, processing, error). It doesn't explicitly name alternatives/exclusions, but the sibling set of list_* tools makes the resource-type distinction implicit and clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_colorsListar colores semánticosARead-onlyIdempotent
Devuelve los nombres de color semántico aceptados en 'color', 'lineColor' y 'dotColor' (también se acepta cualquier hex #rrggbb).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the read-only behavior is covered by structure. The description adds useful context that the tool returns valid values for certain parameters and that hex values are also accepted as an alternative. It doesn't describe return format (list shape, structure) but with no output schema and a read-only, idempotent tool, this is moderate coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that conveys the purpose, the parameter fields where the values apply, and the hex fallback. Zero wasted words. The inclusion of the parenthetical about hex acceptance is valuable because it prevents unnecessary lookup calls when a user already has a hex value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only, idempotent lookup tool with sibling similar tools like list_icons/list_fonts, this description is complete. It explains what values are returned for, where they apply, and when hex bypasses the need for this tool. The only minor gap is not describing the exact format of the returned list, but for a simple listing tool this is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, so the baseline is 4. The description appropriately explains the tool involves no input and describes the applicability of outputs to specific param names. No parameter documentation burden exists since there are no parameters to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns accepted semantic color names used in specific fields ('color', 'lineColor', 'dotColor') and that hex values are also accepted. The verb+resource ('Devuelve los nombres de color semántico') is specific, and while there's no explicit sibling differentiation, the 'list_colors' name and context (`list_icons`, `list_fonts`, etc.) make it clear this is the color-listing tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is used to look up valid color values before passing them to color-related parameters in diagram tools. The sibling tools (create_diagram, edit_diagram) would consume these colors, giving implied context. However, it doesn't explicitly state when to use this vs alternatives or when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_fontsListar tipografíasARead-onlyIdempotent
Devuelve las familias tipográficas que ofrece Fluyo, para el campo 'font' de nodos y aristas. El valor que se guarda en el documento es la familia CSS completa, no el nombre corto. Un nodo sin 'font' hereda la tipografía global del documento.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and idempotentHint=true, so the read-only nature is established. The description adds value beyond annotations by clarifying a critical detail: the value stored in documents is the complete CSS family, not the short name displayed. It also discloses the inheritance behavior for nodes without 'font', which is useful operational context an agent needs to correctly set font values.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences, front-loaded with the primary purpose. Each sentence earns its place: the first states what it returns and for what field, the second clarifies the storage format distinction (CSS family vs short name), and the third explains inheritance behavior. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only listing tool with strong annotations, the description is nearly complete. It explains the return semantics (font families for the 'font' field), a critical storage-format caveat, and inheritance behavior. The only minor gap is that it doesn't explicitly state the return format (e.g., list of names vs objects), but with no output schema available and the tool being a simple listing, the description covers the essential context well.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, so parameter semantics are trivially satisfied. Per the rubric, 0 params = baseline 4. The description appropriately focuses on the return values and their semantics rather than parameters, which is the relevant information for this parameterless listing tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states what the tool does: 'Devuelve las familias tipográficas que ofrece Fluyo' (returns typography families offered by Fluyo). It specifies the resource (font families), the verb (returns/list), and adds scope by noting it's for the 'font' field of nodes and edges, distinguishing it from sibling list tools like list_icons, list_colors, and list_anims.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear usage context: these are the font families for the 'font' field of nodes and edges. It adds the important behavioral note that the stored value is the complete CSS family, not the short name, and that a node without 'font' inherits the global typography. It doesn't explicitly say when NOT to use it versus alternatives, but the purpose is sufficiently distinct from sibling list tools that this is a minor gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_iconsListar íconos disponiblesARead-onlyIdempotent
Devuelve las claves de ícono válidas para nodos shape='icon', agrupadas (General, GCP, AWS, Azure, Estados, Varios). Son los mismos íconos que ofrece el cajón de la aplicación.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, fully covering the safety profile. The description adds useful context that it mirrors the application's drawer icons ('Son los mismos íconos que ofrece el cajón de la aplicación'), confirming parity with UI. It doesn't describe the exact return format, but with a simple read-only list tool and full annotation coverage, this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, dense sentence that packs the resource, the scope restriction, the group structure, and the parity with the UI drawer. It's efficient with no wasted words. Slightly more structure (e.g., separate sentences for groups and parity) could improve scannability, but it's not verbose by any measure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given this is a zero-parameter, read-only, idempotent tool with a fully self-explanatory purpose, the description is largely complete. It covers what's returned, the scope (shape='icon'), and grouping. The only minor gap is the return format (e.g., whether it's a flat list or nested object), but with the grouping enumerated it's reasonably inferable for a competent agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, so there's nothing to document. The description explains what the OUTPUT will be (grouped icon keys), which compensates for the lack of an output schema. Since there are no params, the baseline of 4 applies and the description appropriately focuses on the value/format instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb+resource: 'Devuelve las claves de ícono válidas' (returns valid icon keys) for shape='icon' nodes. It specifies the exact scope (icon keys for shape='icon'), the grouping structure (General, GCP, AWS, Azure, Estados, Varios), and differentiates from siblings since it's the icon-specific list vs list_colors, list_anims, list_fonts, list_templates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states the explicit use context: obtaining valid icon keys for nodes with shape='icon'. The grouping info gives practical usage context. However, it doesn't explicitly state when NOT to use it or name alternatives (e.g., to get color options use list_colors), though the sibling names make this reasonably inferable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesListar templates de diagramasARead-onlyIdempotent
Devuelve los patrones de arquitectura predefinidos disponibles para instanciar con create_from_template.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe read operation. The description adds no behavioral detail beyond the annotation set—no mention of return format, ordering, pagination, or whether results are cached. Given strong annotations, the bar is lower, but the description contributes minimal additional behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single-purpose, single-sentence description that is compact and front-loaded. It could arguably add a brief note about relationship to sibling tools, but as-is it is efficiently written with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with strong annotations (readOnly, idempotent, non-destructive), the description is sufficiently complete. It names the consuming tool (create_from_template), which is the most critical contextual link. No output schema exists, but for a listing tool the description adequately scopes the return semantic (predefined architecture patterns).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and schema coverage is 100%, so there is nothing for parameter semantics to add. Per the rubric baseline, 0 params warrants a 4. The description correctly acknowledges this by not listing any parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States clearly it returns predefined architecture patterns available for instantiation with create_from_template. Verb+resource is specific, and the cross-reference to create_from_template is helpful. However, it doesn't explicitly distinguish from siblings like list_icons, list_colors, list_anims, list_fonts whose names self-evidently clarify their purpose—this one relies on the 'diagram templates' meaning which is reasonably clear in the title.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage (get templates to use with create_from_template), naming the dependent tool. However, it doesn't explicitly state when NOT to use this vs alternatives, and there's no guidance on when you'd pick this over other listing tools. The relationship to create_from_template is the main anchoring guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
The tools are mostly distinct: create/edit/export handle the document lifecycle, list_* tools are metadata queries, and create_from_template is a special creation path. There's slight overlap between create_diagram and create_from_template (both create documents), but their inputs are sufficiently different that confusion is unlikely. Overall clear separation.
The naming follows a mostly consistent verb_noun pattern: create_diagram, edit_diagram, export_diagram, list_icons, list_colors, list_anims, list_fonts, list_templates, create_from_template. The minor inconsistency is 'create_from_template' vs 'create_diagram' — template creation isn't prefixed with 'diagram' — and 'list_anims' uses an abbreviation instead of 'animations'. Otherwise very consistent.
9 tools is well within the ideal 3-15 range. The set breaks into three coherent groups: document creation (create_diagram, create_from_template), document editing (edit_diagram, export_diagram), and metadata lookup (list_icons, list_colors, list_anims, list_fonts, list_templates). Each tool earns its place with no obvious bloat.
The tool surface covers the full document lifecycle: create a diagram from scratch (create_diagram), create from a template (create_from_template), edit it (edit_diagram), and export it (export_diagram). All the lookup needs for valid enum values (icons, colors, anims, fonts, templates) are covered. There's no obvious gap — loading/reading an existing .fluyo.json is handled via edit_diagram which accepts the full JSON document.
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Augments MCP Server - A comprehensive framework documentation provider for Claude Code
Create and manage Mermaid.js flowcharts and diagrams with AI agents via MCP.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
Related MCP Servers
- AlicenseBqualityAmaintenanceAn MCP server that generates beautiful Excalidraw architecture diagrams with perfect auto-layout, stateful editing, and architecture-aware component styling.26146MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server that enables AI assistants to programmatically create and manage flowcharts, ERDs, and swimlane diagrams. It provides tools for manipulating diagram structures, performing auto-layouts, and exporting to Mermaid or Markdown formats.12MIT
- AlicenseBqualityBmaintenanceMCP server that enables LLMs to create and edit draw.io diagrams using high-level intent commands, with automatic layout and styling.483MIT
- FlicenseNot gradedqualityCmaintenanceMCP server that lets Claude (and other MCP clients) create, list, read, update, and delete drawings in ExcaliDash via its REST API. It allows users to create diagrams directly from natural language commands like 'draw a flowchart'.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/itsnect/fluyo-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server