minutes-mcp 0.8.3 → 0.8.4

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/dist/index.js +63 -5
  2. package/package.json +2 -2
package/dist/index.js CHANGED
@@ -146,8 +146,8 @@ function findMinutesBinary() {
146
146
  }
147
147
  let MINUTES_BIN = findMinutesBinary();
148
148
  // ── Expected CLI version (must match this MCP server release) ──
149
- const EXPECTED_CLI_VERSION = "0.8.1";
150
- const RELEASE_TAG = "v0.8.1-live-coach";
149
+ const EXPECTED_CLI_VERSION = "0.8.4";
150
+ const RELEASE_TAG = "v0.8.4";
151
151
  // ── CLI auto-install ────────────────────────────────────────
152
152
  // When installed via MCPB or `npx minutes-mcp`, the Rust CLI binary
153
153
  // may not be present. We attempt to install it automatically so
@@ -370,7 +370,7 @@ function parseJsonOutput(stdout) {
370
370
  // ── MCP Server ──────────────────────────────────────────────
371
371
  const server = new McpServer({
372
372
  name: "minutes",
373
- version: "0.8.3",
373
+ version: "0.8.4",
374
374
  });
375
375
  // Declare MCP Apps extension support so hosts classify this server as interactive.
376
376
  // The `extensions` field is part of the draft MCP spec (SEP-1724) — not yet in the
@@ -1282,7 +1282,7 @@ server.resource("recent-ideas", "minutes://ideas/recent", { description: "Recent
1282
1282
  };
1283
1283
  });
1284
1284
  // ── Tool: start_dictation ──────────────────────────────────
1285
- server.tool("start_dictation", "Start dictation mode. Speak naturally — text goes to clipboard and daily note after each pause. Runs until stop_dictation is called or silence timeout.", {}, { title: "Start Dictation", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false }, async () => {
1285
+ server.tool("start_dictation", "Start dictation mode. Speak naturally — text accumulates across pauses and the combined result is written when dictation ends. Runs until stop_dictation is called or silence timeout.", {}, { title: "Start Dictation", readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false }, async () => {
1286
1286
  if (!(await isCliAvailable())) {
1287
1287
  return { content: [{ type: "text", text: CLI_INSTALL_MSG }] };
1288
1288
  }
@@ -1311,7 +1311,7 @@ server.tool("start_dictation", "Start dictation mode. Speak naturally — text g
1311
1311
  content: [
1312
1312
  {
1313
1313
  type: "text",
1314
- text: "Dictation started. Speak naturally — text will be copied to clipboard after each pause. Say \"stop dictation\" when done.",
1314
+ text: "Dictation started. Speak naturally — text accumulates across pauses and will be copied when dictation ends. Say \"stop dictation\" when done.",
1315
1315
  },
1316
1316
  ],
1317
1317
  };
@@ -1468,6 +1468,64 @@ server.tool("read_live_transcript", "Read the live transcript. Returns utterance
1468
1468
  };
1469
1469
  }
1470
1470
  });
1471
+ // ── Dashboard ───────────────────────────────────────────────
1472
+ server.tool("open_dashboard", "Open the Meeting Intelligence Dashboard in the browser. Shows a visual overview of your conversation memory: metrics, meeting timeline, decisions, recurring topics, action items, and voice memos. Runs a local HTTP server — data never leaves your machine.", {}, { title: "Open Dashboard", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false }, async () => {
1473
+ if (!(await isCliAvailable())) {
1474
+ return { content: [{ type: "text", text: CLI_INSTALL_MSG }] };
1475
+ }
1476
+ // Check if dashboard is already running via PID file
1477
+ const pidPath = join(homedir(), ".minutes", "dashboard.pid");
1478
+ try {
1479
+ const pidStr = await readFile(pidPath, "utf-8");
1480
+ const pid = parseInt(pidStr.trim(), 10);
1481
+ if (pid > 0) {
1482
+ // Check if process is alive
1483
+ try {
1484
+ process.kill(pid, 0);
1485
+ return {
1486
+ content: [{
1487
+ type: "text",
1488
+ text: `Dashboard already running (PID ${pid}). Open http://localhost:3141 in your browser.`,
1489
+ }],
1490
+ };
1491
+ }
1492
+ catch {
1493
+ // Process not alive, stale PID — proceed to launch
1494
+ }
1495
+ }
1496
+ }
1497
+ catch {
1498
+ // No PID file — proceed to launch
1499
+ }
1500
+ // Spawn dashboard as detached subprocess
1501
+ const { spawn } = await import("child_process");
1502
+ const child = spawn(MINUTES_BIN, ["dashboard"], {
1503
+ detached: true,
1504
+ stdio: "ignore",
1505
+ });
1506
+ child.unref();
1507
+ // Give it a moment to start
1508
+ await new Promise((resolve) => setTimeout(resolve, 1000));
1509
+ // Count meetings for the response
1510
+ try {
1511
+ const { stdout } = await runMinutes(["list", "--format", "json", "--limit", "999"]);
1512
+ const lines = stdout.trim().split("\n").filter(Boolean);
1513
+ return {
1514
+ content: [{
1515
+ type: "text",
1516
+ text: `Dashboard opened at http://localhost:3141 (${lines.length} meetings loaded).`,
1517
+ }],
1518
+ };
1519
+ }
1520
+ catch {
1521
+ return {
1522
+ content: [{
1523
+ type: "text",
1524
+ text: "Dashboard opened at http://localhost:3141.",
1525
+ }],
1526
+ };
1527
+ }
1528
+ });
1471
1529
  // ── Start server ────────────────────────────────────────────
1472
1530
  async function main() {
1473
1531
  const transport = new StdioServerTransport();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "minutes-mcp",
3
- "version": "0.8.3",
3
+ "version": "0.8.4",
4
4
  "description": "MCP server for minutes — conversation memory for AI assistants. Works with Claude Desktop, Mistral Vibe, Cursor, Windsurf, and any MCP client.",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
@@ -40,7 +40,7 @@
40
40
  "dependencies": {
41
41
  "@modelcontextprotocol/ext-apps": "^1.2.2",
42
42
  "@modelcontextprotocol/sdk": "^1.27.1",
43
- "minutes-sdk": "^0.8.0",
43
+ "minutes-sdk": "^0.8.3",
44
44
  "yaml": "^2.8.3"
45
45
  },
46
46
  "devDependencies": {