APsystems MCP Server

Un servidor del Protocolo de Contexto de Modelo (MCP) escrito en Go que envuelve la APsystems OpenAPI, brindando a asistentes de IA como Claude acceso directo a tus datos de monitoreo solar. Incluye un panel web opcional para monitoreo visual.

Documentación

APsystems MCP Server ☀️🛰️

Un servidor de Model Context Protocol (MCP) listo para producción escrito en Go que envuelve la APsystems OpenAPI, brindando a asistentes de IA como Claude acceso directo a tus datos de monitoreo solar. Incluye un panel web opcional para monitoreo visual.

Build Go Latest Release Docker Pulls Docker Image Size Platform License


Tabla de contenido

Características

  • 16 herramientas MCP que cubren todos los endpoints de la API de APsystems: detalles del sistema, resúmenes de energía, datos de ECU/inversores/medidores/almacenamiento
  • Autenticación por firma HMAC-SHA256 — implementa el protocolo de firma de APsystems
  • Panel web integrado — aplicación de una sola página con tema oscuro y visualizaciones de energía con Chart.js
  • Límite de velocidad — limitación de solicitudes configurable para respetar los límites de la API
  • Reintentos automáticos — retroceso exponencial en errores transitorios y respuestas de límite de velocidad
  • Transporte dual — stdio (predeterminado) o SSE sobre HTTP, seleccionable mediante variable de entorno
  • Registro estructurado — registros JSON mediante slog con niveles configurables
  • Soporte de Podman — Containerfile de múltiples etapas para imágenes de producción mínimas
  • CI/CD — GitHub Actions para pruebas, linting y lanzamientos multiplataforma

Inicio rápido

🚀 Requisitos previos

Antes de comenzar, asegúrate de tener:

  • 🦫 Go (se recomienda la última versión)
  • 🔑 Credenciales de APsystems OpenAPI (APP_ID y APP_SECRET)
  • 🆔 ID del sistema (SID) — Encuéntralo en la aplicación APsystems EMA en Configuración → Detalles de la cuenta
Cómo obtener tus credenciales de API
  1. ✉️ Envía un correo a soporte de APsystems e incluye:
    • Quién eres
    • Por qué necesitas acceso a la API
    • Qué planeas hacer con los datos
  2. 📱 O consíguelas desde la Android / iOS aplicación APsystems EMA:

Instalación y ejecución

git clone https://github.com/mjrgr/apsystems-mcp-server.git
cd mcp-server

# Install dependencies
go mod tidy

# Set credentials
export APS_SYS_ID="your_fake_sid_1234567890"
export APS_APP_ID="your_fake_app_id_32charslong1234567890abcd"
export APS_APP_SECRET="your_fake_secret12"

# Build and run
go run ./cmd/server

Con transporte SSE

Por defecto, el servidor usa stdio (entrada/salida estándar) para la comunicación MCP. Establece APS_MCP_TRANSPORT=sse para iniciar un servidor HTTP con Server-Sent Events en su lugar:

export APS_MCP_TRANSPORT=sse
export APS_MCP_SSE_ADDR=:8888     # optional, defaults to :8888
go run ./cmd/server
# SSE endpoint: http://localhost:8888/sse
# Message endpoint: http://localhost:8888/message

Esto es útil cuando quieres conectar clientes MCP remotos a través de HTTP en lugar de ejecutar el servidor como un proceso hijo.

Con panel web

export APS_DASHBOARD=true
export APS_DASH_ADDR=:8080
go run ./cmd/server
# Dashboard available at http://localhost:8080

Demo del panel web

iniciar con Podman

podman build -t apsystems-mcp -f Containerfile .
podman run --rm \
  -e APS_SYS_ID="your_fake_sid_1234567890" \
  -e APS_APP_ID="your_fake_app_id_32charslong1234567890abcd" \
  -e APS_APP_SECRET="your_fake_secret12" \
  -e APS_DASHBOARD=true \
  -p 8080:8080 \
  apsystems-mcp

Para ejecutar con transporte SSE en lugar de stdio:

podman run --rm \
  -e APS_SYS_ID="your_fake_sid_1234567890" \
  -e APS_APP_ID="your_fake_app_id_32charslong1234567890abcd" \
  -e APS_APP_SECRET="your_fake_secret12" \
  -e APS_MCP_TRANSPORT=sse \
  -e APS_MCP_SSE_ADDR=:8888 \
  -e APS_DASHBOARD=true \
  -p 8888:8888 -p 8080:8080 \
  apsystems-mcp
# SSE endpoint: http://localhost:8888/sse

Dashboard Screenshot

Tabla de variables de entorno

VariableRequeridaValor de ejemploDescripción
APS_APP_IDSíyour_fake_app_id_32charslong1234567890abcdID de aplicación APsystems de 32 caracteres
APS_APP_SECRETSíyour_fake_secret12Secreto de aplicación APsystems de 12 caracteres
APS_SYS_IDSíyour_fake_sid_1234567890ID del sistema (SID) de la aplicación EMA, Configuración → Detalles de la cuenta
APS_BASE_URLNohttps://api.apsystemsema.com:9282Anulación de la URL base de la API
APS_MCP_TRANSPORTNostdioTransporte MCP: stdio (predeterminado) o sse
APS_MCP_SSE_ADDRNo:8888Dirección de escucha del servidor SSE (solo cuando APS_MCP_TRANSPORT=sse)
APS_DASHBOARDNotrueEstablece true para habilitar el panel web
APS_DASH_ADDRNo:8080Dirección de escucha del panel web
APS_LOG_LEVELNoinfoNivel de registro: debug, info, warn, error

Seguridad

🔒 Mejores prácticas de seguridad

  • Nunca confirmes credenciales o secretos reales de la API en el control de versiones. Usa .env.local o variables de entorno para el desarrollo local.
  • Rota tu APP_SECRET y SID si sospechas que están comprometidos.
  • Reporta vulnerabilidades abriendo un issue de seguridad o enviando un correo a los mantenedores.
  • Para producción, usa un administrador de secretos o inyección de entorno (no archivos en texto plano).
VariableRequeridaPredeterminadoDescripción
APS_APP_IDSí—ID de aplicación APsystems de 32 caracteres
APS_APP_SECRETSí—Secreto de aplicación APsystems de 12 caracteres
APS_BASE_URLNohttps://api.apsystemsema.com:9282Anulación de la URL base de la API
APS_SYS_IDNo—Identificador de sistema predeterminado (sid) para todas las llamadas a la API si no se proporciona en los argumentos de la herramienta
APS_MCP_TRANSPORTNostdioTransporte MCP: stdio o sse
APS_MCP_SSE_ADDRNo:8888Dirección de escucha del servidor SSE (solo cuando el transporte es sse)
APS_DASHBOARDNofalseEstablece true para habilitar el panel web
APS_DASH_ADDRNo:8080Dirección de escucha del panel web
APS_LOG_LEVELNoinfoNivel de registro: debug, info, warn, error

Referencia de herramientas MCP

Herramientas del sistema

HerramientaDescripción
get_system_detailsInformación del sistema: capacidad, zona horaria, ECUs, estado
get_invertersLista todos los ECUs y microinversores conectados
get_metersLista todos los IDs de medidores
get_system_summaryTotales de energía: hoy, mes, año, vida útil (kWh)
get_system_energyEnergía por período: horaria/diaria/mensual/anual

Herramientas ECU

HerramientaDescripción
get_ecu_summaryResumen de energía para un ECU específico
get_ecu_energyEnergía por período para un ECU (admite telemetría por minutos)

Herramientas de inversores

HerramientaDescripción
get_inverter_summaryEnergía por canal para un solo inversor
get_inverter_energyDatos por período/minuto con potencia DC, corriente, voltaje, telemetría AC
get_inverter_batch_energyTodos los inversores bajo un ECU en una sola llamada

Herramientas de medidores

HerramientaDescripción
get_meter_summaryTotales consumidos/exportados/importados/producidos
get_meter_periodDatos de energía por período para un medidor

Herramientas de almacenamiento

HerramientaDescripción
get_storage_latestEstado en vivo: SOC, potencia de carga/descarga
get_storage_summaryResumen de energía para un ECU de almacenamiento
get_storage_periodDatos de energía por período para almacenamiento

Uso con Claude Desktop

Uso con Claude CLI

También puedes conectar este servidor MCP a Claude CLI para acceso directo y programable a tus datos solares desde la terminal.

1. Iniciar el servidor MCP

Asegúrate de que tu servidor MCP esté en ejecución y sea accesible (local o remotamente):

go run ./cmd/server
# or with Podman/Docker as shown above

2. Configurar Claude CLI

Agrega tu servidor MCP a Claude CLI usando el comando integrado:

Podman/Docker (recomendado para uso en contenedores)
claude mcp add apsystems -s local -- podman run -i --rm -p 8888:8080 -e APS_DASHBOARD=true -e APS_SYS_ID=your_fake_sid_1234567890 -e APS_APP_ID=your_fake_app_id_32charslong1234567890abcd -e APS_APP_SECRET=your_fake_secret12 docker.io/mehdijrgr/apsystems-mcp-server 2>&1

O para Docker:

claude mcp add apsystems -s local -- docker  run -i --rm -p 8888:8080 -e APS_DASHBOARD=true -e APS_SYS_ID=your_fake_sid_1234567890 -e APS_APP_ID=your_fake_app_id_32charslong1234567890abcd -e APS_APP_SECRET=your_fake_secret12 docker.io/mehdijrgr/apsystems-mcp-server 2>&1

Reemplaza las variables de entorno con tus credenciales reales.

Esto actualizará automáticamente tu configuración de Claude CLI para incluir el servidor MCP apsystems.

3. Ejemplo de uso

Pídele a Claude CLI que consulte tus datos solares a través del servidor MCP:

claude ask "Show me my solar production for today"

screen_solar_today

O usa cualquier herramienta MCP compatible, por ejemplo:

claude ask "List all my inverters"

screen_solar_inverters

claude ask "what's the average monthly solar production?"

screen_solar_today

¡Puedes crear scripts y automatizar consultas, integrarte con otras herramientas o usar Claude CLI en tus flujos de trabajo!

Para usar Claude Desktop con Docker o Podman, actualiza tu claude_desktop_config.json de la siguiente manera:

{
  "inputs": [
    {
      "type": "promptString",
      "id": "aps_sys_id",
      "description": "APsystems System ID"
    },
    {
      "type": "promptString",
      "id": "aps_app_id",
      "description": "APsystems App ID"
    },
    {
      "type": "promptString",
      "id": "aps_app_secret",
      "description": "APsystems App Secret",
      "password": true
    }
  ],
  "mcpServers": {
    "apsystems": {
      "command": "podman",
      "args": [
        "run", "-i", "--rm", "-p", "8888:8080",
        "-e", "APS_DASHBOARD=true",
        "-e", "APS_SYS_ID=${input:aps_sys_id}",
        "-e", "APS_APP_ID=${input:aps_app_id}",
        "-e", "APS_APP_SECRET=${input:aps_app_secret}",
        "docker.io/mehdijrgr/apsystems-mcp-server"
      ]
    }
  }
}

O para Docker:

{
  "inputs": [
    {
      "type": "promptString",
      "id": "aps_sys_id",
      "description": "APsystems System ID"
    },
    {
      "type": "promptString",
      "id": "aps_app_id",
      "description": "APsystems App ID"
    },
    {
      "type": "promptString",
      "id": "aps_app_secret",
      "description": "APsystems App Secret",
      "password": true
    }
  ],
  "mcpServers": {
    "apsystems": {
      "command": "docker",
      "args": [
        "run", "-i", "--rm", "-p", "8888:8080",
        "-e", "APS_DASHBOARD=true",
        "-e", "APS_SYS_ID=${input:aps_sys_id}",
        "-e", "APS_APP_ID=${input:aps_app_id}",
        "-e", "APS_APP_SECRET=${input:aps_app_secret}",
        "docker.io/mehdijrgr/apsystems-mcp-server"
      ]
    }
  }
}

Para transporte SSE (modo remoto/red), usa el campo url en lugar de command:

{
  "mcpServers": {
    "apsystems": {
      "url": "http://localhost:8888/sse"
    }
  }
}

También puedes montar un archivo de configuración o credenciales según sea necesario:

{
  "mcpServers": {
    "apsystems": {
      "command": "podman run -i --rm --env-file /path/to/env.local mehdijrgr/apsystems-mcp-server 2>&1",
      "env": {}
    }
  }
}

Luego pregúntale a Claude cosas como:

  • "Muéstrame mi producción solar de hoy"
  • "¿Cuánta energía produjo mi sistema este mes?"
  • "¿Cuál es el estado de mis inversores?"
  • "Compara mi producción diaria de esta semana"

Estructura del proyecto

├── cmd/server/          # CLI entry point
├── internal/
│   ├── api/             # HTTP client with auth, retries, rate limiting
│   ├── auth/            # HMAC-SHA256 signature implementation
│   ├── dashboard/       # Optional web UI (embedded HTML)
│   ├── mcp/             # MCP tool definitions and handlers
│   └── models/          # Go structs for API responses
├── .devcontainer/       # VS Code dev container config
├── .github/workflows/   # CI/CD pipelines
├── .vscode/             # Editor settings and launch configs
├── Containerfile        # Multi-stage Podman/OCI build
├── Makefile             # Build, test, lint targets
└── go.mod

Detalles de autenticación

La API de APsystems usa autenticación por firma HMAC. Cada solicitud incluye cinco encabezados personalizados:

  1. X-CA-AppId — tu identificador de aplicación
  2. X-CA-Timestamp — marca de tiempo Unix en milisegundos
  3. X-CA-Nonce — cadena hexadecimal única de 32 caracteres (UUID sin guiones)
  4. X-CA-Signature-Method — HmacSHA256
  5. X-CA-Signature — Base64(HMAC-SHA256(stringToSign, appSecret))

La cadena a firmar se compone como:

timestamp/nonce/appId/requestPath/HTTPMethod/HmacSHA256

donde requestPath es el último segmento de la ruta de la URL.

Desarrollo

# Run tests
make test

# Lint
make lint

# Build for all platforms
make build

Códigos de error de la API

CódigoDescripción
0Éxito
1000Excepción de datos
1001Sin datos
2001Cuenta de aplicación no válida
2002No autorizado
2005Límite de acceso excedido
4001Parámetro de solicitud no válido
5000Error interno del servidor
7002Demasiadas solicitudes (reintento automático)
7003Sistema ocupado (reintento automático)

Solución de problemas

ℹ️ Nota: Si encuentras errores de API, verifica que tus credenciales (APP_ID, APP_SECRET, SID) sean correctas y que tu cuenta tenga habilitado el acceso a la API. Si ves errores de límite de velocidad, inténtalo de nuevo más tarde o ajusta la frecuencia de tus solicitudes.

  • P: Recibo errores de 'No autorizado' o 'Cuenta de aplicación no válida'.
    • R: Vuelve a verificar tu APP_ID, APP_SECRET y SID. Asegúrate de que APsystems haya aprobado tu cuenta para el acceso a la API.
  • P: Claude CLI no puede conectarse al servidor MCP.
    • R: Asegúrate de que el servidor esté en ejecución y de que la dirección/puerto coincida con tu configuración de CLI. Verifica el firewall o las asignaciones de puertos del contenedor.
  • P: El panel no carga.
    • R: Asegúrate de que APS_DASHBOARD esté configurado como true y de que el servidor esté en ejecución. Visita el puerto correcto en tu navegador.

Comunidad y Soporte

Contribuciones

¡Las contribuciones son bienvenidas! Para comenzar:

  1. Haz un fork del repositorio
  2. Crea una nueva rama para tu función o corrección
  3. Realiza tus cambios y añade pruebas si es necesario
  4. Abre una solicitud de extracción (pull request) con una descripción clara

Consulta CONTRIBUTING.md si está disponible, o abre un issue para discutir cambios importantes primero.

Enlaces rápidos