local-mcp 3.0.8 → 3.0.10

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/package.json +2 -2
  2. package/setup.js +58 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "local-mcp",
3
- "version": "3.0.8",
3
+ "version": "3.0.10",
4
4
  "description": "Pilot MCP — 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": {
@@ -70,5 +70,5 @@
70
70
  "bugs": {
71
71
  "url": "https://github.com/lanchuske/local-mcp/issues"
72
72
  },
73
- "mcpName": "com.local-mcp/local-mcp"
73
+ "mcpName": "io.github.lanchuske/local-mcp"
74
74
  }
package/setup.js CHANGED
@@ -192,9 +192,18 @@ async function runSetup(opts = {}) {
192
192
  } catch { /* config not created yet — will be created on first run */ }
193
193
  }
194
194
 
195
+ // Health check — verify binary works before showing success
196
+ const healthOk = _runHealthCheck()
197
+
195
198
  console.log('\n──────────────────────────────────────')
196
199
  if (configured.length > 0) {
197
- console.log(`✅ Pilot MCP configured for: ${configured.join(', ')}\n`)
200
+ if (healthOk) {
201
+ console.log(`✅ Pilot MCP configured for: ${configured.join(', ')}\n`)
202
+ console.log(' ✓ Server binary verified — 82 tools ready\n')
203
+ } else {
204
+ console.log(`⚠ Pilot MCP configured for: ${configured.join(', ')}`)
205
+ console.log(' Server binary could not be verified — it may still work after restart.\n')
206
+ }
198
207
  console.log('┌─────────────────────────────────────────────────────┐')
199
208
  console.log('│ NEXT STEP — This is important: │')
200
209
  console.log('│ │')
@@ -239,6 +248,29 @@ async function _installTray() {
239
248
  }
240
249
  }
241
250
 
251
+ function _runHealthCheck() {
252
+ try {
253
+ const binPath = path.join(HOME, '.local', 'share', 'local-mcp', 'bin', 'local-mcp-server')
254
+ if (!fs.existsSync(binPath)) return false
255
+ // Run with --export-tools to verify binary launches and responds
256
+ const result = execFileSync(binPath, ['--export-tools'], {
257
+ timeout: 10000,
258
+ stdio: ['pipe', 'pipe', 'pipe'],
259
+ env: { ...process.env, HOME },
260
+ })
261
+ const output = result.toString().trim()
262
+ // Should return JSON array of tools
263
+ const tools = JSON.parse(output)
264
+ if (Array.isArray(tools) && tools.length > 50) {
265
+ process.stderr.write(` Health check: ${tools.length} tools verified\n`)
266
+ return true
267
+ }
268
+ return false
269
+ } catch {
270
+ return false
271
+ }
272
+ }
273
+
242
274
  function _getRef() {
243
275
  return process.env.LMCP_REF || ''
244
276
  }
@@ -266,6 +298,7 @@ function _pingInstall(clients, method) {
266
298
  try {
267
299
  const https = require('https')
268
300
  const pkg = require('./package.json')
301
+ const machineId = _getMachineId()
269
302
  const data = JSON.stringify({
270
303
  version: pkg.version,
271
304
  os_version: require('os').release(),
@@ -273,7 +306,7 @@ function _pingInstall(clients, method) {
273
306
  node_version: process.version,
274
307
  method: method,
275
308
  clients_configured: clients,
276
- machine_id: _getMachineId(),
309
+ machine_id: machineId,
277
310
  source: process.env.LMCP_SOURCE || '',
278
311
  ref: _getRef(),
279
312
  })
@@ -284,9 +317,31 @@ function _pingInstall(clients, method) {
284
317
  headers: { 'Content-Type': 'application/json', 'Content-Length': data.length },
285
318
  timeout: 5000,
286
319
  })
287
- req.on('error', () => {}) // silencioso
320
+ req.on('error', () => {})
288
321
  req.write(data)
289
322
  req.end()
323
+
324
+ // Send initial heartbeat so the machine appears as "activated" immediately
325
+ // Even if the user doesn't restart their AI client right away
326
+ const hb = JSON.stringify({
327
+ machine_id: machineId,
328
+ version: pkg.version,
329
+ os_version: require('os').release(),
330
+ arch: process.arch,
331
+ transport: 'stdio',
332
+ ai_client: clients[0] || '',
333
+ started_at: new Date().toISOString(),
334
+ })
335
+ const hbReq = https.request({
336
+ hostname: 'office-mcp-production.up.railway.app',
337
+ path: '/heartbeat',
338
+ method: 'POST',
339
+ headers: { 'Content-Type': 'application/json', 'Content-Length': hb.length },
340
+ timeout: 5000,
341
+ })
342
+ hbReq.on('error', () => {})
343
+ hbReq.write(hb)
344
+ hbReq.end()
290
345
  } catch { /* no bloquear */ }
291
346
  }
292
347