local-mcp 3.0.135 → 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.
- package/README.md +2 -2
- package/package.json +1 -1
- 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 —
|
|
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
|
[](https://www.npmjs.com/package/local-mcp)
|
|
6
6
|
[](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
|
-
##
|
|
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.
|
|
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
|
|
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',
|