{"_id":"@demi-ai/mcp-server","_rev":"3-37ac9817c99bd543bc316f5efa06b53d","name":"@demi-ai/mcp-server","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@demi-ai/mcp-server","version":"0.1.0","keywords":["mcp","model-context-protocol","demi","ai-agent","watch"],"author":{"name":"Demi"},"license":"PROPRIETARY","_id":"@demi-ai/mcp-server@0.1.0","maintainers":[{"name":"demi.ai","email":"demi.watch.app@gmail.com"}],"homepage":"https://github.com/hunterh37/Demi#readme","bugs":{"url":"https://github.com/hunterh37/Demi/issues"},"bin":{"demi-mcp-server":"dist/cli.js"},"dist":{"shasum":"653a0407447b7c540a0a2fb9a13b421d22171798","tarball":"https://registry.npmjs.org/@demi-ai/mcp-server/-/mcp-server-0.1.0.tgz","fileCount":43,"integrity":"sha512-SlPGSW9Gk4EEJVgsWcB4D8DpHmJitj18HbSdqc6xF86ENoIe+QELa9rgVZF1rQ6XAYUWNwvZRSxo/Ou9qYr8mw==","signatures":[{"sig":"MEUCIDUO1jxrsimaukxyA/ZWx6y6urCg3pSH9CLgcU7Zwa73AiEAsDhGYUAZ5+daeq/cTTVO4eP7KFEn5fn61wf0bopWCRg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80069},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"81932038f99332b3bc5d7af2f1b43bb09ff8229f","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:verbose":"jest --verbose","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"demi.ai","email":"demi.watch.app@gmail.com"},"repository":{"url":"git+https://github.com/hunterh37/Demi.git","type":"git","directory":"packages/mcp-server"},"_npmVersion":"11.5.1","description":"MCP server for Demi - allows AI agents to interact with users via Watch","directories":{},"_nodeVersion":"24.5.0","dependencies":{"ws":"^8.18.0","zod":"^3.23.8","uuid":"^9.0.1","@modelcontextprotocol/sdk":"^1.0.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ws":"^8.5.10","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.11.0","@types/uuid":"^9.0.7","@typescript-eslint/parser":"^6.19.0","@typescript-eslint/eslint-plugin":"^6.19.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.1.0_1768837553090_0.07275312283803514","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@demi-ai/mcp-server","version":"0.1.1","keywords":["mcp","model-context-protocol","demi","ai-agent","watch"],"author":{"name":"Demi"},"license":"PROPRIETARY","_id":"@demi-ai/mcp-server@0.1.1","maintainers":[{"name":"demi.ai","email":"demi.watch.app@gmail.com"}],"homepage":"https://demi.watch","bugs":{"url":"https://demi.watch/support"},"bin":{"demi-mcp-server":"dist/cli.js"},"dist":{"shasum":"87cc9363229020faa2e65a2a966bfb2bbdd2d33e","tarball":"https://registry.npmjs.org/@demi-ai/mcp-server/-/mcp-server-0.1.1.tgz","fileCount":43,"integrity":"sha512-Bx9hUnRw49ZJb3RPItYVnPzOqDfjVt+V48jz7AZZCEkawFSLIobECFBBJDWpyXdYkTmqkLgnuLnXwmPKN9DGQA==","signatures":[{"sig":"MEUCIQDdbkDQqxzn3ObV8Ktysel+Y2voJ+mghrC2sNameRhI2gIgA+NrBA6V60VaDADBayLgbXsYR9Jp7IazvmpJOowRWGs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":80004},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"c46d9448ed84715feb097840687771fbe639883e","scripts":{"dev":"tsc --watch","lint":"eslint src --ext .ts","test":"jest","build":"tsc","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit","test:watch":"jest --watch","test:verbose":"jest --verbose","test:coverage":"jest --coverage","prepublishOnly":"npm run build"},"_npmUser":{"name":"demi.ai","email":"demi.watch.app@gmail.com"},"_npmVersion":"11.5.1","description":"MCP server for Demi - allows AI agents to interact with users via Watch","directories":{},"_nodeVersion":"24.5.0","dependencies":{"ws":"^8.18.0","zod":"^3.23.8","uuid":"^9.0.1","@modelcontextprotocol/sdk":"^1.0.4"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","@types/ws":"^8.5.10","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.11.0","@types/uuid":"^9.0.7","@typescript-eslint/parser":"^6.19.0","@typescript-eslint/eslint-plugin":"^6.19.0"},"_npmOperationalInternal":{"tmp":"tmp/mcp-server_0.1.1_1768837872000_0.7107334470675735","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@demi-ai/mcp-server","version":"0.1.2","description":"MCP server for Demi - allows AI agents to interact with users via Watch","main":"dist/index.js","types":"dist/index.d.ts","bin":{"demi-mcp-server":"dist/cli.js"},"scripts":{"build":"tsc","dev":"tsc --watch","prepublishOnly":"npm run build","test":"jest","test:watch":"jest --watch","test:coverage":"jest --coverage","test:verbose":"jest --verbose","lint":"eslint src --ext .ts","lint:fix":"eslint src --ext .ts --fix","typecheck":"tsc --noEmit"},"keywords":["mcp","model-context-protocol","demi","ai-agent","watch"],"author":{"name":"Demi"},"license":"PROPRIETARY","homepage":"https://demi.watch","bugs":{"url":"https://demi.watch/support"},"engines":{"node":">=18.0.0"},"dependencies":{"@modelcontextprotocol/sdk":"^1.0.4","uuid":"^9.0.1","ws":"^8.18.0","zod":"^3.23.8"},"devDependencies":{"@types/jest":"^29.5.11","@types/node":"^20.11.0","@types/uuid":"^9.0.7","@types/ws":"^8.5.10","@typescript-eslint/eslint-plugin":"^6.19.0","@typescript-eslint/parser":"^6.19.0","eslint":"^8.56.0","jest":"^29.7.0","ts-jest":"^29.1.2","ts-node":"^10.9.2","typescript":"^5.3.3"},"_id":"@demi-ai/mcp-server@0.1.2","gitHead":"10d1b7d83f0bdb56ab04487c000b6b4476edaa2f","_nodeVersion":"24.5.0","_npmVersion":"11.5.1","dist":{"integrity":"sha512-oz45rbftaULcTM/rf5dgcwRzEr50S/TT8D2C0JsZBvr2XLLiE+XfoIzR3ZwM/i2D1eBntY113YLaHthSto7Tyg==","shasum":"aa73bb3cdc8ad6c197ee75a894e4ae097a6b79f4","tarball":"https://registry.npmjs.org/@demi-ai/mcp-server/-/mcp-server-0.1.2.tgz","fileCount":51,"unpackedSize":108632,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCunypzgPTSwHmieAMEV01zPZUJCd07s3iNqb4WqsZgsQIhAPU2ZYk3+gbpq3KEOKE/F00snFYwafaE9wO7/5FE0hPw"}]},"_npmUser":{"name":"demi.ai","email":"demi.watch.app@gmail.com"},"directories":{},"maintainers":[{"name":"demi.ai","email":"demi.watch.app@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-server_0.1.2_1769193083920_0.1953241207948988"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-19T15:45:52.992Z","modified":"2026-01-23T18:31:24.228Z","0.1.0":"2026-01-19T15:45:53.222Z","0.1.1":"2026-01-19T15:51:12.161Z","0.1.2":"2026-01-23T18:31:24.099Z"},"bugs":{"url":"https://demi.watch/support"},"author":{"name":"Demi"},"license":"PROPRIETARY","homepage":"https://demi.watch","keywords":["mcp","model-context-protocol","demi","ai-agent","watch"],"description":"MCP server for Demi - allows AI agents to interact with users via Watch","maintainers":[{"name":"demi.ai","email":"demi.watch.app@gmail.com"}],"readme":"# @demi-ai/mcp-server\n\n**MCP server for Demi** - Enables AI agents (Claude Code, Claude Desktop, etc.) to interact with users through their Apple Watch.\n\n## Overview\n\nThis MCP (Model Context Protocol) server allows external AI agents to:\n- 🚀 Notify users when starting work (with automatic heartbeats)\n- 🎯 Ask users questions and get real-time responses from their Watch\n- ✅ Request approvals for actions\n- 📊 Stream progress updates to the Watch\n- ✨ Display results on the user's wrist\n- 📝 Create tasks in Demi\n- ✔️ Notify users when work is complete\n\n## Setup\n\n### 1. Generate API Key\n\n1. Open Demi iPhone app\n2. Go to Settings → Developer\n3. Tap \"Generate API Key\"\n4. Name it (e.g., \"Claude Code on MacBook\")\n5. Copy the API key (starts with `demi_sk_`)\n\n### 2. Configure Claude Code (Recommended)\n\nAdd to your `~/.claude.json` under the project where you want to use Demi:\n\n```json\n{\n  \"projects\": {\n    \"/path/to/your/project\": {\n      \"mcpServers\": {\n        \"demi\": {\n          \"type\": \"http\",\n          \"url\": \"https://demi-api-t7vv.onrender.com/v1/mcp\",\n          \"headers\": {\n            \"X-API-Key\": \"demi_sk_your_key_here\"\n          }\n        }\n      }\n    }\n  }\n}\n```\n\n**Why `~/.claude.json`?** Project settings in `~/.claude.json` are automatically trusted and enabled, unlike `.mcp.json` which requires approval prompts.\n\n### 3. Configure Claude Desktop\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS):\n\n```json\n{\n  \"mcpServers\": {\n    \"demi\": {\n      \"command\": \"demi-mcp-server\",\n      \"env\": {\n        \"DEMI_API_KEY\": \"your-api-key-here\"\n      }\n    }\n  }\n}\n```\n\n### 4. Verify Connection\n\nRestart Claude Code/Desktop. In Settings → Developer in the Demi iPhone app, you should see your connected agent with a green indicator.\n\n## Available Tools\n\n### `demi_task_started` (Call First!)\n\nNotify the user that you're starting work on their request. **Call this FIRST before doing any work.** This starts automatic heartbeat updates so the user knows you're still working.\n\n**Parameters:**\n- `task_title` (string, required) - Short title of what you're working on (max 200 chars)\n- `task_description` (string, optional) - Brief description of approach (max 500 chars)\n- `estimated_seconds` (number, optional) - Estimated time to complete (1-3600)\n\n**Returns:**\n- `session_id` - Save this to call `demi_task_completed` when done\n\n**Example:**\n```typescript\nconst started = await use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_task_started\",\n  arguments: {\n    task_title: \"Research Philadelphia hotels\",\n    task_description: \"Searching for best options, comparing prices and ratings\",\n    estimated_seconds: 120\n  }\n});\n// Save session_id for later: started.session_id\n// User sees: \"Starting: Research Philadelphia hotels\" on Watch\n// Automatic heartbeats keep user informed you're still working\n```\n\n### `demi_task_completed` (Call Last!)\n\nNotify the user that you've finished working. **Call this when done** to stop heartbeats and show completion.\n\n**Parameters:**\n- `session_id` (string, required) - Session ID from `demi_task_started`\n- `summary` (string, optional) - Brief summary of what was accomplished (max 500 chars)\n- `result` (object, optional) - Structured result data to display\n\n**Example:**\n```typescript\nawait use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_task_completed\",\n  arguments: {\n    session_id: started.session_id,\n    summary: \"Found 5 great hotels, created comparison spreadsheet\",\n    result: {\n      hotels_found: 5,\n      best_option: \"Lokal Hotel\",\n      spreadsheet: \"philadelphia_hotels.xlsx\"\n    }\n  }\n});\n// User sees: \"Completed! Found 5 great hotels...\" on Watch\n```\n\n### `demi_ask_user`\n\nAsk the user a question via their Watch and wait for a response.\n\n**Parameters:**\n- `question` (string, required) - The question to ask (max 500 chars)\n- `options` (string[], optional) - Multiple choice options\n- `timeout_seconds` (number, optional) - Timeout in seconds (default: 300)\n\n**Example:**\n```typescript\nconst result = await use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_ask_user\",\n  arguments: {\n    question: \"Which hotel should I book?\",\n    options: [\"Grand Hotel ($200)\", \"Budget Inn ($80)\"]\n  }\n});\n// User sees notification on Watch → taps choice\n// Returns: { \"answer\": \"Grand Hotel ($200)\", \"question\": \"...\" }\n```\n\n### `demi_request_approval`\n\nRequest approval from the user for a specific action.\n\n**Parameters:**\n- `action` (string, required) - Brief description of action (max 200 chars)\n- `details` (object, optional) - Additional context\n- `timeout_seconds` (number, optional) - Timeout in seconds (default: 300)\n\n**Example:**\n```typescript\nconst result = await use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_request_approval\",\n  arguments: {\n    action: \"Send email to client@example.com\",\n    details: {\n      subject: \"Project Update\",\n      preview: \"Hi team, just wanted to update...\"\n    }\n  }\n});\n// User sees notification → taps Approve/Deny\n// Returns: { \"approved\": true, \"note\": null, \"action\": \"...\" }\n```\n\n### `demi_stream_progress`\n\nSend real-time progress updates to the user's Watch.\n\n**Parameters:**\n- `job_id` (string, required) - Unique job identifier\n- `status` (string, optional) - \"running\" | \"completed\" | \"failed\" (default: \"running\")\n- `current_step` (string, optional) - Current step description (max 500 chars)\n- `progress` (number, optional) - Progress from 0.0 to 1.0\n- `message` (string, optional) - Status message (max 500 chars)\n\n**Example:**\n```typescript\nconst jobId = \"job-123\";\n\n// Start\nawait use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_stream_progress\",\n  arguments: {\n    job_id: jobId,\n    status: \"running\",\n    current_step: \"Analyzing files...\",\n    progress: 0.1,\n    message: \"Found 50 files\"\n  }\n});\n\n// Update\nawait use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_stream_progress\",\n  arguments: {\n    job_id: jobId,\n    progress: 0.5,\n    message: \"Processing file 25/50\"\n  }\n});\n\n// Complete\nawait use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_stream_progress\",\n  arguments: {\n    job_id: jobId,\n    status: \"completed\",\n    progress: 1.0,\n    message: \"Analysis complete\"\n  }\n});\n```\n\n### `demi_show_result`\n\nDisplay final results to the user on their Watch.\n\n**Parameters:**\n- `job_id` (string, required) - Job identifier (same as used in stream_progress)\n- `result` (object, required) - Result data to display\n\n**Example:**\n```typescript\nawait use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_show_result\",\n  arguments: {\n    job_id: \"job-123\",\n    result: {\n      status: \"success\",\n      files_processed: 50,\n      errors: 0,\n      summary: \"All files analyzed successfully\"\n    }\n  }\n});\n```\n\n### `demi_create_task`\n\nCreate a task in the user's Demi workspace.\n\n**Parameters:**\n- `title` (string, required) - Task title (max 255 chars)\n- `description` (string, optional) - Detailed description\n- `due_at` (string, optional) - Due date in ISO 8601 format\n- `priority` (number, optional) - Priority from 1 (lowest) to 5 (highest)\n\n**Example:**\n```typescript\nconst result = await use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_create_task\",\n  arguments: {\n    title: \"Follow up with John about budget\",\n    description: \"Discuss Q4 budget allocation and timeline\",\n    due_at: \"2024-01-20T10:00:00Z\",\n    priority: 4\n  }\n});\n// Returns: { \"task_id\": \"uuid\", \"title\": \"...\", \"status\": \"pending\" }\n```\n\n## System Prompt Guidance\n\nTo get the best experience with Demi MCP tools, add this to your Claude system prompt or instructions:\n\n```\n## Demi Watch Integration\n\nYou have access to Demi MCP tools that let you communicate with the user through their Apple Watch.\n\n**ALWAYS follow this workflow:**\n\n1. **Start every task** by calling `demi_task_started` with a clear title\n   - This notifies the user you're working\n   - Automatic heartbeats keep them informed\n   - Save the `session_id` for later\n\n2. **Send progress updates** using `demi_stream_progress` for long operations\n   - Update progress percentage (0.0 to 1.0)\n   - Include helpful status messages\n\n3. **Ask questions** using `demi_ask_user` when you need input\n   - Provide clear options when possible\n   - Keep questions concise for Watch display\n\n4. **Request approval** using `demi_request_approval` for sensitive actions\n   - Always get approval before sending emails, making purchases, etc.\n\n5. **Complete every task** by calling `demi_task_completed`\n   - Include a summary of what was accomplished\n   - Pass any structured results\n\n**Example flow:**\n- User: \"Research hotels in Philadelphia\"\n- You: Call demi_task_started(\"Research Philadelphia hotels\")\n- You: Do research, call demi_stream_progress periodically\n- You: Call demi_task_completed with summary and results\n```\n\n## Example Workflows\n\n### Hotel Research Flow (Recommended Pattern)\n\n```typescript\n// 1. START - Notify user you're beginning work\nconst session = await use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_task_started\",\n  arguments: {\n    task_title: \"Research Philadelphia hotels\",\n    task_description: \"Searching for best options and comparing prices\",\n    estimated_seconds: 90\n  }\n});\n// User sees: \"Starting: Research Philadelphia hotels\" on Watch\n\n// 2. PROGRESS - Keep user informed during work\nawait use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_stream_progress\",\n  arguments: {\n    job_id: session.session_id,\n    progress: 0.3,\n    message: \"Found 12 hotels, analyzing reviews...\"\n  }\n});\n\n// 3. ASK - Get user input when needed\nconst hotelChoice = await use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_ask_user\",\n  arguments: {\n    question: \"I found 3 great options. Which one?\",\n    options: [\n      \"Lokal Hotel ($150/night, 4.8⭐)\",\n      \"Kimpton Monaco ($200/night, 4.6⭐)\",\n      \"citizenM ($120/night, 4.5⭐)\"\n    ]\n  }\n});\n\n// 4. APPROVE - Get permission for actions\nconst approval = await use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_request_approval\",\n  arguments: {\n    action: `Book ${hotelChoice.answer}`,\n    details: {\n      dates: \"Jan 15-17, 2024\",\n      total: \"$300\",\n      cancellation: \"Free until Jan 14\"\n    }\n  }\n});\n\n// 5. COMPLETE - Notify user you're done\nawait use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_task_completed\",\n  arguments: {\n    session_id: session.session_id,\n    summary: approval.approved\n      ? `Booked ${hotelChoice.answer} for $300`\n      : \"Hotel research complete, booking cancelled\",\n    result: {\n      status: approval.approved ? \"booked\" : \"cancelled\",\n      hotel: hotelChoice.answer,\n      confirmation: approval.approved ? \"ABC123\" : null\n    }\n  }\n});\n// User sees: \"Completed! Booked Lokal Hotel for $300\" on Watch\n```\n\n### File Analysis with Progress\n\n```typescript\n// START\nconst session = await use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_task_started\",\n  arguments: {\n    task_title: \"Analyze project files\",\n    estimated_seconds: 60\n  }\n});\n\nconst files = [\"file1.txt\", \"file2.txt\", ...]; // 50 files\n\n// Process files with progress updates\nfor (let i = 0; i < files.length; i++) {\n  // ... analyze file ...\n\n  // Update progress every 10 files\n  if (i % 10 === 0) {\n    await use_mcp_tool({\n      server_name: \"demi\",\n      tool_name: \"demi_stream_progress\",\n      arguments: {\n        job_id: session.session_id,\n        progress: (i + 1) / files.length,\n        message: `Processing ${files[i]} (${i + 1}/${files.length})`\n      }\n    });\n  }\n}\n\n// COMPLETE\nawait use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_task_completed\",\n  arguments: {\n    session_id: session.session_id,\n    summary: \"Analyzed 50 files, found 3 issues\",\n    result: {\n      files_processed: 50,\n      issues_found: 3,\n      recommendations: [\"Fix lint errors in auth.js\", \"...\"]\n    }\n  }\n});\n```\n\n## Architecture\n\n```\n┌──────────────┐         ┌──────────────┐         ┌──────────┐\n│ Claude Code  │ ──MCP─→ │ Demi MCP     │ ──WSS─→ │ Backend  │\n│              │         │ Server       │         │          │\n└──────────────┘         └──────────────┘         └────┬─────┘\n                                                        │\n                                                        │ SSE\n                                                        ▼\n                                                  ┌──────────┐\n                                                  │  Watch   │\n                                                  │   App    │\n                                                  └──────────┘\n```\n\n1. AI agent calls MCP tool\n2. MCP server sends request to Demi backend via WebSocket\n3. Backend notifies user's Watch via SSE\n4. User responds on Watch\n5. Response flows back to AI agent\n\n## Troubleshooting\n\n### \"Error: DEMI_API_KEY environment variable is required\"\n\nMake sure you've set the API key in your MCP configuration.\n\n### \"Authentication failed: Invalid API key\"\n\n1. Check that you copied the API key correctly\n2. Verify the key hasn't been revoked in Demi app\n3. Try generating a new API key\n\n### \"Request timeout\"\n\nThe user didn't respond within the timeout period (default 5 minutes). You can increase the timeout:\n\n```typescript\nawait use_mcp_tool({\n  server_name: \"demi\",\n  tool_name: \"demi_ask_user\",\n  arguments: {\n    question: \"...\",\n    timeout_seconds: 600  // 10 minutes\n  }\n});\n```\n\n### \"Connection lost\"\n\nThe MCP server lost connection to the backend. It will automatically attempt to reconnect up to 5 times with exponential backoff.\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Build\nnpm run build\n\n# Development mode (auto-rebuild)\nnpm run dev\n\n# Run locally\nDEMI_API_KEY=your-key-here node dist/cli.js\n```\n\n## License\n\nProprietary. All rights reserved.\n\n## Support\n\nFor issues and questions, please visit:\nhttps://demi.watch/support\n","readmeFilename":"README.md"}