tascan-mcp 3.2.0 → 3.3.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/package.json +2 -2
- package/tools.cjs +69 -1
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tascan-mcp",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.0",
|
|
4
4
|
"mcpName": "io.github.snowbikemike/tascan-mcp",
|
|
5
|
-
"description": "TaScan MCP Server — Closed-loop autonomous operations protocol.
|
|
5
|
+
"description": "TaScan MCP Server — Closed-loop autonomous operations protocol. 46 tools for projects, tasks, workers, QR codes, NFC tags, geofenced zones, AI condition assessment, worker passports, verification-gated gig payments, AI issue analysis, and autonomous remediation dispatch. 14 patents filed (435+ claims). Task. Scan. Done.",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "index.js",
|
|
8
8
|
"bin": {
|
package/tools.cjs
CHANGED
|
@@ -1015,7 +1015,7 @@ const TOOLS = [
|
|
|
1015
1015
|
inputSchema: {
|
|
1016
1016
|
type: 'object',
|
|
1017
1017
|
properties: {
|
|
1018
|
-
asset_id: { type: 'string', description: 'Asset ID from tascan_register_asset
|
|
1018
|
+
asset_id: { type: 'string', description: 'Asset ID (from tascan_register_asset or tascan_list_assets)' },
|
|
1019
1019
|
photo_url: { type: 'string', description: 'Public URL of the assessment photo' },
|
|
1020
1020
|
worker_name: { type: 'string', description: 'Who took the photo (optional)' }
|
|
1021
1021
|
},
|
|
@@ -1068,6 +1068,74 @@ const TOOLS = [
|
|
|
1068
1068
|
}
|
|
1069
1069
|
},
|
|
1070
1070
|
|
|
1071
|
+
{
|
|
1072
|
+
name: 'tascan_list_assets',
|
|
1073
|
+
description: 'List registered condition-ledger assets with their latest condition scores. Use to recover an asset_id for tascan_assess_condition or tascan_condition_history.',
|
|
1074
|
+
inputSchema: {
|
|
1075
|
+
type: 'object',
|
|
1076
|
+
properties: { project_id: { type: 'string', description: 'Filter by project' } },
|
|
1077
|
+
required: []
|
|
1078
|
+
},
|
|
1079
|
+
annotations: { title: 'List Condition Assets', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
1080
|
+
handler: async (args, api) => {
|
|
1081
|
+
const path = '/assets' + (args.project_id ? `?project_id=${args.project_id}` : '');
|
|
1082
|
+
const result = await api('GET', path);
|
|
1083
|
+
const assets = result.data || [];
|
|
1084
|
+
if (!assets.length) return 'No assets registered. Use tascan_register_asset to add one.';
|
|
1085
|
+
return assets.map(a =>
|
|
1086
|
+
`${a.name} (${a.id})${a.serial_number ? '\n SN: ' + a.serial_number : ''}${a.asset_type ? ' · ' + a.asset_type : ''}${a.location_description ? '\n Location: ' + a.location_description : ''}`
|
|
1087
|
+
).join('\n\n');
|
|
1088
|
+
}
|
|
1089
|
+
},
|
|
1090
|
+
|
|
1091
|
+
// ─── Gig Payments (verification-gated direct payer→worker) ───────
|
|
1092
|
+
{
|
|
1093
|
+
name: 'tascan_request_payment',
|
|
1094
|
+
description: 'Pledge a payment on a task list: when the list is verified complete (every task done + photo evidence on photo-required tasks), the payer automatically receives a Stripe pay link that routes the money DIRECTLY to the worker (0% TaScan fee). No money moves and no card is stored at pledge time. The worker must have completed payout onboarding (Get Paid on their profile).',
|
|
1095
|
+
inputSchema: {
|
|
1096
|
+
type: 'object',
|
|
1097
|
+
properties: {
|
|
1098
|
+
task_list_id: { type: 'string', description: 'Task list the payment is tied to' },
|
|
1099
|
+
worker_id: { type: 'string', description: 'Worker who gets paid' },
|
|
1100
|
+
amount_cents: { type: 'number', description: 'Amount in cents ($1 min, $10,000 max)' },
|
|
1101
|
+
payer_email: { type: 'string', description: 'Who pays — receives the pay link on verification' },
|
|
1102
|
+
payer_name: { type: 'string' },
|
|
1103
|
+
memo: { type: 'string', description: 'What the payment is for (shown to the payer)' }
|
|
1104
|
+
},
|
|
1105
|
+
required: ['task_list_id', 'worker_id', 'amount_cents', 'payer_email']
|
|
1106
|
+
},
|
|
1107
|
+
annotations: { title: 'Request Verified Payment', readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
1108
|
+
handler: async (args, api) => {
|
|
1109
|
+
const result = await api('POST', '/payments', args);
|
|
1110
|
+
const p = result.data;
|
|
1111
|
+
return `Payment pledged: $${(p.amount_cents / 100).toFixed(2)} to worker ${p.worker_id}\n\nID: ${p.id}\nStatus: ${p.status}\nPayer: ${p.payer_email}\n\n${result.note || 'Pay link is issued automatically when the list is verified complete.'}`;
|
|
1112
|
+
}
|
|
1113
|
+
},
|
|
1114
|
+
{
|
|
1115
|
+
name: 'tascan_list_payments',
|
|
1116
|
+
description: 'List gig payments and their lifecycle status: awaiting_completion (pledged, work not verified yet), ready_to_pay (verified — pay link sent to payer), paid, canceled. Filter by task list or status.',
|
|
1117
|
+
inputSchema: {
|
|
1118
|
+
type: 'object',
|
|
1119
|
+
properties: {
|
|
1120
|
+
task_list_id: { type: 'string', description: 'Filter by task list' },
|
|
1121
|
+
status: { type: 'string', enum: ['awaiting_completion', 'ready_to_pay', 'paid', 'canceled'], description: 'Filter by status' }
|
|
1122
|
+
},
|
|
1123
|
+
required: []
|
|
1124
|
+
},
|
|
1125
|
+
annotations: { title: 'List Gig Payments', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
1126
|
+
handler: async (args, api) => {
|
|
1127
|
+
const qs = [];
|
|
1128
|
+
if (args.task_list_id) qs.push(`task_list_id=${args.task_list_id}`);
|
|
1129
|
+
if (args.status) qs.push(`status=${args.status}`);
|
|
1130
|
+
const result = await api('GET', '/payments' + (qs.length ? '?' + qs.join('&') : ''));
|
|
1131
|
+
const payments = result.data || [];
|
|
1132
|
+
if (!payments.length) return 'No payments found.';
|
|
1133
|
+
return payments.map(p =>
|
|
1134
|
+
`$${(p.amount_cents / 100).toFixed(2)} — ${p.status.toUpperCase()}\n ID: ${p.id}\n List: ${p.task_list_id}\n Payer: ${p.payer_email}${p.memo ? '\n Memo: ' + p.memo : ''}${p.paid_at ? '\n Paid: ' + p.paid_at : p.released_at ? '\n Link issued: ' + p.released_at : ''}`
|
|
1135
|
+
).join('\n\n');
|
|
1136
|
+
}
|
|
1137
|
+
},
|
|
1138
|
+
|
|
1071
1139
|
// ─── Worker Passport (Patent 4 foundation) ───────────────────────
|
|
1072
1140
|
{
|
|
1073
1141
|
name: 'tascan_get_worker_passport',
|