@mp-consulting/homebridge-mcp-server 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +142 -0
  2. package/dist/__tests__/homebridge-client.test.d.ts +2 -0
  3. package/dist/__tests__/homebridge-client.test.d.ts.map +1 -0
  4. package/dist/__tests__/homebridge-client.test.js +262 -0
  5. package/dist/__tests__/homebridge-client.test.js.map +1 -0
  6. package/dist/__tests__/tools/accessories.test.d.ts +2 -0
  7. package/dist/__tests__/tools/accessories.test.d.ts.map +1 -0
  8. package/dist/__tests__/tools/accessories.test.js +252 -0
  9. package/dist/__tests__/tools/accessories.test.js.map +1 -0
  10. package/dist/__tests__/tools/config.test.d.ts +2 -0
  11. package/dist/__tests__/tools/config.test.d.ts.map +1 -0
  12. package/dist/__tests__/tools/config.test.js +85 -0
  13. package/dist/__tests__/tools/config.test.js.map +1 -0
  14. package/dist/__tests__/tools/plugins.test.d.ts +2 -0
  15. package/dist/__tests__/tools/plugins.test.d.ts.map +1 -0
  16. package/dist/__tests__/tools/plugins.test.js +119 -0
  17. package/dist/__tests__/tools/plugins.test.js.map +1 -0
  18. package/dist/__tests__/tools/server.test.d.ts +2 -0
  19. package/dist/__tests__/tools/server.test.d.ts.map +1 -0
  20. package/dist/__tests__/tools/server.test.js +126 -0
  21. package/dist/__tests__/tools/server.test.js.map +1 -0
  22. package/dist/__tests__/tools/system.test.d.ts +2 -0
  23. package/dist/__tests__/tools/system.test.d.ts.map +1 -0
  24. package/dist/__tests__/tools/system.test.js +62 -0
  25. package/dist/__tests__/tools/system.test.js.map +1 -0
  26. package/dist/homebridge-client.d.ts +35 -0
  27. package/dist/homebridge-client.d.ts.map +1 -0
  28. package/dist/homebridge-client.js +165 -0
  29. package/dist/homebridge-client.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +24 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/tools/accessories.d.ts +4 -0
  35. package/dist/tools/accessories.d.ts.map +1 -0
  36. package/dist/tools/accessories.js +139 -0
  37. package/dist/tools/accessories.js.map +1 -0
  38. package/dist/tools/config.d.ts +4 -0
  39. package/dist/tools/config.d.ts.map +1 -0
  40. package/dist/tools/config.js +43 -0
  41. package/dist/tools/config.js.map +1 -0
  42. package/dist/tools/plugins.d.ts +4 -0
  43. package/dist/tools/plugins.d.ts.map +1 -0
  44. package/dist/tools/plugins.js +111 -0
  45. package/dist/tools/plugins.js.map +1 -0
  46. package/dist/tools/server.d.ts +4 -0
  47. package/dist/tools/server.d.ts.map +1 -0
  48. package/dist/tools/server.js +116 -0
  49. package/dist/tools/server.js.map +1 -0
  50. package/dist/tools/system.d.ts +4 -0
  51. package/dist/tools/system.d.ts.map +1 -0
  52. package/dist/tools/system.js +17 -0
  53. package/dist/tools/system.js.map +1 -0
  54. package/dist/types.d.ts +8 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +2 -0
  57. package/dist/types.js.map +1 -0
  58. package/package.json +45 -0
package/README.md ADDED
@@ -0,0 +1,142 @@
1
+ # @mp-consulting/homebridge-mcp-server
2
+
3
+ MCP (Model Context Protocol) server for [Homebridge](https://homebridge.io) — control your smart home accessories, manage plugins, edit configuration, and monitor your Homebridge server from AI assistants like Claude.
4
+
5
+ ## Features
6
+
7
+ - **Accessories** — List, inspect, and control all your Homebridge accessories (lights, switches, thermostats, sensors, etc.)
8
+ - **Server Management** — Check status, restart Homebridge, view pairing info, manage cached accessories
9
+ - **Configuration** — Read and update your `config.json`
10
+ - **Plugins** — List installed plugins, search npm, view config schemas and changelogs
11
+ - **System Info** — CPU, memory, OS, and network details of the host machine
12
+
13
+ ## Prerequisites
14
+
15
+ - [Homebridge](https://homebridge.io) with [homebridge-config-ui-x](https://github.com/homebridge/homebridge-config-ui-x) installed (provides the REST API)
16
+ - Node.js 18+
17
+
18
+ ## Installation
19
+
20
+ ```bash
21
+ npm install -g @mp-consulting/homebridge-mcp-server
22
+ ```
23
+
24
+ ## Configuration
25
+
26
+ The server requires three environment variables:
27
+
28
+ | Variable | Description | Example |
29
+ |----------|-------------|---------|
30
+ | `HOMEBRIDGE_URL` | URL of your Homebridge UI | `http://192.168.1.100:8581` |
31
+ | `HOMEBRIDGE_USERNAME` | Homebridge UI login username | `admin` |
32
+ | `HOMEBRIDGE_PASSWORD` | Homebridge UI login password | `admin` |
33
+
34
+ ## Usage
35
+
36
+ ### Claude Desktop
37
+
38
+ Add to your Claude Desktop configuration (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
39
+
40
+ ```json
41
+ {
42
+ "mcpServers": {
43
+ "homebridge": {
44
+ "command": "homebridge-mcp-server",
45
+ "env": {
46
+ "HOMEBRIDGE_URL": "http://192.168.1.100:8581",
47
+ "HOMEBRIDGE_USERNAME": "admin",
48
+ "HOMEBRIDGE_PASSWORD": "your-password"
49
+ }
50
+ }
51
+ }
52
+ }
53
+ ```
54
+
55
+ ### Claude Code
56
+
57
+ ```bash
58
+ claude mcp add homebridge -- homebridge-mcp-server
59
+ ```
60
+
61
+ Then set the environment variables in your shell or `.env` file.
62
+
63
+ ### MCP Inspector (for testing)
64
+
65
+ ```bash
66
+ HOMEBRIDGE_URL=http://192.168.1.100:8581 \
67
+ HOMEBRIDGE_USERNAME=admin \
68
+ HOMEBRIDGE_PASSWORD=your-password \
69
+ npx @modelcontextprotocol/inspector homebridge-mcp-server
70
+ ```
71
+
72
+ ## Available Tools
73
+
74
+ ### Accessories
75
+
76
+ | Tool | Description |
77
+ |------|-------------|
78
+ | `list_accessories` | List all accessories with current state |
79
+ | `get_accessory` | Get detailed info for a specific accessory |
80
+ | `set_accessory` | Control an accessory (on/off, brightness, temperature, etc.) |
81
+ | `get_accessory_layout` | Get the room layout from the Homebridge UI |
82
+
83
+ ### Server
84
+
85
+ | Tool | Description |
86
+ |------|-------------|
87
+ | `get_homebridge_status` | Check if Homebridge is running |
88
+ | `get_server_status` | Get server version, uptime, Node.js version |
89
+ | `restart_homebridge` | Restart the Homebridge service |
90
+ | `get_pairing_info` | Get HomeKit pairing code / QR info |
91
+ | `get_cached_accessories` | List cached accessories |
92
+ | `remove_cached_accessory` | Remove a specific cached accessory |
93
+ | `reset_cached_accessories` | Reset all cached accessories |
94
+
95
+ ### Configuration
96
+
97
+ | Tool | Description |
98
+ |------|-------------|
99
+ | `get_config` | Read the current config.json |
100
+ | `update_config` | Update config.json (full replacement) |
101
+
102
+ ### Plugins
103
+
104
+ | Tool | Description |
105
+ |------|-------------|
106
+ | `list_plugins` | List installed plugins |
107
+ | `search_plugins` | Search npm for Homebridge plugins |
108
+ | `lookup_plugin` | Get details about a specific plugin |
109
+ | `get_plugin_versions` | Get available versions for a plugin |
110
+ | `get_plugin_config_schema` | Get the configuration schema for a plugin |
111
+ | `get_plugin_changelog` | Get the changelog for a plugin |
112
+
113
+ ### System
114
+
115
+ | Tool | Description |
116
+ |------|-------------|
117
+ | `get_system_info` | Get host system information (CPU, memory, OS) |
118
+
119
+ ## Example Prompts
120
+
121
+ Once configured, you can ask Claude things like:
122
+
123
+ - "List all my smart home accessories and their current status"
124
+ - "Turn off the living room lights"
125
+ - "Set the bedroom thermostat to 21 degrees"
126
+ - "What plugins are installed on my Homebridge?"
127
+ - "Show me the Homebridge config"
128
+ - "Is Homebridge running? What version?"
129
+ - "Search for a Homebridge plugin for Philips Hue"
130
+
131
+ ## Development
132
+
133
+ ```bash
134
+ git clone https://github.com/your-org/homebridge-mcp-server.git
135
+ cd homebridge-mcp-server
136
+ npm install
137
+ npm run build
138
+ ```
139
+
140
+ ## License
141
+
142
+ MIT
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=homebridge-client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homebridge-client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/homebridge-client.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,262 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ // We need to set env vars before importing the client
3
+ const ENV = {
4
+ HOMEBRIDGE_URL: "http://localhost:8581",
5
+ HOMEBRIDGE_USERNAME: "admin",
6
+ HOMEBRIDGE_PASSWORD: "admin",
7
+ };
8
+ function mockFetch() {
9
+ const fn = vi.fn();
10
+ vi.stubGlobal("fetch", fn);
11
+ return fn;
12
+ }
13
+ function jsonResponse(body, status = 200, headers) {
14
+ return new Response(JSON.stringify(body), {
15
+ status,
16
+ headers: { "content-type": "application/json", ...headers },
17
+ });
18
+ }
19
+ function textResponse(body, status = 200) {
20
+ return new Response(body, { status, headers: { "content-type": "text/plain" } });
21
+ }
22
+ describe("HomebridgeClient", () => {
23
+ let fetchMock;
24
+ beforeEach(() => {
25
+ Object.assign(process.env, ENV);
26
+ fetchMock = mockFetch();
27
+ });
28
+ afterEach(() => {
29
+ vi.restoreAllMocks();
30
+ vi.unstubAllEnvs();
31
+ vi.resetModules();
32
+ });
33
+ async function createClient() {
34
+ // Dynamic import so each test gets a fresh module with current env
35
+ const mod = await import("../homebridge-client.js");
36
+ return new mod.HomebridgeClient();
37
+ }
38
+ // Helper: set up fetch to handle login + one API call
39
+ function setupAuthAndApi(apiResponse) {
40
+ fetchMock
41
+ .mockResolvedValueOnce(jsonResponse({ access_token: "tok123" })) // login
42
+ .mockResolvedValueOnce(apiResponse);
43
+ }
44
+ // ── Constructor ───────────────────────────────────────────────
45
+ describe("constructor", () => {
46
+ it("throws when HOMEBRIDGE_URL is missing", async () => {
47
+ delete process.env.HOMEBRIDGE_URL;
48
+ await expect(createClient()).rejects.toThrow("HOMEBRIDGE_URL");
49
+ });
50
+ it("throws when HOMEBRIDGE_USERNAME is missing", async () => {
51
+ delete process.env.HOMEBRIDGE_USERNAME;
52
+ await expect(createClient()).rejects.toThrow("HOMEBRIDGE_USERNAME");
53
+ });
54
+ it("throws when HOMEBRIDGE_PASSWORD is missing", async () => {
55
+ delete process.env.HOMEBRIDGE_PASSWORD;
56
+ await expect(createClient()).rejects.toThrow("HOMEBRIDGE_PASSWORD");
57
+ });
58
+ it("strips trailing slashes from URL", async () => {
59
+ process.env.HOMEBRIDGE_URL = "http://localhost:8581///";
60
+ const client = await createClient();
61
+ setupAuthAndApi(jsonResponse([]));
62
+ await client.getAccessories();
63
+ expect(fetchMock).toHaveBeenCalledWith("http://localhost:8581/api/auth/login", expect.anything());
64
+ });
65
+ });
66
+ // ── Authentication ────────────────────────────────────────────
67
+ describe("authentication", () => {
68
+ it("authenticates on first request", async () => {
69
+ const client = await createClient();
70
+ setupAuthAndApi(jsonResponse([{ id: 1 }]));
71
+ const result = await client.getAccessories();
72
+ expect(fetchMock).toHaveBeenCalledTimes(2);
73
+ // First call: login
74
+ expect(fetchMock.mock.calls[0][0]).toBe("http://localhost:8581/api/auth/login");
75
+ expect(fetchMock.mock.calls[0][1]).toMatchObject({
76
+ method: "POST",
77
+ body: JSON.stringify({ username: "admin", password: "admin" }),
78
+ });
79
+ expect(result).toEqual([{ id: 1 }]);
80
+ });
81
+ it("throws on failed authentication", async () => {
82
+ const client = await createClient();
83
+ fetchMock.mockResolvedValueOnce(textResponse("Unauthorized", 401));
84
+ await expect(client.getAccessories()).rejects.toThrow("Authentication failed (401)");
85
+ });
86
+ it("reuses token for subsequent requests", async () => {
87
+ const client = await createClient();
88
+ // First request: login + api
89
+ setupAuthAndApi(jsonResponse({ status: "ok" }));
90
+ await client.getHomebridgeStatus();
91
+ // Second request: only api (no login)
92
+ fetchMock.mockResolvedValueOnce(jsonResponse({ status: "ok" }));
93
+ await client.getHomebridgeStatus();
94
+ // 3 total calls: login + api + api
95
+ expect(fetchMock).toHaveBeenCalledTimes(3);
96
+ });
97
+ });
98
+ // ── Token refresh / retry on 401 ─────────────────────────────
99
+ describe("401 retry logic", () => {
100
+ it("refreshes token on 401 and retries", async () => {
101
+ const client = await createClient();
102
+ // Initial auth
103
+ fetchMock.mockResolvedValueOnce(jsonResponse({ access_token: "tok1" }));
104
+ // API returns 401
105
+ fetchMock.mockResolvedValueOnce(textResponse("Unauthorized", 401));
106
+ // Refresh succeeds
107
+ fetchMock.mockResolvedValueOnce(jsonResponse({ access_token: "tok2" }));
108
+ // Retry succeeds
109
+ fetchMock.mockResolvedValueOnce(jsonResponse({ up: true }));
110
+ const result = await client.getHomebridgeStatus();
111
+ expect(result).toEqual({ up: true });
112
+ expect(fetchMock).toHaveBeenCalledTimes(4);
113
+ // Third call should be refresh
114
+ expect(fetchMock.mock.calls[2][0]).toBe("http://localhost:8581/api/auth/refresh");
115
+ });
116
+ it("re-authenticates when refresh fails", async () => {
117
+ const client = await createClient();
118
+ // Initial auth
119
+ fetchMock.mockResolvedValueOnce(jsonResponse({ access_token: "tok1" }));
120
+ // API returns 401
121
+ fetchMock.mockResolvedValueOnce(textResponse("Unauthorized", 401));
122
+ // Refresh fails
123
+ fetchMock.mockResolvedValueOnce(textResponse("Forbidden", 403));
124
+ // Re-authenticate
125
+ fetchMock.mockResolvedValueOnce(jsonResponse({ access_token: "tok3" }));
126
+ // Retry succeeds
127
+ fetchMock.mockResolvedValueOnce(jsonResponse({ up: true }));
128
+ const result = await client.getHomebridgeStatus();
129
+ expect(result).toEqual({ up: true });
130
+ });
131
+ });
132
+ // ── API methods ───────────────────────────────────────────────
133
+ describe("API methods", () => {
134
+ async function clientWithAuth() {
135
+ const client = await createClient();
136
+ // Pre-authenticate
137
+ fetchMock.mockResolvedValueOnce(jsonResponse({ access_token: "tok" }));
138
+ return client;
139
+ }
140
+ it("getAccessories → GET /api/accessories", async () => {
141
+ const client = await clientWithAuth();
142
+ fetchMock.mockResolvedValueOnce(jsonResponse([{ uniqueId: "a1" }]));
143
+ const result = await client.getAccessories();
144
+ expect(result).toEqual([{ uniqueId: "a1" }]);
145
+ expect(fetchMock.mock.calls[1][0]).toBe("http://localhost:8581/api/accessories");
146
+ });
147
+ it("getAccessoryLayout → GET /api/accessories/layout", async () => {
148
+ const client = await clientWithAuth();
149
+ fetchMock.mockResolvedValueOnce(jsonResponse([{ name: "Living Room" }]));
150
+ const result = await client.getAccessoryLayout();
151
+ expect(result).toEqual([{ name: "Living Room" }]);
152
+ });
153
+ it("setAccessoryCharacteristic → PUT /api/accessories/:id", async () => {
154
+ const client = await clientWithAuth();
155
+ fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
156
+ await client.setAccessoryCharacteristic("acc1", "On", true);
157
+ const [url, opts] = fetchMock.mock.calls[1];
158
+ expect(url).toBe("http://localhost:8581/api/accessories/acc1");
159
+ expect(opts?.method).toBe("PUT");
160
+ expect(JSON.parse(opts?.body)).toEqual({ characteristicType: "On", value: true });
161
+ });
162
+ it("getConfig → GET /api/config-editor", async () => {
163
+ const client = await clientWithAuth();
164
+ fetchMock.mockResolvedValueOnce(jsonResponse({ bridge: {} }));
165
+ const result = await client.getConfig();
166
+ expect(result).toEqual({ bridge: {} });
167
+ });
168
+ it("updateConfig → POST /api/config-editor", async () => {
169
+ const client = await clientWithAuth();
170
+ fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
171
+ await client.updateConfig({ bridge: { name: "Test" } });
172
+ const [, opts] = fetchMock.mock.calls[1];
173
+ expect(opts?.method).toBe("POST");
174
+ });
175
+ it("getPlugins → GET /api/plugins", async () => {
176
+ const client = await clientWithAuth();
177
+ fetchMock.mockResolvedValueOnce(jsonResponse([{ name: "homebridge-hue" }]));
178
+ const result = await client.getPlugins();
179
+ expect(result).toEqual([{ name: "homebridge-hue" }]);
180
+ });
181
+ it("searchPlugins → GET /api/plugins/search/:query", async () => {
182
+ const client = await clientWithAuth();
183
+ fetchMock.mockResolvedValueOnce(jsonResponse([]));
184
+ await client.searchPlugins("camera");
185
+ expect(fetchMock.mock.calls[1][0]).toBe("http://localhost:8581/api/plugins/search/camera");
186
+ });
187
+ it("lookupPlugin → GET /api/plugins/lookup/:name", async () => {
188
+ const client = await clientWithAuth();
189
+ fetchMock.mockResolvedValueOnce(jsonResponse({ name: "homebridge-hue" }));
190
+ await client.lookupPlugin("homebridge-hue");
191
+ expect(fetchMock.mock.calls[1][0]).toBe("http://localhost:8581/api/plugins/lookup/homebridge-hue");
192
+ });
193
+ it("getPluginVersions → GET /api/plugins/lookup/:name/versions", async () => {
194
+ const client = await clientWithAuth();
195
+ fetchMock.mockResolvedValueOnce(jsonResponse({ tags: {} }));
196
+ await client.getPluginVersions("homebridge-hue");
197
+ expect(fetchMock.mock.calls[1][0]).toContain("/versions");
198
+ });
199
+ it("getPluginConfigSchema → GET /api/plugins/config-schema/:name", async () => {
200
+ const client = await clientWithAuth();
201
+ fetchMock.mockResolvedValueOnce(jsonResponse({ schema: {} }));
202
+ await client.getPluginConfigSchema("homebridge-hue");
203
+ expect(fetchMock.mock.calls[1][0]).toContain("/config-schema/homebridge-hue");
204
+ });
205
+ it("getPluginChangelog → GET /api/plugins/changelog/:name", async () => {
206
+ const client = await clientWithAuth();
207
+ fetchMock.mockResolvedValueOnce(textResponse("# Changelog"));
208
+ const result = await client.getPluginChangelog("homebridge-hue");
209
+ expect(result).toBe("# Changelog");
210
+ });
211
+ it("restartServer → PUT /api/server/restart", async () => {
212
+ const client = await clientWithAuth();
213
+ fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
214
+ await client.restartServer();
215
+ expect(fetchMock.mock.calls[1][1]?.method).toBe("PUT");
216
+ });
217
+ it("getPairingInfo → GET /api/server/pairing", async () => {
218
+ const client = await clientWithAuth();
219
+ fetchMock.mockResolvedValueOnce(jsonResponse({ setupCode: "123-45-678" }));
220
+ const result = await client.getPairingInfo();
221
+ expect(result).toEqual({ setupCode: "123-45-678" });
222
+ });
223
+ it("getCachedAccessories → GET /api/server/cached-accessories", async () => {
224
+ const client = await clientWithAuth();
225
+ fetchMock.mockResolvedValueOnce(jsonResponse([]));
226
+ const result = await client.getCachedAccessories();
227
+ expect(result).toEqual([]);
228
+ });
229
+ it("removeCachedAccessory → DELETE /api/server/cached-accessories/:uuid", async () => {
230
+ const client = await clientWithAuth();
231
+ fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
232
+ await client.removeCachedAccessory("uuid-123");
233
+ const [url, opts] = fetchMock.mock.calls[1];
234
+ expect(url).toContain("/cached-accessories/uuid-123");
235
+ expect(opts?.method).toBe("DELETE");
236
+ });
237
+ it("resetCachedAccessories → PUT /api/server/reset-cached-accessories", async () => {
238
+ const client = await clientWithAuth();
239
+ fetchMock.mockResolvedValueOnce(jsonResponse({ ok: true }));
240
+ await client.resetCachedAccessories();
241
+ expect(fetchMock.mock.calls[1][0]).toContain("/reset-cached-accessories");
242
+ });
243
+ it("getSystemInfo → GET /api/platform-tools/system-information", async () => {
244
+ const client = await clientWithAuth();
245
+ fetchMock.mockResolvedValueOnce(jsonResponse({ cpu: {} }));
246
+ const result = await client.getSystemInfo();
247
+ expect(result).toEqual({ cpu: {} });
248
+ });
249
+ it("throws on non-ok API response", async () => {
250
+ const client = await clientWithAuth();
251
+ fetchMock.mockResolvedValueOnce(textResponse("Not Found", 404));
252
+ await expect(client.getAccessories()).rejects.toThrow("Homebridge API error 404");
253
+ });
254
+ it("URL-encodes special characters in path params", async () => {
255
+ const client = await clientWithAuth();
256
+ fetchMock.mockResolvedValueOnce(jsonResponse({}));
257
+ await client.lookupPlugin("@scope/plugin");
258
+ expect(fetchMock.mock.calls[1][0]).toBe("http://localhost:8581/api/plugins/lookup/%40scope%2Fplugin");
259
+ });
260
+ });
261
+ });
262
+ //# sourceMappingURL=homebridge-client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"homebridge-client.test.js","sourceRoot":"","sources":["../../src/__tests__/homebridge-client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=accessories.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessories.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/accessories.test.ts"],"names":[],"mappings":""}