local-mcp 3.0.134 → 3.0.136

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.
Files changed (3) hide show
  1. package/README.md +2 -2
  2. package/package.json +1 -1
  3. package/setup.js +9 -5
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # LMCP
2
2
 
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.
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.
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
- ## 105 MCP Tools
64
+ ## 107 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "local-mcp",
3
- "version": "3.0.134",
3
+ "version": "3.0.136",
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
@@ -254,6 +254,7 @@ async function runSetup(opts = {}) {
254
254
  // Non-fatal: if /dev/tty is unavailable (CI, automated scripts) we catch and continue.
255
255
  if (!email) {
256
256
  let emailPromptResult = 'not_shown_no_tty'
257
+ let emailPromptError = ''
257
258
  try {
258
259
  const ttyFd = fs.openSync('/dev/tty', 'r+')
259
260
  const ttyIn = require('stream').Readable.from(
@@ -299,10 +300,10 @@ async function runSetup(opts = {}) {
299
300
  } else {
300
301
  emailPromptResult = 'skipped'
301
302
  }
302
- } catch { emailPromptResult = 'failed' }
303
+ } catch (err) { emailPromptResult = 'failed'; emailPromptError = (err && err.message) || String(err) }
303
304
 
304
305
  // Track prompt outcome so we can measure conversion and diagnose failures
305
- _trackEmailPrompt(emailPromptResult)
306
+ _trackEmailPrompt(emailPromptResult, emailPromptResult === 'submitted' ? email : '', emailPromptError)
306
307
  }
307
308
 
308
309
  // Health check — verify binary works before showing success
@@ -565,17 +566,20 @@ function _trackConfigWritten(clientId, clientName) {
565
566
  } catch { /* non-fatal */ }
566
567
  }
567
568
 
568
- function _trackEmailPrompt(result) {
569
+ function _trackEmailPrompt(result, email, errorMsg) {
569
570
  // result: 'shown' | 'submitted' | 'skipped' | 'not_shown_no_tty' | 'failed'
570
571
  try {
571
572
  const https = require('https')
572
573
  const machineId = _getMachineId()
573
- const data = JSON.stringify({
574
+ const payload = {
574
575
  stage: 'email_prompt',
575
576
  email_prompt_result: result,
576
577
  machine_id: machineId,
577
578
  install_id: process.env.INSTALL_ID || '',
578
- })
579
+ }
580
+ if (email) payload.email = email
581
+ if (errorMsg) payload.ref = errorMsg.slice(0, 200) // reuse ref field; fits in existing schema
582
+ const data = JSON.stringify(payload)
579
583
  const req = https.request({
580
584
  hostname: BACKEND_HOST,
581
585
  path: '/install-event',