Powerline
Uses Amazon Bedrock Converse API to generate spoken evening power briefings when configured.
Connects to the Victron Energy VRM Portal to read live solar, load, battery, and grid telemetry for power status monitoring and forecasts.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@PowerlineCan I run the dishwasher for the next hour?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Powerline — Alexa+ home power copilot
Build, Ship, Shape: Amazon Developer Hackathon 2026 · Alexa+ track · AWS Builder + Open Source mini-challenges
Millions of households on unreliable grids make power decisions by guesswork: Can I run the iron? Will the battery last the night? When is grid coming back? Powerline makes the inverter conversational. It is a stateful Streamable HTTP MCP server (spec 2025-11-25) that knows the household's solar array, battery, inverter and learned grid pattern, answers "can I run X?" with a real forecast, and renders an interactive MCP App dashboard card inline in the conversation.
Supported inverter platforms: Growatt (ShinePhone API token) and Victron Energy (VRM Portal access token). A built-in simulator runs without any hardware.
Quick start
npm install
npm run build # bundles the MCP App card + compiles the server
npm start # simulator; MCP endpoint at http://127.0.0.1:3000/mcp
npm run start:aws # same, but loads .env (AWS credentials + BEDROCK_MODEL_ID) for the Bedrock briefing
npm run smoke # (second terminal) full protocol round-trip through every tool + alert stream
# to see an alert during smoke: SIM_START_SOC=29 SIM_CLOCK_START=2026-09-09T20:30:00Z ALERT_INTERVAL_MS=2000 npm start
npm test # forecast, cards and store — 38 tests, no AWS account neededLive telemetry:
# Victron — your own site (VRM Portal → Preferences → Integrations → Access tokens)
POWER_SOURCE=victron VRM_TOKEN=... VRM_SITE_ID=123456 npm start
# Victron — public demo site, no account needed
POWER_SOURCE=victron VRM_DEMO=1 VRM_SITE_ID=219742 npm start
# Growatt (ShinePhone → Me → username → API Token; app-generated tokens are most reliable)
POWER_SOURCE=growatt GROWATT_TOKEN=... npm startConnect any Streamable-HTTP + MCP-Apps client (Claude Desktop/claude.ai custom connector, VS Code, MCPJam,
Postman, Goose) to /mcp. For a public URL use ngrok http 3000 and set HOST=0.0.0.0.
Related MCP server: Home Assistant MCP Server
Tools
Tool | Say | Returns |
| "How's the power?" | Solar / load / battery / grid + 24 h battery forecast. Dashboard card. |
| "Can I run the iron for 30 minutes?" | Yes / not now, projected SOC, best start time today. |
| "Power briefing" | One spoken paragraph (Amazon Bedrock when configured). |
| "Set up my solar" | Stores array kW, battery kWh, inverter kW, reserve %. Persists across sessions. |
| "Remember the washing machine is 500 watts" | Appliances by name for planning. |
| "Plan my power for today" | Schedules all known appliances into the next 24 h, solar-surplus first. Interactive planner card — tick/untick appliances and the plan re-runs live. |
| "Grid just went off" | Feeds the learned per-weekday grid-availability pattern. |
Server-initiated alerts. Each session runs a monitor (src/alerts.ts) that pushes MCP notifications/message
over the Streamable HTTP GET stream when the battery drops within 10 points of the reserve, reaches it, or the grid
flips — no client request needed. Grid flips are also logged into the learned pattern automatically.
How it works
Alexa+ / MCP client ──Streamable HTTP (sessions, SSE)──▶ src/http.ts
└─ src/server.ts tools + ui:// resource
├─ src/forecast.ts SOC integration, can_i_run, plan_day, grid learning
├─ src/alerts.ts server→client alerts on the GET SSE stream
├─ src/store.ts per-household state (survives sessions)
├─ src/telemetry/ sim | victron (VRM v2) | growatt (OpenAPI v1)
├─ src/bedrock.ts Converse API briefing (AWS Builder)
└─ src/ui/*.html MCP App cards: dashboard + planner (Vite → single HTML)Forecast engine (src/forecast.ts, pure functions, tested): net = pv + grid − load, SOC integrated at
15-minute steps over the battery capacity and clamped; the grid covers deficits only when available.
can_i_run re-runs the forecast with the appliance added and, if the reserve would be breached, scans the
next 24 h for the earliest slot that either keeps SOC above the reserve or runs entirely on PV surplus.
Grid availability is learned from logged on/off events, binned per weekday-hour.
Cards. Two MCP App views (src/ui/), designed as an instrument readout rather than a
dashboard of tiles: the state of charge and a plain-language verdict ("holds past midnight") lead,
a quiet three-column strip carries the live figures, and a single 24-hour ribbon shows the battery
line against a solar field, grid bands and the reserve floor. The planner places each appliance as a
block on the same time track. Both views are tested in jsdom against absent, partial and hostile
payloads (test/cards.test.ts) — a card that throws renders as a blank box in the host, so this is
the failure mode worth guarding.
Store. Powerline has two writers by design — tool calls, and the per-session alert monitor
that logs grid flips on a timer — so a read-modify-write store loses updates. The DynamoDB
backend carries a version attribute and writes conditionally; on conflict the mutation is
re-applied to freshly read data rather than the stale copy, and the update cycle uses a
strongly consistent read so the version it checks is current. Throttling and 5xx are retried
with exponential backoff and full jitter; a missing table or bad credentials fail immediately
with the command that fixes them. Records are bounded before every write, so an item can never
exceed DynamoDB's 400 KB limit. There is deliberately no silent fallback to disk: a store
that quietly writes to two places is worse than one that says it is unavailable, so /healthz
reports 503 with the reason and the server keeps serving.
npm run dynamo:init # create the table (on-demand billing, idempotent)
STORE=dynamodb npm run start:aws # run against it
curl localhost:3000/healthz # backend, table, region, session countTelemetry adapters implement one interface (src/telemetry/types.ts) returning
{pv_w, load_w, battery_w, soc_pct, grid_w, grid_available}. Adding a brand is one file.
Victron VRM — one
stats?type=customcall (Pdc,ac_loads,bp,bs,gp). Tested live against the VRM demo installation (VRM_DEMO=1).Growatt OpenAPI v1 —
plant/list → device/list → mix_last_data | tlx_last_data. Implemented from the official docs and community libraries; field names vary by model, so the raw payload is retained for inspection. Verify against a live unit and log mismatches inFRICTION_LOG.md.
Prior art: a read-only Victron VRM MCP server wraps the VRM API 1:1. Powerline is not an API wrapper — the value is the forecast, the decision tools, cross-session household memory, multi-vendor telemetry, and the interactive card.
Environment
Var | Default | Notes |
|
|
|
| localhost only | comma-separated browser origins |
|
|
|
|
| disk store location |
|
| DynamoDB store |
|
| idle sessions are closed after this |
|
| shared cache in front of the inverter API |
|
| stand-in for authenticated identity |
|
| household UTC offset in hours (1 = Africa/Lagos, 2 = the Victron demo site) |
|
|
|
|
| simulator; speed = sim-seconds per real second |
|
| simulator starting SOC and ISO clock start (for demos at "night") |
|
| alert poll interval; repeat while condition persists |
| — | Victron |
| — | Growatt (type 5 = SPH, 7 = MIN) |
| unset = disabled | e.g. |
Roadmap (hackathon window)
Streamable HTTP sessions, MCP App dashboard, forecast engine, Victron + Growatt + sim adapters
plan_dayinteractive planner card (toggle appliances → re-plans viacallServerTool)Server-initiated low-battery / grid alerts over the GET SSE stream
Per-household timezone (currently Africa/Lagos)
Bedrock briefing enabled + documented; DynamoDB store option
Demo video < 3 min, product feedback, friction log
License
MIT
Related MCP Connectors
Unofficial integration! ## ✨ Key Features ### 💰 Financial Intelligence - **Smart Charging Cost An…
Solar, weatherization, EV charging, battery and heat-pump decision tools for AI agents.
Protocol-native energy infrastructure orchestration for AI data centers. Provides 46 MCP tools across 8 grid protocols (IEC-61850, DNP3, Modbus, OCPP, OpenADR, IEEE 2030.5, IEC 60870-5-104, ICCP) with 5 core API primitives: connect, dispatch, settle, comply, and intel. Enables AI agents to programmatically interact with substations, grid interfaces, and energy assets for real-time workload-grid coordination.
- mytesla.ioOAuthio.mytesla
Control your Tesla from your AI assistant - climate, charging, access, and security.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables AI agents to control and monitor Home Assistant smart home devices through natural language interactions. Supports device control, entity state monitoring, history access, and automation generation with both MCP protocol and standalone HTTP REST API modes.1MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to interact with Home Assistant smart home devices through natural language. Control devices, manage automations, query entity states, and retrieve historical data across your home automation system.1MIT
- AlicenseAqualityAmaintenanceConnect AI assistants to Victron Energy systems to read real-time solar, battery, grid, and inverter data from your local network via Modbus TCP or MQTT.32168 npm4MIT
- AlicenseAqualityDmaintenanceEnables access to Fronius solar inverter data via the MCP protocol, allowing real-time monitoring of energy production, consumption, and battery storage through natural language.1426 npm4MIT