local-mcp 3.0.72 → 3.0.74
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 +1 -1
- package/download.js +46 -1
- package/package.json +1 -1
- package/setup.js +18 -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 — 100 tools for Mail, Calendar, Teams, OneDrive, 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)
|
package/download.js
CHANGED
|
@@ -355,4 +355,49 @@ async function ensureM365Proxy() {
|
|
|
355
355
|
}
|
|
356
356
|
}
|
|
357
357
|
|
|
358
|
-
|
|
358
|
+
/**
|
|
359
|
+
* Downloads the slack-proxy co-process if not installed or on a different version.
|
|
360
|
+
* Binary is installed at ~/.local/share/local-mcp/bin/slack-proxy
|
|
361
|
+
* @returns {Promise<string|null>} Path to the binary, or null if it fails
|
|
362
|
+
*/
|
|
363
|
+
async function ensureSlackProxy() {
|
|
364
|
+
const info = await getLatestBinary()
|
|
365
|
+
const version = info.version
|
|
366
|
+
const arch = process.arch === 'arm64' ? 'darwin-arm64' : 'darwin-x64'
|
|
367
|
+
const binPath = path.join(CACHE_DIR, 'slack-proxy')
|
|
368
|
+
const verFile = path.join(CACHE_DIR, '.slack-proxy-version')
|
|
369
|
+
|
|
370
|
+
// Already installed and up to date
|
|
371
|
+
if (fs.existsSync(binPath) && fs.existsSync(verFile)) {
|
|
372
|
+
if (fs.readFileSync(verFile, 'utf8').trim() === version) return binPath
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const url = `https://download.local-mcp.com/slack-proxy-${version}-${arch}.tar.gz`
|
|
376
|
+
process.stderr.write(`\nDownloading slack-proxy v${version}...\n`)
|
|
377
|
+
|
|
378
|
+
fs.mkdirSync(CACHE_DIR, { recursive: true })
|
|
379
|
+
const tarPath = path.join(CACHE_DIR, `slack-proxy-${version}.tar.gz`)
|
|
380
|
+
|
|
381
|
+
try {
|
|
382
|
+
await downloadFile(url, tarPath)
|
|
383
|
+
const stat = fs.statSync(tarPath)
|
|
384
|
+
if (stat.size < 1000) { fs.unlinkSync(tarPath); throw new Error(`Incomplete download (${stat.size} bytes)`) }
|
|
385
|
+
|
|
386
|
+
execFileSync('tar', ['-xzf', tarPath, '-C', CACHE_DIR], { stdio: 'pipe' })
|
|
387
|
+
fs.unlinkSync(tarPath)
|
|
388
|
+
|
|
389
|
+
if (!fs.existsSync(binPath)) throw new Error('slack-proxy not found after extraction')
|
|
390
|
+
fs.chmodSync(binPath, 0o755)
|
|
391
|
+
try { execFileSync('codesign', ['--force', '--sign', '-', '--identifier', 'com.local-mcp.slack-proxy', binPath], { stdio: 'pipe' }) } catch { /* non-critical */ }
|
|
392
|
+
|
|
393
|
+
fs.writeFileSync(verFile, version, 'utf8')
|
|
394
|
+
process.stderr.write(` slack-proxy installed at ${binPath}\n`)
|
|
395
|
+
return binPath
|
|
396
|
+
} catch (err) {
|
|
397
|
+
try { if (fs.existsSync(tarPath)) fs.unlinkSync(tarPath) } catch {}
|
|
398
|
+
process.stderr.write(` (slack-proxy not available: ${err.message})\n`)
|
|
399
|
+
return null
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
module.exports = { ensureBinary, ensureRuntime, ensureTray, ensureTeamsProxy, ensureM365Proxy, ensureSlackProxy, CACHE_DIR, TRAY_DIR }
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "local-mcp",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.74",
|
|
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
|
@@ -252,7 +252,7 @@ async function runSetup(opts = {}) {
|
|
|
252
252
|
if (configured.length > 0) {
|
|
253
253
|
if (healthOk) {
|
|
254
254
|
console.log(`✅ LMCP configured for: ${configured.join(', ')}\n`)
|
|
255
|
-
console.log(' ✓ Server binary verified —
|
|
255
|
+
console.log(' ✓ Server binary verified — 100 tools ready\n')
|
|
256
256
|
} else {
|
|
257
257
|
console.log(`⚠ LMCP configured for: ${configured.join(', ')}`)
|
|
258
258
|
console.log(' Server binary could not be verified — it may still work after restart.\n')
|
|
@@ -260,14 +260,17 @@ async function runSetup(opts = {}) {
|
|
|
260
260
|
|
|
261
261
|
if (hasCursor) {
|
|
262
262
|
console.log('┌─────────────────────────────────────────────────────┐')
|
|
263
|
-
console.log('│ CURSOR — 3 steps
|
|
263
|
+
console.log('│ CURSOR — activate in 3 steps: │')
|
|
264
264
|
console.log('│ │')
|
|
265
265
|
console.log('│ 1. Quit Cursor completely (Cmd+Q) │')
|
|
266
266
|
console.log('│ 2. Reopen Cursor │')
|
|
267
267
|
console.log('│ 3. Cursor Settings (⚙) → MCP → find "local-mcp" │')
|
|
268
|
-
console.log('│ → toggle it ON
|
|
268
|
+
console.log('│ → toggle it ON │')
|
|
269
269
|
console.log('│ │')
|
|
270
|
-
console.log('│ Then
|
|
270
|
+
console.log('│ Then open a new chat and try one of these: │')
|
|
271
|
+
console.log('│ • "Read my latest emails" │')
|
|
272
|
+
console.log('│ • "What\'s on my calendar today?" │')
|
|
273
|
+
console.log('│ • "Give me a morning briefing" │')
|
|
271
274
|
console.log('│ │')
|
|
272
275
|
console.log('│ Guide: local-mcp.com/guides/cursor-mcp-setup │')
|
|
273
276
|
console.log('└─────────────────────────────────────────────────────┘\n')
|
|
@@ -295,6 +298,7 @@ async function runSetup(opts = {}) {
|
|
|
295
298
|
// Instalar y lanzar el tray (menu bar app) — arm64 only, non-fatal
|
|
296
299
|
await _installTray()
|
|
297
300
|
await _installTeamsProxy()
|
|
301
|
+
await _installSlackProxy()
|
|
298
302
|
|
|
299
303
|
// Interactive email prompt — only when running in a TTY and no email set yet
|
|
300
304
|
if (!email) {
|
|
@@ -330,6 +334,15 @@ async function _installTeamsProxy() {
|
|
|
330
334
|
}
|
|
331
335
|
}
|
|
332
336
|
|
|
337
|
+
async function _installSlackProxy() {
|
|
338
|
+
try {
|
|
339
|
+
const { ensureSlackProxy } = require('./download')
|
|
340
|
+
await ensureSlackProxy()
|
|
341
|
+
} catch (err) {
|
|
342
|
+
process.stderr.write(` (slack-proxy not available: ${err.message})\n`)
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
333
346
|
async function _installTray() {
|
|
334
347
|
try {
|
|
335
348
|
const { ensureTray } = require('./download')
|
|
@@ -496,7 +509,7 @@ function _pingInstall(clients, method, email = '') {
|
|
|
496
509
|
arch: process.arch,
|
|
497
510
|
transport: 'stdio',
|
|
498
511
|
ai_client: clients[0] || '',
|
|
499
|
-
|
|
512
|
+
license_email: email || '',
|
|
500
513
|
started_at: new Date().toISOString(),
|
|
501
514
|
})
|
|
502
515
|
const hbReq = https.request({
|