fathom-mcp 0.5.3 → 0.5.5

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.3",
3
+ "version": "0.5.5",
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
  }
@@ -199,6 +199,8 @@ export function createClient(config) {
199
199
  if (params.intervalMinutes != null) body.intervalMinutes = params.intervalMinutes;
200
200
  if (params.singleFire != null) body.singleFire = params.singleFire;
201
201
  if (params.contextSources != null) body.contextSources = params.contextSources;
202
+ if (params.schedule !== undefined) body.schedule = params.schedule;
203
+ if (params.conditions != null) body.conditions = params.conditions;
202
204
  return request("POST", "/api/activation/ping/routines", {
203
205
  params: { workspace: ws },
204
206
  body,
@@ -218,6 +220,8 @@ export function createClient(config) {
218
220
  if (params.intervalMinutes != null) body.intervalMinutes = params.intervalMinutes;
219
221
  if (params.singleFire != null) body.singleFire = params.singleFire;
220
222
  if (params.contextSources != null) body.contextSources = params.contextSources;
223
+ if (params.schedule !== undefined) body.schedule = params.schedule;
224
+ if (params.conditions != null) body.conditions = params.conditions;
221
225
  return request("POST", `/api/activation/ping/routines/${encodeURIComponent(routineId)}`, {
222
226
  params: { workspace: ws },
223
227
  body,
@@ -160,7 +160,7 @@ export function createWSConnection(config) {
160
160
  timeout: 5000,
161
161
  stdio: "ignore",
162
162
  });
163
- execSync("sleep 1", { timeout: 5000 });
163
+ execSync("sleep 2", { timeout: 5000 });
164
164
  execSync(`tmux send-keys -t ${shellEscape(pane)} Enter`, {
165
165
  timeout: 5000,
166
166
  stdio: "ignore",