Skip to main content
Glama
gmorande

Buk MCP

by gmorande
README.md
# Buk MCP

Servidor MCP comunitario para conectar **Buk Chile** con ChatGPT, Dots y otros clientes MCP. Incluye el catálogo completo de la API oficial indicada abajo y herramientas para **historial salarial, remuneraciones, costo de equipos y comparación con el IPC**.

Cada empresa utiliza su propia URL de Buk y su propia API key. El proyecto se puede autoalojar; el modo OAuth permite que varias empresas conecten sus credenciales por separado a un mismo servidor. No necesitas una API key de OpenAI para ejecutar el adaptador.

**Integración independiente, sin afiliación ni aprobación de Buk.** Este repositorio contiene código y datos públicos del IPC; no contiene claves ni datos de empleados. Publicar el código no publica un servicio alojado ni lo instala automáticamente en ChatGPT o Todd.

## Qué incluye

- **206 operaciones documentadas** en el esquema oficial de Chile: **119 GET** y **87 operaciones de escritura**. El catálogo se genera del esquema, sin mantener manualmente una lista parcial de rutas.
- Descubrimiento de operaciones, parámetros, permisos y esquemas de respuesta. Puedes consultar cualquier endpoint documentado a través de las herramientas genéricas.
- Sueldo base histórico, aumentos, jornada, moneda y liquidaciones por período.
- Costo mensual de equipos según la fórmula estándar de Buk, con aportes observados, desglose por persona, haberes fijos/ocasionales y comparación mensual.
- Simulación de cambios del sueldo base sin modificar Buk.
- Comparación del sueldo con la serie mensual empalmada del **INE de Chile**.
- Paginación, validación de parámetros, límites de tamaño, timeout, reintentos de lectura y errores con permisos o cobertura incompleta explícitos.
- Transporte **stdio** y **Streamable HTTP**. HTTP ofrece OAuth con PKCE para varias empresas, o bearer fijo para una instalación aislada.
- Pruebas de protocolo MCP, API, cálculos, autenticación y separación de empresas; CI para Node 22 y 24.

Las escrituras están **desactivadas por defecto** y no están disponibles en OAuth compartido. Una instalación aislada puede habilitarlas explícitamente. La cobertura del catálogo no elimina los permisos de la API key ni las restricciones de módulos contratados.

## Inicio rápido: cliente MCP local

Requisitos: **Node.js 22 o superior** y una API key de Buk. Para sueldos se requieren permisos de lectura de remuneraciones y acceso a información sensible.

```sh
git clone https://github.com/gmorande/buk-mcp.git
cd buk-mcp
npm ci
npm run build
```

En la configuración del cliente MCP, agrega el proceso con una ruta absoluta. Sustituye los valores de ejemplo en un archivo privado del cliente:

```json
{
  "mcpServers": {
    "buk": {
      "command": "node",
      "args": ["/ruta/absoluta/buk-mcp/dist/index.js", "stdio"],
      "env": {
        "BUK_TENANT_URL": "https://tuempresa.buk.cl",
        "BUK_API_KEY": "TU_CLAVE_PRIVADA",
        "BUK_COUNTRY": "chile",
        "BUK_ALLOW_WRITES": "false"
      }
    }
  }
}
```

La clave va en la configuración privada o gestor de secretos. No debe aparecer en prompts, argumentos de herramientas, commits o issues.

También puedes preparar un `.env` a partir de `.env.example` y usar:

```sh
node --env-file=.env dist/index.js stdio
```

El proceso stdio se comunica con un cliente MCP mediante stdin/stdout; no es una consola interactiva de preguntas.

## ChatGPT, Todd y un servicio para varias empresas

Para clientes cloud utiliza el modo HTTP con OAuth, detrás de HTTPS:

```dotenv
BUK_AUTH_MODE=oauth
PUBLIC_URL=https://mcp.tudominio.cl
HOST=127.0.0.1
PORT=3000
OAUTH_DATA_DIR=/var/lib/buk-mcp
OAUTH_MASTER_KEY=32_BYTES_ALEATORIOS_CODIFICADOS_EN_BASE64
OAUTH_REDIRECT_URIS=https://chatgpt.com/connector_platform/oauth_redirect
```

```sh
node --env-file=.env dist/index.js http
```

Registra `https://mcp.tudominio.cl/mcp` como MCP personalizado con OAuth en el cliente. La página de conexión solicita la URL y la API key de **esa empresa**, las verifica y guarda la credencial cifrada. El token OAuth queda vinculado a esa conexión; cada solicitud usa su propio cliente Buk.

El operador del servicio puede acceder a los datos autorizados por esas claves: cada empresa debe elegir un operador de confianza o autoalojar. La implementación incluida usa **un proceso y una réplica** con almacenamiento cifrado persistente. La guía explica HTTPS, callbacks, rotación, revocación, límites y despliegue con Docker.

**Guía completa:** [DEPLOYMENT.md](docs/DEPLOYMENT.md). La conexión personalizada y la admisión en el catálogo público de ChatGPT son procesos distintos; el proyecto no afirma tener aprobación del catálogo.

## Preguntas de ejemplo

Sustituye **X** por una persona y especifica el período cuando sea relevante. El asistente debe resolver la ficha correcta y aclarar nombres de equipo ambiguos. “Tech” es un ejemplo de área: cada empresa utiliza su propia estructura.

Estas son las preguntas que ejecuta la suite `test:live`. El informe de verificación distingue éxito, datos parciales y fallos; no contiene los resultados de RR.HH.

| ID | Pregunta | Herramienta principal |
| --- | --- | --- |
| Q01 | Busca a X y dime si tiene más de una ficha. | `buk_search_employees` |
| Q02 | Muéstrame las áreas y subáreas de la organización. | `buk_read` → áreas |
| Q03 | ¿Cuánto me costó mensualmente el equipo Tech en el último mes cerrado? Dame el total y el desglose por persona. | `buk_team_payroll` |
| Q04 | Separa los haberes fijos, ocasionales y aportes patronales del equipo Tech. | `buk_team_payroll` |
| Q05 | ¿Cómo cambió el costo de Tech frente al mes anterior y cuántas personas o fichas había en cada mes? | `buk_team_payroll` con comparación |
| Q06 | ¿Quiénes integraban Tech a una fecha determinada y cuánto sumaban sus sueldos base mensuales? | `buk_recurring_payroll` |
| Q07 | Si subo 5% los sueldos base de Tech, ¿cuánto aumenta mensualmente esa suma? | `buk_recurring_payroll` con escenario |
| Q08 | Dame la evolución histórica del sueldo de X, con las fechas y porcentajes de sus aumentos. | `buk_salary_history` |
| Q09 | Compara la evolución del sueldo base de X con el IPC. ¿Ganó o perdió poder adquisitivo? | `buk_salary_history` con IPC |
| Q10 | ¿Cuánto tuvo X de haberes brutos, descuentos y líquido en un mes determinado? | `buk_read` → liquidaciones de la ficha |
| Q11 | ¿Cuántos días de vacaciones tenía X a una fecha determinada, descontando las vacaciones futuras registradas? | `buk_read` → saldo de vacaciones |
| Q12 | ¿Qué empresas o razones sociales puede consultar esta conexión? | `buk_read` → empresas |

La verificación comprueba las llamadas y los cálculos necesarios para responder. No es una promesa de que cualquier modelo responda correctamente a cualquier redacción ni una prueba de todos los endpoints contra producción.

## Herramientas MCP

El servidor mantiene pocas herramientas y descubre el catálogo completo bajo demanda. No obliga al cliente a cargar 206 descripciones a la vez.

| Herramienta | Función |
| --- | --- |
| `buk_list_operations` | Buscar operaciones por texto, módulo/tag y método; listar el catálogo con paginación. |
| `buk_describe_operation` | Obtener parámetros, permisos y esquemas oficiales antes de una llamada. |
| `buk_read` | Ejecutar cualquier GET documentado con validación y paginación. |
| `buk_write` | Ejecutar operaciones de escritura; sólo aparece cuando el servidor aislado las habilita. |
| `buk_search_employees` | Encontrar personas y fichas, señalando coincidencias ambiguas. |
| `buk_team_payroll` | Calcular remuneraciones y costo de un equipo para un mes; comparar períodos. |
| `buk_salary_history` | Consultar sueldo base histórico, liquidaciones y comparación opcional con IPC. |
| `buk_recurring_payroll` | Sumar sueldo base vigente a una fecha y simular variaciones porcentuales. |
| `buk_compare_salary_to_cpi` | Comparar dos sueldos en CLP con índices oficiales de dos meses. |

También ofrece los recursos `buk://api/catalog`, `buk://schema/chile` y `buk://guide/payroll`, más prompts para costo de equipo e historial salarial.

### Ejemplo de llamada

Primero descubre y describe la operación; sus parámetros y formatos de fecha pueden variar.

```json
{
  "name": "buk_read",
  "arguments": {
    "operationId": "get_employees_id_jobs",
    "path": { "id": "123" },
    "paginate": true
  }
}
```

```json
{
  "name": "buk_team_payroll",
  "arguments": {
    "team": "Tech",
    "month": "2026-09",
    "compare_previous": true
  }
}
```

Los IDs de operación se derivan del método y la ruta. El catálogo del servidor es la autoridad; el ejemplo de ficha `123` es ficticio.

## Cómo calcula sueldos y costos

**Costo estándar Buk:** total de haberes + aportes patronales observados − asignación familiar. El servidor verifica los componentes de la liquidación y su reconciliación. La ausencia de aportes no se transforma silenciosamente en cero. Los ítems informativos, como el saldo acumulado de una provisión, no se suman como gastos mensuales.

**Costo contable personalizado:** si la empresa usa otra definición, `expense_accounts` permite indicar las cuentas de gasto aprobadas. Suma débitos menos créditos de esas cuentas, evitando sumar pasivos o contrapartidas. El mapeo requiere validación de Finanzas. No se mezclan automáticamente los dos métodos.

**Historia y pertenencia a equipos:** usa trabajos con fechas efectivas para el mes consultado. Un cambio de área dentro del mes se señala como provisional; para una distribución exacta se necesitan los centros de costo correspondientes. La jerarquía de áreas puede ser la actual: si hubo una reorganización histórica, usa `area_ids` explícitos e `include_descendants=false`.

**Sueldo vigente:** la proyección de sueldo base excluye bonos, gratificaciones, aportes y otros componentes. El escenario de 5% representa ese aumento del sueldo base; no estima de forma implícita todas las cargas adicionales.

**IPC:** calcula `(sueldo final / sueldo inicial) / (IPC final / IPC inicial) - 1`, con meses coincidentes. Descarga la serie mensual empalmada del INE y conserva una copia pública fechada como respaldo. Si falta el mes solicitado, no inventa el dato. Usa los niveles publicados del índice; el redondeo puede producir pequeñas diferencias frente a una calculadora con precisión interna adicional.

Siempre separa monedas, sueldos base, bruto, descuentos, líquido y costo empresa. `income_net` es el líquido indicado por Buk, no una confirmación de transferencia bancaria. Costos de proveedores, contratistas o beneficios fuera de Buk requieren otra fuente.

Detalles, supuestos y límites: [ANALYTICS.md](docs/ANALYTICS.md).

## Cobertura de la API

Fuente oficial: [Swagger de Buk Chile](https://demo.buk.cl/api/chile/es/api_docs), visible en [apidocs](https://demo.buk.cl/apidocs). Snapshot: **23 de octubre de 2026**.

| Método | Operaciones |
| --- | ---: |
| GET | 119 |
| POST | 46 |
| PUT | 6 |
| PATCH | 18 |
| DELETE | 17 |
| **Total** | **206** |

La cobertura significa que cada operación del esquema tiene un ID, descripción, esquema de entrada y un camino de ejecución. Los módulos o endpoints privados, de otros países, de otros productos Buk o ausentes del documento suministrado no se inventan ni se presentan como verificados.

El documento oficial contiene algunas inconsistencias y una referencia de respuesta sin definición. Las normalizaciones y la lista completa de rutas están en [API_COVERAGE.md](docs/API_COVERAGE.md). El esquema original se conserva íntegro en `schema/buk-chile.json`.

Para actualizarlo:

```sh
npm run schema:update
npm run check
```

Revisa el diff antes de incorporar cambios del contrato. La actualización de esquema no ejecuta escrituras en Buk.

## Pruebas

**Verificación del 23 de octubre de 2026:** las **12 preguntas del README** pasaron con una cuenta real de Buk Chile, usando un cliente MCP por stdio. Se comprobaron consultas y conciliaciones matemáticas, exclusivamente en lectura. El [informe anonimizado](docs/verification.json) contiene los estados y comprobaciones. Los datos reales, la clave y la identidad del cliente no están incluidos.

```sh
npm ci
npm run check
```

La suite local usa fixtures ficticios. Comprueba todos los esquemas, validación, paginación, formatos de solicitud, límites, reintentos, errores, matemáticas, OAuth/PKCE, revocación, aislamiento de empresas y llamadas MCP reales por transportes de prueba. GitHub Actions ejecuta estas pruebas sin credenciales Buk.

Para verificar las 12 preguntas con una cuenta autorizada, configura tu `.env` privado y ejecuta:

```sh
BUK_LIVE_TEAM=Tech BUK_LIVE_MONTH=2026-09 \
node --env-file=.env --import tsx scripts/live-test.ts
```

Puedes definir `BUK_LIVE_EMPLOYEE_ID` y `BUK_LIVE_START_MONTH`. Por defecto, el script elige una ficha con historial accesible y usa el mes anterior. Si necesitas un informe, indica `BUK_LIVE_REPORT=/ruta/informe.json`; sólo escribe preguntas, estados, comprobaciones y códigos de limitación. No guarda respuestas de Buk. El script fuerza lectura y falla si el servidor expone una herramienta de escritura.

Si hay áreas activas e históricas con el mismo nombre, usa `BUK_LIVE_TEAM` con un nombre único de la jerarquía. Las herramientas devuelven candidatos cuando el nombre es ambiguo; no mezclan automáticamente áreas homónimas.

Un fallo de permisos, un período abierto o datos incompletos no se reportan como éxito. Las pruebas de escritura usan simulaciones; no alteran datos reales para comprobar el catálogo.

## Seguridad y contribuciones

Consulta [SECURITY.md](SECURITY.md). Antes de abrir un issue, elimina claves, dominios privados, nombres, RUT, montos y respuestas completas. Adjunta una reproducción con datos ficticios.

Las mejoras deben conservar la separación por empresa, la trazabilidad de cálculos y las señales de cobertura. Una nueva operación debe venir del esquema oficial; un nuevo cálculo financiero necesita una definición explícita y pruebas de los casos que podrían cambiar su resultado.

Licencia del código: [MIT](LICENSE). Los esquemas y series públicas incluidos mantienen la atribución a Buk y al INE; la licencia del código no reemplaza sus condiciones de uso.

TDQS

A3.7/5.0

Scored across 8 tools

Disambiguation4/5

The discovery trio (list/describe/read) has clear roles, and the payroll analytics tools are differentiated by cost basis, scope, and purpose. The main overlap is that buk_read can access any GET endpoint, including data also served by specialized tools like buk_search_employees and payroll helpers, so agents may occasionally hesitate between raw read and specialized analysis.

Naming Consistency4/5

All tools use a consistent buk_ prefix and snake_case naming. Most follow a verb_noun pattern, but several are noun phrases (team_payroll, salary_history, recurring_payroll) and buk_read is a bare verb, creating minor convention drift.

Tool Count5/5

Eight tools is well scoped for a Buk API wrapper with discovery, generic read access, and a few high-value payroll analytics helpers. Each tool appears to earn its place without an excessively broad or thin surface.

Completeness3/5

The server covers discovery and read access comprehensively via buk_read, plus useful payroll and CPI analytics. However, it is effectively read-only and lacks any create, update, or delete operations, which is a notable gap for an API integration surface.

Maintenance

ActivityMaintained
ResponsivenessNo issues