MCP server for Netatmo thermostats and radiator valves: status, history, analytics, opt-in control.
Runs on your machine from its package; the steps are below.
At most: creates or changes data: records, files, settings.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
npx -y netatmo-energy-mcp
MCP client config
{
"mcpServers": {
"netatmo-energy": {
"command": "npx",
"args": [
"-y",
"netatmo-energy-mcp"
]
}
}
}English | Français
A Netatmo MCP server for Netatmo smart thermostats and smart radiator valves. It gives AI assistants structured access to your heating:
It runs on your machine and talks only to the official Netatmo Energy API. It is read-only by default: it can change your heating only if you enable write mode at login.
It works with any Model Context Protocol client that runs local servers, whatever the model:
It also works in Windsurf / Devin Desktop, Zed, Roo Code, Kilo Code, JetBrains AI Assistant, Kiro and Warp. See all compatible clients.
ChatGPT and Claude on the web and on mobile only accept remote servers. For them, deploy the optional remote server to your own Cloudflare account (free plan).
Status: early release (0.3.1). The Netatmo API integration has been validated on a real installation; feedback and device reports are welcome.
A Netatmo heating system records useful data:
That data is locked in the Netatmo app, where you can look at it but not ask questions about it.
This project is a small bridge between the Netatmo Energy API and any MCP-compatible AI assistant. Ask in plain language: "Which room was coldest last night?" The assistant calls a precise tool and answers from your data. It doesn't guess. With write mode enabled, you can also say "Set the bedroom to 19 °C until 7 am", then confirm the change.
The few other Netatmo MCP servers target Netatmo weather stations. This one is built for thermostats, radiator valves and heating history. See docs/research.md for the comparison.
login command.doctor checks your setup.You need Node.js 22.19 or later and a Netatmo account with Energy devices.
http://localhost:8977/callback.Step-by-step guide: docs/authentication.md.
npx -y netatmo-energy-mcp login
login asks for the client ID and secret, then opens your browser so you
can sign in on netatmo.com and approve read-only access. To let the
assistant change your heating, run login --write instead (see
write mode). Then check the setup:
npx -y netatmo-energy-mcp doctor
Running from source instead: clone the repository, run
pnpm install && pnpm build, then usenode /path/to/netatmo-energy-mcp/dist/index.jsin place ofnpx -y netatmo-energy-mcp.
Most clients use the same mcpServers JSON block. This works for Claude
Desktop, Cursor, Windsurf / Devin Desktop, Cline, Roo Code, Kiro,
LM Studio, JetBrains AI Assistant, AnythingLLM, Warp and Gemini CLI:
{
"mcpServers": {
"netatmo-energy": {
"command": "npx",
"args": ["-y", "netatmo-energy-mcp"]
}
}
}
Command-line clients:
# Claude Code
claude mcp add --transport stdio --scope user netatmo-energy -- npx -y netatmo-energy-mcp
# OpenAI Codex CLI
codex mcp add netatmo-energy -- npx -y netatmo-energy-mcp
# GitHub Copilot CLI
copilot mcp add netatmo-energy -- npx -y netatmo-energy-mcp
VS Code + GitHub Copilot. Add this to .vscode/mcp.json; note the
servers key:
{
"servers": {
"netatmo-energy": { "type": "stdio", "command": "npx", "args": ["-y", "netatmo-energy-mcp"] }
}
}
No secrets go in any of these files: login stored them in your user
configuration folder. File locations for each client, plus Zed,
Continue, Goose, LibreChat, Kilo Code, Msty and Open WebUI, are in
examples/.
"What's the temperature in each room right now?"
These are the kinds of questions the tools are built for. The assistant chooses the tools; the table shows which ones answer each question.
| Question | Tools used |
|---|---|
| "What's the temperature in my bedroom, and is it at its target?" | netatmo_get_room_status |
| "Is the boiler running right now? Which rooms are asking for heat?" | netatmo_get_heating_status |
| "How long did my boiler run yesterday?" | netatmo_get_boiler_history |
| "Show the living room temperature for the last 7 days." | netatmo_get_temperature_history |
| "Compare my rooms over the last week. Which one cools down fastest?" | netatmo_compare_rooms |
| "Did my heating behave unusually last night?" | netatmo_detect_anomalies |
| "Give me yesterday's heating report." | prompt heating_daily_report → netatmo_get_heating_summary |
| "Are any valve batteries low?" | netatmo_get_device_status |
| "What does my weekly schedule look like?" | netatmo_get_schedules |
| Write mode: "Heat the office to 21 °C for 2 hours." | netatmo_set_room_setpoint |
| Write mode: "I'm away until Sunday evening." | netatmo_set_home_mode |
| Write mode: "Lower the night zone to 17 °C in every bedroom." | netatmo_get_schedules → netatmo_update_schedule |
Boiler "run time" is the time the thermostat requested heat. Netatmo does not measure gas or energy consumption, so this project never reports it.
The read-only tools need only the read_thermostat OAuth scope. The full
reference, with arguments and outputs, is generated from the server
itself: docs/tools.md.
| Tool | Description |
|---|---|
netatmo_list_homes | Homes with Energy devices, room/device counts |
netatmo_get_home | Home details: heating mode, schedules, rooms, devices |
netatmo_list_rooms | Rooms with IDs, types and devices |
netatmo_list_devices | Thermostats, valves, relays: model, room, gateway |
netatmo_get_home_status | Current status of every room, boiler state, alerts |
netatmo_get_room_status | Current temperature and setpoint of one room |
netatmo_get_heating_status | Boiler on/off, rooms requesting heat |
netatmo_get_device_status | Battery, signal, reachability, firmware |
netatmo_get_temperature_history | Room temperature history with statistics and gaps |
netatmo_get_setpoint_history | Room setpoint history and setpoint periods |
netatmo_get_boiler_history | Boiler heat-demand time per hour/day/week |
netatmo_get_heating_summary | Per-room comfort metrics plus boiler time over a period |
netatmo_compare_rooms | Room metrics and rankings |
netatmo_detect_anomalies | Unusual readings with severity, confidence and evidence |
netatmo_get_schedules | Weekly schedules: zones, room setpoints, timetable |
Write mode only. Each change needs your confirmation.
| Tool | Description |
|---|---|
netatmo_set_room_setpoint | Temporary room setpoint or boost, or back to the schedule |
netatmo_set_home_mode | Schedule, away or frost-guard mode, optionally until a date |
netatmo_switch_schedule | Make another weekly schedule active |
netatmo_create_schedule | New schedule copied from an existing one, with changes |
netatmo_update_schedule | Room setpoints per zone, away/frost temperatures, timetable |
netatmo_rename_schedule | Rename a schedule (experimental: undocumented endpoint) |
Resources: netatmo://homes and netatmo://homes/{homeId}/rooms,
…/devices and …/status.
Write mode is off by default. To enable it, log in again with:
npx -y netatmo-energy-mcp login --write
This also requests the write_thermostat OAuth scope. The heating control
tools appear after you restart your MCP client.
Safeguards:
NETATMO_MCP_CONFIRM=elicitation to allow changes
only through a confirmation prompt shown by your client. If your client
cancels every change without showing anything, set
NETATMO_MCP_CONFIRM=token.NETATMO_MCP_MIN_TEMP, NETATMO_MCP_MAX_TEMP and
NETATMO_MCP_MAX_SETPOINT_HOURS.NETATMO_MCP_WRITE=0 forces read-only mode, even with
a write-enabled login.changes.log in your configuration folder.Netatmo has no API to delete a schedule: schedules created here can only be deleted in the Netatmo app. Renaming a schedule and choosing a schedule with home mode "schedule" use undocumented Netatmo parameters, so they are marked experimental. Details: docs/configuration.md.
The local server is the simplest and most private option. To use your heating from ChatGPT or Claude on the web and on your phone, deploy the same tools as a remote server on your own Cloudflare account (free plan): remote/README.md.
npx netatmo-energy-mcp remote setup <your-worker-url>.ONBOARDING=invite). Each account only sees its
own home.The sign-in flow was validated with ChatGPT (desktop and mobile) and Claude (web, desktop and mobile). Design: ADR-0013, ADR-0014.
| Device | Netatmo type | Status |
|---|---|---|
| Smart Thermostat | NATherm1 | Tested. API validated on a live installation (2026-10-08) |
| Smart Radiator Valve | NRV | Tested. Same installation (6 valves) |
| Thermostat Relay | NAPlug | Tested. Same installation |
| OpenTherm Modulating Thermostat / Gateway | OTM / OTH | Expected to work, untested |
| BTicino Smarther with Netatmo | BNS | Not supported in v0.1 (probably needs the read_smarther scope) |
Run netatmo-energy-mcp probe and open a
device compatibility report
to help extend this table. The probe output is sanitized.
This is a standard local (stdio) MCP server, so it is not tied to one AI vendor. Any MCP client that can start local servers can use it, with whatever model that client runs.
| Client | Models |
|---|---|
| Claude Desktop, Claude Code | Claude |
| OpenAI Codex CLI | OpenAI GPT models |
| Gemini CLI | Google Gemini |
| VS Code + GitHub Copilot (agent mode), GitHub Copilot CLI | GPT, Claude, Gemini and other Copilot models |
| Cursor, Windsurf / Devin Desktop, Zed, Warp, Kiro, JetBrains AI Assistant | multiple hosted models |
| Cline, Roo Code, Kilo Code, Continue | multiple, including local models (Ollama, LM Studio) |
| LM Studio | local open models: Llama, Qwen, Mistral, DeepSeek, … |
| Goose, AnythingLLM, LibreChat, Msty Studio | many providers, including Ollama |
| Open WebUI | Ollama and others, through the mcpo proxy |
Configuration for each client, checked against official documentation: examples/.
Web and mobile assistants (ChatGPT apps and connectors, Claude.ai and the Claude and ChatGPT mobile apps) only accept remote MCP servers. Use the remote server for them. Mistral Le Chat has not been tested.
Testing. The server is tested with the official MCP SDK client and the MCP Inspector. Tool-calling quality with small local models varies by model. Please report any client-specific problem.
This project uses Netatmo's OAuth2 authorization code flow. You sign in on netatmo.com; your Netatmo password is never seen by this tool.
Scope. By default only read_thermostat is requested, so a leaked
token couldn't change your heating. login --write also requests
write_thermostat.
Your own app. Each user registers a free Netatmo developer app. The client secret cannot be shipped in open-source code.
Refresh. Access tokens are refreshed automatically. Several MCP clients running at once coordinate through a lock file, so they don't invalidate each other's tokens.
Details: docs/authentication.md.
What leaves your machine. Only HTTPS requests to api.netatmo.com.
In read-only mode they only reach 4 read endpoints: the client refuses
any write before it touches the network, and tests enforce this. In
write mode, a change is sent only after you confirm it.
What stays local.
credentials.json in your user configuration
folder, readable only by your account (0600 on macOS/Linux; a
restricted ACL on Windows).Your AI provider. Data that tools return is read by the assistant you use, so it is processed by that model provider.
No account data or location. Your email and home coordinates are never returned.
Read more:
The Netatmo client and the analytics are independent of MCP. Design decisions are recorded as ADRs, and docs/architecture.md describes the layers.
These come from the Netatmo Energy API; details are in docs/api-capabilities.md.
| Version | Focus |
|---|---|
| v0.1 | Read-only MCP server |
| v0.2 | Schedules, opt-in heating control |
| v0.3 | Remote server for web and mobile (current) |
| v0.3.x | Richer diagnostics |
| v0.4 | Weather context (Open-Meteo) |
| v0.5–v0.7 | Thermal modelling, predictions, digital twin |
| v1.0 | A stable interface |
Write mode will never be enabled by default. See docs/roadmap.md.
Bug reports, device compatibility reports and pull requests are welcome. See CONTRIBUTING.md to set up the project, which runs on mocked API responses: no Netatmo account needed. Please follow the Code of Conduct.
This is an independent open-source project. It is not affiliated with, endorsed by or sponsored by Netatmo or Legrand. "Netatmo" is a trademark of its owner and is used here only to describe compatibility. Use at your own risk; heating safety must never depend on an AI assistant.