local-mcp 3.0.100 → 3.0.102

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.
Files changed (2) hide show
  1. package/download.js +31 -7
  2. package/package.json +1 -1
package/download.js CHANGED
@@ -151,12 +151,26 @@ async function ensureBinary() {
151
151
  // Asegurar que sea ejecutable
152
152
  fs.chmodSync(binPath, 0o755)
153
153
 
154
- // Re-firmar ad-hoc con bundle identifier estable.
155
- // --identifier da al binario una identidad TCC persistente aunque cambie la ruta de versión.
156
- // Sin esto, macOS atribuye los permisos TCC al proceso padre (node) diálogo cada reinicio.
154
+ // Clear quarantine separately Node.js https downloads don't set it, but tar extraction
155
+ // on some macOS versions can inherit it from the archive. Non-critical.
156
+ try { execFileSync('xattr', ['-d', 'com.apple.quarantine', binPath], { stdio: 'pipe' }) } catch { /* no quarantine, fine */ }
157
+
158
+ // Preserve the Developer ID signature from the build pipeline.
159
+ // On macOS 26+ ad-hoc signatures (--sign -) don't create a stable TCC identity:
160
+ // each new CDHash is treated as a new app, triggering "node would like to access
161
+ // data from other apps" on every JXA call. Only fall back to ad-hoc if the binary
162
+ // has no valid signature at all (e.g. a dev build that was never properly signed).
163
+ // See: FB-74E468, FB-017B8E — permission prompt loop on macOS 26 beta.
164
+ let hasSig = false
157
165
  try {
158
- execFileSync('codesign', ['--force', '--sign', '-', '--identifier', 'com.local-mcp.server', binPath], { stdio: 'pipe' })
159
- } catch { /* no crítico */ }
166
+ execFileSync('codesign', ['--verify', binPath], { stdio: 'pipe' })
167
+ hasSig = true
168
+ } catch { /* no valid signature — apply ad-hoc fallback */ }
169
+ if (!hasSig) {
170
+ try {
171
+ execFileSync('codesign', ['--force', '--sign', '-', '--identifier', 'com.local-mcp.server', binPath], { stdio: 'pipe' })
172
+ } catch { /* non-critical */ }
173
+ }
160
174
 
161
175
  process.stderr.write(` Listo en ${versionDir}\n`)
162
176
  return { binPath, versionDir, version }
@@ -201,7 +215,12 @@ async function ensureTeamsProxy() {
201
215
 
202
216
  if (!fs.existsSync(binPath)) throw new Error('teams-proxy no encontrado tras extraer')
203
217
  fs.chmodSync(binPath, 0o755)
204
- try { execFileSync('codesign', ['--force', '--sign', '-', '--identifier', 'com.local-mcp.teams-proxy', binPath], { stdio: 'pipe' }) } catch { /* no crítico */ }
218
+ try { execFileSync('xattr', ['-d', 'com.apple.quarantine', binPath], { stdio: 'pipe' }) } catch {}
219
+ let tpHasSig = false
220
+ try { execFileSync('codesign', ['--verify', binPath], { stdio: 'pipe' }); tpHasSig = true } catch {}
221
+ if (!tpHasSig) {
222
+ try { execFileSync('codesign', ['--force', '--sign', '-', '--identifier', 'com.local-mcp.teams-proxy', binPath], { stdio: 'pipe' }) } catch { /* no crítico */ }
223
+ }
205
224
 
206
225
  fs.writeFileSync(verFile, version, 'utf8')
207
226
  process.stderr.write(` teams-proxy instalado en ${binPath}\n`)
@@ -356,7 +375,12 @@ async function ensureSlackProxy() {
356
375
 
357
376
  if (!fs.existsSync(binPath)) throw new Error('slack-proxy not found after extraction')
358
377
  fs.chmodSync(binPath, 0o755)
359
- try { execFileSync('codesign', ['--force', '--sign', '-', '--identifier', 'com.local-mcp.slack-proxy', binPath], { stdio: 'pipe' }) } catch { /* non-critical */ }
378
+ try { execFileSync('xattr', ['-d', 'com.apple.quarantine', binPath], { stdio: 'pipe' }) } catch {}
379
+ let spHasSig = false
380
+ try { execFileSync('codesign', ['--verify', binPath], { stdio: 'pipe' }); spHasSig = true } catch {}
381
+ if (!spHasSig) {
382
+ try { execFileSync('codesign', ['--force', '--sign', '-', '--identifier', 'com.local-mcp.slack-proxy', binPath], { stdio: 'pipe' }) } catch { /* non-critical */ }
383
+ }
360
384
 
361
385
  fs.writeFileSync(verFile, version, 'utf8')
362
386
  process.stderr.write(` slack-proxy installed at ${binPath}\n`)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "local-mcp",
3
- "version": "3.0.100",
3
+ "version": "3.0.102",
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": {