{"apiVersion":"v1","directorySlug":"viact-mcp-28be29ae5d","title":"viAct - AI Monitoring That Redefines Workplace Safety","description":"viAct is a workplace safety platform that uses computer vision AI to reveal unseen hazards, improve compliance, and empower EHS leaders to save lives.","pageUrl":"https://www.mcpbundles.com/skills/viact-mcp-28be29ae5d","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://mcp.viact.ai/mcp","hostedMcpUrl":null,"toolCount":87,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"ai.viact/viact-mcp-28be29ae5d","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"company-getCompany","description":"[Company] Executes GET /api/company/{id}","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"company-getCompany","displayName":"company-getCompany","title":"company-getCompany","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"groupingUnit-createGroupingUnit","description":"[Grouping Unit] Creates a new grouping unit in the hierarchy","inputSchema":{"type":"object","required":["name","level_id","code"],"properties":{"code":{"type":"string","example":"CNT-001"},"move":{"type":"boolean","default":false,"example":false},"name":{"type":"string","example":"Contract A"},"level_id":{"type":"string","example":"123e4567-e89b-12d3-a456-426614174000"},"metadata":{"type":"object","example":{"region":"North","manager":"John Doe","contract_number":"CNT-2024-001"}},"parent_id":{"type":"string","example":"123e4567-e89b-12d3-a456-426614174001"},"company_codes":{"type":"array","items":{"type":"string"},"example":["company-123"]},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"groupingUnit-createGroupingUnit","displayName":"groupingUnit-createGroupingUnit","title":"groupingUnit-createGroupingUnit","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"groupingUnit-getGroupingUnitTree","description":"[Grouping Unit] Returns the hierarchical structure of grouping units starting from the specified unit","inputSchema":{"type":"object","required":["unitId"],"properties":{"unitId":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"groupingUnit-getGroupingUnitTree","displayName":"groupingUnit-getGroupingUnitTree","title":"groupingUnit-getGroupingUnitTree","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"groupingUnit-getRootUnits","description":"[Grouping Unit] Returns all active root-level grouping units","inputSchema":{"type":"object","required":[],"properties":{"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"groupingUnit-getRootUnits","displayName":"groupingUnit-getRootUnits","title":"groupingUnit-getRootUnits","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"groupingUnit-getGroupingLevels","description":"[Grouping Unit] Returns the available grouping levels ordered by hierarchy","inputSchema":{"type":"object","required":[],"properties":{"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"groupingUnit-getGroupingLevels","displayName":"groupingUnit-getGroupingLevels","title":"groupingUnit-getGroupingLevels","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"groupingUnit-addCompaniesToUnit","description":"[Grouping Unit] Adds one or more companies to the specified grouping unit and propagates the assignment up the hierarchy","inputSchema":{"type":"object","required":["id","company_codes"],"properties":{"id":{"type":"string"},"move":{"type":"boolean","default":false,"example":false},"company_codes":{"type":"array","items":{"type":"string"},"example":["COMP-001","COMP-002"]},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"groupingUnit-addCompaniesToUnit","displayName":"groupingUnit-addCompaniesToUnit","title":"groupingUnit-addCompaniesToUnit","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"monitor-getLists","description":"[Monitor] Executes GET /api/monitor","inputSchema":{"type":"object","required":["text_search"],"properties":{"text_search":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"monitor-getLists","displayName":"monitor-getLists","title":"monitor-getLists","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"monitor-getMonitor","description":"[Monitor] Executes GET /api/monitor/{id}","inputSchema":{"type":"object","required":["id","attributes"],"properties":{"id":{"type":"string"},"attributes":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"monitor-getMonitor","displayName":"monitor-getMonitor","title":"monitor-getMonitor","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"stats-getObjectCountingStatistic","description":"[Stats] Get Object counting statistic","inputSchema":{"type":"object","required":["timezone","from","to","object","group_by"],"properties":{"to":{"type":"string"},"from":{"type":"string"},"object":{"type":"string"},"group_by":{"type":"string"},"timezone":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"stats-getObjectCountingStatistic","displayName":"stats-getObjectCountingStatistic","title":"stats-getObjectCountingStatistic","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"stats-getSmartWatchStats","description":"[Stats] Get Critical incident statistic","inputSchema":{"type":"object","required":["company_code","timezone","from","to","group_by","limit"],"properties":{"to":{"type":"string"},"from":{"type":"string"},"mode":{"type":"string"},"limit":{"type":"string"},"group_by":{"type":"string"},"timezone":{"type":"string"},"company_code":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"stats-getSmartWatchStats","displayName":"stats-getSmartWatchStats","title":"stats-getSmartWatchStats","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"stats-getSWActivityStats","description":"[Stats] Get Smart watch activity statistic","inputSchema":{"type":"object","required":["company_code","timezone","from","to","group_by","limit"],"properties":{"to":{"type":"string"},"from":{"type":"string"},"mode":{"type":"string"},"limit":{"type":"string"},"group_by":{"type":"string"},"timezone":{"type":"string"},"company_code":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"stats-getSWActivityStats","displayName":"stats-getSWActivityStats","title":"stats-getSWActivityStats","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"stats-getGasSensorStats","description":"[Stats] Get gas sensor statistic","inputSchema":{"type":"object","required":["timezone","from","to"],"properties":{"to":{"type":"string"},"from":{"type":"string"},"mode":{"type":"string"},"timezone":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"stats-getGasSensorStats","displayName":"stats-getGasSensorStats","title":"stats-getGasSensorStats","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"stats-getAlertsTrendSummary","description":"[Stats] Get trend change alerts","inputSchema":{"type":"object","required":["data_source","duration","alert_type"],"properties":{"duration":{"type":"string"},"alert_type":{"type":"string"},"data_source":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"stats-getAlertsTrendSummary","displayName":"stats-getAlertsTrendSummary","title":"stats-getAlertsTrendSummary","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"stats-getAllAlertsTrendSummary","description":"[Stats] Get trend change alerts","inputSchema":{"type":"object","required":["duration"],"properties":{"duration":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"stats-getAllAlertsTrendSummary","displayName":"stats-getAllAlertsTrendSummary","title":"stats-getAllAlertsTrendSummary","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"stats-getAlertTrendByRange","description":"[Stats] Get alert trends summary by range and duration","inputSchema":{"type":"object","required":[],"properties":{"to":{"type":"string"},"from":{"type":"string"},"alert_type":{"type":"string"},"data_source":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"stats-getAlertTrendByRange","displayName":"stats-getAlertTrendByRange","title":"stats-getAlertTrendByRange","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"stats-getAlertSummaryByLatLng","description":"[Stats] Get alerts summary by lat and long","inputSchema":{"type":"object","required":[],"properties":{"to":{"type":"string"},"from":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"stats-getAlertSummaryByLatLng","displayName":"stats-getAlertSummaryByLatLng","title":"stats-getAlertSummaryByLatLng","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"stats-getAllAlertTrends","description":"[Stats] Get trend change alerts","inputSchema":{"type":"object","required":["duration","alert_type","sort_type","top_list"],"properties":{"duration":{"type":"string"},"top_list":{"type":"string"},"sort_type":{"type":"string"},"alert_type":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"stats-getAllAlertTrends","displayName":"stats-getAllAlertTrends","title":"stats-getAllAlertTrends","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"detection-getAllDetections","description":"[Detection] Executes GET /api/detection","inputSchema":{"type":"object","required":["period_from","period_to","monitor_id"],"properties":{"period_to":{"type":"string"},"monitor_id":{"type":"string"},"period_from":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"detection-getAllDetections","displayName":"detection-getAllDetections","title":"detection-getAllDetections","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"engines-searchEngines","description":"[Engines] Executes GET /api/engines/search","inputSchema":{"type":"object","required":["q"],"properties":{"q":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"engines-searchEngines","displayName":"engines-searchEngines","title":"engines-searchEngines","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"inventory-getAllInventory","description":"[Inventory] Executes GET /api/inventory","inputSchema":{"type":"object","required":[],"properties":{"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"inventory-getAllInventory","displayName":"inventory-getAllInventory","title":"inventory-getAllInventory","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"inventory-getInventoryStatsValidity","description":"[Inventory] Executes GET /api/inventory/stats-validity","inputSchema":{"type":"object","required":[],"properties":{"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"inventory-getInventoryStatsValidity","displayName":"inventory-getInventoryStatsValidity","title":"inventory-getInventoryStatsValidity","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"inventory-getInventory","description":"[Inventory] Executes GET /api/inventory/{id}","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"inventory-getInventory","displayName":"inventory-getInventory","title":"inventory-getInventory","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"companyMonitors-createNewCME","description":"[Company Monitors] Executes POST /api/companies-monitors-engines","inputSchema":{"type":"object","required":["body"],"properties":{"body":{"type":"object","properties":{}},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"companyMonitors-createNewCME","displayName":"companyMonitors-createNewCME","title":"companyMonitors-createNewCME","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"smartLock-getSmartLockEventLogs","description":"[Smart Lock] Executes GET /api/smart-lock/events","inputSchema":{"type":"object","required":["q","mode"],"properties":{"q":{"type":"string"},"mode":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"smartLock-getSmartLockEventLogs","displayName":"smartLock-getSmartLockEventLogs","title":"smartLock-getSmartLockEventLogs","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"smartLock-getAllSmartLockDevices","description":"[Smart Lock] Executes GET /api/smart-lock/devices","inputSchema":{"type":"object","required":["q","connection","lock_status"],"properties":{"q":{"type":"string"},"connection":{"type":"string"},"lock_status":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"smartLock-getAllSmartLockDevices","displayName":"smartLock-getAllSmartLockDevices","title":"smartLock-getAllSmartLockDevices","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"smartLock-getSmartLockDevice","description":"[Smart Lock] Executes GET /api/smart-lock/devices/{id}","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"smartLock-getSmartLockDevice","displayName":"smartLock-getSmartLockDevice","title":"smartLock-getSmartLockDevice","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-getPermitStatsStatus","description":"[Permit] Executes GET /api/permit/stats/status","inputSchema":{"type":"object","required":[],"properties":{"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"permit-getPermitStatsStatus","displayName":"permit-getPermitStatsStatus","title":"permit-getPermitStatsStatus","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-listPermits","description":"[Permit] Executes GET /api/permit","inputSchema":{"type":"object","required":[],"properties":{"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"permit-listPermits","displayName":"permit-listPermits","title":"permit-listPermits","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-createPermitDraft","description":"[Permit] Executes POST /api/permit/draft","inputSchema":{"type":"object","required":["body"],"properties":{"body":{"type":"object","properties":{}},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"permit-createPermitDraft","displayName":"permit-createPermitDraft","title":"permit-createPermitDraft","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-duplicatePermit","description":"[Permit] Executes POST /api/permit/{id}/duplicate","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"permit-duplicatePermit","displayName":"permit-duplicatePermit","title":"permit-duplicatePermit","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-getPermitById","description":"[Permit] Executes GET /api/permit/{id}","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"permit-getPermitById","displayName":"permit-getPermitById","title":"permit-getPermitById","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-updatePermit","description":"[Permit] Executes PUT /api/permit/{id}","inputSchema":{"type":"object","required":["id","body"],"properties":{"id":{"type":"string"},"body":{"type":"object","properties":{}},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"permit-updatePermit","displayName":"permit-updatePermit","title":"permit-updatePermit","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-getPermitLogs","description":"[Permit] Executes GET /api/permit/{id}/logs","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"permit-getPermitLogs","displayName":"permit-getPermitLogs","title":"permit-getPermitLogs","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-publishPermit","description":"[Permit] Executes PUT /api/permit/{id}/publish","inputSchema":{"type":"object","required":["id","body"],"properties":{"id":{"type":"string"},"body":{"type":"object","properties":{}},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"permit-publishPermit","displayName":"permit-publishPermit","title":"permit-publishPermit","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-listPermitTemplates","description":"[Permit] Executes GET /api/permit-template","inputSchema":{"type":"object","required":[],"properties":{"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"permit-listPermitTemplates","displayName":"permit-listPermitTemplates","title":"permit-listPermitTemplates","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-listPermitCategories","description":"[Permit] Executes GET /api/permit-template/category","inputSchema":{"type":"object","required":[],"properties":{"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"permit-listPermitCategories","displayName":"permit-listPermitCategories","title":"permit-listPermitCategories","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-getPermitTemplateById","description":"[Permit] Executes GET /api/permit-template/{id}","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"permit-getPermitTemplateById","displayName":"permit-getPermitTemplateById","title":"permit-getPermitTemplateById","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gasMeter-getGasDeviceMonitoring","description":"[Gas Meter] Executes GET /api/gas-meter/{deviceId}/device-monitoring","inputSchema":{"type":"object","required":["deviceId"],"properties":{"to":{},"from":{},"minutes":{},"deviceId":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"gasMeter-getGasDeviceMonitoring","displayName":"gasMeter-getGasDeviceMonitoring","title":"gasMeter-getGasDeviceMonitoring","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gasDevice-getGasDevices","description":"[Gas Device] Executes GET /api/gas-devices","inputSchema":{"type":"object","required":["page","company_code"],"properties":{"page":{"type":"string"},"keyword":{"type":"string"},"connection":{"type":"string"},"company_code":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"gasDevice-getGasDevices","displayName":"gasDevice-getGasDevices","title":"gasDevice-getGasDevices","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gasDevice-getGasDeviceAlerts","description":"[Gas Device] Executes GET /api/gas-devices/alerts","inputSchema":{"type":"object","required":["page","from","to","device_id","event_type","sort_by","sort_type"],"properties":{"to":{"type":"string"},"from":{"type":"string"},"mode":{"type":"string"},"page":{"type":"string"},"keyword":{"type":"string"},"sort_by":{"type":"string"},"device_id":{"type":"string"},"sort_type":{"type":"string"},"event_type":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"gasDevice-getGasDeviceAlerts","displayName":"gasDevice-getGasDeviceAlerts","title":"gasDevice-getGasDeviceAlerts","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gasDevice-getGasDevice","description":"[Gas Device] Executes GET /api/gas-devices/{id}","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"gasDevice-getGasDevice","displayName":"gasDevice-getGasDevice","title":"gasDevice-getGasDevice","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"droneDetection-getAllMonitorVideos","description":"[Drone Detection] Retrieve list of monitor videos with filters for text search, pagination, and engines","inputSchema":{"type":"object","required":[],"properties":{"page":{"type":"number","default":1},"limit":{"type":"number","default":10},"status":{"enum":["thumbnail_generating","ai_processing","completed","failed"],"type":"string"},"sort_by":{"type":"string","default":"created_at"},"timezone":{"type":"string"},"period_to":{"type":"string"},"sort_order":{"enum":["ASC","DESC"],"type":"string","default":"DESC"},"period_from":{"type":"string"},"text_search":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"droneDetection-getAllMonitorVideos","displayName":"droneDetection-getAllMonitorVideos","title":"droneDetection-getAllMonitorVideos","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"droneDetection-getDetectionsByDrone","description":"[Drone Detection] Retrieves drone detections filtered by company_code and/or monitor_id (drone). company_code defaults to the authenticated user's company. Supports optional period and status filters. Executes as a single query via Monitor JOIN.","inputSchema":{"type":"object","required":[],"properties":{"name":{"type":"string"},"status":{"type":"string"},"approved":{"enum":["yes","no","rejected","expired"],"type":"string"},"timezone":{"type":"string","default":"Asia/Hong_Kong"},"period_to":{"type":"string"},"monitor_id":{"type":"string"},"period_from":{"type":"string"},"company_code":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"droneDetection-getDetectionsByDrone","displayName":"droneDetection-getDetectionsByDrone","title":"droneDetection-getDetectionsByDrone","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"droneDetection-getMonitorVideo","description":"[Drone Detection] Retrieve a specific monitor video by its monitor ID including monitor details and detection count","inputSchema":{"type":"object","required":["monitor_id"],"properties":{"monitor_id":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"droneDetection-getMonitorVideo","displayName":"droneDetection-getMonitorVideo","title":"droneDetection-getMonitorVideo","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-listPaymentPackages","description":"[CPECS] Triage view of payment-application packages for the active project (resolved from request context). Supports status / search / pagination. Read-only.","inputSchema":{"type":"object","required":[],"properties":{"page":{},"limit":{},"search":{},"status":{},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-listPaymentPackages","displayName":"cpecs-listPaymentPackages","title":"cpecs-listPaymentPackages","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-createPaymentPackage","description":"[CPECS] Create a package end-to-end in the active project (from request context): create → save cost-component groups → save line items → optionally publish. Confirm-gated in the agent runtime; the agent shows the draft for approval first.","inputSchema":{"type":"object","required":["basics"],"properties":{"basics":{"type":"object","required":["name","trade","periodStart","periodEnd"],"properties":{"name":{"type":"string"},"trade":{"enum":["FOUNDATIONS","E_AND_M","CURTAIN_WALL","LIFT_INSTALLATION","STEEL","CONCRETE","ALUMINIUM_WINDOW","FIRE_SERVICES","HVAC","PLUMBING","ELECTRICAL","DOORS_HARDWARE","OTHER"],"type":"string"},"budget":{"type":"number"},"periodEnd":{"type":"string"},"periodStart":{"type":"string"}}},"groups":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"ordinal":{"type":"number"}}}},"publish":{"type":"boolean"},"lineItems":{"type":"array","items":{"type":"object"}},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-createPaymentPackage","displayName":"cpecs-createPaymentPackage","title":"cpecs-createPaymentPackage","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-getPackageOverview","description":"[CPECS] Single rich read for a package: KPIs, grouped totals, duplicate flags and status. Replaces the multi-call fan-out the UI does.","inputSchema":{"type":"object","required":["packageId"],"properties":{"packageId":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-getPackageOverview","displayName":"cpecs-getPackageOverview","title":"cpecs-getPackageOverview","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-getPackageCostStructure","description":"[CPECS] Cost-component groups joined with their line items — \"what is this package made of?\". Grounds mapping & over-claim checks.","inputSchema":{"type":"object","required":["packageId"],"properties":{"packageId":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-getPackageCostStructure","displayName":"cpecs-getPackageCostStructure","title":"cpecs-getPackageCostStructure","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-listPackagePaymentApps","description":"[CPECS] All payment applications (bids) submitted under a package and their workflow state — feeds vetting selection.","inputSchema":{"type":"object","required":["packageId"],"properties":{"packageId":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-listPackagePaymentApps","displayName":"cpecs-listPackagePaymentApps","title":"cpecs-listPackagePaymentApps","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-getPaymentAppReviewBundle","description":"[CPECS] Core vetting read. One call returns the full payment app (header + items by bucket + totals), prior-cert cross-check deltas, and the audit trail.","inputSchema":{"type":"object","required":["bidId"],"properties":{"bidId":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-getPaymentAppReviewBundle","displayName":"cpecs-getPaymentAppReviewBundle","title":"cpecs-getPaymentAppReviewBundle","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-getItemEvidence","description":"[CPECS] Prior-period diff, change history and the note thread for one item — used to justify a reject. Lazy-loaded so the review bundle stays lean.","inputSchema":{"type":"object","required":["bidId","itemId"],"properties":{"bidId":{"type":"string"},"itemId":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-getItemEvidence","displayName":"cpecs-getItemEvidence","title":"cpecs-getItemEvidence","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-benchmarkLineItems","description":"[CPECS] The agent's pricing evidence. Batch-compares the supplied line items (pass them from get_payment_app_review_bundle) against the Rate DB and returns, per item, the matched band (p25/median/p75), Δ vs median %, escalation flag and a no_match marker.","inputSchema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["description"],"properties":{"id":{"type":"string"},"rate":{"type":"number"},"unit":{"type":"string"}}}},"compare_q":{"type":"number"},"auto_adjust":{"type":"boolean"},"compare_year":{"type":"number"},"inflation_pct":{"type":"number"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-benchmarkLineItems","displayName":"cpecs-benchmarkLineItems","title":"cpecs-benchmarkLineItems","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-searchRateDb","description":"[CPECS] Free-text / filtered similarity search of the Rate Database — ad-hoc \"find me rates for X\" and grounding for the wizard.","inputSchema":{"type":"object","required":["q"],"properties":{"q":{"type":"string"},"unit":{},"limit":{},"trade":{},"section":{},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-searchRateDb","displayName":"cpecs-searchRateDb","title":"cpecs-searchRateDb","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-getRateBenchmark","description":"[CPECS] Single-item benchmark with optional time-escalation — \"is this unit rate fair vs market?\" for one description.","inputSchema":{"type":"object","required":["item_description"],"properties":{"ai":{},"to_q":{},"unit":{},"trade":{},"from_q":{},"to_year":{},"from_year":{},"x_project_id_x":{"type":"string"},"item_description":{}},"additionalProperties":false},"logicalName":"cpecs-getRateBenchmark","displayName":"cpecs-getRateBenchmark","title":"cpecs-getRateBenchmark","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-listSoccCatalogue","description":"[CPECS] Valid SoCC (Standard of Cost Components) codes for the active project (from request context) — grounding so SoCC mappings use real codes, not hallucinated ones. Read-only.","inputSchema":{"type":"object","required":[],"properties":{"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-listSoccCatalogue","displayName":"cpecs-listSoccCatalogue","title":"cpecs-listSoccCatalogue","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-classifyItem","description":"[CPECS] All reversible edits to one invoice line, behind an action discriminator: \"assess\" (accept), \"map_socc\" (set SoCC code), \"quick_add\" (create + map a cost-component line), or \"note\" (append a note). Returns the refreshed payment app.","inputSchema":{"type":"object","required":["bidId","itemId","action"],"properties":{"bidId":{"type":"string"},"action":{"enum":["assess","map_socc","quick_add","note"],"type":"string"},"itemId":{"type":"string"},"noteKind":{"type":"string"},"noteText":{"type":"string"},"groupName":{"type":"string"},"soccItemNo":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-classifyItem","displayName":"cpecs-classifyItem","title":"cpecs-classifyItem","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-rejectItem","description":"[CPECS] Reject a line with a required reason (lands in the note thread + audit). mode=\"disallow\" strikes it; mode=\"return\" sends it back for backup. Confirm-gated in the agent runtime.","inputSchema":{"type":"object","required":["bidId","itemId","mode","reason"],"properties":{"mode":{"enum":["disallow","return"],"type":"string"},"bidId":{"type":"string"},"itemId":{"type":"string"},"reason":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-rejectItem","displayName":"cpecs-rejectItem","title":"cpecs-rejectItem","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-setReviewState","description":"[CPECS] Toggle the application review state. state=\"reviewed\" promotes it (precondition: no items left unmapped/unassessed); state=\"in_review\" reopens it. Returns the refreshed payment app.","inputSchema":{"type":"object","required":["bidId","state"],"properties":{"bidId":{"type":"string"},"state":{"enum":["reviewed","in_review"],"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-setReviewState","displayName":"cpecs-setReviewState","title":"cpecs-setReviewState","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-certifyPaymentApp","description":"[CPECS] Certify the payment application — the money-moving final step. Irreversible. The agent must present the certify total + disallowed summary and obtain explicit human approval before calling this.","inputSchema":{"type":"object","required":["bidId"],"properties":{"bidId":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-certifyPaymentApp","displayName":"cpecs-certifyPaymentApp","title":"cpecs-certifyPaymentApp","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-startSpecExtraction","description":"[CPECS] Enqueue an extraction job for a spec PDF already uploaded to S3 (presigned). Returns a job view; poll get_spec_extraction_status until done. Produces a DRAFT only — nothing is persisted to a package.","inputSchema":{"type":"object","required":["s3Url"],"properties":{"s3Url":{"type":"string"},"fileName":{"type":"string"},"mimeType":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-startSpecExtraction","displayName":"cpecs-startSpecExtraction","title":"cpecs-startSpecExtraction","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"cpecs-getSpecExtractionStatus","description":"[CPECS] Returns the status and (when done) the extracted draft line items for a job started by start_spec_extraction.","inputSchema":{"type":"object","required":["jobId"],"properties":{"jobId":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"cpecs-getSpecExtractionStatus","displayName":"cpecs-getSpecExtractionStatus","title":"cpecs-getSpecExtractionStatus","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"workflow-createWorkflow","description":"[Workflow] Creates a workflow owned by the authenticated user and scoped to their company. Intended for the chatbot-service workflow_builder agent via the FastMCP whitelist: pass a natural-language name plus the graph `blocks`/`connections` (kind=\"graph\", the default) to persist a draft. Stable operationId \"createWorkflow\" — do not rename (the MCP tool name derives from it).","inputSchema":{"type":"object","required":[],"properties":{"icon":{"type":"string","example":"⚡"},"kind":{"enum":["template","option","prompt","graph"],"type":"string","example":"graph"},"name":{"type":"string","example":"Detection spike → Slack alert"},"blocks":{"type":"array","items":{"type":"object"}},"option":{"enum":["approval","schedule","automate"],"type":"string","example":"approval"},"prompt":{"type":"string","example":"Alert me when a detection spike happens and send it to Slack"},"enabled":{"type":"boolean","example":false},"graphJson":{"type":"string","example":"{\"blocks\":[{\"id\":\"t\",\"type\":\"appevent\",\"label\":\"Detection spike\",\"settings\":{\"companyCode\":\"FLN04\",\"operationId\":\"DetectionController_getAll\"}},{\"id\":\"n\",\"type\":\"notify\",\"label\":\"Email me\",\"settings\":{\"channels\":\"Email\",\"emailTo\":\"me@site.com\",\"message\":\"Detections spiked.\"}},{\"id\":\"e\",\"type\":\"end\"}],\"connections\":[{\"source\":\"t\",\"target\":\"n\"},{\"source\":\"n\",\"target\":\"e\"}]}"},"templateId":{"type":"string","example":"wfb_tpl_rfi"},"connections":{"type":"array","items":{"type":"object"}},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"workflow-createWorkflow","displayName":"workflow-createWorkflow","title":"workflow-createWorkflow","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"workflow-getWorkflow","description":"[Workflow] Returns one workflow owned by the caller within their company, so the agent can read back what it just created (id, name, graph, enabled). A workflow belonging to another owner/company resolves to 404 (no leak). Stable operationId \"getWorkflow\" — do not rename.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"workflow-getWorkflow","displayName":"workflow-getWorkflow","title":"workflow-getWorkflow","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"workflow-updateWorkflow","description":"[Workflow] Saves changes to a workflow the caller owns within their company: pass the graph `blocks`/`connections` and/or metadata (name/icon) to persist the agent's edits (edit-with-AI). Only the fields present are applied. Prefer the dedicated publishWorkflow tool to go live — setting `enabled: true` here also runs the enable-gate and may 409. A workflow owned by another owner/company resolves to 404 (no leak). Stable operationId \"updateWorkflow\" — do not rename (the MCP tool name derives from","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"icon":{"type":"string","example":"⚡"},"name":{"type":"string","example":"Detection spike → Slack alert"},"blocks":{"type":"array","items":{"type":"object"}},"enabled":{"type":"boolean","example":true},"graphJson":{"type":"string"},"connections":{"type":"array","items":{"type":"object"}},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"workflow-updateWorkflow","displayName":"workflow-updateWorkflow","title":"workflow-updateWorkflow","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"workflow-publishWorkflow","description":"[Workflow] Makes a workflow the caller owns LIVE by enabling it — the agent-tool counterpart of the builder enable toggle, called after the user confirms publish (the wizard's second-confirm gate). Runs the enable-gate: if any REAL connector step is still unbound the call is refused with 409 Conflict carrying the `unbound` list, so the agent can ask the user to connect them first. Idempotent for an already-enabled workflow. A workflow owned by another owner/company resolves to 404. Stable operat","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"workflow-publishWorkflow","displayName":"workflow-publishWorkflow","title":"workflow-publishWorkflow","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"workflow-listTemplates","description":"[Workflow] Returns the workflow template catalog the agent can offer the user to instantiate (createWorkflow with kind=\"template\"). Mirrors the permit blueprint's listPermitTemplates. The catalog is shared static data (construction gallery + ECMP use-case templates) ported in M05; the envelope shape { data, total } is stable now. Stable operationId \"listTemplates\" — do not rename.","inputSchema":{"type":"object","required":[],"properties":{"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"workflow-listTemplates","displayName":"workflow-listTemplates","title":"workflow-listTemplates","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"workflow-previewWorkflow","description":"[Workflow] Stateless dry-run: walks the graph supplied in the body from every trigger and returns the ordered steps a real run WOULD take, each with a human-readable detail line. Zero side effects — nothing is persisted, sent, or dispatched to ECMP; a cyclic graph is capped and flagged truncated. The agent uses it to describe/validate a draft before publish. Stable operationId \"previewWorkflow\" — do not rename.","inputSchema":{"type":"object","required":[],"properties":{"blocks":{"type":"array","items":{"type":"object"}},"graphJson":{"type":"string"},"connections":{"type":"array","items":{"type":"object"}},"x_project_id_x":{"type":"string"}},"additionalProperties":false},"logicalName":"workflow-previewWorkflow","displayName":"workflow-previewWorkflow","title":"workflow-previewWorkflow","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"smartWatch-getSmartWatches","description":"[Smart Watch] Returns all smart watch devices belonging to the authenticated user's company. Super admins can query other companies via the company_code param. Each device includes real-time health metrics, location, connection status, and group membership. Health fields (heart_rate, temperature, etc.) are set to null when data is stale (older than health_event_timeout minutes).","inputSchema":{"type":"object","required":[],"properties":{"group_ids":{},"location_id":{},"text_search":{},"company_code":{}},"additionalProperties":false},"logicalName":"smartWatch-getSmartWatches","displayName":"smartWatch-getSmartWatches","title":"smartWatch-getSmartWatches","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"smartWatch-getSmartWatchDeviceMonitoring","description":"[Smart Watch] Returns time-series monitoring data for a specific smart watch device. Provides highest, lowest, and average values plus grouped data points for: temperature, heart_rate, battery, rssi, and step_count. The \"minutes\" param controls the time bucket granularity for data grouping.","inputSchema":{"type":"object","required":[],"properties":{"id":{},"to":{},"from":{},"minutes":{}},"additionalProperties":false},"logicalName":"smartWatch-getSmartWatchDeviceMonitoring","displayName":"smartWatch-getSmartWatchDeviceMonitoring","title":"smartWatch-getSmartWatchDeviceMonitoring","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"smartWatch-getSmartWatchAlertEventStats","description":"[Smart Watch] Returns aggregated alert event counts grouped by date or hour. Each row contains counts for each alert type (high_temperature, low_battery, sos, fall, etc.). The timezone param controls the date grouping. Companies with code \"YOFS\" get additional alert type columns (watch_off, helmet_off, clock_in, health_abnormal, area_in, geo_fence).","inputSchema":{"type":"object","required":[],"properties":{"to":{},"from":{},"timezone":{},"company_code":{}},"additionalProperties":false},"logicalName":"smartWatch-getSmartWatchAlertEventStats","displayName":"smartWatch-getSmartWatchAlertEventStats","title":"smartWatch-getSmartWatchAlertEventStats","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"smartWatch-getSmartWatchAlertEvents","description":"[Smart Watch] Returns a list of alert events for the authenticated user's company. Each event includes the device serial number, resolved device name, alert types triggered, timestamps, and location. Supports filtering by date range, timezone, and text search (matches device ID or name).","inputSchema":{"type":"object","required":[],"properties":{"to":{"type":"string","format":"date-time"},"from":{"type":"string","format":"date-time"},"timezone":{"type":"string"},"event_types":{"type":"string"},"text_search":{"type":"string"},"company_code":{"type":"string"}},"additionalProperties":false},"logicalName":"smartWatch-getSmartWatchAlertEvents","displayName":"smartWatch-getSmartWatchAlertEvents","title":"smartWatch-getSmartWatchAlertEvents","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"smartWatch-getSmartWatchAlertEvent","description":"[Smart Watch] Returns detailed information for a specific alert event, including the full smart watch device info, previous known GPS location before the alert, event types, and timestamps.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"smartWatch-getSmartWatchAlertEvent","displayName":"smartWatch-getSmartWatchAlertEvent","title":"smartWatch-getSmartWatchAlertEvent","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gasMeter-getGasMeterSensorStats","description":"[Gas Meter] Returns time-bucketed counts of gas sensor threshold breach events grouped by gas type and operator. Each bucket contains counts for H2S, CO, O2 (both high and low), LEL, CH2O, humidity, and PM2.5 breaches. Empty time buckets are filled with zero counts to produce a continuous chart series. Dates are processed in UTC.","inputSchema":{"type":"object","required":["from","to","group_by"],"properties":{"to":{"type":"string"},"from":{"type":"string"},"group_by":{"enum":["hour","day"],"type":"string"},"timezone":{"type":"string"}},"additionalProperties":false},"logicalName":"gasMeter-getGasMeterSensorStats","displayName":"gasMeter-getGasMeterSensorStats","title":"gasMeter-getGasMeterSensorStats","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gasMeter-getGasMeterAlerts","description":"[Gas Meter] Returns a paginated list of gas device alerts within a date range. Supports filtering by device ID, event type, and keyword search (matches device name or serial number). Results can be sorted by creation date, device name, or device serial number. Each alert includes the sensor readings at the time of the breach, device info with location, and Telegram notification status.","inputSchema":{"type":"object","required":["page","limit","from","to"],"properties":{"to":{"type":"string"},"from":{"type":"string"},"page":{"type":"string"},"limit":{"type":"string"},"keyword":{"type":"string"},"sort_by":{"enum":["created_at","device_name","device_serial_number"],"type":"string"},"device_id":{"type":"string"},"sort_type":{"enum":["DESC","ASC"],"type":"string"},"event_type":{"type":"string"}},"additionalProperties":false},"logicalName":"gasMeter-getGasMeterAlerts","displayName":"gasMeter-getGasMeterAlerts","title":"gasMeter-getGasMeterAlerts","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"gasMeter-getGasMeterAlert","description":"[Gas Meter] Returns detailed information for a specific gas device alert, including sensor readings, device info with connection status and location, and Telegram notification status.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"gasMeter-getGasMeterAlert","displayName":"gasMeter-getGasMeterAlert","title":"gasMeter-getGasMeterAlert","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-analyzePermit","description":"[Permit] Analyze a permit draft and return completion percentage, status, and critical missing items.","inputSchema":{"type":"object","required":["permit_id"],"properties":{"permit_id":{"type":"string"}},"additionalProperties":false},"logicalName":"permit-analyzePermit","displayName":"permit-analyzePermit","title":"permit-analyzePermit","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"permit-assignPermitUsersByEmail","description":"[Permit] Resolve user emails via UMS and assign them to a permit draft in one step. Pass the permit draft ID and separate lists of emails per role. Emails not found in UMS are skipped silently. Use approver_emails, receiver_emails, viewer_emails — all optional, default empty.","inputSchema":{"type":"object","required":["permit_id"],"properties":{"permit_id":{"type":"string"},"viewer_emails":{"type":"array","items":{"type":"string"},"default":[]},"revoker_emails":{"type":"array","items":{"type":"string"},"default":[]},"approver_emails":{"type":"array","items":{"type":"string"},"default":[]},"receiver_emails":{"type":"array","items":{"type":"string"},"default":[]}},"additionalProperties":false},"logicalName":"permit-assignPermitUsersByEmail","displayName":"permit-assignPermitUsersByEmail","title":"permit-assignPermitUsersByEmail","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"mobileCapture-getReport","description":"[Mobile Capture] Fetch mobile captures with their linked tasks and comments in a single call. Each capture includes: id, title, description, datetime, medias[] (with url/name/type), lat/lng/accuracy, and a task object (priority, status, assignees, attachments, comments) or null. Use this as the primary tool for any report or summary request. Filter by date range using from_date and to_date (ISO 8601).","inputSchema":{"type":"object","properties":{"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"company_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"additionalProperties":false},"logicalName":"mobileCapture-getReport","displayName":"mobileCapture-getReport","title":"mobileCapture-getReport","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"mobileCapture-getList","description":"[Mobile Capture] List mobile capture records (paginated). Lighter than mobileCapture-getReport: returns raw captures (id, title, description, photo/video/audio url, lat/lng/accuracy, task_id, created_at) WITHOUT joined tasks/comments. Use this to browse, count, or search site photos. Supports pagination, text search, ordering, and a created-at date range. For a full report with linked tasks, use mobileCapture-getReport.","inputSchema":{"type":"object","properties":{"page":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null},"limit":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null},"search":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"to_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"order_by":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"from_date":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"company_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"order_direction":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"additionalProperties":false},"logicalName":"mobileCapture-getList","displayName":"mobileCapture-getList","title":"mobileCapture-getList","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"mobileCapture-getCapture","description":"[Mobile Capture] Fetch a single mobile capture record by its id. Returns the full capture detail (medias, lat/lng/accuracy, title, description, task_id, created_at). Use after mobileCapture-getList or mobileCapture-getReport to drill into one capture. Note: scoped to captures created by the current user.","inputSchema":{"type":"object","required":["capture_id"],"properties":{"capture_id":{"type":"string"},"company_code":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"additionalProperties":false},"logicalName":"mobileCapture-getCapture","displayName":"mobileCapture-getCapture","title":"mobileCapture-getCapture","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"mobileCapture-analyzeMedia","description":"[Mobile Capture] Analyze the actual content of images, videos, and audio in mobile captures. Pass the captures list (or a subset) returned by mobileCapture-getReport — each item must have 'id' and 'medias' fields. Returns AI-generated image captions, audio transcripts, and video descriptions per annotation. Call this after mobileCapture-getReport when the user wants a detailed site analysis report. For performance, pass only the captures that will appear in the detailed issue section (high-prior","inputSchema":{"type":"object","required":["captures"],"properties":{"captures":{"type":"array","items":{"type":"object","additionalProperties":true}}},"additionalProperties":false},"logicalName":"mobileCapture-analyzeMedia","displayName":"mobileCapture-analyzeMedia","title":"mobileCapture-analyzeMedia","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"task-listTasks","description":"[Task] List tasks for the current project. Supports filtering by source_id (mobile capture ID), status, trend_type, assignees, board_id, and labels. Returns task list with comment/attachment counts.","inputSchema":{"type":"object","properties":{"page":{"type":"integer","default":1},"limit":{"type":"integer","default":20},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"source_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"trend_type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"additionalProperties":false},"logicalName":"task-listTasks","displayName":"task-listTasks","title":"task-listTasks","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"task-getTask","description":"[Task] Get full details of a task by ID, including attachments (file_url, file_name, ext), assignees, priority, status, and due date.","inputSchema":{"type":"object","required":["task_id"],"properties":{"task_id":{"type":"string"}},"additionalProperties":false},"logicalName":"task-getTask","displayName":"task-getTask","title":"task-getTask","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"task-getTaskComments","description":"[Task] Get comments for a task. Returns comment content, author info, and timestamps.","inputSchema":{"type":"object","required":["task_id"],"properties":{"page":{"type":"integer","default":1},"limit":{"type":"integer","default":50},"task_id":{"type":"string"}},"additionalProperties":false},"logicalName":"task-getTaskComments","displayName":"task-getTaskComments","title":"task-getTaskComments","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"task-getTasksBatch","description":"[Task] Fetch full details for multiple tasks in parallel by their IDs. Use this instead of calling task-getTask repeatedly to avoid N+1 requests. Returns a list of {task_id, data} on success or {task_id, error} on failure per task.","inputSchema":{"type":"object","required":["task_ids"],"properties":{"task_ids":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"logicalName":"task-getTasksBatch","displayName":"task-getTasksBatch","title":"task-getTasksBatch","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"stats-getAlertDistributionsByCamera","description":"[Stats] Top cameras by total detection/alert count — answers 'which camera has the most detections/alerts'. Returns `cameras` as a token-light `[{camera, count}]` list sorted by count descending (top `limit`, default 5); the raw per-engine breakdown and engineDetails metadata are intentionally dropped. Pass `timezone` (the user's current timezone) for accurate day bucketing. Use `days` for the look-back window (default 7).","inputSchema":{"type":"object","properties":{"days":{"type":"integer","default":7},"limit":{"type":"integer","default":5},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null}},"additionalProperties":false},"logicalName":"stats-getAlertDistributionsByCamera","displayName":"stats-getAlertDistributionsByCamera","title":"stats-getAlertDistributionsByCamera","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"stats-getSiteSummary","description":"[Stats] Cross-module site summary as COUNTS ONLY (no raw rows). Returns alert counts per module (camera/detection, smartwatch, gas, smart lock) plus permit metrics (total, expired, expiring within 24h), task metrics (total, high-priority still open, overdue) and mobile-capture count for the last `days` days; `detection_by_type` (alert counts by type, e.g. danger zone, no helmet); `top_alerts` (top alert types/sources by count, for a high-detection highlight); `top_cameras` (which cameras have th","inputSchema":{"type":"object","properties":{"days":{"type":"integer","default":7},"modules":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"default":null},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null},"include_urgent":{"type":"boolean","default":true}},"additionalProperties":false},"logicalName":"stats-getSiteSummary","displayName":"stats-getSiteSummary","title":"stats-getSiteSummary","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=viAct---AI-Monitoring-That-Redefines-Workplace-Safety&config=eyJ1cmwiOiAiaHR0cHM6Ly9tY3AudmlhY3QuYWkvbWNwIn0%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22viAct---AI-Monitoring-That-Redefines-Workplace-Safety%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.viact.ai%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22viAct---AI-Monitoring-That-Redefines-Workplace-Safety%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.viact.ai%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=viAct+-+AI+Monitoring+That+Redefines+Workplace+Safety&connectorUrl=https%3A%2F%2Fmcp.viact.ai%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"viAct---AI-Monitoring-That-Redefines-Workplace-Safety\" --url \"https://mcp.viact.ai/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/viact-mcp-28be29ae5d","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/viact-mcp-28be29ae5d/tools/{tool}","mcpServerUrl":"https://mcp.viact.ai/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/viact-mcp-28be29ae5d?live=1"}