@striderlabs/mcp-ring 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.
- package/README.md +0 -0
- package/dist/index.js +33 -0
- package/package.json +19 -0
- package/src/index.ts +34 -0
- package/tsconfig.json +1 -0
package/README.md
ADDED
|
File without changes
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
#!/usr/bin/env node
|
|
3
|
+
|
|
4
|
+
// src/index.ts
|
|
5
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
6
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
7
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
+
var server = new Server(
|
|
9
|
+
{ name: "striderlabs-mcp-ring", version: "1.0.0" },
|
|
10
|
+
{ capabilities: { tools: {} } }
|
|
11
|
+
);
|
|
12
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
13
|
+
tools: [
|
|
14
|
+
{ name: "ring_status", description: "Check Ring login status for the current session", inputSchema: { type: "object", properties: {} } },
|
|
15
|
+
{ name: "ring_login", description: "Open Ring login page. User must complete login manually (including 2FA). Call ring_confirm_login after.", inputSchema: { type: "object", properties: {} } },
|
|
16
|
+
{ name: "ring_confirm_login", description: "Confirm and save Ring session after manual login", inputSchema: { type: "object", properties: {} } },
|
|
17
|
+
{ name: "ring_logout", description: "Clear Ring session and log out", inputSchema: { type: "object", properties: {} } },
|
|
18
|
+
{ name: "ring_get_devices", description: "Get all Ring devices (doorbells, cameras, alarm)", inputSchema: { type: "object", properties: {} } },
|
|
19
|
+
{ name: "ring_get_doorbell_history", description: "Get recent doorbell events (motion, rings)", inputSchema: { type: "object", required: ["device_id"], properties: { device_id: { type: "string" }, limit: { type: "number", default: 20 } } } },
|
|
20
|
+
{ name: "ring_get_camera_snapshot", description: "Get current snapshot from a Ring camera", inputSchema: { type: "object", required: ["device_id"], properties: { device_id: { type: "string" } } } },
|
|
21
|
+
{ name: "ring_arm_alarm", description: "Arm Ring Alarm system (home or away mode)", inputSchema: { type: "object", required: ["location_id", "mode", "confirm"], properties: { location_id: { type: "string" }, mode: { type: "string", enum: ["home", "away"] }, confirm: { type: "boolean" } } } },
|
|
22
|
+
{ name: "ring_disarm_alarm", description: "Disarm Ring Alarm system. Requires confirm=true.", inputSchema: { type: "object", required: ["location_id", "confirm"], properties: { location_id: { type: "string" }, confirm: { type: "boolean" } } } },
|
|
23
|
+
{ name: "ring_get_alarm_status", description: "Get current Ring Alarm status for a location", inputSchema: { type: "object", required: ["location_id"], properties: { location_id: { type: "string" } } } },
|
|
24
|
+
{ name: "ring_toggle_light", description: "Turn Ring floodlight/spotlight on or off", inputSchema: { type: "object", required: ["device_id", "state"], properties: { device_id: { type: "string" }, state: { type: "string", enum: ["on", "off"] } } } },
|
|
25
|
+
{ name: "ring_get_recordings", description: "Get Ring video recordings (requires Ring Protect)", inputSchema: { type: "object", required: ["device_id"], properties: { device_id: { type: "string" }, limit: { type: "number", default: 10 }, start_date: { type: "string" }, end_date: { type: "string" } } } }
|
|
26
|
+
]
|
|
27
|
+
}));
|
|
28
|
+
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
29
|
+
const { name, arguments: args = {} } = req.params;
|
|
30
|
+
return { content: [{ type: "text", text: JSON.stringify({ success: false, error: `${name}: Not implemented. Ring API integration pending.` }) }] };
|
|
31
|
+
});
|
|
32
|
+
var transport = new StdioServerTransport();
|
|
33
|
+
await server.connect(transport);
|
package/package.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@striderlabs/mcp-ring",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for Ring — let AI agents manage Ring doorbells, cameras, alarm, and smart home devices",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"bin": { "striderlabs-mcp-ring": "dist/index.js" },
|
|
7
|
+
"type": "module",
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "esbuild src/index.ts --bundle --platform=node --format=esm --packages=external --outfile=dist/index.js --banner:js='#!/usr/bin/env node'",
|
|
10
|
+
"start": "node dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"keywords": ["mcp", "ring", "doorbell", "camera", "security", "smart-home", "ai-agent", "strider"],
|
|
13
|
+
"author": "Strider Labs <hello@striderlabs.ai>",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"homepage": "https://striderlabs.ai",
|
|
16
|
+
"dependencies": { "@modelcontextprotocol/sdk": "^1.0.0", "patchright": "^1.58.2" },
|
|
17
|
+
"devDependencies": { "@types/node": "^20.11.0", "esbuild": "^0.20.0", "typescript": "^5.3.3" },
|
|
18
|
+
"mcpName": "io.striderlabs/ring"
|
|
19
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
|
|
6
|
+
const server = new Server(
|
|
7
|
+
{ name: "striderlabs-mcp-ring", version: "1.0.0" },
|
|
8
|
+
{ capabilities: { tools: {} } }
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
12
|
+
tools: [
|
|
13
|
+
{ name: "ring_status", description: "Check Ring login status for the current session", inputSchema: { type: "object", properties: {} } },
|
|
14
|
+
{ name: "ring_login", description: "Open Ring login page. User must complete login manually (including 2FA). Call ring_confirm_login after.", inputSchema: { type: "object", properties: {} } },
|
|
15
|
+
{ name: "ring_confirm_login", description: "Confirm and save Ring session after manual login", inputSchema: { type: "object", properties: {} } },
|
|
16
|
+
{ name: "ring_logout", description: "Clear Ring session and log out", inputSchema: { type: "object", properties: {} } },
|
|
17
|
+
{ name: "ring_get_devices", description: "Get all Ring devices (doorbells, cameras, alarm)", inputSchema: { type: "object", properties: {} } },
|
|
18
|
+
{ name: "ring_get_doorbell_history", description: "Get recent doorbell events (motion, rings)", inputSchema: { type: "object", required: ["device_id"], properties: { device_id: { type: "string" }, limit: { type: "number", default: 20 } } } },
|
|
19
|
+
{ name: "ring_get_camera_snapshot", description: "Get current snapshot from a Ring camera", inputSchema: { type: "object", required: ["device_id"], properties: { device_id: { type: "string" } } } },
|
|
20
|
+
{ name: "ring_arm_alarm", description: "Arm Ring Alarm system (home or away mode)", inputSchema: { type: "object", required: ["location_id", "mode", "confirm"], properties: { location_id: { type: "string" }, mode: { type: "string", enum: ["home", "away"] }, confirm: { type: "boolean" } } } },
|
|
21
|
+
{ name: "ring_disarm_alarm", description: "Disarm Ring Alarm system. Requires confirm=true.", inputSchema: { type: "object", required: ["location_id", "confirm"], properties: { location_id: { type: "string" }, confirm: { type: "boolean" } } } },
|
|
22
|
+
{ name: "ring_get_alarm_status", description: "Get current Ring Alarm status for a location", inputSchema: { type: "object", required: ["location_id"], properties: { location_id: { type: "string" } } } },
|
|
23
|
+
{ name: "ring_toggle_light", description: "Turn Ring floodlight/spotlight on or off", inputSchema: { type: "object", required: ["device_id", "state"], properties: { device_id: { type: "string" }, state: { type: "string", enum: ["on", "off"] } } } },
|
|
24
|
+
{ name: "ring_get_recordings", description: "Get Ring video recordings (requires Ring Protect)", inputSchema: { type: "object", required: ["device_id"], properties: { device_id: { type: "string" }, limit: { type: "number", default: 10 }, start_date: { type: "string" }, end_date: { type: "string" } } } },
|
|
25
|
+
],
|
|
26
|
+
}));
|
|
27
|
+
|
|
28
|
+
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
29
|
+
const { name, arguments: args = {} } = req.params;
|
|
30
|
+
return { content: [{ type: "text", text: JSON.stringify({ success: false, error: `${name}: Not implemented. Ring API integration pending.` }) }] };
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const transport = new StdioServerTransport();
|
|
34
|
+
await server.connect(transport);
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "compilerOptions": { "target": "ES2022", "module": "ESNext", "moduleResolution": "bundler", "esModuleInterop": true, "strict": true, "skipLibCheck": true, "outDir": "./dist", "rootDir": "./src" }, "include": ["src/**/*"] }
|