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 +2 -2
- package/index.js +1 -1
- package/package.json +1 -1
- package/setup.js +31 -0
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 — 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
|
[](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
|
+
## 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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "local-mcp",
|
|
3
|
-
"version": "3.0.
|
|
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()
|