Skip to main content
Glama

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é

create_diagram

Texto → diagrama. Nodos y aristas; si no das x/y, aplica auto-layout por capas.

edit_diagram

Modifica un documento existente con operaciones (añadir, actualizar, borrar, cambiar tema, recalcular layout).

export_diagram

Renderiza una página a SVG estático.

list_templates / create_from_template

Instancia patrones de arquitectura predefinidos (Kafka, RAG, microservicios) con reemplazo de etiquetas.

list_icons

Las 47 claves de ícono, agrupadas (General, GCP, AWS, Azure, Estados, Varios).

list_colors

Los 14 colores semánticos de la paleta.

list_anims

Los 8 GIFs animados para nodos shape:"anim".

list_fonts

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 build

Requiere Node 22.18 o superior.

npm test        # contrato contra los ejemplos reales de Fluyo, tools y renderer

Conectarlo

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

src/index.ts

src/http.ts

Uso

local, el proceso lo lanza el cliente

conector remoto en mcp.fluyo.space

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/mcp

Sin 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 emite

Tamañ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

add_node

key, shape, label, color?, icon?, anim?, estilo…

Añade un nodo. key solo vive durante la llamada, para que add_edge pueda referenciarlo.

update_node

id, …

Actualiza un nodo por su id numérico.

remove_node

id

Elimina el nodo y todas sus conexiones.

add_edge

from, to, …

Crea una conexión. Acepta ids existentes o key de nodos creados en la misma llamada.

update_edge

id, …

Modifica una arista.

remove_edge

id

Elimina una arista.

set_theme

theme

dark, crema o claro.

rename_page

name

Renombra la página.

relayout

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 id numérico. Las key de add_node son 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 Fluyonpm 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_diagram no 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 image puede pasarse de cualquiera de los dos primeros; por stdio no hay ninguno.

  • Los nodos image no 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. Los anim sí 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_diagram reenví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

Dockerfile

Multi-stage: compila con todas las dependencias, y la imagen final solo lleva dist/ y las de producción. Corre como usuario no-root

.dockerignore

Mantiene el contexto de build pequeño; node_modules se reinstala dentro con npm ci

scripts/verify-deploy.sh

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é

OPENAI_APPS_CHALLENGE

Valor que sirve /.well-known/openai-apps-challenge. Sin ella esa ruta da 404, que es lo correcto: un 200 vacío haría pasar por verificado un despliegue mal configurado.

ALLOWED_ORIGINS

los de Claude, ChatGPT y Fluyo

Lista blanca de Origin, separada por comas. Sustituye la lista por defecto, no la amplía. * desactiva la comprobación y es solo para depurar en local.

RATE_LIMIT_PER_MIN

30

Peticiones por IP y por ventana en /mcp.

RATE_LIMIT_WINDOW_MS

60000

Tamaño de la ventana deslizante.

MAX_BODY_BYTES

1048576 (1 MB)

Tope del cuerpo de la petición. Por encima: 413.

MAX_TOOL_RESULT_BYTES

204800 (200 KB)

Tope del resultado de una tool. Por encima se sustituye por un error que explica cómo reducir el diagrama.

FLUYO_APP_URL

https://fluyo.space/

Base de los enlaces #d= que devuelven las tools. Para un self-host o una copia local. Un valor que no sea una URL se ignora.

FLUYO_MCP_LOG

activado

off para silenciar el registro por completo.

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ápido

La 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 posible

En 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=80 no se toca. Es contraintuitivo: bajarlo multiplica el coste. Cada instancia atiende hasta 80 peticiones a la vez; con concurrency=10 harían falta ocho veces más instancias para el mismo tráfico, se toparía antes en max-instances=2 y 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.space

Son 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() en src/http.ts quita 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 de Origin. 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/trailingSlash que pueda estropearlo por defecto.

  • Hay un test (test/http.test.ts) que pide la ruta con redirect: "manual" y exige exactamente 200 y text/plain, y verify-deploy.sh repite 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:8080

El 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 tools
create_diagramCrear diagrama FluyoA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dotsNoCuántos puntos recorren cada arista.
fontNoTipografía global del diagrama. Usa list_fonts; si se omite, Georgia.
gridNo
buildNoSi es true, los nodos aparecen escalonados según 'order' al reproducir la animación.
edgesNo
nodesYes
speedNoVelocidad del flujo animado.
themeNodark
singleNoModo 'pelota única por ruta': en vez de puntos por flecha, una sola pelota recorre el diagrama y se parte en cada bifurcación.
staggerNoSegundos entre la aparición de un nodo y el siguiente cuando build=true.
customBgNoColor de fondo (hex) que sobrescribe el del tema.
pageNameNoPágina 1
autoLayoutNoSi 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

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 templateC
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
themeNo
pageNameNo
templateIdYes
labelOverridesNoEj: {"gateway": "Ingress", "db": "Cloud SQL"}

TDQS

C2.9/5.0
Behavior1/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 FluyoA
Read-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).

ParametersJSON Schema
NameRequiredDescriptionDefault
documentYesEl 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.
pageIndexNoÍndice de página a editar (por defecto, la página actual del documento).
operationsYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SVGA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cropNoSi 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.
scaleNoEscala de las dimensiones width/height del SVG resultante.
documentYesEl 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.
pageIndexNoÍndice de página a exportar (por defecto, la página actual).

TDQS

A4.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 animadosA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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ánticosA
Read-onlyIdempotent

Devuelve los nombres de color semántico aceptados en 'color', 'lineColor' y 'dotColor' (también se acepta cualquier hex #rrggbb).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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íasA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 disponiblesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 diagramasA
Read-onlyIdempotent

Devuelve los patrones de arquitectura predefinidos disponibles para instanciar con create_from_template.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

A3.9/5.0
Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An 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.
    12
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    MCP server that enables LLMs to create and edit draw.io diagrams using high-level intent commands, with automatic layout and styling.
    4
    8
    3
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    MCP 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

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