homey-mcp
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., "@homey-mcp Turn the hallway light on when motion is detected after sunset."
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.
homey-mcp
Give an AI assistant real access to your Homey Pro: read the whole home, ask questions about sensor and energy history, and build working Flows from a sentence.
"Turn the hallway light on when the motion sensor sees something after sunset,
but only when nobody is home."The assistant finds the sensor, finds the light, looks up which Flow cards your Homey actually has for them, checks the arguments, and writes the Flow. You open the Homey app and it is there.
Why this exists
Athom ships an official MCP server at mcp.athom.com, and it is good at what it
does: reading device state, running existing Flows, setting Moods. What it cannot
do is create an automation. Neither can any of the community Homey MCP servers,
and that turns out not to be an oversight.
Creating a Flow needs a write scope that Athom deliberately withholds from third-party OAuth clients, and the local API keys that would carry it do not exist on Homey Pro hardware older than 2023. This server goes through the one route that does work: the session your own Homey CLI login already holds.
It also does analytics the official server does not: trends, comparisons over time and energy arithmetic computed from your Insights history.
Related MCP server: MCP Server for Homey API
Requirements
A Homey Pro. Homey Cloud and Homey Bridge have no local API and are not supported.
Node 24 or newer (
homey-apirequires it).Nothing else. Setup installs the official Homey CLI and signs you in if you want it, and works without it if you do not.
Setup
npx homey-mcp setupIt checks Node, looks for the official Homey CLI, offers to install it and walks you through signing in and picking a Homey, then connects and reads your Homey's identity back before saving anything. Finally it prints the exact command to register the server with your assistant. No IP addresses to hunt down, no JSON to hand-edit.
Nothing is installed without asking. If you would rather not have the CLI, decline and setup uses an Athom Personal Access Token from https://tools.developer.homey.app/me instead. Everything works on that token except creating Flows, which needs the root scope only Athom's own tool is given.
To do the CLI part yourself instead:
npm install --global homey
homey login
homey selectFor an unattended run, npx homey-mcp setup --yes accepts those offers up front.
It will not replace credentials you already have.
For Claude Code:
claude mcp add --scope user --transport stdio homey -- npx -y homey-mcp@latestCheck everything at any time:
npx homey-mcp doctorWhat this rests on, and how it can break
The thing that makes this server able to create Flows is also its most fragile dependency. It is worth knowing before you install rather than after.
Athom withholds flow-write scopes from third-party OAuth clients, and the local
API keys that would carry them do not exist on Homey Pro hardware older than
2023. The one credential that does carry the scope is the session your own
homey login created, and the official Homey CLI keeps that session in a file it
owns: ~/.athom-cli/settings.json, or ~/.homey/settings.json on newer CLI
releases, or wherever HOMEY_HOME points. This server reads that file.
Nothing about it is a public interface. It is another program's private state: undocumented, not covered by anybody's compatibility promise, and free to change shape or move in any CLI release. It has moved once already, which is why both locations are checked. So:
A Homey CLI update can break this server without a line changing here. The symptom is every tool reporting that the server is not signed in, and
npx homey-mcp doctorthen says whether the CLI is installed, whether a login is stored on this machine and which Homey is selected, which is what separates "the file moved again" from "the session simply expired".This server only ever reads that file. It never writes it, and it never drives the CLI in the background.
homey loginandhomey selectare run bysetuponly, with you watching.A missing or expired credential does not stop the server from starting. It starts, completes the handshake, and lists its tools, so your client shows it as connected rather than as a failure with no explanation. Every tool that needs the Homey then refuses with what to do about it. That matters more than it sounds: a client cannot show a reason for a process that exited, so exiting turned the most ordinary situation there is, a session that lapsed overnight, into a red cross with nothing to act on.
homey_authenticateis how you recover without restarting anything. Runhomey login, ornpx homey-mcp setupfor the token that does not expire, and then call that tool. It reads the credential source again and signs in with whatever it finds. It does not open a browser and it never asks you for a token: the MCP specification forbids collecting credentials that way, and everything a tool returns is kept in the conversation long after the call.A session in it lasts exactly 24 hours, so a server left running outlives its own credential every day. It does not stop when that happens: the first call Homey refuses makes it read the credential source again and sign in once more, which usually finds the newer session the CLI has already written there. So leaving it running is the intended way to use it, and a session expiring is not a reason to restart anything. What it will not do is repeat the call it was in the middle of when the session died, unless that call only read something: a refused write may still have been carried out by Homey, so it is reported back with the session renewed and you decide whether to send it again. If nothing usable is left in the file, the failure says so and names the command that fixes it.
Five things are read out of it and nothing else: the two tokens, which Homey is active, and the session's expiry and scopes. The tokens authenticate to your own Homey and, when no local address answers, to
api.athom.com. Nothing in that file is sent anywhere else.The way around it is an Athom Personal Access Token in
HOMEY_PAT, from https://tools.developer.homey.app/me. That is a documented, supported credential that does not involve the CLI at all. Everything works on it except creating Flows.
If that trade is not one you want to make, the honest summary is that this project's headline feature depends on a file it does not own, and the supported credential cannot do the headline feature.
What it can do
Understand your home. One call returns the zone tree, devices by room and type, installed apps, logic variables and presence. Search devices by room, capability or name, with live values.
Control it. Set a capability, set a logic variable, start an existing Flow.
Build automations. Search the Flow cards your Homey actually has (a real hub has around 800 of them), inspect a card's arguments and tokens, resolve device arguments, validate a proposed Flow client-side, then create it. Advanced Flows too, where the hardware supports them.
Keep them organised. List the folder tree with a flow count per folder, create folders and nest them, rename or move one, and move flows between them in a batch. Moving a flow changes where it lives and nothing about what it does. A folder that still holds flows cannot be deleted, which is the Homey's own rule rather than this server's, so the tool says which flows to move first instead of passing on a localised "an unknown error occurred".
Write HomeyScript scripts. List, read, create, update, run and delete the scripts that run on the Homey itself, for logic no Flow card can express. Running one reports what it returned, and reports a script that failed with the line it failed on, so this is also how a script gets debugged. HomeyScript is an app rather than a firmware feature, so if it is not installed the tools offer to install it and install nothing without an explicit yes.
What it cannot do is read log() output: that goes to the HomeyScript app's own
console, and no route here reaches it. The run answers with the script's return
value instead, so anything worth checking belongs there. The tools say so, which
is the point: otherwise checking whether a script works means asking you to open
the Homey app and read the console back.
Scripts are steered toward being reusable rather than toward whatever works
once: take what varies as args[0] from the Flow card, look a device up by zone
and capability rather than by an id pasted into the code, and prefer answering a
question so the Flow can act on the answer. An id written into a script is
reported as a warning rather than refused, because sometimes there is no better
way.
Answer questions about history. Find the right Insights series from a plain description, query one or several at a resolution, compare two periods, and get statistics with an honest coverage figure. Live power draw, and energy over time computed correctly from cumulative meters rather than averaged into nonsense.
Safety
This software can change your house, so it is deliberately cautious.
Every mutating tool is annotated so your client can ask before running it.
New Flows are created disabled, in their own folder. Nothing starts running your home the moment it is written.
Updating or deleting a Flow this server did not create requires an explicit confirmation, and keeps a copy of the previous version.
After writing a Flow it is read back and compared against what was sent.
There is no generic "call any endpoint" tool. Every capability is a named tool with its own validation.
Credentials are stored with
0600permissions in your user config directory, and are stripped from every log line, error message and tool response.
See SECURITY.md for the full picture.
Versioning, and what the public API is
Semantic versioning's first requirement is that a project declares a public API.
For this one that is the tool surface, not the TypeScript inside it. The
package ships a command, not a library. It declares no exports map and no
library entry point, and while the build does emit .d.ts files next to the
compiled JavaScript, nothing they describe is part of the public API: main and
reportExitCode in dist/index.js exist to start the process, and importing
them or anything deeper in dist/ is unsupported and can break in a patch
release.
Covered by the version number:
The tool names. Twenty-two of them, and the two Advanced Flow ones are registered only on a hub that has Advanced Flow:
homey_home_overview homey_flows_list homey_flowcards_search homey_devices_search homey_flow_get homey_flowcard_describe homey_device_get homey_flow_start homey_flowcard_autocomplete homey_device_set_capability homey_flow_validate homey_insights_search homey_variable_set homey_flow_create homey_insights_query homey_energy_live homey_flow_update homey_advancedflow_create homey_weather homey_flow_delete homey_advancedflow_update homey_doctorThe input schema of each tool: parameter names, their types, which are required, and the accepted values of the ones that take a fixed set.
The structured result fields: a field that a tool returns keeps its name, its type and its unit.
The command line:
serve,setupanddoctor, the flags each one takes, the exit codes, and the environment variablesHOMEY_MCP_CONFIG,HOMEY_PATandHOMEY_MCP_LOG_LEVEL.That
doctor --reportkeeps carrying hardware model, API dialect, firmware version, capability probe verdicts and missing endpoints, and keeps carrying nothing that identifies a household.
Not covered, deliberately: the human-readable text a tool returns, the server
instructions and the wording of errors, all of which are written for a model to
read and get rewritten whenever a model reads them badly; which tools exist on
your particular hub, since that is probed at runtime and reported by doctor;
the layout of src/ and every export in it; the address cache file; and any
field of doctor --json beyond the ones named above.
What 0.x means here. Semver imposes nothing below 1.0: it says outright that anything may change at any time. The following is therefore this project's own promise rather than something the specification gives you:
a change that breaks anything in the covered list bumps the minor, so 0.1.x becomes 0.2.0;
new tools, new optional parameters, new result fields and fixes bump the patch.
Read a 0.x minor bump the way you would read a major one after 1.0. If you have
built anything on top of this, pin it: homey-mcp@~0.1.0 takes patches only.
What would earn a 1.0. Four things, none of them true yet:
The V3 dialect confirmed against real 2023-or-newer hardware by at least one compatibility report, so the second half of the hardware table stops being a reasoned guess.
One full minor cycle in which nothing in the covered list had to break.
The credential route settled. Creating a Flow depends on a file the Homey CLI owns and has already moved once, described under What this rests on. A 1.0 needs either a supported credential that can create Flows, or a full minor cycle showing that route holding still. A 1.0 whose headline feature breaks on somebody else's release is a 1.0 in name only.
The
doctor --reportfield set settled, since the issue templates quote it and a compatibility report is only comparable against other reports of the same shape.
What you can rely on today. Tool names and their arguments do not change
within 0.1.x. The safety behaviour does not loosen in a patch: new flows are
created disabled in their own folder, touching anything this server did not
create needs an explicit confirmation and keeps a pre-image, there is no generic
"call any endpoint" tool, and credentials never appear in a tool result. There is
no telemetry, and adding any would not be a patch.
Three documents divide this up and are meant not to repeat each other: this section owns what the version number promises, RELEASING.md owns how a release is cut, and COMPATIBILITY.md owns which hardware is supported and how that is established.
Hardware support
Hardware | Status |
Homey Pro (Early 2019), | Tested. Every measured behaviour in this project came from one of these. |
Homey Pro (Early 2018) | Expected to work: same API generation and firmware line, but untested. |
Homey Pro (Early 2016) | Likely not supported. This generation can report an older API version again ( |
Homey Pro (Early 2023) and newer | Supported but untested. The code detects the newer API dialect and adapts, and the newer hardware is strictly more capable, but nobody has run it against one. Bug reports very welcome. |
Homey Cloud, Homey Bridge | Not supported. No local API. |
About the hardware I cannot test
I own one Homey: a Homey Pro (Early 2019). Every measured behaviour in this project came off that single hub.
That shapes what is useful to send me. A bug that only reproduces on another generation is one I cannot reproduce, cannot verify a fix for, and cannot keep working afterwards, so a plain bug report about it does not get anywhere. Two things do:
A hardware compatibility report. Run
npx homey-mcp doctor --reportand open the compatibility issue template with the output. The report is scrubbed by design: hardware model, API dialect, firmware version, which capability probes passed, which endpoints are missing. No device names, no addresses, no credentials. That is enough to fix most things blind, and it is how "supported but untested" turns into something real.A pull request with evidence that it works. A short recording, a screenshot of the created Flow in the Homey app, or the doctor report before and after.
If the report is all you can send, send the report. It is a complete contribution on its own, not a lesser version of a pull request: it is the only route by which hardware nobody here owns ever gets real data, and a row in COMPATIBILITY.md credited to you is the result either way. You do not need to read the code, reproduce anything twice, or work out what went wrong. Paste the report, say which tools you called and what came back in your assistant's own words, and say whether creating a Flow worked, since that is the one thing here that no other server does and the likeliest thing to break on hardware I cannot test. A report that says everything failed is worth as much as one that says everything worked. COMPATIBILITY.md has the full checklist and owns the hardware support policy.
Capabilities are probed at runtime rather than inferred from a version number,
because the two hardware generations publish the same firmware version numbers
while having completely different feature sets. Advanced Flow is a paid unlock as
well as a firmware feature, so its two tools are registered only when the startup
probe found the route, or could not tell. A probe that fails is not a verdict
about your hardware: this hub rate limits its own local API, so one refused
request at startup would otherwise hide a working feature for as long as the
server runs. doctor reports which of the two answers each probe gave, and
restarting the server probes again.
Historical energy comes from Insights on every generation, and that is worth
stating plainly because it is easy to read the table above as if newer hardware
took a different path. It does not. homey_energy_live answers what the house is
drawing right now, and everything over time is computed from Insights logs:
meter_power, a cumulative counter where consumption is the difference between
two points, and measure_power, instantaneous watts where energy is the area
under the line. The 2019 hardware has no historical energy report endpoints at
all, and on the hubs that do have them this server does not read them either. So
a 2023 hub answers energy history through exactly the same route as a 2019 one.
doctor still probes for the report endpoints, because knowing which hubs have
them is what a future version would need.
Privacy
Everything runs on your machine, and there is no telemetry of any kind. Nothing is ever sent to the author or to any third party.
Where your data actually goes depends on which route reaches your Homey, and the server tells you which one it used:
Over your network, the normal case. Your credential authenticates straight at the hub and no home data touches the internet.
doctorreports this as a local or local TLS connection.Through Athom's cloud, when no local address answers, for example when this server runs somewhere other than your home network. Then every call is relayed by Athom, the same as using the Homey app while away.
doctorsays so plainly, and the server's own startup log names the route.
Reaching the Athom cloud is also needed the first time, to learn where your Homey answers on your network. That address is then cached locally so later starts can skip it.
Contributing
See CONTRIBUTING.md. One rule matters more than the rest: never commit anything captured from a real Homey, not even pseudonymised. A pre-commit hook and a CI check enforce it.
License
MIT. See LICENSE.
This is an independent project. It is not affiliated with, endorsed by, or supported by Athom B.V. "Homey" is their trademark, used here only to say what this software talks to.
Available Tools
36 toolshomey_advancedflow_createCreate a Homey advanced flowA
An advanced flow is a graph of cards rather than one trigger and a list of actions: branches, parallel paths, joins, delays and error handlers. Give each card your own label and refer to those labels in the output lists; real ids are generated before sending. To use a value another card produced, write [[trigger::<that card's label>::]] or [[action::::]]. The [[owner|token]] form used in standard flows does not name a card and will not work here. The flow is created switched OFF and inside the "AI" folder, then read back and compared with what was sent.
Inputs: name (required), cards (required).
homey_advancedflow_updateChange a Homey advanced flowADestructiveIdempotent
An advanced flow is a graph of cards rather than one trigger and a list of actions: branches, parallel paths, joins, delays and error handlers. Give each card your own label and refer to those labels in the output lists; real ids are generated before sending. To use a value another card produced, write [[trigger::<that card's label>::]] or [[action::::]]. The [[owner|token]] form used in standard flows does not name a card and will not work here. The whole graph is replaced, so every card that should survive has to be sent again: read the current one with homey_flow_get first. A flow this server did not create needs confirm: true. Switching a flow that is off ON needs confirmEnable: true.
Inputs: flow (required), cards (required), name, confirm, +2 more.
homey_authenticateSign in to HomeyARead-onlyIdempotent
Signs this server in to the Homey, or confirms that it already is. Call this when any other tool reports that the server is not signed in. A Homey session lasts 24 hours, so a server that has been running for a day needs this rather than a restart. It does not ask for a password or a token and never handles one: the user signs in with Athom directly, and this picks up the result. If it reports that it could not sign in, read the instructions it returns to the user verbatim. They name the exact commands, and which of the two routes keeps working after 24 hours.
Inputs: no named parameters.
homey_device_getGet one Homey deviceARead-onlyIdempotent
Full detail for a single device: every capability with its live value, whether it can be set, its unit, decimals and allowed range, the energy block, and which Insights logs exist for it. Each of those logs carries a logId that homey_insights_query takes as is, so this is the route from a device to its own history. Accepts a device id or a device name. Read the min and max here before calling homey_device_set_capability: several capabilities are a 0..1 fraction despite reading as a percentage.
Inputs: device, deviceId.
homey_device_set_capabilitySet a Homey device capabilityADestructiveIdempotent
Changes one capability of one device, for example onoff, dim or target_temperature. This physically changes something in the house. Beware the percentage trap: dim, light_hue, light_saturation, light_temperature, windowcoverings_set, volume_set and fan_speed report their unit as a percentage but take a fraction between 0 and 1, so 60 percent is 0.6. A value outside the capability range is clamped to it and the clamp is reported. Call homey_device_get first when unsure of a range or of which capabilities can be set.
Inputs: value (required), device (required), capability (required).
homey_devices_searchSearch Homey devicesARead-onlyIdempotent
Finds devices by zone, class, capability or name, and optionally returns their live values. Set includeCapabilitySummaries to answer a question like "what is the state of the living room" in one call. Every filter is combined with AND. Results are projected down to what is useful for reasoning: protocol settings, icons, images and interface layout are never returned. The Homey API cannot paginate, so paging happens here: use offset with limit and check truncated.
Inputs: zone, limit, offset, available, +5 more.
homey_doctorDiagnose the Homey connectionARead-onlyIdempotent
Reports what is and is not working between this server and your Homey: which kind of address answered and how it was chosen, which kind of credential source was used (never the credential itself), the hardware model and firmware, which features this Homey generation actually supports and why, whether the official Homey CLI is installed and signed in (which is what decides whether flows can be created), and how much of the home has been read so far. Call this when another Homey tool fails, or before reporting a problem. Every check comes with a concrete next step. Safe to paste into a public issue: no device, zone or household names, no network addresses, no Homey id and no file paths. Run "npx homey-mcp doctor" in a terminal for the version that keeps those.
Inputs: includeSystem, includeInventory.
homey_energy_liveLive power drawARead-onlyIdempotent
Reads what the home is drawing right now, in watts, broken down by room and by device, together with the whole-home meter reading and the load Homey cannot attribute to anything. Instantaneous only: for history use homey_insights_query on a meter_power log (a cumulative kWh counter, where consumption is the difference between its endpoints) or a measure_power log (instantaneous watts, where energy is the area under it). Homey Pro (Early 2019) has no historical energy report endpoints at all, so Insights is the only history there.
Inputs: limit, includeItems.
homey_flowcard_autocompleteResolve a Homey flow card argumentARead-onlyIdempotent
Asks the Homey what a device-typed or autocomplete-typed argument can be set to, and returns the choices. Store the WHOLE object of the chosen result as the argument value. Cards keep app-specific fields next to the id and the name, for example a Google Cast action stores the host and description alongside them, and rebuilding the object by hand loses those and breaks the card.
Inputs: cardId (required), argument (required), args, kind, +2 more.
homey_flowcard_describeDescribe one Homey flow cardARead-onlyIdempotent
Returns everything needed to use one flow card: every argument with its type and allowed values, the values the card emits for later cards to read, whether it accepts a dropped value, and whether it is deprecated. The arguments come back under arguments, the same field homey_flowcards_search reports with only the name and type of each; here every entry additionally carries its title, whether it is required, its allowed values and range, and how to resolve it. The values you then set on the card are sent as args, keyed by those argument names. arguments is the schema, args is what you fill in. Call this for each card before building a flow. Guessing an argument name produces a flow that saves and then does nothing.
Inputs: cardId (required), kind.
homey_flowcards_searchSearch Homey flow cardsARead-onlyIdempotent
Finds the flow cards available on this Homey. Flow cards are the building blocks of a flow: a trigger card starts it, condition cards decide whether it continues, and action cards do something. This Homey exposes hundreds of cards, so at least one filter is required: a search term, a device, an owning app or manager, or an owner uri. An unfiltered call is refused. Results carry only enough to choose a card: the id under cardId, which every other flow tool takes under that same name, and the arguments the card declares under arguments, with the name and type of each. Call homey_flowcard_describe with that cardId for the rest of each argument, which is what you need before using the card in a flow.
Inputs: kind, limit, owner, query, +3 more.
homey_flow_createCreate a Homey flowA
Builds a new flow. It is created switched OFF and inside a folder called "AI", so nothing happens in the house until the owner has read it and switched it on. The flow is validated first and refused outright if anything is wrong, then read back from the Homey and compared with what was sent. The result carries a link to it in the Homey app.
Inputs: name (required), trigger (required), actions, conditions.
homey_flow_deleteDelete a Homey flowADestructive
Deletes a flow, standard or advanced. The Homey has no undo, so the flow exactly as it was is returned in the result and can be rebuilt from it. A flow this server did not create needs confirm: true.
Inputs: flow (required), confirm.
homey_flow_folder_createCreate a folder for flowsA
Creates a folder to organise flows in, optionally inside another one. Returns the id, which is what homey_flow_move takes. Names are not unique on a Homey, so check homey_flow_folders_list first rather than creating a second folder with a name that already exists.
Inputs: name (required), parent.
homey_flow_folder_deleteDelete a flow folderADestructive
Removes an empty flow folder. The Homey refuses to delete one that still contains flows, so move them out first with homey_flow_move. Deleting a folder never deletes a flow.
Inputs: folder (required).
homey_flow_folders_listList the folders flows are organised inARead-onlyIdempotent
Lists every flow folder with how many flows sits in it, as a tree: folders can contain folders. Flows outside every folder are reported separately. Use this before moving anything, because folder names are not unique and only the id addresses one for certain.
Inputs: no named parameters.
homey_flow_folder_updateRename a folder or move itA
Renames a flow folder, moves it inside another one, or both. The flows in it are untouched and keep working. Send parent as null to move a folder back to the top level.
Inputs: folder (required), name, parent.
homey_flow_getRead one Homey flowARead-onlyIdempotent
Returns everything one flow contains: its trigger, conditions and actions with their arguments, or for an advanced flow the whole graph of cards. Every card is resolved to its title so the flow can be read as a sentence, and a card that no longer exists is marked.
Inputs: flow (required).
homey_flow_moveMove flows into a folderA
Moves one or more flows into a folder, or out of every folder when folder is null. Takes flow ids or exact names. This changes where a flow lives and nothing about what it does: it keeps its cards, and a flow that was running stays running. The folder each flow came from is reported, so a move can be undone from the result.
Inputs: flows (required), folder (required).
homey_flows_listList Homey flowsARead-onlyIdempotent
Lists the flows on this Homey, standard and advanced together. Filter by name, folder, kind or state. Use homey_flow_get to see what one flow actually does.
Inputs: kind, limit, query, folder, +2 more.
homey_flow_startStart a Homey flowADestructive
Runs an existing flow immediately, exactly as if its trigger had fired. This is a real execution and not a preview: a flow can unlock a door, open a window covering, turn on the heating or send a message. Read the flow with the flow tools before starting it if you are not certain what it does. Works for both standard and advanced flows.
Inputs: flow (required).
homey_flow_tokensList the values flows can useARead-onlyIdempotent
Lists every token on this Homey with the value it holds right now. A token is anything a flow card can drop into a text argument: a device capability, a logic variable, or a tag published by an app. This is how to read back a tag a script has written, which is otherwise only visible in the Homey app. The "id" it reports is what a reference must name: [[|]] in a card argument. Use it with homey_flow_validate, which checks references against exactly this list.
Inputs: limit, query.
homey_flow_updateChange a Homey flowADestructiveIdempotent
Replaces the trigger, conditions and actions of an existing standard flow. Anything left out keeps its current value, but an array that IS sent replaces that array wholesale. A flow this server did not create belongs to the owner and needs confirm: true. The flow as it was is read first and returned in the result, so a wrong change can be put back by sending it again. Switching a flow that is off ON is a separate step that needs confirmEnable: true, because a flow that is off has never run in the house.
Inputs: flow (required), name, actions, confirm, +4 more.
homey_flow_validateCheck a flow before building itARead-onlyIdempotent
Checks a flow against this Homey without writing anything and without running anything: every card exists and is the right kind, every argument is named and typed correctly, every device and zone it names is still here, and every [[token]] reference names a value this Homey actually publishes, whether that is a device capability, a logic variable or a tag from an app. Worth calling first, because the Homey itself accepts almost anything. A flow naming a card that does not exist saves and shows as "NO CARD"; a token written with a colon instead of a pipe, or naming a tag that was never published, saves and shows as "Unavailable". Neither reports an error. The one thing it cannot judge is whether the flow does what the owner meant.
Inputs: name (required), trigger (required), actions, conditions.
homey_home_overviewHomey home overviewARead-onlyIdempotent
Orients you in this Homey in one call: the zone tree with device counts, device counts by class, the most common capabilities, devices that are currently unavailable, installed apps, logic variables, household presence, flow counts, and what this Homey generation can actually do. Call this before any other Homey tool. It returns counts and names rather than full device records, so use homey_devices_search or homey_device_get afterwards for actual device state. Narrow it with include when you only need one part.
Inputs: limit, include.
homey_insights_queryQuery sensor historyARead-onlyIdempotent
Fetches up to five Insights series at one resolution and returns statistics computed over them: min, max, mean, median, first, last and delta, plus the true window and step the hub answered with and the share of it that actually carries samples. Gaps are skipped rather than filled in, so always read the coverage next to an average. Use compareWith to fetch a second window and get the differences, which is what questions like "warmer than last week" need. Energy logs are summarised correctly for their kind: meter_power is a cumulative counter, so consumption is the difference between its endpoints, while measure_power is instantaneous watts, so energy is the area under it. Find log ids with homey_insights_search first.
Inputs: logs (required), groupBy, maxValues, resolution, +2 more.
homey_insights_searchSearch sensor history logsARead-onlyIdempotent
Finds Insights logs (sensor and meter history) by fuzzy matching over room name, device name, log title, capability id and units. A Homey carries well over a hundred logs, titled in the household's own language, so start here: this is how "the living room temperature sensor" becomes a log id you can query. Returns candidates with their ids and never guesses which one was meant.
Inputs: type, limit, query.
homey_script_createCreate a HomeyScript scriptA
Creates a new script and returns the id the Homey assigned to it. Use that id afterwards: the name is not an address, and two scripts may share one. The script runs on the Homey, so it has the Homey API available as Homey, writes output with log(), and can hand a value back to the Flow that started it with return or tag(). Write scripts to be reusable. Take what varies as an argument rather than baking it in: the HomeyScript Flow card passes text into the script as args[0], so one script can serve several Flows and several rooms. Prefer looking a device up by what it IS over what its id is, for example by zone and capability, so the script survives a device being replaced. Prefer returning a value and letting the Flow act on it over acting inside the script. A script that answers "should I open the window" can be reused; one that also opens the window cannot. A hard-coded device id is acceptable when there is genuinely no other way, or when a lookup would be more fragile than the id. It is the exception, and it is worth a comment saying why. This server cannot see log() output: it goes to the HomeyScript app console and no route here reads it. What comes back is the return value, so return whatever needs checking rather than logging it. While a script is being written, return an object with the intermediate values in it; trim it to the real answer once it works. Run it with homey_script_run once created, because a script that has never run is a script nobody has checked.
Inputs: code (required), name (required).
homey_script_deleteDelete a HomeyScript scriptADestructive
Removes a script from the Homey. It is gone: there is no undo, and any Flow that started it stops working. The code is returned in the result, so it can be recreated from this answer if that turns out to be a mistake.
Inputs: script (required).
homey_script_getRead a HomeyScript scriptARead-onlyIdempotent
Returns one script including its code. Takes the id or the exact name, as reported by homey_scripts_list.
Inputs: script (required).
homey_script_runRun a HomeyScript scriptADestructive
Runs a script on the Homey now and reports what it returned. A script that throws is reported here as a normal answer with the error and the line it happened on, so this is also how a script gets debugged. This server cannot see log() output: it goes to the HomeyScript app console and no route here reads it. What comes back is the return value, so return whatever needs checking rather than logging it. While a script is being written, return an object with the intermediate values in it; trim it to the real answer once it works. It really runs: anything the script does to the house, it does.
Inputs: script (required).
homey_scripts_listList HomeyScript scriptsARead-onlyIdempotent
Lists every HomeyScript script on this Homey with its id, name, version and when it last ran. Scripts are small pieces of JavaScript that run on the Homey itself and can be started from a Flow, which is how logic that a Flow card cannot express gets done. Returns no code: read one script with homey_script_get.
Inputs: no named parameters.
homey_script_updateReplace the code of a HomeyScript scriptA
Replaces the code of a script that already exists, found by id or exact name. The previous code is returned so the change can be undone from the result alone. Write scripts to be reusable. Take what varies as an argument rather than baking it in: the HomeyScript Flow card passes text into the script as args[0], so one script can serve several Flows and several rooms. Prefer looking a device up by what it IS over what its id is, for example by zone and capability, so the script survives a device being replaced. Prefer returning a value and letting the Flow act on it over acting inside the script. A script that answers "should I open the window" can be reused; one that also opens the window cannot. A hard-coded device id is acceptable when there is genuinely no other way, or when a lookup would be more fragile than the id. It is the exception, and it is worth a comment saying why. This server cannot see log() output: it goes to the HomeyScript app console and no route here reads it. What comes back is the return value, so return whatever needs checking rather than logging it. While a script is being written, return an object with the intermediate values in it; trim it to the real answer once it works.
Inputs: code (required), script (required).
homey_variable_createCreate a Homey logic variableA
Creates a new logic variable. Use this when an automation needs to remember something between runs, or to hand a value from one flow to another. A logic variable is the better choice over a tag published from a script whenever a person may want to see or change the value: logic variables appear in the Homey app, can be set by hand, and are readable here through homey_home_overview. Exactly three types exist: string, number and boolean. The type is fixed once created and the value must match it. It is created with the value given, so pick a starting value the house can live with: flows may read it immediately. Creating something the owner did not ask for clutters their Homey, so confirm is required.
Inputs: name (required), type (required), value (required), confirm (required).
homey_variable_setSet a Homey logic variableADestructiveIdempotent
Writes a new value to an existing Homey logic variable. A variable is one of exactly three types: string, number or boolean, and the new value has to match the type the variable already has. Flows read these variables, so changing one can change what the house does next. This tool never creates a variable; use homey_home_overview to see which ones exist.
Inputs: value (required), variable (required).
homey_weatherOutdoor weatherARead-onlyIdempotent
Reads the outdoor weather Homey itself uses: temperature, humidity, air pressure, a readable sky description, and the name of the town the reading is for, plus the forecast, in one call. Use it to compare outdoors against indoors (pair it with homey_device_get on a room sensor), to answer whether opening a window would help, or to look ahead to tonight's low. Humidity is returned as a percentage from 0 to 100: Homey's own field is a 0 to 1 fraction and is converted here. Temperature is in whatever unit this Homey is configured for, echoed as temperatureUnits, and pressure is given in bar with the millibar (hectopascal) equivalent beside it. Forecast granularity depends on the hardware and is stated explicitly in every result: a daily forecast is always returned, each day carrying its expected, minimum and maximum temperature, where the minimum is effectively that night's low, while an hourly forecast is included only when this Homey offers one and its absence is reported as a plain statement rather than as an error. What it cannot do: it is one reading for one location, the town it names, taken from Homey's weather provider rather than from any hardware in this house, so it is not a substitute for an outdoor sensor in the garden and says nothing about conditions in any individual room. The sky description arrives in the Homey's own language. For outdoor history rather than the present, look for the logs owned by homey:manager:weather with homey_insights_search and query those.
Inputs: includeForecast, includeHourlyForecast.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 36 tools
Each tool targets a distinct resource and action, from devices to flows, scripts, variables, and insights. Even within the same domain, tools are clearly differentiated, e.g., flow_create vs advancedflow_create vs flow_start vs flow_validate.
All tools follow the homey_<domain>_<action> pattern, with plural nouns used for search/list operations and singular for single-item operations (e.g., homey_devices_search vs homey_device_get, homey_flows_list vs homey_flow_get). The naming is predictable and consistent across the entire set.
The 36-tool count is heavy, but each tool earns its place given the server's broad scope covering devices, flows (standard and advanced), flow cards, folders, scripts, variables, insights, energy, weather, and diagnostics. It is slightly over the typical 3-15 range but justified by the domain's complexity.
The surface is comprehensive: CRUD for flows (including advanced flows via flow_delete), scripts, variables (create/set), folders, and flow cards; plus search and query for devices and insights, with additional utilities for energy, weather, auth, and diagnostics. No obvious dead ends or missing lifecycle operations for the stated purpose.
Maintenance
Related MCP Connectors
Home energy for AI assistants: live Power flow, Energy history, solar forecast, and device control.
Control your Tesla from your AI assistant - climate, charging, access, and security.
Connects AI assistants to TrackingTime for querying time entries, projects, tasks, customers, and team data using natural language.
Control your existing Philips lights, Sonos speakers, Roborock vacuums and other supported devices through Port OS cloud. Give ChatGPT, Claude and other MCP-compatible assistants access to the devices you connect. Turn off the living room lights, play music on your speakers, adjust the thermostat, run a vacuum in a room, check a camera snapshot or find a connected tracker. Available actions depend on your linked provider accounts and each device’s supported capabilities. Port OS runs in the cloud; no local server is required. You choose the account, device and capability permissions each assistant receives. Device operations require user OAuth; public tool discovery does not grant device access. Port OS is in alpha. Setup: https://portoperatingsystem.com/docs/getting-started/ Support: https://portoperatingsystem.com/contact/
Related MCP Servers
- FlicenseBqualityNot gradedmaintenanceEnables interaction with Homey smart home devices through natural language, allowing users to control devices, manage zones, and trigger automation flows.64-
- AlicenseNot gradedqualityNot gradedmaintenanceEnables AI agents to interact with Homey home automation systems for managing flows, devices, and zones. Perfect for bulk automation tasks like batch renaming flows, organizing them into folders, and managing devices across zones through natural language.-
- 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
- AlicenseNot gradedqualityDmaintenanceEnables Claude AI to control and manage Homey Pro smart home devices, flows, and analytics through natural language.12MIT