{"name":"io.github.snowbikemike/tascan-mcp","slug":"snowbikemike-tascan-mcp","title":"TaScan","description":"36 MCP tools for projects, tasks, workers, QR/NFC tags, and AI remediation. Task. Scan. Done.","url":"https://mcp.market/server/snowbikemike-tascan-mcp","rating":null,"grade":"A","score":86,"certified":false,"status":"active","category":"productivity","tags":["productivity","security"],"presence":{"score":40,"stars":1,"forks":0,"downloads_week":573,"last_push_at":"2026-09-13T04:48:27.000Z","license":"NOASSERTION"},"uptime":{"percent":100,"checks":20,"ok":20,"last_checked_at":"2026-09-24T10:11:14.134Z","last_ok_at":"2026-09-24T10:11:14.134Z","latency_ms":495},"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/snowbikemike/tascan-mcp","website":"https://tascan.io","version":"3.0.0","remotes":[{"type":"streamable-http","url":"https://app.tascan.io/mcp"}],"packages":[{"registryType":"npm","identifier":"tascan-mcp","version":"3.0.0","transport":{"type":"stdio"},"environmentVariables":[{"description":"Your TaScan API key (generate in Admin Portal > Team > API Keys)","isRequired":true,"isSecret":true,"name":"TASCAN_API_KEY"},{"description":"TaScan API base URL (default: https://app.tascan.io/api/v1)","name":"TASCAN_API_URL"}]}],"tools":[{"name":"tascan_add_subtasks","description":"Add one or more subtasks to a task (bulk). Subtasks support typed responses: \"number\" for per-set data (reps, weight, distance), \"text\" for notes, \"choice\" for options, \"checkbox\" for simple steps. Set-logging example: task \"Bench Press\" with subtasks Set 1/Set 2/Set 3 each response_type \"number\" — each completed set stores its value and timestamp, giving per-set timing for progression tracking.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"task_id":{"type":"string","description":"Parent task ID"},"subtasks":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","description":"Subtask title (e.g. \"Set 1\")"},"description":{"type":"string","description":"Optional detail"},"response_type":{"type":"string","enum":["checkbox","number","text","choice","link","url","file"],"description":"Default checkbox. \"number\" for per-set values. \"choice\" needs response_config.options. \"link\" = the worker submits a URL. \"url\" = the worker visits a preset URL and confirms. \"file\" = the worker uploads a file."},"response_config":{"type":"object","description":"For \"choice\": {options: [...]}. For \"number\"/\"text\": {placeholder}."},"requires_photo":{"type":"boolean","description":"Require photo on completion"},"sort_order":{"type":"number","description":"Explicit position (defaults to end, in array order)"}},"required":["title"]},"description":"Array of subtasks to create"}},"required":["task_id","subtasks"]}},{"name":"tascan_add_tasks","description":"Add one or more tasks to an event (task list). Supports bulk creation. IMPORTANT: Set response_type correctly — use \"text\" for info collection (names, phones, emails, notes), \"photo\" for visual verification (inspections, serial numbers, damage checks), \"checkbox\" only for simple confirmations. NOTE: To dispatch tasks to an AI agent use tascan_dispatch_to_agent instead. Writing into an agent inbox list requires the agent:dispatch permission (agent:dispatch:code for CODE:/SHELL: titles) — without it the call is refused.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"list_id":{"type":"string","description":"Task list (event) ID"},"tasks":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","description":"Task title"},"description":{"type":"string","description":"Task description"},"response_type":{"type":"string","enum":["checkbox","photo","text","number","date","choice","link","url","file"],"description":"CRITICAL: \"text\" for names, phones, emails, notes, addresses, any free-form input. \"photo\" for tasks needing photographic proof (inspections, serial numbers, packed cases). \"checkbox\" ONLY for simple yes/no confirmations. \"number\" for numeric values. \"date\" for dates. \"choice\" for multiple-choice (needs response_config.options). \"link\" = the worker SUBMITS a URL (auto-verified by an http probe). \"url\" = the worker VISITS a preset URL and confirms. \"file\" = the worker uploads a file. Most info-collection tasks should be \"text\", most verification tasks should be \"photo\"."},"response_config":{"type":"object","description":"Response configuration. For \"choice\": {options: [\"A\",\"B\",\"C\"]}. For \"text\": {placeholder, multiline}. For \"number\": {placeholder}. For \"date\": {label, include_text}."},"is_safety_checkpoint":{"type":"boolean","description":"Safety-critical task flag"},"requires_photo":{"type":"boolean","description":"Require photo on completion"},"sort_order":{"type":"number","description":"Explicit sort position (defaults to end of list, in array order)"},"required_equipment":{"type":"string","description":"Equipment this task depends on (free text, e.g. \"88 lb kettlebells\")"},"assigned_to":{"type":"string","description":"Worker to assign this task to — pass the worker UUID (validated against your org and stored as the worker's name, which is how the worker portal matches \"my tasks\"). A plain name string is also accepted as-is."},"subtasks":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string","description":"Subtask title (e.g. \"Set 1\")"},"response_type":{"type":"string","enum":["checkbox","number","text","choice","link","url","file"],"description":"Typed subtask response. \"number\" for per-set values (reps/weight), \"text\" for notes, \"choice\" needs response_config.options. \"link\" = the worker submits a URL. \"url\" = the worker visits a preset URL and confirms. \"file\" = the worker uploads a file. Default checkbox."},"response_config":{"type":"object","description":"Same shape as task response_config"},"requires_photo":{"type":"boolean"}},"required":["title"]},"description":"Subtasks created with the task. Example set logging: [{title:\"Set 1\",response_type:\"number\"},{title:\"Set 2\",response_type:\"number\"},{title:\"Set 3\",response_type:\"number\"}]"}},"required":["title"]},"description":"Array of tasks to create"}},"required":["list_id","tasks"]}},{"name":"tascan_analyze_issue","description":"Step 1 of the Closed-Loop Autonomous Operations Protocol. Retrieves full issue context including worker info, message thread, project history, and recent similar issues. Use this data to reason about the root cause and generate a remediation plan. Also supports server-side AI analysis via POST (calls Anthropic API directly).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"issue_id":{"type":"string","description":"Issue ID to analyze"},"server_side_ai":{"type":"boolean","description":"If true, the server calls Anthropic API directly for AI analysis (default: false — returns raw data for MCP client to analyze)"}},"required":["issue_id"]}},{"name":"tascan_apply_template","description":"Apply a pre-built template to a task list, adding all template tasks","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"list_id":{"type":"string","description":"Task list (event) ID"},"template_slug":{"type":"string","description":"Template slug (e.g. \"conference-load-in\", \"warehouse-receiving\")"}},"required":["list_id","template_slug"]}},{"name":"tascan_assess_condition","description":"Run an AI condition assessment of an asset from a photo. The model scores 0-100 with the asset's full assessment history in context, so it reads degradation over time — returning the Condition Delta Score vs the previous assessment, defects, wear indicators, maintenance recommendations, and a degradation trajectory. Sensor-free predictive maintenance.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"asset_id":{"type":"string","description":"Asset ID (from tascan_register_asset or tascan_list_assets)"},"photo_url":{"type":"string","description":"Public URL of the assessment photo"},"worker_name":{"type":"string","description":"Who took the photo (optional)"}},"required":["asset_id","photo_url"]}},{"name":"tascan_auto_resolve","description":"FULL Closed-Loop Autonomous Operations Protocol in one call. Server-side AI analyzes the issue, generates remediation tasks, creates a task list, and dispatches to the worker — all without human intervention. This executes Patent Claim 7: autonomous operations from issue detection through physical-world instruction delivery.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"issue_id":{"type":"string","description":"Issue ID to auto-resolve"}},"required":["issue_id"]}},{"name":"tascan_cancel_scheduled_sms","description":"Cancel a scheduled text that has not been sent yet (status pending). A row already sending, sent, failed or cancelled is refused (409) — a sent text cannot be recalled.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"The scheduled_sms row id from tascan_schedule_sms / tascan_list_scheduled_sms"}},"required":["id"]}},{"name":"tascan_complete_subtask","description":"Complete a subtask, optionally recording a typed response_value (e.g. the weight or reps for that set). Each completion is timestamped, so consecutive set completions yield per-set durations. Returns progress including all_subtasks_complete — when true, complete the parent task with tascan_complete_task.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"subtask_id":{"type":"string","description":"Subtask ID to complete"},"worker_id":{"type":"string","description":"Worker performing the completion (optional)"},"response_value":{"type":"string","description":"Typed response value (for number/text/choice subtasks), e.g. \"165\""},"notes":{"type":"string","description":"Optional notes"}},"required":["subtask_id"]}},{"name":"tascan_complete_task","description":"Complete an ORDINARY task on behalf of a worker. Inserts a completion record and timer event. Use this to simulate or record task completions via the API. Coordination-cycle tasks (a CODE:/REVIEW: build or review, a Decision / Question / Integrate / Parked card on a project Decisions list — tasks that carry `coord`) are refused with 403 for every key tier: builds and reviews are completed by their runner, decisions only by the human on the worker page.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"task_id":{"type":"string","description":"Task ID to complete"},"worker_id":{"type":"string","description":"Worker ID performing the completion"},"notes":{"type":"string","description":"Optional completion notes"},"response_value":{"type":"string","description":"Response value (for text/number/choice tasks)"}},"required":["task_id","worker_id"]}},{"name":"tascan_condition_history","description":"Get an asset's longitudinal condition history — score trend over time, every assessment with grade, delta, findings, and who assessed it. The per-serial-number condition ledger.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"asset_id":{"type":"string","description":"Asset ID"}},"required":["asset_id"]}},{"name":"tascan_create_cycle","description":"Start an unattended build-review-decide cycle (protocol v0.2). Queues T1 CODE: (or SHELL:) with your build_brief on the AI Inbox and T2 REVIEW: with your review_brief, born blocked on T1. The local executor builds, stores the exact bytes of artifact_paths as a bundle (build_ref = sha256 over the manifest), the independent reviewer reviews THAT bundle, an approve verdict mints a Decision task for the human authority (one SMS), Approve mints an Integrate task for the deploy id. Revise verdicts spawn revisions (cap max_revisions, default 3); reject, human Reject, scope violations or exhausted revisions PARK the cycle (a Parked task with Resume with notes / Close). REQUIRES agent:dispatch:code. Duplicate protection: the same idempotency_key, or the same briefs + paths, within 24 h returns the existing root instead of queueing again (created=false). Optional `reviews[]` attaches a multi-lens review panel (design item 14a) in place of the single OpenAI review — one review task mints per lens and every blocking lens must approve before the Decision task mints. Track with tascan_get_cycle_report (root_id). Nothing spawns a cycle on its own.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","description":"Working project (UUID). Its Decisions and Agent Questions lists are created on the first cycle (coord_ensure_lists). Requires the org human authority to be configured (coord_set_authority) — otherwise 403."},"title":{"type":"string","description":"Short human title (1-200 chars). T1 becomes \"CODE: <title>\", T2 \"REVIEW: <title>\"."},"build_brief":{"type":"string","description":"The executor prompt (1-40000 chars). Executed verbatim by the local Claude Code runner as a CODE:/SHELL: task — write it as a complete instruction, name the files, forbid nothing the runner already forbids (deploy/commit/push are refused by its context)."},"review_brief":{"type":"string","description":"The reviewer prompt (1-40000 chars). The reviewer reads the stored bundle (tascan_get_build / tascan_get_build_file), the task text and the filtered trail; it returns approve, revise, reject or needs_input as strict JSON bound to the build_ref. Still required even when `reviews[]` is given (kept as T2's legacy description text)."},"artifact_paths":{"type":"array","items":{"type":"string"},"description":"Repo-relative paths the build binds (1-64). Exactly these files are stored as the bundle and hashed into build_ref; files the executor touches OUTSIDE them fail the scope check and park the cycle. No .., not absolute, no drive letter, no backslash."},"task_type":{"type":"string","enum":["CODE","SHELL"],"description":"T1 prefix (default CODE)."},"max_revisions":{"type":"integer","description":"Revision cap (default 3): at most max_revisions + 1 builds and reviews."},"max_questions":{"type":"integer","description":"Questions a runner may ask per task before the attempt fails (default 3)."},"repo":{"type":"string","description":"Which codebase on the executor the build runs in — an alias from the executor's allowlist (tascan-agent/repos.json), e.g. \"tascan\" (default), \"merchskipper\", \"inkskipper\", \"rangerlizzy\", \"cardvault\", \"take1\", \"fitcheck\", \"safegrid\", \"eternity\", \"maniacs\". artifact_paths are relative to that repo. An unknown alias is refused by the executor (repo_unknown) and the cycle parks."},"max_cost_micro_usd":{"type":"integer","description":"Per-cycle spend cap summed over every attempt, in micro-USD (default 5000000 = USD 5). A claim that could overrun it is refused (budget_exhausted)."},"preview_url":{"type":"string","description":"Optional https preview link shown on the Decision task."},"reviews":{"type":"array","description":"Optional multi-lens review panel (design item 14a) instead of today's single OpenAI review_brief lens — 1-8 entries, each: {lens: slug matching ^[a-z][a-z0-9-]{0,39}$ unique per array (e.g. \"code-correctness\", \"security\", \"ui-ux\"), brief: 1-8000 chars of cycle-specific context for that lens, provider: \"openai\"|\"anthropic\"|\"gemini\", model?: 1-100 chars, blocking?: boolean (default true — at least one entry must be blocking or the whole array is refused), max_tool_calls?: integer (openai only)}. One REVIEW: task mints per lens, all blocked on T1; the Decision task mints only once every blocking lens has approved the same build. Omit for today's single OpenAI code review.","items":{"type":"object","properties":{"lens":{"type":"string","description":"Slug, ^[a-z][a-z0-9-]{0,39}$, unique in the array."},"brief":{"type":"string","description":"Cycle-specific context for this lens (1-8000 chars)."},"provider":{"type":"string","enum":["openai","anthropic","gemini"]},"model":{"type":"string","description":"Optional, 1-100 chars."},"blocking":{"type":"boolean","description":"Default true. At least one entry in the array must be blocking."},"max_tool_calls":{"type":"integer","description":"Optional, provider openai only."}},"required":["lens","brief","provider"]}},"checkpoint_title":{"type":"string","description":"Optional title template for the Decision task (default \"Decision: <title>\")."},"checkpoint_description":{"type":"string","description":"Optional description template for the Decision task; the build_ref, preview and findings summary are appended."},"integrate_title":{"type":"string","description":"Optional title template for the Integrate task (default \"Integrate: <title>\")."},"integrate_description":{"type":"string","description":"Optional description template for the Integrate task."},"idempotency_key":{"type":"string","description":"Optional caller key (≤ 200 chars). The same key within 24 h returns the existing cycle (created=false) instead of a duplicate dispatch."}},"required":["project_id","title","build_brief","review_brief","artifact_paths"]}},{"name":"tascan_create_event","description":"Create a new event (task list) within a project. Supports team_mode (shared completions) and multi_instance (each worker gets isolated copy — great for surveys, onboarding, info collection). team_mode and multi_instance cannot both be true.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project ID"},"name":{"type":"string","description":"Event name"},"description":{"type":"string","description":"Event description"},"team_mode":{"type":"boolean","description":"Team mode — shared completions"},"multi_instance":{"type":"boolean","description":"Multi-instance — each worker gets isolated copy"},"assigned_worker_ids":{"type":"array","items":{"type":"string"},"description":"Worker UUIDs to assign to this event. Each gets a personal tap-to-open link. Note: a worker holds one event assignment per project — assigning moves them."}},"required":["project_id","name"]}},{"name":"tascan_create_invoice","description":"Create a client invoice and get its shareable link. Two ways to bill: (a) pass explicit line_items, or (b) pass project_id or task_list_ids plus hourly_rate (quarter-hour billing from first→last verified completion per list) or flat_rate_per_list, and TaScan builds one line per list from VERIFIED work (\"<list> — 7/7 tasks verified · Sep 1 · 1.25h\"); lists with no completions are skipped. A single-list invoice also mints a client-facing Service Report (acknowledge → pay) and links it. Returns invoice number, totals, url, and the work it billed.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"client_name":{"type":"string","description":"Bill-to name (person or company)"},"client_email":{"type":"string"},"client_phone":{"type":"string"},"project_id":{"type":"string","description":"Bill every list in this project (auto line items)"},"task_list_ids":{"type":"array","items":{"type":"string"},"description":"Bill just these lists (auto line items)"},"hourly_rate":{"type":"number","description":"Dollars per hour for auto line items"},"flat_rate_per_list":{"type":"number","description":"Dollars per list for auto line items (used when no hourly_rate)"},"min_hours":{"type":"number","description":"Minimum billable hours per list (e.g. 1)"},"billing":{"type":"object","description":"Billing rules for auto line items. mode: hourly (default when hourly_rate given) | day_rate | flat. Overtime/double time are computed PER WORK DAY from verified completions: hours over overtime_after_hours (default 8) bill at overtime_multiplier (1.5×), hours over double_time_after_hours (12) at double_time_multiplier (2×); set overtime:false to disable. per_diem adds one line × work days (or per_diem_days). expenses are pass-through lines.","properties":{"mode":{"type":"string","enum":["hourly","day_rate","flat"]},"hourly_rate":{"type":"number"},"day_rate":{"type":"number"},"flat_rate_per_list":{"type":"number"},"min_hours":{"type":"number"},"overtime":{"type":"boolean"},"overtime_after_hours":{"type":"number"},"overtime_multiplier":{"type":"number"},"double_time_after_hours":{"type":"number"},"double_time_multiplier":{"type":"number"},"per_diem":{"type":"number","description":"Dollars per work day"},"per_diem_days":{"type":"number"},"expenses":{"type":"array","items":{"type":"object","properties":{"description":{"type":"string"},"amount":{"type":"number"},"quantity":{"type":"number"}},"required":["description","amount"]}}}},"line_items":{"type":"array","description":"Explicit lines instead of auto-billing","items":{"type":"object","properties":{"description":{"type":"string"},"quantity":{"type":"number"},"unit_price":{"type":"number"}},"required":["description","unit_price"]}},"tax_rate":{"type":"number","description":"Fraction, e.g. 0.0825 for 8.25%"},"due_date":{"type":"string","description":"YYYY-MM-DD (default: 30 days out)"},"notes":{"type":"string","description":"Payment terms / thank-you shown on the invoice"},"company_name":{"type":"string","description":"Your company name on the attached Service Report (defaults to the org name)"},"attach_service_report":{"type":"boolean","description":"Mint + link a Service Report for single-list invoices (default true)"},"payment_options":{"type":"object","description":"Pay-how-you-like buttons on the invoice (defaults to the org's saved handles). Keys: venmo (@handle), cashapp ($cashtag), paypal (paypal.me name), zelle (phone/email), applecash (phone), other (free text e.g. \"cash or check\"). Stripe card checkout is separate and only shows when the org has invoice_payments enabled.","properties":{"venmo":{"type":"string"},"cashapp":{"type":"string"},"paypal":{"type":"string"},"zelle":{"type":"string"},"applecash":{"type":"string"},"other":{"type":"string"}}},"status":{"type":"string","enum":["draft","sent"],"description":"Default sent"}},"required":["client_name"]}},{"name":"tascan_create_project","description":"Create a new TaScan project (top-level container for events)","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"Project name"},"location":{"type":"string","description":"Project location / venue"}},"required":["name"]}},{"name":"tascan_create_worker","description":"Create a new worker (taskee) in the organization","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"Worker name"},"phone":{"type":"string","description":"Phone number"},"email":{"type":"string","description":"Email"}},"required":["name"]}},{"name":"tascan_create_zone","description":"Create a geofenced work zone. Delivery zones route workers who open the project Site Gate (geo.html?project=...) to this zone's task list when GPS places them inside the radius. Set enforce_on_list=true to zone-lock the task list — workers cannot start it from outside the zone.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"Zone name (e.g. \"Stage Left\", \"Loading Dock\")"},"lat":{"type":"number","description":"Zone center latitude"},"lng":{"type":"number","description":"Zone center longitude"},"radius_m":{"type":"number","description":"Radius in meters (default 150, min 10, max 100000)"},"project_id":{"type":"string","description":"Project this zone belongs to"},"task_list_id":{"type":"string","description":"Task list the Site Gate routes workers to when they are inside this zone"},"enforce_on_list":{"type":"boolean","description":"Zone-lock the task list — it cannot be started from outside the radius"},"notify_on_enter":{"type":"boolean","description":"Email the manager when a worker enters this zone (danger areas)"},"notify_on_exit":{"type":"boolean","description":"Email the manager when a worker leaves this zone (accountability — sign in then disappear)"},"auto_clock_in":{"type":"boolean","description":"Writes a shift_start when the WORKER PAGE, while open, sees the phone enter the zone; detection is pull-based, there is no background geofencing.  For a background-free presence event use a gate NFC/QR scan."},"auto_clock_out":{"type":"boolean","description":"Writes a shift_end when the WORKER PAGE, while open, sees the phone leave the zone; detection is pull-based, there is no background geofencing.  For a background-free presence event use a gate NFC/QR scan."},"notify_email":{"type":"string","description":"Alert recipient override — defaults to all org admins"},"polygon":{"type":"array","items":{"type":"array","items":{"type":"number"}},"description":"Polygon/rectangle zone instead of a circle: vertices as [[lat,lng], ...], at least 3.  lat/lng/radius_m are then computed (centroid + bounding radius) — still pass lat/lng but they are overridden."},"description":{"type":"string","description":"Shown to workers on the Site Gate page"},"kind":{"type":"string","enum":["work_site","hazard","containment","restricted"],"description":"What the fence MEANS. work_site: expected here (auto clock-in, list on enter). hazard: enter allowed under conditions — required_ppe + photo checkpoint verified by AI vision, the OSHA row. containment: must stay inside; leaving = breach. restricted: must stay out; entering = breach. Default work_site."},"required_ppe":{"type":"array","items":{"type":"string","enum":["hard_hat","safety_glasses","hi_vis_vest","gloves","steel_toe_boots","hearing_protection","harness","respirator","face_shield"]},"description":"Hazard zones: PPE the worker must show at entry (pick-list so the audit reads the same words)"},"ppe_photo_required":{"type":"boolean","description":"Hazard zones: pop a photo checkpoint on entry (default true when required_ppe is set)"},"task_list_on_enter":{"type":"string","description":"Task list dispatched to the worker (in-app + SMS) when they cross into the zone"},"sms_worker_on_enter":{"type":"boolean","description":"Text the worker the rule/list on entry, even if the app is closed"},"sms_worker_on_exit":{"type":"boolean","description":"Text the worker on exit"},"enter_message":{"type":"string","description":"What the worker sees / is texted on entry (default is generated from the rule)"},"alert_on_breach":{"type":"boolean","description":"Email + SMS the admin on containment-exit / restricted-enter (default true)"}},"required":["name","lat","lng"]}},{"name":"tascan_delete_event","description":"Delete an event (task list) and all its tasks and completions. This action is irreversible.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"list_id":{"type":"string","description":"Task list (event) ID to delete"}},"required":["list_id"]}},{"name":"tascan_delete_project","description":"Delete a project and all its events, tasks, and completions. This action is irreversible.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project ID to delete"}},"required":["project_id"]}},{"name":"tascan_delete_subtask","description":"Delete a subtask and its completions. This action is irreversible.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"subtask_id":{"type":"string","description":"Subtask ID to delete"}},"required":["subtask_id"]}},{"name":"tascan_delete_task","description":"Delete a specific task and its completions. This action is irreversible.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"task_id":{"type":"string","description":"Task ID to delete"}},"required":["task_id"]}},{"name":"tascan_delete_worker","description":"Tombstone a worker record (is_active=false). REFUSES if the worker has any task/subtask completions or payments — merge those into the real worker with tascan_merge_workers instead. Never hard-deletes.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"worker_id":{"type":"string","description":"Worker ID to delete"}},"required":["worker_id"]}},{"name":"tascan_dispatch_instruction","description":"Step 3 of the Closed-Loop Autonomous Operations Protocol. Dispatches remediation to the worker via MULTI-CHANNEL delivery: (1) issue thread message, (2) in-app notification, (3) progress feed update, (4) SMS if phone on file, (5) optional remediation task list creation. Closes the loop from digital AI analysis to physical worker execution.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"issue_id":{"type":"string","description":"Issue ID this instruction relates to"},"instruction":{"type":"string","description":"Clear, actionable instruction for the worker to execute"},"worker_id":{"type":"string","description":"Target worker ID (defaults to the worker who reported the issue)"},"remediation_tasks":{"type":"array","description":"Optional array of tasks to create as a remediation task list. Each: { title, description, response_type, requires_photo, is_safety_checkpoint, sort_order }","items":{"type":"object"}},"recommendation_summary":{"type":"string","description":"One-line summary for the task list description"},"send_sms":{"type":"boolean","description":"Send SMS to worker (default: true if phone on file)"},"ai_agent":{"type":"string","description":"Name of the AI agent dispatching (default: TaScan AI)"}},"required":["issue_id","instruction"]}},{"name":"tascan_dispatch_to_agent","description":"PREFERRED tool for sending work to an AI agent. Dispatches a task to the agent's inbox — picked up and executed automatically. No list ID needed. REQUIRES the agent:dispatch permission on this connection (CODE:/SHELL: tasks also require agent:dispatch:code) — reconnect and tick the agent checkbox(es) if refused. Routing is by TITLE PREFIX only: CODE: SHELL: PLAN: MCP: → local Claude Code on Mike's PC; RESEARCH: WRITE: REVIEW: → cloud; no prefix (DEFAULT) → local while the PC agent is alive, else cloud. The cloud agent refuses CODE/SHELL/PLAN/MCP. Use \"agent\" param to target a specific agent (default: claude-code-local). Use tascan_list_agents to discover available agents; track progress with tascan_get_task (its \"agent\" block).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"task":{"type":"string","description":"The full task text. START it with CODE: SHELL: PLAN: MCP: RESEARCH: WRITE: or REVIEW: for routing (prefix-only — nothing may precede it), or leave it unprefixed (DEFAULT). The whole text is stored in the task description; the first 140 chars become the title."},"agent":{"type":"string","description":"Agent ID or name to dispatch to (default: claude-code-local). Use tascan_list_agents to see options. An unknown agent is an error, never a silent fallback."},"priority":{"type":"string","enum":["normal","urgent"],"description":"Priority level (default: normal). The urgent marker is placed AFTER the routing prefix so it never breaks routing."}},"required":["task"]}},{"name":"tascan_find","description":"Cross-entity search: find projects, task lists, tasks, workers, or condition assets by name in one call — with ids and parent context to disambiguate. Use this instead of walking projects→lists→tasks or guessing ids from display names.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","description":"Search text (min 2 chars, case-insensitive substring)"},"type":{"type":"string","enum":["project","list","task","worker","asset"],"description":"Optional: restrict to one entity type"}},"required":["query"]}},{"name":"tascan_find_duplicate_workers","description":"Find candidate same-person worker records with per-signal match detail (Patent 4 §6.25(b) signals: phone reuse, name similarity, GPS pattern correlation). Turns identity fragmentation from an accidental discovery into a monitorable metric, and feeds the merge workflow its candidate list.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"worker_id":{"type":"string","description":"Anchor worker to find duplicates OF (preferred — enables phone + GPS signals)"},"name":{"type":"string","description":"Or: search duplicates by display name"},"threshold":{"type":"number","description":"Min confidence 0-1 (default 0.15)"},"include_orphans":{"type":"boolean","description":"Also consider org-less (orphan) worker records — off by default"}},"required":[]}},{"name":"tascan_generate_qr","description":"Generate a QR code for a task list (event) that workers can scan to access tasks","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"list_id":{"type":"string","description":"Task list (event) ID"}},"required":["list_id"]}},{"name":"tascan_generate_report","description":"Mint a shareable report and get its link. Types: completion (full proof-of-work for one list: tasks, responses, subtasks, photos, GPS + place names, timing, QR pair), service (client-facing version of a list with YOUR company branding and a Client Acknowledgment button — the ack files into the list thread), project (every list in a project rolled up), evidence (compliance Evidence Pack; admin sign-in required to view). Links are stable — the same list/project returns the same link. Optionally text the link to a phone through the TaScan SMS lane.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"type":{"type":"string","enum":["completion","service","project","evidence"]},"list_id":{"type":"string","description":"Required for completion / service"},"project_id":{"type":"string","description":"Required for project / evidence"},"company_name":{"type":"string","description":"Service report branding (defaults to the org name)"},"message":{"type":"string","description":"Service report: a note to the client shown under the header"},"show_workers":{"type":"boolean","description":"Service report: show worker names (default true)"},"show_issues":{"type":"boolean","description":"Service report: include reported issues (default false)"},"send_to_phone":{"type":"string","description":"Text the link to this number (E.164 or 10-digit US)"},"send_note":{"type":"string","description":"Short intro for the text, e.g. \"Here is your report from Love Productions:\""}},"required":["type"]}},{"name":"tascan_get_build","description":"Manifest of a stored build bundle by build_ref (protocol v0.2 build_artifacts): the exact files the executor produced for the cycle's artifact_paths, each with sha256, byte length and whether text content is stored (binary or over-cap files keep the sha only). build_ref = sha256 over the manifest, computed in the database once; the reviewer reviews THESE bytes, the human approves THIS ref, the integrate task records THIS ref. Read tier. Use tascan_get_build_file to read a file. Truncated at 12000 chars. Reading the manifest is discovery, not a read of any file.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"build_ref":{"type":"string","description":"sha256:<64 hex> (or the bare 64 hex) — from tascan_get_task (coord.build_ref / agent.runs[].build_ref) or tascan_get_cycle_report."}},"required":["build_ref"]}},{"name":"tascan_get_build_file","description":"Read one file from a stored build bundle by build_ref and path (protocol v0.2 build_artifacts) — the exact bytes the executor produced, not a working-tree read. Returns up to 12000 chars per call with offset/limit paging (next_offset when truncated), plus the file's sha256 and byte length. Binary or over-cap files return no content (the sha256 still binds them). Read tier; this is what the independent reviewer reads. The header lines (path, build, sha256, chars a-b of total) are the record a reviewer's read is bound to; read every chunk until the range covers the whole file.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"build_ref":{"type":"string","description":"sha256:<64 hex> (or the bare 64 hex)."},"path":{"type":"string","description":"Repo-relative path exactly as listed by tascan_get_build."},"offset":{"type":"integer","description":"Character offset to start from (default 0)."},"limit":{"type":"integer","description":"Characters to return (1-12000, default 12000)."}},"required":["build_ref","path"]}},{"name":"tascan_get_cycle_report","description":"The audit report of one coordination cycle by its root task id (protocol v0.2, get_cycle_report): every step task (build, review, checkpoint, integrate, question, parked) with its revision and state, every execution attempt with runner, outcome, build_ref and usage/cost, every completion (receipt id = completion id, receipt hash), every reviewer verdict, every human decision and answer, the full trail (messages), the ledger events and the hash-chain verdict per task, plus spend against the cap. A computed summary (stage, attempts, verdicts, decisions, receipts, spend, chains_ok) comes first; pass full=true for the complete JSON (large). Read tier. This is the ONLY per-cycle notification surface: cycle steps do not e-mail or text anyone except the one checkpoint / human-question SMS.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"root_id":{"type":"string","description":"The cycle root = the T1 build task id (returned by tascan_create_cycle; a non-root cycle task returns its root_id in the error)."},"full":{"type":"boolean","description":"true = the complete report JSON (tasks, runs, completions, messages, events, bundles, chains) after the summary, capped at 12000 chars. Default: summary only."}},"required":["root_id"]}},{"name":"tascan_get_event","description":"Get details of a specific event (task list) including its tasks","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"list_id":{"type":"string","description":"Task list (event) ID"}},"required":["list_id"]}},{"name":"tascan_get_project","description":"Get details of a specific project","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project ID"}},"required":["project_id"]}},{"name":"tascan_get_receipt","description":"Fetch the signed Action Receipt (Ed25519 JWS) for one completed task by completion_id (tascan_get_task -> completions[].id). Returns a readable summary (what, who, verification, evidence hashes, outcome, ledger chain) plus receipt_id/serial/kid, the compact JWS and the public verify URL. Verify offline against the JWKS or online by POSTing a JSON body whose jws field holds the compact receipt. Read outcome and verification separately: outcome completed = the executor returned and a result was recorded; verification.result = the verdict of a named policy; all-null verification with reason no_policy_run = no policy ran. Never treat outcome=completed as success without a policy verdict you trust (protocol 8.3 C11). Verifier: 6.8. profile=public returns the separately signed public export profile (protocol 6.10): it withholds the raw org, list, project, worker, run and trace ids (each a 16-hex id_hash) and storage locators, and binds to the full receipt - the form for anyone outside the org. Read tier.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"completion_id":{"type":"string","description":"task_completions.id (UUID) - from tascan_get_task -> completions[].id"},"profile":{"type":"string","enum":["full","public"],"description":"full (default) = the org view with the unsigned private block; public = the separately signed public export profile: no raw org, list, project, worker, run or trace id (each is a 16-hex id_hash), no storage locators, plus a binding to the full receipt it was derived from - the form to hand to anyone outside the org"}},"required":["completion_id"]}},{"name":"tascan_get_report","description":"Get completion report for a task list (event) including task status, completions, workers, and photos. Set include_responses to also return the actual submitted response data (numbers, text, choices) for each completed task plus a per-task photos list with fetchable signed URLs (short-lived, ~1h) for the photo evidence.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"list_id":{"type":"string","description":"Task list (event) ID"},"include_responses":{"type":"boolean","description":"Include the actual submitted response values for each completed task (default false — keeps the payload light)"}},"required":["list_id"]}},{"name":"tascan_get_scan_history","description":"Scan accountability data. Two modes: (1) tag_id — scans of a registered NFC tag; (2) task_list_id or project_id — every QR/link page-open stamp: when the code was scanned, GPS + IP + channel (qr/nfc/sms/email/link), who the scanner turned out to be, and the scan→start delta (how long between scanning and actually identifying + starting work — the sign-in-and-vanish metric).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tag_id":{"type":"string","description":"NFC tag registry ID (from tascan_list_tags) — tag mode"},"task_list_id":{"type":"string","description":"Task list ID — page-scan mode"},"project_id":{"type":"string","description":"Project ID — page-scan mode, all lists in the project"},"source":{"type":"string","description":"Filter page scans by channel: qr | nfc | sms | email | link | unknown"},"since":{"type":"string","description":"ISO timestamp — only scans after this"},"limit":{"type":"number","description":"Max results (default 50, max 200)"}},"required":[]}},{"name":"tascan_get_sms_status","description":"Check delivery status of a previously sent TaScan SMS by its Twilio SID (returned by tascan_send_sms). Shows queued/sent/delivered/undelivered/failed plus carrier error codes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"twilio_sid":{"type":"string","description":"Twilio message SID (SM...) from tascan_send_sms"}},"required":["twilio_sid"]}},{"name":"tascan_get_task","description":"Get details of a specific task including completions and subtasks. Each completion carries photo_url (raw storage path, stable) and photo_signed_url (short-lived fetchable URL, ~1h; null when no photo) so you can actually view the photo evidence. Tasks dispatched to an AI agent also carry an \"agent\" block (state claimed|running|completed|failed|expired|released, attempts, current run with runner/trace_id/error) — the only place agent failures are reported. A completion with status \"completed\" means the executor returned and its result was recorded (a model refusal, a wrong answer or an administrative note all \"complete\"); it does NOT mean the requested result was accepted. Acceptance is the completion evidence_check / the receipt verification.result under a named policy, and in v0.1 no policy exists for agent tasks (exact-output and rubric policies are v0.2) — check the recorded response text yourself before treating an agent completion as success (protocol §2.6, §3.2, §8.3 C11).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"task_id":{"type":"string","description":"Task ID"}},"required":["task_id"]}},{"name":"tascan_get_worker","description":"Ungated, plain read of one worker row: name, contact, org, points, streaks, timestamps. (tascan_get_worker_passport is the rich stats view; this is the boring lookup.)","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"worker_id":{"type":"string","description":"Worker ID"}},"required":["worker_id"]}},{"name":"tascan_get_worker_passport","description":"Get a worker's verified work passport — task counts, lists worked, photos submitted, GPS-verified hours, points, streaks, and earned merit badges, all computed from real completion data (not self-reported). Includes the shareable profile URL.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"worker_id":{"type":"string","description":"Worker ID"}},"required":["worker_id"]}},{"name":"tascan_invite_worker","description":"Invite a marketplace worker to a task list — the consented intro. TaScan texts the worker from its own number (\"<Your org> wants you for <list>. Reply YES to share your contact and get the list, or NO to pass.\"). On YES the worker appears in your org with their name + phone, receives the list link, and you get a text + a thread message. On NO or silence (7 days) you never learn who they were. Use the worker_id from tascan_search_marketplace.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"worker_id":{"type":"string","description":"worker_id from a marketplace card"},"list_id":{"type":"string","description":"Task list you want them on"},"message":{"type":"string","description":"Optional short intro prepended to the text (max 240 chars)"}},"required":["worker_id","list_id"]}},{"name":"tascan_list_agents","description":"List all registered AI agents with their capabilities, inbox IDs, and status. Like reading input labels on a video matrix — discover which agents are available and what they can do before dispatching work.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"required":[]}},{"name":"tascan_list_assets","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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","description":"Filter by project"}},"required":[]}},{"name":"tascan_list_events","description":"List all events (task lists) within a project","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project ID"}},"required":["project_id"]}},{"name":"tascan_list_invites","description":"List marketplace invites you have sent and their status (pending / accepted / declined / expired / failed). Accepted invites include the worker's name and phone — that is the consent boundary; pending and declined never do.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","accepted","declined","expired","failed"]}},"required":[]}},{"name":"tascan_list_invoices","description":"List invoices for the org (newest first) with status, client, total, due date and share link. Filter by status (draft/sent/paid/overdue/cancelled) or project.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"status":{"type":"string","enum":["draft","sent","paid","overdue","cancelled"]},"project_id":{"type":"string"}},"required":[]}},{"name":"tascan_list_issues","description":"List all issues for a task list (event). Returns open, acknowledged, and resolved issues with severity, type, and category. Use this to discover issues that need AI analysis via tascan_analyze_issue.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"list_id":{"type":"string","description":"Task list (event) ID"}},"required":["list_id"]}},{"name":"tascan_list_payments","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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"task_list_id":{"type":"string","description":"Filter by task list"},"status":{"type":"string","enum":["awaiting_completion","ready_to_pay","paid","canceled"],"description":"Filter by status"}},"required":[]}},{"name":"tascan_list_projects","description":"List all TaScan projects in the organization","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"tascan_list_reports","description":"List existing report links for a list or project (completion / service / project / evidence), newest first, with client acknowledgment status for service reports.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"list_id":{"type":"string"},"project_id":{"type":"string"}},"required":[]}},{"name":"tascan_list_scheduled_sms","description":"List your org's scheduled texts (default: pending + sending, soonest first; status=sent|failed|cancelled to see history). Each row shows send_at, status, attempts, the Twilio sid once sent, and the last error for a failed row.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","sending","sent","failed","cancelled"],"description":"Filter by status (default pending + sending)"}}}},{"name":"tascan_list_subtasks","description":"List the subtasks of a task, including completion state, stored response values, and completion timestamps (per-set timing).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"task_id":{"type":"string","description":"Parent task ID"}},"required":["task_id"]}},{"name":"tascan_list_tags","description":"List all registered NFC tags in the organization with their linked projects/task lists and scan counts","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{}}},{"name":"tascan_list_tasks","description":"List all tasks in an event (task list)","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"list_id":{"type":"string","description":"Task list (event) ID"}},"required":["list_id"]}},{"name":"tascan_list_templates","description":"List available task templates (built-in and saved)","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"category":{"type":"string","description":"Filter by category (e.g. \"live-events\", \"hospitality\", \"logistics\")"}}}},{"name":"tascan_list_workers","description":"List workers (taskees) in the organization. Supports filtering by name/email/phone substring, contact-info presence, and last-activity date. Each row includes completion_count (total task completions).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","description":"Substring match on name, email, or phone"},"has_phone":{"type":"boolean","description":"true = only workers with a phone on file; false = only without"},"has_email":{"type":"boolean","description":"true/false — same for email"},"active_since":{"type":"string","description":"ISO date/datetime — only workers with last_active_at on/after this"},"include_inactive":{"type":"boolean","description":"true = also include inactive workers (e.g. tombstones left by a merge or delete) — useful for auditing right after tascan_merge_workers / tascan_delete_worker"}}}},{"name":"tascan_list_zones","description":"List geofenced work zones, optionally filtered by project. Shows center, radius, routing target, and zone-lock status.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","description":"Filter by project"}},"required":[]}},{"name":"tascan_merge_workers","description":"Merge duplicate worker records into one canonical identity (Patent 4 identity consolidation). Reassigns every reference (completions, timer events, points, payments, rosters — 31 columns across 31 tables), backfills missing phone/email on the primary, sums points, and tombstones the duplicates (merged_into + is_active=false — NEVER hard-deletes). ALWAYS run with dry_run=true first and show Mike the counts; pass dry_run=false only after explicit confirmation.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"primary_worker_id":{"type":"string","description":"The canonical worker that survives (usually the one with a phone)"},"duplicate_worker_ids":{"type":"array","items":{"type":"string"},"description":"Worker IDs to fold into the primary (max 20)"},"dry_run":{"type":"boolean","description":"true (default) = report reassignment counts only, change nothing. false = execute atomically."}},"required":["primary_worker_id","duplicate_worker_ids"]}},{"name":"tascan_post_message","description":"Post a message on a task trail (protocol v0.2 trail_messages): kind question, answer, handoff or discussion. A message never completes a task, never satisfies a gate and never pages anyone. The actor is stamped from your credential (key:<id>, actor_type \"key\" — a credential, never a human), never from the body; the executor and the reviewer consume a key's answers only when the key holds agent:dispatch. On an ordinary task this is write tier. On a CYCLE task (one with coord) it needs agent:dispatch (agent:dispatch:code when the task, or the asker a question task stands for, is CODE:/SHELL:) because the text can become executor prompt or reviewer input. kind=answer on a dispatcher-addressed question task answers it through coord_answer_question and releases the blocked asker; a human-addressed question is answered only on the worker page (403 here). finding (reviewer runner) and decision (human completion) cannot be posted. Body ≤ 8000 chars; idempotency_key makes a replay return the same message.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"task_id":{"type":"string","description":"Task ID (UUID). For an answer: the QUESTION task id (tascan_get_task on the asker shows coord.blocked_by)."},"kind":{"type":"string","enum":["question","answer","handoff","discussion"],"description":"question = a question for the record (does not block anything); answer = answers a dispatcher question task and releases the asker; handoff = hand work or context to the next agent; discussion = a note."},"body":{"type":"string","description":"The message text (1-8000 chars). Treated as DATA by every reader; on a cycle task it may be prepended to the executor prompt as TRAIL INPUT."},"reply_to":{"type":"string","description":"Optional message id this replies to."},"build_ref":{"type":"string","description":"Optional sha256:<64 hex> the message is about (defaults to the cycle task's bound build)."},"addressee":{"type":"string","enum":["human","dispatcher"],"description":"Optional, kind=question only: who the question is for (recorded; nobody is paged)."},"idempotency_key":{"type":"string","description":"Optional replay key (≤ 200 chars): the same key on the same task returns the same message id."}},"required":["task_id","kind","body"]}},{"name":"tascan_project_digest","description":"One call that gives a chat client (ChatGPT, Claude) a whole TaScan project in about 2,000 words: the project, every task list with task counts, open decisions and questions, the last 5 coordination cycles with verdicts and spend, the latest 5 receipts, and total spend — returned as Markdown (capped at 12,000 chars). Read tier. Use it before asking a human to paste anything.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project ID (UUID)."}},"required":["project_id"]}},{"name":"tascan_query_responses","description":"Query one task's submitted responses across every list in a project — e.g. the same exercise repeated across many workout lists returns one chronological progression series instead of N report lookups. Match by task title pattern or exact task ID. Subtask completions interleave into the same series labeled 'Task › Subtask' (e.g. per-set values Set 1/2/3 with their own timestamps), so set-level progression chains across lists automatically.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project ID"},"task":{"type":"string","description":"Task title pattern (case-insensitive substring) or exact task ID"},"limit":{"type":"number","description":"Max responses to return (default 200, max 500)"}},"required":["project_id","task"]}},{"name":"tascan_recommend_fix","description":"Step 2 of the Closed-Loop Autonomous Operations Protocol. Post an AI-generated recommendation to an issue thread. Accepts both a text recommendation and an optional structured_recommendation object with task definitions for auto-dispatch. The recommendation is persisted in the AI audit trail.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"issue_id":{"type":"string","description":"Issue ID to recommend a fix for"},"recommendation":{"type":"string","description":"The AI-generated recommendation text (clear, actionable instructions)"},"structured_recommendation":{"type":"object","description":"Optional structured recommendation with tasks for auto-dispatch. Format: { recommendation_summary, confidence_score, tasks: [{ title, description, response_type, requires_photo, is_safety_checkpoint, sort_order }], estimated_duration_minutes, required_responder_role }"},"ai_agent":{"type":"string","description":"Name of the AI agent posting (default: TaScan AI)"}},"required":["issue_id","recommendation"]}},{"name":"tascan_record_integration","description":"D4: the dispatcher records the Netlify deploy id for an authorized cycle — Integrate cards stop landing on Mike for something a key can prove instead (protocol v0.2, migration 181, coord_record_integration). Requires agent:dispatch. The root must be `authorized` (its checkpoint already Approved) with an open Integrate task; deploy_id must be a real Netlify deploy id — 24 lowercase hex, optionally \"deployed:<id>\" and/or a trailing build-ref hex prefix (\"Deploy\" and anything else is refused, bad_deploy_id). On success the root flips to `integrated`, the existing \"Integrated: deploy …\" trail note is posted, and the completion is stamped with your key as the actor (source api:key:<id>) — never as a human on the page. Idempotent: replaying the SAME deploy_id after the root is already integrated returns the same completion (replayed:true); a DIFFERENT deploy_id after integration is refused (409) without changing anything. A human may still complete the Integrate card on the worker page as an ops fallback, but only with a real deploy id too.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"root_id":{"type":"string","description":"The cycle root = the T1 build task id (tascan_get_cycle_report / tascan_create_cycle). Must currently be authorized (checkpoint Approved, Integrate task open)."},"deploy_id":{"type":"string","description":"The Netlify deploy id: 24 lowercase hex, optionally prefixed \"deployed:\" and/or followed by a space and a ≥12-hex prefix of the build_ref."},"note":{"type":"string","description":"Optional note (≤ 2000 chars) recorded alongside the completion — e.g. what changed in this deploy."}},"required":["root_id","deploy_id"]}},{"name":"tascan_register_agent","description":"Register a new AI agent in the agent registry. The agent will appear in tascan_list_agents and can receive dispatched tasks. Self-registration for AI agents joining the TaScan network. REQUIRES the agent:dispatch permission (defining a dispatch target is a dispatch permission); inbox_id must be a task list (event) in your organization.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique agent ID (e.g. \"my-agent-1\")"},"name":{"type":"string","description":"Display name (e.g. \"Research Bot\")"},"type":{"type":"string","enum":["local","cloud","hybrid"],"description":"Agent type"},"model":{"type":"string","description":"Model powering this agent (e.g. \"claude-sonnet-4-6\")"},"worker_id":{"type":"string","description":"TaScan worker ID for this agent"},"inbox_id":{"type":"string","description":"Task list ID this agent monitors for new tasks"},"capabilities":{"type":"array","items":{"type":"string"},"description":"Task type prefixes this agent handles (e.g. [\"RESEARCH\", \"WRITE\"])"},"location":{"type":"string","description":"Where the agent runs (e.g. \"AWS us-east-1\")"},"description":{"type":"string","description":"What this agent does"}},"required":["id","name","type","inbox_id","capabilities"]}},{"name":"tascan_register_asset","description":"Register a physical asset (equipment, structure, vehicle, machine) in the condition ledger so it can be assessed over time. Each asset gets a longitudinal condition history with AI scoring and degradation trajectory.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"Asset name (e.g. \"LED Wall Processor #3\")"},"serial_number":{"type":"string","description":"Serial number or asset tag (unique per org)"},"asset_type":{"type":"string","description":"Type (e.g. \"LED processor\", \"forklift\", \"scaffold\")"},"description":{"type":"string","description":"Context the AI assessor should know"},"location_description":{"type":"string"},"project_id":{"type":"string"}},"required":["name"]}},{"name":"tascan_register_tag","description":"Register a physical NFC tag to a project, task list, or specific task. When someone taps the tag, TaScan routes them to the linked resource. Tags use NTAG215 chips and are programmed with NFC Tools Pro.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"tag_hardware_id":{"type":"string","description":"NFC tag hardware serial number (e.g., \"04:CB:6C:51:CE:2A:81\")"},"tag_name":{"type":"string","description":"Friendly name (e.g., \"Ballroom A Door\", \"Breaker Panel 3\")"},"target_type":{"type":"string","enum":["project","task_list","task"],"description":"What this tag points to"},"project_id":{"type":"string","description":"Project ID"},"task_list_id":{"type":"string","description":"Task list ID (required for task_list/task targets)"},"task_id":{"type":"string","description":"Task ID (required for task targets)"},"location_description":{"type":"string","description":"Physical location of the tag"}},"required":["tag_hardware_id","tag_name","target_type"]}},{"name":"tascan_reply_with_list","description":"Reply to a task list WITH a task list — the two-way tasking primitive. Creates a new list linked into the parent's thread, aimed back at whoever sent the original (e.g. \"Grant access — pick a window\" with response_type date, or an info request with response_type text). The org gets pinged; the thread shows in both the worker portal and Simple Mode. Use tascan_get_thread-style follow-up via tascan_list_projects/tascan_get_report to read answers.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"parent_list_id":{"type":"string","description":"The list being replied to"},"title":{"type":"string","description":"Reply list title (e.g. \"Before I can start...\")"},"author_name":{"type":"string","description":"Who is replying (shown in the thread)"},"tasks":{"type":"array","items":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"response_type":{"type":"string","enum":["checkbox","text","number","date","choice","photo","link","url","file"],"description":"\"date\" for scheduling windows, \"text\" for info requests, \"choice\" needs response_config.options. \"link\" = the worker submits a URL. \"url\" = the worker visits a preset URL and confirms. \"file\" = the worker uploads a file."},"response_config":{"type":"object"}},"required":["title"]},"description":"Items the recipient answers — each becomes a typed task"}},"required":["parent_list_id","title","tasks"]}},{"name":"tascan_request_payment","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).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"task_list_id":{"type":"string","description":"Task list the payment is tied to"},"worker_id":{"type":"string","description":"Worker who gets paid"},"amount_cents":{"type":"number","description":"Amount in cents ($1 min, $10,000 max)"},"payer_email":{"type":"string","description":"Who pays — receives the pay link on verification"},"payer_name":{"type":"string"},"memo":{"type":"string","description":"What the payment is for (shown to the payer)"}},"required":["task_list_id","worker_id","amount_cents","payer_email"]}},{"name":"tascan_schedule_sms","description":"Schedule a transactional TaScan SMS for a future time (up to 90 days out): the text is sent by TaScan's own scheduler (every 5 minutes) through the same guarded lane as tascan_send_sms — recipient must be a worker of your org or a phone the org already knows, STOP opt-outs honoured, burst limits and the SMS quota apply, the \"TaScan:\" prefix is added, and a list_id appends a tap-to-open checklist link. Use this for reminders (e.g. \"log your out time\" each show night) — nothing outside TaScan needs to stay awake. Returns the scheduled row id; cancel with tascan_cancel_scheduled_sms while it is still pending. The same idempotency_key within an org returns the existing row instead of a duplicate.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"send_at":{"type":"string","description":"When to send — ISO 8601 with a timezone offset, e.g. \"2026-09-25T18:30:00-07:00\" (Las Vegas is -07:00 in September). Delivery happens on the next 5-minute tick at or after this time."},"message":{"type":"string","description":"Message text (1-400 chars, links stripped). Transactional and work-related only."},"worker_id":{"type":"string","description":"Worker ID — texts their phone on file (preferred over raw phone)"},"phone":{"type":"string","description":"Raw phone (E.164) — must already belong to a worker or roster entry of your org"},"list_id":{"type":"string","description":"Optional task list ID — appends the tap-to-open checklist link"},"include_link":{"type":"boolean","description":"Append the list link (default true when list_id is given)"},"idempotency_key":{"type":"string","description":"Optional caller key (≤ 200 chars) — replays return the existing scheduled row"}},"required":["send_at","message"]}},{"name":"tascan_search_marketplace","description":"Search the cross-org Worker Marketplace: workers who opted in (discoverable=true on their passport), ranked by passkey trust tier + verified completion volume.  Skills are AI-inferred from REAL completed work, not resumes — each carries a verified_task_count and a civilian_equivalent job title.  Returns sanitized public cards only (first name + last initial, skills, stats, passport URL) — never phone, email, or org membership.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"type":"string","description":"Skill, category, name, or civilian job title — e.g. \"forklift\", \"LED wall\", \"AV technician\""},"min_completions":{"type":"number","description":"Only workers with at least this many verified completions"},"limit":{"type":"number","description":"Max cards (default 25, max 50)"},"city":{"type":"string","description":"Filter by the worker's opt-in home city, e.g. \"Las Vegas\""},"available":{"type":"boolean","description":"Only workers who marked themselves available on their passport"}},"required":[]}},{"name":"tascan_send_sms","description":"Send a transactional TaScan SMS text to a worker (by worker_id, using their phone on file) or to a raw phone number. Optionally attach a task list — the recipient gets a tap-to-open checklist link. Sends from TaScan's carrier-registered A2P number (or the org's own Twilio if BYOK). Counts against the org's monthly SMS quota unless BYOK. Messages are auto-prefixed with \"TaScan:\" per carrier registration; transactional/work-related content only, no marketing.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"worker_id":{"type":"string","description":"Worker ID — sends to their phone on file (preferred over raw phone)"},"phone":{"type":"string","description":"Raw phone number (e.g. \"+17025551234\") — used when no worker_id given"},"message":{"type":"string","description":"Message text. Transactional and work-related only."},"list_id":{"type":"string","description":"Optional task list ID — appends a tap-to-open worker checklist link"},"include_link":{"type":"boolean","description":"When a list_id is given, append the tap-to-open link to the SMS body (default true). Set false to send the message text alone — the link is still returned for you to share another way."}},"required":["message"]}},{"name":"tascan_send_task_email","description":"Send a branded TaScan task notification email via SendGrid. Can notify anyone about a specific task list or task. Includes QR code, task summary, and \"Open in TaScan\" button.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"to_email":{"type":"string","description":"Recipient email address"},"to_name":{"type":"string","description":"Recipient display name"},"list_id":{"type":"string","description":"Task list (event) ID"},"task_id":{"type":"string","description":"Optional specific task ID to highlight"},"subject":{"type":"string","description":"Custom email subject (defaults to auto-generated)"},"message":{"type":"string","description":"Optional custom message to include in the email body"},"include_qr":{"type":"boolean","description":"Include QR code for the task list in the email (default: true)"}},"required":["to_email","list_id"]}},{"name":"tascan_server_info","description":"Identify exactly which TaScan server and schema this MCP session is talking to. Call this FIRST when diagnosing anything — it makes \"dev server masquerading as production\" and \"is my fix deployed yet\" one tool call instead of an inference.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"required":[]}},{"name":"tascan_update_event","description":"Update an event / task list (name, description, team_mode, multi_instance, timer_mode). team_mode and multi_instance cannot both be true.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"list_id":{"type":"string","description":"Task list (event) ID"},"name":{"type":"string","description":"New name"},"description":{"type":"string","description":"New description"},"team_mode":{"type":"boolean","description":"Team mode — shared completions"},"multi_instance":{"type":"boolean","description":"Multi-instance — each worker gets isolated copy"},"timer_mode":{"type":"string","description":"Timer mode (auto or manual)"},"assigned_worker_ids":{"type":"array","items":{"type":"string"},"description":"Worker UUIDs to assign to this event (additive — workers not named are left alone). Each gets a personal tap-to-open link. Note: a worker holds one event assignment per project — assigning moves them."}},"required":["list_id"]}},{"name":"tascan_update_invoice","description":"Update an invoice: mark it paid (records paid_at), overdue, cancelled, or edit client details / notes / due date.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"invoice_id":{"type":"string"},"status":{"type":"string","enum":["draft","sent","paid","overdue","cancelled"]},"paid_at":{"type":"string","description":"ISO timestamp (default now) when status = paid"},"client_name":{"type":"string"},"client_email":{"type":"string"},"client_phone":{"type":"string"},"notes":{"type":"string"},"due_date":{"type":"string"}},"required":["invoice_id"]}},{"name":"tascan_update_project","description":"Update a project (name, location, status, dates)","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string","description":"Project ID"},"name":{"type":"string","description":"New name"},"location":{"type":"string","description":"New location"},"status":{"type":"string","enum":["active","archived"],"description":"Status"},"start_date":{"type":"string","description":"Start date (ISO)"},"end_date":{"type":"string","description":"End date (ISO)"}},"required":["project_id"]}},{"name":"tascan_update_subtask","description":"Update a subtask (title, description, response_type, response_config, requires_photo, sort_order).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"subtask_id":{"type":"string","description":"Subtask ID"},"title":{"type":"string"},"description":{"type":"string"},"response_type":{"type":"string","enum":["checkbox","number","text","choice","link","url","file"],"description":"\"link\" = the worker submits a URL. \"url\" = the worker visits a preset URL and confirms. \"file\" = the worker uploads a file."},"response_config":{"type":"object"},"requires_photo":{"type":"boolean"},"sort_order":{"type":"number"}},"required":["subtask_id"]}},{"name":"tascan_update_task","description":"Update a task (title, description, response_type, flags, sort_order). A task that sits in an AI agent inbox is agent input (the runner executes title + description), so ANY edit to it needs the agent:dispatch permission — agent:dispatch:code when the task is or becomes CODE:/SHELL:.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"task_id":{"type":"string","description":"Task ID"},"title":{"type":"string","description":"New title"},"description":{"type":"string","description":"New description"},"response_type":{"type":"string","enum":["checkbox","photo","text","number","date","choice","link","url","file"],"description":"See tascan_add_tasks for guidance. \"text\" for info collection, \"photo\" for visual proof, \"checkbox\" for yes/no only, \"link\" for the worker submitting a URL, \"url\" for the worker visiting a preset URL and confirming, \"file\" for the worker uploading a file."},"response_config":{"type":"object","description":"Response configuration. For \"choice\": {options: [...]}. See tascan_add_tasks."},"is_safety_checkpoint":{"type":"boolean","description":"Safety-critical flag"},"requires_photo":{"type":"boolean","description":"Require photo"},"sort_order":{"type":"number","description":"Sort position"},"required_equipment":{"type":"string","description":"Equipment this task depends on (free text)"},"assigned_to":{"type":"string","description":"Worker to assign this task to — pass the worker UUID (validated against your org and stored as the worker's name, which is how the worker portal matches \"my tasks\"). A plain name string is also accepted as-is. Pass null to clear."}},"required":["task_id"]}},{"name":"tascan_update_worker","description":"Update a worker profile (name, phone, email)","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"worker_id":{"type":"string","description":"Worker ID"},"name":{"type":"string","description":"New name"},"phone":{"type":"string","description":"New phone"},"email":{"type":"string","description":"New email"}},"required":["worker_id"]}},{"name":"tascan_update_zone","description":"Update a geofenced zone — move the center, resize the radius, change the routing target, toggle zone-lock, or deactivate it (is_active=false).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"zone_id":{"type":"string","description":"Zone ID"},"name":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"radius_m":{"type":"number"},"task_list_id":{"type":"string"},"enforce_on_list":{"type":"boolean"},"is_active":{"type":"boolean"},"notify_on_enter":{"type":"boolean"},"notify_on_exit":{"type":"boolean"},"auto_clock_in":{"type":"boolean","description":"Writes a shift_start when the WORKER PAGE, while open, sees the phone enter the zone; detection is pull-based, there is no background geofencing.  For a background-free presence event use a gate NFC/QR scan."},"auto_clock_out":{"type":"boolean","description":"Writes a shift_end when the WORKER PAGE, while open, sees the phone leave the zone; detection is pull-based, there is no background geofencing.  For a background-free presence event use a gate NFC/QR scan."},"notify_email":{"type":"string"},"polygon":{"type":"array","items":{"type":"array","items":{"type":"number"}},"description":"Replace geometry with a polygon ([[lat,lng],...], ≥3 vertices); pass null to revert to a circle"},"kind":{"type":"string","enum":["work_site","hazard","containment","restricted"]},"required_ppe":{"type":"array","items":{"type":"string","enum":["hard_hat","safety_glasses","hi_vis_vest","gloves","steel_toe_boots","hearing_protection","harness","respirator","face_shield"]}},"ppe_photo_required":{"type":"boolean"},"task_list_on_enter":{"type":"string"},"sms_worker_on_enter":{"type":"boolean"},"sms_worker_on_exit":{"type":"boolean"},"enter_message":{"type":"string"},"alert_on_breach":{"type":"boolean"}},"required":["zone_id"]}},{"name":"tascan_zone_compliance","description":"Hazard-zone compliance audit (OSHA / insurance): every zone crossing, PPE checkpoint verdict (complied / failed with what was missing / skipped), and breach, plus injury reports cross-referenced with the worker's last PPE checkpoint before the injury. Scope by project or zone, optionally by worker and date range. Same rows the printable Evidence Pack shows.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"project_id":{"type":"string"},"zone_id":{"type":"string"},"worker_id":{"type":"string"},"since":{"type":"string","description":"ISO date/time lower bound"},"until":{"type":"string","description":"ISO date/time upper bound"}},"required":[]}}],"scan":{"score":86,"grade":"A","scanned_at":"2026-09-22T21:30:18.796Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-22T21:30:18.738Z","components":{"code":{"score":25,"max":25,"notes":["3 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 944ms"]},"poisoning":{"score":15,"max":15,"notes":["80 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 23 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 10 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://app.tascan.io/mcp","reachable":true,"authRequired":false,"latencyMs":944,"serverInfo":{"name":"tascan","version":"3.15.0"}}],"packages":[{"registryType":"npm","identifier":"tascan-mcp","version":"3.0.0","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-08-18T16:04:28.569Z","repositoryUrl":"git+https://github.com/snowbikemike/tascan-mcp.git","weeklyDownloads":573}],"repo":{"found":true,"owner":"snowbikemike","repo":"tascan-mcp","archived":false,"pushedAt":"2026-09-13T04:48:27Z","stars":1,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/208409378?v=4","ownerCreatedAt":"2025-04-21T00:01:18Z","license":"NOASSERTION"},"icon":{"url":"https://app.tascan.io/favicon.svg","source":"site"},"presence":{"stars":1,"forks":0,"downloadsWeek":573,"license":"NOASSERTION","lastPushAt":"2026-09-13T04:48:27.000Z","score":40}}}},"grade_history":[],"reviews":[]}