# Tool catalog

Auto-generated from the registered MCP tools. 152 tools across 22 families.

The MCP server (stdio) mints and refreshes its own access tokens from `ITURAN_USERNAME` / `ITURAN_PASSWORD` via identity-server-v1; tokens are not exposed to the LLM.

## advanced

### `ituran_advanced_alerts_list`

**List customer-level alerts (Advanced)**

Customer-level alert configuration from the Advanced API ({alerts:[{alert_id, alert_name, alert_description, alert_status, is_default}]}); an empty entitled account returns alerts:[]. This is a different, account-central view than ituran_alerts_list (Global V2). A 403 returns a successful unavailable result: customer-level definitions and default flags are unknown, not empty; do not retry. Calls GET /api/advanced/v1/alerts.

| Argument | Type | Required | Description |
|---|---|---|---|
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_advanced_relations_entities`

**Resolve all entity IDs to labels (Advanced relations)**

THE id→label resolver: one call returns every entity catalog the other tools reference by opaque id — vehicle_groups (with their alert/event/indication/action id lists), alerts, events, indications, sequences, alert_actions, and places, each as {id, name}. Use this to translate numeric ids from events/alerts/groups responses into human names. A 403 returns available:false because labels are unknown, not empty; do not retry. Read-only. Calls GET /api/advanced/v1/relations/entities.

| Argument | Type | Required | Description |
|---|---|---|---|
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## alerts

### `ituran_vehicle_alerts_list`

**List vehicle alerts**

Per-vehicle: list alerts reaching ONE vehicle by plate (including alerts inherited via vehicle-group membership). ⚠ Upstream can repeat the SAME alert row verbatim (verified) — dedupe by alert_id before counting. Use when scoped to a single plate; for all alerts across the account use ituran_alerts_list, for the current user's custom alerts use ituran_alerts_custom_list. Calls GET /api/v2/vehicles/{license_plate}/alerts.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicle_alerts_create`

**Create vehicle alert**

Per-vehicle: create an alert scoped to ONE vehicle by plate (body passed through). Use for a single plate; to create an alert spanning all your vehicles use ituran_alerts_create instead. Calls POST /api/v2/vehicles/{license_plate}/alerts.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate. |
| `body` | Object | yes | Alert body (Create/UpdateAlertRequest). Documented fields are optional HERE — upstream validates; unknown fields (alert_status, always_on, time_filtering, alert_contacts, place_alert, ...) pass through untouched. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicle_alerts_update`

**Update vehicle alert**

Per-vehicle: update an alert scoped to ONE vehicle by plate (body passed through). Only works on alerts whose own license_plates directly includes this plate (group-inherited alerts 404 here); for account-wide alerts by ID use ituran_alerts_update. Calls PUT /api/v2/vehicles/{license_plate}/alerts/{alert_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate. |
| `alert_id` | String or Number | yes | Alert ID. |
| `body` | Object | yes | Alert body (Create/UpdateAlertRequest). Documented fields are optional HERE — upstream validates; unknown fields (alert_status, always_on, time_filtering, alert_contacts, place_alert, ...) pass through untouched. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicle_alerts_delete`

**Delete vehicle alert**

Per-vehicle: delete an alert from ONE vehicle by plate. Only works on alerts whose own license_plates directly includes this plate (group-inherited alerts 404 here); to delete an account-wide alert by ID use ituran_alerts_delete. Calls DELETE /api/v2/vehicles/{license_plate}/alerts/{alert_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate. |
| `alert_id` | String or Number | yes | Alert ID. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_alerts_list`

**List all alerts**

Account-wide: list every alert visible to you across all vehicles. Use for the full account view; to scope to one plate use ituran_vehicle_alerts_list, for the current user's custom alerts use ituran_alerts_custom_list. Calls GET /api/v2/alerts.

| Argument | Type | Required | Description |
|---|---|---|---|
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_alerts_get`

**Get alert**

Account-wide: get one alert by its ID. Use when you already have an alert_id (e.g. from ituran_alerts_list); to browse a single vehicle's alerts instead use ituran_vehicle_alerts_list. Calls GET /api/v2/alerts/{alert_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `alert_id` | String or Number | yes | Alert ID. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_alerts_create`

**Create alert**

Account-wide: create an alert spanning your vehicles (target plates/groups set in the body, passed through). Use for a multi-vehicle alert; to scope to a single plate use ituran_vehicle_alerts_create. Calls POST /api/v2/alerts.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Object | yes | Alert body (Create/UpdateAlertRequest). Documented fields are optional HERE — upstream validates; unknown fields (alert_status, always_on, time_filtering, alert_contacts, place_alert, ...) pass through untouched. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_alerts_update`

**Update alert**

Account-wide: update an existing alert by its ID (body passed through). Use for account-level alerts; to update within a single vehicle's scope use ituran_vehicle_alerts_update, or a per-user custom alert use ituran_alerts_custom_update. Calls PUT /api/v2/alerts/{alert_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `alert_id` | String or Number | yes | Alert ID. |
| `body` | Object | yes | Alert body (Create/UpdateAlertRequest). Documented fields are optional HERE — upstream validates; unknown fields (alert_status, always_on, time_filtering, alert_contacts, place_alert, ...) pass through untouched. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_alerts_delete`

**Delete alert**

Account-wide: delete an alert by its ID. Use for account-level alerts; to delete within a single vehicle's scope use ituran_vehicle_alerts_delete. Calls DELETE /api/v2/alerts/{alert_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `alert_id` | String or Number | yes | Alert ID. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_alerts_custom_list`

**List user custom alerts**

Per-user custom: list the current user's custom alerts, optionally filtered by contact_id. ⚠ Upstream can repeat the SAME alert row verbatim (verified: 4 duplicate pairs in one live response) — dedupe by alert_id before counting. Distinct from account-wide alerts (ituran_alerts_list) and per-vehicle alerts (ituran_vehicle_alerts_list). Calls GET /api/v2/alerts/custom.

| Argument | Type | Required | Description |
|---|---|---|---|
| `contact_id` | String or Number | no | Optional contact ID filter. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_alerts_custom_update`

**Update custom alert**

Per-user custom: update one of the current user's custom alerts by ID (body passed through). Use for custom alerts from ituran_alerts_custom_list; for account-wide alerts use ituran_alerts_update. Calls PUT /api/v2/alerts/custom/{alert_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `alert_id` | String or Number | yes | Custom alert ID. |
| `body` | Record | yes | Custom-alert body (upstream validates; unknown fields pass through untouched). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_push_alerts_search`

**Search push alerts**

Push-notification history: search past push-notification alerts that were sent. The body REQUIRES contact_id > 0 (get one from ituran_contacts_list). ⚠ DEGRADED on production: the service additionally requires an app registration the standard token lacks — expect '1032: AppId not exists in token' (no ITURAN_APP_ID) or '1011: Application name not found' (ITURAN_APP_ID=11) until a dedicated app id is provisioned. For alert definitions use ituran_alerts_list / ituran_vehicle_alerts_list / ituran_alerts_custom_list. Calls POST /api/v2/push-notifications/alerts/search.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Record | yes | Search body — contact_id > 0 is REQUIRED (get one from ituran_contacts_list). |
| `additional_fields` | Array | no | Extra response fields. Valid: AlertLocation. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## commands

### `ituran_commands_list`

**List commands by license plate**

Read-only. Lists the commands available for a specific vehicle (the command catalog); license_plate is required (upstream returns 404 without it). To check the result of a command you already sent use ituran_commands_status; to actually dispatch one use the live senders ituran_commands_send / ituran_commands_start_tracking / ituran_commands_update_keyboard. Calls GET /api/v2/commands.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate (required by upstream). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_commands_status`

**Get sent command status**

Read-only. Returns the delivery status/result of one or more commands you already sent; requires license_plate plus the transaction_ids returned by ituran_commands_send (omitting transaction_ids fails). To see what commands exist use ituran_commands_list. Calls GET /api/v2/commands/status.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate (required). |
| `transaction_ids` | Array | no | Optional list of transaction IDs to filter by. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_commands_send`

**Send a command to a vehicle**

LIVE SENDER: dispatches a real, irreversible command (e.g., immobilize, locate) to a physical vehicle device — there is no dry-run, so confirm with the user first and only target the intended vehicle. This is not a read-only query; to browse available commands use ituran_commands_list, to check a prior send's result use ituran_commands_status. Calls POST /api/v2/commands/send.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Record | yes | Command body — pick the command from ituran_commands_list for the target vehicle; upstream validates. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_commands_start_tracking`

**Start tracking a vehicle**

LIVE SENDER: dispatches a real, irreversible start-tracking command to a physical vehicle device — no dry-run, so confirm with the user first and only target the intended vehicle. Unlike the read-only ituran_commands_list / ituran_commands_status, this actually acts on the device. Calls POST /api/v2/commands/start-tracking.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate (required). |
| `body` | Record | no | Optional body. Most usages send the license plate via query only. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_commands_update_keyboard`

**Update keyboard for Ituran Key app**

LIVE SENDER: dispatches a real, irreversible keyboard-configuration update for the Ituran Key app to a physical vehicle device — no dry-run, so confirm with the user first and only target the intended vehicle. This is not a read-only query (see ituran_commands_list / ituran_commands_status). Calls POST /api/v2/commands/update-keyboard.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Record | yes | Command body (upstream validates; unknown fields pass through untouched). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## contacts

### `ituran_contacts_list`

**List contacts**

Lists all contacts for the calling user (full, unfiltered). Use ituran_contacts_search to filter by criteria, and ituran_contacts_create/_update/_delete to modify them. Calls GET /api/v2/contacts.

| Argument | Type | Required | Description |
|---|---|---|---|
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. The contacts routes cap at 1000, not the usual 2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_contacts_search`

**Search contacts**

Searches the calling user's PRIVATE ACTIVE contacts (is_public rows never return, an empty body lists every private contact, and Inactive contacts — including any FRESHLY-CREATED one, which arrives Inactive — are invisible here; list those via ituran_contacts_list). Filter keys bind literally — first_name binds; UNKNOWN keys are silently IGNORED and the result looks unfiltered, so check the key engaged before trusting a match. Use ituran_contacts_list for the full list including public/inactive contacts; ituran_contacts_create/_update/_delete to modify. Calls POST /api/v2/contacts/search.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Record | yes | Filter object; known-binding key: first_name. Unknown keys are silently IGNORED upstream — the result looks unfiltered. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. The contacts routes cap at 1000, not the usual 2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_contacts_create`

**Create contact**

Creates a new contact (phone is REQUIRED — '1043: Phone is empty' otherwise; other fields pass through, upstream validates). The new contact arrives with status Inactive and is INVISIBLE to ituran_contacts_search until activated — verify creation via ituran_contacts_list. Returns {contact_id}. Use ituran_contacts_update to change one and ituran_contacts_delete to remove one. Calls POST /api/v2/contacts.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Record | yes | Contact fields; phone is REQUIRED ('1043: Phone is empty' otherwise). Upstream validates the rest. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_contacts_update`

**Update contact**

Updates an existing contact by ID; body is a pass-through payload. Use ituran_contacts_create to add one and ituran_contacts_delete to remove one; ituran_contacts_list/_search to find. Calls PUT /api/v2/contacts/{contact_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `contact_id` | String or Number | yes | Contact ID. |
| `body` | Record | yes | Contact fields (upstream validates; unknown fields pass through untouched). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_contacts_delete`

**Delete contact**

Permanently deletes a contact by ID; irreversible. Use ituran_contacts_update to modify instead, or ituran_contacts_list/_search to find. Calls DELETE /api/v2/contacts/{contact_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `contact_id` | String or Number | yes | Contact ID. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## diagnostics

### `ituran_diagnostics_last`

**Get last recorded vehicle diagnostics**

Latest onboard sensor snapshot per vehicle (no time range). Readings are UNITLESS numbers, each with its own timestamp, and can be months old — never present a stale reading as current state. Diagnostics are sparse (many vehicles report none) and dominated by power-voltage/EV-battery channels; an empty list is normal, not a fault. For a compact full-fleet audit of each vehicle's newest diagnostic timestamp, use one call with license_plates:["*"] and omit diagnostic_names; the result validates every vehicles envelope, reconciles normalized identities, and separates timestamped, timestamp-unknown, and no-reading vehicles. For a time series over a date range use ituran_diagnostics_history. Calls POST /api/v2/diagnostics.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plates` | Array | yes | Plates to query (0-9/A-Z, no dashes). A single "*" means ALL vehicles authorized to the account. |
| `diagnostic_names` | Array | no | Optional server-side channel filter, names like 'Diagnostic_60' (fuel level %), 'Diagnostic_BE' (engine RPM), 'Diagnostic_6E' (engine temp), 'Diagnostic_247' (engine hours), 'Diagnostic_2334' (EV battery SoC). Omit for ALL channels. If provided, EVERY name must exist in the account's catalog or the whole call fails with a 400. |
| `page_number` | Number | no | 1-based page number. Diagnostics paginate BY VEHICLE (sorted by plate); each vehicle row carries all its channels. |
| `page_size` | Number | no | Vehicles per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_ev_overnight_charge_board`

**EV overnight charging and shift-start SoC board**

COMPOSITE: charge-start/overnight SoC answer in ONE call. view:"charge_start_window" uses only explicit charge-start definitions, exhausts known EV reporter history, and partitions starts by the wraparound off-peak window, returns lossless semicolon CSV, and names uncovered reporter-periods. Invalid definitions, event members, identities, record IDs, timestamps, batches, truncation, or span clamping keep coverage incomplete; duplicate identities quarantine every involved period. Without that view, discovers Diagnostic_2334 SoC and Diagnostic_2227/9628/9629 AC/DC reporters, walks one-day history, and classifies SoC increase plus shift-start SoC. Missing or invalid evidence stays unknown; unavailable channels make the without-reading population null. No driver/location data. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Literal | no | Use for historical charge-start events split by an off-peak tariff window. |
| `from_date` | String | yes | Account-local ISO start of the overnight window. |
| `to_date` | String | yes | Account-local ISO shift start/end of the overnight window. |
| `low_soc_threshold` | Number | no | Shift-start SoC threshold in percent; required without view:"charge_start_window". |
| `off_peak_start` | String | no | Account-local HH:mm start; required with view:"charge_start_window". |
| `off_peak_end` | String | no | Account-local HH:mm end; required with view:"charge_start_window". |

### `ituran_battery_voltage_motion_report`

**Battery voltage while stationary versus moving**

COMPOSITE: compare one vehicle's Diagnostic_p1040 main-power voltage while stationary (speed=0) versus moving (speed>0) on one account-local date in ONE call. Exhausts every diagnostics-history page and returns sample counts, minimum/maximum values, timestamps, and exact coverage through one paced two-request gate without locations or trip rows; malformed envelopes/records and null, blank, or non-finite readings are rejected rather than converted to 0 V. This is observational telemetry, not a professional battery load test or diagnostic determination. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | One vehicle plate. |
| `date` | String | yes | One account-local calendar date as YYYY-MM-DD. |

### `ituran_diagnostics_history`

**Get diagnostics history by license plates**

Historical diagnostics for one or more vehicles over a date range — the API caps the range at 1 DAY ('ToDate must be at most 1 day larger than From'). Response rows carry per-reading timestamps; values are unitless. diagnostic_names filters CLIENT-SIDE (the stream is dominated by voltage heartbeats — a channel filter cuts most rows). For just the most recent snapshot use ituran_diagnostics_last; for the fuel-theft/refuel screen use ituran_fuel_guard. Calls POST /api/v2/diagnostics/history.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plates` | Array | yes | Plates to query (0-9/A-Z, no dashes). A single "*" means ALL vehicles authorized to the account. |
| `diagnostic_names` | Array | no | Optional CLIENT-SIDE channel filter (upstream history has no channel filter): readings outside these names drop, and records left with no matching readings drop — a page can return fewer (even zero) records while later pages still hold matches, so walk pages by the pagination metadata. |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set (range capped at 1 day upstream). |
| `to_date` | String | no | ISO timestamp upper bound; must not be in the future. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. History pages individual per-reading RECORDS ({record_id, timestamp, location, diagnostics[]} rows) — unlike ituran_diagnostics_last, which pages by vehicle. |
| `page_size` | Number | no | Records per page. Upstream caps HISTORY at 10–100 — unlike the snapshot route's 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_wear_sensor_board`

**Fleet brake-lining and tire-pressure sensor board**

COMPOSITE: complete fleet brake-lining (Diagnostic_1099–1106) and Enertire TPMS (Diagnostic_456–505) latest-reading board in ONE call. Returns every reporting vehicle and an explicit fleet coverage check; malformed per-page pagination or duplicate normalized vehicle rows are incomplete. The upstream readings do not identify a sensor model, approved unit, or approved threshold, so the tool never invents limits and never classifies an anomaly without that evidence. Read-only.

_No arguments._

### `ituran_fuel_guard`

**Fuel theft screen & refuel log (composite)**

COMPOSITE: fuel-level change screen in ONE call. Walks Diagnostic_96 litres, else Diagnostic_60 percent. Every change >= min_change becomes: parked drop at two speed-0 samples (theft/leak/sensor-artifact review candidate, never proof), nonstationary drop, or stationary rise (possible refuel). Zero samples are invalid; malformed pagination, identities, readings, or off-filter rows keep coverage incomplete. Omit license_plates for EVERY discovered reporter; no_fuel_channel means not instrumented. view=stationary_events returns only event-bearing vehicles while preserving coverage/counts; use parked_drop_count/refuel_count, not recounted arrays. Date-only end is inclusive; window <=3 days. Call once; do not split/retry. Paced five-plate batches.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plates` | Array | no | Plates to screen (max 10 per call). Omit to auto-discover fuel reporters. |
| `max_vehicles` | Number | no | Discovery mode only: cap the freshest-reporting fuel vehicles at this many (max 100). Omit for complete reporter coverage. |
| `view` | Enum | no | Use stationary_events for parked-drop/refuel requests: it omits driving-drop detail rows but keeps their counts. Default full. |
| `min_change` | Number | no | Classification threshold in the channel's own units (default 5 — litres or percent points; raise it for percent vehicles, the percent channel sloshes while driving). |
| `from_date` | String | no | ISO start; a date-only value starts at 00:00:00. Required unless range_token is set. |
| `to_date` | String | no | ISO end; a date-only value includes that calendar day through 23:59:59. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

## drive-permission-groups

### `ituran_drive_permission_groups_list`

**List drive-permission groups**

Lists the drive-permission groups for the calling user (read-only); use ituran_drive_permission_groups_create/_update/_delete to modify. Requires the drive-permission feature to be enabled on the account, else 403. Calls GET /api/v2/drive-permission-group.

| Argument | Type | Required | Description |
|---|---|---|---|
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_drive_permission_groups_create`

**Create drive-permission group**

Creates a new drive-permission group; body is a pass-through payload (upstream validates). Mutating counterpart to the read-only ituran_drive_permission_groups_list; use ituran_drive_permission_groups_update to change one and ituran_drive_permission_groups_delete to remove one. Calls POST /api/v2/drive-permission-group.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Record | yes | Drive-permission-group body (upstream validates; the feature must be enabled on the account). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_drive_permission_groups_update`

**Update drive-permission group**

Updates a drive-permission group by ID; body is a pass-through payload. Use ituran_drive_permission_groups_create to add one and ituran_drive_permission_groups_delete to remove one; ituran_drive_permission_groups_list to browse. Calls PUT /api/v2/drive-permission-group/{drive_permission_group_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `drive_permission_group_id` | String or Number | yes | Drive-permission group ID. |
| `body` | Record | yes | Drive-permission-group body (upstream validates; the feature must be enabled on the account). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_drive_permission_groups_delete`

**Delete drive-permission group**

Permanently deletes a drive-permission group by ID; irreversible. Use ituran_drive_permission_groups_update to modify instead, or ituran_drive_permission_groups_list to browse. Calls DELETE /api/v2/drive-permission-group/{drive_permission_group_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `drive_permission_group_id` | String or Number | yes | Drive-permission group ID. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## drivers

### `ituran_driver_registry_audit`

**Audit driver registry hygiene**

COMPOSITE: answers the driver-registry hygiene question in ONE call. Walks every registry page, counts blocked, contactless (no phone and no email), and missing-code rows, exhaustively scans trips for the requested window, then returns every observed driver code absent from the registry with exact source/join coverage. Contact values and driver names are omitted. Do not page ituran_drivers_list, split trip calls, discover tools, or hand-join results. Read-only. Calls GET /api/v2/drivers and GET /api/v2/trips.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | ISO timestamp lower bound (account-local time). |
| `to_date` | String | no | ISO timestamp upper bound (account-local time). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_drivers_list`

**List drivers**

Lists all drivers visible to the calling user (full, unfiltered). Use ituran_drivers_get to fetch one driver by ID, or ituran_drivers_search to filter by criteria. Calls GET /api/v2/drivers.

| Argument | Type | Required | Description |
|---|---|---|---|
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream caps drivers at 10–1000 (not 2000). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_drivers_get`

**Get driver**

Gets a single driver by driver ID. Use ituran_drivers_list for the full list, or ituran_drivers_search to filter by criteria. Calls GET /api/v2/drivers/{driver_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `driver_id` | String or Number | yes | Driver ID. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_drivers_search`

**Search drivers**

Searches/filters drivers by criteria supplied in a pass-through body. Use ituran_drivers_list for the full unfiltered list, or ituran_drivers_get to fetch one by ID. Calls POST /api/v2/drivers/search.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Record | yes | Driver filter object. No filter key is known to bind upstream — prefer ituran_drivers_list + client-side matching; unknown keys are silently ignored. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream caps drivers at 10–1000 (not 2000). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## events

### `ituran_events_list`

**List vehicle events**

Current event STATES for one vehicle (license_plate required): one row per event definition with its most recent occurrence time (time_start) — a live status feed, not a history. For the historical event stream use ituran_reports_events; for over-speeding use ituran_events_over_speeding; for aggregate counts use ituran_events_stats; for the catalog of definable event types use ituran_event_definitions_list. Calls GET /api/v2/events.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate (required by upstream). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_anti_idling_zones`

**Screen current idling inside sensitive saved-place zones**

COMPOSITE: answers the current anti-idling-zone question in ONE call. Freezes one complete idle/fleet/location snapshot, scans all saved-place pages, selects names by explicit patterns, derives polygon bounding discs, and geo-matches every located idler. Returns location age, every boundary used, stale/unlocated partitions, and exact coverage. Name matching identifies candidate sensitive zones and is not proof that idling is prohibited there; use an operator-approved pattern list. Do not call events_stats, places_list, or vehicles_search separately. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `place_name_patterns` | Array | no | Case-insensitive saved-place name substrings. Defaults to Hebrew/English school, hospital, and customer terms. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_events_over_speeding`

**List over-speeding events**

LOW-LEVEL over-speeding alert endpoint for ONE required license_plate, optionally date-filtered. For user-facing single-vehicle episode history use ituran_vehicles_over_speeding; for fleet-wide ranking use ituran_speed_offenders. ⚠ Rows exist only where an over-speeding ALERT DEFINITION covers the vehicle and repeat once per matching definition, so they cannot rule out other speeding; ituran_speed_offenders / ituran_reports_speed read the raw speed records. For a single trip use ituran_trips_over_speeding; for non-speeding event occurrences use ituran_events_list. Calls GET /api/v2/events/over-speeding.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate (required by upstream for this endpoint). |
| `from_date` | String | no | ISO timestamp lower bound. |
| `to_date` | String | no | ISO timestamp upper bound (a future value is rejected upstream; clamped locally). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_events_stats`

**Get events statistics**

COMPOSITE: ONE call. Boards match and drill positive definitions: board:"satellite_fix"=no-fix ages+communication overlap; board:"scan"+window=roles,current states,full-fleet history; board:"alarm"=armed/disarmed; board:"adas"=collision,headway,lane departure+locations; board:"temperature"=unit communication loss; board:"idle"=idle roster; board:"security"=panic,power,unauthorized use,communication+locations; board:"faults"=every positive definition; board:"pto"+window=full fleet opening/closing history; board:"stale_open_states"+older_than_days=definition ages without identities. Rows expose normalized plate, strict start, and minimal ADAS/security location. Invalid, duplicate, conflicting, mismatched, truncated, or off-batch evidence is incomplete. Without board returns raw stats.

| Argument | Type | Required | Description |
|---|---|---|---|
| `board` | Enum | no | Optional complete board: adas, alarm, dms, faults, idle, pto, satellite_fix, scan, security, stale_open_states, or temperature. |
| `older_than_days` | Number | no | Strict open-state age threshold in days; required only with board:"stale_open_states". |
| `from_date` | String | no | History lower bound; use only with board:"pto" or board:"scan". |
| `to_date` | String | no | History upper bound; use only with board:"pto" or board:"scan". |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_events_vehicles`

**Get vehicles for an event**

Lists the vehicles associated with one specific event, given its event_id (obtain the id from ituran_events_stats). Live state can change between the aggregate and drill-down calls, so the tool best-effort cross-checks /events/stats and stamps _data_quality when their vehicle counts materially diverge. Calls GET /api/v2/events/{event_id}/vehicles + GET /api/v2/events/stats.

| Argument | Type | Required | Description |
|---|---|---|---|
| `event_id` | String or Number | yes | Event ID. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_event_definitions_list`

**List event definitions**

Lists the configured event definitions visible to the user (the catalog of definable event types), not actual occurrences — for occurrences use ituran_events_list, and for the enum of available type names use ituran_event_definition_types. Calls GET /api/v2/event-definitions.

| Argument | Type | Required | Description |
|---|---|---|---|
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_event_definition_types`

**List event definition types**

Lists the available event type names (the enum of types an event definition can use), not occurrences or configured definitions — see ituran_event_definitions_list for existing definitions and ituran_events_list for occurrences. Calls GET /api/v2/event-definitions/types.

| Argument | Type | Required | Description |
|---|---|---|---|
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## exports

### `ituran_exports_status_list`

**List schedule report statuses**

Lists the status of all scheduled report export jobs. An account with no exports returns an empty list (upstream signals the empty set with a 404 — mapped here). To fetch a single job by its ID use ituran_exports_status_get. Calls GET /api/v2/exports/status.

| Argument | Type | Required | Description |
|---|---|---|---|
| `source` | String or Number | no | Optional source filter (integer code; non-numeric values 400 upstream). |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_exports_status_get`

**Get schedule report status**

Gets the status of one scheduled report export identified by export_id. To list all export jobs instead use ituran_exports_status_list. Calls GET /api/v2/exports/status/{export_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `export_id` | String or Number | yes | Export ID. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## fleet

### `ituran_find_vehicle`

**Find a vehicle from free text (resolver)**

RESOLVER: the "which vehicle did the user mean" answer in ONE call — fuzzy-finds vehicles in the fleet snapshot from free text: plate, nickname, make, model, color, or driver name. view:"live_location" forces a fresh sweep and returns each matched candidate's compact current/last-known point, address, timestamp, and explicit location/roster coverage, so do not resolve then call a location tool. Latin make and common model names also match Hebrew spellings. If the request already supplies a complete plate and another target tool accepts it, call that tool directly. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Literal | no | Return compact fresh-snapshot location evidence for every returned candidate. |
| `query` | String | yes | Free text: plate (dashes ok), nickname, make, model, color, or driver name. |
| `max_results` | Number | no | Candidates to return (default 5); total_matches always reports the full count. |

### `ituran_fleet_summary`

**Summarize the whole fleet (composite)**

COMPOSITE: the "fleet warranty, replacement, latency, morning alert state, or current state" answer in ONE call. view:"morning_brief" forces a fresh roster and joins current event-state counts with semicolon evidence and completeness; do not call alerts/events separately. With no date window, view:"warranty_capture" returns cap bands plus device/GPS meter review; its GPS walk is paced, capped, and reconciled, and callers must name every meter review row. view:"replacement_profile" returns year/km counts; no planner. User-facing replacement answers state snapshot_age_seconds, valid/unset, overlap, and meter-reset caveat. view:"reporting_latency" returns <=1h/<=24h shares and P50/P90 ages. No view returns motion/freshness/cities/bbox. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Enum | no | Morning alert/state brief, reporting-latency SLA, replacement profile, or warranty-capture meter screen; omit for current fleet state. |
| `model_year_max` | Number | no | Required for view:"replacement_profile"; count model years at or below this cutoff. |
| `odometer_threshold_km` | Number | no | Required for view:"replacement_profile"; count device odometers strictly above this value. |
| `warranty_cap_km` | Number | no | Required for view:"warranty_capture"; operator-supplied warranty mileage cap. |
| `approaching_within_km` | Number | no | Required for view:"warranty_capture"; inclusive distance below the warranty cap. |
| `force_refresh` | Boolean | no | Bypass the snapshot cache (use sparingly — a full sweep pages the whole fleet). |

### `ituran_vehicle_snapshot`

**Full snapshot of one vehicle (composite)**

COMPOSITE: the "vehicle snapshot or longest genuine reporting gap" answer in ONE call. Default: one vehicle's identity, location, driver, alerts, and diagnostics. For a missing vehicle, set recent_activity_days (1–7) for a compact last-location-anchored trail. For the fleet gap, call view:"longest_reporting_gap" without license_plate; it excludes zero/Unix-epoch timestamps and returns compact identity, last-known location, activity, and coverage without contacts, diagnostics, or follow-ups. Failed default parts use _errors; location_age_minutes marks a stale fix. Each diagnostic has its own timestamp. odometer_check compares device, GPS virtual, and diagnostic meters; use absolute gaps because rounded 0% is not exact. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Enum | no | Select the fleet unit with the oldest plausible non-epoch last-location timestamp. |
| `license_plate` | String | no | License plate (required unless view:"longest_reporting_gap"; dashes/spaces normalized away). |
| `recent_activity_days` | Number | no | Include 1–7 days ending on the last location date; defaults to 3 for the reporting-gap view. |

## groups

### `ituran_select_vehicles`

**Select vehicles into a named group (planner)**

PLANNER: filter the fleet snapshot into an ephemeral vehicle group, not a saved place or geofence. Named area/place requests use ituran_select_vehicles_in_place after ituran_places_list resolves a place_id. Never guess a radius after a named-place miss; coordinate-radius filters are only for explicit coordinates and may be disabled by deployment policy. Small matches inline operational vehicle summaries without contact or device identifiers; use driver tools only for an explicit contact request. Larger matches return {group,count,sample}. Filters AND: motion; literal attribute text; radius; location-age floor/ceiling; numeric range. Chain with source_group/groups_combine; page with group_get. Groups expire after 15 minutes; never expose names. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `save_as` | String | yes | Name to save the resulting group under (lowercase letters/digits/underscore/hyphen, max 64). |
| `source_group` | String | no | Filter within an existing group instead of the whole fleet. |
| `motion_status` | Enum | no | Vehicle motion state. |
| `attribute` | Enum | no | Which field `contains` matches against (default: any). 'address' = the reverse-geocoded address string. |
| `contains` | String | no | Literal case-insensitive substring to match (use the account's language). |
| `near_lat` | Number | no | Center latitude for a radius filter. |
| `near_lon` | Number | no | Center longitude for a radius filter. |
| `radius_km` | Number | no | Radius in km (requires near_lat/near_lon). |
| `max_location_age_minutes` | Number | no | Keep only vehicles whose fix is at MOST this old (FRESH ones), relative to the newest report. |
| `min_location_age_minutes` | Number | no | Keep only vehicles whose fix is at LEAST this old (STALE ones) — answers 'haven't reported in over a week/month' (e.g. 10080 = 7 days). A vehicle with no fix/timestamp counts as stale and is kept. |
| `range_attribute` | Enum | no | Numeric attribute: model_year, odometer (km, from the last fix), or speed (km/h, last reported). model_year/odometer 0 means UNSET upstream — such vehicles are skipped and counted, never ranked. |
| `range_min` | Number | no | Keep vehicles with range_attribute >= this (needs range_attribute). |
| `range_max` | Number | no | Keep vehicles with range_attribute <= this (needs range_attribute). |

### `ituran_select_vehicles_in_place`

**Select vehicles currently inside a saved place (planner)**

PLANNER: save the vehicles currently inside one SAVED place as an ephemeral named vehicle group. Resolve the exact place_id with ituran_places_list first; this tool uses upstream place membership directly and never asks the model to invent coordinates or approximate a polygon with a radius. It scans every membership page and falls back to realtime fleet-snapshot memberships on an upstream 5xx. Small selections inline data-minimized operational summaries; page larger selections with ituran_group_get. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `save_as` | String | yes | Name to save the resulting group under (lowercase letters/digits/underscore/hyphen, max 64). |
| `place_id` | String or Number | yes | Saved place ID from ituran_places_list. |

### `ituran_groups_combine`

**Combine named groups (set algebra)**

PLANNER: union / intersect / subtract named groups into a new named group, returning only {group, count, sample}. subtract = first group minus the rest. No upstream calls. Create groups first with ituran_select_vehicles; list live ones with ituran_groups_list; fetch rows with ituran_group_get.

| Argument | Type | Required | Description |
|---|---|---|---|
| `op` | Enum | yes | Set operation. subtract = first group minus the rest (order matters). |
| `groups` | Array | yes | Existing group names, in order (order matters for subtract). |
| `save_as` | String | yes | Name to save the resulting group under (lowercase letters/digits/underscore/hyphen, max 64). |

### `ituran_select_top`

**Top/bottom N vehicles by a numeric attribute (planner)**

PLANNER: rank vehicles by a NUMERIC attribute (model_year, odometer, speed) and save the top/bottom N as a named group — answers 'the 10 oldest vehicles' / 'highest odometer' in one call. Returns the ranked rows inline ({rank, license_plate, value}); vehicles missing the attribute are skipped and counted. Chain via source_group; fetch operational summaries with ituran_group_get. Read-only (one cached fleet sweep).

| Argument | Type | Required | Description |
|---|---|---|---|
| `save_as` | String | yes | Name to save the resulting group under (lowercase letters/digits/underscore/hyphen, max 64). |
| `attribute` | Enum | yes | Numeric attribute: model_year, odometer (km, from the last fix), or speed (km/h, last reported). model_year/odometer 0 means UNSET upstream — such vehicles are skipped and counted, never ranked. |
| `direction` | Enum | no | Rank order (default highest — e.g. highest odometer; 'lowest' for oldest model_year). |
| `n` | Number | no | How many to keep (default 10). |
| `source_group` | String | no | Rank within an existing group instead of the whole fleet. |

### `ituran_select_by_diagnostic`

**Select vehicles by a diagnostic channel value (planner)**

PLANNER: latest-reading band with lossless matched/invalid/malformed/stale/no-reading coverage. Envelopes and vehicle identities reconcile; null/blank/non-finite is unknown, never zero. Parked+max_location_age_minutes fuel Diagnostic_60+min+max_reading_age_hours in ONE call with motion_status:"parked". Powertrain OR: two calls Diagnostic_6E+Diagnostic_BE then union; max_reading_age_hours separates stale; make/model/year is not engine family—never invent limits. EV route range: Diagnostic_2229 with buffered-km min+age; fallback Diagnostic_2334 then subtract fresh range reporters; SoC is not proof of range. Battery Diagnostic_p1040 in one call. Do not list/page vehicles or hand-page diagnostics. No bounds=survey. Saves group. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `save_as` | String | yes | Name to save the resulting group under (lowercase letters/digits/underscore/hyphen, max 64). |
| `channel` | String | yes | Diagnostic channel name (e.g. Diagnostic_2334 = EV battery SoC, Diagnostic_60 = fuel level %). |
| `min` | Number | no | Keep vehicles with reading >= this. Omit both min and max for a population survey. |
| `max` | Number | no | Keep vehicles with reading <= this. |
| `max_reading_age_hours` | Number | no | Keep only vehicles whose latest reading is at most this many hours old (account clock). Readings without a timestamp count as stale — they are not provably fresh. |
| `motion_status` | Enum | no | Current motion filter. 'parked' is accepted and normalized to the upstream value 'parking'. |
| `max_location_age_minutes` | Number | no | Keep only vehicles whose last location is at most this many minutes old (account clock). |
| `source_group` | String | no | Consider only vehicles in an existing group. |

### `ituran_groups_list`

**List the named groups (planner)**

PLANNER: list the named vehicle groups currently alive in this server process ({name, count, seconds_since_last_use}). Groups are in-memory only, expire 15 minutes after last use (any planner access refreshes the timer), and are lost on restart. No upstream calls. Create with ituran_select_vehicles; combine with ituran_groups_combine; fetch rows with ituran_group_get.

_No arguments._

### `ituran_group_get`

**Get the vehicles in a named group (data exit)**

PLANNER paged data exit: use this to page operational summaries for the full vehicle selection in a named group. Summaries omit contact, device, VIN, and internal identifier fields; use the driver tools only when the user explicitly requests contact details. Small selects and ranking tools may already include summaries inline; use this tool when you need the complete selection. Keep page_size modest. Groups expire 15 minutes after last use (ituran_groups_list shows the live ones).

| Argument | Type | Required | Description |
|---|---|---|---|
| `group` | String | yes | Group name from ituran_select_vehicles / ituran_groups_combine. |
| `page_number` | Number | no | 1-based page (default 1). |
| `page_size` | Number | no | Plates per page (default 50). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## info

### `ituran_info_distributor_service_centers`

**List distributor service centers**

Lists the service centers belonging to a named distributor (requires distributor_name). For Ituran's own service centers use ituran_info_ituran_service_centers; for BI groups use ituran_bi_groups. Calls GET /api/v2/info/distributor-service-centers.

| Argument | Type | Required | Description |
|---|---|---|---|
| `distributor_name` | String | yes | Distributor name (required). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_info_ituran_service_centers`

**List Ituran service centers**

Lists Ituran's own service centers (no arguments). For a specific distributor's centers use ituran_info_distributor_service_centers; for BI groups use ituran_bi_groups. Calls GET /api/v2/info/ituran-service-centers.

| Argument | Type | Required | Description |
|---|---|---|---|
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_bi_groups`

**List BI groups**

Lists the business-intelligence (BI) groups available to the current user. For an account-group rollup, call this tool fresh for every request; never reuse a previous group list or memory. Upstream returns a BARE ARRAY of nested trees; this tool retains it under groups and provides _safety_group_ids plus _safety_group_catalog as the complete depth-first list. For downstream rollups, pass every id at every depth, including each root and all descendants; querying only leaves is incomplete. Unrelated to service-center lookups (ituran_info_ituran_service_centers / ituran_info_distributor_service_centers). Calls GET /api/v2/bi/groups.

| Argument | Type | Required | Description |
|---|---|---|---|
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## itc

### `ituran_itc_temperatures_current`

**Get current temperature sensor data (cold chain)**

Current readings from temperature-sensor-equipped (ITC) vehicles: {vehicles:[{license_plate, unit_id, nickname, location, place_names, timestamp, is_engine_on, driver_name, sensors_data[]}]}. A 403 returns a successful unavailable result with unknown readings, freshness, and unit coverage; do not retry or treat its empty vehicles array as evidence of no ITC units. ⚠ The upstream license_plates query filter is IGNORED — when license_plates is provided the tool filters the response CLIENT-SIDE and says so in _note. Timestamps can be stale (sensor last-report time). For history use ituran_itc_temperature_report; for breach episodes use ituran_itc_temperature_exceptions. Calls GET /api/v1/temperatures/current.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plates` | Array | no | Plate filter — IGNORED by upstream; the tool filters the response client-side. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_itc_temperature_report`

**Get temperature history for one ITC vehicle (cold chain)**

Per-sensor temperature HISTORY for ONE ITC vehicle. A 403 returns successful unknown sensor/reporting/-50 coverage; empty sensors is not evidence of no sensors. data_frequency_minutes sets sampling minutes (default 60). The 7-day upstream cap clamps longer windows and flags span_clamped. sensor_id binds upstream. Output pivots repeated vehicle samples into sensor series with min/max/avg and counts -50 disconnected-probe readings separately. Current snapshot: ituran_itc_temperatures_current; breaches: ituran_itc_temperature_exceptions. Calls GET /api/v1/temperatures/report.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | ONE license plate (required upstream). |
| `sensor_id` | Number | no | Optional single-sensor filter (sensor_id from current/report rows). |
| `data_frequency_minutes` | Number | no | Minutes between samples (default 60). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values clamped locally. Required unless range_token is set. |

### `ituran_itc_temperature_exceptions`

**Get temperature breach episodes (cold chain)**

Temperature-breach EPISODES: collapses ~2-minute samples into ≤15-minute-gap episodes with times, duration, sample count, temperature range, and thresholds. On 403, episodes, daily counts, and reconciliation are unavailable; empty is not no breaches. license_plate binds upstream; to_date applies client-side. Retention is ~31 days: old from_dates clamp, and fully expired windows return without a call. Cross-checks ituran_itc_exception_stats and stamps _data_quality on divergence. Prefer one plate and 1–2 day windows. Thresholds: ituran_itc_sensor_settings. Calls GET /api/v1/temperatures/exceptions.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | no | Optional plate filter (binds upstream). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | Upper bound applied CLIENT-SIDE (upstream has no to_date). Required unless range_token is set. |

### `ituran_itc_exception_stats`

**Get per-day temperature breach counts (cold chain)**

Per-day temperature-exception counts — the cold-chain compliance trend in one tiny call (counts are raw breach samples, not episodes; a fully-breached unit-day is ~1,400). A 403 returns a successful unavailable result: daily counts and episode reconciliation are unknown; do not treat its empty per_day array as no breaches. ⚠ Buckets are UTC days while the window is account-local: expect a partial previous-day row at the start and a clipped final day until the window extends past it — `total` is exact either way. The license_plate filter BINDS upstream. For the underlying episodes use ituran_itc_temperature_exceptions. Calls GET /api/v1/temperatures/exceptions/stats/perday.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | no | Optional plate filter (binds upstream). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values clamped locally. Required unless range_token is set. |

### `ituran_itc_sensor_settings`

**Get a temperature sensor's threshold settings (cold chain)**

The threshold document for ONE sensor: {unit_id, sensor_number, top_max_threshold, top_min_threshold, bottom_max_threshold, bottom_min_threshold}. unit_id and sensor_number come from ituran_itc_temperatures_current / ituran_itc_temperature_report rows. ⚠ Upstream can answer 200 with only the ids and NO threshold keys (even where the current row says is_thresholds_active) — that means no threshold document is retrievable, not zero-degree bounds; a _note says so. Calls GET /api/v1/temperatures/{unit_id}/{sensor_number}/settings.

| Argument | Type | Required | Description |
|---|---|---|---|
| `unit_id` | String or Number | yes | Telematics unit id (e.g. from temperatures/current rows). |
| `sensor_number` | Number | yes | Sensor number on that unit. |
| `date` | String | no | Optional as-of date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## maintenance

### `ituran_service_visit_report`

**Correlate vehicle stops with service centers and maintenance**

COMPOSITE: the 'which vehicle stops were near service centers, and is a treatment record nearby?' answer in ONE call. Reads one heat-map window, the service-center directory, and the vehicle maintenance schedule; returns only the nearest center per matched stop and compact treatment date correlation. Date-only to_date is inclusive: pass the user's final calendar date directly; never add a day. All three sources share one paced two-request gate; malformed maintenance evidence is explicit and keeps coverage incomplete; every service-center row also needs nonblank in-range coordinates before the directory is complete. Spatial and temporal proximity are supporting evidence, not proof that service occurred. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | One vehicle license plate. |
| `radius_m` | Number | no | Center proximity radius; default 300 m. |
| `min_dwell_minutes` | Number | no | Minimum continuous same-coordinate stop duration; default 5 minutes. |
| `maintenance_tolerance_days` | Number | no | Maximum day difference for a treatment to count as nearby; default 7 days. |
| `from_date` | String | no | ISO timestamp lower bound. A date-only value starts at 00:00:00. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound. A date-only value includes the full day through 23:59:59. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_inactivity_explanation_report`

**Explain fleet vehicles with no recorded mileage**

COMPOSITE: the 'which vehicles recorded no mileage, for how long, and is there a nearby treatment record?' answer in ONE call. Exhausts the requested fleet window, then uses one shared paced gate to fetch the latest prior trip only for inactive plates, derives inactivity from each vehicle's last positive-distance trip, and correlates performed maintenance separately from scheduled maintenance. Missing maintenance or prior-trip arrays keep coverage incomplete instead of becoming empty evidence. A scheduled next treatment is planning context, not a performed record and not an explanation. A nearby performed record is supporting evidence only, not proof that service caused the inactivity. Telemetry reporting age remains separate from driving inactivity. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (YYYY-MM-DD). Required unless range_token is set. |
| `to_date` | String | no | Inclusive end date (YYYY-MM-DD). Required unless range_token is set. |
| `lookback_days` | Number | no | Days before from_date scanned for the last positive-distance trip; default 30. |
| `maintenance_tolerance_days` | Number | no | Maximum days before/after the requested window for nearby treatment evidence; default 7. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_maintenance_due`

**Maintenance due soon / overdue (composite)**

COMPOSITE: the "which vehicles need service" answer in ONE call. view:"program_audit" gives compact account counts for valid date/odometer targets, no target, and schedule/meter inconsistency; no identity lists/files/exec. Treatment and snapshot requests share one paced gate; missing/malformed treatment rows keep coverage incomplete. Default classifies each row by date and odometer, quarantines inconsistencies, and caps lists at 100. Every user-facing answer states counts.total, counts.odometer_evaluated, counts.odometer_unknown, counts.meter_inconsistent, and counts.schedule_inconsistent; list lengths are not coverage. Prefer over ituran_maintenance_treatments. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Enum | no | Compact account-level program target/inconsistency counts; omit for detailed due-service lists. |
| `within_days` | Number | no | Due-soon horizon in days (default 14). |
| `within_km` | Number | no | Due-soon horizon in km against the current odometer (default 1000). |
| `license_plates` | Array | no | Optional plate filter (normalized). |

### `ituran_maintenance_types`

**List maintenance/treatment types**

Catalog of the account's treatment/maintenance types ({treatments:[{id, name}]}). Use the ids to filter ituran_vehicle_maintenance. 'Maintenance' and 'treatment' are used interchangeably upstream. Calls GET /api/v1/maintenance/type.

| Argument | Type | Required | Description |
|---|---|---|---|
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_maintenance_treatments`

**List maintenance treatments (account-wide)**

ALL maintenance/treatment rows across the account's vehicles — can be large (a 200-vehicle account returned 1,945 rows in ~8s) and slow, and over-cap responses summarize away the dates; for overdue/due-soon planning use ituran_maintenance_due, for one plate ituran_vehicle_maintenance. Returns the same data as ituran_vehicles_maintenance. Calls GET /api/v1/maintenance/treatments.

| Argument | Type | Required | Description |
|---|---|---|---|
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicles_maintenance`

**List maintenance for all customer vehicles**

Maintenance/treatment rows for all customer vehicles — on production this returns the SAME data as ituran_maintenance_treatments; both are wrapped for parity with the upstream catalog. Prefer ituran_vehicle_maintenance for one plate. Calls GET /api/v1/vehicles/maintenance.

| Argument | Type | Required | Description |
|---|---|---|---|
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicle_maintenance`

**Get maintenance for one vehicle**

Maintenance/treatment schedule for ONE vehicle by plate — each row carries the last performed and next due occurrence ({last{...}, next{...}}). Optionally filter to one treatment type id (from ituran_maintenance_types). Calls GET /api/v1/vehicles/{licensePlate}/maintenance.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate. |
| `treatment_id` | Number | no | Optional treatment type id filter. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## places

### `ituran_places_list`

**List places**

Lists saved places (geofences). For a named area/place/geofence, set name_contains: it scans all pages and returns every case-insensitive substring match. If one place matches, pass its place_id to ituran_select_vehicles_in_place; if several match, ask which one. If no saved place matches, stop instead of guessing coordinates/radius. Landmark rows carry point+radius; Area/Route rows derive derived_point (vertex centroid) + derived_radius_m (bounding-disc radius) from their polygon so geo-joins work. Use ituran_places_vehicles_inside for one place's vehicles, ituran_places_stats for per-place counts, and create/update/delete tools to modify places. Calls GET /api/v2/places.

| Argument | Type | Required | Description |
|---|---|---|---|
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–1000. |
| `layer_id` | String or Number | no | Optional layer ID filter. |
| `name_contains` | String | no | Case-insensitive saved-place name substring. Scans all upstream pages; page_number/page_size are ignored when set. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_places_create`

**Create place**

Creates a new place (geofence); body is a pass-through payload (upstream validates required fields). Mutating counterpart to the read-only ituran_places_list; use ituran_places_update to change an existing place and ituran_places_delete to remove one. Calls POST /api/v2/places.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Record | yes | Place body (upstream validates required fields; unknown fields pass through untouched). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_places_update`

**Update place**

Updates an existing place by ID; body is a pass-through payload. Use ituran_places_create to add a new place and ituran_places_delete to remove one; ituran_places_list to browse. Calls PUT /api/v2/places/{place_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `place_id` | String or Number | yes | Place ID. |
| `body` | Record | yes | Place body (upstream validates required fields; unknown fields pass through untouched). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_places_delete`

**Delete place**

Permanently deletes a place by ID; irreversible. Use ituran_places_update to modify instead, or ituran_places_list to browse. Calls DELETE /api/v2/places/{place_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `place_id` | String or Number | yes | Place ID. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_places_vehicles_inside`

**List vehicles inside a place**

Answers 'who is inside saved area X now?' in ONE call. Set exactly one selector: place_id, or place_name for case-insensitive exact/unique-substring resolution; ambiguous names fail with candidates instead of guessing. Use ituran_places_stats for counts across all places. If the upstream endpoint returns a server error, the answer is computed from realtime fleet memberships and marked with _fallback. Calls GET /api/v2/places + GET /api/v2/places/{place_id}/vehicles when resolving by name.

| Argument | Type | Required | Description |
|---|---|---|---|
| `place_id` | String or Number | no | Exact saved place ID. Set place_id OR place_name, not both. |
| `place_name` | String | no | Saved-place name: exact match preferred, otherwise one unique substring. Set place_name OR place_id. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–1000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_places_stats`

**Places stats — current places of user with vehicle counts**

Area occupancy now: occupied_places, unique_vehicles_in_places, overlap, and per-place counts. Set view:"registry_audit" with meter thresholds for a one-call complete geometry audit: missing/strict-radius counts and lossless near-center pair pages. Set view:"fresh_coverage" with freshness_threshold_minutes for all saved zones; every saved-place and fleet-snapshot request shares one paced two-request gate. For a broad board, use counts and do not page uncovered zones; page only for an explicit exhaustive roster/file. format:"csv" is accepted as a no-op. Do not call places_list, vehicles_list, exec, or spawn a sub-agent for composite views. Default occupancy falls back to realtime memberships on upstream 5xx and marks _fallback.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Enum | no | Set fresh_coverage for the saved-zone board or registry_audit for saved-place geometry quality. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |
| `freshness_threshold_minutes` | Number | no | Maximum age of a current location for fresh_coverage; default 30 minutes. |
| `zone_status` | Enum | no | For fresh_coverage, return one lossless page of this status instead of the bounded summary. |
| `zone_page_number` | Number | no | 1-based zone-status page; default 1. |
| `zone_page_size` | Number | no | Rows in a zone-status page; default 100, maximum 200. |
| `small_radius_m` | Number | no | For registry_audit, count usable radii strictly below this value; default 50 meters. |
| `large_radius_m` | Number | no | For registry_audit, count usable radii strictly above this value; default 1000 meters. |
| `near_center_m` | Number | no | For registry_audit, pair usable centers strictly closer than this value; default 100 meters. |
| `pair_page_number` | Number | no | 1-based registry-audit pair page; default 1. |
| `pair_page_size` | Number | no | Nearby-center pairs in a registry-audit page; default 200, maximum 1000. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–1000. |

## reports-bi

### `ituran_fleet_activity_report`

**Get full-fleet odometer, mileage, and maximum-speed report**

COMPOSITE FULL FLEET report. Default returns every current vehicle's device odometer, window distance, average daily distance, and maximum speed; plate-sorted and paginated via metadata.pagination.next_page_number. metadata.report_complete is authoritative: fleet, BI, and trip starts share one paced gate, and all pages, identities, fallback distances, speeds, and activity timestamps must reconcile. bi_periodic=false does not make the report partial when a complete trip sweep supplies distance. For device-versus-GPS odometer divergence in ONE call use view:"meter_divergence"; omit top_n/material_gap_pct unless supplied, assess timestamps/reliability/coverage, and never infer fraud. Lease forecast: view:"lease_forecast" with contract_end and mileage_cap_km.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Enum | no | Set to lease_forecast for a top-runner projection, or meter_divergence for a current device-versus-GPS meter screen. |
| `from_date` | String | no | Report start date; YYYY-MM-DD or an ISO date-time. Required unless range_token is set. |
| `to_date` | String | no | Report end date; YYYY-MM-DD or an ISO date-time. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `contract_end` | String | no | Required for view:"lease_forecast"; account-local contract end date. |
| `mileage_cap_km` | Number | no | Required for view:"lease_forecast"; contract mileage ceiling in km. |
| `top_n` | Number | no | High-mileage population size for view:"lease_forecast" or "meter_divergence". Only set when the user supplies a size; otherwise omit it for the default top 10. |
| `material_gap_pct` | Number | no | Material divergence threshold for view:"meter_divergence". Only set when the user supplies a threshold; otherwise omit it for the default 20 percent. |
| `page_number` | Number | no | 1-based output page. Defaults to 1. |
| `page_size` | Number | no | Requested rows per page. Output is safely capped at 50; follow next_page_number for the full fleet. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_motor_pool_balance`

**Compare mileage and odometers within one same-model vehicle pool**

COMPOSITE: the "same-model pool mileage, odometer comparison, and rotation swap pairs" answer in ONE call. Matches the account's literal make_name+model_name, reports every pool vehicle, the window-distance spread, lifetime-odometer extremes, and high-use↔low-use swap candidates. Pools smaller than 3 return available:false. Use the returned coverage before making a complete-pool claim; do not hand-page vehicle or activity reports. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `make` | String | yes | Exact vehicle make as stored in the account (case-insensitive, no transliteration). |
| `model` | String | yes | Exact vehicle model as stored in the account (case-insensitive, no transliteration). |
| `from_date` | String | no | Comparison-window start; YYYY-MM-DD or an ISO date-time. Required unless range_token is set. |
| `to_date` | String | no | Comparison-window end; YYYY-MM-DD or an ISO date-time. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_driver_workforce_screen`

**Driver rest-gap or activity-retention screen (composite)**

COMPOSITE: answers driver rest-gap/consecutive-day screening OR baseline-to-recent activity-retention screening in ONE call. Both views exhaust BI daily-driver rows, reconcile every row into an explicit valid/malformed/unidentified/day-less partition, and resolve names once. Any excluded row makes coverage incomplete. A BI 403 returns typed unknowns immediately; do not discover, page trips, or substitute trip spans. Rest is an initial screen, not compliance; retention is a check-in list, never proof an employee left. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Enum | yes | Required workforce screen. |
| `from_date` | String | no | Start date (YYYY-MM-DD). |
| `to_date` | String | no | End date (YYYY-MM-DD). |
| `minimum_rest_hours` | Number | no | rest_gaps: flag gaps below this many hours. |
| `maximum_consecutive_days` | Number | no | rest_gaps: flag streaks longer than this many calendar days. |
| `baseline_from_date` | String | no | retention: baseline start date. |
| `baseline_to_date` | String | no | retention: baseline end date. |
| `recent_from_date` | String | no | retention: recent start date. |
| `recent_to_date` | String | no | retention: recent end date. |
| `minimum_baseline_days` | Number | no | retention: activity-day floor. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_reports_bi_driver_timesheet_crosscheck`

**Driver-day payroll conversation cross-check (composite)**

COMPOSITE: the "driver-day activity span versus reported driving duration for a payroll conversation" answer in ONE call. Exhausts the BI daily-driver report, returns whole-row semicolon CSV up to the inline evidence budget with exact kept/dropped coverage, flags only impossible duration-above-span rows, and reconciles pages, conflicting pagination declarations, rows, timestamps, durations, identities, and duplicates. This is telematics evidence for a wage discussion, not a certified attendance record. A BI 403 returns successful typed unavailability without trip paging, discovery, or substitution. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (YYYY-MM-DD). Required unless range_token is set. |
| `to_date` | String | no | End date (YYYY-MM-DD). Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_driver_attribution`

**Driver-attribution report: who drives unattributed (composite)**

COMPOSITE: the 'who drove, and how much driving is unattributed' answer in ONE call — walks BI periodic DRIVERS and VEHICLES plus the driver registry through one paced gate, returning the fleet split, identified drivers ranked by km, and fully-unattributed vehicles. driver_code -1 is unattributed. Pagination drift, incomplete registry evidence, invalid or duplicate identities, code lists, plates, distances, or working-day values keep report_complete false; unregistered is asserted only from an exhaustive registry. If BI entitlement is unavailable, returns a successful unavailable result with unknown metrics and no registry/trip requests. Unattributed km usually means missing driver-ID hardware or sign-in discipline, not a data fault; BI can lag trips. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (YYYY-MM-DD). Required unless range_token is set. |
| `to_date` | String | no | End date (YYYY-MM-DD). Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_working_hours_screen`

**Working-hours duty-of-care screen (composite)**

COMPOSITE: the "who exceeded a working hours threshold" answer in ONE call — walks BI periodic drivers, parses working_time_duration, excludes the unidentified -1 bucket from people, quarantines invalid or impossible-over-window durations, and returns every identified driver above threshold. This is an initial duty-of-care screen, not a legal compliance determination. If BI entitlement is unavailable, returns a successful unavailable result and forbids engine-hours, trip-duration, or first-to-last-trip substitution. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (YYYY-MM-DD). Required unless range_token is set. |
| `to_date` | String | no | End date (YYYY-MM-DD). Required unless range_token is set. |
| `threshold_hours` | Number | yes | Flag identified drivers strictly above this many hours. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_reports_bi_daily_drivers`

**Get daily trips report by driver**

Batch BI report: daily trip metrics (distance, duration, counts) over a period, one row per driver per day. day_start/day_end are the bounds of activity OVERLAPPING the date — a trip spanning midnight contributes its true start (possibly the PREVIOUS day) and day_end can clamp to 23:59:59 while still driving; do not read them as shift start/end times. Use ituran_reports_bi_daily_vehicles to group by vehicle instead, or ituran_reports_bi_periodic_drivers for a single per-driver summary; these are batch reports (POST a body) distinct from the live ituran_trips_*/ituran_events_* tools. Calls POST /api/v2/reports/bi/daily/drivers.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Object | yes | SearchBIReport body: from_date+to_date (YYYY-MM-DD) or the top-level range_token. ⚠ NO body filter key binds upstream (license_plates, driver_codes, vehicle_group_ids, group_ids — all ignored): row-shaped reports apply license_plates/driver_codes CLIENT-SIDE when the result fits one page (_note reports it); idle reports return unfiltered with a warning. total_count is at metadata.pagination. e.g. {"from_date":"2026-06-01","to_date":"2026-06-30"} |
| `sort` | String | no | Field name to sort by, e.g. 'distance' or '-distance' for descending. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_reports_bi_daily_vehicles`

**Get daily trips report by vehicle**

Batch BI report: daily trip metrics (distance, duration, counts) over a period, one row per vehicle per day. day_start/day_end are the bounds of activity OVERLAPPING the date — a trip spanning midnight contributes its true start (possibly the PREVIOUS day) and day_end can clamp to 23:59:59 while still driving; do not read them as shift start/end times. Use ituran_reports_bi_daily_drivers to group by driver instead, or ituran_reports_bi_periodic_vehicles for a single per-vehicle summary; these are batch reports (POST a body) distinct from the live ituran_trips_*/ituran_events_* tools. Calls POST /api/v2/reports/bi/daily/vehicles.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Object | yes | SearchBIReport body: from_date+to_date (YYYY-MM-DD) or the top-level range_token. ⚠ NO body filter key binds upstream (license_plates, driver_codes, vehicle_group_ids, group_ids — all ignored): row-shaped reports apply license_plates/driver_codes CLIENT-SIDE when the result fits one page (_note reports it); idle reports return unfiltered with a warning. total_count is at metadata.pagination. e.g. {"from_date":"2026-06-01","to_date":"2026-06-30"} |
| `sort` | String | no | Field name to sort by, e.g. 'distance' or '-distance' for descending. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_reports_bi_idle_drivers`

**Get idle-percentage report by driver**

Batch BI report: idle-time percentage over a period, grouped by driver. Use ituran_reports_bi_idle_vehicles to group by vehicle instead; these are batch reports (POST a body) distinct from the live ituran_trips_*/ituran_events_* tools. Calls POST /api/v2/reports/bi/idle_percentage/drivers.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Object | yes | SearchBIReport body: from_date+to_date (YYYY-MM-DD) or the top-level range_token. ⚠ NO body filter key binds upstream (license_plates, driver_codes, vehicle_group_ids, group_ids — all ignored): row-shaped reports apply license_plates/driver_codes CLIENT-SIDE when the result fits one page (_note reports it); idle reports return unfiltered with a warning. total_count is at metadata.pagination. e.g. {"from_date":"2026-06-01","to_date":"2026-06-30"} |
| `sort` | String | no | Field name to sort by, e.g. 'distance' or '-distance' for descending. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_reports_bi_idle_vehicles`

**Get idle-percentage report by vehicle**

Batch BI report: idle-time percentage over a period, grouped by vehicle. Use ituran_reports_bi_idle_drivers to group by driver instead; these are batch reports (POST a body) distinct from the live ituran_trips_*/ituran_events_* tools. Calls POST /api/v2/reports/bi/idle_percentage/vehicles.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Object | yes | SearchBIReport body: from_date+to_date (YYYY-MM-DD) or the top-level range_token. ⚠ NO body filter key binds upstream (license_plates, driver_codes, vehicle_group_ids, group_ids — all ignored): row-shaped reports apply license_plates/driver_codes CLIENT-SIDE when the result fits one page (_note reports it); idle reports return unfiltered with a warning. total_count is at metadata.pagination. e.g. {"from_date":"2026-06-01","to_date":"2026-06-30"} |
| `sort` | String | no | Field name to sort by, e.g. 'distance' or '-distance' for descending. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_reports_bi_periodic_drivers`

**Get periodic trips summary by driver**

Batch BI report: summarized trip metrics over a whole period, one summary row per driver (not broken out per day). Use ituran_reports_bi_periodic_vehicles to group by vehicle, or ituran_reports_bi_daily_drivers for a per-day breakdown; these are batch reports (POST a body) distinct from the live ituran_trips_*/ituran_events_* tools. Calls POST /api/v2/reports/bi/periodic/drivers.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Object | yes | SearchBIReport body: from_date+to_date (YYYY-MM-DD) or the top-level range_token. ⚠ NO body filter key binds upstream (license_plates, driver_codes, vehicle_group_ids, group_ids — all ignored): row-shaped reports apply license_plates/driver_codes CLIENT-SIDE when the result fits one page (_note reports it); idle reports return unfiltered with a warning. total_count is at metadata.pagination. e.g. {"from_date":"2026-06-01","to_date":"2026-06-30"} |
| `sort` | String | no | Field name to sort by, e.g. 'distance' or '-distance' for descending. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_reports_bi_periodic_vehicles`

**Get periodic trips summary by vehicle**

Batch BI report: summarized trip metrics over a whole period, one summary row per vehicle (not broken out per day). Use ituran_reports_bi_periodic_drivers to group by driver, or ituran_reports_bi_daily_vehicles for a per-day breakdown; these are batch reports (POST a body) distinct from the live ituran_trips_*/ituran_events_* tools. Calls POST /api/v2/reports/bi/periodic/vehicles.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Object | yes | SearchBIReport body: from_date+to_date (YYYY-MM-DD) or the top-level range_token. ⚠ NO body filter key binds upstream (license_plates, driver_codes, vehicle_group_ids, group_ids — all ignored): row-shaped reports apply license_plates/driver_codes CLIENT-SIDE when the result fits one page (_note reports it); idle reports return unfiltered with a warning. total_count is at metadata.pagination. e.g. {"from_date":"2026-06-01","to_date":"2026-06-30"} |
| `sort` | String | no | Field name to sort by, e.g. 'distance' or '-distance' for descending. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_fleet_trends`

**Fleet trend over recent months (composite)**

COMPOSITE: the "fleet trend over recent months" answer in ONE call — walks BI periodic VEHICLES for 2-6 calendar months through one paced gate and returns monthly fleet totals (km, engine hours, idle share, and fuel for the sensor-equipped subset), month-over-month km deltas, and top vehicle movers between the last two full buckets. Do not issue one BI call per month. Malformed pagination on any page keeps the trend incomplete. For one window by vehicle use ituran_reports_bi_periodic_vehicles; for one vehicle's buckets use ituran_trips_stats. If BI entitlement is unavailable, returns a successful unavailable result without requesting later months. Distances are vehicle-summed fleet truth. Read-only. Calls POST /api/v2/reports/bi/periodic/vehicles.

| Argument | Type | Required | Description |
|---|---|---|---|
| `months` | Number | no | How many calendar months to trend, ending at end_month (default 3). |
| `end_month` | String | no | Last bucket (YYYY-MM; default the current month, clamped to today). |

### `ituran_fuel_efficiency_report`

**Fuel efficiency and sensor coverage report (composite)**

COMPOSITE: fuel litres per 100 km, high-consumption review candidates, and exact fuel-sensor coverage in ONE call. Uses BI periodic vehicle fuel_consumption + total_distance, filters to an identity-reconciled current fleet snapshot, excludes short-distance denominators, and ranks every evaluated fuel-reporting vehicle. Malformed plate identities keep coverage, medians, and candidates unknown. A candidate means the row is at least candidate_above_median_pct above the equipped cohort median; it is not proof of theft, leakage, or misconduct. If BI entitlement is unavailable, this returns an explicit successful unavailable result. Do not call raw BI or substitute ituran_fuel_guard, Diagnostic_96, or Diagnostic_60: fuel-level change is not consumed litres. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (YYYY-MM-DD). Required unless range_token is set. |
| `to_date` | String | no | End date (YYYY-MM-DD). Required unless range_token is set. |
| `min_distance_km` | Number | no | Minimum window distance before L/100 km is evaluated (default 10 km). |
| `candidate_above_median_pct` | Number | no | Candidate threshold above the equipped-cohort median (default 50%). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_utilization_report`

**Fleet utilization and dormancy report (composite)**

COMPOSITE: the "EV telemetry versus rest median distance, active-day share, idle hours and share of engine hours, lowest mileage, no use or stopped reporting, or distance-budget exceptions" answer in ONE call. view:"ev_telemetry" compares complete-roster medians for finite reporters on five EV channels versus the rest, including zero-distance vehicles; telemetry is not drivetrain identification. Other views: "active_days", "idle", "underutilization", and "budget"+km_budget. The roster must reconcile; unavailable/invalid BI evidence triggers a paged trip fallback whose plate, distance, and activity timestamps must reconcile before report_complete. Do not call raw BI idle reports, diagnostics_last, or fleet_activity_report and hand-join pages. Trust complete flags. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (YYYY-MM-DD). Required unless range_token is set. |
| `to_date` | String | no | End date (YYYY-MM-DD). Required unless range_token is set. |
| `km_budget` | Number | no | Optional km allowance for the window — vehicles above it return in over_budget. |
| `view` | Enum | no | "ev_telemetry" compares median distance for vehicles reporting any EV diagnostic channel versus every other classified roster vehicle, including zero-distance vehicles; "active_days" ranks every current-roster vehicle by active-day share and lists zero/all-days plates; "idle" returns every idle row; "underutilization" returns low/zero-distance rows; "budget" requires km_budget and returns every over-budget row. Compact views skip unrelated metrics. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_cost_center_usage_report`

**Vehicle-group cost-center usage report (composite)**

COMPOSITE: the per-vehicle-group cost-center chargeback usage answer in ONE call — loads exact direct group memberships, walks BI periodic vehicle rows, sums kilometres, engine hours and idle hours, reports pairwise membership overlap, and applies optional operator rates. Parent/child structure alone is never called overlap. If BI entitlement is unavailable, returns successful typed unavailability while retaining membership and overlap evidence; do not retry or substitute trip duration for engine hours. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (YYYY-MM-DD). Required unless range_token is set. |
| `to_date` | String | no | Inclusive end date (YYYY-MM-DD). Required unless range_token is set. |
| `rates` | Object | no | Operator rates per km, engine hour, or idle hour; omit if none were supplied. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_pto_billing_report`

**Build PTO duty-cycle billing board**

COMPOSITE: in ONE call, exhaust the BI daily vehicle report and aggregate pto_duration plus zero_speed_pto_duration into per-vehicle PTO hours. This is duty-cycle evidence, not PTO event history. Anomaly rows whose stationary duration exceeds total duration are flagged and excluded from billing; invalid durations are also quarantined. A 403 becomes typed unavailability, never false zero hours or an event-count substitute. Read-only. Calls POST /api/v2/reports/bi/daily/vehicles.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date, account-local YYYY-MM-DD. |
| `to_date` | String | no | End date, account-local YYYY-MM-DD. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## reports-operational

### `ituran_site_speeding`

**Find speed-limit violations inside one saved site**

COMPOSITE: answers 'which speed records exceeded a private/local limit inside saved site X?' in ONE call. Resolves exactly one saved place, freezes the current fleet roster, batches every plate by the upstream five-plate cap, and routes discovery plus every full-report page through one paced two-request gate before independently verifying each returned GPS fix against the saved radius or polygon. Returns the exact boundary, strict speed>limit matches, excluded-row counts, failed plates, and completeness. Use for yards, schools, campuses, and customer sites; use ituran_speed_offenders for posted-road-limit ranking. Do not list vehicles, spawn sub-agents, call per-plate reports, or infer site membership from address text. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `place_id` | String or Number | no | Exact saved place ID. Set place_id OR place_name, not both. |
| `place_name` | String | no | Saved-place name: exact match preferred, otherwise one unique substring. Set place_name OR place_id. |
| `speed_limit_kmh` | Number | yes | Private/local site speed limit in km/h. Only records strictly above it are violations. |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values are clamped locally. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_speed_offenders`

**Rank speed offenders across vehicles (composite)**

COMPOSITE: ranks worst speed over the posted limit, then peak speed, in ONE call. For the CURRENT FULL FLEET omit license_plates: it identity-reconciles the snapshot, defaults to top 25, and returns every proven no-reading and failed plate with exact coverage. Invalid plate/speed evidence keeps no-reading unknown. Explicit subset: up to 500 plates; all ranks return unless top_n is set. REQUIRED window: range_token (for example yesterday), or from_date+to_date. Do not page ituran_vehicles_list, call per-plate reports, or split/retry. Prefer from_speed >=90; busy lower thresholds may time out and remain failed/unknown. Auto-chunks five plates and paginates. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plates` | Array | no | Optional explicit subset of 1-500 plates (0-9/A-Z, no dashes). Omit to scan the current full fleet. |
| `from_speed` | Number | yes | Threshold km/h — only readings at/above this speed count (e.g. 90). |
| `top_n` | Number | no | Ranked rows to return. Full-fleet mode defaults to 25; explicit subsets default to all rows. |
| `format` | Literal | no | 'json' is accepted as a no-op hint; output is always JSON. |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values are clamped locally. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_reports_events`

**Run the historical events report**

Detailed historical EVENT records (including which alert fired), auto-paginated over <3-day windows with cursor dedupe. Filters: plates (≤5), event_ids, alert_ids, driver_ids, place_ids. Distinct from live ituran_events_list (recent per-vehicle occurrences) and from the BI aggregates. Requires API_Reports + CanRunReports/CanRunMessageReport. Calls POST /api/v2/reports/events-report.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plates` | Array | yes | License plates (0-9/A-Z, no dashes) — REQUIRED, 1-5 plates per call (upstream cap). For a fleet-wide report, batch plates 5 at a time (e.g. from ituran_group_get or ituran_vehicles_list). |
| `event_ids` | Array | no | Event definition ids (see ituran_event_definitions_list). |
| `alert_ids` | Array | no | Alert ids (see ituran_alerts_list). |
| `driver_ids` | Array | no | Driver ids. |
| `place_ids` | Array | no | Place ids. |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values are clamped locally. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `records_limit` | Number | no | Records-per-page hint. Values above the upstream cap are safely capped at 1000; the tool auto-paginates. |

### `ituran_reports_engine_activity`

**Run the engine/switch activity report**

Ignition on/off timeline per vehicle (engine/switch activity), auto-paginated; each plate is fetched in its OWN upstream request (multi-plate feeds are silently thinned upstream). By default consecutive same-state heartbeats collapse to transitions DURING paging (dense feeds don't exhaust the record cap) — rows {license_plate, activity, timestamp, activity_until, repeats, position_drift_km, address}; set transitions_only:false for the raw feed. A vehicle that moves during a SwitchOff run is flagged _data_quality.switch_semantics_suspect — corroborate with trips/BI before treating the feed as ignition truth. Requires API_Reports + CanRunReports/CanRunMessageReport. Calls POST /api/v2/reports/engine-and-switch-activity.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plates` | Array | yes | License plates (0-9/A-Z, no dashes) — REQUIRED, 1-5 plates per call (upstream cap). For a fleet-wide report, batch plates 5 at a time (e.g. from ituran_group_get or ituran_vehicles_list). |
| `activity` | Array | no | Filter to SwitchOn/SwitchOff records (default: both). |
| `transitions_only` | Boolean | no | Collapse consecutive same-activity heartbeats per vehicle into the state transitions (default true). |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values are clamped locally. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `records_limit` | Number | no | Records-per-page hint. Values above the upstream cap are safely capped at 1000; the tool auto-paginates. |

### `ituran_reports_speed`

**Run the speed-violations report**

Speed-violation records above a threshold, auto-paginated. from_speed (km/h) is REQUIRED and must be > 0 (upstream: 'Speed must be greater than zero'). Rows: {record_id, license_plate, vehicle_nickname, driver, location, speed, heading, timestamp}. Calls POST /api/v2/reports/speed-report.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_speed` | Number | yes | Speed threshold in km/h (REQUIRED, > 0). |
| `license_plates` | Array | yes | License plates (0-9/A-Z, no dashes) — REQUIRED, 1-5 plates per call (upstream cap). For a fleet-wide report, batch plates 5 at a time (e.g. from ituran_group_get or ituran_vehicles_list). |
| `driver_ids` | Array | no | Driver ids (from ituran_drivers_list). |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values are clamped locally. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `records_limit` | Number | no | Records-per-page hint. Values above the upstream cap are safely capped at 1000; the tool auto-paginates. |

### `ituran_reports_full`

**Run the full activity report**

The full per-vehicle activity report (all record kinds), auto-paginated over <3-day windows. Heavier than the specific reports — prefer ituran_reports_events / ituran_reports_engine_activity / ituran_reports_speed when you know what you need. Calls POST /api/v2/reports/full-report.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plates` | Array | yes | License plates (0-9/A-Z, no dashes) — REQUIRED, 1-5 plates per call (upstream cap). For a fleet-wide report, batch plates 5 at a time (e.g. from ituran_group_get or ituran_vehicles_list). |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values are clamped locally. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `records_limit` | Number | no | Records-per-page hint. Values above the upstream cap are safely capped at 1000; the tool auto-paginates. |

### `ituran_reports_diagnostics`

**Run the diagnostics report**

Historical diagnostics report rows, auto-paginated. For the CURRENT sensor snapshot use ituran_diagnostics_last; for a raw ≤1-day time series use ituran_diagnostics_history. Calls POST /api/v2/reports/diagnostics-report.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plates` | Array | yes | License plates (0-9/A-Z, no dashes) — REQUIRED, 1-5 plates per call (upstream cap). For a fleet-wide report, batch plates 5 at a time (e.g. from ituran_group_get or ituran_vehicles_list). |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values are clamped locally. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `records_limit` | Number | no | Records-per-page hint. Values above the upstream cap are safely capped at 1000; the tool auto-paginates. |

### `ituran_reports_stop_productivity`

**Compare completed-trip and qualifying-dwell stop productivity**

COMPOSITE: answer a multi-vehicle 'completed trips versus stops lasting at least N minutes' productivity question in ONE call. Exhausts the trip pages once, runs bounded heat-map scans internally, and returns per vehicle distance, completed trip ends, qualifying same-coordinate dwell stops, and km per stop under BOTH definitions. Zero denominators return null; missing located dwell coverage stays unknown, never zero. Returns no driver, address, or coordinates. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plates` | Array | yes | Vehicles to compare; normalized and de-duplicated. Maximum 25 per call. |
| `min_dwell_minutes` | Number | yes | Minimum continuous same-coordinate dwell duration in minutes. |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values are clamped locally. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_place_dwell_evidence`

**Estimate one vehicle's dwell time inside a saved place**

COMPOSITE: answer 'when did vehicle X dwell at saved place Y?' in ONE call. Resolves exactly one saved place, reads one vehicle's heat-map, and returns only actual collapsed STOPS at least min_dwell_minutes long (default 5) whose coordinates fall inside the saved radius or polygon bounding disc. Drive-through trace points below the dwell threshold are excluded. Returns entry/exit timestamps, durations, geometry and observed coverage. This is geometric evidence, not a signed gate log. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | ONE license plate. |
| `place_id` | String or Number | no | Exact saved place ID. Set place_id OR place_name, not both. |
| `place_name` | String | no | Saved-place name: exact match preferred, otherwise one unique substring. Set place_name OR place_id. |
| `min_dwell_minutes` | Number | no | Minimum continuous same-coordinate stop duration; default 5 minutes. |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values are clamped locally. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_place_visitors`

**Find fleet vehicles that visited a saved place**

COMPOSITE: saved-place visits and dwell in ONE call. For arrival punctuality use view:"arrival_punctuality" + target_time; it classifies every exact-boundary trip end as on-time/early or late. For yard turnaround use view:"yard_turns" + target_minutes; optional overnight_threshold_minutes defaults to 360. Do not call trips_search, heat-map, or exec. Set exactly one selector: place_id or place_name; ambiguous names return candidates. 'this week'/"השבוע"=this_week; 'last week'/"שבוע שעבר"=last_week. Returns coverage and exact-boundary evidence. Never present vehicle_nickname as a driver. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Enum | no | Set yard_turns to pair in-site trip endpoints, or arrival_punctuality to classify trip ends against target_time. |
| `place_id` | String or Number | no | Exact saved place ID. Set place_id OR place_name, not both. |
| `place_name` | String | no | Saved-place name: exact match preferred, otherwise one unique substring. Set place_name OR place_id. |
| `min_visit_minutes` | Number | no | Keep vehicles with at least one continuous visit lasting this many minutes (e.g. 60 = one hour). |
| `target_minutes` | Number | no | Required with view:"yard_turns": immutable turnaround target in minutes. |
| `overnight_threshold_minutes` | Number | no | With view:"yard_turns", exclude gaps at or above this duration (default 360 minutes). |
| `target_time` | String | no | Required with view:"arrival_punctuality": daily target in HH:mm account-local time. |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values are clamped locally. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_reports_heatmap`

**Run the heat-map report for one vehicle**

Where ONE vehicle drives and STOPS: by default returns the stops (dwell points where the vehicle stayed >= min_dwell_minutes, default 5 — {lat, lon, from, to, samples, duration_minutes}) plus a transit_summary aggregating the in-motion samples (while driving every GPS sample is a fresh coordinate — raw points drown the response). near: {lat, lon, radius_km} answers "when was the vehicle at/near X": visit EPISODES (from/to/duration, drive-throughs included) with coverage evidence. min_dwell_minutes:0 returns every collapsed dwell point under `points`; collapse:false returns the raw upstream shape ({license_plate, headers[3], records[]}). Takes a SINGULAR license_plate (required — upstream: 'Plate is required'); not cursor-paged. Calls POST /api/v2/reports/heat-map.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | ONE license plate (singular — this report is per-vehicle). |
| `time_filtering` | Array | no | Time-of-day windows: ARRAY of {from_time: 'HH:mm', to_time: 'HH:mm', weekdays?: [0-6]}; weekdays defaults to ALL days when omitted (upstream 500s without it); a bare object 400s. e.g. [{"from_time":"00:00","to_time":"05:00"}] |
| `collapse` | Boolean | no | Collapse consecutive same-coordinate samples into dwell points (default true). |
| `min_dwell_minutes` | Number | no | Dwell points spanning at least this many minutes return as stops; shorter ones aggregate into transit_summary (default 5; 0 = return the full dwell trace). |
| `near` | Object | no | Geographic filter — "when was the vehicle at/near X": returns visit EPISODES (from/to/duration_minutes, samples, min_distance_km) where the trace came within radius_km of the center; drive-throughs count, not only stops. Replaces the stops/transit split; requires the collapsed trace (do not pass collapse:false). e.g. {"lat":32.98,"lon":35.69,"radius_km":2} |
| `from_date` | String | no | ISO timestamp lower bound. Required unless range_token is set. |
| `to_date` | String | no | ISO timestamp upper bound; future values are clamped locally. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_reports_overnight_parking`

**Report dominant overnight parking by night**

COMPOSITE: answer overnight parking in ONE call. Fleet-wide "outside every saved place": use view:"fleet_unmapped_stops"; omit dates for the most recent fully completed account-local 00:00–05:00 night. Freezes the roster, exhausts saved places, checks exact radius/polygon geometry, and returns each candidate's longest 60+ minute stop. These are unmapped stops, not necessarily unsafe parking. For one vehicle, pass license_plate plus dates; it clusters fixes within 200 m, selects each night's longest dwell, and classifies saved geometry. A saved place is not authorization policy: pass authorized_place_ids or authorization stays unknown. Starts are paced; malformed envelopes make coverage incomplete. Do not fan out heat-map, trip, place, code, or sub-agent calls. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Literal | no | Fleet-wide one-night screen for 60+ minute stops outside every exact saved-place geometry. |
| `license_plate` | String | no | One vehicle license plate; required unless view:"fleet_unmapped_stops". |
| `from_date` | String | no | First account-local night date, inclusive. |
| `to_date` | String | no | Last account-local night date, inclusive; maximum 31 nights. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `from_time` | String | no | Daily night-window start; default 00:00. |
| `to_time` | String | no | Daily night-window end; default 05:00 and must be later than from_time. |
| `min_dwell_minutes` | Number | no | Minimum continuous parking-cluster dwell; default 60 minutes. |
| `cluster_radius_m` | Number | no | Maximum distance from a cluster's first fix; default 200 metres. |
| `authorized_place_ids` | Array | no | Exact saved-place IDs the operator treats as authorized parking. Omit when policy is unavailable; saved-place membership alone does not prove authorization. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_recurring_stop_candidates`

**Find recurring stops outside saved places**

COMPOSITE: find one vehicle's recurring unsaved stop locations in ONE call. For a count such as '2 workdays', pass workday_count to use the latest completed Sunday–Thursday account-local workdays without clarification; otherwise pass exact completed work_dates. It fetches each full day once, infers dwell clusters, exhausts saved places, checks exact radius and polygon geometry, and returns only mapping candidates seen on a strict majority of requested workdays by default. Workday starts are paced and malformed heat-map or place envelopes keep coverage incomplete. These are recurring-stop candidates, not proof of a route, customer visit, or unauthorized parking. Do not call places_list, reports_heatmap, place_dwell_evidence, exec, or sub-agents separately. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | One vehicle license plate. |
| `work_dates` | Array | no | Distinct completed account-local workday dates; minimum 2, maximum 31. |
| `workday_count` | Number | no | Use instead of work_dates for the latest completed Sunday–Thursday account-local workdays; minimum 2, maximum 31. |
| `min_dwell_minutes` | Number | no | Minimum inferred dwell duration; default 5 minutes. |
| `cluster_radius_m` | Number | no | Maximum distance for one dwell or recurring cluster; default 250 metres. |
| `recurrence_min_days` | Number | no | Required distinct workdays; default is a strict majority of the resolved dates. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicle_saved_place_visits`

**List one vehicle's visits to all saved places**

COMPOSITE: list one vehicle's qualifying visits to every matching saved place in ONE call. Exhausts saved places, fetches one heat map, checks exact radius and polygon geometry, preserves overlapping matches, and returns arrival, departure, and duration evidence through one paced two-slot request gate. Incomplete registry or geometry coverage keeps the result incomplete. The registry's customer-site classification is not exposed, so do not infer it from name, type, or geometry. This proves vehicle presence, not a worker visit or service delivery. Do not call places_list, reports_heatmap, reports_full, exec, or sub-agents separately. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | One complete vehicle license plate; call directly. |
| `from_date` | String | no | Account-local window start. |
| `to_date` | String | no | Account-local window end. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `min_dwell_minutes` | Number | no | Minimum inferred dwell duration; default 5 minutes. Set 0 to retain all collapsed dwell points. |
| `cluster_radius_m` | Number | no | Maximum distance for one continuous dwell cluster; default 200 metres. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_saved_place_vehicle_overlap`

**Find saved places visited by multiple fleet vehicles**

COMPOSITE: scan the entire fleet and every saved place for one date in ONE call. Fetches one heat map per normalized plate through one paced two-slot request gate, infers qualifying dwell stops, checks exact saved radius and polygon geometry, and returns only places visited by at least two distinct vehicles. A row is same-day co-visitation evidence, not proof of simultaneous presence or duplicate dispatch. Do not call discover, places_list, trips_search, reports_heatmap, exec, or sub-agents separately. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `date` | String | yes | One complete account-local date. |
| `min_dwell_minutes` | Number | no | Minimum inferred dwell duration; default 5 minutes. |
| `cluster_radius_m` | Number | no | Maximum distance for one continuous dwell cluster; default 200 metres. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_preparation_time_report`

**Measure ignition-to-movement preparation time**

COMPOSITE: in ONE call, pair every SwitchOn transition for one vehicle and account-local date with the next moving trip within a configurable window (default 30 minutes). Stationary trip rows do not count as movement. Units flagged switch_semantics_suspect because they moved during SwitchOff are skipped. Returns pair evidence, unmatched ignitions, mean seconds, and explicit engine/trip coverage. This is an ignition proxy, not dispatch-notification turnout time. Do not call discover, engine_activity, or trips_search separately. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | One vehicle license plate; dashes and spaces are normalized. |
| `date` | String | yes | One complete account-local date. |
| `preparation_window_minutes` | Number | no | Maximum ignition-to-movement interval; defaults to 30 minutes. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_return_to_base_report`

**Screen current return-to-base status after curfew**

COMPOSITE: answers which fleet vehicles are outside an operator-approved list of saved sites after a local curfew in ONE call. Scans saved places once, freezes one full fleet/location snapshot, checks exact saved radius or polygon boundaries, and returns each outside vehicle's last address and location age. Unusually narrow saved boundaries are explicit and must be disclosed. Location is last-known evidence, not proof of current use. Do not call places_list, select_vehicles, select_vehicles_in_place, or group_get separately. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `authorized_place_names` | Array | yes | Exact saved-place names approved by the operator; every name must resolve uniquely. |
| `curfew_time` | String | yes | Daily local curfew in HH:mm. |
| `freshness_threshold_minutes` | Number | yes | A location older than this is labeled stale; default 30 minutes. |

### `ituran_service_territory_report`

**Rank vehicles outside a current service-territory circle**

COMPOSITE: answers which fleet vehicles are outside an operator-supplied center and radius in ONE call. Freezes one full fleet/location snapshot, partitions every located vehicle by exact haversine distance, and returns a lossless outside roster ranked farthest first with account-current location ages. A stale last-known fix is not proof of unauthorized use. Do not call select_vehicles, group_get, or exec to recreate this report. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `center_lat` | Number | yes | Service-territory center latitude. |
| `center_lon` | Number | yes | Service-territory center longitude. |
| `radius_km` | Number | yes | Service-territory circle radius in kilometers. |
| `freshness_threshold_minutes` | Number | yes | A location older than this is labeled stale; default 30 minutes. |

### `ituran_guard_tour_report`

**Verify one vehicle's checkpoint coverage during a shift**

COMPOSITE: answers whether ONE vehicle passed every named saved-place checkpoint during a shift in ONE call. Resolves all exact checkpoint names in one place scan, fetches one unfiltered vehicle activity report, independently checks exact saved radius or polygon membership, and partitions checkpoints into visited, missed, or unknown. The GPS feed is sampled, so a missed checkpoint is negative telemetry evidence rather than a signed gate-log fact. Do not call place_visitors, reports_heatmap, trips_search, or trips_points separately. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | One patrol vehicle license plate. |
| `checkpoint_names` | Array | yes | Exact saved-place names for every checkpoint, in the operator's requested order. |
| `from_date` | String | no | Account-local ISO lower bound. Required unless range_token is set. |
| `to_date` | String | no | Account-local ISO upper bound; future values are clamped. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

## safety

### `ituran_safety_hotspots`

**Rank fleet harsh-driving hotspots (composite)**

COMPOSITE: the fleet-wide harsh-driving hotspot answer in ONE call. Exhausts all trip and safety-event pages through one paced gate; every envelope and declared total must reconcile. Filters the exact window and groups authoritative coordinates into latitude-adjusted ~200 m cells. Returns ranked cells, event types, no-location count, fleet/page coverage, and road-exposure/grid-boundary warnings. Do not page trips, sample vehicles, use operational reports_events, infer safety events from E_141 telemetry, spawn agents, or externally geocode coordinates. Read-only. Calls GET /api/v2/vehicles + /trips + /trips/{id}/safety.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (yyyy-MM-dd), inclusive. Required unless range_token is set. |
| `to_date` | String | no | End date (yyyy-MM-dd), inclusive. Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `cell_size_m` | Number | no | Approximate grid-cell width/height in metres (default 200). |
| `minimum_events` | Number | no | Only rank cells with at least this many events (default 1). |
| `top_n` | Number | no | Maximum ranked cells returned (default 25). |

### `ituran_safety_exposure_rank`

**Rank drivers by safety events per 100 km (composite)**

COMPOSITE: answers exposure-normalized driver safety ranking in ONE call. Walks every ituran_safety_ubi_drivers page, sums its documented safety-event counters, divides by total_trips_distance to return events per 100 km, applies minimum_km before ranking, excludes driver_code -1, and resolves names with one FULL driver registry walk. Returns explicit mileage/event sources, exclusions, pagination-declaration drift, and completeness coverage. Do not call raw UBI pages or driver lookup tools yourself. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (yyyy-MM-dd), account-local. |
| `to_date` | String | no | End date (yyyy-MM-dd), account-local. |
| `minimum_km` | Number | no | Minimum UBI distance for inclusion (default 10 km). |
| `top_n` | Number | no | Maximum ranked rows to return (default 10). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_safety_rank_drivers`

**Rank drivers by safety, names resolved (composite)**

COMPOSITE: the 'rank my drivers' answer in ONE call — walks all /safety/drivers pages, marks pagination conflicts incomplete, sorts by safety_grade (riskiest lowest; 'safest' inverts), resolves names from the FULL cached registry, and returns top N. driver_code -1 is unidentified; registry-absent codes are UNREGISTERED and best-effort named from trip rows (name_source:'trips'). Prefer this over calling ituran_safety_drivers + ituran_drivers_list. Read-only. Calls paged Safety + registry + bounded trips for unnamed codes.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (yyyy-MM-dd), in the PAST, account-local. Required unless range_token is set. |
| `to_date` | String | no | End date (yyyy-MM-dd); must not be in the future (clamped locally). Required unless range_token is set. |
| `direction` | Enum | no | Rank order (default riskiest = lowest safety_grade first). |
| `n` | Number | no | How many drivers to return (default 10). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_safety_eco_driver_scoreboard`

**Score drivers by safety, fuel, and idle share (composite)**

COMPOSITE: the 'weighted driver score from safety, fuel, and idle share' answer in ONE call. Applies caller weights to safety_grade, fuel_grade, and (100-idle_share_pct), returns every identified driver with all components plus exact source/join coverage, and publishes the formula. It checks BI idle entitlement FIRST: unavailable returns a successful unknown count and stops without calling Safety. Do not call raw safety_drivers, BI idle, registry, or background tools yourself. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (yyyy-MM-dd), in the PAST, account-local. Required unless range_token is set. |
| `to_date` | String | no | End date (yyyy-MM-dd); must not be in the future (clamped locally). Required unless range_token is set. |
| `safety_weight_pct` | Number | yes | Safety-grade weight as percentage points. |
| `fuel_weight_pct` | Number | yes | Fuel-grade weight as percentage points. |
| `idle_weight_pct` | Number | yes | Idle-discipline weight as percentage points, applied to 100 - idle_share_pct. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_safety_risk_exposure`

**Find the highest-mileage driver in a low-safety cohort (composite)**

COMPOSITE for 'among the lowest-safety/risky drivers, who drove the most': ranks the lowest safety grades across every /safety/drivers page, resolves names, excludes the unidentified -1 bucket from the person cohort, then makes ONE /safety/ubi/drivers request through the same paced two-request gate, filtered to those exact driver_codes, and sorts by total_trips_distance. Use this instead of BI periodic reports, trips paging, or one coaching call per driver. Coverage names every low-score driver missing UBI exposure; missing means unknown, not zero km. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (yyyy-MM-dd), in the PAST, account-local. Required unless range_token is set. |
| `to_date` | String | no | End date (yyyy-MM-dd); must not be in the future (clamped locally). Required unless range_token is set. |
| `n` | Number | no | Size of the lowest-safety identified-driver cohort (default 20). |
| `only_active_policies` | Boolean | no | Restrict exposure to active insurance policies (default false = all attributed exposure). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

### `ituran_safety_vehicles`

**Get per-vehicle safety grades**

Safety grades + harsh-event counts per VEHICLE over a date range. Use ituran_safety_drivers to rank drivers instead, ituran_safety_totals for one fleet-wide grade, and ituran_safety_periodic for a trend series. 404.1 = vehicle not enrolled in the safety service (report as 'no safety data', NOT as safe driving). Calls POST /api/v2/safety/vehicles.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (yyyy-MM-dd), in the PAST, account-local. Required unless range_token is set. |
| `to_date` | String | no | End date (yyyy-MM-dd); must not be in the future (clamped locally). Required unless range_token is set. |
| `vehicles` | Record | no | Vehicle filter object per the SearchSafety swagger (e.g. { license_plates: [...] }). |
| `drivers` | Record | no | Driver filter object — verified key: driver_codes (array of codes, int or string; e.g. {"driver_codes": [123]}). '-1' = unidentified; resolve names via ituran_drivers_list or ituran_safety_rank_drivers. |
| `vehicle_status` | Enum | no | Vehicle service-status filter: default (user preference / 0), all (1), or only_active (3). |
| `additional_fields` | Array | no | Extra fields. Valid: safety_trend. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_safety_drivers`

**Get per-driver safety grades**

Safety grades per DRIVER over a date range. view:"before_after" owns exhaustive driver-name/code resolution plus both equal-length safety windows in ONE call, paces every Safety request start 400 ms apart with at most two scans in flight, and returns grade/event deltas, lossless semicolon evidence, and explicit registry/filter/page coverage; provide driver_query and both windows. A Safety 404 or missing window row stays typed unavailable with null metrics, never zero or improvement. Without the view, rows are keyed by driver_code ("-1" is unidentified). Calls GET /api/v2/drivers + POST /api/v2/safety/drivers.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Literal | no | Compare one driver's two equal-length safety windows. |
| `driver_query` | String | no | Required for view:"before_after"; exact driver code/name or an unambiguous name fragment. |
| `baseline_from_date` | String | no | Required for view:"before_after". |
| `baseline_to_date` | String | no | Required for view:"before_after". |
| `recent_from_date` | String | no | Required for view:"before_after". |
| `recent_to_date` | String | no | Required for view:"before_after". |
| `from_date` | String | no | Start date (yyyy-MM-dd), in the PAST, account-local. Required unless range_token is set. |
| `to_date` | String | no | End date (yyyy-MM-dd); must not be in the future (clamped locally). Required unless range_token is set. |
| `vehicles` | Record | no | Vehicle filter object per the SearchSafety swagger (e.g. { license_plates: [...] }). |
| `drivers` | Record | no | Driver filter object — verified key: driver_codes (array of codes, int or string; e.g. {"driver_codes": [123]}). '-1' = unidentified; resolve names via ituran_drivers_list or ituran_safety_rank_drivers. |
| `vehicle_status` | Enum | no | Vehicle service-status filter: default (user preference / 0), all (1), or only_active (3). |
| `additional_fields` | Array | no | Extra fields. Valid: safety_trend. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_safety_totals`

**Get fleet-wide safety totals**

ONE fleet-wide safety grade + fuel grade + per-event-group breakdown over a date range (verified shape: {totals:{safety_grade, fuel_grade, event_groups[]}}). For per-vehicle/per-driver grades use ituran_safety_vehicles / ituran_safety_drivers. Calls POST /api/v2/safety/totals.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (yyyy-MM-dd), in the PAST, account-local. Required unless range_token is set. |
| `to_date` | String | no | End date (yyyy-MM-dd); must not be in the future (clamped locally). Required unless range_token is set. |
| `vehicles` | Record | no | Vehicle filter object per the SearchSafety swagger (e.g. { license_plates: [...] }). |
| `drivers` | Record | no | Driver filter object — verified key: driver_codes (array of codes, int or string; e.g. {"driver_codes": [123]}). '-1' = unidentified; resolve names via ituran_drivers_list or ituran_safety_rank_drivers. |
| `vehicle_status` | Enum | no | Vehicle service-status filter: default (user preference / 0), all (1), or only_active (3). |
| `additional_fields` | Array | no | Extra fields. Valid: safety_trend, safety_event_groups_normalized, safety_grade_control_group. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_safety_groups`

**Get safety grades per vehicle-group**

Safety + fuel grade per vehicle-group. Call fresh for every request, especially relative windows; never reuse a previous result or memory. REQUIRES group_ids from ituran_bi_groups: pass every _safety_group_ids id, including each root and all descendants. Upstream honors only the first multi-id value, so the tool queries each id through one two-slot, 400 ms gate and merges matching rows. _coverage separates groups_without_data from failed_group_ids, invalid_response_group_ids, and malformed_group_rows; do not split/retry. End must be clearly past; prefer range_token=yesterday/last_week. Calls GET /api/v2/safety/groups.

| Argument | Type | Required | Description |
|---|---|---|---|
| `group_ids` | Array | yes | Every BI-group id at every depth, including each root and all descendants. |
| `from_date` | String | no | Start datetime, account-local. Required unless range_token is set. |
| `to_date` | String | no | End datetime, account-local, clearly in the past. Required unless range_token is set. |
| `vehicle_status` | Enum | no | Vehicle service-status filter: default (user preference / 0), all (1), or only_active (3). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_safety_periodic`

**Get periodic safety trend**

Safety + fuel grade per period (daily or monthly buckets) over a date range — the trend series (verified shape: {safety:[{period_start, period_end, safety_grade, fuel_grade}]}). period_type is REQUIRED upstream (verified: omitting it 400s) — it defaults to daily here. For a single overall grade use ituran_safety_totals. Calls POST /api/v2/safety/periodic.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (yyyy-MM-dd), in the PAST, account-local. Required unless range_token is set. |
| `to_date` | String | no | End date (yyyy-MM-dd); must not be in the future (clamped locally). Required unless range_token is set. |
| `vehicles` | Record | no | Vehicle filter object per the SearchSafety swagger (e.g. { license_plates: [...] }). |
| `drivers` | Record | no | Driver filter object — verified key: driver_codes (array of codes, int or string; e.g. {"driver_codes": [123]}). '-1' = unidentified; resolve names via ituran_drivers_list or ituran_safety_rank_drivers. |
| `vehicle_status` | Enum | no | Vehicle service-status filter: default (user preference / 0), all (1), or only_active (3). |
| `period_type` | Enum | no | Bucket size (default daily; REQUIRED upstream). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_safety_ubi_vehicles`

**Get UBI insurance scores per vehicle**

Usage-based-insurance scoring per VEHICLE: trip distances (day/night split), trip counts, ISO-8601 durations, harsh-event counters (acceleration/braking/turns/curve/bypassing/overspeeding, medium+high), safety grade. only_active_policies is REQUIRED. For per-driver UBI use ituran_safety_ubi_drivers. Calls POST /api/v2/safety/ubi/vehicles.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (yyyy-MM-dd), in the PAST, account-local. Required unless range_token is set. |
| `to_date` | String | no | End date (yyyy-MM-dd); must not be in the future (clamped locally). Required unless range_token is set. |
| `only_active_policies` | Boolean | yes | REQUIRED by upstream (SearchSafetyWithPolicies): restrict to active insurance policies. |
| `vehicles` | Record | no | Vehicle filter object per the SearchSafety swagger (e.g. { license_plates: [...] }). |
| `drivers` | Record | no | Driver filter object — verified key: driver_codes (array of codes, int or string; e.g. {"driver_codes": [123]}). '-1' = unidentified; resolve names via ituran_drivers_list or ituran_safety_rank_drivers. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_safety_ubi_drivers`

**Get UBI insurance scores per driver**

Usage-based-insurance scoring per DRIVER (keyed by driver_code; '-1' = unidentified), same metric set as ituran_safety_ubi_vehicles plus the plates driven. only_active_policies is REQUIRED. Calls POST /api/v2/safety/ubi/drivers.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | Start date (yyyy-MM-dd), in the PAST, account-local. Required unless range_token is set. |
| `to_date` | String | no | End date (yyyy-MM-dd); must not be in the future (clamped locally). Required unless range_token is set. |
| `only_active_policies` | Boolean | yes | REQUIRED by upstream (SearchSafetyWithPolicies): restrict to active insurance policies. |
| `vehicles` | Record | no | Vehicle filter object per the SearchSafety swagger (e.g. { license_plates: [...] }). |
| `drivers` | Record | no | Driver filter object — verified key: driver_codes (array of codes, int or string; e.g. {"driver_codes": [123]}). '-1' = unidentified; resolve names via ituran_drivers_list or ituran_safety_rank_drivers. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_driver_coaching_brief`

**Driver coaching brief (composite)**

COMPOSITE: the 'build a coaching brief for this driver' answer in ONE call — km/working days, safety grade/trend/event mix, registry-or-trip name, worst trips, and every event from the exhaustively paged worst trip. All requests share one paced gate. coverage.report_complete requires Safety and trips to engage the driver filter, valid ranking evidence, and a reconciled event walk; empty/404.1 Safety stays distinct from failure and unavailable BI/trip metrics stay null. driver_code -1 is unidentified and rejected; rank it via ituran_safety_rank_drivers. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `driver_code` | String | yes | The driver code (numeric string; keypad codes work). -1 is rejected. |
| `from_date` | String | no | Start date (yyyy-MM-dd), in the PAST, account-local. Required unless range_token is set. |
| `to_date` | String | no | End date (yyyy-MM-dd); must not be in the future (clamped locally). Required unless range_token is set. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |

## trips

### `ituran_claim_evidence`

**Build timestamp-anchored claim evidence**

COMPOSITE: answer a claim/FNOL timestamp question in ONE call. It queries the claim's whole account-local day and the next day because upstream trip filtering is based on trip boundaries, selects the trip whose interval contains the instant, exhausts that trip's point pages, excludes no-fix sentinels, and returns the nearest valid location/speed samples before and after. Driver identity is quoted only from the same containing trip row. Missing or malformed trip/point envelopes and invalid trip-boundary or point timestamps keep coverage incomplete rather than becoming empty evidence. This is timestamp-anchored claims evidence, not crash detection. Do not fan out trips search, points, driver, local-code, or sub-agent calls. Read-only.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | One vehicle license plate. |
| `claim_time` | String | yes | Claim instant in account-local time, for example 2026-07-20T14:32:00. |
| `samples_each_side` | Number | no | Nearest valid samples to return before and after the instant; defaults to 3 per side. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_trips_search`

**Search trips**

Trips. ONE call/no-spawn fleet views: view:"congestion_exposure"=circle endpoints+charge windows; misses through-traffic; view:"insurance_renewal" one call=distance+night+safety+speed+driver ID; view:"trip_continuity"=no-fix jumps; view:"driver_code_overlap"+last_24_hours=cross-vehicle code overlap; view:"fleet_concurrency"=simultaneous+reserve; view:"route_efficiency"=route/straight-line; view:"night_distance_share"; view:"peak_hour_share"; view:"short_trip_distribution"=<2/2–10/10+km, suspects separate; view:"continuous_driving" 1d; view:"shift_punctuality" 1d; view:"driver_identification"=driver_code; view:"movement"=overlap. coverage.complete+lookahead_reached false=partial. Filters match trips whose END falls in the window. For an instant use that day AND the next. Do not hand-page.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Enum | no | Compact exhaustive congestion-exposure, insurance-renewal, trip-continuity, fleet-concurrency, movement, driver-identification, shift-punctuality, continuous-driving, night-distance, peak-hour, or route-efficiency audit; use exact dates and call once. Default returns rows. |
| `zone_center` | Object | no | Circle center for view:"congestion_exposure". |
| `zone_radius_km` | Number | no | Circle radius in kilometres for view:"congestion_exposure". |
| `charge_windows` | Array | no | Account-local charge intervals for view:"congestion_exposure"; boundaries are start-inclusive/end-exclusive. |
| `discontinuity_distance_km` | Number | no | Required distance threshold for view:"trip_continuity". |
| `implied_speed_threshold_kmh` | Number | no | Implausible transition-speed threshold for view:"trip_continuity"; defaults to 250 km/h. |
| `circular_endpoint_radius_m` | Number | no | Circular-route endpoint radius for view:"route_efficiency"; defaults to 1000 metres. |
| `route_top_n` | Number | no | Rows returned per route-efficiency partition; defaults to 20. Counts always cover all trips. |
| `peak_windows` | Array | no | Peak-hour intervals for view:"peak_hour_share", as objects not strings: [{start:"07:00",end:"09:00"},{start:"16:00",end:"18:00"}]. Boundaries are start-inclusive/end-exclusive. |
| `night_window` | Object | no | Account-local interval for view:"night_distance_share" or "insurance_renewal"; insurance_renewal defaults to 22:00–06:00. Boundaries are start-inclusive/end-exclusive. |
| `shift_start` | String | no | Shift start as account-local HH:MM; required only for view:"shift_punctuality". |
| `break_minutes` | Number | no | Qualifying break for view:"continuous_driving"; defaults to 45 minutes. |
| `driving_threshold_hours` | Number | no | Accumulated driving threshold for view:"continuous_driving"; defaults to 4.5 hours. |
| `license_plates` | String or Array | no | Plate filter: one plate, or an array (sent as repeated params). |
| `driver_codes` | String | no | Comma-separated driver codes. |
| `vehicle_status` | Enum | no | Vehicle service-status filter: default (user preference / 0), all (1), or only_active (3). |
| `sort` | String | no | Field name to order by ("-field" = descending). ⚠ Upstream silently IGNORES this — the tool sorts CLIENT-SIDE when the complete result fits one page and says so in _sort_note; paginated results keep upstream order with a warning. |
| `from_date` | String | no | ISO timestamp lower bound (user local time). |
| `to_date` | String | no | ISO timestamp upper bound (user local time; future values clamped locally). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_trips_longest_forensics`

**Find the longest trip with complete safety detail**

COMPOSITE: finds the fleet-wide longest trip in a date window, then returns its detail record and every valid safety event. It exhausts /trips with 1000-row pages and /trips/{id}/safety with 2000-row pages through one paced two-request gate; use it instead of hand-paging ituran_trips_search for 'longest trip yesterday' or incident-forensics questions. metadata.report_complete is true only when both sweeps and safety-row reconciliation complete; distance_reconciled compares list and detail distance. Read-only. Calls GET /api/v2/trips + /trips/{id} + /trips/{id}/safety.

| Argument | Type | Required | Description |
|---|---|---|---|
| `from_date` | String | no | ISO timestamp lower bound (user local time). |
| `to_date` | String | no | ISO timestamp upper bound (user local time; future values clamped locally). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_trips_stats`

**Get trips periodical statistics**

Returns trip statistics aggregated into periodic buckets (daily, weekly, or monthly totals and averages) for a vehicle over a date range. For a single combined total across the whole range use ituran_trips_totals; for the individual trips use ituran_trips_search. Calls GET /api/v2/trips/stats.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate — REQUIRED (upstream rejects plateless stats: "License plate can't be empty"). |
| `from_date` | String | no | ISO timestamp lower bound (user local time). |
| `to_date` | String | no | ISO timestamp upper bound (user local time; future values clamped locally). |
| `view` | Enum | no | Aggregation period. |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_trips_totals`

**Get total trips summary**

Returns one fleet-wide date-range total. For weekend-vs-weekday or other equal-window comparisons, view:"window_comparison" owns both requests in ONE call and compares total_trips_distance, total_trips_duration, trips_count, and vehicles_count with semicolon evidence and metric coverage; pass first window in body, second in comparison_body. Plate filters are silently IGNORED upstream. drivers_count includes unidentified -1. Per-period buckets: ituran_trips_stats; rows: ituran_trips_search. Calls POST /api/v2/trips/totals.

| Argument | Type | Required | Description |
|---|---|---|---|
| `view` | Literal | no | Compare two equal-length fleet-wide windows. |
| `body` | Object | yes | Body with the date range (or use the top-level range_token instead); any additional fields pass through untouched. |
| `comparison_body` | Object | no | Required for view:"window_comparison". |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_trips_get`

**Get trip information**

Returns the details of a single trip identified by trip_id (obtain the id from ituran_trips_search first). trip_event_stats is a coarse rollup — combined events collapse to base types and can undercount (e.g. 6 in stats vs 19 in the safety list); ituran_trips_safety is the authoritative per-event list. For the trip's GPS points or over-speeding use ituran_trips_points / ituran_trips_over_speeding. Calls GET /api/v2/trips/{trip_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `trip_id` | String or Number | yes | Trip ID. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_trips_over_speeding`

**Get trip over-speeding events**

Returns over-speeding events recorded during one trip; requires a trip_id obtained from ituran_trips_search first. ⚠ These events fire only where an over-speeding ALERT DEFINITION covers the vehicle — an empty list is NOT proof of no speeding (ituran_trips_safety 'speed violation' events are the ground truth). For a fleet-wide speeding ranking use ituran_speed_offenders, or for one vehicle use ituran_vehicles_over_speeding. Calls GET /api/v2/trips/{trip_id}/over-speeding.

| Argument | Type | Required | Description |
|---|---|---|---|
| `trip_id` | String or Number | yes | Trip ID. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_trips_points`

**Get trip points**

Returns the ordered GPS location points recorded during one trip; requires a trip_id obtained from ituran_trips_search first. Rows at (0,0) are no-fix sentinels and are stamped under _data_quality; exclude them from location evidence. Because upstream page_count counts only located fixes while no-fix rows occupy page slots, always follow _pagination.next_page_number even when it exceeds page_count. For the trip's summary details use ituran_trips_get. Calls GET /api/v2/trips/{trip_id}/points.

| Argument | Type | Required | Description |
|---|---|---|---|
| `trip_id` | String or Number | yes | Trip ID. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_trips_safety`

**Get safety events on a trip**

Returns safety events (time and location) recorded during one trip; requires a trip_id obtained from ituran_trips_search first. For over-speeding specifically use ituran_trips_over_speeding. Calls GET /api/v2/trips/{trip_id}/safety.

| Argument | Type | Required | Description |
|---|---|---|---|
| `trip_id` | String or Number | yes | Trip ID. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_virtual_odometer`

**Get virtual odometer data**

Returns virtual odometer (estimated mileage) for a list of vehicles; for vehicles without an ICAN component this is calculated by filtering GPS jumps. This is a per-vehicle odometer estimate and is not tied to any specific trip (unlike the ituran_trips_* tools). Rows carry a reliability field ('low' is common) — check it before trusting the figure, and expect sharp divergence from the device meter when that meter was reset or is faulty; vehicles the service cannot compute return {license_plate, error} rows instead. ⚠ Pages via page_number/page_size INSIDE the body (query params are silently ignored upstream; the upstream default is 10 rows/page). body.page_size defaults to 50 when omitted. Calls POST /api/v2/virtual-odometer.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Record | yes | {license_plates?: string[] ("*" ok), page_number?, page_size?} — paging binds INSIDE the body; page_size defaults to 50. e.g. {"license_plates":["1234567"]} |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## users

### `ituran_users_me`

**Get authenticated user details**

Returns the current authenticated user's profile and permissions (identified by the calling JWT); takes no arguments. Use it to answer "who am I" / what this account can access. "Profile Method :*" entries (device-programming command templates, not capabilities) are collapsed into profile_method_permissions.count. Calls GET /api/v2/users/me.

| Argument | Type | Required | Description |
|---|---|---|---|
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## vehicle-groups

### `ituran_vehicle_groups_list`

**List vehicle groups**

COMPOSITE: ONE call with view:"coverage_audit" compares the frozen current fleet roster to every nested group membership and returns exact ungrouped, stale, and overlapping plate sets with coverage evidence. The roster and registry walks share one paced two-request gate. Without view, lists all vehicle groups visible to the calling user. Use ituran_vehicle_groups_get to fetch one by ID, and ituran_vehicle_groups_create/_update/_patch/_delete to modify. Calls GET /api/v2/vehicle-groups and, for coverage_audit, GET /api/v2/vehicles.

| Argument | Type | Required | Description |
|---|---|---|---|
| `additional_fields` | Array | no | Extra group fields to include. Valid: license_plates (the group's member plates). |
| `view` | Literal | no | Exact current-roster vs nested group-membership audit; omit for the raw group tree. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicle_groups_get`

**Get vehicle group**

Gets a single vehicle group by ID. Use ituran_vehicle_groups_list for all groups; ituran_vehicle_groups_create/_update/_patch/_delete to modify. Calls GET /api/v2/vehicle-groups/{vehicle_group_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `vehicle_group_id` | String or Number | yes | Vehicle group ID. |
| `additional_fields` | Array | no | Extra group fields to include. Valid: license_plates (the group's member plates). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicle_groups_create`

**Create vehicle group**

Creates a new vehicle group; body is a pass-through payload — the required keys are vehicle_group_name and parent_group_id (a positive existing group id, e.g. the root group from ituran_vehicle_groups_list). Returns {vehicle_group_id}. Use ituran_vehicle_groups_update (full replace) or ituran_vehicle_groups_patch (partial) to change one, and ituran_vehicle_groups_delete to remove one. Calls POST /api/v2/vehicle-groups.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Record | yes | Group body — known keys: vehicle_group_name, parent_group_id, license_plates (upstream validates; unknown fields pass through). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicle_groups_update`

**Update vehicle group (full replace)**

Fully replaces an existing vehicle group by ID (send the complete object; fields omitted from the body are overwritten); body is a pass-through payload. Use ituran_vehicle_groups_patch to change only some fields, ituran_vehicle_groups_create to add a new group, and ituran_vehicle_groups_delete to remove one. Calls PUT /api/v2/vehicle-groups/{vehicle_group_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `vehicle_group_id` | String or Number | yes | Vehicle group ID. |
| `body` | Record | yes | Group body — known keys: vehicle_group_name, parent_group_id, license_plates (upstream validates; unknown fields pass through). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicle_groups_patch`

**Patch vehicle group**

Partially updates a vehicle group by ID (send only the fields to change; others are preserved); body is a pass-through payload. Use ituran_vehicle_groups_update for a full replace, ituran_vehicle_groups_create to add a new group, and ituran_vehicle_groups_delete to remove one. Calls PATCH /api/v2/vehicle-groups/{vehicle_group_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `vehicle_group_id` | String or Number | yes | Vehicle group ID. |
| `body` | Record | yes | Group body — known keys: vehicle_group_name, parent_group_id, license_plates (upstream validates; unknown fields pass through). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicle_groups_delete`

**Delete vehicle group**

Permanently deletes a vehicle group by ID; irreversible. Use ituran_vehicle_groups_update/_patch to modify instead, or ituran_vehicle_groups_list/_get to browse. Calls DELETE /api/v2/vehicle-groups/{vehicle_group_id}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `vehicle_group_id` | String or Number | yes | Vehicle group ID. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

## vehicles

### `ituran_vehicles_list`

**List vehicles**

Fleet roster: the paged list of vehicles visible to you (static details, not live positions). Use to browse or enumerate the fleet; for one vehicle's details by plate use ituran_vehicles_get, to find vehicles by plate/wildcard/service use ituran_vehicles_search, and for live positions use ituran_vehicles_get_location (one) or ituran_vehicles_locate_many (many). Calls GET /api/v2/vehicles.

| Argument | Type | Required | Description |
|---|---|---|---|
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `realtime_fields` | Array | no | Realtime blocks to include per vehicle. Valid: LastLocation, Driver, Places, Events, StartTrip. |
| `additional_fields` | Array | no | Extra vehicle fields to include. Valid: DrivePermissionGroup, VehicleGroup. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicles_search`

**Search vehicles**

Find vehicles by exact plate list, wildcard filter, and/or service codes; returns details, not live positions. wildcard_filter ({license_plate?, nickname?}, fields AND together) is applied SERVER-SIDE with SQL-LIKE semantics: % matches any run, a plain string contains-matches, and the tool sends your * as % for you. A search that matches nothing comes back as an empty list (the upstream 404 is mapped). For free-text/fuzzy resolution (nickname/make/model in either language) prefer ituran_find_vehicle. Calls POST /api/v2/vehicles/search.

| Argument | Type | Required | Description |
|---|---|---|---|
| `plate` | Array | no | Exact plates to match (normalized; sent as license_plates — the key upstream honors). |
| `wildcard_filter` | String or Object | no | Wildcard filter object {license_plate?, nickname?} (fields AND together). A plain string is converted to {nickname: string} — the raw string form is rejected upstream. |
| `services` | Array | no | Filter by service codes. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `realtime_fields` | Array | no | Realtime blocks to include per vehicle. Valid: LastLocation, Driver, Places, Events, StartTrip. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicles_get`

**Get vehicle by license plate**

Get one vehicle's static details by its exact license plate. Use for a single known plate; to page the fleet use ituran_vehicles_list, to find plates by wildcard/service use ituran_vehicles_search, and for this vehicle's live position use ituran_vehicles_get_location. Calls GET /api/v2/vehicles/{license_plate}.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate. |
| `realtime_fields` | Array | no | Realtime blocks to include per vehicle. Valid: LastLocation, Driver, Places, Events, StartTrip. |
| `additional_fields` | Array | no | Extra vehicle fields to include. Valid: DrivePermissionGroup, VehicleGroup. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicles_get_current_driver`

**Get current driver on a vehicle**

Get the driver currently assigned to ONE vehicle (by plate). Use for driver identity only, not the vehicle's location (ituran_vehicles_get_location) or static details (ituran_vehicles_get). Calls GET /api/v2/vehicles/{license_plate}/driver.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicles_share_drive`

**Create a share-drive link for a vehicle**

Create a share-drive link for ONE vehicle (by plate) — not a location or driver lookup. Requires CanShareDriveLinkOnly permission. Returns {share_drive_link}; the minted link self-expires after expires_in_hours. Calls POST /api/v2/vehicles/{license_plate}/share-drive.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate. |
| `body` | Record | yes | ShareDriveRequest body: expires_in_hours is REQUIRED (0–24; out-of-range 400s). |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicles_get_location`

**Get vehicle location**

Live position of ONE vehicle by plate (current coordinates). Keep the telemetry inside the connected fleet system: use an address returned by Ituran, or report coordinates directly when no address is present; do not send coordinates to third-party geocoding or mapping services. Use for a single vehicle; for MANY vehicles at once use ituran_vehicles_locate_many, and for the fleet roster/details without positions use ituran_vehicles_list or ituran_vehicles_get. Calls GET /api/v2/vehicles/{license_plate}/location.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicles_locate_many`

**Get locations for multiple vehicles**

Live positions of MANY vehicles at once (batch by plate list). Paged via page_number/page_size — upstream defaults to 10 rows/page and returns NO pagination metadata (a page filled to exactly page_size means more rows may exist). Use for multiple vehicles; for a single vehicle use ituran_vehicles_get_location, and for the fleet roster/details without positions use ituran_vehicles_list. Calls POST /api/v2/vehicles/location.

| Argument | Type | Required | Description |
|---|---|---|---|
| `body` | Object | yes | VehiclesLocationRequest body. Unknown extra fields pass through untouched. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |

### `ituran_vehicles_over_speeding`

**Get over-speeding events for a vehicle**

PREFERRED user-facing single-vehicle over-speeding history (by plate), optionally date-filtered. ⚠ Events fire only where an over-speeding ALERT DEFINITION covers the vehicle and repeat once per matching definition, so these rows cannot rule out other speeding; ituran_speed_offenders / ituran_reports_speed read the raw speed records. Use this instead of the low-level ituran_events_over_speeding endpoint for one vehicle's episode history; for a fleet-wide speeding ranking use ituran_speed_offenders. Calls GET /api/v2/vehicles/{license_plate}/over-speeding.

| Argument | Type | Required | Description |
|---|---|---|---|
| `license_plate` | String | yes | License plate. |
| `from_date` | String | no | ISO timestamp lower bound. |
| `to_date` | String | no | ISO timestamp upper bound (a future value is rejected upstream; clamped locally). |
| `range_token` | Enum | no | Relative date window resolved in the account timezone; overrides from_date/to_date. |
| `page_number` | Number | no | 1-based page number. |
| `page_size` | Number | no | Items per page. Upstream requires 10–2000. |
| `format` | Enum | no | 'text' = compact markdown tables (fewer tokens); default json. |
