fathom-mcp 0.5.2 → 0.5.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fathom-mcp",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "description": "MCP server for Fathom — vault operations, search, rooms, and cross-workspace communication",
5
5
  "type": "module",
6
6
  "bin": {
package/src/index.js CHANGED
@@ -309,6 +309,24 @@ const tools = [
309
309
  interval_minutes: { type: "integer", description: "Minutes between pings. Default: 60.", minimum: 1 },
310
310
  single_fire: { type: "boolean", description: "Auto-disable after firing once. Default: false." },
311
311
  workspace: WORKSPACE_PROP,
312
+ schedule: {
313
+ type: "string",
314
+ description: "Cron expression for scheduling (e.g. '0 */3 * * *' for every 3 hours, " +
315
+ "'0 8,12,16,20 * * *' for specific times). If omitted, uses interval_minutes.",
316
+ },
317
+ conditions: {
318
+ type: "array",
319
+ description: "Condition scripts that must pass (exit 0) before the routine fires. " +
320
+ "The schedule controls when to CHECK; conditions control whether to FIRE.",
321
+ items: {
322
+ type: "object",
323
+ properties: {
324
+ label: { type: "string" },
325
+ command: { type: "string" },
326
+ enabled: { type: "boolean" },
327
+ },
328
+ },
329
+ },
312
330
  context_sources: {
313
331
  type: "object",
314
332
  description: "What to inject on each ping.",
@@ -373,6 +391,24 @@ const tools = [
373
391
  interval_minutes: { type: "integer", description: "New interval in minutes.", minimum: 1 },
374
392
  single_fire: { type: "boolean", description: "Auto-disable after firing once." },
375
393
  workspace: WORKSPACE_PROP,
394
+ schedule: {
395
+ type: "string",
396
+ description: "Cron expression for scheduling (e.g. '0 */3 * * *' for every 3 hours, " +
397
+ "'0 8,12,16,20 * * *' for specific times). If omitted, uses interval_minutes.",
398
+ },
399
+ conditions: {
400
+ type: "array",
401
+ description: "Condition scripts that must pass (exit 0) before the routine fires. " +
402
+ "The schedule controls when to CHECK; conditions control whether to FIRE.",
403
+ items: {
404
+ type: "object",
405
+ properties: {
406
+ label: { type: "string" },
407
+ command: { type: "string" },
408
+ enabled: { type: "boolean" },
409
+ },
410
+ },
411
+ },
376
412
  context_sources: {
377
413
  type: "object",
378
414
  description: "What to inject on each ping.",
@@ -716,6 +752,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
716
752
  if (args.interval_minutes != null) routineParams.intervalMinutes = args.interval_minutes;
717
753
  if (args.single_fire != null) routineParams.singleFire = args.single_fire;
718
754
  if (args.context_sources != null) routineParams.contextSources = args.context_sources;
755
+ if (args.schedule !== undefined) routineParams.schedule = args.schedule;
756
+ if (args.conditions != null) routineParams.conditions = args.conditions;
719
757
  result = await client.createRoutine(routineParams, args.workspace || config.workspace);
720
758
  break;
721
759
  }
@@ -729,6 +767,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
729
767
  if (args.interval_minutes != null) updateParams.intervalMinutes = args.interval_minutes;
730
768
  if (args.single_fire != null) updateParams.singleFire = args.single_fire;
731
769
  if (args.context_sources != null) updateParams.contextSources = args.context_sources;
770
+ if (args.schedule !== undefined) updateParams.schedule = args.schedule;
771
+ if (args.conditions != null) updateParams.conditions = args.conditions;
732
772
  result = await client.updateRoutine(args.routine_id, updateParams, args.workspace || config.workspace);
733
773
  break;
734
774
  }
@@ -155,11 +155,12 @@ export function createWSConnection(config) {
155
155
  const pane = resolvePaneTarget();
156
156
 
157
157
  try {
158
- // Send the text literally, then press Enter
158
+ // Send the text literally, pause for tmux to render, then press Enter
159
159
  execSync(`tmux send-keys -t ${shellEscape(pane)} -l ${shellEscape(text)}`, {
160
160
  timeout: 5000,
161
161
  stdio: "ignore",
162
162
  });
163
+ execSync("sleep 2", { timeout: 5000 });
163
164
  execSync(`tmux send-keys -t ${shellEscape(pane)} Enter`, {
164
165
  timeout: 5000,
165
166
  stdio: "ignore",