{
  "name": "imsg-mcp",
  "version": "1.25.5",
  "description": "MCP server, CLI, and TUI for reading and sending iMessage / SMS on macOS — lets AI agents text humans, fetch conversation history, and stream-export entire chats. Includes a self-healing watchdog and an optional Rust acceleration module.",
  "type": "module",
  "main": "dist/index.js",
  "bin": {
    "imsg": "./dist/cli.js"
  },
  "files": [
    "dist",
    "native/imsg-native.darwin-arm64.node",
    "native/imsg-native.darwin-x64.node",
    "native/index.js",
    "native/index.d.ts",
    "README.md",
    "LICENSE",
    "CHANGELOG.md",
    "skills"
  ],
  "keywords": [
    "mcp",
    "model-context-protocol",
    "imessage",
    "messages",
    "sms",
    "macos",
    "ai-agent",
    "ai",
    "anthropic",
    "claude",
    "applescript",
    "tui",
    "terminal-ui",
    "cli",
    "chat-export"
  ],
  "author": "George G",
  "repository": {
    "type": "git",
    "url": "https://github.com/george43g/EQStack.git",
    "directory": "apps/imsg-mcp"
  },
  "homepage": "https://github.com/george43g/EQStack#readme",
  "bugs": {
    "url": "https://github.com/george43g/EQStack/issues"
  },
  "license": "MIT",
  "dependencies": {
    "@george43g/robustness": "^0.12.0",
    "@george43g/tui-kit": "^0.5.1",
    "@inkjs/ui": "^2.0.0",
    "@inquirer/prompts": "^8.5.2",
    "@modelcontextprotocol/sdk": "^1.0.0",
    "better-sqlite3": "^12.6.2",
    "bplist-parser": "^0.3.2",
    "commander": "^14.0.3",
    "fullscreen-ink": "^0.1.0",
    "ink": "^7.1.1",
    "react": "^19.2.8",
    "zod": "^3.23.0",
    "zod-to-json-schema": "^3.25.2"
  },
  "devDependencies": {
    "@anthropic-ai/mcpb": "^2.1.2",
    "@biomejs/biome": "^2.5.6",
    "@napi-rs/cli": "^3.6.2",
    "@semantic-release/changelog": "^6.0.3",
    "@semantic-release/commit-analyzer": "^13.0.1",
    "@semantic-release/exec": "^7.1.0",
    "@semantic-release/git": "^10.0.1",
    "@semantic-release/github": "^12.0.9",
    "@semantic-release/npm": "^13.1.5",
    "@semantic-release/release-notes-generator": "^14.1.0",
    "@types/better-sqlite3": "^7.6.13",
    "@types/node": "^24.0.0",
    "@types/react": "^19.2.14",
    "ink-testing-library": "^4.0.0",
    "nodemon": "^3.1.14",
    "semantic-release": "^25.0.3",
    "tsx": "^4.19.0",
    "typescript": "^5.5.0",
    "vite": "^7.3.6",
    "vitest": "^3.2.7",
    "@eqstack/biome-config": "0.0.0",
    "@eqstack/tsconfig": "0.0.0",
    "@eqstack/vitest-config": "0.0.0"
  },
  "engines": {
    "node": ">=24",
    "npm": "not in use"
  },
  "volta": {
    "node": "24.13.0"
  },
  "scripts": {
    "build": "pnpm build:ts && pnpm build:native:optional",
    "build:ts": "vite build",
    "build:native": "cd native && napi build --platform --release",
    "build:native:debug": "cd native && napi build --platform",
    "build:native:optional": "cd native && (napi build --platform --release || (echo '⚠️  Rust native build skipped (rustc not installed). TS fallback will be used.' && exit 0))",
    "dev": "vite build --watch",
    "mcp": "node --env-file=.env --env-file-if-exists=.env.local dist/cli.js mcp",
    "mcp:ai": "node --env-file=.env --env-file-if-exists=.env.ai dist/cli.js mcp",
    "mcp:test": "node --env-file=.env.test dist/cli.js mcp",
    "mcp:test:no-native": "IMSG_DISABLE_NATIVE=1 node --env-file=.env.test dist/cli.js mcp",
    "mcp:no-native": "IMSG_DISABLE_NATIVE=1 node --env-file=.env --env-file-if-exists=.env.local dist/cli.js mcp",
    "dev:mcp": "node --import tsx src/cli.ts mcp",
    "dev:mcp:watch": "nodemon --ext ts --exec 'tsx src/cli.ts mcp'",
    "start": "node --env-file=.env --env-file-if-exists=.env.local dist/cli.js",
    "debug": "node --env-file=.env --env-file-if-exists=.env.local dist/cli.js cli",
    "cli": "node --env-file=.env --env-file-if-exists=.env.local dist/cli.js cli",
    "cli:test": "node --env-file=.env.test dist/cli.js cli",
    "tui": "node --env-file=.env --env-file-if-exists=.env.local dist/cli.js tui",
    "tui:test": "node --env-file=.env.test dist/cli.js tui",
    "tui:no-native": "IMSG_DISABLE_NATIVE=1 node --env-file=.env --env-file-if-exists=.env.local dist/cli.js tui",
    "tui:test:no-native": "IMSG_DISABLE_NATIVE=1 node --env-file=.env.test dist/cli.js tui",
    "doctor": "node --env-file=.env --env-file-if-exists=.env.local dist/cli.js doctor",
    "test": "vitest run",
    "test:native": "vitest run --mode development",
    "test:no-native": "IMSG_DISABLE_NATIVE=1 vitest run",
    "test:watch": "vitest",
    "test:rust": "cd native && cargo test --release",
    "verify": "pnpm lint && pnpm typecheck && pnpm test && pnpm build",
    "lint": "biome check .",
    "typecheck": "tsc --noEmit",
    "fixtures": "node --import tsx scripts/generate-fixtures.ts",
    "fixtures:fresh": "rm -rf fixtures && pnpm fixtures",
    "fixtures:stress": "node --import tsx scripts/generate-fixtures.ts --stress --out fixtures-stress",
    "stress:tui": "node --import tsx scripts/stress-tui.ts",
    "screenshots": "fc-list | grep -qi 'jetbrains mono' || { echo 'Install: brew install --cask font-jetbrains-mono'; exit 1; }; for f in scripts/screenshots/*.tape; do vhs \"$f\" || exit 1; done",
    "screenshots:check": "pnpm screenshots && git diff --exit-code docs/screenshots/",
    "screenshots:native": "for f in scripts/screenshots/native/*.sh; do echo \"→ $f\"; bash \"$f\" || echo \"  (script failed; continuing)\"; done",
    "pack:mcpb": "pnpm build && rm -rf release/mcpb-stage release/imsg-mcp.mcpb release/imsg-mcp.dxt && mkdir -p release/mcpb-stage/native && cp -R dist release/mcpb-stage/ && cp manifest.json package.json icon.png release/mcpb-stage/ && node scripts/strip-dev-deps.mjs release/mcpb-stage && cp native/index.js native/index.d.ts release/mcpb-stage/native/ && (ls native/imsg-native.*.node 2>/dev/null | xargs -I{} cp {} release/mcpb-stage/native/ || true) && (cd release/mcpb-stage && npm install --omit=dev --omit=optional --ignore-scripts --no-audit --no-fund --no-package-lock) && node scripts/stage-native-deps.mjs && mcpb pack release/mcpb-stage release/imsg-mcp.mcpb && cp release/imsg-mcp.mcpb release/imsg-mcp.dxt",
    "fixtures:if-missing": "node -e \"if(!require('fs').existsSync('fixtures/chat.db')){require('child_process').execSync('pnpm fixtures', {stdio:'inherit'})}\"",
    "rebuild": "pnpm rebuild better-sqlite3",
    "native:build": "cd native && napi build --platform --release",
    "native:build:debug": "cd native && napi build --platform",
    "stress": "node --import tsx scripts/stress-mcp.ts .env.test",
    "stress:live": "node --import tsx scripts/stress-mcp.ts .env.local"
  }
}