tascan-mcp 3.4.0 → 3.5.0

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 +1 -1
  2. package/tools.cjs +11 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tascan-mcp",
3
- "version": "3.4.0",
3
+ "version": "3.5.0",
4
4
  "mcpName": "io.github.snowbikemike/tascan-mcp",
5
5
  "description": "TaScan MCP Server — Closed-loop autonomous operations protocol. 50 tools for projects, tasks, workers, QR codes, NFC tags, geofenced zones, AI condition assessment, worker passports, verification-gated gig payments, cross-entity search, duplicate-worker detection, AI issue analysis, and autonomous remediation dispatch. 14 patents filed (435+ claims). Task. Scan. Done.",
6
6
  "type": "module",
package/tools.cjs CHANGED
@@ -935,6 +935,11 @@ const TOOLS = [
935
935
  project_id: { type: 'string', description: 'Project this zone belongs to' },
936
936
  task_list_id: { type: 'string', description: 'Task list the Site Gate routes workers to when they are inside this zone' },
937
937
  enforce_on_list: { type: 'boolean', description: 'Zone-lock the task list — it cannot be started from outside the radius' },
938
+ notify_on_enter: { type: 'boolean', description: 'Email the manager when a worker enters this zone (danger areas)' },
939
+ notify_on_exit: { type: 'boolean', description: 'Email the manager when a worker leaves this zone (accountability — sign in then disappear)' },
940
+ auto_clock_in: { type: 'boolean', description: 'Entering the zone writes a shift_start clock-in event' },
941
+ auto_clock_out: { type: 'boolean', description: 'Leaving the zone writes a shift_end clock-out event' },
942
+ notify_email: { type: 'string', description: 'Alert recipient override — defaults to all org admins' },
938
943
  description: { type: 'string', description: 'Shown to workers on the Site Gate page' }
939
944
  },
940
945
  required: ['name', 'lat', 'lng']
@@ -943,7 +948,7 @@ const TOOLS = [
943
948
  handler: async (args, api) => {
944
949
  const result = await api('POST', '/zones', args);
945
950
  const z = result.data;
946
- let text = `Zone created: ${z.name}\n\nID: ${z.id}\nCenter: ${z.lat}, ${z.lng}\nRadius: ${z.radius_m}m\nRoutes to list: ${z.task_list_id || '(none — set task_list_id to enable Site Gate routing)'}\nZone-locked: ${z.enforce_on_list ? 'YES — list cannot start outside the zone' : 'no'}`;
951
+ let text = `Zone created: ${z.name}\n\nID: ${z.id}\nCenter: ${z.lat}, ${z.lng}\nRadius: ${z.radius_m}m\nRoutes to list: ${z.task_list_id || '(none — set task_list_id to enable Site Gate routing)'}\nZone-locked: ${z.enforce_on_list ? 'YES — list cannot start outside the zone' : 'no'}\nAlerts: enter=${z.notify_on_enter ? 'ON' : 'off'} exit=${z.notify_on_exit ? 'ON' : 'off'} · Auto-clock: in=${z.auto_clock_in ? 'ON' : 'off'} out=${z.auto_clock_out ? 'ON' : 'off'}`;
947
952
  if (z.project_id) text += `\n\nSite Gate URL (print this QR at the site entrance):\nhttps://app.tascan.io/geo.html?project=${z.project_id}`;
948
953
  return text;
949
954
  }
@@ -963,7 +968,7 @@ const TOOLS = [
963
968
  const zones = result.data || [];
964
969
  if (!zones.length) return 'No zones configured. Use tascan_create_zone to add one.';
965
970
  return zones.map(z =>
966
- `${z.name} (${z.id})\n Center: ${z.lat}, ${z.lng} · Radius: ${z.radius_m}m · ${z.is_active ? 'active' : 'INACTIVE'}\n Routes to: ${z.task_list_id || '—'} · Zone-locked: ${z.enforce_on_list ? 'yes' : 'no'}`
971
+ `${z.name} (${z.id})\n Center: ${z.lat}, ${z.lng} · Radius: ${z.radius_m}m · ${z.is_active ? 'active' : 'INACTIVE'}\n Routes to: ${z.task_list_id || '—'} · Zone-locked: ${z.enforce_on_list ? 'yes' : 'no'}\n Alerts: enter=${z.notify_on_enter ? 'ON' : 'off'} exit=${z.notify_on_exit ? 'ON' : 'off'} · Auto-clock: in=${z.auto_clock_in ? 'ON' : 'off'} out=${z.auto_clock_out ? 'ON' : 'off'}`
967
972
  ).join('\n\n');
968
973
  }
969
974
  },
@@ -976,7 +981,10 @@ const TOOLS = [
976
981
  zone_id: { type: 'string', description: 'Zone ID' },
977
982
  name: { type: 'string' }, lat: { type: 'number' }, lng: { type: 'number' },
978
983
  radius_m: { type: 'number' }, task_list_id: { type: 'string' },
979
- enforce_on_list: { type: 'boolean' }, is_active: { type: 'boolean' }
984
+ enforce_on_list: { type: 'boolean' }, is_active: { type: 'boolean' },
985
+ notify_on_enter: { type: 'boolean' }, notify_on_exit: { type: 'boolean' },
986
+ auto_clock_in: { type: 'boolean' }, auto_clock_out: { type: 'boolean' },
987
+ notify_email: { type: 'string' }
980
988
  },
981
989
  required: ['zone_id']
982
990
  },