OpenDSS MCP Server
# MCP Eléctrico — OpenDSS, pandapower y OpenModelica/MSL
**Documentación vigente:** [estado y próximos pasos](docs/ESTADO_ACTUAL.md), [matriz de capacidades](docs/MATRIZ_CAPACIDADES_ACTUALES.md) y [roadmap maestro](docs/ROADMAP_PROFESIONAL.md). Actualización: 22 de octubre de 2026. [Guía práctica: estudios, datos requeridos y comprobación local](docs/GUIA_USO_VERIFICADO.md).
**Q8:** [Actuación de relés OCRelay](docs/ACTUACION_RELES_PANDAPOWER.md), ajustes y corrientes primarias constantes; tiempo de relé separado del interruptor.
**Q9:** [Informes de motores](docs/INFORMES_MOTORES_Q9.md): gráficos por motor, comparación, criterios y exportaciones de resultados MSL guardados.
**Uso profesional controlado:** [secuencia de aceptación, resultados inválidos, criterios fallidos e integridad](docs/USO_PROFESIONAL_CONTROLADO.md).
**Protecciones:** [peor margen temporal en un intervalo continuo de curvas TCC declaradas](docs/P5E_COORDINACION_INTERVALO.md), con bandas, factor de corrientes explícito y bloqueo de huecos. No acredita selectividad integral.
## Confiabilidad técnica y responsabilidad del ingeniero — Q8
El MCP es una herramienta de cálculo para el ingeniero. Su desarrollo debe demostrar
que las entradas se traducen correctamente, que los resultados son reproducibles
y contrastados, y que los datos faltantes, supuestos, límites y errores se informan.
El ingeniero selecciona los criterios del proyecto, revisa los resultados,
aprueba el estudio y lo firma. Esa aprobación es una responsabilidad externa;
no es un módulo numérico pendiente de implementar.
Los campos históricos `professional_emission=false` y `professional_report=false`
indican que el software no aprueba ni firma automáticamente. No prohíben el uso
profesional del cálculo ni la firma del ingeniero. Una firma digital integrada
sería una mejora documental opcional y no una condición para verificar un solver.
Los estados experimentales se conservan exclusivamente cuando falta evidencia
técnica de la integración o del alcance. Arc Flash permanece diferido.
Servidor MCP para modelar, simular e inspeccionar redes eléctricas MT/BT con
[OpenDSS](https://www.epri.com/pages/sa/opendss) mediante
`OpenDSSDirect.py`.
**Criterio de arquitectura:** el cliente conversacional interpreta pedidos en
lenguaje natural y el MCP llama al software especializado gratuito y de código
abierto que cubra cada estudio. El desarrollo propio se centra en adaptadores,
datos, ejecución y presentación; un cálculo físico propio solo se propone tras
documentar que no hay una solución existente adecuada. Ver
[arquitectura y corrección de la ruta de motores](docs/ARQUITECTURA_INTEGRACION.md).
El objetivo del proyecto es ofrecer a un cliente MCP herramientas eléctricas
de alto nivel —crear circuitos, agregar elementos, resolver flujo de potencia,
analizar caída de tensión, cortocircuito, contingencias y generar diagramas
unifilares— sin darle acceso directo e irrestricto al intérprete de OpenDSS.
Además del diálogo mediante ChatGPT/MCP, el proyecto puede mantener un
**workspace HTML persistente** que actúa como visor técnico del circuito activo.
El HTML no contiene un segundo chatbot ni usa una API de modelos: ChatGPT sigue
siendo la interfaz conversacional, OpenDSS sigue siendo el motor eléctrico y el
workspace es una vista estructurada del estado, propiedades y estudios.
`ejecutar_estudio` conecta la tabla de motores con los ejecutores existentes:
una ruta por tarea, parámetros explícitos y los mismos gates, sin fallback ni
ejecución doble. `obtener_contrato_ejecucion_estudios` expone rutas y esquemas.
Ver [uso y alcance](docs/EJECUCION_ESTUDIOS.md). El selector sigue siendo read-only.
> **Estado:** Engineering Preview 0.9 operativa local. P0–P11 conservan sus
> cierres con limitaciones; P12A–P12F están completas como escenarios estáticos
> explícitos; P13A–P13E incluyen motores estáticos, perfiles, secuencias y dossier.
> P14A/P14B incluyen instalación y clientes MCP stdio/HTTP. IEC 60909,
> ampacidad y coordinación/TCC existen dentro de sus alcances publicados.
> La física propia P13F/P13G está retirada. La dinámica usa componentes
> OpenModelica/MSL: DOL está verificado dentro del alcance RL declarado (Q2);
> SCR está verificado dentro del alcance genérico de una o dos máquinas delta (Q5). Bancos estáticos, P5 y P7
> conservan su verificación Q1.
> Armónicos Q6 incorpora espectros no triplén y barrido de impedancia positivo
> [verificados en alcance](docs/ARMONICOS_OPENDSS.md). IEEE 1584 permanece diferido.
> `professional_emission=false`.
> Ver [roadmap](docs/ROADMAP_PROFESIONAL.md).
Consultar el [estado de cierre, evidencia y gates pendientes](docs/ESTADO_CIERRE_MODULOS.md). DOL y SCR están cerrados dentro de sus alcances publicados. Ver [evidencia DOL](docs/MSL_DOL_VERIFICACION.md) y [contraste SCR original](docs/MSL_SCR_REFERENCIA_ORIGINAL.md) y [dos motores SCR](docs/MSL_SCR_DOS_MOTORES.md).
Consultar la [matriz completa de capacidades actuales](docs/MATRIZ_CAPACIDADES_ACTUALES.md)
para distinguir la participación de OpenDSS, pandapower, OpenModelica/MSL y las capas MCP,
el alcance disponible, la madurez y las funciones pendientes. Incluye las
ampliaciones de 2F-T y SCR sin modificar los contratos históricos del core.
La preparación dinámica de motores expone `obtener_contrato_dinamica_motores`,
`validar_datos_dinamica_motores` y `obtener_plan_validacion_dinamica_motores`.
La ejecución vigente usa el adaptador OpenModelica/MSL, datos explícitos y componentes nativos. Ver [migración](docs/MIGRACION_MODELOS_ABIERTOS.md) y [condiciones de cierre](docs/ESTADO_CIERRE_MODULOS.md). El contrato histórico propio no habilita su solver retirado.
## Antecedentes de motores — rutas retiradas
Las herramientas de contraste siguientes conservan expedientes históricos; la ejecución vigente es `ejecutar_dinamica_modelica`.
La implementación histórica P13G, cuya física propia está retirada, documentó [arranque suave aproximado SCR/RL](docs/P13G_SOFT_STARTING.md): rampa,
límite de corriente, aceleración y bypass de un motor, con criterios trazables
y dossier. Es un equivalente por fase probado con referencias analíticas y
numéricas; no está validado contra un arrancador real ni representa conmutación
trifásica, armónicos de la red o calentamiento. No acredita aceptación del diseño.
`contrastar_arranque_suave` incorpora un [benchmark trifásico independiente
de carga resistiva sin neutro](docs/P13G_REFERENCE_COMPARISON.md). Compara el
equivalente por fase con tramos de onda publicados, a igual ángulo y a igual
tensión fundamental. Registra las diferencias sin promocionar validación de
dispositivo ni atribuir ese error al motor del proyecto.
`contrastar_dinamica_con_modelica` añade el [contraste externo con motor](docs/P13G_MODELICA_REFERENCE.md).
La biblioteca Modelica Standard Library 4.0.0 se ejecutó con OpenModelica 1.27.1:
motor de inducción y tiristores trifásicos con parámetros sintéticos equivalentes.
El equivalente propio SCR, actualmente retirado, mostró discrepancias de corriente, par y aceleración bajo la misma
secuencia de entradas; permanece sin cualificación de dispositivo. El MCP
verifica el expediente y compara trazas; no ejecuta el simulador externo.
El cortocircuito trifásico público requiere un **control previo del modelo**:
primero revisar las entradas, los datos faltantes y los supuestos con
`evaluar_preparacion_cortocircuito_3ph`. La ejecución se bloquea sin una revisión
explícita vinculada al modelo y parámetros actuales. La extensión 3F incorpora
motores de inducción directa y generadores síncronos con **fichas explícitas**,
y corrientes por rama. Un Load sin clasificar no se convierte automáticamente
en motor, ni una fuente equivalente en generador síncrono. Obtener corrientes
MAX/MIN no valida por sí solo protecciones.
Ver [control previo y alcance P4](docs/P4_IEC60909.md).
Ver [máquinas, datos requeridos y límites de 3F](docs/SC3_MACHINES.md).
## 1. Instalación
Requisitos: Python 3.10 o superior.
```bash
git clone https://github.com/NoeCalle/MCP-Electrico.git
cd MCP-Electrico
python -m venv .venv
```
Windows:
```powershell
.venv\Scripts\python.exe -m pip install -e ".[dev]"
```
Linux/macOS:
```bash
source .venv/bin/activate
python -m pip install -e ".[dev]"
```
Verificación rápida:
```bash
python -c "import opendssdirect; import mcp; import networkx; print('OK')"
```
## 2. Probar sin un cliente MCP
Los ejemplos importan directamente las funciones de `server.py`:
```bash
python examples/hospital_basico.py
python examples/visualizar_hospital.py
python examples/campus_hospitalario.py
python examples/arc_flash_campus.py
python examples/unifilar_tecnico.py
python examples/workspace_hospital.py
```
`unifilar_tecnico.py` genera `unifilar_tecnico.svg` y
`unifilar_tecnico.html`. `workspace_hospital.py` genera un
`workspace_hospital.html` persistente con unifilar, inspector técnico,
propiedades, flujo de potencia, caída de tensión y botones para impresión/PDF y
descarga SVG.
Para ejecutar la suite de regresión:
```bash
pip install -r requirements-dev.txt
python -m pytest -q
```
GitHub Actions ejecuta `pytest`, genera el unifilar técnico y el workspace de
referencia con estudios y conserva ambos como artefactos en cada PR.
## 3. Conectar a un cliente MCP
El servidor admite stdio por defecto y Streamable HTTP local:
```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/start_local.ps1
.venv\Scripts\python.exe scripts/verify_local_mcp.py --url http://127.0.0.1:8765/mcp
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/stop_local.ps1
```
Use `http://127.0.0.1:8765/mcp` en un cliente que ejecute en esta PC. HTTP
acepta una sesión activa por proceso. Un cliente en la nube no alcanza loopback.
Ver [instalación y verificación local](docs/P14_LOCAL_RUNTIME.md).
Ejemplo para Claude Desktop en Windows:
```json
{
"mcpServers": {
"opendss": {
"command": "C:\\ruta\\MCP-Electrico\\.venv\\Scripts\\python.exe",
"args": ["C:\\ruta\\MCP-Electrico\\server.py"]
}
}
}
```
En macOS/Linux, usa el ejecutable Python del `venv` y la ruta absoluta a
`server.py`.
## 4. Herramientas disponibles
| Herramienta | Función |
|---|---|
| `configurar_workspace` | Configura ruta, título y regeneración automática del visor HTML |
| `obtener_estado_workspace` | Devuelve revisiones, validez de resultados y estudios registrados |
| `regenerar_workspace` | Fuerza la regeneración del HTML, SVG y vistas de estudios |
| `crear_circuito` | Inicia un circuito; expone `bus_fuente` explícito |
| `obtener_contrato_construccion_rev0` | Explica la ruta segura de construcción sin Solve |
| `validar_construccion_rev0` | Valida intake + preflight sin mutar el modelo |
| `construir_modelo_rev0` | Materializa Rev.0 sin Solve ni escritura del workspace |
| `registrar_placeholder_modelo` | Registra un equipo TBC sin inventar un elemento OpenDSS |
| `obtener_placeholders_modelo` | Lista TBC que bloquean readiness de estudio |
| `agregar_linea` | Agrega línea/cable con R1/X1 |
| `agregar_transformador` | Agrega transformador trifásico de dos devanados |
| `agregar_carga` | Agrega carga, criticidad y tipo visual opcional |
| `configurar_tipo_carga_unifilar` | Elige símbolo de tablero, motor o carga genérica |
| `configurar_etiqueta_carga_unifilar` | Define rótulo de ingeniería sin renombrar OpenDSS |
| `configurar_bus_unifilar` | Fuerza bus como barra física, conexión lógica o auto |
| `configurar_alimentador_unifilar` | Añade etiqueta, protección, conductor y anotaciones ATS/UPS |
| `obtener_configuracion_unifilar` | Devuelve los metadatos visuales del circuito activo |
| `agregar_generador_respaldo` | Agrega un grupo electrógeno mediante `Generator` de OpenDSS |
| `ejecutar_flujo_potencia` | Resuelve voltajes/pérdidas y actualiza el estudio detallado `flow` |
| `analizar_flujo_operacion` | Devuelve corriente, kW/kvar y cargabilidad disponible por alimentador |
| `analizar_caida_tension` | Calcula ΔV por `Line` contra un límite configurable por el usuario |
| `ejecutar_cortocircuito` | Ejecuta `FaultStudy` y devuelve magnitudes de Isc |
| `evaluar_preparacion_cortocircuito_3ph` | Expone entradas, faltantes y alcance parcial antes de calcular; no ejecuta el motor |
| `ejecutar_cortocircuito_iec60909_3ph` | Calcula 3F MAX/MIN y corrientes por rama, con fuentes/máquinas declaradas y revisión previa; no valida protecciones |
| `definir_motor_cortocircuito_3ph` | Registra ficha nominal explícita de inducción directa |
| `definir_generador_cortocircuito_3ph` | Registra Xd'', R, K_G y unidad K_S/K_SO; evita duplicar la fuente equivalente |
| `clasificar_carga_cortocircuito_3ph` | Declara carga estática o variador pendiente; sin inferencia desde MW/fp |
| `obtener_fichas_maquinas_cortocircuito_3ph` | Muestra fichas, estado actual y cargas sin identificar |
| `eliminar_ficha_maquina_cortocircuito_3ph` | Retira ficha e invalida revisión/estudios |
| `abrir_elemento_sin_resolver` | Prepara topología OPEN sin ejecutar Solve |
| `cerrar_elemento_sin_resolver` | Prepara topología CLOSED sin ejecutar Solve |
| `abrir_elemento` | Abre un elemento y deja el modelo resuelto en ese estado |
| `cerrar_elemento` | Cierra un elemento y vuelve a resolver |
| `simular_perdida_alimentador` | Ejecuta una contingencia N-1 con restauración opcional |
| `listar_elementos` | Lista buses y elementos principales |
| `obtener_netlist` | Exporta y devuelve los archivos DSS con su contenido |
| `generar_diagrama_unifilar` | Genera un unifilar técnico SVG/HTML independiente |
| `estimar_arc_flash_lee` | Estimación educativa de energía incidente por Lee |
| `calcular_arc_flash` | Alias compatible con versiones anteriores |
## 5. Workspace HTML persistente
El workspace fija una ruta estable para el circuito activo. Las tools MCP que
cambian el modelo o su representación regeneran ese archivo automáticamente.
Ejemplo conceptual:
```python
configurar_workspace(
"workspace.html",
titulo="Hospital — Sistema eléctrico",
auto_regenerar=True,
)
crear_circuito("hospital", 22.9)
agregar_transformador(...)
agregar_linea(...)
agregar_carga(...)
ejecutar_flujo_potencia()
analizar_caida_tension(limite_pct=3.0)
```
### 5.1 Estado y revisiones
El workspace distingue:
- `EMPTY`: no existe modelo utilizable;
- `MODIFIED`: el modelo cambió después de la última solución;
- `SOLVED`: la revisión actual coincide con la revisión resuelta;
- `ERROR`: existe un error eléctrico/no convergencia relevante.
Se mantienen `model_revision`, `solved_revision` y `visual_revision`. Un cambio
eléctrico invalida automáticamente estudios anteriores; un cambio únicamente
visual no invalida una solución correcta.
Cada estudio conserva la revisión con la que fue calculado y expone una bandera
`valid`. Así un resultado histórico puede permanecer trazable sin presentarse
como vigente.
### 5.2 HTML, inspector y exportación
La interfaz incluye:
- unifilar SVG embebido;
- resumen de buses, alimentadores, cargas y pérdidas;
- inspector técnico **read-only** con IDs estables del modelo;
- selección desde el unifilar, tabla `Datos` o selector lateral;
- snapshot JSON embebido y versionado;
- botón **Imprimir / PDF**, basado en `window.print()` y CSS de impresión;
- botón **Descargar SVG**;
- botón **Recargar archivo**.
El HTML es autocontenido y no usa dependencias remotas. El archivo se reescribe
automáticamente, pero una pestaña local ya abierta debe refrescarse para leer
la nueva versión.
Las decisiones base están en:
- `docs/WORKSPACE.md`;
- `docs/WORKSPACE_INTERACTIVO.md`;
- `docs/decisions/ADR-0001-workspace-persistente.md`;
- `docs/decisions/ADR-0002-workspace-interactivo.md`.
### 5.3 Flujo de potencia dentro del workspace
`ejecutar_flujo_potencia()` conserva su payload histórico, pero además registra
un estudio `flow` detallado. La pestaña **Flujo** puede mostrar por alimentador:
- corriente máxima del terminal 1;
- flujo kW y kvar del terminal 1;
- cargabilidad respecto a `corriente_nominal_a`, cuando ese rating existe;
- pérdidas totales del circuito.
La cargabilidad **no equivale por sí sola a validación normativa de ampacidad**.
Hasta implementar una biblioteca formal de conductores, el rating usado es un
metadato explícito suministrado al alimentador.
### 5.4 Caída de tensión dentro del workspace
`analizar_caida_tension(limite_pct=3.0)` calcula la diferencia de magnitudes pu
entre `bus1` y `bus2` de cada `Line`.
El resultado conserva:
- tensión promedio de origen y destino;
- caída por fase;
- caída promedio firmada;
- máxima caída positiva evaluada;
- estado `OK` / `EXCEDE` respecto al límite suministrado.
El límite es **configurable por el usuario**. El valor 3 % es solo el default de
la herramienta y no se presenta como requisito normativo universal.
La metodología y decisiones completas están en:
- `docs/WORKSPACE_ESTUDIOS.md`;
- `docs/decisions/ADR-0003-estudios-operativos-workspace.md`.
## 6. Unifilar técnico SVG
La visualización evita la estética de un grafo genérico. El renderer interpreta
el modelo eléctrico para mostrar barras físicas solo cuando corresponde y
colapsa buses puramente lógicos por defecto.
Principios principales:
1. flujo principal de energía ordenado;
2. barras físicas claramente jerarquizadas;
3. alimentadores ortogonales y ordenados;
4. protección en cabecera;
5. simbología consistente para fuente, transformador, tablero, motor, ATS,
UPS, generador y tierra;
6. rótulos de ingeniería independientes del nombre interno OpenDSS;
7. protecciones visuales diferenciables: breaker, MCCB, ACB, fusible y
seccionador;
8. modo `ingenieria` limpio y modo `diagnostico` con información adicional;
9. orientación vertical u horizontal;
10. elementos abiertos y buses desenergizados diferenciados visualmente.
Ejemplo:
```python
agregar_carga(
"motor_bomba",
"mcc_01",
kw=75,
kvar=30,
kv=0.48,
tipo_visual="motor",
)
configurar_alimentador_unifilar(
"Line.f_critico",
dispositivos=["ats", "ups"],
fuente_alterna="Generator.ge_01",
proteccion="mccb",
conductor="3x50 mm2 Cu XLPE",
)
ejecutar_flujo_potencia()
generar_diagrama_unifilar("hospital.html", titulo="Hospital — Diagrama unifilar")
```
Si la ruta termina en `.html`, se genera además un `.svg` vectorial compañero.
La especificación visual completa está en `docs/UNIFILAR_TECNICO.md`.
**ATS y UPS son, por ahora, anotaciones de representación.** Sirven para que el
unifilar documente la arquitectura prevista sin afirmar que OpenDSS ya modela
su electrónica interna, transferencia, autonomía o contribución de falla. Esas
anotaciones no cambian impedancias ni resultados eléctricos.
## 7. Contingencias N-1: estado coherente
`simular_perdida_alimentador()` distingue dos formas de trabajo.
Con `restaurar=True`, el elemento se abre, OpenDSS resuelve la contingencia,
se capturan los resultados y después se restaura exactamente el estado
original y se vuelve a resolver.
Con `restaurar=False`, el elemento permanece abierto y el circuito queda
resuelto en contingencia para inspección y visualización.
El workspace registra el estudio de contingencia junto con la revisión del
modelo a la que corresponde.
## 8. Cargas críticas
Las cargas marcadas con `critica=True` se conservan como metadato del modelo.
Durante una contingencia se devuelve, para cada carga crítica, su bus, voltajes
en pu, indicador de energización y la lista de cargas críticas sin tensión.
El umbral interno usado para distinguir una barra esencialmente desenergizada
de una barra con tensión **no es un criterio de cumplimiento de calidad de
servicio**.
## 9. Exportación DSS
`obtener_netlist()` exporta el circuito y devuelve directorio, `Master.dss`,
número de archivos y contenido de cada archivo `.dss` generado.
## 10. Arc Flash: alcance y seguridad
`estimar_arc_flash_lee()` implementa únicamente la ecuación simplificada de
Lee para aprendizaje y estimación de orden de magnitud.
**No implementa el modelo empírico completo de IEEE 1584-2018** y no convierte
energía incidente en una categoría PPE. `calcular_arc_flash()` se mantiene como
alias compatible.
## 11. Cortocircuito
`dss.Bus.Isc()` entrega componentes reales e imaginarias intercaladas. El
servidor calcula explícitamente la magnitud de cada fasor:
```text
|I| = sqrt(Re(I)^2 + Im(I)^2)
```
Al integrarlo con el workspace, el `FaultStudy` se conserva como estudio y
después se restaura una solución de flujo de potencia antes de regenerar el
visor. Esto evita mezclar modos de solución en el unifilar persistente.
## 12. Generadores y UPS
`agregar_generador_respaldo()` representa un **grupo electrógeno** mediante el
objeto `Generator` de OpenDSS. Una UPS basada en electrónica de potencia no se
presenta como equivalente a un generador síncrono.
## 13. Arquitectura
```text
MCP-Electrico/
├── server.py
├── mcp_electrico/
│ ├── __init__.py
│ ├── core.py
│ ├── studies.py
│ ├── visualization.py
│ ├── visual_state.py
│ ├── visual_symbols.py
│ ├── workspace_state.py
│ ├── workspace.py
│ └── workspace_studies_view.py
├── docs/
│ ├── UNIFILAR_TECNICO.md
│ ├── WORKSPACE.md
│ ├── WORKSPACE_INTERACTIVO.md
│ ├── WORKSPACE_ESTUDIOS.md
│ └── decisions/
│ ├── ADR-0001-workspace-persistente.md
│ ├── ADR-0002-workspace-interactivo.md
│ └── ADR-0003-estudios-operativos-workspace.md
├── examples/
│ ├── unifilar_tecnico.py
│ └── workspace_hospital.py
├── tests/
├── requirements.txt
└── requirements-dev.txt
```
- `server.py`: tools MCP y orquestación.
- `core.py`: lógica eléctrica y estado OpenDSS.
- `studies.py`: métricas operativas derivadas de soluciones OpenDSS.
- `visualization.py`: interpretación topológica, layout y render SVG.
- `visual_symbols.py`: biblioteca vectorial de símbolos.
- `visual_state.py`: metadatos visuales que no alteran el cálculo.
- `workspace_state.py`: revisiones, validez y contrato snapshot.
- `workspace.py`: HTML persistente e inspector base.
- `workspace_studies_view.py`: pestañas read-only para resultados de estudios.
## 14. Limitaciones actuales
- varios elementos usan parámetros de secuencia positiva R1/X1;
- la biblioteca de conductores y la ampacidad requieren datos y evidencia
explícitos; no hay búsqueda normativa automática;
- R0/X0 y secuencia cero se admiten únicamente dentro de los contratos publicados;
- TCC y coordinación temporal requieren curvas y tiempos explícitos;
- ATS/UPS pueden documentarse visualmente, pero aún no tienen modelo eléctrico
detallado propio;
- los bancos de capacitores estáticos tienen [integración OpenDSS verificada en alcance estático](docs/COMPENSACION_REACTIVA_OPENDSS.md)
por etapas explícitas en contexto aislado; no hay `LoadShape`, PV, Storage,
control automático de bancos. Daily/Yearly está disponible en un
[adaptador explícito separado](docs/SERIES_TEMPORALES_OPENDSS.md). Armónicos y barrido positivo
tienen un [adaptador explícito separado](docs/ARMONICOS_OPENDSS.md);
- el modelo activo en memoria no se conserva al reiniciar; snapshots y dossiers
proporcionan persistencia y reconstrucción explícitas;
- un HTML local abierto requiere refresco manual para leer una regeneración;
- la caída de tensión inicial se evalúa por cada `Line`, no todavía como caída
acumulada independiente hasta cada carga;
- la corriente nominal visual es explícita; la ampacidad P3 se evalúa por una
herramienta separada con método de instalación y correcciones declaradas;
- vistas específicas de C.C. y contingencias aún no tienen pestañas propias;
- el SVG es un unifilar técnico, no un plano CAD contractual ni una biblioteca
normativa completa IEC/ANSI;
- Arc Flash es solo una estimación educativa por Lee.
La capacidad y sus gates vigentes se detallan en `docs/ROADMAP_PROFESIONAL.md`.
## Perfiles Daily/Yearly
Las herramientas `obtener_contrato_series_temporales`, `validar_series_temporales`
y `ejecutar_series_temporales` usan LoadShape nativos con P/Q independientes,
periodo explícito, balances por intervalo y energía del horizonte declarado.
Ver [alcance, referencia anual y ejemplo](docs/SERIES_TEMPORALES_OPENDSS.md).
## Armónicos y barrido de impedancia
Las herramientas `obtener_contrato_armonicos`, `validar_armonicos` y
`ejecutar_armonicos` reciben un paquete explícito y ejecutan OpenDSS aislado.
Incluyen espectros no triplén, THDv truncada, corrientes de terminal de equipos
pasivos y barridos positivos. Ver [alcance, evidencia y ejemplo](docs/ARMONICOS_OPENDSS.md).
## Construcción Rev.0 para agentes
La ruta recomendada para un agente que necesita construir primero y estudiar
después está documentada en `docs/MCP_RUNTIME_REV0.md`.
Principio principal:
```text
construcción ≠ solución ≠ readiness ≠ emisión profesional
```
Los datos TBC pueden conservarse como `MODEL_PLACEHOLDER_TBC`, pero no se
proyectan al solver y bloquean explícitamente la preparación de estudio.
TDQS
Scored across 127 tools
127 tools with many phase-specific variants (e.g., multiple IEC 60909 cortocircuito tools, many obtener_contrato_* and evaluar_cierre_* tools) create overlapping boundaries. Aliases like calcular_arc_flash vs estimar_arc_flash_lee and paired abrir/cerrar_elemento vs *_sin_resolver make misselection likely despite detailed descriptions.
Consistent snake_case verb_noun pattern in Spanish throughout. Minor deviations include an explicit alias (calcular_arc_flash) and phase suffixes (P5A, P7A, etc.) that add noise but remain predictable.
127 tools far exceeds typical scope; even for a complex engineering server this is an extreme mismatch that makes discovery and selection difficult.
The surface covers a wide lifecycle (circuit creation, element addition, power flow, short circuit, protection, arc flash, snapshots, dossiers, integrity checks). Minor gaps include no explicit delete/update for added elements, but many validation/contract tools fill adjacent roles.