Skip to main content
Glama
goya02-ops

anylogic-docs

by goya02-ops

anylogic-docs-mcp

Servidor MCP que le da a un agente de IA (opencode, Claude Code, Cursor, Codex…) la documentación real de AnyLogic 8.9 para que consulte en vez de inventar: bloques, propiedades, firmas de la API Java, tutoriales y ejemplos.

Todo se consulta en local: el servidor sólo abre un índice SQLite y unos ficheros Markdown. No hay red en tiempo de consulta.

Solo Unix. Este proyecto está pensado para Linux y macOS. En Windows requiere WSL2 con entorno gráfico (el crawler abre una ventana de navegador). No está probado de forma nativa en Windows.


El problema que resuelve

Sin documentación a mano, un agente improvisa:

— "Para cambiar la prioridad de un Seize, usa seize.setPriority(5)." ❌ Ese método no existe.

Con este MCP, busca primero y cita:

— "Seize tiene el campo priority de tipo double; se define con public double priority(T agent) y cuanto mayor, antes se atiende la tarea. Fuente: https://anylogic.help/api/com/anylogic/libraries/processmodeling/Seize.html"

Eso es todo lo que hace: convierte "creo que la API es así" en "la API es así, aquí está".


Related MCP server: context

Cómo funciona

   anylogic.help  ──crawl──┐
   (964 páginas)           │
                           ├──►  corpus/*.md  ──►  index.db  ──►  servidor MCP  ──►  agente
   javadoc de AnyLogic ────┘     (Markdown)      (SQLite FTS5)      (stdio)
   (1.066 clases)
  1. API — se lee del javadoc que ya viene instalado con AnyLogic (sin red).

  2. Guía — se descarga una vez de anylogic.help (necesita red, ver aviso abajo).

  3. Conversión — todo se normaliza a Markdown limpio: tablas, código, listas de propiedades de cada bloque, imágenes.

  4. Índice — se construye index.db con búsqueda de texto (BM25 de SQLite FTS5, sin embeddings ni modelos).

  5. Servidor — server/main.py expone 7 herramientas MCP sobre ese índice.


Requisitos previos

Esto no es un paquete que se instala y listo: genera tu propia copia local de la documentación. Antes de empezar, comprueba que tienes todo esto.

Requisito

Versión

Cómo comprobarlo

Para qué

Si falta

Sistema operativo

Linux o macOS

uname -s

todo el proyecto

en Windows usa WSL2 con entorno gráfico

Python

3.12 o superior

python3 --version

servidor MCP y conversores

no arranca nada

uv

última

uv --version

crear el entorno e instalar dependencias

el instalador usa python3 -m venv + pip (más lento, funciona igual)

Node.js

20 o superior

node --version

crawler (fetch y WebSocket nativos)

no se puede descargar la guía (queda solo la API)

Chrome / Chromium

120 o superior

node scripts/crawl.mjs --check

abrir la web real y superar Cloudflare

el crawl falla

AnyLogic

8.9.x instalado

debe existir ~/Applications/AnyLogic-8.9.9 (Linux) o /Applications/AnyLogic*.app (macOS)

de ahí salen los javadoc de la API

tendrías guía pero sin referencia de API

Conexión a internet

—

—

descargar anylogic.help (~300 MB)

solo funciona la parte de API, que es offline

Espacio en disco

~1 GB libre

df -h .

venv (60 MB) + HTML (215 MB) + imágenes (76 MB) + índice (40 MB)

el proceso se corta a medias

Entorno gráfico

X11, Wayland o macOS

—

Chromium necesita ventana visible para el challenge

el crawl no pasa Cloudflare

Tiempo total de la primera instalación: 10–15 minutos (API ~1 min, descarga de la guía ~10 min, índice ~1 min).

Navegadores válidos: Chrome, Chromium, Brave o Edge (cualquier binario basado en Chromium). Si no está en el PATH, se indica con ANYLOGIC_CHROME.


Instalación

git clone https://github.com/goya02-ops/anylogic-docs-mcp.git
cd anylogic-docs-mcp
./install.sh

Eso es todo. El script crea el entorno, genera el corpus y el índice, y termina con una verificación automática.

Opciones

Comando

Qué hace

Cuándo usarlo

./install.sh

API + descarga de la guía + índice

instalación normal

./install.sh --api-only

solo API, sin red

ya tienes la guía, o no quieres descargar nada

./install.sh --skip-crawl

reutiliza lo ya descargado en raw/html

reinstalar sin volver a bajar

./install.sh --no-images

descarga la guía sin imágenes

ahorra ~4 minutos y 76 MB

./install.sh --skip-api

solo guía

no tienes AnyLogic instalado

./install.sh --register

registra el MCP en los clientes que detecte

tras instalar

./install.sh --print-config <cliente>

imprime la config con rutas reales

para copiar a mano o a otra máquina

./install.sh --wsl

variante para agente en Windows y repo en WSL

Windows

Qué hace exactamente

  1. Comprueba sistema operativo, Python 3.12+, Node 20+ y el navegador.

  2. Crea .venv e instala mcp[cli], beautifulsoup4 y lxml.

  3. scripts/convert_api.py → lee el javadoc de tu AnyLogic y genera corpus/api/.

  4. scripts/crawl.mjs --images → descarga la guía de anylogic.help en raw/html/.

  5. scripts/convert_guide.py → HTML a Markdown en corpus/guide/.

  6. scripts/build_index.py → construye index.db (~37.000 fragmentos).

  7. scripts/selftest.py → comprobaciones de búsqueda, API y configuración de clientes.

Si no encuentra AnyLogic, aborta y te dice cómo indicar la ruta, porque sin la API el MCP pierde la mitad de su valor. Si sólo quieres la guía, usa --skip-api.


Aviso: la instalación descarga la documentación

La primera ejecución de ./install.sh descarga 964 páginas y unas 3.000 imágenes de anylogic.help (~300 MB). Es una descarga única: después todo se consulta en local, sin internet.

  • Abre una ventana de Chromium. No es un error. Cloudflare bloquea la descarga automática normal, así que el crawler usa un navegador real. Si aparece un challenge ("Just a moment…" / "Un momento…"), complétalo a mano en esa ventana: el script continúa solo.

  • Es reanudable. Si se corta, vuelve a ejecutarlo: salta lo que ya está descargado.

  • Respeta robots.txt y va a ~2 páginas por segundo.

  • Solo una vez por versión de AnyLogic. Cuando actualices AnyLogic, repite ./install.sh.

  • Este repositorio no incluye la documentación. Es de The AnyLogic Company; cada uno genera su copia para uso personal. No la subas ni la redistribuyas.


Registro en el cliente MCP

El servidor habla stdio: todos los clientes hacen lo mismo, lanzar <repo>/.venv/bin/python <repo>/server/main.py. Solo cambia el formato del fichero.

No hace falta escribir rutas a mano: el instalador las conoce.

./install.sh --print-config all      # la config de todos los clientes, con rutas reales
./install.sh --print-config cursor   # solo uno
./install.sh --register              # registra en los clientes que detecte

--register usa la CLI oficial cuando existe (opencode, claude, codex) y, en los demás, fusiona la entrada en su JSON haciendo copia de seguridad (.bak) sin tocar el resto de servidores.

Cliente

Dónde vive

Cómo

opencode

~/.config/opencode/opencode.json

opencode mcp add

Claude Code

~/.claude.json

claude mcp add -s user

Codex CLI

~/.codex/config.toml

codex mcp add o TOML

Cursor

~/.cursor/mcp.json

JSON (mcpServers)

VS Code (Copilot)

~/.config/Code/User/mcp.json

JSON (servers, type: stdio)

Antigravity

~/.gemini/config/mcp_config.json

JSON (mcpServers)

otros

el que sea

JSON mcpServers

opencode

opencode mcp add anylogic-docs --global -- \
  /ruta/a/anylogic-docs-mcp/.venv/bin/python \
  /ruta/a/anylogic-docs-mcp/server/main.py

Comprobar: opencode mcp list → ✓ anylogic-docs connected.

Claude Code

claude mcp add anylogic-docs -s user -- \
  /ruta/a/anylogic-docs-mcp/.venv/bin/python \
  /ruta/a/anylogic-docs-mcp/server/main.py

-s user lo deja disponible en todos los proyectos (-s project lo guarda en .mcp.json del repo). Comprobar: claude mcp list.

Codex CLI

codex mcp add anylogic-docs -- \
  /ruta/a/anylogic-docs-mcp/.venv/bin/python \
  /ruta/a/anylogic-docs-mcp/server/main.py

O a mano en ~/.codex/config.toml:

[mcp_servers.anylogic-docs]
command = "/ruta/a/anylogic-docs-mcp/.venv/bin/python"
args = ["/ruta/a/anylogic-docs-mcp/server/main.py"]

Cursor

~/.cursor/mcp.json (o .cursor/mcp.json dentro de un proyecto):

{
  "mcpServers": {
    "anylogic-docs": {
      "command": "/ruta/a/anylogic-docs-mcp/.venv/bin/python",
      "args": ["/ruta/a/anylogic-docs-mcp/server/main.py"]
    }
  }
}

Luego, en Cursor: Settings → MCP y activa anylogic-docs (a veces hay que pulsar el refresco).

VS Code (Copilot Chat)

~/.config/Code/User/mcp.json (Linux), ~/Library/Application Support/Code/User/mcp.json (macOS) o .vscode/mcp.json en el proyecto:

{
  "servers": {
    "anylogic-docs": {
      "type": "stdio",
      "command": "/ruta/a/anylogic-docs-mcp/.venv/bin/python",
      "args": ["/ruta/a/anylogic-docs-mcp/server/main.py"]
    }
  }
}

Ojo: VS Code usa servers y exige "type": "stdio". Después: Ctrl+Shift+P → MCP: List Servers → arrancar.

Google Antigravity

~/.gemini/config/mcp_config.json (global, compartido por el IDE y la CLI) o <proyecto>/.agents/mcp_config.json (solo ese workspace):

{
  "mcpServers": {
    "anylogic-docs": {
      "command": "/ruta/a/anylogic-docs-mcp/.venv/bin/python",
      "args": ["/ruta/a/anylogic-docs-mcp/server/main.py"]
    }
  }
}

No añadas "type" en este fichero: Antigravity rechaza el campo.

Cualquier otro cliente

Pide el JSON genérico y pégalo donde tu cliente guarde los servidores:

./install.sh --print-config generic

Windows: agente en Windows y repo en WSL

Si el agente corre nativo en Windows pero el repo está dentro de WSL, el comando no es el python de Linux sino wsl.exe:

./install.sh --wsl --print-config cursor     # o claude, codex, vscode...
./install.sh --wsl --distro Ubuntu --register

Genera esto:

{
  "mcpServers": {
    "anylogic-docs": {
      "command": "wsl.exe",
      "args": [
        "-d", "Ubuntu", "--",
        "/home/tu-usuario/anylogic-docs-mcp/.venv/bin/python",
        "/home/tu-usuario/anylogic-docs-mcp/server/main.py"
      ]
    }
  }
}

Funciona, pero stdio a través de wsl.exe es más frágil (arranques lentos, cierres raros). Recomendado: instalar el agente también dentro de WSL y registrarlo ahí sin --wsl.

Si AnyLogic está instalado en Windows, el javadoc se lee desde WSL por /mnt/c:

.venv/bin/python scripts/convert_api.py --anylogic "/mnt/c/Program Files/AnyLogic 8.9.9"

Comprobar que funciona

  1. Reinicia el cliente (no basta con recargar la ventana en algunos).

  2. Pídele: "usa anylogic_version y dime qué tienes indexado".

  3. Debe responder con la versión, el número de páginas y de clases. Si dice que no existe la herramienta, el servidor no arrancó: revisa la ruta del .venv/bin/python y que index.db exista (./install.sh).

Opcional: que el agente sepa cuándo consultar

El MCP da las herramientas, pero no obliga a usarlas. Copia examples/AGENTS.md a tu AGENTS.md (opencode, Codex), CLAUDE.md (Claude Code) o GEMINI.md (Antigravity), o añade el bloque a mano:

## AnyLogic

Antes de afirmar cómo funciona un bloque, una propiedad o una firma de la API:

1. `anylogic_search("términos en inglés")` → `anylogic_read(path, heading)`.
2. Para código: `anylogic_api("Clase.miembro")`. Si no existe, no lo inventes.
3. La documentación está en inglés; responde en español y cita la URL.
4. Este entorno es AnyLogic PLE 8.9.9: hay funciones (export a Java, librerías
   propias, tamaño de modelo) que no están disponibles.

Herramientas

Herramienta

Para qué

Cuándo usarla

anylogic_search(query, scope?, section?, limit?)

búsqueda BM25 en guía + API

siempre, es el punto de entrada

anylogic_read(path, heading?, max_chars?)

lee una página o una sección

tras una búsqueda, para no tragarse la página entera

anylogic_api(symbol, max_chars?)

ficha exacta de clase/método/campo con firma Java

antes de escribir código

anylogic_api_search(query, limit?)

búsqueda acotada a la API

cuando sólo quieres firmas

anylogic_examples(query, limit?)

ejemplos en tutoriales y modelado avanzado

para ver código real de un patrón

anylogic_toc(scope?, section?)

mapa de secciones y paquetes

cuando no sabes dónde vive un tema

anylogic_version()

versión y tamaño del corpus

para comprobar que el índice está generado

scope acepta "guide" (guía de usuario) o "api" (referencia Java).

Ejemplo de uso real

anylogic_search("seize priority")
  → Seize › Task priority (guía) + Seize.priority (API)

anylogic_read("guide/library-reference-guides/process-modeling-library/seize.md",
              heading="Number of units")
  → sección concreta: tipo, valor por defecto, variables locales

anylogic_api("Seize.priority")
  → public double priority ( T agent)
    "The priority of the task for the incoming agent (the larger the higher)."

Cómo busca

BM25 de SQLite FTS5, sin embeddings. Ajustes que importan en la práctica:

  • Nombre de bloque primero. Si la consulta coincide con el título de una página (Seize, ResourcePool, Conveyor), esa página va arriba aunque su texto no repita la palabra.

  • AND y luego OR. Primero exige todos los términos; si no hay nada, relaja.

  • Cobertura. Entre los resultados sube el fragmento que contiene más términos distintos de la consulta, y más si están en el título.

  • Stemmer mínimo. recurring encuentra recurrence, capacities encuentra capacity (FTS5 no trae stemming).

  • Sesgo de guía (×1.25). La guía explica el bloque; la API da la firma.

  • Máximo 2 fragmentos por página, para no repetir la misma fuente.

La documentación está en inglés: busca en inglés (seize capacity, no capacidad de seize).


Mantenimiento

Actualizar a una versión nueva de AnyLogic

./install.sh          # re-descarga lo que falte y regenera todo
./update.sh           # equivalente (alias)

Si sólo cambió AnyLogic y quieres refrescar la API (offline, rápido):

.venv/bin/python scripts/convert_api.py
.venv/bin/python scripts/build_index.py

Reconstruir sólo el índice

.venv/bin/python scripts/build_index.py

Comprobar que todo sigue bien

.venv/bin/python scripts/selftest.py

Variables de entorno útiles

Variable

Para qué

Por defecto

ANYLOGIC_HOME

ruta de la instalación de AnyLogic

autodetectada

ANYLOGIC_CHROME

binario de Chrome/Chromium

autodetectado

ANYLOGIC_CDP_PORT

puerto de depuración del crawler

9333

ANYLOGIC_PROFILE

perfil del navegador

.chrome-profile/

ANYLOGIC_DOCS_HOME

otra copia del corpus/índice

la del repo


Problemas típicos

Síntoma

Causa

Solución

No encontré Chrome ni Chromium

no hay navegador en el PATH

instálalo (sudo dnf install chromium, brew install --cask google-chrome) o export ANYLOGIC_CHROME=/ruta/al/binario

Cloudflare no cedió

challenge no resuelto

complétalo en la ventana abierta; si insiste, rm -rf .chrome-profile y reintenta con --delay 0.5

Chromium no abrió el puerto de depuración

perfil bloqueado o puerto ocupado

rm -rf .chrome-profile y/o ANYLOGIC_CDP_PORT=9336 ./install.sh

No encontré una instalación de AnyLogic

ruta no estándar

.venv/bin/python scripts/convert_api.py --anylogic /ruta/AnyLogic-8.9.9 o export ANYLOGIC_HOME=...

No existe el índice en ...

falta generar el corpus

./install.sh

El cliente no ve la herramienta

servidor mal registrado o sin reiniciar

./install.sh --print-config <cliente> y revisa la ruta absoluta del python

spawn wsl.exe ENOENT

agente en Windows sin WSL en el PATH

instala el agente dentro de WSL, o usa --wsl --distro <tu-distro>

disk I/O error al reconstruir

otra sesión tiene el índice abierto

cierra el agente y reintenta; el índice se reemplaza de forma atómica

Búsquedas en español devuelven poco

la documentación está en inglés

busca en inglés (arrival rate, no tasa de llegada)

Faltan imágenes

enlaces roscos en la propia web de AnyLogic

se registran en logs/image_failures.json; no afecta al texto

El crawl va lento

~2 páginas/s es lo normal

es una descarga única; se puede reanudar


Estructura del repositorio

anylogic-docs-mcp/
├── server/main.py          # servidor MCP (stdio), 7 herramientas
├── scripts/
│   ├── crawl.mjs           # descarga anylogic.help con Chromium por CDP
│   ├── convert_api.py      # javadoc de AnyLogic → Markdown + símbolos
│   ├── convert_guide.py    # HTML → Markdown
│   ├── build_index.py      # corpus → index.db (FTS5)
│   ├── mcp_config.py       # config MCP de cada cliente (imprimir / registrar)
│   └── selftest.py         # comprobaciones de búsqueda, API y config
├── install.sh              # instalación completa (idempotente)
├── examples/AGENTS.md      # bloque para que el agente consulte antes de afirmar
├── NOTICE.md               # aviso: la licencia MIT no cubre la documentación
├── update.sh               # alias de install.sh para actualizar
├── requirements.txt
└── pyproject.toml

Generado en local, no versionado (ver .gitignore):

corpus/          # Markdown de la guía y de la API
raw/             # HTML e imágenes descargados (caché reanudable)
index.db         # índice de búsqueda
.venv/           # entorno Python
logs/            # fallos de crawl e imágenes
.chrome-profile/ # perfil del navegador usado por el crawler

  • Código: MIT (ver LICENSE).

  • Documentación: la guía, el javadoc y las imágenes son propiedad de The AnyLogic Company y están sujetos a sus términos de uso. Este repositorio no los distribuye: los scripts los generan en tu máquina a partir de tu propia instalación de AnyLogic y del sitio público anylogic.help, para uso personal. Detalle en NOTICE.md.

  • No redistribuyas corpus/, raw/ ni index.db.

  • El crawler respeta robots.txt y va deliberadamente despacio.

Available Tools

7 tools
anylogic_apiB

Devuelve la ficha exacta de una clase, método o campo de la API Java.

Args: symbol: nombre simple ("Seize"), cualificado ("com.anylogic.libraries.processmodeling.Seize") o miembro ("Seize.take", "Agent.getEngine").

NameRequiredDescriptionDefault
symbolYes
max_charsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It states that it returns the exact API record, but does not disclose what happens for unknown or ambiguous symbols, or that max_chars may truncate the response.

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 front-loaded and efficient: one sentence states the operation, followed by a compact args section that explains the accepted symbol formats. There is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return values, and the symbol parameter is well explained. However, the lack of annotations, undocumented max_chars behavior, and absence of error/ambiguity handling leave meaningful gaps for an agent to infer.

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 0%, so the description must compensate. It does a good job explaining accepted symbol formats (simple, qualified, member), but it entirely omits the optional max_chars parameter and its truncation behavior.

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 and resource: it returns the exact record for a Java API class, method, or field. This is clear enough to distinguish the operation from generic library browsing, though it does not explicitly contrast itself with the sibling anylogic_api_search.

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?

Usage is implied by the requirement to supply a symbol name, and the examples make clear this is for known API symbols. However, there is no explicit guidance on when to use this versus anylogic_api_search or anylogic_search, nor are exclusions or alternatives stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

anylogic_examplesB

Busca ejemplos y fragmentos de código en tutoriales y modelado avanzado.

Args: query: concepto o API, p.ej. "resource pool animation", "statechart transition". limit: número máximo de resultados.

NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It implies a search/read operation through the verb "Busca" and explains the limit parameter, but says nothing about matching semantics, result ordering, coverage of tutorials, or safety/rate-limit behavior beyond what the schema already 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 short and front-loaded: the purpose is stated first, followed by clear argument notes. There is little waste, though the Args section could be slightly more formal in structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and both parameters are covered. However, for a search tool in a family of sibling search tools, the description lacks crucial routing context: exactly what content corpus it searches and how that differs from anylogic_search or anylogic_api_search.

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 0%, so the description must compensate, and it does reasonably well: query is explained as a concept or API with concrete examples like "resource pool animation" and "statechart transition," and limit is described as the maximum number of results. It adds meaningful semantics beyond the bare parameter names.

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 a specific verb ("Busca") and resource ("ejemplos y fragmentos de código en tutoriales y modelado avanzado"), making the tool's domain clear. It is distinguishable from generic sibling searches by its emphasis on examples and snippets, though it does not explicitly name the sibling tools it differs from.

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?

Usage is implied by the mention of tutorials and advanced modeling, suggesting it is for finding illustrative examples rather than general documentation. However, there is no explicit guidance on when to use this instead of anylogic_search, anylogic_api_search, or anylogic_toc, and no exclusions are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

anylogic_readA

Lee una página o una sección concreta del corpus.

Args: path: ruta relativa devuelta por anylogic_search, p.ej. "guide/anylogic/3d/3d-object.md" o "api/com/anylogic/engine/Agent.md". heading: si se indica, devuelve sólo esa sección (coincidencia parcial). max_chars: recorte máximo del resultado.

NameRequiredDescriptionDefault
pathYes
headingNo
max_charsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. 'Lee' conveys a read-only operation, and it usefully discloses heading partial-matching and max_chars truncation behavior. It does not mention what happens on an unknown path (error vs empty) or result pagination, which for an unannotated tool is a gap.

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?

One-sentence purpose is front-loaded, followed by a compact per-argument list. No filler. The Args block is standard and each line 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?

An output schema exists, so return-value explanation is unnecessary, and all three parameters are documented in prose. For a simple read tool this is nearly complete; only edge-case behavior (missing path, heading not found) is left unstated.

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 coverage is 0%, so the description must compensate, and it does document all three parameters with meaning beyond the schema: path format with concrete examples, heading as a partial-match section filter, and max_chars as an output truncation cap. It omits the max_chars default (12000) and valid ranges, keeping it from a 5.

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 a specific verb+resource: 'Lee una página o una sección concreta del corpus.' Clear what it does and that it operates on a path within the corpus. It distinguishes itself implicitly from anylogic_search by referencing the paths that search returns, but never names siblings explicitly.

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?

'path: ruta relativa devuelta por anylogic_search' implies the workflow (search first, then read). However, there is no explicit 'use this when' guidance and no differentiation from anylogic_api, anylogic_examples, or anylogic_toc for similar content retrieval.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

anylogic_tocA

Mapa de la documentación: secciones, paquetes y páginas disponibles.

Args: scope: "guide" o "api". Vacío = resumen de ambos. section: para la guía, prefijo de sección a detallar (p.ej. "anylogic/process-modeling-library"). Para la API, un paquete.

NameRequiredDescriptionDefault
scopeNo
sectionNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses useful behavior — an empty scope returns a combined summary of guide and API — and implies a read-only enumeration, but says nothing about output size, whether the API map is paginated, or how deep the tree goes, which matters for a documentation index that can be large.

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?

A one-line purpose sentence followed by tight per-parameter notes; the most important framing (what the tool returns) is front-loaded and every line earns its place. The Args block leans on an indented list rather than prose, which is efficient but slightly less scannable.

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?

An output schema exists, so return-value explanation is unnecessary, and both of the two parameters are documented semantically. For a low-complexity, zero-required-parameter index tool with an output schema, this is essentially complete; only the section/scope interaction is left unstated.

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 coverage is 0%, so the description must compensate and largely does: it gives the allowed values for scope ('guide' or 'api'), explains the empty default, and clarifies that section is a section prefix for the guide but a package name for the API — a distinction the schema does not carry at all. Minor gap: it does not say whether section is ignored or errors when scope is empty.

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 a specific resource: an index of the documentation containing sections, packages and available pages — an agent immediately understands this is a table-of-contents enumeration rather than content retrieval. It does not explicitly name the sibling tools it replaces (anylogic_read, anylogic_search), so the distinction is inferable but not stated.

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?

Usage is only implied: the tool is a map, so an agent infers it should be called first to discover structure before reading. There is no explicit 'use this instead of anylogic_search when...' statement, nor any prerequisite or coverage caveats beyond the default-behavior note that an empty scope returns a summary of both.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

anylogic_versionA

Versión del corpus, número de documentos y fecha de construcción.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the behavioral burden. It discloses the returned metadata fields, implying a safe read-only operation, but it does not explicitly state side effects, auth needs, or freshness guarantees. The output schema covers return shape, which lowers the bar.

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 compact sentence with no filler. It front-loads the key returned values and is appropriately sized for a zero-parameter metadata tool.

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 simple zero-parameter metadata tool with an output schema, the description is nearly complete because it identifies the returned metadata. The only small gap is the lack of explicit usage context relative to sibling tools.

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?

This tool has zero parameters, so there are no parameter semantics to explain. The baseline for a 0-parameter tool is 4, and the description adds no parameter-related confusion.

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 names three specific metadata outputs: corpus version, document count, and build date. The resource is clear, though it does not explicitly distinguish itself from sibling tools such as anylogic_search or anylogic_toc.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description only lists returned fields and gives no guidance on when to use this tool versus alternatives. An agent must infer that this is a corpus metadata lookup rather than a content retrieval or search operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv1.0.0
    • First observedanylogic_api
    • First observedanylogic_api_search
    • First observedanylogic_examples
    • First observedanylogic_read
    • First observedanylogic_search
    • First observedanylogic_toc
    • First observedanylogic_version

TDQS

A3.7/5.0

Scored across 7 tools

Disambiguation4/5

Each tool has a mostly distinct role: read, search, exact API lookup, API search, examples search, TOC, and version. The main possible confusion is between anylogic_search with scope=api and anylogic_api_search, but the descriptions clarify that the latter targets Java class/method signatures.

Naming Consistency3/5

All names use the same anylogic_ prefix and lowercase snake_case, which is predictable. However, the suffixes mix verbs (read, search) with nouns (api, examples, toc, version), so the set does not follow a consistent verb_noun convention.

Tool Count5/5

Seven tools is well scoped for a documentation/API search server. Each tool covers a distinct retrieval mode: search, read, API lookup, example search, TOC, and corpus metadata.

Completeness5/5

The surface covers the full documentation workflow: discovering structure via TOC, searching guides/API/examples, reading pages or sections, and retrieving exact Java symbols. Version metadata is also present, leaving no obvious dead ends for the stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers