local-mcp 3.0.73 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # LMCP
2
2
 
3
- > Give your AI assistant native access to Mac apps — 95 tools for Mail, Calendar, Teams, OneDrive, and more. Everything runs locally. Your data never leaves your machine.
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
  [![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)
package/download.js CHANGED
@@ -355,4 +355,49 @@ async function ensureM365Proxy() {
355
355
  }
356
356
  }
357
357
 
358
- module.exports = { ensureBinary, ensureRuntime, ensureTray, ensureTeamsProxy, ensureM365Proxy, CACHE_DIR, TRAY_DIR }
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.73",
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 — 95 tools ready\n')
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 to activate: │')
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 if not already enabled │')
268
+ console.log('│ → toggle it ON │')
269
269
  console.log('│ │')
270
- console.log('│ Then ask: "Summarize my unread emails" │')
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
- email: email || '',
512
+ license_email: email || '',
500
513
  started_at: new Date().toISOString(),
501
514
  })
502
515
  const hbReq = https.request({