ETABS MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ETABS MCP ServerCheck modal mass participation and tell me if it meets 90%"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
ETABS MCP Server
Servidor MCP que conecta un agente (OpenCode, Claude Desktop, Claude Code, Cursor…) con un modelo CSI ETABS abierto, usando la API COM oficial.
Le hablas en lenguaje natural y el agente busca el método correcto de la API, escribe el código, lo ejecuta contra tu modelo y te devuelve los resultados. Sin scripts, sin buscar firmas de métodos a mano.
Este repositorio es un fork mantenido de Shekh-Muhsen/ETABS-MCP v2.1.0 (MIT), con el arreglo de compatibilidad para mcp >= 2.3 y documentación de instalación en español. Ver créditos.
Qué puedes pedirle
Área | Ejemplo de prompt |
Sismo | "Verifica la participación de masa modal, ¿cumple el 90%?" |
Derivas | "Extrae las derivas de entrepiso para los combos sísmicos y marca lo que pase h/400" |
Cortante basal | "¿Cuál es el cortante basal en EQX y EQY?" |
Resultados | "Corre el análisis y saca las fuerzas de los piers en todos los pisos" |
Diseño | "Corre el diseño de concreto y muéstrame los DCR más desfavorables" |
Espectro | "Escala el espectro por 0.85 del cortante estático y vuelve a correr" |
Auditoría | "Lista todas las secciones de frame usadas y sus asignaciones" |
Related MCP server: ETABS MCP Server
Requisitos
Requisito | Versión |
Sistema operativo | Windows 10/11 (64 bits) |
CSI ETABS | 21.0 o superior, instalado. El MCP puede abrirlo y preparar un archivo nuevo |
Cliente MCP | OpenCode, Claude Desktop, Claude Code, Cursor, etc. |
Python (solo si compilas) | 3.11+ |
No necesitas abrir ETABS ni cargar un archivo de antemano.
prepare_sessionabre ETABS y prepara un modelo guardado mediante su API COM, sin ratón, teclado nicomputer-use. Si ETABS solicita iniciar sesión, el usuario completa esa autenticación.La conexión es por COM (
ETABSv1), así que no funciona en Linux/macOS ni sin ETABS instalado.
Instalación
Instalación automática (recomendada, un comando)
irm https://raw.githubusercontent.com/david-mamani/etabs-mcp/main/install.ps1 | iexQué hace:
Descarga
etabs-mcp.exedel último release.Lo deja en
%LOCALAPPDATA%\etabs-mcp\etabs-mcp.exe(si el binario está en uso, lo reemplaza en caliente).Respalda tu
opencode.jsony registra el servidoretabs(si ya existe, solo actualiza la ruta).Prueba que el ejecutable arranque.
Ejecuta una prueba real con ETABS: abre ETABS, crea un archivo
.EDB, lo analiza y lo guarda.Comprueba el conector MCP (
etabs-mcp.exe --status) contra ese ETABS y lo deja abierto.
No requiere permisos de administrador. Opciones: -InstallDir, -ConfigPath, -SkipConfig, -SkipSelfTest y -ExpectedSha256 (si lo corres desde un archivo en vez de irm).
Prueba automática de instalación
Al terminar, el instalador ejecuta etabs-mcp.exe --self-test. Esa prueba:
Abre una instancia nueva de ETABS (no toca un modelo que ya tengas abierto).
Crea un modelo de 2 pisos, 12 nodos y 16 frames (columnas y vigas de 6 × 6 m).
Asigna la sección rectangular
SMOKEde 0.40 × 0.40 m a las 16 barras y confirma cada asignación.Aplica una carga vertical y una horizontal, corre el análisis y verifica las reacciones en la base.
Guarda el archivo en
%LOCALAPPDATA%\etabs-mcp\smoke-test\etabs-mcp-smoke.EDB.Deja ETABS abierto con el modelo de prueba.
Después ejecuta etabs-mcp.exe --status --pid <PID> --expected-model <archivo>, con los datos del informe JSON de la prueba. Comprueba el mismo proceso y archivo por el camino que usa el servidor MCP. El resultado se imprime como PASS, FAIL o SKIP (si ETABS no está instalado), con una línea MCP y otra ETABS. El archivo de prueba queda en disco para que lo abras cuando quieras. También puedes correrlo a mano:
& "$env:LOCALAPPDATA\etabs-mcp\etabs-mcp.exe" --self-test
& "$env:LOCALAPPDATA\etabs-mcp\etabs-mcp.exe" --statusLa prueba necesita ETABS 21+ instalado y una licencia disponible. No requiere Python ni permisos de administrador.
Que lo instale una IA
Pega esto en OpenCode, Claude Code o cualquier agente con terminal:
Instala este MCP en mi PC: https://github.com/david-mamani/etabs-mcp
Cuando termine, deja ETABS abierto y pregúntame qué quiero modelar.El agente corre el instalador, que descarga el .exe, respalda el opencode.json, registra el servidor, abre ETABS, crea y analiza el modelo de prueba, comprueba el conector MCP y deja ETABS abierto. No hay pasos manuales.
El flujo completo es:
Das el prompt.
Se instala el MCP.
Se abre ETABS y se comprueba el conector MCP.
ETABS se queda abierto y el agente escribe en el chat:
pásame una imagen de lo que quieras modelar y lo modelaré en ETABSOpción A — Claude Desktop (un solo archivo)
Descarga
etabs-mcp.mcpbdesde Releases.Abre Claude Desktop → Settings → Extensions.
Arrastra el
.mcpbsobre la ventana (o "Install from file").Abre ETABS con un modelo.
Nueva conversación: pídele que llame a
discover_api.
Opción B — OpenCode / cualquier cliente con config JSON
Descarga etabs-mcp.exe del release y guárdalo, por ejemplo, en C:\Tools\etabs-mcp\etabs-mcp.exe.
En opencode.json (global: ~/.config/opencode/opencode.json):
{
"mcp": {
"etabs": {
"type": "local",
"command": ["C:\\Tools\\etabs-mcp\\etabs-mcp.exe"],
"enabled": true
}
}
}En Claude Desktop (claude_desktop_config.json), el mismo binario en modo stdio:
{
"mcpServers": {
"etabs": {
"command": "C:\\Tools\\etabs-mcp\\etabs-mcp.exe",
"args": []
}
}
}Reinicia el cliente y llama a list_instances. Si hay varias ventanas, pasa el alias elegido a get_status y execute_code. Cada alias conserva su PID; una conexión fallida nunca selecciona otra ventana.
Opción C — Desde código fuente
git clone https://github.com/david-mamani/etabs-mcp.git
cd etabs-mcp
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -e .
# stdio (clientes MCP)
etabs-mcp
# HTTP local con bearer token (opcional)
etabs-mcp --transport http --port 18121 --token <tu-token>
# Prueba automatica con ETABS (crea, analiza y guarda un modelo, deja ETABS abierto)
etabs-mcp --self-test
# Comprueba que el MCP puede hablar con el ETABS abierto
etabs-mcp --statusLimitar acceso a archivos
Por defecto el servidor solo puede leer/escribir en los directorios que le permitas explícitamente con --allowed-dirs:
etabs-mcp --allowed-dirs "C:\Proyectos\Edificio" "C:\Export"Herramientas expuestas
Herramienta | Qué hace |
| Lista las skills disponibles. Llamar primero. |
| Carga una o más skills por nombre (guía paso a paso). |
| Instancias de ETABS abiertas (alias, PID, archivo, versión). |
| Estado de la conexión, versión de ETABS, si el modelo está bloqueado, versión del servidor. |
| Abre ETABS y prepara un modelo. |
| Lee nodos, barras, áreas, huecos y pisos en metros sin cambiar unidades ni resultados. |
| Genera PNG de planta, elevación y 3D desde la geometría de la API. Devuelve la imagen al chat sin acceder al escritorio. |
| Ejecuta Python en un sandbox contra el |
| Búsqueda BM25 sobre 1 407 métodos y propiedades de la API de ETABS. |
Sandbox: el código corre restringido — sin import, sin acceso al sistema de archivos, sin shell. Solo están disponibles model (SapModel), json y math. Todo el procesamiento es local; no se envía nada a la nube.
Empezar sin controlar el escritorio
Para crear un edificio, llama primero a prepare_session(new_model=True, stories=5) y usa el alias devuelto en execute_code. Puedes indicar alturas, número de ejes y separaciones en metros. El archivo se guarda en una carpeta única dentro de %USERPROFILE%\Documents\ETABS-MCP; no hace falta copiar una plantilla fija.
Para obtener imágenes usa render_model_view(view="3d"), render_model_view(view="elevation") o render_model_view(view="plan", story="Story3"). Son dibujos de la geometría real leída desde ETABS, no capturas de su ventana. El MCP no accede al escritorio, al ratón, al teclado ni a menús. Las imágenes no incluyen texturas ni resultados de cálculo; se guardan con nombres únicos en Documents/ETABS-MCP/exports. Consulta el alcance y la referencia funcional.
Con new_model=False, un archivo cargado o un modelo con geometría se conserva. Una sesión vacía y sin guardar recibe un modelo nuevo. La herramienta no inicializa un archivo existente, aunque esté vacío.
La API COM de ETABS 23.3.2 solo expone RefreshView y RefreshWindow para las vistas. Crear ventanas de planta/elevación y distribuirlas con ChatGPT es una operación manual. El MCP informa este límite y no recurre a computer-use. Organizar la pantalla no es necesario para crear, modificar o analizar el modelo.
Skills incluidas (47)
Familia | Contenido |
Núcleo ETABS |
|
Tablas y utilidades |
|
Flujos de trabajo |
|
Cargas y combos |
|
Normas |
|
Agregar skills sin recompilar
Crea una carpeta etabs_skills\ junto al .exe, con una subcarpeta por skill y un SKILL.md dentro:
etabs-mcp.exe
etabs_skills\
mi-skill\
SKILL.md---
name: mi-skill
description: Qué hace, en una línea
---
# Mi Skill
...instrucciones para el agente...El servidor reescanea esa carpeta en cada discover_api.
Compilar el ejecutable
pip install pyinstaller rank_bm25 numpy fastmcp uvicorn comtypes pywin32 packaging
# exe -> dist\etabs-mcp.exe y paquete -> etabs-mcp.mcpb
.\build.ps1
# Solo empaquetar (reusa dist\etabs-mcp.exe)
.\build.ps1 -SkipPyInstaller
# Compilar y copiar a la extensión de Claude Desktop
.\build.ps1 -InstallLa versión del manifest.json se sincroniza automáticamente desde src/etabs_mcp/version.py (SERVER_VERSION).
Estructura
src/etabs_mcp/
main.py ← entrada CLI (stdio / http)
server.py ← herramientas MCP, búsqueda BM25, lifespan
version.py ← SERVER_VERSION (fuente única)
connection.py ← conexión COM, InstanceRegistry
skills.py ← SkillsManager (descubrimiento + sidecar)
sandbox/executor.py ← sandbox de Python restringido
file_io/ ← helpers CSV/XLSX y validación de rutas
etabs_skills/ ← 47 skills en Markdown
etabs_api_index.json ← índice de 1 407 métodos y propiedades de la API
mcpb/
etabs-mcp.spec ← spec de PyInstaller
manifest.json ← manifiesto del paquete .mcpb
build.ps1 ← build + empaquetado en un comando
install.ps1 ← instalador de un comando (exe + opencode.json)
build_api_index.py ← índice desde el CHM de ETABS
build_api_index_typelib.py ← índice desde ETABSv1.tlbRegenerar el índice de la API
py build_api_index_typelib.py --merge
.\build.ps1 -SkipPyInstallerLimitaciones conocidas
Problema | Solución |
| Usar los métodos del modelo (p. ej. |
Resultados tras abrir un | Desbloquear → fijar flags → |
| Usar el índice de fila |
Modelos grandes analizados desde MCP | Correr el análisis desde la UI de ETABS (F5); COM puede expirar |
| No desbloquear entre |
Créditos
Proyecto original: Shekh-Muhsen/ETABS-MCP (MIT).
Este fork: David Mamani — agrega compatibilidad con
mcp >= 2.3, limpia artefactos del repo y documenta la instalación en español.CSI, ETABS y SAP2000 son marcas de Computers & Structures, Inc. Este proyecto no está afiliado ni respaldado por CSI.
Licencia
MIT — ver LICENSE. Puedes usarlo, modificarlo y redistribuirlo conservando el aviso de copyright original.
Diagnóstico y contratos de la API
list_instances enumera los PID reales, incluidos procesos en la pantalla de inicio o sin conexión disponible. No incluye etabs-mcp.exe.
get_status devuelve connected para la conexión COM y model_ready para un modelo legible con archivo o geometría. model_state distingue loaded, unsaved, empty y unavailable. model_empty indica si no hay nodos, barras ni áreas. Un modelo vacío puede recibir instrucciones de creación mediante execute_code; el diagnóstico no bloquea esa operación.
Con varias instancias, selecciona un alias explícito. Desde la terminal puedes usar etabs-mcp --status --pid 1234 --expected-model "C:\Proyectos\modelo.edb". El archivo de trabajo .$et se acepta solo si coincide la carpeta y el nombre del .edb esperado.
La prueba inicial espera hasta cinco minutos si ETABS solicita iniciar sesión. Completa la autenticación manualmente. Si ETABS se reinicia, la prueba solo acepta un nuevo proceso vacío y falla si la selección es ambigua.
El índice y los valores de enumeración se validaron con la biblioteca de tipos de ETABS 23.3.2. Para regenerarlos y actualizar las referencias de las guías:
python build_api_index_typelib.py --etabs-version 23.3.2 --update-guidesEl archivo src/etabs_mcp/etabs_api_metadata.json registra la versión, el SHA-256 de la biblioteca y las enumeraciones. Los parámetros inout aparecen tanto en los argumentos como en la respuesta. En creación de barras o áreas, conserva Name="" antes de PropName. AreaObj.AddByCoord devuelve las coordenadas, el nombre del área y el código de retorno: usa respuesta[-2] para el nombre.
Available Tools
9 toolsdiscover_apiDiscover API and skillsARead-onlyIdempotent
Discover available API guidance and skills.
Call this FIRST before using other etabs-mcp tools.
Then use read_skills with one or more specific skill names to load full guidance.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so safety characteristics are covered; the description adds the genuinely new behavioral fact that this must precede other tool usage. It does not state what the response contains (the candidate skill names), though an output schema exists to carry that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, with the mandatory-first instruction front-loaded ahead of the follow-up step. No filler and nothing restates the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter discovery tool with an output schema and read-only annotations, the description supplies the one thing structured fields cannot: mandatory call ordering and the read_skills handoff. The remaining gap is the relationship to search_docs and whether discovery results persist across calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; nothing about argument semantics needs explaining. The description correctly implies no inputs are required by instructing the agent to just call it first.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (discover API guidance and skills) and implicitly distinguishes itself from read_skills by describing discovery vs. loading. It does not clearly distinguish itself from the sibling search_docs, which also appears to be a lookup-style tool, so an agent must infer which discovery path applies.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes ordering ('Call this FIRST before using other etabs-mcp tools') and names the follow-up step with read_skills, which is exactly the routing an agent needs. It omits any exclusion, such as whether it is safe to skip once skills were already discovered earlier in a session, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_codeExecute Python codeADestructive
Execute Python code in a sandbox against the ETABS COM API (call discover_api and read_skills first).
The sandbox provides a pre-connected model variable (SapModel) and optional input_data
(if input_data_path is provided), plus json and math modules.
import statements, dir(), getattr(), and dunder access are BLOCKED.
The last expression value or an explicit result = ... assignment is returned.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Python source code to execute. Use ``model`` (SapModel) to interact with ETABS. | |
| instance | No | Alias from ``list_instances`` (e.g. ``etabs1``). Omit when only one instance runs. | |
| overwrite | No | Allow overwriting an existing output file. | |
| input_data_path | No | Path to a ``.csv`` or ``.xlsx`` file. Content is injected as immutable ``input_data``. | |
| output_data_path | No | Path to write the ``result`` value as ``.csv`` or ``.xlsx``. ``result`` must be a list-of-lists (flat) or dict of sheet dicts (multi-sheet). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds meaningful sandbox behavior beyond the annotations: blocked imports, dir(), getattr(), and dunder access, plus how model, input_data, json, and math are provided. It also explains the return mechanism, though it does not cover error handling or timeout behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three tight sentences, front-loads the core action, and includes only operationally useful constraints. No sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the annotations, full schema coverage, and output schema, the description supplies the key sandbox constraints and execution model an agent needs. It is complete enough for a destructive code-execution tool whose schema already documents instance, overwrite, and output paths.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter documentation is already strong. The description still adds useful semantics for code execution by explaining the pre-connected model variable, optional input_data injection, and result return path.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: execute Python code in a sandbox against the ETABS COM API. It also names prerequisites (discover_api and read_skills first), which helps an agent distinguish this from simpler API-discovery siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear prerequisite to call discover_api and read_skills first before using this tool. It does not explicitly say when to choose this over siblings like get_model_geometry, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_model_geometryRead model geometry through the APIARead-onlyIdempotent
Read point, frame, area, opening and story geometry in metres.
Preserves model units, lock, analysis results and all ETABS windows. Uses only the COM model API. Never reads or controls the desktop.
| Name | Required | Description | Default |
|---|---|---|---|
| instance | No | ||
| max_objects | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent and closed-world, so the description earns credit for going further: it discloses the non-destructive side effects (locks, analysis results and ETABS windows preserved) and the access mechanism (COM API only, no desktop control). That is exactly the context an agent needs to trust the call in a headless workflow, though the read-in-metres vs preserve-model-units phrasing is slightly ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the payload types and followed by the two behavioral guarantees. No filler and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the safety profile is well covered. However, for a tool that can silently cap results at 20,000 objects, the absence of any note on `max_objects` or truncation leaves a real operational gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description mentions neither `instance` nor `max_objects`. The 20000 default on max_objects strongly suggests a truncation or pagination cap that an agent must understand before relying on results, and nothing here explains it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (read) and enumerates the exact resource types (point, frame, area, opening, story geometry) plus the unit (metres). This clearly separates it from render_model_view, though the description never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the data-extraction path rather than the visual-rendering one, but no alternative is named and no when-not condition is given. The 'never reads or controls the desktop' line is a constraint, not a selection guideline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_statusGet ETABS instance statusARead-only
Check the connection to an ETABS instance.
Pass instance (alias from list_instances) to target a
specific instance. Omit it when only one instance is running.
Returns connection state, ETABS version, model path, and lock status.
| Name | Required | Description | Default |
|---|---|---|---|
| instance | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, and the description adds value by naming the returned fields (connection state, version, model path, lock status). It says nothing about failure behavior when no instance is connected, and the idempotentHint=false flag goes unexplained.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs: purpose first, then parameter behavior, then return contents. No filler and nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-optional-parameter read tool with annotations and an output schema, the description covers purpose, parameter semantics, and a summary of returns. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must carry the parameter, and it does: it identifies ``instance`` as an alias from list_instances, states its targeting purpose, and specifies the omit case for the null default. Only the accepted alias format is left unstated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check the connection to an ETABS instance') and lists the concrete outputs, so the agent knows exactly what it gets. It implicitly separates itself from list_instances by treating that tool as the source of the alias, but never states the distinction explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear conditional rule: supply ``instance`` to target a specific instance, omit it when only one is running. That resolves the main ambiguity of a single optional parameter, though it offers no guidance on when to call this versus siblings like prepare_session or list_instances.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_instancesList running ETABS instancesARead-only
List all running ETABS instances.
Returns a list of instances with their alias, process ID, currently
open file path, and ETABS version. Call this before execute_code
when multiple ETABS instances may be running. The alias
(e.g. etabs1) is stable for the server session.
If a version is below the minimum supported (21.0.0), a warning
field is included with details.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description adds genuinely new behavior: alias stability across the server session and a conditional warning field when a version falls below 21.0.0. It does not discuss ordering or performance, but for a zero-arg read those are non-issues.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short paragraphs, front-loaded with purpose, then usage, then edge case — nothing wasted. The enumeration of return fields partially duplicates the output schema, which is the only minor redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not detail the return shape, yet it still flags the one non-obvious behavior (version warning) and the key operational fact (stable alias). Combined with annotations and zero params, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters, so there is nothing to disambiguate; the baseline of 4 applies. The description instead spends its words on the returned alias and version semantics, which is the right trade-off.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ("List all running ETABS instances") and immediately enumerates what each entry contains, so an agent knows exactly what it gets back. It is unambiguous against siblings like get_status or get_model_geometry, which do not enumerate running processes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the call condition — "Call this before execute_code when multiple ETABS instances may be running" — and names the sibling that depends on it. There is no explicit when-not clause, but the conditional phrasing strongly implies the single-instance case does not require it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_sessionOpen ETABS and prepare a model without desktop automationA
Open ETABS if needed and prepare a usable session, without computer-use.
Call this before creating geometry on the Start Page or when ETABS is closed. For a NEW building use new_model=True (omit instance): it opens a separate ETABS process, creates the requested grid in metres, and saves a unique model. Existing files and unsaved geometry are never reset or overwritten. With new_model=False a loaded model is returned unchanged; an empty, unsaved session receives a new grid and unique file automatically. This tool does not click, type, arrange other apps, or create view windows. If ETABS needs authentication, the user completes that sign-in manually.
| Name | Required | Description | Default |
|---|---|---|---|
| stories | No | ||
| instance | No | ||
| new_model | No | ||
| spacing_x | No | ||
| spacing_y | No | ||
| grid_lines_x | No | ||
| grid_lines_y | No | ||
| story_height | No | ||
| first_story_height | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false, destructiveHint=false, idempotentHint=false, openWorldHint=false. The description adds real substance beyond that: existing files and unsaved geometry are never reset or overwritten, a new model is saved under a unique file, new_model=True spawns a separate ETABS process, the tool performs no clicking/typing/window creation, and authentication is completed manually by the user.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then the when-to-use condition, then the mode branching — a sensible order. A few clauses restate the title's 'without desktop automation' point ('does not click, type, arrange other apps, or create view windows'), which is mild redundancy but still earns some place as a scope boundary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be described, and safety behavior is well covered. However, for a 9-parameter tool with zero schema descriptions, the description leaves the geometric parameters and the meaning of 'instance' (a sibling list_instances exists) unaddressed, so an agent must guess how to target an existing process.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 9 parameters, so the description must compensate. It explains the two decision-critical parameters well (new_model and omitting instance) and supplies the unit ('grid in metres') for the grid parameters, but stories, spacing_x/spacing_y, grid_lines_x/grid_lines_y, story_height and first_story_height are never individually explained, nor is it stated whether the grid parameters are ignored when new_model=False on a loaded model.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: opens ETABS if needed and prepares a usable session, with the distinguishing constraint 'without computer-use'. That constraint separates it cleanly from siblings like execute_code and render_model_view, so an agent can pick it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use: 'Call this before creating geometry on the Start Page or when ETABS is closed.' It then branches the usage by mode — new_model=True (omit instance) for a new building, new_model=False for a loaded model — which is exactly the decision an agent must make.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_skillsRead ETABS skillsARead-onlyIdempotent
Read one or more skills by name.
Use discover_api first to list available skills.
Each skill provides domain-specific guidance (e.g. analysis, geometry, loads).
| Name | Required | Description | Default |
|---|---|---|---|
| skills | Yes | List of skill names to read. Use ``discover_api`` to see available skills. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds useful context that the returned content is domain guidance, but says nothing about behavior for unknown skill names or the size/shape of returned content (an output schema exists, so that is partially excused).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and followed by the prerequisite. Minor redundancy in repeating the discover_api pointer that the parameter schema also carries.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required parameter, full schema coverage, annotations, and an output schema, the description covers the essential call path plus the prerequisite lookup. Only error behavior for invalid skill names is left unstated, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is documented as a list of skill names with a pointer to discover_api. The description adds no format, casing, or multiplicity guidance beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("Read one or more skills by name") and clarifies what a skill contains (domain-specific guidance for analysis, geometry, loads). It is distinguishable from siblings like search_docs, though it never explicitly contrasts with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite: "Use ``discover_api`` first to list available skills," which routes the agent to the correct sibling before calling this one. It stops short of stating exclusions or what to do if a named skill is unavailable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_model_viewRender model views without desktop accessA
Generate and return a PNG from ETABS API geometry, with no screen access.
For a plan specify an exact story such as Story3. Other views are 3d and a frontal elevation. Saves a unique PNG under Documents/ETABS-MCP/exports. These are API-derived drawings, NOT screenshots of ETABS's windows. No clicks, keys, focus changes, menus or native view window changes occur.
| Name | Required | Description | Default |
|---|---|---|---|
| view | No | 3d | |
| story | No | ||
| width | No | ||
| height | No | ||
| instance | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety flags (readOnlyHint=false, idempotentHint=false, destructiveHint=false); the description adds genuinely new context: output format is a PNG (drawing, not screenshot), the file is saved to Documents/ETABS-MCP/exports, the filename is unique per call (which explains the non-idempotent hint), and no UI interaction occurs. It stops short of describing failure behavior (e.g., plan without a story) or whether the response returns the path.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The output format and the no-screen-access guarantee are front-loaded, followed by the view/story rule and the file-save detail. The closing sentence listing clicks, keys, focus, menus, and native window changes is slightly redundant with 'no screen access' but reinforces a key constraint, so it roughly earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no output schema, the description covers the core behavior and side effect (file written to a known folder) well. It leaves gaps on three undocumented parameters, on what the call returns (path? inline image?), and on error conditions, which are material for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden, yet it only explains 'view' (3d/plan/elevation) and 'story'. The 'width', 'height', and 'instance' parameters — including the instance selector for multi-instance setups — are given no meaning in either schema or description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ("Generate and return a PNG from ETABS API geometry") and explicitly distinguishes the output from screenshots. An agent can tell this apart from get_model_geometry (raw geometry data) and from any window-based rendering, especially given the title's 'without desktop access' framing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives conditional parameter guidance ("For a plan specify an exact story such as Story3") and enumerates the valid view kinds, which is useful. However, it never states when to choose this tool over siblings like get_model_geometry or execute_code, nor any prerequisites or exclusions. Usage is implied, not routed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_docsSearch ETABS API documentationARead-onlyIdempotent
Search ETABS API documentation by natural language query.
Returns matching API methods with their Python calling convention. Use this to discover the correct method name, parameters, and return format for any ETABS operation before using execute_code.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Natural language description of what you want to do, e.g. "get joint displacement", "assign frame section", "run modal analysis" | |
| top_k | No | Number of results to return (default 5, max 20). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and openWorldHint=false, so the safety profile is carried for free. The description adds genuine value on top by describing what a call produces (matching API methods with their Python calling convention), which tells the agent the result is directly usable code-shaped output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the purpose and followed by the return content and the workflow cue. Efficiently structured with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only search with full schema coverage and an output schema, the description covers purpose, output shape, and workflow placement — enough to invoke correctly. The one missing element is sibling disambiguation against discover_api.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the query parameter already shows natural-language examples and top_k already documents its default and max. The description adds no syntax, length, or specificity guidance for the query beyond what the schema says, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb and resource ("Search ETABS API documentation") and states the query modality (natural language). It stops short of distinguishing itself from the overlapping sibling discover_api, which an agent could reasonably read as doing the same job.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear workflow guidance: use this to discover method names, parameters, and return format *before* using execute_code, which names a concrete alternative. The gap is the same as above — the closely related sibling discover_api is never mentioned, so the agent gets no rule for choosing between two discovery tools.
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.
9 tool updates
v2.3.0- First observed
discover_api - First observed
execute_code - First observed
get_model_geometry - First observed
get_status - First observed
list_instances - First observed
prepare_session - First observed
read_skills - First observed
render_model_view - First observed
search_docs
TDQS
Scored across 9 tools
Most tools target clearly distinct concerns (session prep, geometry read, rendering, code execution), but the trio of discover_api, read_skills, and search_docs all relate to finding API guidance and could be conflated by an agent. Similarly, get_status and list_instances both surface connection/version info, though the descriptions do clarify the split.
All nine tools use a consistent snake_case verb_noun pattern: get_model_geometry, discover_api, read_skills, list_instances, get_status, prepare_session, render_model_view, execute_code, search_docs. No camelCase or stylistic mixing, and verbs are meaningful and predictable.
Nine tools is a well-scoped set for a domain that delegates the bulk of operations to a code-execution escape hatch. Each tool (discovery, session, status, geometry, render, docs search, execute) earns its place without redundancy.
The surface covers the full lifecycle: discovery, session preparation, instance/status checks, geometry read, rendering, and a general execute_code path for writes and analysis. The only minor gap is the absence of dedicated higher-level write/analysis tools, but execute_code plus search_docs reasonably covers those workflows.
Maintenance
Related MCP Connectors
Connects AI assistants to QCDatabase.AI for everyday construction quality-control work.
Connect AI agents to Turbine Studio for strategies, backtests, research, and trading activity.
Connect AI agents to the Totem network for communication and work coordination.
1Connect agents to 6DuckLearn memory, approvals, and runtime control.
Related MCP Servers
- AlicenseAqualityDmaintenanceConnects AI assistants to CSI ETABS for structural engineering tasks, enabling model creation, analysis, design, and seismic checks via the COM API.6910MIT
- AlicenseNot gradedqualityDmaintenanceEnables users to control CSI ETABS structural engineering software through Claude, allowing model creation, status checks, and engineering checks via COM automation.MIT
- AlicenseAqualityAmaintenanceEnables AI agents to interact with Bentley STAAD.Pro models for tasks like load case definition, data extraction, and property setting through natural language.553MIT
- AlicenseBqualityCmaintenanceConnects MCP-compatible AI agents to a local 3D garment design application through its Python API, enabling scene inspection, pattern and sewing operations, fabric/material management, simulation, mesh measurement, checkpoints, import/export, documentation search, and raw Python execution.42MIT