Metadata-Version: 2.4
Name: presto-mcp-server
Version: 2.2.0
Summary: MCP server para Presto (RIB) — automatizacion COM local (Presto.App.25) + BC3 (FIEBDC-3). NeoNexAI.
Project-URL: Homepage, https://github.com/NeoNexAI/presto-mcp-server
Project-URL: Issues, https://github.com/NeoNexAI/presto-mcp-server/issues
Author: NeoNexAI Agency
License: MIT
License-File: LICENSE
Keywords: bc3,fiebdc,mcp,model-context-protocol,neonexai,presto,presupuestos,rib
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: Microsoft :: Windows
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Office/Business :: Financial :: Accounting
Requires-Python: >=3.10
Requires-Dist: mcp>=1.2.0
Requires-Dist: pywin32>=306; sys_platform == 'win32'
Description-Content-Type: text/markdown

# presto-mcp-server

[![CI](https://github.com/NeoNexAI/presto-mcp-server/actions/workflows/ci.yml/badge.svg)](https://github.com/NeoNexAI/presto-mcp-server/actions/workflows/ci.yml)
[![PyPI](https://img.shields.io/pypi/v/presto-mcp-server)](https://pypi.org/project/presto-mcp-server/)
[![Python](https://img.shields.io/pypi/pyversions/presto-mcp-server)](https://pypi.org/project/presto-mcp-server/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)

MCP server que conecta **Claude** con **Presto** (software de presupuestos y
mediciones de **RIB Software**) — versión **2025**.

Por **NeoNexAI Agency**, para clientes de consultoría IA que usan Presto.

Dos vías complementarias:

- **COM en vivo (`Presto.App.25`)** — controla la obra **abierta** en Presto:
  leer/escribir conceptos, precios y cualquier campo, e invocar opciones internas
  del programa. Requiere **Presto instalado y ejecutándose** en el mismo equipo.
- **BC3 (FIEBDC-3)** — lee y analiza ficheros de presupuesto **sin abrir Presto**
  (multiplataforma; ideal para auditoría rápida).

> Presto de escritorio **no tiene API REST** (eso es solo Presto *ServerCloud*).
> La integración local correcta es **COM**, que la documentación oficial de RIB
> soporta para VBScript, VB.NET y **Python (`win32com`)** — que es lo que usa este server.

---

## Requisitos en el PC

- **Windows** (la vía COM es Windows-only).
- **Python ≥ 3.10** + **[uv](https://docs.astral.sh/uv/)** (`pip install uv`).
- **Presto 2025 instalado Y ABIERTO** para la vía COM (control de la obra en vivo).
  El MCP se conecta a la instancia de Presto **en ejecución**; para operar sobre una
  obra concreta, **ábrela en Presto** antes. Si tu versión no es la 25, fija el
  ProgID con `PRESTO_PROGID` (p. ej. `Presto.App.26`).
- La vía **BC3 NO necesita Presto** (ni instalado ni abierto): solo lee/analiza
  ficheros `.bc3`.
- Comprueba la conexión en cualquier momento con la tool **`presto_status`**.

> Resumen rápido: tools `presto_bc3_*` → funcionan siempre (solo ficheros).
> El resto (COM) → requieren **Presto 2025 abierto** en este mismo equipo.

---

## Instalación

Publicado en **PyPI** como [`presto-mcp-server`](https://pypi.org/project/presto-mcp-server/).
`uvx` lo instala y ejecuta sin dejar nada que mantener; `@latest` trae siempre la última versión.

### Opción 1 — con el comando de Claude Code (si tienes el CLI `claude`)

```bash
claude mcp add presto -s user -- uvx presto-mcp-server@latest
```

`-s user` lo deja disponible en **todos los proyectos** de ese PC. Para una versión
de Presto distinta de la 2025: `--env PRESTO_PROGID=Presto.App.26`.

### Opción 2 — sin CLI, editando la configuración a mano

Útil con **Claude Desktop** o si el comando `claude` no existe en el equipo. Añade
el bloque `"presto"` dentro de `mcpServers` y **reinicia la app**:

- **Claude Desktop** → `C:\Users\<usuario>\AppData\Roaming\Claude\claude_desktop_config.json`
  (en la app: *Settings → Developer → Edit Config*).
- **Claude Code (config global de usuario)** → `C:\Users\<usuario>\.claude.json`,
  bajo la clave raíz `mcpServers`.

```json
{
  "mcpServers": {
    "presto": {
      "command": "uvx",
      "args": ["presto-mcp-server@latest"],
      "env": { "PRESTO_PROGID": "Presto.App.25" }
    }
  }
}
```

Reinicia la app **del todo** (en Claude Desktop, ciérrala también desde el icono de
la bandeja del sistema → Quit).

> Si la app **no encuentra `uvx`** (PATH), pon la ruta absoluta como `command`
> (en PowerShell: `where.exe uvx`), con barras dobles `\\` en el JSON.

**Alternativas:**

```bash
# con pip en vez de uv
pip install presto-mcp-server         # luego command="python", args=["-m","presto_mcp"]

# sin PyPI, directo de GitHub (no autoactualiza salvo --refresh)
uvx --from git+https://github.com/NeoNexAI/presto-mcp-server presto-mcp
```

Para la vía COM: **abre Presto** (y la obra, si la operación la necesita) antes de
usar las herramientas. Comprueba la conexión con `presto_status`.

---

## Herramientas

### Conexión y obra
| Tool | Qué hace |
|---|---|
| `presto_status` | Comprueba la conexión COM y devuelve el ProgID activo |
| `presto_open_obra` | Abre una obra `.Presto` en la instancia en ejecución |
| `presto_close_obra` | Cierra la obra abierta |

### Genéricas — cobertura del 100% del modelo de datos
| Tool | Qué hace |
|---|---|
| `presto_read_records` | Lee cualquier tabla/campos filtrando por máscara |
| `presto_get_field` | Lee un campo de un registro por su código |
| `presto_set_field` | Escribe un campo (transaccional, deshacible) |
| `presto_execute_option` | Ejecuta cualquier opción interna de Presto (DLG_*) con JSON |

### Curadas — conceptos y precios
| Tool | Qué hace |
|---|---|
| `presto_get_concepto` | Código, unidad, resumen y precios de un concepto |
| `presto_search_conceptos` | Busca conceptos por resumen o código |
| `presto_get_precios` | Precios en todos los esquemas (presupuesto, certificación, real, objetivo, planificado) |
| `presto_set_precio` | Fija el precio de un concepto en un esquema |
| `presto_expresion` | Calcula una expresión del motor de Presto (EvalStr/EvalNum) |
| `presto_tablas` | Lista las tablas que el servidor conoce por su nombre canónico |
| `presto_selftest` | Autodiagnóstico de solo lectura: un informe único OK/FALLO por paso |

### BC3 (FIEBDC-3) — sin Presto
| Tool | Qué hace |
|---|---|
| `presto_bc3_resumen` | Resumen de un fichero BC3 (conceptos, capítulos, emisor) |
| `presto_bc3_buscar` | Busca conceptos por texto en un BC3 |
| `presto_bc3_concepto` | Concepto del BC3 con texto y descomposición |
| `presto_bc3_anomalias` | Precios a 0/ausentes, sin resumen, partidas sin descomposición |

---

## Modelo de datos de Presto (referencia rápida)

La automatización trabaja sobre **tablas.campo**. Los nombres exactos se ven en
Presto con **`Ver: Lista de campos`**. Los más usados:

- Tabla **`Conceptos`**: `Conceptos.Código` (clave única), `Conceptos.Resumen`,
  `Conceptos.Ud`, y precios `Conceptos.PrPres` (presupuesto), `PrCert`
  (certificación), `PrReal`, `PrObj` (objetivo), `PrPlan` (planificado).
- Filtrado por máscara con comodines de Presto: `"E04*"`, `"*hormigón*"`, `"*"`.

Operaciones masivas (multiplicar precios, reducir niveles, generar objetivo,
exportar/importar formatos…) → `presto_execute_option` con el código del diálogo.

---

## ¿Y Presto ServerCloud (WebAPI REST)?

Presto **de escritorio no expone API REST**. La **WebAPI** (REST sobre HTTP) solo
existe con la licencia **Presto ServerCloud** (suscripción aparte + IIS). Por eso
este MCP usa **COM local** (la vía correcta para escritorio + dongle/pincho).

Si algún día se contrata ServerCloud, **no hace falta un MCP aparte**: se añade a
**este mismo paquete** una capa `presto_webapi_*` que se activa por variables de
entorno (`PRESTO_WEBAPI_URL` / `PRESTO_WEBAPI_USER` / `PRESTO_WEBAPI_PASS`).
Mientras no estén configuradas, el MCP funciona con COM + BC3 como siempre.
→ Un solo MCP, tres backends: **COM** (obra en vivo) · **BC3** (ficheros) ·
**WebAPI** (solo si hay ServerCloud).

## Desarrollo y tests

El reto de este MCP: la vía **COM** solo se puede probar de verdad con Presto
abierto en Windows — y Presto no corre en CI ni en el equipo donde se
desarrolla. Por eso hay **dos niveles de test**, cada uno cubre lo que el otro
no puede:

```bash
pip install pytest
python -m pytest tests/ -v
```

- **`tests/fake_presto_app.py`** — un objeto COM simulado (`FakePrestoApp`) que
  reproduce los modos de fallo REALES de la API de Presto: máscara sin
  comillas → `"Sintaxis incorrecta en expresión"`, campo no-clave como clave
  → `"Clave incorrecta"`, tabla en minúscula → `"Archivo incorrecto"`. Con él,
  `tests/test_presto_com_mock.py` ejercita el flujo completo
  (`select`→`iterate`→`get_field`, `read_records` en sus dos vías,
  `set_field`/`Rename`) **sin necesitar Presto instalado**. Cualquier
  regresión en `presto_com.py` se ve aquí en segundos, antes de publicar.
- **`presto_selftest`** (tool MCP) — para el otro lado del problema: verificar
  que una instalación de Presto REAL responde bien. Un solo mensaje del
  cliente ("ejecuta `presto_selftest` y pégame el resultado") sustituye a
  varias idas y vueltas probando tools sueltas. `tests/test_selftest.py`
  prueba su lógica (`_run_selftest`) contra el mock.

```bash
python -m py_compile src/presto_mcp/*.py     # comprobar sintaxis
```

**Estado de validación:** parser BC3 (6/6), helpers COM (8/8), flujo COM
completo contra el mock (8/8), autodiagnóstico (4/4) — **26/26 tests**, todos
sin Presto instalado. El servidor MCP **carga y registra 18 tools**. La
conexión COM contra un Presto real solo puede validarse en un equipo con
**Presto 2025 abierto**: para eso está `presto_selftest`, pensado para que esa
última validación sea un solo mensaje, no una sesión de pruebas.

---

## Licencia

MIT · NeoNexAI Agency
