UNPKG

@dollhousemcp/mcp-server

Version:

DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.

262 lines (261 loc) 12.7 kB
{ "name": "@dollhousemcp/mcp-server", "version": "2.0.35", "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.", "type": "module", "main": "dist/index.js", "bin": { "dollhousemcp": "dist/index.js", "mcp-server": "dist/index.js", "dollhouse-console-token": "dist/cli/console-token.js" }, "scripts": { "prebuild": "npm run build:safety && node scripts/generate-version.js && node scripts/generate-hashes.mjs", "build:safety": "cd packages/safety && npm install && npm run build", "build": "tsc", "postbuild": "node -e \"const fs=require('fs'),p=require('path');function rm(d){if(fs.existsSync(d)){for(const e of fs.readdirSync(d)){const f=p.join(d,e);fs.statSync(f).isDirectory()?rm(f):fs.unlinkSync(f)}fs.rmdirSync(d)}}function cpR(s,d){fs.mkdirSync(d,{recursive:true});for(const e of fs.readdirSync(s)){const sp=p.join(s,e),dp=p.join(d,e);fs.statSync(sp).isDirectory()?cpR(sp,dp):fs.copyFileSync(sp,dp)}}cpR('src/seed-elements','dist/seed-elements');rm('dist/web/public');cpR('src/web/public','dist/web/public')\"", "web": "node dist/index.js --web", "start": "node dist/index.js", "dev": "tsx watch src/index.ts", "inspector": "npx @modelcontextprotocol/inspector node dist/index.js", "inspector:dev": "npx @modelcontextprotocol/inspector tsx src/index.ts", "clean": "rm -rf dist", "rebuild": "npm run clean && npm run build", "setup": "npm install && npm run build", "prepublishOnly": "cp README.md README.md.backup 2>/dev/null || true && cp README.npm.md README.md && BUILD_TYPE=npm npm run build", "postpublish": "if [ -f README.md.backup ]; then mv README.md.backup README.md; else echo 'No backup found, README.md unchanged'; fi", "test": "cross-env \"NODE_OPTIONS=$NODE_OPTIONS --experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs", "test:watch": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs --watch", "test:coverage": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs --coverage", "test:ci": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs --ci --coverage --watchAll=false", "build:test": "tsc -p tests/tsconfig.test.json", "test:compiled": "npm run build:test && cross-env NODE_OPTIONS='--experimental-vm-modules' jest --config tests/jest.config.compiled.cjs", "test:compiled:ci": "npm run build:test && cross-env NODE_OPTIONS='--experimental-vm-modules' jest --config tests/jest.config.compiled.cjs --ci --watchAll=false", "test:integration": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.integration.config.cjs", "test:integration:hooks:docker": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.integration.config.cjs tests/integration/hooks/permission-hook-docker.test.ts", "test:integration:watch": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.integration.config.cjs --watch", "test:integration:coverage": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.integration.config.cjs --coverage", "test:integration:crud": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs tests/integration/crud/ --no-coverage", "test:crud": "npm run test:integration:crud", "test:crud:watch": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs tests/integration/crud/ --no-coverage --watch", "test:crud:ci": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs tests/integration/crud/ --no-coverage --ci --watchAll=false", "test:performance": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.performance.config.cjs", "test:cross-platform": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs tests/unit/cross-platform", "test:all": "npm test && npm run test:performance && npm run test:integration", "test:all:coverage": "npm run test:coverage && npm run test:integration:coverage", "lint": "eslint --max-warnings=0 --ext .ts src tests scripts", "lint:shell": "shellcheck -x scripts/pretooluse-dollhouse.sh scripts/pretooluse-codex.sh scripts/pretooluse-cursor.sh scripts/pretooluse-gemini.sh scripts/pretooluse-vscode.sh scripts/pretooluse-windsurf.sh scripts/permission-port-discovery.sh scripts/permission-hook-config.sh", "lint:fix": "eslint --ext .ts src tests scripts --fix", "security:critical": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs tests/security/tests --testNamePattern=\"(Command Injection|Path Traversal|YAML)\" --maxWorkers=4", "security:rapid": "npm run security:critical -- --testTimeout=30000", "security:all": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs tests/security --coverage", "security:regression": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.config.cjs tests/security/regression --maxWorkers=4", "security:report": "node scripts/security-test-runner.js all --report", "security:generate": "node scripts/generate-security-tests.js", "security:audit": "tsx scripts/run-security-audit.ts", "security:audit:json": "tsx scripts/run-security-audit.ts --json", "security:audit:verbose": "tsx scripts/run-security-audit.ts --verbose", "typecheck:scripts": "tsc --noEmit --project tsconfig.scripts.json", "pre-commit": "npm run security:rapid && npm run typecheck:scripts && npm audit --audit-level=high", "test:playwright": "npx playwright test", "test:playwright:headed": "npx playwright test --headed", "test:playwright:ui": "npx playwright test --ui", "test:e2e": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.e2e.config.cjs", "test:e2e:watch": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.e2e.config.cjs --watch", "test:e2e:verbose": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest --config tests/jest.e2e.config.cjs --verbose", "test:roundtrip": "npm run test:e2e", "test:roundtrip:manual": "./scripts/test-roundtrip-workflow.sh", "test:roundtrip:cleanup": "./scripts/test-roundtrip-workflow.sh cleanup", "test:totp:manual": "tsx scripts/totp-manual-test.ts", "qa:direct": "node scripts/qa-direct-test.js", "test:e2e:real": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest test/e2e/real-github-integration.test.ts --verbose", "test:e2e:real:mcp": "cross-env \"NODE_OPTIONS=--experimental-vm-modules --no-warnings\" jest test/e2e/mcp-tool-flow.test.ts --verbose", "test:e2e:real:all": "npm run test:e2e:real && npm run test:e2e:real:mcp", "test:e2e:cleanup": "tsx test/e2e/cleanup-test-data.ts", "qa:inspector": "node scripts/qa-inspector-cli-test.js", "qa:all": "npm run qa:direct && npm run qa:inspector", "qa:simple": "node scripts/qa-simple-test.js", "update:version": "node scripts/update-version.mjs", "version:bump": "node scripts/update-version.mjs", "version:check": "node scripts/update-version.mjs --dry-run", "verify:package-assets": "node scripts/verify-npm-package-assets.mjs", "tools:count": "node scripts/count-tools.js", "tools:list": "node scripts/count-tools.js --json", "memory:cleanup:duplicates": "tsx src/utils/cleanup-duplicate-memories.ts", "calibration:local": "tsx tests/calibration/run-local.ts", "calibration:docker": "./scripts/run-calibration.sh docker", "calibration:compare": "tsx tests/calibration/compare-results.ts", "calibration:build": "./scripts/run-calibration.sh build", "calibration:clean": "./scripts/run-calibration.sh clean" }, "keywords": [ "mcp", "mcp-server", "model-context-protocol", "personas", "skills", "agents", "memory", "templates", "ensembles", "prompt", "claude", "cursor", "vscode", "codex", "windsurf", "ai", "ai-assistant", "llm", "ai-tools", "typescript", "dollhousemcp" ], "author": { "name": "Mick Darling", "email": "mick@dollhousemcp.com", "url": "https://github.com/mickdarling" }, "contributors": [ { "name": "Todd Dibble", "url": "https://github.com/insomnolence" }, { "name": "Jeet Singh", "url": "https://github.com/jeetsingh008" } ], "license": "AGPL-3.0-or-later", "licenseNotice": "SUBJECT TO ADDITIONAL TERMS - See LICENSE file for complete terms including dual licensing, platform stability commitments, and creator protections. All terms are binding under AGPL Section 7.", "repository": { "type": "git", "url": "git+https://github.com/DollhouseMCP/mcp-server.git" }, "bugs": { "url": "https://github.com/DollhouseMCP/mcp-server/issues" }, "homepage": "https://dollhousemcp.com", "mcpName": "io.github.DollhouseMCP/mcp-server", "files": [ "dist/**/*.js", "dist/**/*.d.ts", "dist/**/*.d.ts.map", "dist/web/public/**", "dist/seed-elements/**", "scripts/pretooluse-dollhouse.sh", "scripts/permission-port-discovery.sh", "scripts/permission-hook-config.sh", "scripts/pretooluse-vscode.sh", "scripts/pretooluse-cursor.sh", "scripts/pretooluse-windsurf.sh", "scripts/pretooluse-gemini.sh", "scripts/pretooluse-codex.sh", "data/personas/**/*.md", "data/skills/**/*.md", "data/templates/**/*.md", "data/agents/**/*.md", "data/memories/**/*.md", "data/ensembles/**/*.md", "!dist/__tests__/**", "!dist/**/*.test.*", "server.json", "oauth-helper.mjs", "README.md", "LICENSE", "CHANGELOG.md" ], "publishConfig": { "access": "public", "registry": "https://registry.npmjs.org/", "provenance": true }, "funding": { "type": "github", "url": "https://github.com/sponsors/mickdarling" }, "dependencies": { "@dollhousemcp/safety": "^1.0.0", "@modelcontextprotocol/sdk": "^1.25.1", "chalk": "^5.6.2", "dompurify": "^3.4.11", "dotenv": "^17.2.3", "express": "^5.2.1", "extract-zip": "^2.0.1", "graphql": "^16.12.0", "graphql-tag": "^2.12.6", "gray-matter": "^4.0.3", "install-mcp": "^1.10.2", "js-yaml": "^4.1.1", "jsdom": "^24.1.3", "node-fetch": "^3.3.2", "otpauth": "^9.5.0", "posthog-node": "^5.24.17", "qrcode": "^1.5.4", "smol-toml": "^1.6.1", "uuid": "^11.1.1", "zod": "^4.3.6" }, "devDependencies": { "@eslint/js": "^9.38.0", "@jest/globals": "^30.3.0", "@modelcontextprotocol/inspector": "^0.21.1", "@playwright/test": "^1.59.1", "@types/archiver": "^7.0.0", "@types/dompurify": "^3.2.0", "@types/express": "^5.0.6", "@types/jest": "^30.0.0", "@types/js-yaml": "^4.0.9", "@types/jsdom": "^21.1.7", "@types/node": "^24.10.0", "@types/qrcode": "^1.5.6", "@types/semver": "^7.7.1", "@types/supertest": "^7.2.0", "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^8.46.2", "@typescript-eslint/parser": "^8.48.1", "archiver": "^7.0.1", "cross-env": "^10.1.0", "eslint": "^9.38.0", "globals": "^17.4.0", "jest": "^30.2.0", "supertest": "^7.2.2", "ts-jest": "^29.4.9", "ts-jest-resolver": "^2.0.1", "tsx": "^4.21.0", "typescript": "^5.9.3" }, "workspaces": [ "packages/safety" ], "engines": { "node": ">=18.0.0", "npm": ">=10.0.0" }, "overrides": { "gray-matter": { "js-yaml": "3.14.2" }, "@istanbuljs/load-nyc-config": { "js-yaml": "3.14.2" }, "hono": "4.12.27", "@hono/node-server": "1.19.13", "fast-uri": "3.1.2", "ip-address": "10.1.1", "lodash": "4.18.1", "picomatch@<2.3.2": "2.3.2", "picomatch@>=4.0.0 <4.0.4": "4.0.4", "brace-expansion@<1.1.13": "1.1.13", "brace-expansion@>=2.0.0 <2.0.3": "2.0.3", "express": { "path-to-regexp": "8.4.2" }, "giget": { "tar": "7.5.16" }, "form-data": "4.0.6", "qs": "6.15.2", "ws": "8.21.0" } }