local-mcp 3.0.132 → 3.0.134

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # LMCP
2
2
 
3
- > Give your AI assistant native access to Mac apps — 107 tools for Mail, Calendar, Contacts, iMessage, Teams, Slack, WhatsApp, OneDrive, Notes, OmniFocus, Safari, Word, Excel, PowerPoint, Stocks, NordVPN, and more. Everything runs locally. Your data never leaves your machine.
3
+ > Give your AI assistant native access to Mac apps — 105 tools for Mail, Calendar, Contacts, iMessage, Teams, Slack, WhatsApp, OneDrive, Notes, OmniFocus, Safari, Word, Excel, PowerPoint, Stocks, NordVPN, and more. Everything runs locally. Your data never leaves your machine.
4
4
 
5
5
  [![npm](https://img.shields.io/npm/v/local-mcp)](https://www.npmjs.com/package/local-mcp)
6
6
  [![macOS 12+](https://img.shields.io/badge/macOS-12%2B-blue)](https://local-mcp.com?ref=npm)
@@ -61,7 +61,7 @@ LMCP runs a native MCP server that bridges your Mac apps to any AI client:
61
61
  | **Safari** | Bookmarks, open tabs, click/type/fill forms, run JavaScript |
62
62
  | **NordVPN** | Status, server recommendations, diagnostics |
63
63
 
64
- ## 107 MCP Tools
64
+ ## 105 MCP Tools
65
65
 
66
66
  Email (9): `list_accounts` `list_emails` `read_email` `send_email` `reply_email` `search_emails` `move_email` `save_attachment` `create_email_folder`
67
67
 
package/index.js CHANGED
@@ -30,7 +30,7 @@ async function main() {
30
30
  if (cmd === 'setup') {
31
31
  const { runSetup } = require('./setup')
32
32
  await runSetup()
33
- return
33
+ process.exit(0)
34
34
  }
35
35
 
36
36
  if (cmd === 'update') {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "local-mcp",
3
- "version": "3.0.132",
3
+ "version": "3.0.134",
4
4
  "description": "LMCP — connect Claude Desktop, Cursor, Windsurf to Mail, Calendar, Contacts, Teams, OneDrive on macOS. Privacy-first: all data stays on your Mac.",
5
5
  "main": "index.js",
6
6
  "bin": {
package/setup.js CHANGED
@@ -224,6 +224,7 @@ async function runSetup(opts = {}) {
224
224
  for (const client of detected) {
225
225
  try {
226
226
  injectMcpConfig(client, stableCommand, stableArgs)
227
+ _trackConfigWritten(client.id || client.name, client.name)
227
228
  configured.push(client.name)
228
229
  console.log(`✓ ${client.name} configured`)
229
230
  } catch (err) {
@@ -538,6 +539,32 @@ function _migrateCurlLaunchAgent() {
538
539
  } catch { /* non-fatal — don't block install on unexpected plist content */ }
539
540
  }
540
541
 
542
+ function _trackConfigWritten(clientId, clientName) {
543
+ try {
544
+ const https = require('https')
545
+ const machineId = _getMachineId()
546
+ const data = JSON.stringify({
547
+ stage: 'config_written',
548
+ client_id: clientId,
549
+ client_name: clientName,
550
+ machine_id: machineId,
551
+ method: process.env.LMCP_METHOD || 'npx-setup',
552
+ install_id: process.env.INSTALL_ID || '',
553
+ })
554
+ const req = https.request({
555
+ hostname: BACKEND_HOST,
556
+ path: '/install-event',
557
+ method: 'POST',
558
+ headers: { 'Content-Type': 'application/json', 'Content-Length': data.length },
559
+ timeout: 5000,
560
+ })
561
+ req.on('response', (res) => res.resume())
562
+ req.on('error', () => {})
563
+ req.write(data)
564
+ req.end()
565
+ } catch { /* non-fatal */ }
566
+ }
567
+
541
568
  function _trackEmailPrompt(result) {
542
569
  // result: 'shown' | 'submitted' | 'skipped' | 'not_shown_no_tty' | 'failed'
543
570
  try {
@@ -556,6 +583,7 @@ function _trackEmailPrompt(result) {
556
583
  headers: { 'Content-Type': 'application/json', 'Content-Length': data.length },
557
584
  timeout: 5000,
558
585
  })
586
+ req.on('response', (res) => res.resume())
559
587
  req.on('error', () => {})
560
588
  req.write(data)
561
589
  req.end()
@@ -589,6 +617,7 @@ function _pingInstall(clients, method, email = '', binaryVersion = '') {
589
617
  headers: { 'Content-Type': 'application/json', 'Content-Length': data.length },
590
618
  timeout: 5000,
591
619
  })
620
+ req.on('response', (res) => res.resume())
592
621
  req.on('error', () => {})
593
622
  req.write(data)
594
623
  req.end()
@@ -608,6 +637,7 @@ function _pingInstall(clients, method, email = '', binaryVersion = '') {
608
637
  headers: { 'Content-Type': 'application/json', 'Content-Length': pingData.length },
609
638
  timeout: 5000,
610
639
  })
640
+ pingReq.on('response', (res) => res.resume())
611
641
  pingReq.on('error', () => {})
612
642
  pingReq.write(pingData)
613
643
  pingReq.end()
@@ -632,6 +662,7 @@ function _pingInstall(clients, method, email = '', binaryVersion = '') {
632
662
  headers: { 'Content-Type': 'application/json', 'Content-Length': hb.length },
633
663
  timeout: 5000,
634
664
  })
665
+ hbReq.on('response', (res) => res.resume())
635
666
  hbReq.on('error', () => {})
636
667
  hbReq.write(hb)
637
668
  hbReq.end()