@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/tools/config.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAiD1E"}
@@ -0,0 +1,43 @@
1
+ import { z } from "zod";
2
+ export function register(server, client) {
3
+ server.tool("get_config", "Read the current Homebridge config.json file content. Returns the full configuration including bridge settings, accessories, and platforms.", {}, async () => {
4
+ try {
5
+ const config = await client.getConfig();
6
+ return {
7
+ content: [{ type: "text", text: JSON.stringify(config, null, 2) }],
8
+ };
9
+ }
10
+ catch (error) {
11
+ return {
12
+ content: [{ type: "text", text: `Error getting config: ${error}` }],
13
+ isError: true,
14
+ };
15
+ }
16
+ });
17
+ server.tool("update_config", "Update the Homebridge config.json file. You must provide the FULL config object — it replaces the entire file. Use get_config first to read the current config, then modify and pass back the complete object.", {
18
+ config: z
19
+ .record(z.string(), z.unknown())
20
+ .describe("The complete config.json object to write"),
21
+ }, async ({ config }) => {
22
+ try {
23
+ const result = await client.updateConfig(config);
24
+ return {
25
+ content: [
26
+ {
27
+ type: "text",
28
+ text: result
29
+ ? JSON.stringify(result, null, 2)
30
+ : "Config updated successfully. A Homebridge restart may be required for changes to take effect.",
31
+ },
32
+ ],
33
+ };
34
+ }
35
+ catch (error) {
36
+ return {
37
+ content: [{ type: "text", text: `Error updating config: ${error}` }],
38
+ isError: true,
39
+ };
40
+ }
41
+ });
42
+ }
43
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/tools/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,QAAQ,CAAC,MAAiB,EAAE,MAAwB;IAClE,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,6IAA6I,EAC7I,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;YACxC,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,KAAK,EAAE,EAAE,CAAC;gBACnE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,eAAe,EACf,gNAAgN,EAChN;QACE,MAAM,EAAE,CAAC;aACN,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;aAC/B,QAAQ,CAAC,0CAA0C,CAAC;KACxD,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE;QACnB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACjD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,MAAM;4BACV,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;4BACjC,CAAC,CAAC,+FAA+F;qBACpG;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,0BAA0B,KAAK,EAAE,EAAE,CAAC;gBACpE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { HomebridgeClient } from "../homebridge-client.js";
3
+ export declare function register(server: McpServer, client: HomebridgeClient): void;
4
+ //# sourceMappingURL=plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/tools/plugins.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAyI1E"}
@@ -0,0 +1,111 @@
1
+ import { z } from "zod";
2
+ export function register(server, client) {
3
+ server.tool("list_plugins", "List all currently installed Homebridge plugins with their versions and update status.", {}, async () => {
4
+ try {
5
+ const plugins = await client.getPlugins();
6
+ return {
7
+ content: [{ type: "text", text: JSON.stringify(plugins, null, 2) }],
8
+ };
9
+ }
10
+ catch (error) {
11
+ return {
12
+ content: [{ type: "text", text: `Error listing plugins: ${error}` }],
13
+ isError: true,
14
+ };
15
+ }
16
+ });
17
+ server.tool("search_plugins", "Search the npm registry for Homebridge plugins matching a query.", {
18
+ query: z.string().describe("Search query (e.g. 'hue', 'camera', 'thermostat')"),
19
+ }, async ({ query }) => {
20
+ try {
21
+ const results = await client.searchPlugins(query);
22
+ return {
23
+ content: [{ type: "text", text: JSON.stringify(results, null, 2) }],
24
+ };
25
+ }
26
+ catch (error) {
27
+ return {
28
+ content: [{ type: "text", text: `Error searching plugins: ${error}` }],
29
+ isError: true,
30
+ };
31
+ }
32
+ });
33
+ server.tool("lookup_plugin", "Get detailed information about a specific Homebridge plugin from the npm registry.", {
34
+ pluginName: z
35
+ .string()
36
+ .describe("The npm package name of the plugin (e.g. 'homebridge-hue')"),
37
+ }, async ({ pluginName }) => {
38
+ try {
39
+ const plugin = await client.lookupPlugin(pluginName);
40
+ return {
41
+ content: [{ type: "text", text: JSON.stringify(plugin, null, 2) }],
42
+ };
43
+ }
44
+ catch (error) {
45
+ return {
46
+ content: [{ type: "text", text: `Error looking up plugin: ${error}` }],
47
+ isError: true,
48
+ };
49
+ }
50
+ });
51
+ server.tool("get_plugin_versions", "Get available versions and dist-tags for a specific Homebridge plugin.", {
52
+ pluginName: z
53
+ .string()
54
+ .describe("The npm package name of the plugin (e.g. 'homebridge-hue')"),
55
+ }, async ({ pluginName }) => {
56
+ try {
57
+ const versions = await client.getPluginVersions(pluginName);
58
+ return {
59
+ content: [{ type: "text", text: JSON.stringify(versions, null, 2) }],
60
+ };
61
+ }
62
+ catch (error) {
63
+ return {
64
+ content: [{ type: "text", text: `Error getting plugin versions: ${error}` }],
65
+ isError: true,
66
+ };
67
+ }
68
+ });
69
+ server.tool("get_plugin_config_schema", "Get the config.schema.json for a plugin, which describes how to configure it in Homebridge.", {
70
+ pluginName: z
71
+ .string()
72
+ .describe("The npm package name of the plugin (e.g. 'homebridge-hue')"),
73
+ }, async ({ pluginName }) => {
74
+ try {
75
+ const schema = await client.getPluginConfigSchema(pluginName);
76
+ return {
77
+ content: [{ type: "text", text: JSON.stringify(schema, null, 2) }],
78
+ };
79
+ }
80
+ catch (error) {
81
+ return {
82
+ content: [{ type: "text", text: `Error getting plugin config schema: ${error}` }],
83
+ isError: true,
84
+ };
85
+ }
86
+ });
87
+ server.tool("get_plugin_changelog", "Get the CHANGELOG.md content for an installed Homebridge plugin.", {
88
+ pluginName: z
89
+ .string()
90
+ .describe("The npm package name of the plugin (e.g. 'homebridge-hue')"),
91
+ }, async ({ pluginName }) => {
92
+ try {
93
+ const changelog = await client.getPluginChangelog(pluginName);
94
+ return {
95
+ content: [
96
+ {
97
+ type: "text",
98
+ text: typeof changelog === "string" ? changelog : JSON.stringify(changelog, null, 2),
99
+ },
100
+ ],
101
+ };
102
+ }
103
+ catch (error) {
104
+ return {
105
+ content: [{ type: "text", text: `Error getting plugin changelog: ${error}` }],
106
+ isError: true,
107
+ };
108
+ }
109
+ });
110
+ }
111
+ //# sourceMappingURL=plugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/tools/plugins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { HomebridgeClient } from "../homebridge-client.js";
3
+ export declare function register(server: McpServer, client: HomebridgeClient): void;
4
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/tools/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAmJ1E"}
@@ -0,0 +1,116 @@
1
+ import { z } from "zod";
2
+ export function register(server, client) {
3
+ server.tool("get_homebridge_status", "Check if Homebridge is running and get its current status (up/down, version, plugins status).", {}, async () => {
4
+ try {
5
+ const status = await client.getHomebridgeStatus();
6
+ return {
7
+ content: [{ type: "text", text: JSON.stringify(status, null, 2) }],
8
+ };
9
+ }
10
+ catch (error) {
11
+ return {
12
+ content: [{ type: "text", text: `Error getting Homebridge status: ${error}` }],
13
+ isError: true,
14
+ };
15
+ }
16
+ });
17
+ server.tool("get_server_status", "Get Homebridge server information including version, Node.js version, uptime, OS details, and Homebridge instance ID.", {}, async () => {
18
+ try {
19
+ const info = await client.getServerInformation();
20
+ return {
21
+ content: [{ type: "text", text: JSON.stringify(info, null, 2) }],
22
+ };
23
+ }
24
+ catch (error) {
25
+ return {
26
+ content: [{ type: "text", text: `Error getting server info: ${error}` }],
27
+ isError: true,
28
+ };
29
+ }
30
+ });
31
+ server.tool("restart_homebridge", "Restart the Homebridge service. This will temporarily make all accessories unavailable.", {}, async () => {
32
+ try {
33
+ const result = await client.restartServer();
34
+ return {
35
+ content: [
36
+ {
37
+ type: "text",
38
+ text: result
39
+ ? JSON.stringify(result, null, 2)
40
+ : "Homebridge restart initiated successfully.",
41
+ },
42
+ ],
43
+ };
44
+ }
45
+ catch (error) {
46
+ return {
47
+ content: [{ type: "text", text: `Error restarting Homebridge: ${error}` }],
48
+ isError: true,
49
+ };
50
+ }
51
+ });
52
+ server.tool("get_pairing_info", "Get the HomeKit pairing information (setup code, QR code URL) for this Homebridge instance.", {}, async () => {
53
+ try {
54
+ const pairing = await client.getPairingInfo();
55
+ return {
56
+ content: [{ type: "text", text: JSON.stringify(pairing, null, 2) }],
57
+ };
58
+ }
59
+ catch (error) {
60
+ return {
61
+ content: [{ type: "text", text: `Error getting pairing info: ${error}` }],
62
+ isError: true,
63
+ };
64
+ }
65
+ });
66
+ server.tool("get_cached_accessories", "List all cached accessories stored by Homebridge. These persist across restarts.", {}, async () => {
67
+ try {
68
+ const cached = await client.getCachedAccessories();
69
+ return {
70
+ content: [{ type: "text", text: JSON.stringify(cached, null, 2) }],
71
+ };
72
+ }
73
+ catch (error) {
74
+ return {
75
+ content: [{ type: "text", text: `Error getting cached accessories: ${error}` }],
76
+ isError: true,
77
+ };
78
+ }
79
+ });
80
+ server.tool("remove_cached_accessory", "Remove a specific cached accessory by its UUID. Useful for cleaning up stale accessories.", {
81
+ uuid: z.string().describe("The UUID of the cached accessory to remove"),
82
+ }, async ({ uuid }) => {
83
+ try {
84
+ await client.removeCachedAccessory(uuid);
85
+ return {
86
+ content: [{ type: "text", text: `Cached accessory ${uuid} removed successfully.` }],
87
+ };
88
+ }
89
+ catch (error) {
90
+ return {
91
+ content: [{ type: "text", text: `Error removing cached accessory: ${error}` }],
92
+ isError: true,
93
+ };
94
+ }
95
+ });
96
+ server.tool("reset_cached_accessories", "Reset ALL cached accessories. WARNING: This removes all cached accessories and requires a Homebridge restart.", {}, async () => {
97
+ try {
98
+ await client.resetCachedAccessories();
99
+ return {
100
+ content: [
101
+ {
102
+ type: "text",
103
+ text: "All cached accessories have been reset. A Homebridge restart may be required.",
104
+ },
105
+ ],
106
+ };
107
+ }
108
+ catch (error) {
109
+ return {
110
+ content: [{ type: "text", text: `Error resetting cached accessories: ${error}` }],
111
+ isError: true,
112
+ };
113
+ }
114
+ });
115
+ }
116
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/tools/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { HomebridgeClient } from "../homebridge-client.js";
3
+ export declare function register(server: McpServer, client: HomebridgeClient): void;
4
+ //# sourceMappingURL=system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../src/tools/system.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAmB1E"}
@@ -0,0 +1,17 @@
1
+ export function register(server, client) {
2
+ server.tool("get_system_info", "Get system information for the machine running Homebridge (CPU, memory, OS, network interfaces, uptime).", {}, async () => {
3
+ try {
4
+ const info = await client.getSystemInfo();
5
+ return {
6
+ content: [{ type: "text", text: JSON.stringify(info, null, 2) }],
7
+ };
8
+ }
9
+ catch (error) {
10
+ return {
11
+ content: [{ type: "text", text: `Error getting system info: ${error}` }],
12
+ isError: true,
13
+ };
14
+ }
15
+ });
16
+ }
17
+ //# sourceMappingURL=system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system.js","sourceRoot":"","sources":["../../src/tools/system.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,QAAQ,CAAC,MAAiB,EAAE,MAAwB;IAClE,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,0GAA0G,EAC1G,EAAE,EACF,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,EAAE,CAAC;YAC1C,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACjE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,KAAK,EAAE,EAAE,CAAC;gBACxE,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { HomebridgeClient } from "./homebridge-client.js";
3
+ /**
4
+ * Signature for tool registration functions.
5
+ * Each tools/*.ts file exports a `register` function matching this type.
6
+ */
7
+ export type RegisterTools = (server: McpServer, client: HomebridgeClient) => void;
8
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@mp-consulting/homebridge-mcp-server",
3
+ "version": "1.0.0",
4
+ "description": "MCP (Model Context Protocol) server for Homebridge — control smart home accessories, manage plugins, and monitor your Homebridge server from AI assistants.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "homebridge-mcp-server": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/index.ts",
13
+ "test": "vitest run",
14
+ "test:watch": "vitest",
15
+ "prepublishOnly": "npm run build"
16
+ },
17
+ "keywords": [
18
+ "mcp",
19
+ "model-context-protocol",
20
+ "homebridge",
21
+ "homekit",
22
+ "smart-home",
23
+ "ai",
24
+ "claude",
25
+ "anthropic"
26
+ ],
27
+ "author": "MP Consulting",
28
+ "license": "MIT",
29
+ "files": [
30
+ "dist"
31
+ ],
32
+ "dependencies": {
33
+ "@modelcontextprotocol/sdk": "^1.12.1",
34
+ "zod": "^3.24.2"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^22.13.5",
38
+ "tsx": "^4.19.3",
39
+ "typescript": "^5.7.3",
40
+ "vitest": "^4.0.18"
41
+ },
42
+ "engines": {
43
+ "node": ">=18.0.0"
44
+ }
45
+ }