APsystems MCP Server

Um servidor Model Context Protocol (MCP) escrito em Go que encapsula a APsystems OpenAPI, permitindo que assistentes de IA como Claude tenham acesso direto aos seus dados de monitoramento solar. Inclui um painel web opcional para monitoramento visual.

Documentação

APsystems MCP Server ☀️🛰️

Um servidor Model Context Protocol (MCP) pronto para produção, escrito em Go, que encapsula a APsystems OpenAPI, dando a assistentes de IA como o Claude acesso direto aos seus dados de monitoramento solar. Inclui um painel web opcional para monitoramento visual.

Build Go Latest Release Docker Pulls Docker Image Size Platform License


Sumário

Recursos

  • 16 ferramentas MCP cobrindo todos os endpoints da API APsystems: detalhes do sistema, resumos de energia, dados de ECU/inversor/medidor/armazenamento
  • Autenticação por assinatura HMAC-SHA256 — implementa o protocolo de assinatura da APsystems
  • Painel web integrado — aplicativo de página única com tema escuro e visualizações de energia com Chart.js
  • Limitação de taxa — controle de requisições configurável para respeitar os limites da API
  • Tentativas automáticas — back-off exponencial em erros transitórios e respostas de limite de taxa
  • Transporte duplo — stdio (padrão) ou SSE via HTTP, selecionável por variável de ambiente
  • Registro estruturado — logs JSON via slog com níveis configuráveis
  • Suporte a Podman — Containerfile multi-estágio para imagens de produção mínimas
  • CI/CD — GitHub Actions para testes, linting e lançamentos multiplataforma

Início Rápido

🚀 Pré-requisitos

Antes de começar, certifique-se de ter:

  • 🦫 Go (versão mais recente recomendada)
  • 🔑 Credenciais da APsystems OpenAPI (APP_ID e APP_SECRET)
  • 🆔 ID do Sistema (SID) — Encontre-o no aplicativo APsystems EMA em Settings → Account Details
Como obter suas credenciais de API
  1. ✉️ Envie um e-mail ao suporte da APsystems e inclua:
    • Quem você é
    • Por que você precisa de acesso à API
    • O que você planeja fazer com os dados
  2. 📱 Ou obtenha-as no Android / iOS aplicativo APsystems EMA:

Instalação e Execução

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

Com Transporte SSE

Por padrão, o servidor usa stdio (entrada/saída padrão) para comunicação MCP. Defina APS_MCP_TRANSPORT=sse para iniciar um servidor HTTP com Server-Sent Events:

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

Isso é útil quando você deseja conectar clientes MCP remotos via HTTP em vez de executar o servidor como um processo filho.

Com Painel

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

Demonstração do Painel

iniciar com 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 executar com transporte SSE em vez 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

Tabela de Variáveis de Ambiente

VariávelObrigatórioValor de ExemploDescrição
APS_APP_IDSimyour_fake_app_id_32charslong1234567890abcdID do aplicativo APsystems com 32 caracteres
APS_APP_SECRETSimyour_fake_secret12Segredo do aplicativo APsystems com 12 caracteres
APS_SYS_IDSimyour_fake_sid_1234567890ID do sistema (SID) do aplicativo EMA, Settings → Account Details
APS_BASE_URLNãohttps://api.apsystemsema.com:9282Substituição da URL base da API
APS_MCP_TRANSPORTNãostdioTransporte MCP: stdio (padrão) ou sse
APS_MCP_SSE_ADDRNão:8888Endereço de escuta do servidor SSE (somente quando APS_MCP_TRANSPORT=sse)
APS_DASHBOARDNãotrueDefina true para habilitar o painel web
APS_DASH_ADDRNão:8080Endereço de escuta do painel
APS_LOG_LEVELNãoinfoNível de log: debug, info, warn, error

Segurança

🔒 Boas Práticas de Segurança

  • Nunca envie credenciais ou segredos reais de API para o controle de versão. Use .env.local ou variáveis de ambiente para desenvolvimento local.
  • Rotacione seu APP_SECRET e SID se suspeitar que foram comprometidos.
  • Reporte vulnerabilidades abrindo uma issue de segurança ou enviando e-mail aos mantenedores.
  • Para produção, use um gerenciador de segredos ou injeção de ambiente (não arquivos em texto puro).
VariávelObrigatórioPadrãoDescrição
APS_APP_IDSim—ID do aplicativo APsystems com 32 caracteres
APS_APP_SECRETSim—Segredo do aplicativo APsystems com 12 caracteres
APS_BASE_URLNãohttps://api.apsystemsema.com:9282Substituição da URL base da API
APS_SYS_IDNão—Identificador de sistema padrão (sid) para todas as chamadas de API se não for fornecido nos argumentos da ferramenta
APS_MCP_TRANSPORTNãostdioTransporte MCP: stdio ou sse
APS_MCP_SSE_ADDRNão:8888Endereço de escuta do servidor SSE (somente quando o transporte for sse)
APS_DASHBOARDNãofalseDefina true para habilitar o painel web
APS_DASH_ADDRNão:8080Endereço de escuta do painel
APS_LOG_LEVELNãoinfoNível de log: debug, info, warn, error

Referência de Ferramentas MCP

Ferramentas do Sistema

FerramentaDescrição
get_system_detailsInformações do sistema: capacidade, fuso horário, ECUs, status
get_invertersLista todas as ECUs e microinversores conectados
get_metersLista todos os IDs de medidores
get_system_summaryTotais de energia: hoje, mês, ano, vida útil (kWh)
get_system_energyEnergia por período: horária/diária/mensal/anual

Ferramentas ECU

FerramentaDescrição
get_ecu_summaryResumo de energia para uma ECU específica
get_ecu_energyEnergia por período para uma ECU (suporta telemetria minuto a minuto)

Ferramentas do Inversor

FerramentaDescrição
get_inverter_summaryEnergia por canal para um único inversor
get_inverter_energyDados por período/minuto com potência DC, corrente, tensão, telemetria AC
get_inverter_batch_energyTodos os inversores sob uma ECU em uma única chamada

Ferramentas do Medidor

FerramentaDescrição
get_meter_summaryTotais consumidos/exportados/importados/produzidos
get_meter_periodDados de energia por período para um medidor

Ferramentas de Armazenamento

FerramentaDescrição
get_storage_latestStatus ao vivo: SOC, potência de carga/descarga
get_storage_summaryResumo de energia para uma ECU de armazenamento
get_storage_periodDados de energia por período para armazenamento

Usando com Claude Desktop

Usando com Claude CLI

Você também pode conectar este servidor MCP ao Claude CLI para acesso direto e scriptável aos seus dados solares a partir do terminal.

1. Inicie o Servidor MCP

Certifique-se de que seu servidor MCP esteja em execução e acessível (local ou remotamente):

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

2. Configure o Claude CLI

Adicione seu servidor MCP ao Claude CLI usando o comando integrado:

Podman/Docker (recomendado para uso em contêineres)
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

Ou 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

Substitua as variáveis de ambiente pelas suas credenciais reais.

Isso atualizará automaticamente a configuração do seu Claude CLI para incluir o servidor MCP apsystems.

3. Exemplo de Uso

Peça ao Claude CLI para consultar seus dados solares via servidor MCP:

claude ask "Show me my solar production for today"

screen_solar_today

Ou use qualquer ferramenta MCP suportada, por exemplo:

claude ask "List all my inverters"

screen_solar_inverters

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

screen_solar_today

Você pode criar scripts e automatizar consultas, integrar com outras ferramentas ou usar o Claude CLI em seus fluxos de trabalho!

Para usar o Claude Desktop com Docker ou Podman, atualize seu claude_desktop_config.json da seguinte forma:

{
  "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"
      ]
    }
  }
}

Ou 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/rede), use o campo url em vez de command:

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

Você também pode montar um arquivo de configuração ou credenciais conforme necessário:

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

Então pergunte ao Claude coisas como:

  • "Mostre-me minha produção solar de hoje"
  • "Quanta energia meu sistema produziu este mês?"
  • "Qual é o status dos meus inversores?"
  • "Compare minha produção diária desta semana"

Estrutura do Projeto

├── 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

Detalhes de Autenticação

A API da APsystems usa autenticação por assinatura HMAC. Cada requisição inclui cinco cabeçalhos personalizados:

  1. X-CA-AppId — seu identificador de aplicativo
  2. X-CA-Timestamp — timestamp Unix em milissegundos
  3. X-CA-Nonce — string hexadecimal única de 32 caracteres (UUID sem hífens)
  4. X-CA-Signature-Method — HmacSHA256
  5. X-CA-Signature — Base64(HMAC-SHA256(stringToSign, appSecret))

A string a ser assinada é composta por:

timestamp/nonce/appId/requestPath/HTTPMethod/HmacSHA256

onde requestPath é o último segmento do caminho da URL.

Desenvolvimento

# Run tests
make test

# Lint
make lint

# Build for all platforms
make build

Códigos de Erro da API

CódigoDescrição
0Sucesso
1000Exceção de dados
1001Sem dados
2001Conta de aplicativo inválida
2002Não autorizado
2005Limite de acesso excedido
4001Parâmetro de requisição inválido
5000Erro interno do servidor
7002Muitas requisições (tentativa automática)
7003Sistema ocupado (tentativa automática)

Solução de Problemas

ℹ️ Nota: Se você encontrar erros de API, verifique se suas credenciais (APP_ID, APP_SECRET, SID) estão corretas e se sua conta tem acesso à API habilitado. Se você vir erros de limite de taxa, tente novamente mais tarde ou ajuste a frequência das suas requisições.

  • P: Recebo erros de 'Não autorizado' ou 'Conta de aplicativo inválida'.
    • R: Verifique novamente seu APP_ID, APP_SECRET e SID. Certifique-se de que sua conta foi aprovada para acesso à API pela APsystems.
  • P: O Claude CLI não consegue se conectar ao servidor MCP.
    • R: Certifique-se de que o servidor está em execução e que o endereço/porta corresponde à configuração do seu CLI. Verifique o firewall ou os mapeamentos de porta do contêiner.
  • P: O painel não carrega.
    • R: Certifique-se de que APS_DASHBOARD está definido como true e que o servidor está em execução. Acesse a porta correta no seu navegador.

Comunidade e Suporte

Contribuindo

Contribuições são bem-vindas! Para começar:

  1. Faça um fork do repositório
  2. Crie um novo branch para sua funcionalidade ou correção
  3. Faça suas alterações e adicione testes se necessário
  4. Abra um pull request com uma descrição clara

Consulte CONTRIBUTING.md se disponível, ou abra uma issue para discutir mudanças importantes primeiro.

Links Rápidos