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 +3 -0
- package/index.js +2 -1
- package/package.json +1 -1
- package/tools.cjs +5 -5
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.
|
|
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.
|
|
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();
|