Metadata-Version: 2.5
Name: glpi-mcp
Version: 0.1.1
Summary: MCP server con tools para consultar la API REST de GLPI
Requires-Python: >=3.11
Requires-Dist: httpx>=0.27.0
Requires-Dist: mcp>=1.0.0
Requires-Dist: python-dotenv>=1.0.0
Description-Content-Type: text/markdown

# GLPI MCP

Servidor [MCP](https://modelcontextprotocol.io) que expone tools para consultar y crear
tickets en la [API REST de GLPI](https://glpi-project.org) (App Token + User Token).

## Suscripción requerida

Este MCP requiere una **suscripción activa**. Obtén tu token de suscripción en
**https://globalsoft.lat/pages/glpi** y configúralo en la variable `SUBSCRIPTION_TOKEN`.
Sin un token válido las tools no se ejecutan.

## Tools

| Tool | Descripción |
| --- | --- |
| `list_tickets` | Lista tickets abiertos (opcionalmente filtrados por solicitante). |
| `list_closed_tickets` | Lista tickets cerrados. |
| `get_ticket` | Obtiene un ticket asignado por id. |
| `create_ticket` | Crea un ticket (Incidente o Solicitud). |
| `list_followups` | Lista seguimientos públicos de un ticket. |
| `add_followup` | Agrega un seguimiento (o nota privada) a un ticket. |
| `list_assets` | Lista activos vía el search `AllAssets`. |
| `list_problems` | Lista problemas abiertos. |
| `list_closed_problems` | Lista problemas cerrados. |
| `list_changes` | Lista cambios abiertos. |
| `list_closed_changes` | Lista cambios cerrados. |

## Requisitos

- [uv](https://docs.astral.sh/uv/) (incluye `uvx`).
- Credenciales de la API de GLPI: `GLPI_BASE_URL`, `GLPI_APP_TOKEN` y `GLPI_USER_TOKEN`.
- Token de suscripción: `SUBSCRIPTION_TOKEN` (ver arriba).

## Instalación rápida

No requiere instalación previa; `uvx` descarga y ejecuta el paquete:

```sh
uvx glpi-mcp==0.1.1
```

El transporte por defecto es `stdio`, que es lo que usan los clientes MCP. El servidor
lee las credenciales desde variables de entorno.

## Variables de entorno

| Variable | Obligatoria | Descripción |
| --- | --- | --- |
| `GLPI_BASE_URL` | Sí | URL base de GLPI **sin** `/apirest.php`. Ej: `https://glpi.ejemplo.com` |
| `GLPI_APP_TOKEN` | Sí | App Token generado en GLPI (Setup > General > API). |
| `GLPI_USER_TOKEN` | Sí | User Token del usuario de API. |
| `SUBSCRIPTION_TOKEN` | Sí | Token de suscripción de la plataforma (https://globalsoft.lat/pages/glpi). |

## Configuración por cliente

Reemplaza `<url_glpi>`, `<glpi_app_token>`, `<glpi_user_token>` y `<subscription_token>`
por tus valores.

### Claude Code

```sh
claude mcp add glpi \
  -e GLPI_BASE_URL=<url_glpi> \
  -e GLPI_APP_TOKEN=<glpi_app_token> \
  -e GLPI_USER_TOKEN=<glpi_user_token> \
  -e SUBSCRIPTION_TOKEN=<subscription_token> \
  -- uvx glpi-mcp==0.1.1
```

### Codex

CLI:

```sh
codex mcp add glpi \
  --env GLPI_BASE_URL=<url_glpi> \
  --env GLPI_APP_TOKEN=<glpi_app_token> \
  --env GLPI_USER_TOKEN=<glpi_user_token> \
  --env SUBSCRIPTION_TOKEN=<subscription_token> \
  -- uvx glpi-mcp==0.1.1
```

O en `~/.codex/config.toml` (o `.codex/config.toml` en el proyecto):

```toml
[mcp_servers.glpi]
command = "uvx"
args = ["glpi-mcp==0.1.1"]
env = { GLPI_BASE_URL = "<url_glpi>", GLPI_APP_TOKEN = "<glpi_app_token>", GLPI_USER_TOKEN = "<glpi_user_token>", SUBSCRIPTION_TOKEN = "<subscription_token>" }
```

### Antigravity

En `~/.gemini/config/mcp_config.json` (global) o `.agents/mcp_config.json` (workspace):

```json
{
  "mcpServers": {
    "glpi": {
      "command": "uvx",
      "args": ["glpi-mcp==0.1.1"],
      "env": {
        "GLPI_BASE_URL": "<url_glpi>",
        "GLPI_APP_TOKEN": "<glpi_app_token>",
        "GLPI_USER_TOKEN": "<glpi_user_token>",
        "SUBSCRIPTION_TOKEN": "<subscription_token>"
      }
    }
  }
}
```

### opencode

En `opencode.jsonc` (o `~/.config/opencode/opencode.json`):

```jsonc
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "glpi": {
      "type": "local",
      "command": ["uvx", "glpi-mcp==0.1.1"],
      "environment": {
        "GLPI_BASE_URL": "<url_glpi>",
        "GLPI_APP_TOKEN": "<glpi_app_token>",
        "GLPI_USER_TOKEN": "<glpi_user_token>",
        "SUBSCRIPTION_TOKEN": "<subscription_token>"
      },
      "enabled": true
    }
  }
}
```

### Otros clientes (formato genérico `mcpServers`)

Válido para Claude Desktop y otros clientes que usan el formato `mcpServers`:

```json
{
  "mcpServers": {
    "glpi": {
      "command": "uvx",
      "args": ["glpi-mcp==0.1.1"],
      "env": {
        "GLPI_BASE_URL": "<url_glpi>",
        "GLPI_APP_TOKEN": "<glpi_app_token>",
        "GLPI_USER_TOKEN": "<glpi_user_token>",
        "SUBSCRIPTION_TOKEN": "<subscription_token>"
      }
    }
  }
}
```

## Troubleshooting

- **`Error de configuración: Falta la variable de entorno ...`**: el proceso no ve las
  variables requeridas. Verifica que estén definidas en el bloque `env`/`environment` del
  cliente correspondiente (o en un `.env` si ejecutas desde el repo).
- **Las tools devuelven un JSON de error de suscripción**: el `SUBSCRIPTION_TOKEN` no es
  válido, está expirado o la póliza no está activa. Obtén/renueva el token en
  https://globalsoft.lat/pages/glpi. La validación es *fail-closed* y el resultado válido
  se cachea 60s.
- **`GLPI_BASE_URL` mal formada**: debe ser la raíz del GLPI **sin** `/apirest.php`
  (ej. `https://glpi.ejemplo.com`). Los paths internos de la API ya agregan `/apirest.php/`.
- **Verificar que el paquete arranca** (con las variables ya exportadas en el shell):

  ```sh
  uvx glpi-mcp==0.1.1
  ```

  Si faltan variables, el proceso termina con `SystemExit` y el mensaje de configuración;
  es el comportamiento esperado.
