Skip to main content
Glama
david-mamani

ETABS MCP Server

by david-mamani

ETABS MCP Server

Version ETABS Platform License

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_session abre ETABS y prepara un modelo guardado mediante su API COM, sin ratón, teclado ni computer-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 | iex

Qué hace:

  1. Descarga etabs-mcp.exe del último release.

  2. Lo deja en %LOCALAPPDATA%\etabs-mcp\etabs-mcp.exe (si el binario está en uso, lo reemplaza en caliente).

  3. Respalda tu opencode.json y registra el servidor etabs (si ya existe, solo actualiza la ruta).

  4. Prueba que el ejecutable arranque.

  5. Ejecuta una prueba real con ETABS: abre ETABS, crea un archivo .EDB, lo analiza y lo guarda.

  6. 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 SMOKE de 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" --status

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

  1. Das el prompt.

  2. Se instala el MCP.

  3. Se abre ETABS y se comprueba el conector MCP.

  4. ETABS se queda abierto y el agente escribe en el chat:

pásame una imagen de lo que quieras modelar y lo modelaré en ETABS

Opción A — Claude Desktop (un solo archivo)

  1. Descarga etabs-mcp.mcpb desde Releases.

  2. Abre Claude Desktop → Settings → Extensions.

  3. Arrastra el .mcpb sobre la ventana (o "Install from file").

  4. Abre ETABS con un modelo.

  5. 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 --status

Limitar 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

discover_api

Lista las skills disponibles. Llamar primero.

read_skills

Carga una o más skills por nombre (guía paso a paso).

list_instances

Instancias de ETABS abiertas (alias, PID, archivo, versión).

get_status

Estado de la conexión, versión de ETABS, si el modelo está bloqueado, versión del servidor.

prepare_session

Abre ETABS y prepara un modelo. new_model=True crea otra instancia y un archivo único; stories y los parámetros de malla definen los pisos y ejes.

get_model_geometry

Lee nodos, barras, áreas, huecos y pisos en metros sin cambiar unidades ni resultados.

render_model_view

Genera PNG de planta, elevación y 3D desde la geometría de la API. Devuelve la imagen al chat sin acceder al escritorio.

execute_code

Ejecuta Python en un sandbox contra el SapModel conectado.

search_docs

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

etabs-core, etabs-geometry, etabs-sections, etabs-materials, etabs-loads, etabs-analysis, etabs-results, etabs-design, etabs-errors

Tablas y utilidades

etabs-database-tables (165 tablas), etabs-rs-function, etabs-truss-types, etabs-auto-seismic

Flujos de trabajo

workflow-seismic-check, workflow-modal-report, workflow-mass-participation, workflow-story-drift, workflow-base-shear, workflow-frame-forces, workflow-story-forces, workflow-gravity-report, workflow-design-concrete, workflow-model-audit, workflow-modifiers, workflow-rs-scaling, workflow-torsion-check, workflow-irregularity-check, workflow-otm-check, workflow-drift-check-bnbc, workflow-steel-roof-truss, workflow-tool-test

Cargas y combos

workflow-load-patterns-cases, workflow-load-combinations

Normas

ibc2012-de10-dual-system, ibc2012-de11-diaphragm-class, ibc2012-de12-torsion-irreg, ibc2012-de13-reentrant-corner, ibc2012-de14-diaphragm-discont, ibc2012-de18-soft-story, ibc2012-de33-force-distribution, ibc2012-de34-torsion-amplification, ibc2012-de35-story-drift, ibc2012-de36-pdelta, ibc2012-seismic-params, bnbc2020-seismic-params, bnbc2020-load-combinations

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 -Install

La 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.tlb

Regenerar el índice de la API

py build_api_index_typelib.py --merge
.\build.ps1 -SkipPyInstaller

Limitaciones conocidas

Problema

Solución

SetTableForEditingArray — comtypes no pasa listas de Python como SAFEARRAY ByRef

Usar los métodos del modelo (p. ej. model.FrameObj.SetSection())

Resultados tras abrir un .edb — el modelo queda bloqueado y sin resultados en memoria

Desbloquear → fijar flags → RunAnalysis()

StepNum en modal Ritz devuelve 0

Usar el índice de fila i+1 como número de modo

Modelos grandes analizados desde MCP

Correr el análisis desde la UI de ETABS (F5); COM puede expirar

SetModelIsLocked(False) borra los resultados

No desbloquear entre RunAnalysis() y la lectura de resultados


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-guides

El 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 tools
discover_apiDiscover API and skillsA
Read-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.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 codeA
Destructive

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.

NameRequiredDescriptionDefault
codeYesPython source code to execute. Use ``model`` (SapModel) to interact with ETABS.
instanceNoAlias from ``list_instances`` (e.g. ``etabs1``). Omit when only one instance runs.
overwriteNoAllow overwriting an existing output file.
input_data_pathNoPath to a ``.csv`` or ``.xlsx`` file. Content is injected as immutable ``input_data``.
output_data_pathNoPath 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

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

NameRequiredDescriptionDefault
instanceNo
max_objectsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

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

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

NameRequiredDescriptionDefault
instanceNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

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

Purpose4/5

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.

Usage Guidelines4/5

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

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

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

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
storiesNo
instanceNo
new_modelNo
spacing_xNo
spacing_yNo
grid_lines_xNo
grid_lines_yNo
story_heightNo
first_story_heightNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

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

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

NameRequiredDescriptionDefault
skillsYesList of skill names to read. Use ``discover_api`` to see available skills.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

NameRequiredDescriptionDefault
viewNo3d
storyNo
widthNo
heightNo
instanceNo

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters2/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

NameRequiredDescriptionDefault
queryYesNatural language description of what you want to do, e.g. "get joint displacement", "assign frame section", "run modal analysis"
top_kNoNumber of results to return (default 5, max 20).

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 9 tool updatesv2.3.0
    • First observeddiscover_api
    • First observedexecute_code
    • First observedget_model_geometry
    • First observedget_status
    • First observedlist_instances
    • First observedprepare_session
    • First observedread_skills
    • First observedrender_model_view
    • First observedsearch_docs

TDQS

A4/5.0

Scored across 9 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Connects AI assistants to CSI ETABS for structural engineering tasks, enabling model creation, analysis, design, and seismic checks via the COM API.
    69
    10
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables users to control CSI ETABS structural engineering software through Claude, allowing model creation, status checks, and engineering checks via COM automation.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to interact with Bentley STAAD.Pro models for tasks like load case definition, data extraction, and property setting through natural language.
    5
    53
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    Connects 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.
    42
    MIT