{"schemaVersion":"1.0","name":"DockOptimizer","description":"Dock scheduling, facility operations, and freight management platform. Exposes appointment/door/carrier/inventory resources for read access plus HITL-gated write tools through MCP JSON-RPC, with a read-only REST wrapper under /api/v1 for partner TMS/ERP integrations.","version":"1.0.0","auth":{"type":"bearer","header":"Authorization","scheme":"Bearer","tokenPrefix":"do_live_","description":"Generate an API key from Integration Hub → Agent Keys (tenant-scoped) or the super-admin Agent Keys console (platform-scoped). Send it as 'Authorization: Bearer do_live_...'."},"keyTypes":[{"name":"tenant","description":"Per-organization key. Reads and writes are scoped to the org the key was minted in. Required for any /api/v1/* call and for MCP tools/call.","scopesAllowed":["read","read,write","read,write,inventory"],"surfaces":["/api/mcp/v1/message","/api/mcp/v1/files/{eventId}","/api/v1/*"]},{"name":"platform","description":"Cross-tenant read-only key for platform-wide digests and admin-help agents. Anchored to a placeholder CompanyId; only sees dock://platform/* resources.","scopesAllowed":["read"],"surfaces":["/api/mcp/v1/message (resources/list, resources/read on dock://platform/* only)"],"restrictions":["tools/list returns an empty list","tools/call is rejected with 403 (SCOPE_DENIED)","upload_file is rejected with 403","/api/v1/* returns 403 (TenantKeyOnly filter)"]}],"environmentTagging":{"field":"environment","values":["staging","production","(unset)"],"enforcement":"auth filter compares the key's tag against the server's env on every request; mismatch = 401","note":"Platform keys are always tagged (enforced at generation). Tenant keys may leave the tag blank for legacy compatibility."},"surfaces":[{"name":"MCP JSON-RPC","endpoint":"/api/mcp/v1/message","method":"POST","contentType":"application/json","envelope":"JSON-RPC 2.0","methods":["tools/list","tools/call","resources/list","resources/read"],"description":"Primary agent surface. Writes flow through tools/call with auto-confirm or HITL semantics."},{"name":"File upload","endpoint":"/api/mcp/v1/files/{eventId}","method":"POST","contentType":"multipart/form-data","description":"Attach a file (BOL, photo, PDF) to an appointment. Tenant keys with write scope only. Platform keys are rejected."},{"name":"REST wrapper","endpoint":"/api/v1/*","method":"GET","contentType":"application/json","description":"Read-only plain JSON. Ideal for Integration Hub connectors and partner TMS/ERP systems. Tenant keys only; platform keys get 403. For writes, use MCP tools/call.","reference":"/docs/REST_API_REFERENCE.md"}],"endpoint":"/api/mcp/v1/message","documentation":"/api/docs","rateLimits":{"perMinute":60,"perDay":1000,"dailyResetUtc":"00:00","writeRateLimitPerKey":"optional, configured per key"},"scopes":[{"name":"read","description":"resources/read. Discovery (tools/list, resources/list) is always allowed regardless of scope."},{"name":"write","description":"tools/call for auto-confirm and HITL tools, plus /api/mcp/v1/files/{eventId}. Implies read."},{"name":"inventory","description":"Gates the inventory tools (receive_inventory, issue_inventory, adjust_inventory). Must be combined with write, e.g. \"read,write,inventory\"."}],"resources":[{"uri":"dock://appointments","name":"Appointments","description":"Query appointments with filters. Supports: ?start=YYYY-MM-DD&end=YYYY-MM-DD&date=YYYY-MM-DD&status=scheduled|checked_in|checked_out|canceled|flagged|no_show&flagged=true|false&facilityId=19&carrier=FEDEX&search=BOL-12345&hasFiles=true|false&limit=50&offset=0&sort=startTime|status|carrier","mimeType":"application/json"},{"uri":"dock://appointments/{id}","name":"Appointment Detail","description":"Get full details for a single appointment including uploaded files, question answers, door assignment, and flag status. Replace {id} with the appointment ID.","mimeType":"application/json"},{"uri":"dock://appointments/{id}/ocr_output","name":"Appointment OCR Output","description":"Get OCR-extracted data from uploaded documents for an appointment. Returns extracted fields, confidence scores, and raw text when OCR processing is enabled.","mimeType":"application/json"},{"uri":"dock://appointments/{id}/files","name":"Appointment Files","description":"Get all files attached to an appointment (BOLs, photos, etc.) with name, type, size, and upload info.","mimeType":"application/json"},{"uri":"dock://carrier-data-quality","name":"Carrier Data Quality","description":"Read-only carrier data-quality report (DQ epic #476): identity health score, BOL paperwork completeness, and carrier-identity issues — invalid MC#, unverified/duplicate carrier records, customer-or-broker in the carrier field, and missing carrier — with the flagged appointment IDs for each appointment-level rule so an agent can review them. Optional ?days=30|90|365 (default 365). Reporting-only; make changes in the app or via HITL-gated tools.","mimeType":"application/json"},{"uri":"dock://doors/status","name":"Facility Door Status","description":"Get all doors with computed status (available/occupied/blocked), current booking, next appointment time, sensor state, and facility debug info.","mimeType":"application/json"},{"uri":"dock://door-availability","name":"Door Availability","description":"Get available door time slots for a facility on a given date. Requires: ?facilityId=19&date=YYYY-MM-DD. Returns open slots >= 30 minutes.","mimeType":"application/json"},{"uri":"dock://operations/today","name":"Operations Dashboard","description":"Today's operations summary per facility: appointments (checked in/out, pending, no-shows, late, flagged), door availability. Supports ?date=YYYY-MM-DD.","mimeType":"application/json"},{"uri":"dock://carriers","name":"Carrier List","description":"List all active carriers with FMCSA data (MC#, DOT#, operating status), contact info, and appointment counts.","mimeType":"application/json"},{"uri":"dock://event-types","name":"Appointment Types","description":"List all appointment types (event types) configured for this organization, including duration, facility, and category info.","mimeType":"application/json"},{"uri":"dock://users","name":"Users & Login Activity","description":"List all users in the organization with their recent login activity (last 5 logins per user).","mimeType":"application/json"},{"uri":"dock://reports","name":"Scheduled Reports","description":"List all scheduled email reports with their configuration, frequency, and last run status.","mimeType":"application/json"},{"uri":"dock://organization","name":"Organization Metadata","description":"Organization info including name, address, facilities, door counts, and configuration.","mimeType":"application/json"},{"uri":"dock://facilities","name":"Facilities","description":"All facilities with per-facility door list, timezone, address details, sensor config, and door counts.","mimeType":"application/json"},{"uri":"dock://doors/config","name":"Door Configuration","description":"Full door registry: sensor IDs, auto-block settings, active/inactive status, facility assignment, and last sensor state.","mimeType":"application/json"},{"uri":"dock://doors/history","name":"Door Booking History","description":"Historical door bookings with dwell time, carrier/truck info, and utilization data. Supports: ?doorId=X&facilityId=Y&start=YYYY-MM-DD&end=YYYY-MM-DD&limit=100","mimeType":"application/json"},{"uri":"dock://categories","name":"Appointment Categories","description":"Appointment categories with door restrictions, check-in/checkout question configuration, and linked event type counts.","mimeType":"application/json"},{"uri":"dock://appointments/{id}/notes","name":"Appointment Notes","description":"Timestamped free-text notes on an appointment. Replace {id} with the appointment ID.","mimeType":"application/json"},{"uri":"dock://inventory/summary","name":"Inventory Summary","description":"Stock health overview: total items, quantities, low-stock alerts, quarantined items, expiring items, category breakdown, and recent transactions.","mimeType":"application/json"},{"uri":"dock://inventory/items","name":"Inventory Items","description":"List inventory items with filters. Supports: ?search=keyword&category=X&facilityId=N&lowStockOnly=true&owner=Kobelco&limit=50&offset=0. IMPORTANT: 'search' also matches owner name. Use 'owner' to filter by inventory owner (e.g., customer/organization name like 'Kobelco').","mimeType":"application/json"},{"uri":"dock://assets","name":"Assets","description":"List fixed assets (equipment, machinery). Supports: ?search=keyword&category=X&status=Active|Retired|InRepair","mimeType":"application/json"},{"uri":"dock://doors/available","name":"Door Availability by Facility","description":"Available door time slots grouped by facility. Required: ?date=YYYY-MM-DD. Optional: &facilityId=X (omit for all facilities). Returns 30-min+ open slots per door.","mimeType":"application/json"},{"uri":"dock://slots/available","name":"Slot Availability","description":"Real-time slot availability per appointment type and facility. Required: ?date=YYYY-MM-DD. Optional: &facilityId=X. Returns available/total count per time window per appointment type.","mimeType":"application/json"},{"uri":"dock://pending-appointments","name":"Pending Appointments","description":"Appointment proposals awaiting confirmation. Shows pending propose_appointment actions with requested time, facility, and reference.","mimeType":"application/json"},{"uri":"dock://carriers/search","name":"Carrier Search","description":"Fuzzy carrier search by name or MC number. Optional: ?name=X&mc=Y. Returns top 25 matches with contact info.","mimeType":"application/json"},{"uri":"dock://appointments/stale","name":"Stale Appointments","description":"Appointments that are past their scheduled time but still in 'scheduled' status (never checked in). Optional: ?facilityId=X&limit=N.","mimeType":"application/json"},{"uri":"dock://data-quality/summary","name":"Data Quality Summary","description":"Org-wide data health metrics: missing carriers, missing references, stale appointments, duplicate carriers, unused appointment types. Includes a health score.","mimeType":"application/json"},{"uri":"dock://appointments/check","name":"Appointment Conflict Check","description":"Check for existing appointments at a facility on a date. Required: ?date=YYYY-MM-DD&facilityId=X. Optional: &carrierName=Y to filter by carrier.","mimeType":"application/json"}],"platformResources":[{"uri":"dock://platform/organizations","name":"Organizations","description":"All organizations on the platform: name, email, isActive, orgType, user count, facility count. No per-user or per-appointment detail.","mimeType":"application/json"},{"uri":"dock://platform/usage-summary","name":"Usage Summary (by org)","description":"Per-org activity rollup: appointments created/completed/flagged, distinct active users, MCP call total + errors. Supports ?windowDays=7 (max 90).","mimeType":"application/json"},{"uri":"dock://platform/recent-incidents","name":"Recent Incidents","description":"Merged feed of platform-health non-operational pings, flagged appointments, and integration failures. Supports ?windowHours=24 (max 168).","mimeType":"application/json"},{"uri":"dock://platform/integration-health","name":"Integration Health","description":"Every IntegrationConnector across orgs with provider, last sync, poll interval, and 7-day error count + last error message.","mimeType":"application/json"},{"uri":"dock://platform/agent-keys","name":"Agent Key Registry","description":"Cross-tenant MCP key inventory: orgId, agentName, scopes, environment, isPlatformScope, isRevoked, expiresAt, lastUsed, call counts. Critical for rotating stale or leaked keys.","mimeType":"application/json"},{"uri":"dock://platform/admin-audit-log","name":"Admin Audit Log","description":"Recent SuperAdmin actions across the platform (DeleteFacility, ChangeOrgType, LinkCarrier, AddTrial / ExtendTrial / CloseTrial / ConvertTrial / ResetTrial, DisableModule, contract upload/download, etc.). Supports ?limit=100 (max 500). Returns actor, action, target, reason — BeforeJson/AfterJson omitted to keep payload tight.","mimeType":"application/json"},{"uri":"dock://platform/trials","name":"Trials (cross-tenant)","description":"All active and recently-expired trials across the platform — both Company-level (Company.TrialStatus) and feature/facility level (Subscription rows with trial_* pseudo-ids).","mimeType":"application/json"},{"uri":"dock://platform/subscriptions","name":"Subscriptions (cross-tenant)","description":"Paid Subscription rows by status. Supports ?status=active|past_due|canceled|refunded|pending (default: active). Surfaces hasStripeLink so a CX agent can spot legacy / manually-created rows. Excludes trial_* pseudo-subs (those are in dock://platform/trials).","mimeType":"application/json"},{"uri":"dock://platform/enterprise-contracts","name":"Enterprise Contracts","description":"Roster of every IsEnterprise=true org with their EnterpriseContract row (dates, annual value, renewal date, auto-renew, status) plus whether a contract document is attached. Free-text Terms and the blob path are omitted.","mimeType":"application/json"}],"tools":[{"name":"propose_block_door","description":"Propose marking a specific facility door as blocked or full load. Requires Human approval.","inputSchema":{"type":"object","properties":{"doorId":{"type":"integer","description":"The ID of the door to block"},"reason":{"type":"string","description":"Reason for blocking the door"},"isFullLoad":{"type":"boolean","description":"Whether the door is full load"}},"required":["doorId"]},"annotations":{"title":"Block door (HITL)","readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}},{"name":"propose_update_appointment","description":"Propose updating appointment fields such as carrier name, PO number, driver contact info, or notes. Requires Human approval.","inputSchema":{"type":"object","properties":{"appointmentId":{"type":"integer","description":"The appointment ID to update"},"carrierName":{"type":"string","description":"Carrier / trucking company name"},"poNumber":{"type":"string","description":"PO number or reference number"},"driverCheckInEmail":{"type":"string","description":"Driver's email address"},"driverCheckInPhone":{"type":"string","description":"Driver's phone number"},"notes":{"type":"string","description":"Additional notes to append"}},"required":["appointmentId"]},"annotations":{"title":"Update appointment (HITL)","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"propose_flag_appointment","description":"Flag an appointment for human review. Use when data quality issues are detected (e.g., missing checkin, mismatched times, incomplete data). Requires Human approval.","inputSchema":{"type":"object","properties":{"appointmentId":{"type":"integer","description":"The appointment ID to flag"},"flagReason":{"type":"string","description":"Reason for flagging (e.g., 'Missing checkout time', 'Carrier name mismatch')"},"severity":{"type":"string","enum":["low","medium","high"],"description":"Severity: low (informational), medium (should review), high (action needed)"}},"required":["appointmentId","flagReason"]},"annotations":{"title":"Flag appointment (HITL)","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"propose_run_report","description":"Trigger an existing scheduled report to run immediately on demand. Requires Human approval.","inputSchema":{"type":"object","properties":{"reportId":{"type":"integer","description":"The scheduled report ID to run"}},"required":["reportId"]},"annotations":{"title":"Run scheduled report (HITL)","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"propose_appointment","description":"Create a new appointment. Auto-confirmed and immediately live. IMPORTANT: Always provide carrierName, bolNumber or poNumber, and appointmentType (pickup/dropoff/both) — the API returns warnings for missing fields. If eventTypeId is omitted, auto-selects the first active type for the facility.","inputSchema":{"type":"object","properties":{"facilityId":{"type":"integer","description":"The facility ID where the appointment will occur"},"scheduledDate":{"type":"string","description":"Appointment date in YYYY-MM-DD format"},"scheduledTime":{"type":"string","description":"Appointment time in HH:MM format (24h)"},"eventTypeId":{"type":"integer","description":"Optional: specific appointment type ID (from dock://event-types). If omitted, auto-selects first active type for the facility."},"carrierName":{"type":"string","description":"(RECOMMENDED) Carrier / trucking company name. Defaults to 'Walk-in' if omitted — operators need this to identify the shipment."},"bolNumber":{"type":"string","description":"(RECOMMENDED) Bill of Lading number — stored in Description. Operators rely on this to match shipments."},"poNumber":{"type":"string","description":"Purchase Order number (single)"},"poNumbers":{"type":"array","items":{"type":"string"},"description":"Purchase Order numbers (multiple)"},"notes":{"type":"string","description":"Free-text notes — use for BOL details, shipper, consignee, weight, etc."},"description":{"type":"string","description":"Additional description (combined with bolNumber if both provided)"},"shipperName":{"type":"string","description":"Shipper name"},"consigneeName":{"type":"string","description":"Consignee name"},"driverCheckInName":{"type":"string","description":"Driver name for check-in"},"driverCheckInPhone":{"type":"string","description":"Driver phone number"},"driverCheckInEmail":{"type":"string","description":"CRITICAL: Driver email — triggers booking confirmation email to driver AND org recipients. Always include when available from the document."},"totalWeight":{"type":"number","description":"Total weight of shipment"},"totalPieces":{"type":"integer","description":"Total number of pieces"},"appointmentType":{"type":"string","description":"(REQUIRED) Type: pickup, dropoff, or both. Operators need this to prepare the dock."},"customerId":{"type":"integer","description":"Optional: ID of the customer (from dock://customers) associated with this appointment."},"questionAnswers":{"type":"array","description":"CRITICAL: Pre-fill check-in question answers from dock://categories. Without these, the appointment appears incomplete to operators. Get question IDs from dock://categories, match to extracted data, skip Photo-type questions. Answers appear in structured check-in UI.","items":{"type":"object","properties":{"questionId":{"type":"integer","description":"The check-in question ID from dock://categories checkinQuestions"},"answer":{"type":"string","description":"The answer text to pre-fill"}},"required":["questionId","answer"]}}},"required":["facilityId","scheduledDate","scheduledTime","appointmentType"]},"annotations":{"title":"Create appointment","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"confirm_appointment","description":"Confirm and create a previously proposed appointment. No human approval needed.","inputSchema":{"type":"object","properties":{"proposedAppointmentId":{"type":"string","description":"The proposed appointment ID (GUID) returned from a prior propose_appointment call"}},"required":["proposedAppointmentId"]},"annotations":{"title":"Confirm pending appointment","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"cancel_appointment","description":"Cancel an existing appointment. Auto-confirmed, no human approval needed.","inputSchema":{"type":"object","properties":{"eventId":{"type":"integer","description":"The appointment/event ID to cancel"},"reason":{"type":"string","description":"Optional cancellation reason"}},"required":["eventId"]},"annotations":{"title":"Cancel appointment","readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}},{"name":"mark_noshow","description":"Mark a past appointment as no-show. Auto-confirmed, no human approval needed.","inputSchema":{"type":"object","properties":{"eventId":{"type":"integer","description":"The appointment/event ID to mark as no-show"}},"required":["eventId"]},"annotations":{"title":"Mark no-show","readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}},{"name":"update_appointment","description":"Update fields on an existing appointment. Auto-confirmed. Only include fields you want to change.","inputSchema":{"type":"object","properties":{"eventId":{"type":"integer","description":"The appointment/event ID to update"},"scheduledDate":{"type":"string","description":"New date in YYYY-MM-DD format"},"scheduledTime":{"type":"string","description":"New time in HH:MM format (24h)"},"carrierName":{"type":"string","description":"Updated carrier name"},"bolNumber":{"type":"string","description":"Updated BOL number"},"poNumbers":{"type":"array","items":{"type":"string"},"description":"Updated PO numbers"},"notes":{"type":"string","description":"Updated notes"},"driverCheckInName":{"type":"string","description":"Updated driver name"},"driverCheckInEmail":{"type":"string","description":"Updated driver email"},"driverCheckInPhone":{"type":"string","description":"Updated driver phone"}},"required":["eventId"]},"annotations":{"title":"Update appointment","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}},{"name":"upload_file","description":"Upload a file (BOL, PDF, image) to an existing appointment. NOTE: This is NOT a JSON-RPC call — use a separate HTTP POST to api/mcp/v1/files/{eventId} with multipart/form-data. Include the file as the 'file' field. Max 25MB. Allowed types: PDF, JPG, PNG, DOCX, XLSX, CSV, TXT.","inputSchema":{"type":"object","properties":{"eventId":{"type":"integer","description":"The appointment/event ID to attach the file to"},"file":{"type":"string","format":"binary","description":"The file to upload (multipart/form-data)"}},"required":["eventId","file"]},"annotations":{"title":"Attach file to appointment","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}},{"name":"receive_inventory","description":"Record receipt of goods — increases QuantityOnHand. Creates an audited Receipt transaction. Use when goods arrive at the facility (e.g., from a BOL/delivery). Requires 'inventory' capability.","inputSchema":{"type":"object","properties":{"sku":{"type":"string","description":"SKU of the inventory item (use this OR itemId)"},"itemId":{"type":"string","description":"GUID of the inventory item (use this OR sku)"},"quantity":{"type":"number","description":"Quantity to receive (must be positive)"},"reference":{"type":"string","description":"External reference (BOL#, PO#, Receipt#)"},"eventId":{"type":"integer","description":"Optional appointment ID to link this receipt to"}},"required":["quantity"]},"annotations":{"title":"Receive inventory","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"issue_inventory","description":"Record issue/shipment of goods — decreases QuantityOnHand. Validates available stock (OnHand - Reserved >= quantity). Creates an audited Issue transaction. Requires 'inventory' capability.","inputSchema":{"type":"object","properties":{"sku":{"type":"string","description":"SKU of the inventory item (use this OR itemId)"},"itemId":{"type":"string","description":"GUID of the inventory item (use this OR sku)"},"quantity":{"type":"number","description":"Quantity to issue (must be positive — system checks available stock)"},"eventId":{"type":"integer","description":"Optional appointment ID to link this issue to"}},"required":["quantity"]},"annotations":{"title":"Issue inventory","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"adjust_inventory","description":"Set inventory to an absolute quantity (cycle count correction, damage write-off). Creates an audited Adjust transaction with before/after quantities. Requires 'inventory' capability.","inputSchema":{"type":"object","properties":{"sku":{"type":"string","description":"SKU of the inventory item (use this OR itemId)"},"itemId":{"type":"string","description":"GUID of the inventory item (use this OR sku)"},"quantity":{"type":"number","description":"New absolute quantity (e.g., cycle count found 47 instead of 50)"},"reason":{"type":"string","description":"Reason for adjustment (e.g., 'Cycle count', 'Damage', 'Correction')"}},"required":["quantity"]},"annotations":{"title":"Adjust inventory to absolute quantity","readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false}},{"name":"add_asset","description":"Create a new asset (document, certificate, tool, or tracked item). Triggers an AssetAdded notification to configured recipients. Requires 'assets' capability.","inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Asset name (required)"},"category":{"type":"string","description":"Category (e.g., 'Insurance', 'Certificate', 'Tool')"},"status":{"type":"string","description":"Status — typically 'Active', 'Retired', or 'InRepair'. Defaults to 'Active' if omitted."},"description":{"type":"string","description":"Free-text description"},"location":{"type":"string","description":"Physical location"},"barcode":{"type":"string","description":"Optional barcode. If omitted, one is auto-generated."}},"required":["name"]},"annotations":{"title":"Add asset","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"add_equipment","description":"Create a new piece of equipment (Truck or Trailer) in the fleet registry. Triggers an EquipmentAdded notification to configured recipients. Requires 'equipment' capability.","inputSchema":{"type":"object","properties":{"equipmentNumber":{"type":"string","description":"Unique equipment number within the organization (required)"},"type":{"type":"string","description":"Must be exactly 'Truck' or 'Trailer' (required)"},"status":{"type":"string","description":"Status — e.g., 'Active', 'InService', 'OutOfService'. Defaults to 'Active' if omitted."},"make":{"type":"string","description":"Manufacturer (e.g., 'Freightliner')"},"model":{"type":"string","description":"Model (e.g., 'Cascadia')"},"year":{"type":"string","description":"Year of manufacture"},"vin":{"type":"string","description":"VIN"},"licensePlate":{"type":"string","description":"License plate number"},"state":{"type":"string","description":"State of registration (e.g., 'IN')"},"notes":{"type":"string","description":"Free-text notes"}},"required":["equipmentNumber","type"]},"annotations":{"title":"Add equipment","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}}],"counts":{"tools":15,"tenantResources":28,"platformResources":9}}