Skip to content

TaScan

by snowbikemike · remote · local (npm) · no sign-in to list tools · v3.0.0 · published by GitHub user snowbikemike

36 MCP tools for projects, tasks, workers, QR/NFC tags, and AI remediation. Task. Scan. Done.

Deletes · 11Final · 6Changes · 45

108 tools: 11 can delete or cancel things, 6 do something that can't be undone, 45 change things and 46 only read.

Scanned Oct 21, 2026

12 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http tascan https://app.tascan.io/mcp

Findings

Matches of fixed checks, with the text they matched.

4 warn8 info
  • The server marks "tascan_analyze_issue" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "tascan_analyze_issue" says "analyze": a word for reading.

    What this check looks for
  • The server marks "tascan_auto_resolve" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "tascan_auto_resolve" says "resolve": a word for reading.

    What this check looks for
  • The server marks "tascan_get_build_diff" destructive (destructiveHint: true), and its name says "get", a word for reading.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}; The name "tascan_get_build_diff" says "get": a word for reading.

    What this check looks for
  • The server marks "tascan_evidence_policy" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The description's first verb is "read": a word for reading.

    What this check looks for
  • The description is 2,502 characters long, over the 2,000 this check looks for.

    Matched text

    description ends: "...Track with tascan_get_cycle_report (root_id). Nothing spawns a cycle on its own."

    What this check looks for
  • The description mentions "credential".

    Matched text

    description: "...anyone. The actor is stamped from your credential (key:<id>, actor_type "key" — a credent..."

    What this check looks for
Show 6 more findings

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

108 tools

Deletes or cancels 11Claude Code: deny
  • tascan_cancel_scheduled_smsCancel a scheduled text that has not been sent yet (status pending).No findings

    Why it is in this group

    • The name "tascan_cancel_scheduled_sms" says "cancel": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Cancel Scheduled SMS
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • tascan_control_fanoutControl a running fan-out (POST /coord/fanouts/:id/control).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Control a running fan-out (POST /coord/fanouts/:id/control). pause holds every unclaimed seat and stops re-firing; resume releases them; cancel supersedes every unclaimed task and closes once quiet; close_barrier drops unsettled (or named exclude_seats) seats and forces the synth now; retry_synth mints a new synth revision from the stored inputs of the current synth when every failed run is input_ref_mismatch, refused otherwise (not_synthesizing, no_synth_task, no_failed_runs, not_input_ref_mismatch). No amend or answer yet. Every action first records a signed control completion as the system worker of this org, never as another org identity. idempotency_key replays the prior outcome (replayed true) and applies nothing twice; a replayed resume after a later pause stays paused. Refused fanout_closed once the roll-up has closed. Requires agent:dispatch:code.

    Annotations the server declares

    • title: Control Fan-out
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • tascan_delete_eventDelete an event (task list) and all its tasks and completions.No findings

    Why it is in this group

    • The name "tascan_delete_event" says "delete": a word for removing or ending something.
    • The description says "irreversible".
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Delete an event (task list) and all its tasks and completions. This action is irreversible.

    Annotations the server declares

    • title: Delete Event
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • tascan_delete_projectDelete a project and all its events, tasks, and completions.No findings

    Why it is in this group

    • The name "tascan_delete_project" says "delete": a word for removing or ending something.
    • The description says "irreversible".
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Delete a project and all its events, tasks, and completions. This action is irreversible.

    Annotations the server declares

    • title: Delete Project
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • tascan_delete_subtaskDelete a subtask and its completions.No findings

    Why it is in this group

    • The name "tascan_delete_subtask" says "delete": a word for removing or ending something.
    • The description says "irreversible".
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Delete a subtask and its completions. This action is irreversible.

    Annotations the server declares

    • title: Delete Subtask
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • tascan_delete_taskDelete a specific task and its completions.No findings

    Why it is in this group

    • The name "tascan_delete_task" says "delete": a word for removing or ending something.
    • The description says "irreversible".
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Delete a specific task and its completions. This action is irreversible.

    Annotations the server declares

    • title: Delete Task
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • tascan_delete_workerTombstone a worker record (is_active=false).No findings

    Why it is in this group

    • The name "tascan_delete_worker" says "delete": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Delete Worker
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_build_diffStore an already-computed diff for one file of a build bundle against a base commit (protocol v0.2 item 6, POST /coord/builds/:build_ref/diff — the parser has no GET for this path;…1 finding

    Why it is in this group

    • The name "tascan_get_build_diff" says "get": a word for reading.
    • The description's first verb is "store": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Warn

      The server marks "tascan_get_build_diff" destructive (destructiveHint: true), and its name says "get", a word for reading.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}; The name "tascan_get_build_diff" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Store an already-computed diff for one file of a build bundle against a base commit (protocol v0.2 item 6, POST /coord/builds/:build_ref/diff — the parser has no GET for this path; a deployed function ships no git object database, so tascan-agent/deployer.js computes the diff text with its own persistent worktree and this route only validates + stores it via coord_set_artifact_diff). build_sha256 must equal the artifact's own stored sha256 or the call is refused; storing a diff replaces that file's stored full content with the diff going forward. There is currently no REST route that reads a stored diff back (GET /builds/:build_ref and /builds/:build_ref/file do not surface it) — this tool only writes one. Requires agent:dispatch.

    Annotations the server declares

    • title: Submit Build Diff
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • tascan_merge_workersMerge duplicate worker records into one canonical identity (Patent 4 identity consolidation).No findings

    Why it is in this group

    • The name "tascan_merge_workers" says "merge": a word for a change that another call does not undo.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Merge Workers
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
  • tascan_revoke_delegationRevoke a delegated child key immediately (DELETE /delegations/:key_id) — self-revoke, revoke by an ancestor key, or by an admin session of the org; any other caller is refused.No findings

    Why it is in this group

    • The name "tascan_revoke_delegation" says "revoke": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Revoke a delegated child key immediately (DELETE /delegations/:key_id) — self-revoke, revoke by an ancestor key, or by an admin session of the org; any other caller is refused. Revoking cascades to every key IT delegated, in turn (the database trigger, not application code). Idempotent: revoking an already-revoked key reports already_revoked, no error.

    Annotations the server declares

    • title: Revoke Delegation
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • tascan_revoke_deviceRevoke a device credential immediately — the kill switch for a lost, stolen, or decommissioned device (RFID portal, barcode gun, PLC, camera, robot, tool, sensor).1 finding

    Why it is in this group

    • The name "tascan_revoke_device" says "revoke": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "Revoke a device credential immediately — the kill switch for a los..."

      What this check looks for
    Description, as the server wrote it
    Revoke a device credential immediately — the kill switch for a lost, stolen, or decommissioned device (RFID portal, barcode gun, PLC, camera, robot, tool, sensor). Its next evidence post is refused. Idempotent: revoking an already-revoked device reports already_revoked and mints no second receipt. Requires the device:admin permission (owner-only, needs full, never reachable through OAuth).

    Annotations the server declares

    • title: Revoke Device
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
Can't be undone 6Claude Code: ask
  • tascan_invite_workerInvite a marketplace worker to a task list — the consented intro.No findings

    Why it is in this group

    • The name "tascan_invite_worker" says "invite": a word for sending, and what is sent cannot be taken back.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Invite Marketplace Worker
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_post_messagePost a message on a task trail (protocol v0.2 trail_messages): kind question, answer, handoff or discussion.1 finding

    Why it is in this group

    • The name "tascan_post_message" says "post" and "message": it sends a message, which cannot be taken back.

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "...anyone. The actor is stamped from your credential (key:<id>, actor_type "key" — a credent..."

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Post Trail Message
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_reply_with_listReply to a task list WITH a task list — the two-way tasking primitive.No findings

    Why it is in this group

    • The name "tascan_reply_with_list" says "reply": a word for sending, and what is sent cannot be taken back.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Reply With a List
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_request_paymentPledge 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 t…No findings

    Why it is in this group

    • The name "tascan_request_payment" says "request": a word for a change.
    • The name "tascan_request_payment" also says "payment": a word that usually means money moves, which cannot be taken back.
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: Request Verified Payment
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_send_smsSend a transactional TaScan SMS text to a worker (by worker_id, using their phone on file) or to a raw phone number.No findings

    Why it is in this group

    • The name "tascan_send_sms" says "send": a word for sending, and what is sent cannot be taken back.
    Description, as the server wrote it
    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. Attach images (MMS) with media_url (public https image URL) or media_base64 + media_type (jpeg/png/gif, max 3.5 MB) — e.g. a diagram, a tutorial photo or a site photo; the message text is optional when an image is attached. 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.

    Annotations the server declares

    • title: Send SMS
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • tascan_send_task_emailSend a branded TaScan task notification email via SendGrid.No findings

    Why it is in this group

    • The name "tascan_send_task_email" says "send": a word for sending, and what is sent cannot be taken back.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Send Task Email
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
Changes things 45Claude Code: ask
  • tascan_add_subtasksAdd one or more subtasks to a task (bulk).No findings

    Why it is in this group

    • The name "tascan_add_subtasks" says "add": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Add Subtasks
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_add_tasksAdd one or more tasks to an event (task list).No findings

    Why it is in this group

    • The name "tascan_add_tasks" says "add": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Add Tasks
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_analyze_issueStep 1 of the Closed-Loop Autonomous Operations Protocol.1 finding

    Why it is in this group

    • The name "tascan_analyze_issue" says "analyze": a word for reading.
    • The server marks it as not read-only (readOnlyHint: false).

    Findings

    • Warn

      The server marks "tascan_analyze_issue" as not read-only (readOnlyHint: false), and its words say it reads.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "tascan_analyze_issue" says "analyze": a word for reading.

      What this check looks for
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: Analyze Issue
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • tascan_apply_templateApply a pre-built template to a task list, adding all template tasksNo findings

    Why it is in this group

    • The name "tascan_apply_template" says "apply": a word for a change.
    Description, as the server wrote it
    Apply a pre-built template to a task list, adding all template tasks

    Annotations the server declares

    • title: Apply Template
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_assess_conditionRun an AI condition assessment of an asset from a photo.No findings

    Why it is in this group

    • The description's first verb is "run": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Assess Asset Condition
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • tascan_auto_resolveFULL Closed-Loop Autonomous Operations Protocol in one call.1 finding

    Why it is in this group

    • The name "tascan_auto_resolve" says "resolve": a word for reading.
    • The server marks it as not read-only (readOnlyHint: false).

    Findings

    • Warn

      The server marks "tascan_auto_resolve" as not read-only (readOnlyHint: false), and its words say it reads.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "tascan_auto_resolve" says "resolve": a word for reading.

      What this check looks for
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Auto-Resolve Issue
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • tascan_claim_runClaim a fan-out seat task as a LOCAL subagent run (POST /runs/claim -> claim_agent_run(p_runner='local')).No findings

    Why it is in this group

    • The name "tascan_claim_run" says "run": a word for a change.
    Description, as the server wrote it
    Claim a fan-out seat task as a LOCAL subagent run (POST /runs/claim -> claim_agent_run(p_runner='local')). Only admitted when instance starts with "<your registered agent_id>:" -- the seat's own coord.agent_id, set when the fan-out was created (tascan_create_fanout seats[i].runner='local'). Any other instance is refused, claimed false with reason seat_not_yours -- this tool never claims a seat that is not yours, and never claims a cloud (research) seat at all (refused not_routable). Never mints a completion or a receipt by itself -- claiming only opens the run; work happens after, and tascan_finish_run is what leaves the signed receipt. Requires agent:dispatch:code. A foreign or unknown task_id is 404, never 403 (S2: another org's task never even appears to exist).

    Annotations the server declares

    • title: Claim Run
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_complete_subtaskComplete a subtask, optionally recording a typed response_value (e.g.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Complete Subtask
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_complete_taskComplete an ORDINARY task on behalf of a worker.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Complete Task
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_create_cycleStart an unattended build-review-decide cycle (protocol v0.2).1 finding

    Why it is in this group

    • The name "tascan_create_cycle" says "create": a word for a change.

    Findings

    • Info

      The description is 2,502 characters long, over the 2,000 this check looks for.

      Matched text

      description ends: "...Track with tascan_get_cycle_report (root_id). Nothing spawns a cycle on its own."

      What this check looks for
    Description, as the server wrote it
    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. T1 (2026-09-24 throughput): kind=review_only mints T1 as CAPTURE: instead — the executor stores the bundle from the repo at HEAD without a model call and the review runs on that; dry_run=true runs the dispatch PREFLIGHT only (nothing queued) and prints every problem at once (codes title_too_long, brief_rule, brief_names_unbundled_path, artifact_over_cap, migration_as_context (tascan repo only), idempotency_replay, kind_invalid — bad kind, bad revisable_by, review_only + task_type SHELL/RESEARCH, review_only + max_questions 0), then what the API could NOT check (unchecked[]: artifact_missing_at_head always — only the executor sees the repo, and a CAPTURE naming a missing path fails with "[artifact_missing_at_head]" in its error; artifact_over_cap for any path without a byte count — pass artifact_bytes; idempotency_replay only if its lookup failed) and warnings[] (a build_brief naming a context file outside the bundle); a real create that the API refuses prints the same problems[] list (when the transport hands the tool only the first problem's text, the tool re-runs the preflight and prints the whole list). 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 (keyless) the same briefs + paths on a live root, within 24 h is refused by the preflight as idempotency_replay (400, nothing queued, the existing root_id in the problem) and printed as DUPLICATE with that root_id; only a replay the preflight could not see (a race) comes back from the RPC as 200 created=false, printed the same way. 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.

    Annotations the server declares

    • title: Create Cycle
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • tascan_create_eventCreate a new event (task list) within a project.No findings

    Why it is in this group

    • The name "tascan_create_event" says "create": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Create Event
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_create_fanoutCreate a fan-out: 1-30 seats (RESEARCH by default, or LOCAL subagent seats) plus one synthesizer under ONE cycle root (POST /coord/fanouts).No findings

    Why it is in this group

    • The name "tascan_create_fanout" says "create": a word for a change.
    Description, as the server wrote it
    Create a fan-out: 1-30 seats (RESEARCH by default, or LOCAL subagent seats) plus one synthesizer under ONE cycle root (POST /coord/fanouts). No Decision cards, Parked cards or pages per seat: only a control action or the closing roll-up reaches a human. Needs an API key with agent:dispatch:code (an admin session has no dispatch budget: key_required). dry_run true runs the same validation and ceiling/cap pre-check and returns dry_run, plan_sha256, seats and problems without spending budget or creating anything. Otherwise it consumes seats + 1 dispatch units BEFORE the create; a refusal only the database can see (cap_below_plan, fanout_open_limit, bad agent_id, reserve_floor_unset) still consumes them, by design. Fails fanout_ceiling_unset until the owner sets a ceiling, over_ceiling when cap exceeds it. idempotency_key replays a duplicate within 24h on the same plan, else idempotency_body_mismatch. Every seat, the synth and the roll-up leave a signed completion. Track with tascan_get_fanout.

    Annotations the server declares

    • title: Create Fan-out
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • tascan_create_invoiceCreate a client invoice and get its shareable link.No findings

    Why it is in this group

    • The name "tascan_create_invoice" says "create": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Create Invoice
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_create_projectCreate a new TaScan project (top-level container for events).No findings

    Why it is in this group

    • The name "tascan_create_project" says "create": a word for a change.
    Description, as the server wrote it
    Create a new TaScan project (top-level container for events). number is optional (the next P-number is assigned when omitted; a number already used in the org is refused 409). external_refs links customer job numbers.

    Annotations the server declares

    • title: Create Project
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_create_workerCreate a new worker (taskee) in the organizationNo findings

    Why it is in this group

    • The name "tascan_create_worker" says "create": a word for a change.
    Description, as the server wrote it
    Create a new worker (taskee) in the organization

    Annotations the server declares

    • title: Create Worker
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_create_zoneCreate a geofenced work zone.No findings

    Why it is in this group

    • The name "tascan_create_zone" says "create": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Create Geofenced Zone
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_delegate_to_agentMint a time-limited, NARROWER child API key (POST /delegations, roadmap #11) — only read/write scopes may be requested; full, agent:dispatch, agent:dispatch:code, device:admin, del…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Mint a time-limited, NARROWER child API key (POST /delegations, roadmap #11) — only read/write scopes may be requested; full, agent:dispatch, agent:dispatch:code, device:admin, delegate and webhooks:manage are always refused by name (I-6). TTL defaults to 1 hour (3600s), clamps to [60 seconds, 24 hours], and clamps further to THIS key's own expiry if it has one — a delegated key can never outlive its grantor. The child's tier is always a SUBSET of this key's own effective tier, never wider or lateral. Requires the delegate permission (owner-only to grant, requires full). The returned raw key is shown to you exactly ONCE — it is never stored server-side and cannot be retrieved again (I-10). Revoking this key (or any ancestor) cascades immediately to every key it delegated.

    Annotations the server declares

    • title: Delegate To Agent
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_dispatch_instructionStep 3 of the Closed-Loop Autonomous Operations Protocol.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Dispatch Instruction
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • tascan_dispatch_to_agentPREFERRED tool for sending work to an AI agent.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: Dispatch to AI Agent
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • tascan_dispatcher_actionRecord a chief-of-staff dispatcher action on a coordination cycle as a receipt (protocol v0.2 D6, POST /coord/cycles/:root/dispatcher-actions): hand_review_approve, hand_review_rev…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Record a chief-of-staff dispatcher action on a coordination cycle as a receipt (protocol v0.2 D6, POST /coord/cycles/:root/dispatcher-actions): hand_review_approve, hand_review_revise, park, bundle_recovery, migration_apply, deploy or decision. Mints a completed task + completion under the Chief of Staff worker and a dispatcher_action ledger event on the root. kind=deploy additionally requires evidence.deploy_id (a Netlify deploy id) and composes the same integrate-as-note every root gets with coord_record_integration when the root is authorized — one call that does both records. Requires agent:dispatch.

    Annotations the server declares

    • title: Dispatcher Action
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_evidence_policyRead or author a task's evidence policy (protocol v0.2 V9b, GET|PUT /evidence/policy/:task_id — one route, two methods, so one tool).1 finding

    Why it is in this group

    • The description's first verb is "read": a word for reading.
    • The server marks it as not read-only (readOnlyHint: false).

    Findings

    • Warn

      The server marks "tascan_evidence_policy" as not read-only (readOnlyHint: false), and its words say it reads.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The description's first verb is "read": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Read or author a task's evidence policy (protocol v0.2 V9b, GET|PUT /evidence/policy/:task_id — one route, two methods, so one tool). action=get evaluates the pinned policy against the evidence ledger so far: whether it is usable and satisfied, and its progress (read tier). action=set authors/updates a policy in your org's namespace when definition is given (definition.require is a non-empty array of requirement objects; definition.min_count, when set, must be an integer from 1 through definition.require.length) or, when definition is omitted, pins the task to an existing active policy_id (write tier).

    Annotations the server declares

    • title: Evidence Policy
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_finish_runFinish a claimed local run (POST /runs/:run_id/finish).No findings

    Why it is in this group

    • The name "tascan_finish_run" says "run": a word for a change.
    Description, as the server wrote it
    Finish a claimed local run (POST /runs/:run_id/finish). outcome='completed' stores `document` (and optional `verification`) as the seat's own build artifacts under EXACTLY the artifact_paths the fan-out named for this seat, hashes them into build_ref, and finishes the run -- this mints a real task_completions row and a SIGNED TASCAN RECEIPT for your work (tascan_get_receipt), the same as any other build; `document` is your deliverable and IS what gets hashed, so send the real content, not a summary. Zero changes to coord_fanout_settle / the barrier / the roll-up -- your completion releases the next held seat and, once every seat settles, feeds the fan-out's own synthesizer and rollup exactly like a cloud research seat's would. outcome='failed' finishes the run failed with your `error` text and stores nothing. Requires agent:dispatch:code. A run outside your org, or already finished, is refused (404 / the RPC's own not_live).

    Annotations the server declares

    • title: Finish Run
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_generate_qrGenerate a QR code for a task list (event) that workers can scan to access tasksNo findings

    Why it is in this group

    • The name "tascan_generate_qr" says "generate": a word for a change.
    Description, as the server wrote it
    Generate a QR code for a task list (event) that workers can scan to access tasks

    Annotations the server declares

    • title: Generate QR Code
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_generate_reportMint a shareable report and get its link.No findings

    Why it is in this group

    • The name "tascan_generate_report" says "generate": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Generate Report Link
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_heartbeat_runExtend a claimed local run's lease and mark it running (POST /runs/:run_id/heartbeat -> heartbeat_agent_run).No findings

    Why it is in this group

    • The name "tascan_heartbeat_run" says "run": a word for a change.
    Description, as the server wrote it
    Extend a claimed local run's lease and mark it running (POST /runs/:run_id/heartbeat -> heartbeat_agent_run). ok false with reason not_live means the run is no longer yours -- the sweep expired it, or it was never yours to begin with -- STOP, do not finish it. Never mints a completion or a receipt. Requires agent:dispatch:code. A run outside your org is 404, never 403.

    Annotations the server declares

    • title: Heartbeat Run
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_post_evidencePost one evidence event into the evidence ledger (protocol v0.2 V9a, POST /evidence): an actor did an action to an object at a point in time, optionally with a location and provena…1 finding

    Why it is in this group

    • The name "tascan_post_evidence" says "post": a word for a change.

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "...task or task list. Write tier; a device credential (structurally different from an API key..."

      What this check looks for
    Description, as the server wrote it
    Post one evidence event into the evidence ledger (protocol v0.2 V9a, POST /evidence): an actor did an action to an object at a point in time, optionally with a location and provenance. idempotency_key is required — the same (org, idempotency_key) always returns the same row, never a second insert. Optionally correlate the event to a task or task list. Write tier; a device credential (structurally different from an API key) is not reachable through this MCP connection, so device_id is never set here.

    Annotations the server declares

    • title: Post Evidence
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_project_digestOne 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 la…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Project Digest
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_quickstartOne action to a genuinely verified receipt (POST /quickstart).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    One action to a genuinely verified receipt (POST /quickstart). Under your org it reuses-or-creates the project "TaScan Quickstart", its list "Quickstart" and the worker "Quickstart executor", adds a NEW task "Reply with the exact text: <expected>", completes it with your key, has the named policy quickstart_exact_output v1 compare the response to the expected text (verified or refuted, signed into the receipt), and publishes the receipt's public profile. expected defaults to "VERIFIED" (max 200 chars); response defaults to expected — pass a different response to see a refuted receipt. Returns the receipt URL and the public verify URL. Write tier.

    Annotations the server declares

    • title: Quickstart: First Verified Receipt
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_recommend_fixStep 2 of the Closed-Loop Autonomous Operations Protocol.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Recommend Fix
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_record_integrationD4: 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,…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Record Integration
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_register_agentRegister a new AI agent in the agent registry.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Register AI Agent
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • tascan_register_assetRegister a physical asset (equipment, structure, vehicle, machine) in the condition ledger so it can be assessed over time.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Register Condition Asset
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_register_tagRegister a physical NFC tag to a project, task list, or specific task.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Register NFC Tag
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
  • tascan_request_verificationEnqueue an autonomous verification job for a task completion (Verification Layer V2 + V7 doc_check, POST /completions/:completion_id/verification-jobs): http_probe checks a URL (pa…No findings

    Why it is in this group

    • The name "tascan_request_verification" says "request": a word for a change.
    Description, as the server wrote it
    Enqueue an autonomous verification job for a task completion (Verification Layer V2 + V7 doc_check, POST /completions/:completion_id/verification-jobs): http_probe checks a URL (params url, and optionally expect_status, expect_content_type, expect_sha256), doc_check runs a named policy against params.url and params.policy_id. Read the result with tascan_list_verifications once the job runs. Write tier.

    Annotations the server declares

    • title: Request Verification
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • tascan_schedule_smsSchedule 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…No findings

    Why it is in this group

    • The name "tascan_schedule_sms" says "schedule": a word for a change.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Schedule SMS
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • tascan_server_infoIdentify exactly which TaScan server and schema this MCP session is talking to.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Server Info
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_update_eventUpdate an event / task list (name, description, team_mode, multi_instance, timer_mode).No findings

    Why it is in this group

    • The name "tascan_update_event" says "update": a word for a change.
    Description, as the server wrote it
    Update an event / task list (name, description, team_mode, multi_instance, timer_mode). team_mode and multi_instance cannot both be true.

    Annotations the server declares

    • title: Update Event
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_update_invoiceUpdate an invoice: mark it paid (records paid_at), overdue, cancelled, or edit client details / notes / due date.No findings

    Why it is in this group

    • The name "tascan_update_invoice" says "update": a word for a change.
    Description, as the server wrote it
    Update an invoice: mark it paid (records paid_at), overdue, cancelled, or edit client details / notes / due date.

    Annotations the server declares

    • title: Update Invoice
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_update_projectUpdate a project (name, location, status, dates, number, external_refs).No findings

    Why it is in this group

    • The name "tascan_update_project" says "update": a word for a change.
    Description, as the server wrote it
    Update a project (name, location, status, dates, number, external_refs). A number already used in the org is refused 409; external_refs replaces the whole list.

    Annotations the server declares

    • title: Update Project
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_update_subtaskUpdate a subtask (title, description, response_type, response_config, requires_photo, sort_order).No findings

    Why it is in this group

    • The name "tascan_update_subtask" says "update": a word for a change.
    Description, as the server wrote it
    Update a subtask (title, description, response_type, response_config, requires_photo, sort_order).

    Annotations the server declares

    • title: Update Subtask
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_update_taskUpdate a task (title, description, response_type, flags, sort_order).No findings

    Why it is in this group

    • The name "tascan_update_task" says "update": a word for a change.
    Description, as the server wrote it
    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:.

    Annotations the server declares

    • title: Update Task
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_update_workerUpdate a worker profile (name, phone, email)No findings

    Why it is in this group

    • The name "tascan_update_worker" says "update": a word for a change.
    Description, as the server wrote it
    Update a worker profile (name, phone, email)

    Annotations the server declares

    • title: Update Worker
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_update_zoneUpdate a geofenced zone — move the center, resize the radius, change the routing target, toggle zone-lock, or deactivate it (is_active=false).No findings

    Why it is in this group

    • The name "tascan_update_zone" says "update": a word for a change.
    Description, as the server wrote it
    Update a geofenced zone — move the center, resize the radius, change the routing target, toggle zone-lock, or deactivate it (is_active=false).

    Annotations the server declares

    • title: Update Geofenced Zone
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_verify_receiptIndependently verify a TaScan Action Receipt JWS (protocol 6.8, POST /receipts/verify): size, envelope, signature, issuer origin, key lifecycle, hashing profile, value semantics, s…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Independently verify a TaScan Action Receipt JWS (protocol 6.8, POST /receipts/verify): size, envelope, signature, issuer origin, key lifecycle, hashing profile, value semantics, schema and chain check, with an online issued/serial check for the reference issuer. Public route: no TaScan scope is required by the API itself, though this MCP connection still needs some valid key to place any tools/call. Works for both the full and the public export profile. Keys come only from the issuer's own well-known key document (https://app.tascan.io/.well-known/tascan-receipt-keys.json for the reference issuer, or the equivalent well-known path for a foreign one) — this tool never supplies keys itself. Never verifies locally — always calls the reference verifier.

    Annotations the server declares

    • title: Verify Receipt
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • tascan_zone_complianceHazard-zone compliance audit (OSHA / insurance): every zone crossing, PPE checkpoint verdict (complied / failed with what was missing / skipped), and breach, plus injury reports cr…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Zone Compliance Audit
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
Only reads 46Claude Code: allow
  • tascan_condition_historyGet an asset's longitudinal condition history — score trend over time, every assessment with grade, delta, findings, and who assessed it.No findings

    Why it is in this group

    • The description's first verb is "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get Condition History
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_findCross-entity search: find projects, task lists, tasks, workers, or condition assets by name in one call — with ids and parent context to disambiguate.No findings

    Why it is in this group

    • The name "tascan_find" says "find": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Find Anything
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_find_duplicate_workersFind candidate same-person worker records with per-signal match detail (Patent 4 §6.25(b) signals: phone reuse, name similarity, GPS pattern correlation).No findings

    Why it is in this group

    • The name "tascan_find_duplicate_workers" says "find": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Find Duplicate Workers
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_budgetRead THIS credential's own per-key action budget (GET /budget): daily limits (sms, invites, payment-request cents per day and per request, dispatch, human pages) and today's spend …1 finding

    Why it is in this group

    • The name "tascan_get_budget" says "get": a word for reading.

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "Read THIS credential's own per-key action budget (GET /budge..."

      What this check looks for
    Description, as the server wrote it
    Read THIS credential's own per-key action budget (GET /budget): daily limits (sms, invites, payment-request cents per day and per request, dispatch, human pages) and today's spend against them. A NULL limit (or no budget row at all) means unlimited on that counter. A key can only ever see its OWN budget, never another key's (I-3, no tool or key ever reads another key's row). Read tier.

    Annotations the server declares

    • title: Get Budget
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_buildManifest 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 …No findings

    Why it is in this group

    • The name "tascan_get_build" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get Build Manifest
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_build_fileRead 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.No findings

    Why it is in this group

    • The name "tascan_get_build_file" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get Build File
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_cycle_reportThe 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 …No findings

    Why it is in this group

    • The name "tascan_get_cycle_report" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get Cycle Report
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_deviceGet one device by id: kind, name, status, location zone, credential rotation timestamps, revocation reason, and the last 20 evidence_events ids it produced.1 finding

    Why it is in this group

    • The name "tascan_get_device" says "get": a word for reading.

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "...id: kind, name, status, location zone, credential rotation timestamps, revocation reason,..."

      What this check looks for
    Description, as the server wrote it
    Get one device by id: kind, name, status, location zone, credential rotation timestamps, revocation reason, and the last 20 evidence_events ids it produced. Never returns a credential hash.

    Annotations the server declares

    • title: Get Device
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_eventGet details of a specific event (task list) including its tasksNo findings

    Why it is in this group

    • The name "tascan_get_event" says "get": a word for reading.
    Description, as the server wrote it
    Get details of a specific event (task list) including its tasks

    Annotations the server declares

    • title: Get Event
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_fanoutRead a fan-out (GET /coord/fanouts/:id?view=).No findings

    Why it is in this group

    • The name "tascan_get_fanout" says "get": a word for reading.
    Description, as the server wrote it
    Read a fan-out (GET /coord/fanouts/:id?view=). view=status (default): state, seat counts, spend, cap, synth_deadline_at, poll_after_s. view=report: the full cycle report (get_cycle_report) — every seat, review and control step. view=rollup: the exact roll-up response_value plus its leaves (path, sha256, completion_id) once closed. view=verify: the server recomputes rollup_ref over the frozen leaves and returns ok / mismatches — the same check scripts/verify-fanout.js performs independently from another machine, which is the trusted proof; this view is a convenience, not a substitute. A foreign org's fanout_id answers 404, never 403, so another org's fan-out never even appears to exist. Read tier, no dispatch permission required.

    Annotations the server declares

    • title: Get Fan-out
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_orgRead the organization profile (GET /org): id, name, industry, logo, time zone and the admin phone MASKED to its last 4 digits (a tool never sees the full number).No findings

    Why it is in this group

    • The name "tascan_get_org" says "get": a word for reading.
    Description, as the server wrote it
    Read the organization profile (GET /org): id, name, industry, logo, time zone and the admin phone MASKED to its last 4 digits (a tool never sees the full number). Read tier. Editing the organization is done by an owner or admin in the TaScan portal, not by any tool.

    Annotations the server declares

    • title: Get Organization
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_projectGet details of a specific projectNo findings

    Why it is in this group

    • The name "tascan_get_project" says "get": a word for reading.
    Description, as the server wrote it
    Get details of a specific project

    Annotations the server declares

    • title: Get Project
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_receiptFetch the signed Action Receipt (Ed25519 JWS) for one completed task by completion_id (tascan_get_task -> completions[].id).No findings

    Why it is in this group

    • The name "tascan_get_receipt" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get Action Receipt
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_reportGet completion report for a task list (event) including task status, completions, workers, and photos.No findings

    Why it is in this group

    • The name "tascan_get_report" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get Report
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_scan_historyScan accountability data.No findings

    Why it is in this group

    • The name "tascan_get_scan_history" says "get": a word for reading.
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: Get Scan History
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_signature_bundleFetch the signature bundle for one signed document by signature assertion id (the signature_assertion_id inside the response value of a completed signature task).No findings

    Why it is in this group

    • The name "tascan_get_signature_bundle" says "get": a word for reading.
    Description, as the server wrote it
    Fetch the signature bundle for one signed document by signature assertion id (the signature_assertion_id inside the response value of a completed signature task). Returns the self-contained JSON an auditor can verify offline without trusting TaScan: the signed challenge preimage (v 2 also carries the typed name the signer entered, signer_typed_name), clientDataJSON, authenticatorData, signature, public key, the user-verification and backup flags, the document SHA-256, task id, completion id and time. Check it with: npx tascan-verify --signature bundle.json [--doc the-document.pdf]. Contains no signed URL, phone number or email. Read tier, organization-scoped.

    Annotations the server declares

    • title: Get Signature Bundle
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_sms_statusCheck delivery status of a previously sent TaScan SMS by its Twilio SID (returned by tascan_send_sms).No findings

    Why it is in this group

    • The name "tascan_get_sms_status" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get SMS Status
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • tascan_get_taskGet details of a specific task including completions and subtasks.No findings

    Why it is in this group

    • The name "tascan_get_task" says "get": a word for reading.
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: Get Task
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_task_trailRead a task's trail messages (protocol v0.2 trail_messages, GET /tasks/:id/messages): question, answer, handoff and note/discussion entries, last 100, newest last (reading order).No findings

    Why it is in this group

    • The name "tascan_get_task_trail" says "get": a word for reading.
    Description, as the server wrote it
    Read a task's trail messages (protocol v0.2 trail_messages, GET /tasks/:id/messages): question, answer, handoff and note/discussion entries, last 100, newest last (reading order). Optionally filter to a comma-separated set of kinds, and with since=<ISO time> read only messages newer than the last one you saw. Read tier. Post with tascan_post_message.

    Annotations the server declares

    • title: Get Task Trail
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_usageRead your organization's usage and quota snapshot for a billing period (GET /usage): SMS, email and AI call counts against their plan limits, the 100-receipt-per-month hard stop (u…No findings

    Why it is in this group

    • The name "tascan_get_usage" says "get": a word for reading.
    Description, as the server wrote it
    Read your organization's usage and quota snapshot for a billing period (GET /usage): SMS, email and AI call counts against their plan limits, the 100-receipt-per-month hard stop (used, allowance, hard_stop), the rate-limit window (60 requests per minute), and coordination-cycle spend in micro-USD for build roots created in that period. period defaults to the current UTC month (YYYY-MM). by_key additionally breaks coordination spend down per dispatch-scoped API key, refused (403 owner_required) to anything but an owner admin session -- a tsk_ key never gets it. Read tier.

    Annotations the server declares

    • title: Get Usage
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_workerUngated, plain read of one worker row: name, contact, org, points, streaks, timestamps.No findings

    Why it is in this group

    • The name "tascan_get_worker" says "get": a word for reading.
    Description, as the server wrote it
    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.)

    Annotations the server declares

    • title: Get Worker
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_get_worker_passportGet 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…No findings

    Why it is in this group

    • The name "tascan_get_worker_passport" says "get": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Get Worker Passport
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_agentsList all registered AI agents with their capabilities, inbox IDs, and status.No findings

    Why it is in this group

    • The name "tascan_list_agents" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List AI Agents
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_assetsList registered condition-ledger assets with their latest condition scores.No findings

    Why it is in this group

    • The name "tascan_list_assets" says "list": a word for reading.
    Description, as the server wrote it
    List registered condition-ledger assets with their latest condition scores. Use to recover an asset_id for tascan_assess_condition or tascan_condition_history.

    Annotations the server declares

    • title: List Condition Assets
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_connectorsList the organization's connectors (GET /integrations), e.g.No findings

    Why it is in this group

    • The name "tascan_list_connectors" says "list": a word for reading.
    Description, as the server wrote it
    List the organization's connectors (GET /integrations), e.g. the Salesforce Work Order bridge: provider, instance URL, the project and list new work lands on (with names), whether it is on, the last poll time and the last error. Never shows secrets: the client id, the client secret, its storage name and the connector config are never returned. Read tier. Turning a connector on or off, retargeting it or adding one is done by an owner or admin in the TaScan portal, not by any tool.

    Annotations the server declares

    • title: List Connectors
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_cyclesList coordination-cycle roots in the organization (protocol v0.2, GET /coord/cycles): root id, title, status, task_type, project, build_ref, deploy_id and the T2 review id, newest …No findings

    Why it is in this group

    • The name "tascan_list_cycles" says "list": a word for reading.
    Description, as the server wrote it
    List coordination-cycle roots in the organization (protocol v0.2, GET /coord/cycles): root id, title, status, task_type, project, build_ref, deploy_id and the T2 review id, newest first. Filter by project_id and/or status. Read tier — a reviewer's read-only key can call this too. Follow up with tascan_get_cycle_report root_id=... for the full audit trail of any row.

    Annotations the server declares

    • title: List Cycles
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_delegationsList delegated child keys (GET /delegations): this key's own direct children (id, label, scopes, active/revoked, depth, expires_at) — never the raw credential.1 finding

    Why it is in this group

    • The name "tascan_list_delegations" says "list": a word for reading.

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "...ked, depth, expires_at) — never the raw credential. An admin session sees every delegated..."

      What this check looks for
    Description, as the server wrote it
    List delegated child keys (GET /delegations): this key's own direct children (id, label, scopes, active/revoked, depth, expires_at) — never the raw credential. An admin session sees every delegated key in the org. Read tier.

    Annotations the server declares

    • title: List Delegations
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_devicesList registered devices (RFID portals, barcode guns, PLCs, cameras, robots, tools, sensors) in the organization.1 finding

    Why it is in this group

    • The name "tascan_list_devices" says "list": a word for reading.

    Findings

    • Info

      The description mentions "credential".

      Matched text

      description: "...with an opaque cursor. Never returns a credential hash."

      What this check looks for
    Description, as the server wrote it
    List registered devices (RFID portals, barcode guns, PLCs, cameras, robots, tools, sensors) in the organization. Filter by status (active/revoked) or kind; paginate with an opaque cursor. Never returns a credential hash.

    Annotations the server declares

    • title: List Devices
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_eventsList all events (task lists) within a projectNo findings

    Why it is in this group

    • The name "tascan_list_events" says "list": a word for reading.
    Description, as the server wrote it
    List all events (task lists) within a project

    Annotations the server declares

    • title: List Events
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_invitesList marketplace invites you have sent and their status (pending / accepted / declined / expired / failed).No findings

    Why it is in this group

    • The name "tascan_list_invites" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List Marketplace Invites
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_invoicesList invoices for the org (newest first) with status, client, total, due date and share link.No findings

    Why it is in this group

    • The name "tascan_list_invoices" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List Invoices
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_issuesList all issues for a task list (event).No findings

    Why it is in this group

    • The name "tascan_list_issues" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List Issues
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_paymentsList gig payments and their lifecycle status: awaiting_completion (pledged, work not verified yet), ready_to_pay (verified — pay link sent to payer), paid, canceled.No findings

    Why it is in this group

    • The name "tascan_list_payments" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List Gig Payments
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_projectsList TaScan projects in the organization (each with its number, e.g.No findings

    Why it is in this group

    • The name "tascan_list_projects" says "list": a word for reading.
    Description, as the server wrote it
    List TaScan projects in the organization (each with its number, e.g. P-00001, and external_refs). Optional filters: status (exact, comma list), number (exact) and ref (matches any external_refs[].ref exactly, e.g. a customer job number like P14-4680).

    Annotations the server declares

    • title: List Projects
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_reportsList existing report links for a list or project (completion / service / project / evidence), newest first, with client acknowledgment status for service reports.No findings

    Why it is in this group

    • The name "tascan_list_reports" says "list": a word for reading.
    Description, as the server wrote it
    List existing report links for a list or project (completion / service / project / evidence), newest first, with client acknowledgment status for service reports.

    Annotations the server declares

    • title: List Report Links
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_scheduled_smsList your org's scheduled texts (default: pending + sending, soonest first; status=sent|failed|cancelled to see history).No findings

    Why it is in this group

    • The name "tascan_list_scheduled_sms" says "list": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: List Scheduled SMS
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_subtasksList the subtasks of a task, including completion state, stored response values, and completion timestamps (per-set timing).No findings

    Why it is in this group

    • The name "tascan_list_subtasks" says "list": a word for reading.
    Description, as the server wrote it
    List the subtasks of a task, including completion state, stored response values, and completion timestamps (per-set timing).

    Annotations the server declares

    • title: List Subtasks
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_tagsList all registered NFC tags in the organization with their linked projects/task lists and scan countsNo findings

    Why it is in this group

    • The name "tascan_list_tags" says "list": a word for reading.
    Description, as the server wrote it
    List all registered NFC tags in the organization with their linked projects/task lists and scan counts

    Annotations the server declares

    • title: List NFC Tags
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_tasksList the tasks in an event (task list).No findings

    Why it is in this group

    • The name "tascan_list_tasks" says "list": a word for reading.
    Description, as the server wrote it
    List the tasks in an event (task list). status "open" returns only tasks with no completion yet: use it when checking for work to do, so a long list is not re-read in full. "done" returns only completed tasks; "all" (default) returns every task.

    Annotations the server declares

    • title: List Tasks
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_templatesList available task templates (built-in and saved)No findings

    Why it is in this group

    • The name "tascan_list_templates" says "list": a word for reading.
    Description, as the server wrote it
    List available task templates (built-in and saved)

    Annotations the server declares

    • title: List Templates
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_verificationsRead a task completion's verification verdicts and job queue (Verification Layer V2, GET /completions/:completion_id/verifications): completion_verifications rows (state, method, v…No findings

    Why it is in this group

    • The name "tascan_list_verifications" says "list": a word for reading.
    Description, as the server wrote it
    Read a task completion's verification verdicts and job queue (Verification Layer V2, GET /completions/:completion_id/verifications): completion_verifications rows (state, method, verifier, policy, confidence, finding) plus verification_jobs rows (state, attempts, last_error, result). Read tier.

    Annotations the server declares

    • title: List Verifications
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_workersList workers (taskees) in the organization.No findings

    Why it is in this group

    • The name "tascan_list_workers" says "list": a word for reading.
    Description, as the server wrote it
    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).

    Annotations the server declares

    • title: List Workers
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_list_zonesList geofenced work zones, optionally filtered by project.No findings

    Why it is in this group

    • The name "tascan_list_zones" says "list": a word for reading.
    Description, as the server wrote it
    List geofenced work zones, optionally filtered by project. Shows center, radius, routing target, and zone-lock status.

    Annotations the server declares

    • title: List Geofenced Zones
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_org_analyticsRead organization-wide analytics: view org (GET /analytics/org, the get_org_analytics rollup) or view resolutions (GET /analytics/resolutions, paginated AI issue-resolution history…No findings

    Why it is in this group

    • The description's first verb is "read": a word for reading.
    Description, as the server wrote it
    Read organization-wide analytics: view org (GET /analytics/org, the get_org_analytics rollup) or view resolutions (GET /analytics/resolutions, paginated AI issue-resolution history, filterable by severity, category, and pattern-detected). Read tier.

    Annotations the server declares

    • title: Org Analytics
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_query_responsesQuery one task's submitted responses across every list in a project — e.g.No findings

    Why it is in this group

    • The name "tascan_query_responses" says "query": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Query Task Responses Across Lists
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • tascan_search_marketplaceSearch the cross-org Worker Marketplace: workers who opted in (discoverable=true on their passport), ranked by passkey trust tier + verified completion volume.No findings

    Why it is in this group

    • The name "tascan_search_marketplace" says "search": a word for reading.
    Description, as the server wrote it
    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.

    Annotations the server declares

    • title: Search Worker Marketplace
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 3.0.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http tascan https://app.tascan.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__tascan__tascan_list_projects",
      "mcp__tascan__tascan_get_project",
      "mcp__tascan__tascan_list_events",
      "mcp__tascan__tascan_get_event",
      "mcp__tascan__tascan_get_signature_bundle",
      "mcp__tascan__tascan_list_agents",
      "mcp__tascan__tascan_list_tasks",
      "mcp__tascan__tascan_get_task",
      "mcp__tascan__tascan_get_receipt",
      "mcp__tascan__tascan_list_subtasks",
      "mcp__tascan__tascan_list_workers",
      "mcp__tascan__tascan_list_templates",
      "mcp__tascan__tascan_get_report",
      "mcp__tascan__tascan_query_responses",
      "mcp__tascan__tascan_list_issues",
      "mcp__tascan__tascan_list_scheduled_sms",
      "mcp__tascan__tascan_get_sms_status",
      "mcp__tascan__tascan_list_tags",
      "mcp__tascan__tascan_get_scan_history",
      "mcp__tascan__tascan_search_marketplace",
      "mcp__tascan__tascan_list_invites",
      "mcp__tascan__tascan_list_zones",
      "mcp__tascan__tascan_condition_history",
      "mcp__tascan__tascan_list_assets",
      "mcp__tascan__tascan_list_reports",
      "mcp__tascan__tascan_list_invoices",
      "mcp__tascan__tascan_list_payments",
      "mcp__tascan__tascan_get_worker_passport",
      "mcp__tascan__tascan_find",
      "mcp__tascan__tascan_get_worker",
      "mcp__tascan__tascan_find_duplicate_workers",
      "mcp__tascan__tascan_get_build",
      "mcp__tascan__tascan_get_build_file",
      "mcp__tascan__tascan_get_cycle_report",
      "mcp__tascan__tascan_list_cycles",
      "mcp__tascan__tascan_get_task_trail",
      "mcp__tascan__tascan_list_verifications",
      "mcp__tascan__tascan_org_analytics",
      "mcp__tascan__tascan_get_usage",
      "mcp__tascan__tascan_get_budget",
      "mcp__tascan__tascan_list_delegations",
      "mcp__tascan__tascan_list_connectors",
      "mcp__tascan__tascan_get_org",
      "mcp__tascan__tascan_list_devices",
      "mcp__tascan__tascan_get_device",
      "mcp__tascan__tascan_get_fanout"
    ],
    "ask": [
      "mcp__tascan__tascan_create_project",
      "mcp__tascan__tascan_update_project",
      "mcp__tascan__tascan_create_event",
      "mcp__tascan__tascan_update_event",
      "mcp__tascan__tascan_add_tasks",
      "mcp__tascan__tascan_dispatch_to_agent",
      "mcp__tascan__tascan_register_agent",
      "mcp__tascan__tascan_update_task",
      "mcp__tascan__tascan_reply_with_list",
      "mcp__tascan__tascan_add_subtasks",
      "mcp__tascan__tascan_update_subtask",
      "mcp__tascan__tascan_complete_subtask",
      "mcp__tascan__tascan_complete_task",
      "mcp__tascan__tascan_create_worker",
      "mcp__tascan__tascan_update_worker",
      "mcp__tascan__tascan_generate_qr",
      "mcp__tascan__tascan_apply_template",
      "mcp__tascan__tascan_analyze_issue",
      "mcp__tascan__tascan_recommend_fix",
      "mcp__tascan__tascan_dispatch_instruction",
      "mcp__tascan__tascan_auto_resolve",
      "mcp__tascan__tascan_send_sms",
      "mcp__tascan__tascan_schedule_sms",
      "mcp__tascan__tascan_send_task_email",
      "mcp__tascan__tascan_register_tag",
      "mcp__tascan__tascan_invite_worker",
      "mcp__tascan__tascan_create_zone",
      "mcp__tascan__tascan_update_zone",
      "mcp__tascan__tascan_zone_compliance",
      "mcp__tascan__tascan_register_asset",
      "mcp__tascan__tascan_assess_condition",
      "mcp__tascan__tascan_generate_report",
      "mcp__tascan__tascan_create_invoice",
      "mcp__tascan__tascan_update_invoice",
      "mcp__tascan__tascan_request_payment",
      "mcp__tascan__tascan_server_info",
      "mcp__tascan__tascan_create_cycle",
      "mcp__tascan__tascan_post_message",
      "mcp__tascan__tascan_record_integration",
      "mcp__tascan__tascan_project_digest",
      "mcp__tascan__tascan_verify_receipt",
      "mcp__tascan__tascan_dispatcher_action",
      "mcp__tascan__tascan_post_evidence",
      "mcp__tascan__tascan_evidence_policy",
      "mcp__tascan__tascan_request_verification",
      "mcp__tascan__tascan_delegate_to_agent",
      "mcp__tascan__tascan_quickstart",
      "mcp__tascan__tascan_create_fanout",
      "mcp__tascan__tascan_claim_run",
      "mcp__tascan__tascan_heartbeat_run",
      "mcp__tascan__tascan_finish_run"
    ],
    "deny": [
      "mcp__tascan__tascan_delete_project",
      "mcp__tascan__tascan_delete_event",
      "mcp__tascan__tascan_delete_subtask",
      "mcp__tascan__tascan_delete_task",
      "mcp__tascan__tascan_cancel_scheduled_sms",
      "mcp__tascan__tascan_merge_workers",
      "mcp__tascan__tascan_delete_worker",
      "mcp__tascan__tascan_get_build_diff",
      "mcp__tascan__tascan_revoke_delegation",
      "mcp__tascan__tascan_revoke_device",
      "mcp__tascan__tascan_control_fanout"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as tascan. Review it before you use it.