somneo-mcp-server
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., "@somneo-mcp-serverstelle den Wecker auf 6:30 Uhr für Mo-Fr"
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.
somneo-mcp-server
MCP-Server für den Philips Somneo HF3671 (Wake-up Light): Wecker per Ansage lesen, ändern, schalten, anlegen und löschen. Dazu die Raumsensoren (nur lesen). Einschlaflicht, Lampe, Radio und Display sind nicht enthalten. Er spricht direkt die lokale HTTPS-API des Geräts, ohne App und ohne Cloud.
Werkzeuge
Tool | Wirkung |
| Schlafzimmer-Sensoren: Temperatur, Luftfeuchte, Licht (lux), Lärm (dB), aktuell + Mittel. ⚠️ Feuchte wich am 05.10. ~15 Punkte vom Shelly H&T ab |
| alle belegten Wecker (Slot, Uhrzeit, Tage, an/aus, Licht, Ton) |
| Uhrzeit, Tage ( |
| Wecker dauerhaft ein/aus |
| neuen Wecker im ersten freien Slot (Standard wie Mac-App: Hell. 20, 30 min, Weckton 1, Lautst. 12) |
| Wecker löschen, Slot wird frei (zurückgelesen) |
Jeder Schreibzugriff sendet nur die geänderten Felder, liest den Slot zurück und prüft jedes Feld (Muster aus der Mac-App Somneo-Menü).
Related MCP server: HueMCP
Bewusst ohne Pause-Funktion
Für Urlaub werden die Wecker per Ansage aus- und danach wieder eingeschaltet. Es gibt kein automatisches Wiedereinschalten (Entscheidung 05.10.2026), denn kein anderes System soll in den Somneo schreiben.
Betrieb
uv sync
uv run pytest # 40 Tests, darunter Muss-rot-Fälle (Fake-Gerät für Anlegen/Löschen)
claude mcp add somneo -s user -- uv run --directory <pfad> somneo-mcpUmgebung (optional): SOMNEO_HOST (Standard wakeuplight.fritz.box).
Gerät: TLS höchstens 1.2, Cipher AES128-SHA, selbstsigniertes Zertifikat. Die erste Anfrage braucht ~2 s, danach ~0,1 s.
Docker
docker run -i --rm ghcr.io/schimmilab/somneo-mcp-server:latest
# anderer Host: docker run -i --rm -e SOMNEO_HOST=192.168.0.232 ghcr.io/schimmilab/somneo-mcp-server:latestReleases: Tag v* → Tests → Image bauen → MCP-Smoke gegen das gebaute Image → Push nach GHCR → GitHub-Release.
Available Tools
6 toolssomneo_raumklimaSomneo RaumklimaARead-only
Raumsensoren des Somneo im Schlafzimmer: Temperatur, Luftfeuchte, Licht (lux), Lärm (dB), jeweils aktuell und als Gerätemittel. ⚠️ Luftfeuchte wich am 05.10. um ~15 Prozentpunkte vom Shelly H&T im selben Raum ab (Temperatur nur 0,7 K) — Feuchte nicht ungeprüft als Raumwert nehmen.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds genuine behavioral context beyond that: a concrete data-quality caveat that the humidity reading diverged ~15 percentage points from a Shelly H&T in the same room and should not be used unchecked as a room value — valuable, hard-to-infer information.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The sensor list is front-loaded and the caveat is clearly marked with a warning glyph. The phrase describing current value plus device average is slightly dense, but every sentence carries information and nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return format need not be spelled out, and the no-parameter, read-only nature is fully covered by annotations. The description supplies the one thing structured fields cannot: the trustworthiness caveat on the humidity reading, making it essentially complete for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly adds nothing parameter-related, and there is no schema surface for it to compensate for.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the specific resource (Somneo room sensors in the bedroom) and enumerates the exact measurements returned (temperature, humidity, lux, dB) plus their scope (current value and device average). An agent can distinguish this read-only climate tool from the somneo_wecker_* alarm-clock siblings by name and content alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: it is clear this is the tool to call for room climate readings, and it cautions against trusting the humidity value unchecked. However, it never explicitly says when to use it versus any alternative (e.g. an external Shelly source) nor states any prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
somneo_wecker_anlegenSomneo Wecker AnlegenA
Neuen Wecker im ersten freien Slot anlegen. Nicht angegebene Einstellungen wie in der Mac-App: Helligkeit 20, Lichtdauer 30 min, Lichttyp 0, Weckton 1, Lautstärke 12. Rückgabe: zurückgelesener Zustand.
| Name | Required | Description | Default |
|---|---|---|---|
| an | No | ||
| tage | No | Mo-Fr | |
| klang | No | ||
| uhrzeit | Yes | ||
| lichttyp | No | ||
| tonquelle | No | ||
| helligkeit | No | ||
| lichtdauer | No | ||
| lautstaerke | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint false, idempotentHint false), and the description usefully adds that unset parameters fall back to documented Mac-app defaults and that the state is read back. This higher-than-default behavior — repeated calls land alarms in successive free slots, which aligns with non-idempotency — is genuinely additive context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the action and scope, then the defaults. Each clause carries information with no filler, though the default list is dense and could be structured more readably.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so the return-value clause is a bonus rather than a necessity, and the default fallbacks fill the biggest gap left by 0% schema coverage. Still, formats for required 'uhrzeit', the 'tage' convention and the tonquelle/an parameters are not addressed, leaving a mutation tool only partly specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the burden, and it partially meets it by giving defaults for brightness, light duration, light type, tone and volume (helligkeit, lichtdauer, lichttyp, klang, lautstaerke). It leaves the uhrzeit format, tage, tonquelle and an undocumented, so a meaningful portion of the 9 parameters remains ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Neuen Wecker anlegen') and adds scope detail ('im ersten freien Slot') that clarifies it creates rather than modifies an existing alarm. It does not explicitly name the sibling it differs from (somneo_wecker_setzen), so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The create semantics imply when to use it (new alarm rather than editing an existing one), and the 'first free slot' behavior is noted. However, there is no explicit guidance on when to choose this over somneo_wecker_setzen or somneo_wecker_schalten, so usage must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
somneo_wecker_listeSomneo Wecker ListeARead-only
Alle belegten Wecker des Somneo: Slot, Uhrzeit, Wochentage, an/aus, Licht (Helligkeit, Dauer, Typ), Ton.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so safety is covered. The description adds the scoping detail that only 'belegten' (configured/occupied) alarms are returned, which is useful, but it says nothing about pagination, ordering, or authorization requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that names the scope and lists the fields with zero wasted words. Well-sized for a no-argument list tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and read-only annotations, the description need not explain return values, and it gives a helpful summary of what is returned. The main omission is any routing guidance versus the sibling write/toggle tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description adds no parameter meaning because there are none to clarify.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the resource ('alle belegten Wecker des Somneo') and enumerates the returned facets (Slot, Uhrzeit, Wochentage, an/aus, Licht, Ton), so an agent can tell this is a read/list operation distinct from the create/set/delete/toggle siblings. It never explicitly names a differentiating sibling or states the verb 'list', keeping it just short of the top score.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent infers this retrieves all configured alarms. There is no explicit when-to-use statement or mention of alternatives such as somneo_wecker_schalten for toggling or somneo_wecker_loeschen for deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
somneo_wecker_loeschenSomneo Wecker LoeschenADestructiveIdempotent
Einen Wecker löschen (Slot wird freigegeben). Nicht rückgängig zu machen: vorher mit somneo_wecker_liste prüfen und den Wecker nennen. Rückgabe: Zustand vorher und Bestätigung.
| Name | Required | Description | Default |
|---|---|---|---|
| slot | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, but the description adds real context beyond them: the action is irreversible ('Nicht rückgängig zu machen'), the slot is freed, a prior verification step is required, and the response contains the prior state plus a confirmation. That extra effect-level detail is genuinely useful for a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences: what it does, the irreversibility warning with the prerequisite, and the return shape. No filler, and the destructive warning is front-loaded right after the action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and the description still summarizes the return, so return-value detail is not a gap. The destructive nature, prerequisite, and side effect are all covered; only the slot's value provenance is left thin, which is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for the single 'slot' parameter, so the description carries the burden. It only obliquely conveys slot semantics via 'Slot wird freigegeben' and does not state what a valid slot value is or where to obtain it (though the liste reference partially compensates). Baseline-level compensation at best.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Einen Wecker löschen') and even names the side effect (the slot is released). It references the sibling somneo_wecker_liste as a prerequisite rather than as a competing alternative, so sibling differentiation is implied but not fully explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear pre-condition ('vorher mit somneo_wecker_liste prüfen') that tells the agent when and how to prepare before calling. It stops short of stating when *not* to use this tool or naming alternative deletion paths.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
somneo_wecker_schaltenSomneo Wecker SchaltenAIdempotent
Wecker ein- oder ausschalten, z. B. für Urlaub alle Werktags-Wecker aus und danach wieder an. Ausgeschaltete Wecker bleiben aus, es gibt kein automatisches Wiedereinschalten.
| Name | Required | Description | Default |
|---|---|---|---|
| an | Yes | ||
| slots | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly=false, idempotent=true, destructive=false, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: turned-off alarms stay off and there is no automatic re-activation. That state-persistence detail is exactly the kind of non-obvious behavior an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: the core action first, then the example, then the caveat. Every clause earns its place and nothing is padded. Slightly dense (example and caveat run together) but well front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values needn't be explained, and annotations cover the safety profile. The description supplies the toggle semantics, a use scenario, and the persistence caveat. The main remaining gap is the meaning/format of the 'slots' array, which is left unexplained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the load for both required params. It clarifies that 'an' is the on/off toggle and hints that 'slots' selects which alarms ('alle Werktags-Wecker'), but gives no detail on the slot integer format or identifier meaning. It only partially compensates for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: turning alarms (Wecker) on or off (ein-/ausschalten). This clearly separates it from siblings like somneo_wecker_setzen (set) and somneo_wecker_anlegen (create), since it is a toggle operation. It stops short of explicitly naming those siblings, so it's clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete usage scenario ('für Urlaub alle Werktags-Wecker aus und danach wieder an'), which implies the intended context. However, it never states when to prefer this over somneo_wecker_setzen or other siblings, nor any exclusions or prerequisites. Usage is implied through the example rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
somneo_wecker_setzenSomneo Wecker SetzenAIdempotent
Einen bestehenden Wecker ändern. Nur angegebene Felder werden geändert. uhrzeit 'HH:MM' · tage z. B. 'Mo-Fr', 'Sa,So', 'täglich' · an True/False · helligkeit 1–25 · lichtdauer 1–60 min (Sonnenaufgang vor der Weckzeit) · lichttyp 0–3 · tonquelle 'Weckton' | 'Radio' | 'aus' · klang 0–10 · lautstaerke 1–25. Rückgabe: vom Gerät zurückgelesener Zustand.
| Name | Required | Description | Default |
|---|---|---|---|
| an | No | ||
| slot | Yes | ||
| tage | No | ||
| klang | No | ||
| uhrzeit | No | ||
| lichttyp | No | ||
| tonquelle | No | ||
| helligkeit | No | ||
| lichtdauer | No | ||
| lautstaerke | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral context the annotations lack: that unspecified fields are left untouched (partial update, consistent with idempotency) and that the device state is read back after the change.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation and the partial-update rule, followed by a dense but scannable parameter reference. Every element carries information; only the 'slot' omission and slightly terse list formatting keep it from a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 10-parameter mutation tool with an output schema present, the description supplies the encoding details an agent needs (units, ranges, enumerations) plus partial-update and return semantics. It is nearly complete, with the unexplained required 'slot' as the main residual gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the full burden, and it largely does: it documents formats and ranges for uhrzeit ('HH:MM'), tage examples, an (True/False), helligkeit 1-25, lichtdauer 1-60 min, lichttyp 0-3, tonquelle values, klang 0-10 and lautstaerke 1-25. The only gap is the required 'slot' parameter, which is never explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Einen bestehenden Wecker ändern'), and the word 'bestehenden' implicitly distinguishes it from somneo_wecker_anlegen (create) and somneo_wecker_loeschen (delete). An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clarifies that this operates on an existing alarm and that only supplied fields are modified (partial update), which implies when to reach for it. However, it never explicitly names alternatives such as somneo_wecker_schalten for simple toggling or states when-not to use this tool, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
v0.1.0- First observed
somneo_raumklima - First observed
somneo_wecker_anlegen - First observed
somneo_wecker_liste - First observed
somneo_wecker_loeschen - First observed
somneo_wecker_schalten - First observed
somneo_wecker_setzen
TDQS
Scored across 6 tools
Each alarm tool maps to a distinct CRUD action (list, create, update, delete) plus an on/off toggle, and raumklima is a separate sensor domain. The only slight overlap is somneo_wecker_schalten (on/off) versus somneo_wecker_setzen, which can also set the 'an' flag, but the descriptions clarify the intended split.
Names follow a predictable somneo_<resource>_<action> pattern with German verbs (schalten, liste, setzen, anlegen, loeschen) for the alarm resource. somneo_raumklima deviates by being a bare resource noun with no action verb, a minor inconsistency.
Six tools is well-scoped for a single-device controller: full alarm lifecycle plus a sensor read. Every tool earns its place with no redundancy or bloat.
The alarm surface covers the full lifecycle (list, create, update, delete, enable/disable), and room climate provides the environmental read. No obvious dead ends or missing operations for the stated device purpose.
Maintenance
Related MCP Connectors
Sunrise-Sunset MCP — wraps the sunrisesunset.io API (free, no auth)
Sonos MCP server: control your Sonos speakers from any MCP client. Play songs, artists and playlists, set volume, group rooms, move music to another room, switch to TV, spoken announcements and reminders. 27 tools, English and Chinese. Works through the official Sonos cloud, so there is no home bridge to install; sign in with OAuth. Requires the free ZoneFoundry iOS app.
Control a Loxone Miniserver smart home: lights, blinds, climate, scenes and energy.
Unofficial integration! ## ✨ Key Features ### 💰 Financial Intelligence - **Smart Charging Cost An…
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceAccess Home Assistant data and control devices (lights, switches, thermostats, etc).6 npm576Apache 2.0
- AlicenseAqualityDmaintenanceEnables discovery and control of Philips Hue lighting devices via a local bridge using the CLIP v2 API, without any cloud dependency.10MIT
- AlicenseBqualityAmaintenanceUnofficial Eight Sleep MCP server for sleep trends, temperature, alarms and gated pod control.26156 npm5MIT
- AlicenseAqualityCmaintenanceEnables local network control of Tuya and Smart Life smart home devices without cloud round-trips, including power, brightness, color, and raw datapoint operations.9MIT