{"_id":"apple-tools-mcp","_rev":"27-bec606277dffa580b4e7027f97bbd3d3","name":"apple-tools-mcp","dist-tags":{"latest":"3.0.1"},"versions":{"1.0.0":{"name":"apple-tools-mcp","version":"1.0.0","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","claude","anthropic","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@1.0.0","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/apple-tools-mcp#readme","bugs":{"url":"https://github.com/sfls1397/apple-tools-mcp/issues"},"bin":{"apple-tools-mcp":"index.js"},"dist":{"shasum":"eb7518f2de5ca001d02bb89d3abf671556c59814","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-1.0.0.tgz","fileCount":11,"integrity":"sha512-OlMphd1bDoryZ4MLsfWDpymhToAh4sCqWEzdIzhK8H3B70YVWZDsLYhnU23bGMh/EEKCLE1iFYmckH9Y215Jlg==","signatures":[{"sig":"MEQCIDGWLX0flhqZloig2ycyhF/OJZDpzldNAm22gmJYiWicAiBfOrr/VdDKIGfil+RtMomL/HirRr4r1ohzrudbm8gNUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257240},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"scripts":{"perf":"USE_REAL_DATA=1 vitest run tests/perf --reporter=verbose","test":"vitest run","audit":"APPLE_TOOLS_INDEX_DAYS_BACK=30 node scripts/audit-index.js","start":"node index.js","test:all":"vitest run","test:idx":"vitest run tests/indexing","perf:full":"vitest run tests/perf --reporter=verbose --testTimeout=120000","perf:mail":"vitest run tests/perf/datasources.perf.test.js -t 'Email' --reporter=verbose","perf:mock":"vitest run tests/perf --reporter=verbose","test:fuzz":"vitest run tests/fuzz","test:perf":"vitest run tests/performance","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js --reporter=verbose","perf:quick":"vitest run tests/perf/tools.perf.test.js tests/perf/search.perf.test.js --reporter=verbose","perf:tools":"vitest run tests/perf/tools.perf.test.js --reporter=verbose","perf:watch":"USE_REAL_DATA=1 vitest tests/perf","test:chaos":"vitest run tests/chaos","test:watch":"vitest","build-index":"APPLE_TOOLS_INDEX_DAYS_BACK=30 node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:memory":"vitest run tests/perf/memory.perf.test.js --reporter=verbose","perf:search":"vitest run tests/perf/search.perf.test.js --reporter=verbose","perf:server":"vitest run tests/perf/mcp-server.perf.test.js --reporter=verbose","perf:stress":"vitest run tests/perf/stress.perf.test.js --reporter=verbose --testTimeout=120000","test:stress":"vitest run tests/stress","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js --reporter=verbose","perf:calendar":"vitest run tests/perf/datasources.perf.test.js -t 'Calendar' --reporter=verbose","perf:contacts":"vitest run tests/perf/datasources.perf.test.js -t 'Contacts' --reporter=verbose","perf:indexing":"vitest run tests/perf/indexing.perf.test.js --reporter=verbose","perf:messages":"vitest run tests/perf/datasources.perf.test.js -t 'Messages' --reporter=verbose","perf:negative":"vitest run tests/perf/negative.perf.test.js --reporter=verbose","test:contract":"vitest run tests/contract","test:coverage":"vitest run --coverage","test:idx:edge":"vitest run tests/indexing/edge-cases","test:idx:perf":"vitest run tests/indexing/performance","test:idx:unit":"vitest run tests/indexing/unit","test:recovery":"vitest run tests/recovery","test:snapshot":"vitest run tests/snapshots","test:timezone":"vitest run tests/timezone","perf:embedding":"vitest run tests/perf/embedding.perf.test.js --reporter=verbose","test:idx:build":"node scripts/build-test-index.js","test:idx:cache":"vitest run tests/indexing/caching","test:idx:clean":"node scripts/clean-test-index.js","test:idx:watch":"vitest tests/indexing","perf:background":"vitest run tests/perf/background-indexing.perf.test.js --reporter=verbose","perf:edge-cases":"vitest run tests/perf/edge-cases.perf.test.js --reporter=verbose","perf:regression":"vitest run tests/perf/regression.perf.test.js --reporter=verbose","perf:datasources":"vitest run tests/perf/datasources.perf.test.js --reporter=verbose","test:concurrency":"vitest run tests/concurrency","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:contacts":"vitest run tests/indexing/contacts","test:idx:negative":"vitest run tests/indexing/negative","test:idx:resource":"vitest run tests/indexing/resource","test:idx:security":"vitest run tests/indexing/security","test:idx:integration":"vitest run tests/indexing/integration","test:integration:periodic":"vitest run tests/integration/periodic-indexing-e2e.test.js --reporter=verbose"},"_npmUser":{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"},"repository":{"url":"git+https://github.com/sfls1397/apple-tools-mcp.git","type":"git"},"_npmVersion":"10.9.4","description":"MCP server for semantic search across Apple Mail, Messages, and Calendar","directories":{},"_nodeVersion":"22.21.1","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^4.0.14","fast-check":"^3.15.0","@vitest/coverage-v8":"^4.0.14"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_1.0.0_1765071109209_0.7650856059935569","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"apple-tools-mcp","version":"1.1.0","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","claude","anthropic","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@1.1.0","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"index.js"},"dist":{"shasum":"51e267b3d3b91fb213e0e43864830923b6e87de5","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-1.1.0.tgz","fileCount":11,"integrity":"sha512-Uql8jGHkrPgCsKgiRldzXQ8Aln/6bADdkRC+Ta81c82+DZT0Qdf5fwF4J2hu8EIrjAq3cKAj+8/bsN7Iwpp7jQ==","signatures":[{"sig":"MEYCIQCNt6ZNt+8aQ79pnfjoPeJqWEelPfHAL3fn+PLgnlQniwIhAPqJx/P+ljgVtBHB7DfZAQcP3wv54c+PlqXNaRJsp/Mw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":257787},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"99bdb9c29fab06dc81d541205879a357ebb78d8a","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.17.0","description":"MCP server for semantic search across Apple Mail, Messages, and Calendar","directories":{},"_nodeVersion":"24.19.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_1.1.0_1788107341805_0.9778086381277915","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"apple-tools-mcp","version":"1.1.1","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","claude","anthropic","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@1.1.1","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"index.js"},"dist":{"shasum":"9457e12a68fca089a94a420b2806c442a9bac1f8","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-1.1.1.tgz","fileCount":11,"integrity":"sha512-9RkDB0ttop99mCYHLdK7f71l55w2dQMLN+ZBZNdyERNwhLlszy9gKyDdWbQlrGzO7VSXj+iQOhgu3fpz90H28w==","signatures":[{"sig":"MEYCIQCGHWu6wO+2q30JlVYv/gWQqT//EQHtwaBy067g0JgQiAIhAKZmP0lUJRrVKcGBixWzYak44aFsEppaPc9Cm9/7sKWm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":263616},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"b9e0b00f5e4bc6629b6ce2e349d421eb0af33881","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.17.0","description":"MCP server for semantic search across Apple Mail, Messages, and Calendar","directories":{},"_nodeVersion":"24.19.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_1.1.1_1788325353777_0.37208002015373665","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"apple-tools-mcp","version":"1.1.2","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","claude","anthropic","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@1.1.2","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"index.js"},"dist":{"shasum":"7ed79f1c47e02abe326566bbba001c68670cda35","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-1.1.2.tgz","fileCount":11,"integrity":"sha512-Gcupsyzq8yaKGQtabgiif1ohMANCi9Ic9yqNmB3cynMyxPUN7iOU29JjfPBP80aDK20NHbil5ULI71n9QG0jNA==","signatures":[{"sig":"MEQCIHBLssC0GsIiLGegraF8DBAbap3uZ5+4dQwNeh/uxcjcAiAH0lXA4iBEce6IKS8Xiz9JPYMaYfdKxJXERcQbbdBvYA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":269958},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"1ad575bc3270e0c097a9e43e7996d100e6581ddb","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search across Apple Mail, Messages, and Calendar","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_1.1.2_1788506990993_0.6061516133444844","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"apple-tools-mcp","version":"1.1.3","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","claude","anthropic","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@1.1.3","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"index.js"},"dist":{"shasum":"57475f86ad118ca3ba16ba28e23ff1a836669af5","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-1.1.3.tgz","fileCount":12,"integrity":"sha512-xV81iqKBmgX5sKub0xUuja4Njyd3Aea9hw6EEhSenAhaRpVZrFZTq6uQsub94Opu7Ayx5BAMHR7Hs7UG+nF6Bg==","signatures":[{"sig":"MEYCIQC5kThKCEy/6Rw4PHMbXOzwncEopiV81X9pOkPqaTwUSQIhAJFkivqaomOq/mQAYTdNNI5/peGgiuTn741bWAbrYTxd","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":273696},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"efefc32511ca234807b8acf7b2e42910c82291cc","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search across Apple Mail, Messages, and Calendar","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_1.1.3_1788537920607_0.1478262146423166","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"apple-tools-mcp","version":"1.1.4","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@1.1.4","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"index.js"},"dist":{"shasum":"c48c534e092af672a0ecce6ca784833d8b0b1bee","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-1.1.4.tgz","fileCount":12,"integrity":"sha512-z7huQ7u2R1qhtgmAgAJpUpNs+wWO4n8YXsr4nUBMc1tRuJVGmCvlghCkhEbp5pUIaEBkeXRdY3z26qgJ5/sqwg==","signatures":[{"sig":"MEQCIEDoPBPnMaAiP9vGUA5j3MuDtRJKIOrprpPJA5vnlthRAiBFi81yQ5JhWbvhtdPoSa3wNrQ7d3dZGjYGXZDXlZRfPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":274353},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"989b046cd0a65dcf9615ba2e02b243f35c515900","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search across Apple Mail, Messages, and Calendar","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_1.1.4_1788906989487_0.5019045735103924","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"apple-tools-mcp","version":"1.2.0","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@1.2.0","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"index.js","apple-tools-indexer":"index.js"},"dist":{"shasum":"10b57248191e0f13103fb6996955254bf3b15826","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-1.2.0.tgz","fileCount":16,"integrity":"sha512-AIR22CnLcXNZzd0pYOsiYtCgKV6EmsHwbRD9ciJaRxlkZXjsoDSYGJwKJHtjtjK2HBQgTcl8GqatCP1AZXBpRA==","signatures":[{"sig":"MEUCIFh/a3lJHj460jCaKN4AmunJhnQK4YStFdaKvGMycSoBAiEAwSDtNGabkJpKUT+50IwS3zJ1AyzEL6xrf/N1Dr6lHek=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":302909},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ff058f99c2716ca8356792b4e38fbfd08f604351","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search across Apple Mail, Messages, and Calendar","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_1.2.0_1789510931084_0.2953320994959814","host":"s3://npm-registry-packages-npm-production"}},"1.2.1":{"name":"apple-tools-mcp","version":"1.2.1","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@1.2.1","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"index.js","apple-tools-indexer":"index.js"},"dist":{"shasum":"d1f1a17f020dec1a6dbfce864210c87f832daffe","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-1.2.1.tgz","fileCount":17,"integrity":"sha512-hGQ6xIKQFZq27NJ47hlkds1jQm6xZ2HqEsVaccj9hadPPiBh9zczek+jaq+cEcFQRAaEhEmYeMmTI5kL/ewwww==","signatures":[{"sig":"MEUCIQDOH2RzwN0gxAFyJsRTPKrrt26HAIA6/JYR28kZ2gFPVAIgBWDlbokC3Q7SNnDyiiVpqiaaM2w65NTDvB46V55dPUQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":312308},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"89b768b3e04fb6515d3e6ffe846ab253f8a74057","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search across Apple Mail, Messages, and Calendar","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_1.2.1_1789520117778_0.48537132080134504","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"apple-tools-mcp","version":"2.0.0","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.0.0","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"index.js","apple-tools-indexer":"index.js"},"dist":{"shasum":"1bbcc3faea97f2d504150e9f52210863c7c871dc","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.0.0.tgz","fileCount":27,"integrity":"sha512-CGFb+xkMDkmLPEZCXubeCS/ajtmoZvetISkRjwPRv74wYKkPbBCn6bs7VsYSY54JPWqZq+rYG/eacY3O9G6/Cw==","signatures":[{"sig":"MEYCIQCAYcuAEN+eVYu3oZAvsFROtIRrODNoNhBbc7D+lnFseQIhANin6E485SYvrCa2P5hxXxlIcQlbp3dRjcxs/b2++seJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFe0Sw3I4dAAyO0vk3NMGi2Wnp3bFjVd6GkS+tFjgNILAiBd8laafUFurUhKPybHFwGJKJesm8iL28g5sDToUVRnKQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":463165},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"6e37c88a865572b0ed80a543f4f762a7ce92a4cb","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.0.0_1789913665627_0.5716648070592225","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"apple-tools-mcp","version":"2.0.1","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.0.1","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"index.js","apple-tools-indexer":"index.js"},"dist":{"shasum":"09d853804d8ec10bbfadca0bbe886d8bacd4abbd","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.0.1.tgz","fileCount":28,"integrity":"sha512-PFpeV8PIGuzFg/MCVKPn3la51r4KDa01kZP/iYu/TtAa63HyQowZCwrWQ4t3hcZp9n6iXpnsdlXPR7q3WKkaKw==","signatures":[{"sig":"MEUCIG6aF7TA+ncDTjOsoShFJ5Z8vbh9IOA/VgKzouscvCKBAiEA6FzK9TsOE38ol++JkKx5mRSDQTLtykMlWYdOTR+xDRk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDplKW7K5dpr67ViSUuqYkktfifFP3RakGhNxq+0AT0IAiEAzB5TR3yz9Y2RbrTpTIZ/fAYvocrYJi1iD897jHHLXvk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":526202},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"0a643daa8c15cbf485686e97975a3fc8faabdfa5","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.0.1_1789920508561_0.4142410308267248","host":"s3://npm-registry-packages-npm-production"}},"2.0.2":{"name":"apple-tools-mcp","version":"2.0.2","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.0.2","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"index.js","apple-tools-indexer":"index.js"},"dist":{"shasum":"08b8c24b8f2db5e9300571f2e6904995c93b7de3","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.0.2.tgz","fileCount":30,"integrity":"sha512-+k8q6hPwY1/bSN7Ohlh2rDZRLOVYUqJlKLSJop21KCgatB6I6WG+1vuEAMVe0cXr6Lif35l5zrhNKg1JptsQWg==","signatures":[{"sig":"MEUCIEhsAgIhPehyyihboccpjIxuSb8d/MpX8O2OwdgD1VOrAiEAzOu0LBawUCjarn1tGT3k39aqSg7rTJb1/a7yGqll4rE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCTDMalBpvQLcQm/cNI+cCHEtktgXkFG/8nvDL0nAHV4QIgGazULcSC6ns9MThsh2hD5eoaiteU9eJTuh+JiUYNrts=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":573249},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"37e1057295e199d52caab4138f358651cde3f552","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.0.2_1789958387211_0.12918912093182922","host":"s3://npm-registry-packages-npm-production"}},"2.0.3":{"name":"apple-tools-mcp","version":"2.0.3","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.0.3","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"8d600874da27b9b756f520eb5b685b3725abc0ab","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.0.3.tgz","fileCount":32,"integrity":"sha512-mt0oKfGZlxtoQX71bI9isr9l9wU1QXqPWcpXhPdRJT4klkA4yRc1Acc7dqVB8a5Dt0AfecdOgQsYw2r2EBXYJA==","signatures":[{"sig":"MEUCIGP2nc3HlTqp5WpPLLLUVBYXMFZlXt1jI8OxNjoU/HclAiEAnDbVCOSvSTDiqNeBCtwle0EHVMAq9p3gm/NjYkP+ez0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCZoTM/VQ730iRS+M3uObCueMZ8OMjT9PPFg4p0arg6WgIhAJf0Jfg0M6dAiGjYSa432vTXJ9qKt3V+C++44yM0JyCS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.0.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":574295},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"3a3efef3c52155aca2219d5753af74e72bc8b173","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.0.3_1789960106828_0.9463425465544288","host":"s3://npm-registry-packages-npm-production"}},"2.0.4":{"name":"apple-tools-mcp","version":"2.0.4","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.0.4","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"27ce730cefda1257cc47c6c2da602789d6b86f30","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.0.4.tgz","fileCount":32,"integrity":"sha512-DdjE7QQSFVFf2KVbw3KhWFGqxodPD/XcuVfQ0lMqLFZMzWA7AVwyuFU5Y++4JxtFHO1SWESMimEnx4crOpJIWw==","signatures":[{"sig":"MEUCIQDpmzRwM8XcuOnOgU0h19TfDcgVYIRYog6GzVt2DR8gZwIgLlvEDWr8Ars+Kn6U5eh8TTi2o1VbWV7shc3PU7A/Jtk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIE9eBfkgxfcJwgVQPA0ORGE2zxs71TNtKfeK1Z+qDp8SAiBlDIDK5IGiFkKT3S0fPZaz2UzRh+CNr7WXojxK8IKthA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.0.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":577962},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ad4cb43aa8de0291cd1dc5c2d91109b7bc4e435a","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.0.4_1789965357942_0.7821345850577457","host":"s3://npm-registry-packages-npm-production"}},"2.0.5":{"name":"apple-tools-mcp","version":"2.0.5","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.0.5","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"d50a63bf388f2bc7ecb2c679ab08a4d11c6118d7","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.0.5.tgz","fileCount":32,"integrity":"sha512-Y/1Y5akbuOspfYnhs6im8J/Ac0tm+D9fd4Sk2Lsy8fZq6WFQ0bZvesP6pqkceYmcWdiSsxLflaNmnz+18nLang==","signatures":[{"sig":"MEUCIEbuXfG54uOn+RpfiUPu1dCZEPxHlFAc6xNRC+hDybA2AiEAqWgz9ImFDlr48/s9sz3nWPYUOn1CH1zeS0o5IBfXTKM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAyQRVu7PvGlkc1oxdaTWJF/V37SVN2nZ6hVNNV057ndAiAqv5PRe5fJgpkQPTrzXtSRm0Pu7H/vb93IKBhWUQyAaQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.0.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":581602},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"2cf1c48dbf69ce0c62ad70943219a17141c4111a","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.0.5_1789966746760_0.4229533897626794","host":"s3://npm-registry-packages-npm-production"}},"2.0.6":{"name":"apple-tools-mcp","version":"2.0.6","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.0.6","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"3388896ff47e627f421d2ff66e511ed8a2dbd4c1","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.0.6.tgz","fileCount":32,"integrity":"sha512-ipuC2EaOxPEhs5m9xNXfi3zIXXRwnerzb17rujVcY9MoZG5iv3NoeMGxtvPmL7TSVJUOcT9TOvMuRO8OeKEMXw==","signatures":[{"sig":"MEQCIEUzSWqxGrxBSFN0Vje0R2BoahZtNiQRjN5/Kg3F2NyCAiAOLVkDk3nT8YfmiMQVM/84Lcxv4qdqBwbRzcnCIoVAlw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDJdTqrIYQvF7Pjz8eJPBN+U6ZAKpMSPk0+W1D3axumuAiEA42faESpDib+Bv2YAacKZoNDEGoq2aD+TX7t3uWEuq8I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.0.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":583288},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"353479741b689d9a10b66118a1bb99d3b4a4327a","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.0.6_1789967718440_0.5115354463322064","host":"s3://npm-registry-packages-npm-production"}},"2.0.7":{"name":"apple-tools-mcp","version":"2.0.7","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.0.7","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"0c0dde437abb25a8eab7b84ceb9867da24de1dea","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.0.7.tgz","fileCount":32,"integrity":"sha512-QMfOuxT4F/Vufa0te+6ZlqiOOLbIATMK8llu4GsJ/sdRyGC/cVCwrBkRIFdotOqemqNchJNgxx4NAp1bn/WPsw==","signatures":[{"sig":"MEUCIGdITgT+gttPzrn8W03TPFh7HsAV9v8MCA04ydpPbHCtAiEAi9/nrWlevB1b29hJGiEBbs9OosZZvhHZtNJwitD8N+Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBmdb/J17URr+VqlF7X45ibXB2Lqi7jJ0x5MMA6agMJRAiAFcOkcAfKs776IraP05NaAMHYK4drDCBZlglyE5zZ1Mw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":592227},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"070fb0972692346f9b583a902adfab6ea6008836","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.0.7_1789994884878_0.6198218613987445","host":"s3://npm-registry-packages-npm-production"}},"2.0.8":{"name":"apple-tools-mcp","version":"2.0.8","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.0.8","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"e76680448c11af6e550ccad2f52e47b7bc6d96b9","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.0.8.tgz","fileCount":32,"integrity":"sha512-9kGk2sP5SveLfATx2/zMPR/ajEL9wndtNL2KKQ4JRuQro/cbfzjYx90rM08U1S9VlgloJ39Idfht1JQu8uG9Ig==","signatures":[{"sig":"MEYCIQCrJ+jpX5Cv6AVHHzusCTaGGTSLhRJoBTKwzhUljwAtvQIhAJkvl20W1PHnmuMNJKNbxUbjmnG8d5m9kZWFZ9fkyNDc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDOewXE669m23tIQn2OciOYPZlyvbfyAH95bZb35TiP5QIhANB7RiN7eIgeARbJzQrBtY76/PMM68+cLkxy8t1gDlr+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.0.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":600149},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"ff3c00d6921b113faba69472c61604a9668dd455","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.0.8_1789999651421_0.9161314218916505","host":"s3://npm-registry-packages-npm-production"}},"2.0.9":{"name":"apple-tools-mcp","version":"2.0.9","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.0.9","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"1430cacfbabe74f09580ba8c7f468e1b5042e38f","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.0.9.tgz","fileCount":32,"integrity":"sha512-tRhjcbnxCJuiHu8UN0rJzAAHPu3x3A9zONYu2/u4m3Kh9/Fe6pdRQe31adicg3yaMlWx7Ue80y9bdYGWri+8+g==","signatures":[{"sig":"MEYCIQD1CbjRmp71flTpFlYc/nSVGtGDifbWmSBrjqRdMNF2mQIhAIWf9IWz9kIwO6R21LYrqo6rNFPBB+Bu9Ur13bs8cXYh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDIutz+3stXtCbosHC3ZkrKhp8xP8ahPa1ynr3GjNNf3AIgNdYKR2P1RT8mGSrB81Enf4iO9kU126AUU8xLga2HdMc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.0.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":602230},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"4de4e586d9247fdb2406f5106453e1e7afaa68cc","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.0.9_1790000635618_0.6259132468520778","host":"s3://npm-registry-packages-npm-production"}},"2.0.10":{"name":"apple-tools-mcp","version":"2.0.10","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.0.10","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"c4ec557ee9ba7c9cfe4086cef9181352cd8386ae","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.0.10.tgz","fileCount":32,"integrity":"sha512-0sssbN3zVKU4aHRsSOAF02hsUIgdxqfg4kLS39WcOIiDfVQTLKES1kzkxtcdq8o0/B102A6569e6KVdI6V6A4w==","signatures":[{"sig":"MEQCIFCLhugSkt+2mZLB48MIAE7S9/g4uhjX/GjCpQPwtFsvAiAoJX/mLdit/ECzC3vEt4AD3RrWBSh1o+yH0/AJn3I6NA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEEwobDFtvqjeFbftpQD8iqG9VjsArEq/mJxLrCARFEzAiAN9FcpGJpJyIBzlERbFaAXuPDzcpRuG8fjNE0sxaPj7A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.0.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":603593},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"a34cd01e66dbab98241d27938775bdff8f9cab9a","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.0.10_1790005430296_0.9367559736324236","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"apple-tools-mcp","version":"2.1.0","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.1.0","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"3d0445dc73de119eba09dadce415a656b8ca5498","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.1.0.tgz","fileCount":32,"integrity":"sha512-RajBo3/8lIOTGl+iwVeRT3PwYYlwBT7I5XG2jCDF2eRUNlQg78+fJjEJNbqIDhPOIm1orrnkPKsFtvoWm9LOBg==","signatures":[{"sig":"MEUCIQDbzZE66Yq4tD25z8d3i6fdk2+zdyM9YaKJInaqO/CNdwIgK0lOLQSIIH1iSkIb3NMMXLzt03FIkdFIUnc8H+HcfwQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIBCMp0KQ8MIubDBfUoe2sjfL4L349HwO1e5G0gG0PCxOAiEAtd0SKSwyPPUu0eUXdUs8a58W24DGg9hPswp1rsefblw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":605368},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"592f02d411e9bd5790853200573bef53803cdcea","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.1.0_1790013043466_0.4262683714427189","host":"s3://npm-registry-packages-npm-production"}},"2.1.1":{"name":"apple-tools-mcp","version":"2.1.1","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.1.1","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"9b1e881a66112ba8e83935f8ce49a961defcae67","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.1.1.tgz","fileCount":32,"integrity":"sha512-PwrBzS+9IUlmeBEImbokpFtXT8bZdGIY/Zb1AQvQkDAHryITVED+mx7TPnABnIoc/v2Rbm++t7bR+OhzjPeR9A==","signatures":[{"sig":"MEYCIQCKNb2nPJVnNOT/8WPSwRzG5afARtqcnIunvOkQn/3+xwIhAKFQoQQNez5uoGKjO/lZMpLL+n9McovyhlgwqTt/h6qw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCOAyDlB4hAvtrWIts/SAYVVU5OkCVm8kqCeL7Ss2lliAIgWB9zRhAKDmTN4B7NgPwE5YT0aJ2q+7HS5dyq1kBilDM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":610062},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"7e02693fd42704be420ce0693df5e3c6de195075","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.1.1_1790019576406_0.4566120005820433","host":"s3://npm-registry-packages-npm-production"}},"2.1.2":{"name":"apple-tools-mcp","version":"2.1.2","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.1.2","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"e855f5f891c6aac6544f4fd6387ed8dd5e28bf8f","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.1.2.tgz","fileCount":32,"integrity":"sha512-c1bP5CHFhUo+Oz24tA3eN1MnzJYjb2E+Qb3OXk5ie64l0uuV6DiCzIZ/A0HHEi9sVl3vV8sptePz9/qiEQhq9Q==","signatures":[{"sig":"MEUCIQD28aaV5n0PXHBOvuacmuTsVQMOiPvxhSy7zC2RwEXXzAIgd6eep1Y/fo6yE8HQQmqcKC2xMThTrZMtlWHqjvMjrlA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIH9xWwHiI8nmvlmrHDPmZY1CH/TJAIVdtJv0Ah03CbWfAiEAlncarZBU18naJ4AgQsk1fH/Op+qLPOswiDjHA+2CUKk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":613189},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"812b06c7db14e8b6c58cd157ab1d60bb9219dcd1","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.1.2_1790022085875_0.9280240350972382","host":"s3://npm-registry-packages-npm-production"}},"2.1.3":{"name":"apple-tools-mcp","version":"2.1.3","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.1.3","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"a77967fe7513fa0f8b62419c857edd82d190b077","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.1.3.tgz","fileCount":32,"integrity":"sha512-U+OWDrMwmvEfKEGo0MP2ad372Ozxb6c8zCe+F6S/lK+tsyWzrROkBzfffhBx5TjRO6+JudwUvk4tJp7Ctq62Qg==","signatures":[{"sig":"MEQCIB63tzLzKQPU73vm8AL8DBC1S3MIsW35o+FUM/Bs1h20AiBYts/k4ao8472IyeIVEchcmeMqP4zzd4rUAhbpdskd0A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDxw0tr99+n2uny0lXpgmrwLjbFS/C+5aw8RvZ0WsI8owIgR8D/sStYMEsC9hdCTLZGyPWqwjggN74ChxdtXzrGWCY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.1.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":620986},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"5e75b292cc20cfefa3872bd87f627958f3e36225","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.1.3_1790034252871_0.06102570374161398","host":"s3://npm-registry-packages-npm-production"}},"2.1.4":{"name":"apple-tools-mcp","version":"2.1.4","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.1.4","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"aac8f51cb8259137ccaa881d30a0da7d3287f322","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.1.4.tgz","fileCount":32,"integrity":"sha512-Wi0xuvQtm9J+42DQLDg7QWdJm2X5SZ8wOQhbWhz6plkjsmT2Vw9+aoZsmcwRX6DK7ZcOoGKYwk/9OZTnmq0QQQ==","signatures":[{"sig":"MEQCIG/hX7+yCVJAlGqup5IwNin/L8tpCediY8bA6egvrUSYAiBx+ibItWYbk9nwx/qgrbr+hfIWeiR95Z2c+CKFEy+WJw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCnvmscUEDR30MjkPdMCV4UFMrGKv32fUpXpHKrE7OzjgIhAMKwJLdY4hq0XOej5BRyrMjAy6PdX3qmCVRRZZr6WU5Z","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.1.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":622335},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"2fe6b48ce3d86c078c17c47a142701ee9c4ced8f","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.1.4_1790036640861_0.34079996044838134","host":"s3://npm-registry-packages-npm-production"}},"2.1.5":{"name":"apple-tools-mcp","version":"2.1.5","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@2.1.5","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-indexer":"bin/apple-tools-indexer.js"},"dist":{"shasum":"f0825d4f423fe8b04ffe835536c0cb06310c8e17","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-2.1.5.tgz","fileCount":32,"integrity":"sha512-WqvVj6aXwfwqwUttVz0WrpTFK5bEFTkYIcoN+yY1dN1sw0b5MsmApBx54C1DgwaPYhGdRbtMzAJKWYeLH3EgGQ==","signatures":[{"sig":"MEQCIAXjfCYh256Tt3HBZCz430yrEEP2767FgfbGAChSlRyVAiAJaXrk1KzB0KxGfsWkzdEXySa7n8+fqZ3+2LjaliBMPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDmLp0MQrgEP9pwMwgPH65RqThRK2Azmt6b652D7w3F/QIgY8keaa/JsSGko8GygLsgspuIlEkWwmEZgth4mS5Qj7Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@2.1.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":624108},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"f2a5846b531f248e12ffd81c7bb970ee089b63db","scripts":{"perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@xenova/transformers":"^2.17.2","@modelcontextprotocol/sdk":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_2.1.5_1790043150434_0.2995621306891061","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"apple-tools-mcp","version":"3.0.0","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos","streamable-http","remote-mcp","tailscale"],"author":{"name":"Peter Coates"},"license":"MIT","_id":"apple-tools-mcp@3.0.0","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"os":["darwin"],"bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-http":"bin/apple-tools-http.js","apple-tools-indexer":"bin/apple-tools-indexer.js","apple-tools-http-proxy":"bin/apple-tools-http-proxy.js"},"dist":{"shasum":"48af01ed5d0b2b2c64d26fa1efd758c39e98d6a7","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-3.0.0.tgz","fileCount":40,"integrity":"sha512-1N1R1r86jAsYo5R+gwM4F8KoqOEtPTDqu4ZzY5BiqbVfBmct1pMP2hsrYXUFaq1P4sXbls8157OFtB9V+BR31A==","signatures":[{"sig":"MEUCIFeNWeE/zymt4iDAyq2kCKletOe0QMFEq6P0gSQ/t5WfAiEAubO14upZQJ98WOtY8eNotsD1fKt1ADxCiEhHE/UAYd0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHrHhYekwF43mbAF+UGoYR9SYVIruzLzG709FqSFrvHmAiEA97UqseLA+W6VohVfr2smxzkpiWvG3+DcPntOo/h5KEM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@3.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":649718},"main":"index.js","type":"module","engines":{"node":">=18.0.0"},"gitHead":"a9eac32fcb0340f1bc1b2dc8c5f29fc027a62795","scripts":{"http":"node index.js --transport=http","perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","http-token":"node index.js http-token","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts. Speaks stdio (local) or bearer-token-authenticated Streamable HTTP (LAN / Tailscale).","directories":{},"_nodeVersion":"24.20.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@huggingface/transformers":"^4.3.0","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"tmp":"tmp/apple-tools-mcp_3.0.0_1790139958192_0.34273928131315645","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"os":["darwin"],"_id":"apple-tools-mcp@3.0.1","bin":{"apple-tools-mcp":"bin/apple-tools-mcp.js","apple-tools-http":"bin/apple-tools-http.js","apple-tools-indexer":"bin/apple-tools-indexer.js","apple-tools-http-proxy":"bin/apple-tools-http-proxy.js"},"bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"dist":{"shasum":"0a53148e6f8371d9fdf39c870525394fc14156e0","tarball":"https://registry.npmjs.org/apple-tools-mcp/-/apple-tools-mcp-3.0.1.tgz","fileCount":40,"integrity":"sha512-yNSzTekC/M89QQb64N6Kx0Z7POHtn7OpbuM33gF1oyOkfSLkv5JazWuZzGwTsHx5y69HY2G4/YsFQF1UKT1ZuQ==","signatures":[{"sig":"MEUCIGXAqOfp9Q6FeU5wvbW1EJqXgfrMM5F/zV88ndJjVIOfAiEA3J//KOi2tOZ/f8LhAtJAlF8IV0ilWl+R9AHLlQe0HOg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFCG09k64zPphXH2xc27vjFLrCj8LoZi64uleufyyTOoAiEAj1Xbtr/+94ZxQ3odJ7Dq2/hTIZE16fDkX5QjDeQ8kts="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/apple-tools-mcp@3.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":657471},"main":"index.js","name":"apple-tools-mcp","type":"module","author":{"name":"Peter Coates"},"engines":{"node":">=18.0.0"},"gitHead":"88c9966a9ee5f61b9216e440b4a562e645c5a912","license":"MIT","scripts":{"http":"node index.js --transport=http","perf":"vitest run tests/perf","test":"vitest run","audit":"node scripts/audit-index.js","start":"node index.js","indexer":"node index.js --mode=indexer","test:idx":"vitest run tests/indexing","test:unit":"vitest run tests/unit","http-token":"node index.js http-token","perf:dates":"vitest run tests/perf/date-parsing.perf.test.js","perf:quick":"vitest run tests/perf/tools.perf.test.js","test:watch":"vitest","build-index":"node -e \"import('./indexer.js').then(i=>i.rebuildIndex()).catch(e=>{console.error(e.message);process.exit(1)})\"","perf:search":"vitest run tests/perf/search.perf.test.js","perf:stress":"vitest run tests/perf/stress.perf.test.js","permissions":"node index.js permissions","postinstall":"node scripts/postinstall.js","perf:lancedb":"vitest run tests/perf/lancedb.perf.test.js","smoke:writes":"node scripts/smoke-writes.js","perf:indexing":"vitest run tests/perf/indexing.perf.test.js","perf:negative":"vitest run tests/perf/negative.perf.test.js","test:coverage":"vitest run --coverage","test:security":"vitest run tests/indexing/security","perf:embedding":"vitest run tests/perf/embedding.perf.test.js","perf:background":"vitest run tests/perf/background-indexing.perf.test.js","perf:regression":"vitest run tests/perf/regression.perf.test.js","test:integration":"vitest run tests/integration","test:idx:accuracy":"vitest run tests/indexing/accuracy","test:idx:resource":"vitest run tests/indexing/resource"},"version":"3.0.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:df1701e8-00fb-4d2a-a8b7-66d8e243d9bb"}},"homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos","streamable-http","remote-mcp","tailscale"],"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"_npmVersion":"11.19.0","description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts. Speaks stdio (local) or bearer-token-authenticated Streamable HTTP (LAN / Tailscale).","directories":{},"maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"_nodeVersion":"24.21.0","dependencies":{"chrono-node":"^2.9.0","@lancedb/lancedb":"^0.22.3","@huggingface/transformers":"^4.3.0","@modelcontextprotocol/sdk":"^1.30.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"^2.1.0","fast-check":"^3.22.0","@vitest/coverage-v8":"^2.1.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/apple-tools-mcp_3.0.1_1790223905980_0.5772678161974885"}}},"time":{"created":"2025-12-07T01:31:49.208Z","modified":"2026-09-24T04:25:06.406Z","1.0.0":"2025-12-07T01:31:49.387Z","1.1.0":"2026-08-30T16:29:01.957Z","1.1.1":"2026-09-02T05:02:33.930Z","1.1.2":"2026-09-04T07:29:51.153Z","1.1.3":"2026-09-04T16:05:20.729Z","1.1.4":"2026-09-08T22:36:29.629Z","1.2.0":"2026-09-15T22:22:11.254Z","1.2.1":"2026-09-16T00:55:17.932Z","2.0.0":"2026-09-20T14:14:25.740Z","2.0.1":"2026-09-20T16:08:28.651Z","2.0.2":"2026-09-21T02:39:47.306Z","2.0.3":"2026-09-21T03:08:26.962Z","2.0.4":"2026-09-21T04:35:58.027Z","2.0.5":"2026-09-21T04:59:06.842Z","2.0.6":"2026-09-21T05:15:18.537Z","2.0.7":"2026-09-21T12:48:04.989Z","2.0.8":"2026-09-21T14:07:31.531Z","2.0.9":"2026-09-21T14:23:55.721Z","2.0.10":"2026-09-21T15:43:50.404Z","2.1.0":"2026-09-21T17:50:43.565Z","2.1.1":"2026-09-21T19:39:36.499Z","2.1.2":"2026-09-21T20:21:26.025Z","2.1.3":"2026-09-21T23:44:12.967Z","2.1.4":"2026-09-22T00:24:00.965Z","2.1.5":"2026-09-22T02:12:30.536Z","3.0.0":"2026-09-23T05:05:58.275Z","3.0.1":"2026-09-24T04:25:06.085Z"},"bugs":{"url":"https://github.com/sfls1397/Apple-Tools-MCP/issues"},"author":{"name":"Peter Coates"},"license":"MIT","homepage":"https://github.com/sfls1397/Apple-Tools-MCP#readme","keywords":["mcp","model-context-protocol","apple","mail","email","calendar","messages","imessage","semantic-search","macos","streamable-http","remote-mcp","tailscale"],"repository":{"url":"git+https://github.com/sfls1397/Apple-Tools-MCP.git","type":"git"},"description":"MCP server for semantic search and write actions across Apple Mail, Messages, Calendar, and Contacts. Speaks stdio (local) or bearer-token-authenticated Streamable HTTP (LAN / Tailscale).","maintainers":[{"name":"matetraysoft","email":"boom.waste.deal@usecloaked.com"}],"readme":"# apple-tools-mcp\n\nAn MCP (Model Context Protocol) server for Apple Mail, Messages, Calendar, and Contacts on macOS. Search them with natural language, and — as of 2.0.0 — write to them: send mail and messages, manage calendar events, and manage contacts. Works with any compatible MCP client over stdio.\n\n## Features\n\n- **Semantic Search**: Find emails, messages, and events using natural language queries\n- **Write Tools (2.0.0)**: Send/reply/forward/draft mail, mark read, archive, trash; send iMessage/SMS; create, edit, remove, and RSVP to calendar events; create, edit, and remove contacts\n- **Safe by Default**: Deletes and multi-recipient sends never run without `confirm`, and every write supports `dry_run`\n- **Vector Indexing**: Uses LanceDB for fast similarity search with local embeddings\n- **Privacy-First**: All processing happens locally on your Mac - no data leaves your machine\n- **Smart Deduplication**: Handles IMAP duplicates, prioritizing INBOX over Junk/Trash\n- **Date Intelligence**: Understands queries like \"last week\", \"yesterday\", \"March 2024\"\n\n## Requirements\n\n- **macOS** (Ventura 13.0 or later recommended)\n- **Node.js** 18.0 or later\n- **Full Disk Access** permission for the Node.js binary\n\n## Installation\n\n### 1. Install the package\n\n```bash\nnpm install -g apple-tools-mcp\n```\n\nOr from source:\n\n```bash\ngit clone https://github.com/sfls1397/Apple-Tools-MCP.git\ncd Apple-Tools-MCP\nnpm install\n```\n\nIf you installed from source, point your MCP client at the local `index.js` instead of `npx` in step 3:\n\n```json\n\"command\": \"node\",\n\"args\": [\"/absolute/path/to/Apple-Tools-MCP/index.js\"]\n```\n\n**Mac Mini** stays on a **global npm** install (`npm install -g apple-tools-mcp`) — no git clone on Mini. **MacBook / development** uses the clone above.\n\nAfter **first install** and after **upgrade** (when write tools are present or change), run the permissions command once on the host UI before using write tools — see [step 2b](#2b-grant-automation-for-write-tools-first-run--ship-gate).\n\n### 2. Grant Full Disk Access\n\nThe MCP server needs access to read your Mail, Messages, and Calendar databases.\n\n1. First, find your Node.js path by running in Terminal:\n\n   ```bash\n   which node\n   ```\n\n   This will output something like `/opt/homebrew/bin/node` or `/usr/local/bin/node`\n\n2. Open **System Settings** → **Privacy & Security** → **Full Disk Access**\n\n3. Click the **+** button\n\n4. Press **Cmd+Shift+G** to open the \"Go to Folder\" dialog\n\n5. Paste the path from step 1 (e.g., `/opt/homebrew/bin/node`) and press Enter\n\n6. Select the `node` file and click **Open**\n\n7. Ensure the toggle for Node.js is enabled\n\nFull Disk Access covers the **read** tools. Write tools need the automation permissions below.\n\n### 2b. Grant Automation for write tools (first run / ship-gate)\n\nWrite tools drive Mail, Messages, Calendar, and Contacts through AppleScript. macOS gates those Apple events behind **Automation**, not by adding `node` to the Contacts or Calendars privacy lists.\n\n#### First install and upgrade: `apple-tools-mcp permissions`\n\nRun this **after first global install** and **after upgrade** when write surfaces are present or change. It probes **`process.execPath`** (the `node` running the command) so macOS can pop **Allow** dialogs for Contacts, Calendar, Mail, Messages, and System Events in one sitting. You click **Allow**; the command cannot grant silently. Already-granted surfaces report OK without another click. Missing grants print a report and the process **exits non-zero** (fail closed).\n\nUse the **same `node` the product uses** — not the MCP host app. Always invoke so **`process.execPath`** is that node. A bare `apple-tools-mcp` (or a path like `~/.nvm/versions/node/v22.21.1/bin/apple-tools-mcp`) can have a shebang that starts a **different** node; Allow dialogs attach to `execPath`, not the CLI path you typed.\n\n```bash\n# Preferred: execPath matches the product node\n$(which node) $(which apple-tools-mcp) permissions\n\n# After `npm install -g apple-tools-mcp` on that node (same idea):\nnode \"$(dirname \"$(which node)\")/../lib/node_modules/apple-tools-mcp/index.js\" permissions\nnpx apple-tools-mcp permissions\n\n# From a clone:\nnpm run permissions\n```\n\nIf the invoked CLI path and `process.execPath` differ, the command prints a **WARN** with both paths and tells you to re-run as `execPath …/apple-tools-mcp permissions`. The command also prints the binary it is probing. Host examples (not universal paths):\n\n- **Mini:** `/Users/petercoates/.local/node/bin/node` (global npm / indexer LaunchAgent)\n- **MacBook:** `/Users/petercoates/.nvm/versions/node/v22.21.1/bin/node` (Claude’s nvm `node`, **not** Homebrew)\n\n**MacBook (default for `permissions`):** run from **Terminal.app**. Click **Allow** for the **printed `process.execPath`**. Confirm **System Settings → Privacy & Security → Automation** for that node → Contacts, Calendar, Mail, Messages, and System Events. Do **not** start `apple-tools-indexer` — the always-on indexer / write bridge is a **Mini** install only.\n\n**Mini:** use the [Mini ship-gate](#mini-ship-gate-host-setup) path (LaunchAgent-owned node / `writer.sock`). Missing-grant copy mentions the write bridge only when that socket is present.\n\nOn the host UI (Mini Screen Sharing or MacBook local), open **System Settings → Privacy & Security → Automation**, then run the command. Click **Allow** for **`node`** → Contacts, Calendar, Mail, Messages, and System Events. npm `postinstall` only **prints a reminder** — it does not run the probes unattended.\n\nThis is a real Apple Events pass: Mail uses `make new outgoing message` (compose then discard; nothing is sent). Messages enumerates accounts (nothing is sent). `dry_run` of `mail_send` / `messages_send` never talks to those apps and **does not count**. Contacts creates and deletes a throwaway person in-script. Calendar lists calendars only (no leftover events). System Events is probed with **process / GUI scripting** (`tell process` + `unix id` of System Events; nothing is typed) so the keystroke compose path can pop **Allow** and verify a real Automation grant. A soft `tell application \"System Events\" to get name` is **not** enough — that can succeed while TCC still has node → System Events **denied**. If a prior **Don't Allow** left a sticky Deny, `permissions` reports System Events **missing** and exits non-zero: turn **System Events** on for that node in System Settings → Privacy & Security → **Automation**, then **re-run `apple-tools-mcp permissions` after Allow**.\n\n**One-pass first-run:** Allow **`node`** to control **Mail**, **Messages**, **Contacts**, **Calendar**, and **System Events** in the same Automation pass. Contacts or Calendar being allowed does **not** grant Mail, Messages, or System Events — they are separate Apple Events targets. A denied Mail grant hangs `mail_send` / `mail_draft` / `mail_reply` / `mail_forward` until the client disconnects; `dry_run` never talks to Mail, so that deny is invisible until a real compose.\n\n**Do not add `node` via the + button in System Settings → Privacy & Security → Contacts or Calendars.** On current macOS those panes often have **no Add button**, and that instruction is not the ship-gate setup — it failed on the Mini.\n\n#### Mini ship-gate host setup\n\nThis is the first-run flow for Mail, Messages, Contacts, and Calendar **writes** on the Mac Mini. Do it on the Mini UI (or Screen Sharing to Mini), with the indexer LaunchAgent owning `node`:\n\n1. Open **System Settings → Privacy & Security → Automation**.\n2. Run write prove-out with the **indexer LaunchAgent** owning `node` (`~/.apple-tools-mcp/writer.sock` / launchd). Against the tip, with the LaunchAgent up:\n\n   ```bash\n   npm run smoke:writes -- --apply\n   ```\n\n   That is the ship-gate context. An embedded agent shell, IDE terminal, or MCP host app subprocess is **not** the ship-gate host unless the write bridge is up and the work executes inside launchd-owned `node`.\n3. When prompts appear, click **Allow** for **`node`** to control **Mail**, **Messages**, **Contacts**, **Calendar**, and **System Events** (needed for `mail_send` / `mail_draft` keystrokes under the LaunchAgent). Watch the host — Allow **`node`** (the LaunchAgent binary), not any other app. Use whatever path the LaunchAgent plist / `which node` reports — `/Users/petercoates/.local/node/bin/node` is a Mini *example* only, not a universal path. Do **not** approve the MCP client / host app that launched a short-lived stdio server.\n4. **Keep Contacts, Mail, and Messages running** on the write host (leave the apps open; do not quit them). Cold `tell application \"Contacts\"` under launchd often fails with `-600` / “application isn't running” instead of auto-launching — that is **not** an Automation deny. The write path launches Contacts.app before CRUD, but write reliability still requires those three apps to stay running. **Calendar does not need to stay open** (Calendar writes go through EventKit).\n5. **Full Disk Access** on `node` is a separate grant and covers **reads** (Mail / Messages / Calendar / AddressBook databases). Write tools need the Automation / Apple Events grants to Mail.app (`mail_send`, `mail_draft`, `mail_reply`, `mail_forward`, and the other mail writes), Messages.app (`messages_send`), Contacts.app, and Calendar.app.\n6. npm Trusted Publisher / publish tokens are unrelated to TCC. Do not confuse them with this setup.\n\nIf you dismissed a prompt, re-open **Automation** and turn the **node → Mail** / **node → Messages** / **node → Contacts** / **node → Calendar** toggles back on. `tccutil reset AppleEvents` re-arms the Automation prompt so you can Allow **`node`** again. Do not use `tccutil reset AddressBook` / `tccutil reset Calendar`, and do not add `node` via Settings **+** into the Contacts or Calendars privacy lists — those panes often have no Add button, and that is not how this ship gate is granted.\n\n#### `dry_run` does not prove Mail Automation\n\n`mail_send` / `mail_draft` / `mail_reply` / `mail_forward` with `dry_run=true` return immediately and never send Apple events to Mail — dry_run never talks to Mail. A TCC deny for **node → Mail** is therefore invisible until a real compose (`make new outgoing message`). The hang is **Automation denied**, not “Mail.app could not be reached” / “app not available”.\n\n`tell application \"Mail\" to get name` can succeed while compose still hangs. The smoke test’s Mail step runs that real compose (then discards the outgoing message, or on an older daemon saves a clearly named Draft) so the deny fails **setup**, not a later production `mail_send`. The same Allow-via-prompt applies to **Messages** for `messages_send`; `messages_send` with `dry_run=true` likewise never talks to Messages.app. Smoke also live-enumerates Messages accounts (nothing is sent). **`--apply` fails closed if Mail, Messages, Contacts, or Calendar Automation is missing.**\n\n#### Which process macOS is actually asking about\n\nThis is the part that decides whether writes work on your setup. macOS attributes an Apple event to the **responsible process**, not to whichever binary sent it. When an MCP client launches this server over stdio, the *client app* is responsible for everything node does — so the grant that matters belongs to the host app, not to node.\n\n#### Reads and writes are different mechanisms\n\nWorth separating, because they fail for different reasons and have different fixes. This applies to **both** Contacts and Calendar:\n\n| | **Reads** (`contacts_search`, `contacts_lookup`, `calendar_date`, `calendar_free_time`, indexing) | **Writes** (`contacts_add/edit/remove`, `calendar_add/edit/remove/rsvp`) |\n|---|---|---|\n| How | sqlite query straight against `AddressBook-v22.abcddb` / `Calendar.sqlitedb` | Contacts.app (`CNContactStore`) / Calendar.app (EventKit) |\n| Gated by | **Full Disk Access** on the responsible process | The **AddressBook** / **calendars** privacy classes, which require the host to hold `com.apple.security.personal-information.addressbook` / `…​.calendars` |\n| Typical failure | `EPERM` / \"unable to open database\" | denial with **no prompt at all** |\n| Fix | grant FDA to the responsible process | run the write where node is the responsible process |\n\nSo an `EPERM` reading `~/Library/Application Support/AddressBook/Sources/…` is almost always a Full Disk Access or attribution problem — **not** evidence of the entitlement gap. The server labels it that way in its logs so the two do not get conflated.\n\nThe entitlement gap bites on the **write** path: **a host app that cannot be granted Contacts or Calendars access blocks that CRUD no matter what node is allowed to do.**\n\nClaude Desktop is the documented example. A `codesign` dump of the shipped app shows it carries **neither** personal-information entitlement — the only ones present are location and photos-library:\n\n```bash\ncodesign -d --entitlements - /Applications/Claude.app 2>/dev/null | grep personal-information\n# no com.apple.security.personal-information.addressbook\n# no com.apple.security.personal-information.calendars\n```\n\nUnder hardened runtime that means macOS denies AddressBook and Calendars access to anything Claude.app is responsible for, silently and without a prompt. It is a property of the host application: not a Full Disk Access problem, not a `tccutil` problem, and not something this package can patch, since one vendor cannot add entitlements to another vendor's signed app — no re-sign of Claude.app is proposed or required.\n\n**So: Claude Desktop Contacts *and* Calendar CRUD are unsupported host limitations, not package defects.** The ship gate for both is the **Node host — Mini with Full Disk Access** (plus any Automation grants), which is exactly what the write bridge below makes available to every client.\n\n#### The fix: let the indexer daemon own the writes\n\nThe **indexer daemon** is started by launchd, so node is the responsible process for its Apple events and macOS can grant AddressBook and Calendars access to node directly.\n\nFrom 2.0.0, the daemon therefore doubles as a **write bridge**. When it is running, any MCP stdio process hands privacy-gated writes to it over a user-only unix socket at `~/.apple-tools-mcp/writer.sock` (mode 0600, inside your 0700 app directory — local only, nothing on the network). The daemon performs the write under its own TCC identity and returns what happened.\n\nSo the supported configuration for writes is: **run the indexer daemon** ([LaunchAgent setup below](#always-on-indexer-mac-mini-launchagent)) on the Mac that owns the data. Then:\n\n| Host | Reads (incl. Contacts + Calendar) | Mail / Messages writes | Calendar CRUD | Contacts CRUD |\n|------|-----------------------------------|------------------------|---------------|----------------|\n| Node host: indexer daemon or `node index.js` from a terminal | Yes (FDA on node) | Yes | **Yes — ship gate host** | **Yes — ship gate host** |\n| Any stdio client **with the daemon running** | Yes | Yes (via the bridge) | Yes (via the bridge) | Yes (via the bridge) |\n| Claude Desktop, **no daemon running** | Yes — reads are sqlite + FDA, unaffected by the entitlements | Yes, if Claude is granted Automation for Mail/Messages | **No — host limitation** (no calendars entitlement) | **No — host limitation** (no addressbook entitlement) |\n\nIf a write is denied and no write-bridge socket is listening, the tool uses **Terminal.app + printed `process.execPath` Automation** copy — it does **not** tell MacBook users to start `apple-tools-indexer`. On Mini, when `writer.sock` is up, missing-grant copy may mention the LaunchAgent / write bridge. Contacts and Calendar denials each name their own privacy class and note that reads are unaffected.\n\n#### Verifying Mail Automation plus Contacts and Calendar CRUD on a Node host\n\nThe smoke test drives writes through **the same dispatcher the MCP tools use**, so when the write bridge is up the work executes inside the indexer daemon. That matters: the thing being proven is the shipping path, not the Automation rights of whatever shell you happened to type the command into.\n\n**Ship-gate procedure (Mini):** do this after the [Automation first-run](#2b-grant-automation-for-write-tools-first-run--ship-gate) above. The LaunchAgent must own `node`; an embedded agent shell, IDE terminal, or MCP host app subprocess is not the ship-gate host.\n\n1. **Make sure the indexer LaunchAgent is running**, so the bridge is listening:\n\n   ```bash\n   pgrep -fl apple-tools-indexer\n   ls -l ~/.apple-tools-mcp/writer.sock\n   ```\n\n2. **Check out the tip / unpack the tarball** you are gating, in a short-lived directory. The global install stays untouched.\n\n3. **Dry run first.** It creates, edits, and deletes nothing on Contacts/Calendar — but it is not a no-op: it reads your contacts from the AddressBook database, calls `calendar_list_calendars` (a **live Calendar.app query and therefore a real TCC touch**), runs a **live Mail compose** (`make new outgoing message`) because `mail_send` `dry_run` never touches Mail, and live-enumerates **Messages** accounts because `messages_send` `dry_run` never touches Messages. A refused Calendar listing, Mail compose, or Messages lookup is `WARN` on a dry run. `--apply` fails closed if **Mail, Messages, Contacts, or Calendar** Automation is still denied.\n\n   ```bash\n   npm run smoke:writes\n   ```\n\n4. **Prove real CRUD.** This creates a clearly-named test contact and a test event roughly a year out, edits each, and deletes both again:\n\n   ```bash\n   node scripts/smoke-writes.js --apply                  # first writable calendar\n   node scripts/smoke-writes.js --apply --calendar=Work  # pick the calendar\n   node scripts/smoke-writes.js --apply --keep           # leave the test items behind\n   ```\n\nThe header prints the write path it chose (`indexer daemon via write bridge` or `in this process`), and the read path (sqlite + FDA) is reported separately from the write paths (Mail.app compose, Contacts.app, Calendar.app), so a failure tells you which mechanism refused. A Mail **compose-probe** hang is **TCC / Automation denied**, not “app not available”. A `mail_send` / `mail_reply` / `mail_forward` hang after `send` is a **timeout** (`ETIMEDOUT` / `-1712`) unless Mail reports `-1743` / `-10004`; check Sent before retrying.\n\n**The parent process matters.** With `--apply` and **no bridge listening**, the smoke test **refuses to run** rather than executing in-process and calling the result a package failure. Running it from an embedded agent shell, an IDE terminal, or a host app's subprocess is *not* the ship-gate context on its own, because macOS attributes the Apple events to that parent. Either start the LaunchAgent (preferred, and what production clients use), or run it from **Terminal.app**, where node is the responsible process, and pass `--allow-local` to acknowledge that:\n\n```bash\nnode scripts/smoke-writes.js --apply --allow-local   # only from Terminal.app / launchd\n```\n\nExpected results: **PASS on the Node host with the bridge up — this is the ship gate for Mail, Messages, Contacts, and Calendar writes.** `--apply` fails closed if any of those four Automation grants is missing. On Claude Desktop with no daemon running, Contacts and Calendar CRUD are both expected to fail; that is the documented host limitation above, not a regression. Mail and Messages still need their own **node → Mail** / **node → Messages** grants; a Contacts/Calendar grant does not cover them.\n\n### 3. Configure your MCP client\n\nThis server speaks MCP over **stdio**. Any compatible client can run it — Claude Desktop is one example, not the only one. Other stdio MCP clients work the same way: register the command below in that client's MCP settings.\n\n**Command**\n\n- `npx` with args `[\"-y\", \"apple-tools-mcp\"]` (npm install)\n- or `node` with args `[\"/absolute/path/to/Apple-Tools-MCP/index.js\"]` (from source)\n\n**Example: Claude Desktop**\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"apple-tools\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"apple-tools-mcp\"]\n    }\n  }\n}\n```\n\nOther clients use their own settings UI or config file. Use the same `command` and `args`; only the file path or UI differs.\n\nMCP clients are **short-lived stdio** processes: they exit when the client closes stdin. Always-on indexing belongs on the **indexer daemon**, not a sleep-pipe wrapper around this binary.\n\n### 4. Restart your MCP client\n\nQuit and reopen the client so it loads the server. For Claude Desktop, fully quit (Cmd+Q) and reopen.\n\n## Building the Index\n\nOn first use, a vector index of your emails, messages, and calendar events is built automatically. Email history is unlimited by default. This may take a while depending on the volume of data.\n\n**Who indexes**\n\n- **Indexer daemon running** (recommended on Mac Mini): the daemon owns `~/.apple-tools-mcp/indexer.lock` and refreshes `~/.apple-tools-mcp/vector-index/`. MCP stdio clients only search; they do not start background refresh.\n- **No daemon** (default MacBook / Claude Desktop / Cursor): the MCP stdio process indexes **locally on startup**, same as previous versions, then exits when the client disconnects.\n\nYou can manually rebuild the index (stop the indexer daemon first if it is running, so it is not writing at the same time):\n\n```bash\n# Index all email history (default)\nnpm run build-index\n\n# Optional: cap email lookback (e.g. for a faster test rebuild)\nAPPLE_TOOLS_INDEX_DAYS_BACK=30 npm run build-index\n```\n\nThe index is stored in `~/.apple-tools-mcp/vector-index/`.\n\n## Index refresh interval\n\nResolved **once at process start**. Precedence (highest wins):\n\n1. `INDEX_INTERVAL_MS` environment variable (milliseconds or human form: `30s`, `1m`, `5m`, `1h`)\n2. `~/.apple-tools-mcp/config.json` keys `indexInterval` or `indexIntervalMs`\n3. Product default: **5 minutes** (`300000` ms) — typical MacBook / MCP local-fallback\n\nValues are **clamped** to **15 seconds** minimum and **6 hours** maximum. Invalid JSON, unknown keys, and unparseable intervals are logged and ignored (the process does not crash). The effective interval is logged at start, for example:\n\n```text\nEffective index refresh interval: 1m (60000 ms) [source=config]\n```\n\nA warn line is also logged when clamping occurs.\n\n### Example `~/.apple-tools-mcp/config.json` (Mac Mini)\n\nRecommended Mini always-on interval is **1 minute**. 30 seconds is allowed (at or above the 15s floor).\n\n```json\n{\n  \"indexInterval\": \"1m\"\n}\n```\n\nEquivalent: `\"indexIntervalMs\": 60000`, or `INDEX_INTERVAL_MS=60000` (env overrides the file).\n\nMissing `config.json` is fine — env then the 5-minute default apply.\n\n## Always-on indexer (Mac Mini LaunchAgent)\n\nOn Mini, run the **indexer daemon**, not a sleep-pipe wrapper around `apple-tools-mcp`. Claude Desktop and other clients still attach via short-lived stdio MCP (`npx -y apple-tools-mcp` or the global `apple-tools-mcp` bin).\n\nThe daemon does two jobs: it refreshes the vector index, and it serves the **write bridge** at `~/.apple-tools-mcp/writer.sock` so stdio clients can perform Mail / Messages / Contacts / Calendar writes that their host app cannot be granted (see [step 2b](#2b-grant-automation-for-write-tools-first-run--ship-gate)). When macOS prompts, Allow **`node`** (the LaunchAgent binary) to control Mail.app, Messages.app, Contacts.app, Calendar.app, **and System Events** (mail_send / mail_draft fill the body via AX hit-test). Do not approve the MCP client / host app that launched a short-lived stdio server, and do not try to add `node` via **+** in the Contacts or Calendars privacy lists.\n\n**Keep Contacts.app, Mail.app, and Messages.app running all the time** on the Mini (and on any MacBook that does local writes). Quitting them makes Apple Events to those apps unreliable (`-600` / “application isn't running”), which is a cold-launch miss — not a missing Automation grant. The Contacts write path launches Contacts.app before add/edit/remove, but do not rely on that instead of leaving the apps open. **Calendar.app does not need to stay open**; Calendar writes use EventKit.\n\nThe indexer does **not** post product Notification Center / `display notification` / UserNotifications toasts. `Apple Tools MCP indexer running` is a **stderr** line only (the plist redirects it to a file). That does **not** silence macOS Background Items or “running in the background” notices for `node` / the LaunchAgent — those are OS notices, and this package does not suppress them. It also does not suppress OS Allow dialogs. The [permissions command](#2b-grant-automation-for-write-tools-first-run--ship-gate) still needs those dialogs.\n\nThe bridge is created before the daemon touches the vector index, so writes stay available even when the index is missing, locked, or mid-rebuild. Confirm it after an upgrade with `ls -l ~/.apple-tools-mcp/writer.sock` (it should be a `srw-------` socket); the daemon removes it on shutdown.\n\n**Entrypoint:** `node index.js --mode=indexer`  \n**Convenience bin:** `apple-tools-indexer` (`bin/apple-tools-indexer.js`; npm global install provides it)  \n**npm script (clone only):** `npm run indexer`  \n**One-shot rebuild:** `npm run build-index` (stop the indexer daemon first)\n\nLaunchAgent should invoke **node + `--mode=indexer`** on the **global** package (Mini has no git clone). LaunchAgent does not inherit your shell `PATH`, so use absolute paths from `which node` and `npm root -g`.\n\n```bash\nwhich node\n# Use this path (and the LaunchAgent plist). Examples only — not universal:\n#   Mini ship-gate host: /Users/petercoates/.local/node/bin/node\n#   Apple Silicon Homebrew: /opt/homebrew/bin/node\n#   Intel Homebrew / usr/local: /usr/local/bin/node\n\nnpm root -g\n# Example: /opt/homebrew/lib/node_modules\n```\n\nExample `~/Library/LaunchAgents/com.apple-tools-mcp.indexer.plist`:\n\n```xml\n<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n  <key>Label</key>\n  <string>com.apple-tools-mcp.indexer</string>\n  <key>ProgramArguments</key>\n  <array>\n    <string>/opt/homebrew/bin/node</string>\n    <string>/opt/homebrew/lib/node_modules/apple-tools-mcp/index.js</string>\n    <string>--mode=indexer</string>\n  </array>\n  <key>RunAtLoad</key>\n  <true/>\n  <key>KeepAlive</key>\n  <true/>\n  <key>EnvironmentVariables</key>\n  <dict>\n    <key>PATH</key>\n    <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>\n  </dict>\n  <key>StandardOutPath</key>\n  <string>/tmp/apple-tools-indexer.out.log</string>\n  <key>StandardErrorPath</key>\n  <string>/tmp/apple-tools-indexer.err.log</string>\n</dict>\n</plist>\n```\n\nReplace the node and `node_modules` paths with the values from `which node` and `npm root -g`. Load it with:\n\n```bash\nlaunchctl load ~/Library/LaunchAgents/com.apple-tools-mcp.indexer.plist\n```\n\nKeepAlive belongs on this indexer job only — not on the MCP stdio process.\n\n## Remote HTTP transport (v3.0.0)\n\nEvery tool the stdio server exposes — including the write tools — is also\navailable over **Streamable HTTP**, so it's reachable from other machines,\nnot just whatever process spawned it locally. This is additive: stdio still\nworks exactly as before for local same-machine MCP clients that spawn it\ndirectly. The intended MacBook clients are Claude Desktop, Claude Code,\nCodex Desktop, and ChatGPT Desktop. Claude Desktop uses the included local\nHTTP-to-stdio proxy; Claude Code and Codex connect to the Mini's HTTP\nendpoint directly. ChatGPT Desktop does not currently support this private\nMCP connection; see the client guide for its provider-supported options.\n\nBecause HTTP reaches beyond \"whoever spawned this process,\" which stdio's\ntrust model relies on, **every HTTP request needs a bearer token.** stdio\nhas no equivalent check — a locally spawned child process is already\ntrusted by whoever spawned it.\n\n**Entrypoint:** `node index.js --transport=http`  \n**Convenience bin:** `apple-tools-http` (`bin/apple-tools-http.js`; npm global install provides it)  \n**npm script (clone only):** `npm run http`\n\n### Auth token\n\nThe token is a random secret generated on first run and stored in the\nmacOS Keychain (service `apple-tools-mcp-http`) — never in a config file,\nthe server's config file, or logs after the one-time generation banner.\nThere's no external account and no cost; it's a self-issued password,\nlike an SSH key.\n\n```bash\napple-tools-mcp http-token   # prints the token, generating one first if needed\n```\n\nClients send it as `Authorization: Bearer <token>`. Rotate it by deleting\nthe Keychain item and restarting the server (it generates a fresh one on\nthe next run), then update every client using the old value.\n\n### Config\n\n`~/.apple-tools-mcp/config.json` (same file the index interval uses):\n\n```json\n{\n  \"httpHost\": \"127.0.0.1\",\n  \"httpPort\": 8421\n}\n```\n\nEnv overrides: `APPLE_TOOLS_HTTP_HOST`, `APPLE_TOOLS_HTTP_PORT`. The default\nhost is `127.0.0.1`, so HTTP is local-only until you explicitly set a network\naddress such as `0.0.0.0`. Default port is 8421 (the indexer's stdio process\nneeds no port; this is only for `--transport=http`). For remote access, use a\nTailscale address for clients that connect directly from your tailnet, or\nput the server behind a TLS-terminating reverse proxy. Do not send the\nbearer token over an untrusted LAN. Cloud-hosted connectors need a separate\nway to reach the server; a private Tailscale address alone is insufficient.\n\n### LaunchAgent\n\nSee `examples/com.apple-tools-http.plist` (copy to\n`~/Library/LaunchAgents/`, replace the `REPLACE_ME*` placeholders the same\nway as the indexer plist above, then `launchctl load` it). Runs alongside\nthe indexer LaunchAgent, not instead of it — the HTTP server is a second,\nindependent process.\n\n### Wiring up clients\n\nSee `examples/mcp-client.md` for the MacBook setup. Short version:\n\n- **On the Mini:** set `httpHost` to its LAN or Tailscale IP and restart the HTTP server. Retrieve the bearer token with `apple-tools-mcp http-token`.\n- **Claude Desktop on the MacBook:** configure the included `apple-tools-http-proxy` as a local MCP server. It forwards tool calls to the Mini over HTTP.\n- **Claude Code and Codex Desktop on the MacBook:** add `http://<mini-address>:8421/mcp` and the token. The client guide has commands for both.\n- **ChatGPT Desktop on the MacBook:** current custom MCP support does not provide a direct private HTTP connection in the desktop app. The client guide describes the documented ChatGPT web route.\n- **Claude / ChatGPT cloud connectors:** a connector does not connect from your device's tailnet interface. [Claude requires a publicly reachable server](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp); [ChatGPT directs private-network servers to Secure MCP Tunnel and currently supports MCP apps on web only](https://help.openai.com/en/articles/12584461-developer-mode-and-mcp-apps-in-chatgpt). Use the provider's supported network setup before adding this server as a cloud connector.\n\n## Available Tools\n\nOnce configured, your MCP client can use these tools:\n\n### Universal Search\n\n| Tool | Description |\n|------|-------------|\n| `smart_search` | Intelligent search across all sources - automatically determines which to search |\n| `person_search` | Find ALL communication with a person across Mail, Messages, and Calendar |\n\n### Email Tools\n\n| Tool | Description |\n|------|-------------|\n| `mail_search` | Semantic search for emails with filters (sender, recipient, attachments, mailbox) |\n| `mail_recent` | Get most recent emails (supports unread filter) |\n| `mail_date` | Get emails from a specific date (\"today\", \"yesterday\", \"Nov 13\") |\n| `mail_read` | Read full email content by file path |\n| `mail_senders` | List most frequent email senders |\n| `mail_thread` | Get all emails in a conversation thread |\n\n### Messages Tools\n\n| Tool | Description |\n|------|-------------|\n| `messages_search` | Semantic search for iMessages/SMS with filters |\n| `messages_recent` | Get most recent messages |\n| `messages_conversation` | Get full conversation history with a contact |\n| `messages_contacts` | List all contacts you've messaged |\n\n### Calendar Tools\n\n| Tool | Description |\n|------|-------------|\n| `calendar_search` | Semantic search for events with filters |\n| `calendar_date` | Get events on a specific date (live Calendar.app, not the search index) |\n| `calendar_upcoming` | Get next N upcoming events |\n| `calendar_week` | Get all events for current or future week |\n| `calendar_free_time` | Find available time slots on a date (live Calendar.app, not the search index) |\n| `calendar_recurring` | List recurring events |\n\n### Contacts Tools\n\n| Tool | Description |\n|------|-------------|\n| `contacts_search` | Search contacts by name, email, phone, or organization |\n| `contacts_lookup` | Look up a specific contact's full details |\n\n### Admin Tools\n\n| Tool | Description |\n|------|-------------|\n| `rebuild_index` | Rebuild search index for one or all sources |\n| `audit_index` | Audit index health and coverage |\n\n## Write Tools (2.0.0)\n\nWrite tools change your data. They do not use the vector index, so they keep working while the indexer daemon holds the lock.\n\nTwo arguments are available on **every** write tool:\n\n| Argument | Type | Meaning |\n|----------|------|---------|\n| `dry_run` | boolean | Preview only. Reports what *would* happen and changes nothing. Always wins, even together with `confirm`. |\n| `confirm` | boolean | Approves an action that is otherwise blocked (deletes, multi-recipient sends). |\n\n### Confirm / dry-run rules\n\n- **Deletes always need `confirm: true`** — `mail_trash`, `calendar_remove`, `contacts_remove`, and `contacts_edit` when it clears every email or phone. Without it the call returns a `CONFIRMATION REQUIRED` preview and changes nothing. There is no bulk delete tool and no silent mass delete: one id per call.\n- **Multi-recipient sends always need `confirm: true`** — `mail_send` / `mail_forward` when `to` + `cc` + `bcc` total more than one address, `mail_reply` with `reply_all: true`, and `messages_send` to multiple handles or to a group chat. A single-recipient send runs on the first call.\n- **`mail_draft` is exempt from the recipient rule** because a draft is never delivered.\n- **`dry_run` and confirm-blocked calls are not deliveries.** Planned writes return `ok: false`, `planned: true`, `delivered: false`, and MCP sets `isError: true`, so a client that only checks `isError` cannot treat a preview as sent. The text is `DRY RUN` / `CONFIRMATION REQUIRED` and never `verified in Sent`. Re-run with `dry_run=false` (and `confirm=true` when required) to actually send.\n- Responses name what happened (tool, ids, recipients, titles) and never echo message bodies — including on the error path.\n- Writes never invent data. A missing or malformed `message_id`, `event_id`, `contact_id`, `chat_id`, or recipient is refused with a message saying so. Calendar times must be explicit local datetimes (`YYYY-MM-DD HH:MM`); natural language such as \"next Tuesday\" is rejected for writes.\n\n### Mail write tools\n\n| Tool | Arguments | Confirm rule |\n|------|-----------|--------------|\n| `mail_send` | `to[]` (required), `cc[]`, `bcc[]`, `subject` (required), `body` (required), `body_format` (`plain` \\| `html`) | `confirm` when total recipients > 1 |\n| `mail_draft` | `to[]` (required), `cc[]`, `bcc[]`, `subject`, `body`, `body_format` | none (saved to Drafts, not sent) |\n| `mail_reply` | `message_id` or `file_path`, `body` (required), `reply_all`, `save_as_draft` | `confirm` when `reply_all: true` |\n| `mail_forward` | `message_id` or `file_path`, `to[]` (required), `body`, `save_as_draft` | `confirm` when recipients > 1 |\n| `mail_mark` | `message_id` or `file_path`, `status` (`read` \\| `unread`, default `read`) | none |\n| `mail_archive` | `message_id` or `file_path` | none |\n| `mail_trash` | `message_id` or `file_path` | **`confirm` required** |\n\n`body_format: \"html\"` uses the same compose path with a tag-stripped body pasted into Mail's native editor. It does **not** set Mail's `content` or `html content` — those setters cite-wrap the whole message (`>` prefixes and `<blockquote type=\"cite\">`, same iOS purple bar). Mail may still generate its own HTML alternative from the native compose. The default is plain text.\n\n**Compose is not quoted.** `mail_send` / `mail_draft` (plain and html) call `make new outgoing message` **without** AppleScript `content:` so `newMessage` is a real Mail object, then paste the body into the compose window (exact subject title, role `AXWebArea`, proven focus, Cmd-A + clipboard). Mail's `mailto` command was shipped in 2.0.4 and **fails on Mini/MacBook Mail**: it does not return an outgoing message (`newMessage` undefined, AppleScript **-2753**). On current Mail (Ventura+, FB11734014) `content` / `html content` store the body as a citation: every plain-text line prefixed with `>`, plus a `multipart/alternative` HTML part wrapped in `<blockquote type=\"cite\">`. Desktop Mail often hides the bar with inline styles; iOS Mail paints the whole body purple with a left quote bar — even when the subject is not `Re:`/`Fwd:` and there is no `In-Reply-To`. Reply and forward still quote the original, which is expected (those paths still prepend via `content`; fixing reply/forward cite-wrap is out of scope for 2.1.0).\n\nKeystrokes use System Events, so **node needs Accessibility** (Privacy & Security → Accessibility) **and** Automation → Mail **and** Automation → System Events. Run `apple-tools-mcp permissions` after first install or upgrade so **node → System Events** pops **Allow** in the same sitting as Mail / Messages / Contacts / Calendar. An Accessibility / System Events deny is not a Mail Automation deny (`-1743` / `-10004`).\n\n**Compose body focus (2.0.8).** After `make new outgoing message`, To and Subject are AppleScript properties (never paste). Cmd-V used to run only after an AX window walker left the header. Quote-prefix Sent prove and Sent/Outbox verify stay gated on fail-closed body/header checks — a MacBook 2.0.7 live `mail_send` with Accessibility allowed still hit `BODY_PASTE_MISDIRECTED` when Cmd-V landed in To/Subject (`ATP-207-SENT-PROVE-20260921-084048`).\n\n**macOS 26 focus compile (2.0.9).** Dual-host Sent prove on `@2.0.8` never reached paste: `atmSafeToPaste` used bare `focused UI element`, which System Events 26.x rejects at compile.\n\n**AppleScript reserved identifiers (2.0.10).** Dual-host Sent prove on `@2.0.9` compiled past the focused-UI fix, then failed in `atmFocusMailBody`: `set {tw, th} to size of atmElem` → **-2741** Expected expression but found `th` (AppleScript reserved ordinal).\n\n**Keystroke compose (2.1.0).** macOS 26 System Events reports `windows of process Mail = 0`, so the AX window walker cannot focus a tall `AXWebArea`. Fresh compose **Tabs into the body** (max Tab×6 as proven on Mini) and **types the body with Return between paragraphs**. Clipboard Cmd-V is only a fallback if a *readable* AX value is still missing the body needle. Fail-closed: missing AX body focus or changed To/Cc/Bcc/subject is `BODY_FOCUS_FAILED` / `BODY_PASTE_MISDIRECTED`; the outgoing message is deleted and nothing is sent. Apple events are wrapped in `with timeout`; hung `osascript` is **SIGKILL**'d so a wedge fails fast instead of sitting ~60s. If the Mini write-bridge / indexer daemon cannot drive System Events, `mail_send` returns `unsupported: true` so the stdio client falls back **in-process** — it does **not** hang with `MAIL_SEND_TIMEOUT_GUIDANCE` for a message that never sent.\n\n**AX body-focus oracle (2.1.1).** Dual-host Mail 16 / macOS 26 showed that Mail AppleScript `content of` the outgoing message is **not** a live oracle for UI-typed/pasted text: `set content` reads back, but after Tab + keystroke/paste into the UI body `content of` stays empty (`typedSeen=false`, bodyLen 0) even when typing still produces a plain Sent `.emlx`. `@2.1.0` calibrated Tab against that property and fail-closed with `BODY_FOCUS_FAILED`. 2.1.1 Tabs until the focused AX role is a body field (`AXWebArea` / non-header `AXTextArea` via `AXFocusedUIElement` / `first UI element whose focused is true` — never `focused UI element`, never `windows of process Mail`). Cmd-V runs only when that AX **value** is readable and still missing the needle. An empty AX value is not a miss (Mail 16 WebArea); header checks still fail-closed. Ship prove that the body landed remains the Sent `.emlx` after send (2.0.7 To+subject verify). Do not “fix Tab count.”\n\n**Compose body hit-test (2.1.3).** Mini host: `AXFocusedUIElement` role coerce fails (**-1700**); `windows of process Mail` is empty; a deep `UI elements` tree walk (the `app_ax_find` class of walk) **truncates after ~23 header/toolbar nodes** and never reaches compose `AXWebArea`. Subject-anchored clipboard read-back is refuted on Mini. The proven path: identify the compose window by the **subject title** among **top-level** System Events UI elements, then **coordinate AX hit-test** (`AXUIElementCopyElementAtPosition`) into the body region. The hit must be `AXWebArea` **\"message body\"**; a short `AXTextField` is fail-closed (`BODY_FOCUS_FAILED`). Focus + `AXValue` produced a **plain** Sent `.emlx` (cite=0) — no AppleScript `content` setter, no physical mouse click. Typed Returns / Cmd-V run only if a readable AX value is still missing the needle. System Events permissions probe is unchanged from 2.1.2.\n\n**AXTitle compile (2.1.4).** Mini host: 2.1.3 `mail_send` never reached hit-test because `osacompile` failed **-2741** on bare `value of attribute \"AXTitle\" of atmEl` in `atmTopElemBits` / `atmTopElemExactTitle` (those handlers sit outside the System Events tell that walks top-level UI elements). Mini solution probe (`results-214/SOLUTION-PROBE-REPORT.md`): wrapping those AXTitle reads inside `tell application \"System Events\"` compiles (`osacompile` exit 0). Hit-test + fail-closed `AXTextField` + plain Sent behavior is unchanged from 2.1.3. Live Sent prove is after npm.\n\n**mail_send success is Sent/Outbox verify (2.0.7).** AppleScript `send` returning without throw is not enough. After a real send the tool looks in **Sent** and **Outbox** and reports success only if the message is there. The success text names the delivery state (`mailbox: sent` + `delivery: sent`, or `mailbox: outbox` + `delivery: outbox` while still sending). If verify misses, the tool returns a failure (`isError`) — not success. Hang/timeout recover matches **To + subject** (and Message-ID when compose captured one). It never matches subject alone (short subjects like `test` are unsafe). `from` / account selection is out of scope; Mail's default From is used. `dry_run` / confirm-blocked writes stay `ok: false`, `planned: true`, `delivered: false`.\n\n**Compile prove (2.1.4 on the Mini host):** Unpatched `buildComposeScript` / `buildMailBodyPasteHandler` `osacompile` **-2741** on those bare AXTitle reads; patched AXTitle-inside-System-Events tell `osacompile` exit 0. Report: `results-214/SOLUTION-PROBE-REPORT.md`. Global install untouched. Live Sent is the 2.1.3 ship prove after npm.\n\n**Probe 3 body delivery (2.1.5).** Mini Probe 3 (`atm-p3-deliver.applescript`, classic AppleScript / System Events, not JXA) proved a click-free path: exact subject window title, first `AXWebArea` from `entire contents` of that window, `set focused of` that element to true, then an independent `AXFocusedUIElement` re-read that must match role `AXWebArea` and position/size before any keystroke. Delivery is Cmd-A + clipboard paste. No Mail `content` / `html content`. No `AXValue` write (`AXUIElementSetAttributeValue` on content is a silent no-op; 2.1.4 `atmAxHitFill` returned `OK` when that value was empty, so the keystroke recovery never ran). No coordinate `click at` (Probe 3: a click can land on another Space or app). Focus mismatch is `BODY_FOCUS_UNPROVEN`: the draft is deleted and nothing is sent. The post-paste body needle runs only when the focused element is still that proven body, so a To: recipient chip (`U+FFFC`) is not `BODY_PASTE_MISDIRECTED`. Sent/Outbox verify, `dry_run`, and confirm are unchanged.\n\n**Manual prove (2.1.3 on the Mini host):** After `apple-tools-mcp permissions` reports System Events granted, `mail_send` a short **multiline** plain message and a short `body_format: \"html\"` message whose body looks like ordinary paragraphs (for example `<p>Quick note</p>`), neither with a `Re:`/`Fwd:` subject. The body must land via title-marker + hit-test (not Tab / focused-role): no `BODY_FOCUS_FAILED` / `BODY_PASTE_MISDIRECTED`. Inspect each Sent `.emlx`: the text/plain part must contain the intended text (newlines preserved) and must not prefix every body line with `>`, and any HTML alternative must not wrap the whole body in `<blockquote type=\"cite\">`. Compose must succeed (no `-2753` / undefined `newMessage`). Prove the production path (write-bridge with node → System Events allowed, **or** the documented in-process fallback). That quote-prefix Mini Sent prove is a separate bar from the 2.0.7 verify contract.\n\nEmails are addressed by their RFC822 **Message-ID**. Pass `message_id`, or pass the `file_path` from `mail_search` / `mail_recent` and the server reads the Message-ID out of the `.emlx` headers for you. `mail_archive` moves the message to its account's Archive (or All Mail) mailbox; `mail_trash` moves it to that account's Trash.\n\n**Send timeout vs TCC — check Sent before retrying.** `mail_send` / `mail_reply` / `mail_forward` can hang after Mail has already put the message in Sent. That hang is a **timeout** (`ETIMEDOUT` / `-1712` / AppleEvent timed out), not a TCC deny. The same hang-vs-TCC split applies to **find / reply / open before send** — an Allowed `ETIMEDOUT` there is never `MAIL_TCC_GUIDANCE`. Real Mail Automation denials report **`-1743`**, **`-10004`**, or “not authorized to send Apple events”. After a send hang the tool looks in Sent (and Outbox) and returns **success** if the message is there — never label a delivered send as TCC fail or timeout. Replies match `In-Reply-To` or an exact recent `Re:` + original subject (the fallback compose does not set reply headers). Forwards match the intended recipient plus an exact `Fwd:` subject or the original Message-ID in a forwarded body — not `In-Reply-To`, and not an unrelated `Fwd:` that only shares a To. Compose (`mail_send`) matches the intended **To plus exact subject** (and Message-ID when available), never subject alone. Neither scan treats the original itself as this send. A real send that returns without throw is also verified the same way before success. If Sent-verify misses, the error tells you it was a hang (or a verify-miss after send returned) and to check Sent. **Clients must Sent-check before retrying a timed-out send**; retrying a message that already landed sends a second copy. This is not a silent TCC grant.\n\n### Messages write tool\n\n| Tool | Arguments | Confirm rule |\n|------|-----------|--------------|\n| `messages_send` | `to[]` or `chat_id`, `text`, `attachment_path`, `service` (`auto` \\| `imessage` \\| `sms`) | `confirm` for multiple handles or a group chat |\n\nSupported identifiers:\n\n- **`to`** — phone numbers in E.164 form (`+15551234567`) or Apple ID email addresses. These map to a Messages `participant` on the iMessage (or SMS relay) service.\n- **`chat_id`** — the chat GUID of an existing conversation, for example `iMessage;-;+15551234567` (1:1) or `iMessage;+;chat123456789` (group). The GUID is checked against `~/Library/Messages/chat.db` before anything is sent, so an unknown chat id is refused rather than delivered somewhere unexpected. The same lookup counts participants, which is how group chats are detected for the confirm rule.\n- **`service`** — `auto` (default) tries iMessage and falls back to the SMS relay; `imessage` and `sms` pin the service.\n- **`attachment_path`** — an absolute path to a file that already exists on this Mac. Text and attachment can be sent together.\n\n### Calendar write tools\n\n| Tool | Arguments | Confirm rule |\n|------|-----------|--------------|\n| `calendar_list_calendars` | none | none (read-only helper) |\n| `calendar_add` | `calendar_name` (required), `title` (required), `start` (required), `end`, `all_day`, `location`, `notes`, recurrence args, `alerts_minutes_before[]` | none |\n| `calendar_edit` | `event_id` (required), optional `eventkit_id` from add, plus any of `title`, `start`, `end`, `location`, `notes`, recurrence args, `alerts_minutes_before[]`, `replace_alerts` | none |\n| `calendar_remove` | `event_id` (required), optional `eventkit_id` from add, optional `calendar_name` | **`confirm` required** |\n| `calendar_rsvp` | `event_id` (required), `response` (`accept` \\| `decline` \\| `tentative`), `attendee_email` | none |\n\nEvents are addressed by their **iCalendar UID**, reported as `Event ID` by `calendar_date` and returned by `calendar_add`. Run `calendar_list_calendars` first so new events land on the intended calendar instead of the default one.\n\n`calendar_add`, `calendar_edit`, and `calendar_remove` share the same write-bridge RPC (`{ tool, args }` into launchd-owned node). They do not use a different socket or calendar account. Calendar.app’s dictionary has **`delete` only** — there is no `remove` or `move to trash`.\n\nNon-recurring `calendar_add` **must** create through **EventKit** and print `via: EventKit` plus `eventkit_id`. Mini `cd74071`: EventKit had `eventKitCalendars=1` but `default=[id NSTaggedPointerString]` — JXA `String(title)` prints the ObjC class, not the calendar name, so the title match missed the only writable calendar. Titles and `calendarIdentifier` are `ObjC.unwrap`d; a single writable calendar or `defaultCalendarForNewEvents` is used when the name does not match. There is **no AppleScript fallback** for non-recurring add.\n\n`calendar_edit` and `calendar_remove` take `eventkit_id` from add (`calendarUUID:eventUUID` on Mini). writeOnly EventKit (`status=4`) can create and read ids off the saved `EKEvent`, but **cannot re-query** via `eventWithIdentifier` — Mini `2cdf44d` failed add on that post-save lookup. Add therefore returns ids from the in-memory event. The indexer write-bridge keeps a long-lived EventKit osascript session that caches the `EKEvent` so edit/remove call `saveEvent` / `removeEvent` without a fetch. When `eventkit_id` is present and the session misses, Calendar.app uid lookup is skipped so iCloud cannot hang. `ETIMEDOUT` / `-1712` is **`timeout`**, never TCC. Failures print `osascript kind=… error=… codes=…`. `--apply` fails closed unless add printed `via: EventKit` and `eventkit_id`.\n\n`--apply` prefers an **On My Mac** calendar when EventKit lists one. `--calendar=` still wins. The Mini host’s first writable calendar named **Calendar** (no On My Mac / iCloud label) is fine if EventKit create actually runs.\n\nLike Contacts, calendar writes go through Calendar.app rather than writing `Calendar.sqlitedb` directly. Reads query that database for speed, but edits must go through the app so iCloud sync, invitations, and alarms behave correctly.\n\n**Supported recurrence patterns.** Either pass structured arguments or a raw `recurrence` RRULE:\n\n| Argument | Values |\n|----------|--------|\n| `frequency` | `daily`, `weekly`, `monthly`, `yearly` |\n| `interval` | 1-366 (e.g. `2` with `weekly` = every other week) |\n| `count` | 1-1000 occurrences (cannot be combined with `until`) |\n| `until` | explicit local datetime; emitted as a UTC `UNTIL` |\n| `by_day` | `MO TU WE TH FR SA SU` (weekly patterns) |\n| `recurrence` | raw RRULE instead of the above, e.g. `FREQ=WEEKLY;INTERVAL=1;COUNT=10` |\n\n`{ frequency: \"weekly\", interval: 2, by_day: [\"MO\",\"WE\"], count: 10 }` becomes `FREQ=WEEKLY;INTERVAL=2;BYDAY=MO,WE;COUNT=10`. Anything outside this grammar is refused.\n\n**Alerts.** `alerts_minutes_before` takes up to 5 whole minute values (0 to 40320, i.e. four weeks) and creates display alarms. On `calendar_edit`, supplying alerts replaces the event's existing alarms; `replace_alerts: true` removes them without adding new ones.\n\n**RSVP.** `calendar_rsvp` sets your attendee participation status on the invitation. Some macOS versions refuse to write that property from AppleScript; when that happens the tool says so explicitly (and asks you to answer in Calendar) rather than reporting a silent success.\n\n### Contacts write tools\n\n| Tool | Arguments | Confirm rule |\n|------|-----------|--------------|\n| `contacts_add` | `first_name`, `last_name`, `organization`, `job_title`, `emails[]`, `email_label`, `phones[]`, `phone_label` | none |\n| `contacts_edit` | `contact_id` (required), any of the above, `replace_emails`, `replace_phones` | **`confirm` required** when replacing with an empty list |\n| `contacts_remove` | `contact_id` (required) | **`confirm` required** |\n\nContacts are addressed by their Contacts.app person id (for example `ABCD1234-...:ABPerson`), reported as `Contact ID` by `contacts_search` and `contacts_lookup` and returned by `contacts_add`. At least one of `first_name`, `last_name`, or `organization` is required to create a contact. Writes go through Contacts.app, never by writing the AddressBook database directly (that breaks iCloud sync). Keep **Contacts, Mail, and Messages** running for write reliability; the Contacts write path launches Contacts.app before CRUD if it was quit. Calendar does not need to stay open (EventKit).\n\n### Example write calls\n\n```jsonc\n// Preview first - nothing is sent\n{ \"name\": \"mail_send\", \"arguments\": { \"to\": [\"a@example.com\"], \"subject\": \"Status\", \"body\": \"All good\", \"dry_run\": true } }\n\n// Single recipient: sends on the first call\n{ \"name\": \"mail_send\", \"arguments\": { \"to\": [\"a@example.com\"], \"subject\": \"Status\", \"body\": \"All good\" } }\n\n// Two recipients: blocked until confirmed\n{ \"name\": \"mail_send\", \"arguments\": { \"to\": [\"a@example.com\", \"b@example.com\"], \"subject\": \"Status\", \"body\": \"All good\", \"confirm\": true } }\n\n// Recurring event with an alert\n{ \"name\": \"calendar_add\", \"arguments\": { \"calendar_name\": \"Work\", \"title\": \"Standup\", \"start\": \"2026-09-21 09:00\", \"end\": \"2026-09-21 09:15\", \"frequency\": \"weekly\", \"by_day\": [\"MO\",\"TU\",\"WE\",\"TH\",\"FR\"], \"alerts_minutes_before\": [10] } }\n\n// Delete: preview, then confirm\n{ \"name\": \"calendar_remove\", \"arguments\": { \"event_id\": \"EVT-UID\", \"confirm\": true } }\n```\n\n### Not included\n\nNo Apple **Reminders** tools ship in this package, by design. Notes, FaceTime, and Files automation are also out of scope.\n\n## Example Queries\n\nAsk your MCP client things like:\n\n- \"Find emails from John about the quarterly report\"\n- \"What messages did I get from Mom last week?\"\n- \"When is my next dentist appointment?\"\n- \"Search for emails about the AWS bill from November\"\n- \"Find all calendar events with Zoom links\"\n- \"What's Sarah's phone number?\"\n- \"Show me all communication with David from last month\"\n\n## Privacy & Security\n\n- **Local Processing**: All embeddings are generated locally using Hugging Face Transformers.js\n- **No Cloud Services**: No data is sent to external servers; the write bridge is a local unix socket, never a network port\n- **Reads are read-only**: Search and lookup tools never modify your data. The [write tools](#write-tools-200) are the only ones that change anything, and they are opt-in per call, with `confirm` required for deletes and multi-recipient sends\n- **No credentials**: The server holds no tokens or passwords. It uses the Mail, Messages, Calendar, and Contacts apps you are already signed into\n- **Your Data**: The vector index is stored locally in your home directory\n\n## Troubleshooting\n\n### \"Authorization denied\" errors\n\nEnsure Node.js has Full Disk Access (see Installation step 2).\n\n### A write tool reports that macOS denied the automation\n\nThe message names which process macOS was actually asking about. Work through it in this order:\n\n1. **MacBook / Terminal (`permissions` CLI):** there is **no** always-on indexer. Re-run `apple-tools-mcp permissions` from **Terminal.app**, Allow the **printed `process.execPath`**, and check System Settings → Privacy & Security → **Automation** for that node → Contacts, Calendar, Mail, Messages, and System Events. Do **not** start `apple-tools-indexer`.\n2. **Mini only:** `pgrep -fl apple-tools-indexer` / `~/.apple-tools-mcp/writer.sock`. If the LaunchAgent is the product host, start it so writes run under launchd-owned node (see [Mini ship-gate](#mini-ship-gate-host-setup)).\n3. **Did you approve the Automation prompts for `node`?** Re-run `apple-tools-mcp permissions` with the product `node` (it prints `process.execPath`). Open System Settings → Privacy & Security → **Automation** and confirm **that printed node** is allowed to control **Mail**, **Messages**, Contacts, Calendar, and **System Events**. A prior **Don't Allow** for System Events is a sticky Deny — the Allow dialog will not appear again; turn **System Events** on for that node, then re-run `permissions` (it must not report granted from a soft name check). On Mini the LaunchAgent binary is whatever the plist / `which node` reports (`/Users/petercoates/.local/node/bin/node` is a Mini *example* only). MacBook Claude nvm is `/Users/petercoates/.nvm/versions/node/v22.21.1/bin/node`, not Homebrew. Watch the host — Allow **`node`**, not any other app. Contacts or Calendar being allowed does **not** grant Mail. A `mail_send` hang is **Automation denied**, not “Mail.app could not be reached”; `dry_run` never talks to Mail so it cannot detect this. Do **not** approve the MCP client / host app that launched a short-lived stdio server, and do **not** try to add `node` via **+** in the Contacts or Calendars privacy lists — those panes often have no Add button. `tccutil reset AppleEvents` re-arms the Automation prompt so you can Allow **`node`** again. Full Disk Access is a separate read grant; npm Trusted Publisher / tokens are unrelated.\n4. **Mini: is the daemon's node binary the one with Full Disk Access?** LaunchAgents do not inherit your shell `PATH`; confirm the plist points at the same path `which node` reports.\n5. **Is it actually the write path?** Contacts or Calendar *reads* failing with `EPERM` is a Full Disk Access / attribution problem, not the entitlement gap — fix FDA for the responsible process. Contacts or Calendar *CRUD* failing with no prompt under Claude Desktop is the [documented host limitation](#reads-and-writes-are-different-mechanisms): Claude.app carries neither the addressbook nor the calendars entitlement. On Mini, start the daemon so the write goes through the bridge. On MacBook, use Terminal.app + the printed node.\n6. **\"Contacts.app / Calendar.app could not be reached\"** with the app clearly installed is an **Automation / responsible-process** failure, not a missing app — macOS reports a refused Apple event as `-1728` / \"can't get application\". On MacBook / Terminal, Allow the printed `process.execPath`. On Mini, the write bridge / LaunchAgent may apply. A Contacts `-600` / “application isn't running” is a **cold launch**, not Automation — keep Contacts, Mail, and Messages running; Calendar does not need to stay open.\n7. **`calendar_remove` FAIL after add/edit PASS** is a delete-path failure, not missing Calendar Automation. Same write-bridge RPC. Read the `osascript kind=/error=` line: `kind=timeout` + `ETIMEDOUT` / `-1712` is an iCloud/CalDAV hang or Calendar confirmation dialog — **not** TCC. `EVENTKIT_NOT_FOUND status=4` is writeOnly EventKit failing to see an AppleScript-created event (add must go through EventKit). `-1743` / `-10004` is a real Automation deny. Paste that line if it still FAILs.\n8. **Prove the Mini host itself works** with `node scripts/smoke-writes.js --apply` on the Node host with the LaunchAgent running; it routes through the bridge and separates the read and write mechanisms for you.\n\n### A write returned \"CONFIRMATION REQUIRED\"\n\nThat is the safety gate, not a failure. Deletes and multi-recipient sends need `confirm: true`; the message states exactly what would have happened. Use `dry_run: true` for a preview.\n\n### Empty search results\n\n1. Check that the index was built: `ls ~/.apple-tools-mcp/vector-index/`\n2. Rebuild the index if needed: `npm run build-index`\n\n### Server not appearing in the MCP client\n\n1. Verify your client config is valid (JSON files must be valid JSON)\n2. Restart the MCP client completely (for Claude Desktop: Cmd+Q, then reopen)\n3. Check the client's MCP logs for errors\n\n### Force rebuild the index\n\nIf the index becomes corrupted or out of sync:\n\n```bash\n# If the Mini indexer LaunchAgent is running, unload it first\n# launchctl unload ~/Library/LaunchAgents/com.apple-tools-mcp.indexer.plist\n\n# Remove existing index files\nrm -rf ~/.apple-tools-mcp/vector-index\nrm -f ~/.apple-tools-mcp/index-meta.json\nrm -f ~/.apple-tools-mcp/indexer.lock\n\n# Restart the indexer daemon or your MCP client to trigger a fresh rebuild\n```\n\n### Monitor indexing progress\n\nWatch the MCP server logs in your client. Log locations vary by client; Claude Desktop example:\n\n```bash\ntail -f ~/Library/Logs/Claude/mcp-server-apple-tools.log\n```\n\n### Audit the index\n\nCheck index health and coverage:\n\n```bash\n# Quick audit\nnpm run audit\n\n# Detailed audit saved to file\nnpm run audit -- --reporter=verbose > audit-report.txt\n```\n\n## Development\n\n```bash\n# Clone the repo\ngit clone https://github.com/sfls1397/Apple-Tools-MCP.git\ncd Apple-Tools-MCP\n\n# Install dependencies\nnpm install\n\n# Install test dependencies\nnpm install -D vitest @vitest/coverage-v8 fast-check\n\n# Run tests\nnpm test\n\n# Run the indexer daemon (owns indexer.lock + vector-index refresh)\nnpm run indexer\n\n# One-shot rebuild (stop the indexer daemon first)\nnpm run build-index\n\n# Run tests with verbose coverage report\nnpx vitest run --coverage --reporter=verbose\n\n# Run audit to check index health\nnpm run audit\n\n# Prove the write path on this host (dry run)\nnpm run smoke:writes\n\n# Real CRUD — the extra -- is required so npm forwards --apply\nnpm run smoke:writes -- --apply\n```\n\n## Contributing\n\nContributions are welcome! Please:\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Run the tests: `npm test`\n5. Submit a pull request\n\n## License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n## Acknowledgments\n\n- Built with the [Model Context Protocol SDK](https://github.com/modelcontextprotocol/sdk)\n- Vector search powered by [LanceDB](https://lancedb.com/)\n- Local embeddings via [Hugging Face Transformers.js](https://github.com/huggingface/transformers.js)\n","readmeFilename":"README.md"}