{"_id":"@dollhousemcp/safety","_rev":"2-cce09ceca328574a83e4d921588b6dea","name":"@dollhousemcp/safety","dist-tags":{"latest":"1.0.2"},"versions":{"1.0.0":{"name":"@dollhousemcp/safety","version":"1.0.0","keywords":["mcp","safety","verification","tiered-safety","security","model-context-protocol"],"author":{"name":"DollhouseMCP"},"license":"AGPL-3.0","_id":"@dollhousemcp/safety@1.0.0","maintainers":[{"name":"mickdarling","email":"mick@mickdarling.com"}],"homepage":"https://github.com/DollhouseMCP/mcp-server#readme","bugs":{"url":"https://github.com/DollhouseMCP/mcp-server/issues"},"dist":{"shasum":"a203ed9d09a1a8134c483b13d866fdbd175d0ffe","tarball":"https://registry.npmjs.org/@dollhousemcp/safety/-/safety-1.0.0.tgz","fileCount":31,"integrity":"sha512-Ch03DiYF2aoDvhBcz+/xf/5cc1lVkOJZqtEBRCZjOWHuV5v7XqLOcGuYKZ2hwnS8wys5p8xfAoma/Qg/1cKFQw==","signatures":[{"sig":"MEUCIB2zvNqNtg6tV4fFPvoRHsIC9qaOozLi0O0X23OeI6XTAiEA+lKJs/h3vpHYmTFYDOLyjtPWSCGjSee4RLFupvB5S6U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":106810},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"9779dcc5caea33b8b7369b6deb12d47c46e90937","scripts":{"lint":"eslint src tests","test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","build":"tsc","clean":"rm -rf dist","test:watch":"node --experimental-vm-modules node_modules/jest/bin/jest.js --watch","test:coverage":"node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage"},"_npmUser":{"name":"mickdarling","email":"mick@mickdarling.com"},"repository":{"url":"git+https://github.com/DollhouseMCP/mcp-server.git","type":"git","directory":"packages/safety"},"_npmVersion":"11.6.2","description":"Tiered safety infrastructure for MCP servers","directories":{},"_nodeVersion":"25.1.0","_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","ts-jest":"^29.4.6","typescript":"^5.3.3","@types/jest":"^29.5.12","@types/node":"^20.11.0","@typescript-eslint/parser":"^7.0.0","@typescript-eslint/eslint-plugin":"^7.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safety_1.0.0_1774197069201_0.5383892702041253","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@dollhousemcp/safety","version":"1.0.2","description":"Tiered safety infrastructure for MCP servers","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"build":"tsc","test":"node --experimental-vm-modules node_modules/jest/bin/jest.js","test:watch":"node --experimental-vm-modules node_modules/jest/bin/jest.js --watch","test:coverage":"node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage","lint":"eslint src tests","clean":"rm -rf dist"},"keywords":["mcp","safety","verification","tiered-safety","security","model-context-protocol"],"author":{"name":"DollhouseMCP"},"license":"AGPL-3.0","repository":{"type":"git","url":"git+https://github.com/DollhouseMCP/mcp-server.git","directory":"packages/safety"},"engines":{"node":">=20"},"devDependencies":{"@types/jest":"^29.5.12","@types/node":"^20.11.0","@typescript-eslint/eslint-plugin":"^7.0.0","@typescript-eslint/parser":"^7.0.0","eslint":"^8.56.0","jest":"^29.7.0","ts-jest":"^29.4.9","typescript":"^5.3.3"},"gitHead":"f1c0c3860ee80b7d3f6669306589b38e89db7a3a","_id":"@dollhousemcp/safety@1.0.2","bugs":{"url":"https://github.com/DollhouseMCP/mcp-server/issues"},"homepage":"https://github.com/DollhouseMCP/mcp-server#readme","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-Oew7LS+zxvhp4dCMsreD7gvxBj+dTJKCma8PWTIVGBCmmU24n5GUhxMvqpBgIqu0/Y8RIsFEHVooab6KCAC+xA==","shasum":"80d76a5b31815133364224f84a808f6fb5305cc3","tarball":"https://registry.npmjs.org/@dollhousemcp/safety/-/safety-1.0.2.tgz","fileCount":31,"unpackedSize":106978,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@dollhousemcp%2fsafety@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCy542oK55I7I+7S0QINr3AR2enbpbo7JbozZFnPpOJWwIhAO7EjQYXv+OCdM9Y9C8sEANc2pPPn37xqpvR6K5AUMzo"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d9c5ce71-6953-490a-8356-824afa13481e"}},"directories":{},"maintainers":[{"name":"mickdarling","email":"mick@mickdarling.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/safety_1.0.2_1788569162469_0.017161549071162074"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-22T16:31:09.075Z","modified":"2026-09-05T00:46:02.912Z","1.0.0":"2026-03-22T16:31:09.347Z","1.0.2":"2026-09-05T00:46:02.597Z"},"bugs":{"url":"https://github.com/DollhouseMCP/mcp-server/issues"},"author":{"name":"DollhouseMCP"},"license":"AGPL-3.0","homepage":"https://github.com/DollhouseMCP/mcp-server#readme","keywords":["mcp","safety","verification","tiered-safety","security","model-context-protocol"],"repository":{"type":"git","url":"git+https://github.com/DollhouseMCP/mcp-server.git","directory":"packages/safety"},"description":"Tiered safety infrastructure for MCP servers","maintainers":[{"name":"mickdarling","email":"mick@mickdarling.com"}],"readme":"# @dollhousemcp/safety\n\nTiered safety infrastructure for MCP servers with zero external dependencies.\n\n## Overview\n\n`@dollhousemcp/safety` provides a comprehensive safety system for Model Context Protocol (MCP) servers, including:\n\n- **Tiered Safety System**: Four safety tiers (advisory, confirm, verify, danger_zone) based on risk assessment\n- **Verification Challenges**: Server-side challenge storage and LLM-proof verification codes\n- **Cross-Platform Dialogs**: Native OS dialog support (macOS, Linux, Windows)\n- **Audit Logging**: Pluggable audit logging for safety events\n- **Agent Chain Tracking**: Context tracking for multi-agent execution chains\n\n## Features\n\n- **Zero Dependencies**: Uses only Node.js built-in modules\n- **TypeScript**: Full type definitions included\n- **ESM-Only**: Modern ES module support\n- **Lightweight**: ~20KB package size\n- **Cross-Platform**: Works on macOS, Linux, and Windows\n\n## Installation\n\n```bash\nnpm install @dollhousemcp/safety\n```\n\n## Usage\n\n### Basic Safety Tier Determination\n\n```typescript\nimport { determineSafetyTier, DEFAULT_SAFETY_CONFIG } from '@dollhousemcp/safety';\n\nconst result = determineSafetyTier(\n  75, // risk score\n  ['Potential credential exposure'], // security warnings\n  'read credentials from file', // goal/operation description\n  DEFAULT_SAFETY_CONFIG\n);\n\nconsole.log(result.tier); // 'verify'\nconsole.log(result.factors); // ['Risk score 75 >= 61 (verify threshold)', ...]\n```\n\n### Verification Challenges\n\n```typescript\nimport {\n  createVerificationChallenge,\n  VerificationStore,\n  showVerificationDialog\n} from '@dollhousemcp/safety';\n\n// Create a verification challenge\nconst challenge = createVerificationChallenge(\n  'High-risk operation detected',\n  'display_code',\n  5 // expires in 5 minutes\n);\n\n// Store the challenge\nconst store = new VerificationStore();\nstore.set(challenge.challengeId, {\n  code: challenge.displayCode!,\n  expiresAt: new Date(challenge.expiresAt).getTime(),\n  reason: challenge.reason,\n});\n\n// Show dialog to user (LLM cannot see the code)\nshowVerificationDialog(\n  challenge.displayCode!,\n  challenge.reason,\n  { title: 'Verification Required', icon: 'warning' }\n);\n\n// Later, verify user input\nconst isValid = store.verify(challenge.challengeId, userInput);\n```\n\n### Agent Chain Tracking\n\n```typescript\nimport { createExecutionContext, DEFAULT_SAFETY_CONFIG } from '@dollhousemcp/safety';\n\n// Direct invocation (depth 0)\nconst context1 = createExecutionContext('agent1');\n\n// Nested invocation (depth 1)\nconst context2 = createExecutionContext('agent2', context1);\n\n// Check for depth escalation\nif (context2.depthEscalation) {\n  console.log('Agent chain depth exceeded, escalating safety tier');\n}\n```\n\n### Custom Audit Logging\n\n```typescript\nimport {\n  determineSafetyTier,\n  createAuditLogger,\n  SafetyAuditEvent\n} from '@dollhousemcp/safety';\n\n// Create custom audit logger\nconst logger = createAuditLogger((event: SafetyAuditEvent) => {\n  // Send to your monitoring system\n  myMonitoring.track('safety_event', {\n    type: event.type,\n    tier: event.tier,\n    timestamp: event.timestamp,\n    details: event.details,\n  });\n});\n\n// Use with safety tier determination\nconst result = determineSafetyTier(\n  50,\n  [],\n  'operation',\n  DEFAULT_SAFETY_CONFIG,\n  undefined,\n  logger // Pass your custom logger\n);\n```\n\n## API Reference\n\n### Safety Tier Determination\n\n- `determineSafetyTier(riskScore, securityWarnings, goal, config?, executionContext?, logger?)`: Determine safety tier\n- `matchesDangerZonePattern(goal, patterns)`: Check for dangerous patterns\n- `hasCriticalSecurityViolations(warnings)`: Check for critical security issues\n\n### Verification\n\n- `createVerificationChallenge(reason, type?, expirationMinutes?, logger?)`: Create verification challenge\n- `generateDisplayCode(length?)`: Generate LLM-proof verification code\n- `VerificationStore`: Server-side challenge storage\n  - `set(challengeId, challenge)`: Store challenge\n  - `get(challengeId)`: Retrieve challenge\n  - `verify(challengeId, code)`: Verify code\n  - `cleanup()`: Remove expired challenges\n\n### Display Service\n\n- `showVerificationDialog(code, reason, options?)`: Show OS-native dialog (macOS/Linux/Windows)\n- `isDialogAvailable()`: Check if dialogs are available on current platform\n\n### Confirmation & Danger Zone\n\n- `createConfirmationRequest(reason, riskFactors)`: Create confirmation request\n- `createDangerZoneOperation(operationType, reason, enabled, config?, logger?)`: Create danger zone operation\n- `createExecutionContext(agentName, parentContext?, config?)`: Create execution context for agent chains\n\n### Configuration\n\n- `DEFAULT_SAFETY_CONFIG`: Default safety configuration\n  - Thresholds: advisory (30), confirm (31), verify (61), danger_zone (86)\n  - Danger zone patterns: rm -rf, DROP TABLE, eval(), etc.\n  - Agent chain max depth: 2\n\n### Audit Logging\n\n- `defaultAuditLogger`: No-op logger (silent)\n- `consoleAuditLogger`: Console-based logger for development\n- `createAuditLogger(callback)`: Create custom logger\n\n## Safety Tiers\n\n1. **Advisory** (risk score 0-30): Low risk, informational only\n2. **Confirm** (risk score 31-60): Moderate risk, simple confirmation recommended\n3. **Verify** (risk score 61-85): High risk, human verification required (LLM-proof)\n4. **Danger Zone** (risk score 86+): Critical risk, blocked by default unless explicitly enabled\n\n## Platform Support\n\n### macOS\n- Uses `osascript` for native dialogs\n- Always available\n\n### Linux\n- Tries `zenity`, `kdialog`, `xmessage` in order\n- Graceful fallback if no GUI available\n\n### Windows\n- Uses PowerShell `MessageBox`\n- Always available\n\n## License\n\nAGPL-3.0\n\n## Contributing\n\nSee the main [DollhouseMCP repository](https://github.com/DollhouseMCP/mcp-server) for contribution guidelines.\n","readmeFilename":"README.md"}