tascan-mcp 3.11.0 → 3.12.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.
package/README.md CHANGED
@@ -268,6 +268,9 @@ API keys are scoped to your organization and support rate limiting (60 requests/
268
268
 
269
269
  ## Changelog
270
270
 
271
+ ### v3.12.0 — 2026-09-12
272
+ - `tascan_send_task_email` and `tascan_assess_condition` now send the caller's API key (the TaScan functions behind them require it after the S99 security sweep). No tool additions — still 69 tools.
273
+
271
274
  ### v3.11.0 — 2026-09-11
272
275
  - **Signed photo URLs in every completion payload.** Photo evidence was invisible to AI agents: `photo_url` was a bare private-bucket path with no host or token. Every read path that returns a completion now also returns `photo_signed_url` (short-lived, default 1h, tunable via `TASCAN_PHOTO_URL_TTL`), `null` when there is no photo. Covered: `tascan_get_task` (task + subtask completions), `tascan_get_report` (new per-task `photos[]` when `include_responses` is true, replacing the bare `[+photo]` marker), `tascan_list_subtasks`, `tascan_query_responses`, `tascan_list_issues` / issue analysis (issue + injury photos), `tascan_zone_compliance` (PPE checkpoint photos), `tascan_condition_history` (assessment + baseline photos).
273
276
  - One batched storage signing call per response (a 40-task list fires one request, not 40). Signing failures log and degrade to `photo_signed_url: null` with the raw path intact; the tool call never fails.
package/index.js CHANGED
@@ -43,9 +43,10 @@ async function api(method, path, body) {
43
43
  }
44
44
  return data;
45
45
  }
46
+ api.key = API_KEY; // raw-fetch tools read the key from here (S99: those functions now require auth)
46
47
 
47
48
  const server = new Server(
48
- { name: 'tascan', version: '3.11.0' },
49
+ { name: 'tascan', version: '3.12.0' },
49
50
  { capabilities: { tools: {} } }
50
51
  );
51
52
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tascan-mcp",
3
- "version": "3.11.0",
3
+ "version": "3.12.0",
4
4
  "mcpName": "io.github.snowbikemike/tascan-mcp",
5
5
  "description": "TaScan MCP Server — Closed-loop autonomous operations protocol. 69 tools for projects, tasks, workers, QR codes, NFC tags, worker marketplace with consented SMS invites, geofenced zones with rules (work site / hazard + AI-verified PPE checkpoints / containment / restricted, breach alerts, zone compliance audit), AI condition assessment, worker passports, verification-gated gig payments, client invoicing from verified work (overtime / day rate / per diem / expenses), shareable report links (completion, client service report, project, evidence pack), cross-entity search, duplicate-worker detection, worker identity merge, AI issue analysis, and autonomous remediation dispatch. 15 patents filed (470+ claims). Task. Scan. Done.",
6
6
  "type": "module",
package/tools.cjs CHANGED
@@ -1079,12 +1079,12 @@ const TOOLS = [
1079
1079
  required: ['to_email', 'list_id']
1080
1080
  },
1081
1081
  annotations: { title: 'Send Task Email', readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
1082
- handler: async (args) => {
1083
- // Call the send-task-email function directly via HTTP
1082
+ handler: async (args, api) => {
1083
+ // Call the send-task-email function directly via HTTP (S99: it now requires the caller's tsk_ key)
1084
1084
  const url = 'https://app.tascan.io/.netlify/functions/send-task-email';
1085
1085
  const resp = await fetch(url, {
1086
1086
  method: 'POST',
1087
- headers: { 'Content-Type': 'application/json' },
1087
+ headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + ((api && api.key) || API_KEY) },
1088
1088
  body: JSON.stringify({
1089
1089
  to_email: args.to_email,
1090
1090
  to_name: args.to_name,
@@ -1444,10 +1444,10 @@ const TOOLS = [
1444
1444
  required: ['asset_id', 'photo_url']
1445
1445
  },
1446
1446
  annotations: { title: 'Assess Asset Condition', readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
1447
- handler: async (args) => {
1447
+ handler: async (args, api) => {
1448
1448
  const resp = await fetch('https://app.tascan.io/api/assess-condition', {
1449
1449
  method: 'POST',
1450
- headers: { 'Content-Type': 'application/json' },
1450
+ headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + ((api && api.key) || API_KEY) },
1451
1451
  body: JSON.stringify({ asset_id: args.asset_id, photo_url: args.photo_url, worker_name: args.worker_name || null, source: 'api' })
1452
1452
  });
1453
1453
  const data = await resp.json();