local-mcp 3.0.414 → 3.0.416

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
  # Local MCP
2
2
 
3
- > **Use your Mac from ChatGPT & Claude.ai on the web** — plus 191+ local tools for Claude Desktop, Cursor, Windsurf, VS Code & Zed. Connect any AI to Mail, Calendar, Contacts, iMessage, Teams, Slack, WhatsApp, Signal, OneDrive, Google Drive, Microsoft 365, Notes, Reminders, OmniFocus, Word/Excel/PowerPoint and more. Runs on your computer, no API keys, free — local tools read your data on your machine, and your AI provider receives the content needed for each request.
3
+ > **Use your Mac from ChatGPT & Claude.ai on the web** — plus 192+ local tools for Claude Desktop, Cursor, Windsurf, VS Code & Zed. Connect any AI to Mail, Calendar, Contacts, iMessage, Teams, Slack, WhatsApp, Signal, OneDrive, Google Drive, Microsoft 365, Notes, Reminders, OmniFocus, Word/Excel/PowerPoint and more. Runs on your computer, no API keys, free — local tools read your data on your machine, and your AI provider receives the content needed for each request.
4
4
 
5
5
  [![npm](https://img.shields.io/npm/v/local-mcp?style=flat-square&label=npm)](https://www.npmjs.com/package/local-mcp)
6
6
  [![macOS](https://img.shields.io/badge/macOS-13%2B-111111?style=flat-square)](https://local-mcp.com?ref=npm)
package/download.js CHANGED
@@ -198,8 +198,8 @@ function _getMachineId(deps = {}) {
198
198
  return crypto.createHash('sha256').update(os.hostname()).digest('hex').slice(0, 16)
199
199
  }
200
200
 
201
- function getArch() {
202
- const plat = process.platform === 'win32' ? 'windows' : process.platform === 'linux' ? 'linux' : 'darwin'
201
+ function getArch(platform = process.platform) {
202
+ const plat = platform === 'win32' ? 'windows' : platform === 'linux' ? 'linux' : 'darwin'
203
203
  const arch = process.arch
204
204
  if (arch === 'arm64') return `${plat}-arm64`
205
205
  if (arch === 'x64') return `${plat}-amd64`
@@ -330,15 +330,22 @@ async function downloadFile(url, destPath) {
330
330
  * Asegura que el binario esté descargado y listo.
331
331
  * @returns {Promise<{binPath: string}>}
332
332
  */
333
- async function ensureBinary() {
334
- const arch = getArch()
335
- const info = await getLatestBinary()
333
+ async function ensureBinary(deps = {}) {
334
+ // Seam for tests (same idiom as ensureTray's `deps`, #2654): lets a test pin the
335
+ // platform and stub the network without touching process.platform or real HOME.
336
+ const {
337
+ platform = process.platform,
338
+ getLatest = getLatestBinary,
339
+ download = downloadFile,
340
+ } = deps
341
+ const arch = getArch(platform)
342
+ const info = await getLatest()
336
343
  const version = info.version
337
344
 
338
345
  // On non-darwin, use the Go server binary (cross-platform).
339
346
  // The Go binary is a single file, not a nested tarball.
340
- if (process.platform !== 'darwin') {
341
- const binName = process.platform === 'win32' ? 'lmcp-server.exe' : 'lmcp-server'
347
+ if (platform !== 'darwin') {
348
+ const binName = platform === 'win32' ? 'lmcp-server.exe' : 'lmcp-server'
342
349
  const binPath = path.join(CACHE_DIR, binName)
343
350
  const versionFile = path.join(CACHE_DIR, '.go-server-version')
344
351
 
@@ -354,6 +361,17 @@ async function ensureBinary() {
354
361
  const archKey = arch.replace('-', '_') // windows-amd64 → windows_amd64
355
362
  const publishedUrl = (info[archKey] && info[archKey].startsWith('http')) ? info[archKey] : null
356
363
 
364
+ // Linux has no published artifact today — unlike Windows, where windows_amd64
365
+ // IS published — so composing the fallback URL below only ever 404s: 817
366
+ // requests/week of dead traffic from MCP sandboxes testing the npm package
367
+ // (#3794). Fail before any network call instead of catching the 404 after.
368
+ if (platform === 'linux' && !publishedUrl) {
369
+ throw new Error(
370
+ 'Local MCP does not support Linux yet.\n' +
371
+ ' Check https://local-mcp.com for updates.'
372
+ )
373
+ }
374
+
357
375
  let url, platformVersion
358
376
  if (publishedUrl) {
359
377
  platformVersion = versionFromArtifactUrl(publishedUrl, arch)
@@ -390,7 +408,7 @@ async function ensureBinary() {
390
408
  const tarPath = path.join(CACHE_DIR, `go-server-${platformVersion}.tar.gz`)
391
409
 
392
410
  try {
393
- await downloadFile(url, tarPath)
411
+ await download(url, tarPath)
394
412
  process.stderr.write(` Extracting...\n`)
395
413
  extractTar(tarPath, CACHE_DIR)
396
414
  fs.unlinkSync(tarPath)
@@ -415,7 +433,7 @@ async function ensureBinary() {
415
433
  if (!fs.existsSync(binPath)) {
416
434
  throw new Error(`Binary not found after extraction: ${binPath}`)
417
435
  }
418
- if (process.platform !== 'win32') fs.chmodSync(binPath, 0o755)
436
+ if (platform !== 'win32') fs.chmodSync(binPath, 0o755)
419
437
  fs.writeFileSync(versionFile, platformVersion)
420
438
 
421
439
  process.stderr.write(` Ready at ${CACHE_DIR}\n`)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "local-mcp",
3
- "version": "3.0.414",
3
+ "version": "3.0.416",
4
4
  "description": "Let ChatGPT, Claude, Cursor & any MCP client actually use your Mac or Windows PC — read & reply to email, manage your calendar, text over iMessage, find files, work with Teams, Slack & Office. Runs locally, no API keys, free.",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -18,7 +18,7 @@
18
18
  "README.md"
19
19
  ],
20
20
  "engines": {
21
- "node": ">=18"
21
+ "node": ">=20"
22
22
  },
23
23
  "os": [
24
24
  "darwin",
package/setup.js CHANGED
@@ -530,7 +530,7 @@ async function runSetup(opts = {}) {
530
530
  if (configured.length > 0) {
531
531
  if (healthOk) {
532
532
  console.log(`✅ LMCP configured for: ${configured.join(', ')}\n`)
533
- console.log(' ✓ Server binary verified — 191+ tools ready\n')
533
+ console.log(' ✓ Server binary verified — 192+ tools ready\n')
534
534
  } else {
535
535
  console.log(`⚠ LMCP configured for: ${configured.join(', ')}`)
536
536
  console.log(' Server binary could not be verified — it may still work after restart.\n')