Atlas / MCP servers / christophe77 / netatmo-energy-mcp

netatmo-energy-mcpSAFE

mcp/christophe77/netatmo-energy-mcp

Read-only MCP server for Netatmo smart thermostats and radiator valves. Works with any MCP client and LLM: Claude, GPT, Gemini, local models. Room temperatures, setpoints, boiler activity, heating history and analytics.

Verdict
SAFE
Grade
B
Trust score
85 /100
Exposed tools
22 16r · 6w · 0d
Transport
stdio · streamable-http
License
Apache-2.0
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

English | Français

[](https://github.com/christophe77/netatmo-energy-mcp/actions/workflows/ci.yml) [](LICENSE)

A Netatmo MCP server for Netatmo smart thermostats and smart radiator valves. It gives AI assistants structured access to your heating:

  • room temperatures and setpoints
  • heating demand and boiler activity
  • temperature history
  • deterministic heating analytics
  • weekly heating schedules
  • optional heating control: room setpoints, away / frost-guard mode and

schedules, with every change confirmed by you

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:

  • Claude: Claude Desktop, Claude Code
  • GPT / OpenAI: Codex CLI, VS Code + GitHub Copilot, Cursor
  • Gemini: Gemini CLI, VS Code + GitHub Copilot
  • Mistral and others through multi-model clients
  • Local LLMs (Llama, Qwen, Mistral, DeepSeek, ...): LM Studio, and

Ollama via Goose, Continue, Cline, AnythingLLM, LibreChat or Open WebUI

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)
Read from source at commit 4d7653b7de07OBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (npm)
claude mcp add netatmo-energy-mcp --env NETATMO_CLIENT_SECRET=${NETATMO_CLIENT_SECRET} -- npx -y [email protected]
03

Exposed tools (22)

16 read · 6 write · 0 destructive.

ToolRiskDescription
netatmo_compare_roomsread
netatmo_create_schedulewrite
netatmo_detect_anomaliesread
netatmo_get_boiler_historyread
netatmo_get_device_statusread
netatmo_get_heating_statusread
netatmo_get_heating_summaryread
netatmo_get_homeread
netatmo_get_home_statusread
netatmo_get_room_statusread
netatmo_get_schedulesread
netatmo_get_setpoint_historyread
netatmo_get_temperature_historyread
netatmo_list_devicesread
netatmo_list_homesread
netatmo_list_roomsread
netatmo_rename_schedulewrite
netatmo_set_home_modewrite
netatmo_set_room_setpointwrite
netatmo_switch_schedulewrite
netatmo_update_schedulewrite
spike_whoamiread
04

Trust audit

SAFEgrade B · trust 85/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (10 observation(s))
Network
declared (5 observation(s))
Shell
declared (3 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (19)

MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/unit/cli-remote.test.ts:14
const TOKEN = 'test-setup-token-123';
LOWInventory / provenance · inv.hidden_file · CWE-1104
.node-version
.node-version
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierrc.json
.prettierrc.json
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
remote/src/account.ts:7
import { InvalidGrantError, refreshAccessToken, type FetchFn } from '../../src/auth/oauth.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
remote/src/account.ts:8
import type { TokenProvider, TokenSet } from '../../src/auth/token-set.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
remote/src/account.ts:9
import type { AuditEntry, AuditLog } from '../../src/domain/audit-log.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
remote/src/account.ts:10
import { createServices } from '../../src/domain/services.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
remote/src/account.ts:11
import { AuthRequiredError, InvalidArgumentError } from '../../src/errors.js';
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/authentication.md:60
for example `http://127.0.0.1:9000/callback`. The automatic flow needs an
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
remote/test/e2e.mjs:31
NETATMO_API_BASE: `http://127.0.0.1:${NETATMO_PORT}`,
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/integration/cli.test.ts:128
NETATMO_REDIRECT_URI: `http://127.0.0.1:${port}/callback`,
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/integration/cli.test.ts:141
expect(await httpGet(`http://127.0.0.1:${port}/callback?state=forged&code=evil`)).toBe(400);
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/integration/cli.test.ts:142
expect(await httpGet(`http://127.0.0.1:${port}/callback?state=${state}&code=good-code`)).toBe(
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
src/utils/web-crypto.ts:16
const binary = atob(b64 + '='.repeat((4 - (b64.length % 4)) % 4));
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/server, zod, @eslint/js, @modelcontextprotocol/client, @types/node, @vitest/coverage-v8, eslint, globals
Why it matters. 14 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/api-capabilities.md:43
| Token URL                                       | `https://api.netatmo.com/oauth2/token` (form-encoded POST)
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
docs/research.md:63
| [sandraschi/netatmo-weather-mcp](https://github.com/sandraschi/netatmo-weather-mcp) | Python / MIT         | Weather                            | Email + password (removed grant)
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
docs/security-review.md:112
| Medium   | No way to revoke an assistant's access or remove an account; changing the password did not revoke grants.                                    | `remote accounts`, `remote revoke [--account
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 4d7653b7de07full audit observations/trust-audit/mcp-server/christophe77__netatmo-energy-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-114d7653b7de07SAFEB85first audit
06

Questions

What is the netatmo-energy-mcp MCP server?

Read-only MCP server for Netatmo smart thermostats and radiator valves. Works with any MCP client and LLM: Claude, GPT, Gemini, local models. Room temperatures, setpoints, boiler activity, heating history and analytics.

What tools does netatmo-energy-mcp expose?

22 in total: 16 read-only, 6 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is netatmo-energy-mcp safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (85/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B.

What credentials does netatmo-energy-mcp need?

It reads NETATMO_CLIENT_SECRET and SPIKE_PASSWORD from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does netatmo-energy-mcp run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as netatmo-mcp-remote-spike at 0.3.1.

How current is this page?

The grade is for one exact copy of the source (4d7653b7de07), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement