local-mcp 3.0.71 → 3.0.72
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 +6 -0
- package/package.json +1 -1
- package/setup.js +38 -0
package/README.md
CHANGED
|
@@ -16,6 +16,8 @@ curl -fsSL https://local-mcp.com/install?ref=npm | bash
|
|
|
16
16
|
|
|
17
17
|
Auto-detects and configures: Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, and Zed. Restart your AI client once.
|
|
18
18
|
|
|
19
|
+
> **Cursor users:** LMCP tools only appear in **Agent mode**. Open a new Composer window (⌘I) and make sure the mode selector shows **Agent** (not Chat or Edit). Without Agent mode, the tools are installed but invisible.
|
|
20
|
+
|
|
19
21
|
**Or via npx:**
|
|
20
22
|
|
|
21
23
|
```bash
|
|
@@ -114,6 +116,10 @@ System: `diagnose` `run_diagnostics` `version_info` `get_config` `update_local_m
|
|
|
114
116
|
| VS Code | `~/.vscode/mcp.json` |
|
|
115
117
|
| Zed | `~/.config/zed/settings.json` |
|
|
116
118
|
|
|
119
|
+
### Cursor users
|
|
120
|
+
|
|
121
|
+
After install, switch to **Agent mode** in the Cursor chat panel — MCP tools only appear in Agent mode, not in Ask or Edit mode. Click the mode selector at the bottom of the chat input.
|
|
122
|
+
|
|
117
123
|
## Commands
|
|
118
124
|
|
|
119
125
|
```bash
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "local-mcp",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.72",
|
|
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
|
@@ -151,6 +151,18 @@ async function runSetup(opts = {}) {
|
|
|
151
151
|
fs.copyFileSync(binPath, tmpPath)
|
|
152
152
|
fs.chmodSync(tmpPath, 0o755)
|
|
153
153
|
try { execFileSync('codesign', ['--force', '--sign', '-', '--identifier', 'com.local-mcp.server', tmpPath], { stdio: 'pipe' }) } catch {}
|
|
154
|
+
// curl route-3 installs the binary one level deeper:
|
|
155
|
+
// ~/.local/share/local-mcp/bin/local-mcp-server/local-mcp-server
|
|
156
|
+
// leaving stablePath itself as a DIRECTORY. fs.renameSync throws EISDIR
|
|
157
|
+
// silently, so the npm stable binary is never written and the old curl
|
|
158
|
+
// server stays running forever (LMC-158).
|
|
159
|
+
try {
|
|
160
|
+
const st = fs.statSync(stablePath)
|
|
161
|
+
if (st.isDirectory()) {
|
|
162
|
+
process.stderr.write(' Migrating from curl install: removing old versioned directory at stable path\n')
|
|
163
|
+
fs.rmSync(stablePath, { recursive: true, force: true })
|
|
164
|
+
}
|
|
165
|
+
} catch { /* stablePath doesn't exist — nothing to do */ }
|
|
154
166
|
fs.renameSync(tmpPath, stablePath)
|
|
155
167
|
// Write version file so fast path knows when to update
|
|
156
168
|
const pkg = require('./package.json')
|
|
@@ -276,6 +288,10 @@ async function runSetup(opts = {}) {
|
|
|
276
288
|
}
|
|
277
289
|
console.log(' Setup guide & troubleshooting: https://local-mcp.com/setup\n')
|
|
278
290
|
|
|
291
|
+
// Migrate legacy curl LaunchAgent before launching tray — must run first
|
|
292
|
+
// so the tray's DaemonSupervisor doesn't race against the old server.
|
|
293
|
+
_migrateCurlLaunchAgent()
|
|
294
|
+
|
|
279
295
|
// Instalar y lanzar el tray (menu bar app) — arm64 only, non-fatal
|
|
280
296
|
await _installTray()
|
|
281
297
|
await _installTeamsProxy()
|
|
@@ -401,6 +417,28 @@ async function _promptEmail() {
|
|
|
401
417
|
})
|
|
402
418
|
}
|
|
403
419
|
|
|
420
|
+
/**
|
|
421
|
+
* Detects and removes the legacy com.local-mcp.server LaunchAgent left behind
|
|
422
|
+
* by older curl installs. In the current architecture the tray app's
|
|
423
|
+
* DaemonSupervisor manages the server process — the standalone LaunchAgent is
|
|
424
|
+
* no longer needed and causes the old binary to keep running after an npm
|
|
425
|
+
* migration (LMC-158).
|
|
426
|
+
*/
|
|
427
|
+
function _migrateCurlLaunchAgent() {
|
|
428
|
+
const plistPath = path.join(HOME, 'Library', 'LaunchAgents', 'com.local-mcp.server.plist')
|
|
429
|
+
if (!fs.existsSync(plistPath)) return
|
|
430
|
+
try {
|
|
431
|
+
const content = fs.readFileSync(plistPath, 'utf8')
|
|
432
|
+
// Only act on plists that reference an LMCP server binary
|
|
433
|
+
if (!content.includes('local-mcp-server') && !content.includes('Local MCP')) return
|
|
434
|
+
process.stderr.write('\n Migrating legacy server LaunchAgent to tray supervision...\n')
|
|
435
|
+
// launchctl unload kills the running process AND prevents it from restarting
|
|
436
|
+
try { execFileSync('launchctl', ['unload', plistPath], { stdio: 'pipe' }) } catch { /* may already be unloaded */ }
|
|
437
|
+
try { fs.unlinkSync(plistPath) } catch { /* non-fatal */ }
|
|
438
|
+
process.stderr.write(' ✓ Legacy server LaunchAgent removed — server will be restarted by tray\n\n')
|
|
439
|
+
} catch { /* non-fatal — don't block install on unexpected plist content */ }
|
|
440
|
+
}
|
|
441
|
+
|
|
404
442
|
function _pingInstall(clients, method, email = '') {
|
|
405
443
|
try {
|
|
406
444
|
const https = require('https')
|